Files
Server/src/engine/objects/Mine.java
T

848 lines
27 KiB
Java
Raw Normal View History

2022-04-30 09:41:17 -04:00
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.objects;
import engine.Enum;
2024-07-07 20:44:24 -05:00
import engine.InterestManagement.InterestManager;
2022-04-30 09:41:17 -04:00
import engine.InterestManagement.WorldGrid;
2024-06-12 19:18:05 -05:00
import engine.gameManager.*;
2024-07-07 20:44:24 -05:00
import engine.math.Vector3f;
import engine.math.Vector3fImmutable;
2022-04-30 09:41:17 -04:00
import engine.net.ByteBufferWriter;
import engine.net.client.msg.ErrorPopupMsg;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger;
import java.net.UnknownHostException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.util.ArrayList;
2024-06-12 19:18:05 -05:00
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
2022-04-30 09:41:17 -04:00
import java.util.concurrent.ConcurrentHashMap;
import static engine.gameManager.DbManager.MineQueries;
import static engine.gameManager.DbManager.getObject;
2022-04-30 09:41:17 -04:00
import static engine.math.FastMath.sqr;
public class Mine extends AbstractGameObject {
public static ConcurrentHashMap<Mine, Integer> mineMap = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
public static ConcurrentHashMap<Integer, Mine> towerMap = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
2023-07-15 09:23:48 -04:00
private final String zoneName;
private final Zone parentZone;
public boolean isActive = false;
2023-01-19 15:22:12 -05:00
public PlayerCharacter lastClaimer;
2023-01-20 10:17:34 -05:00
public boolean wasClaimed = false;
2023-01-19 13:46:33 -05:00
// Not persisted to DB
public String guildName;
public GuildTag guildTag;
public String nationName;
public GuildTag nationTag;
private Resource production;
private Guild owningGuild;
private int flags;
private int buildingID;
private MineProduction mineType;
2023-01-19 13:46:33 -05:00
2024-06-11 19:07:44 -05:00
public int openHour;
public int openMinute;
public int capSize;
public LocalDateTime liveTime;
2024-06-12 19:18:05 -05:00
public final HashSet<Integer> _playerMemory = new HashSet<>();
public ArrayList<PlayerCharacter> affectedPlayers = new ArrayList<>();
2024-06-11 19:07:44 -05:00
2024-07-07 20:44:24 -05:00
//stronghold stuff
public boolean isStronghold = false;
public ArrayList<Mob> strongholdMobs;
public HashMap<Integer,Integer> oldBuildings;
public HashMap<Integer, Long> mineAttendees = new HashMap<>();
2024-07-07 20:44:24 -05:00
2023-01-19 13:46:33 -05:00
/**
* ResultSet Constructor
*/
public Mine(ResultSet rs) throws SQLException, UnknownHostException {
super(rs);
2024-12-31 20:14:48 -06:00
if (rs.getInt("capSize") == 0) {
throw new IllegalArgumentException("Mine creation canceled: capSize cannot be 0");
}
2023-01-19 13:46:33 -05:00
this.mineType = MineProduction.getByName(rs.getString("mine_type"));
int ownerUID = rs.getInt("mine_ownerUID");
this.buildingID = rs.getInt("mine_buildingUID");
this.flags = rs.getInt("flags");
int parent = rs.getInt("parent");
2024-12-31 19:57:18 -06:00
if(ZoneManager.getZoneByUUID(parent) != null) {
this.parentZone = ZoneManager.getZoneByUUID(parent);
this.zoneName = this.parentZone.getParent().getName();
}else{
this.parentZone = ZoneManager.getSeaFloor();
2024-12-31 20:09:28 -06:00
if(this.parentZone.getParent() != null)
this.zoneName = this.parentZone.getParent().getName();
else
this.zoneName = "FAILED TO LOAD ZONE";
2024-12-31 19:57:18 -06:00
Logger.error("MINE FAILED TO LOAD PARENT: ");
Logger.error("MINE UID: " + rs.getInt("UID"));
Logger.error("MINE buildingID: " + buildingID);
}
2023-01-19 13:46:33 -05:00
this.owningGuild = Guild.getGuild(ownerUID);
Guild nation = null;
if (this.owningGuild.isEmptyGuild()) {
2023-01-19 15:42:18 -05:00
this.guildName = "";
this.guildTag = GuildTag.ERRANT;
nation = Guild.getErrantGuild();
this.owningGuild = Guild.getErrantGuild();
2023-01-19 13:46:33 -05:00
} else {
2023-01-19 15:45:13 -05:00
this.guildName = this.owningGuild.getName();
this.guildTag = this.owningGuild.getGuildTag();
nation = this.owningGuild.getNation();
2023-01-19 13:46:33 -05:00
}
if (!nation.isEmptyGuild()) {
2023-01-19 13:46:33 -05:00
this.nationName = nation.getName();
this.nationTag = nation.getGuildTag();
} else {
this.nationName = "";
this.nationTag = GuildTag.ERRANT;
}
this.production = Resource.valueOf(rs.getString("mine_resource"));
2023-01-20 07:50:37 -05:00
this.lastClaimer = null;
2024-06-11 19:07:44 -05:00
this.openHour = rs.getInt("mineLiveHour");
this.openMinute = rs.getInt("mineLiveMinute");
this.capSize = rs.getInt("capSize");
this.liveTime = LocalDateTime.now().withHour(this.openHour).withMinute(this.openMinute);
2024-06-12 18:35:22 -05:00
Building tower = BuildingManager.getBuildingFromCache(this.buildingID);
if(tower != null){
tower.setMaxHitPoints(5000f * this.capSize);
tower.setCurrentHitPoints(tower.healthMax);
}
2023-01-19 13:46:33 -05:00
}
2023-01-20 12:18:11 -05:00
public static void releaseMineClaims(PlayerCharacter playerCharacter) {
2023-01-20 12:41:44 -05:00
if (playerCharacter == null)
return;
2023-01-20 12:18:11 -05:00
for (Mine mine : Mine.getMines()) {
2023-01-20 12:41:44 -05:00
if (mine.lastClaimer != null)
if (mine.lastClaimer.equals(playerCharacter)) {
mine.lastClaimer = null;
mine.updateGuildOwner(null);
}
2023-01-20 12:18:11 -05:00
}
}
2023-01-19 13:46:33 -05:00
public static void SendMineAttackMessage(Building mine) {
2022-04-30 09:41:17 -04:00
if (mine.getBlueprint() == null)
return;
if (mine.getBlueprint().getBuildingGroup() != Enum.BuildingGroup.MINE)
return;
2023-01-19 13:46:33 -05:00
if (mine.getGuild().isEmptyGuild())
2023-01-19 13:46:33 -05:00
return;
if (mine.getGuild().getNation().isEmptyGuild())
2022-04-30 09:41:17 -04:00
return;
if (mine.getTimeStamp("MineAttack") > System.currentTimeMillis())
return;
mine.getTimestamps().put("MineAttack", System.currentTimeMillis() + MBServerStatics.ONE_MINUTE);
ChatManager.chatNationInfo(mine.getGuild().getNation(), mine.getName() + " in " + mine.getParentZone().getParent().getName() + " is Under attack!");
}
2023-01-19 13:46:33 -05:00
public static void loadAllMines() {
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
try {
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
//Load mine resources
MineProduction.addResources();
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
//pre-load all building sets
ArrayList<Mine> serverMines = MineQueries.GET_ALL_MINES_FOR_SERVER();
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
for (Mine mine : serverMines) {
2024-08-27 19:13:31 -05:00
if(mine.capSize != 0) {
Mine.mineMap.put(mine, mine.buildingID);
Mine.towerMap.put(mine.buildingID, mine);
}
2023-01-19 13:46:33 -05:00
}
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* Getters
*/
public static Mine getMineFromTower(int towerID) {
return Mine.towerMap.get(towerID);
}
public static void serializeForClientMsg(Mine mine, ByteBufferWriter writer) {
2024-06-16 09:30:14 -05:00
try {
writer.putInt(mine.getObjectType().ordinal());
writer.putInt(mine.getObjectUUID());
writer.putInt(mine.getObjectUUID()); //actually a hash of mine
2024-07-07 20:44:24 -05:00
if(mine.isStronghold){
writer.putString("STRONGHOLD");
writer.putString("");
}else {
writer.putString(mine.mineType.name);
writer.putString(mine.capSize + " Man ");
}
2024-06-25 21:24:48 -05:00
//writer.putString(mine.zoneName + " " + mine.capSize + " Man ");
2024-07-07 20:44:24 -05:00
2024-06-16 09:30:14 -05:00
writer.putInt(mine.production.hash);
writer.putInt(mine.production.baseProduction);
writer.putInt(mine.getModifiedProductionAmount()); //TODO calculate range penalty here
writer.putInt(3600); //window in seconds
LocalDateTime mineOpenTime = LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute).withSecond(0).withNano(0);
writer.putLocalDateTime(mineOpenTime);
writer.putLocalDateTime(mineOpenTime.plusMinutes(30));
writer.put(mine.isActive ? (byte) 0x01 : (byte) 0x00);
Building mineTower = BuildingManager.getBuilding(mine.buildingID);
if (mineTower != null) {
writer.putFloat(mineTower.getLoc().x);
writer.putFloat(mineTower.getParentZone().getLoc().y);
writer.putFloat(mineTower.getLoc().z);
} else {
writer.putFloat(mine.parentZone.getLoc().x);
writer.putFloat(mine.parentZone.getLoc().y);
writer.putFloat(mine.parentZone.getLoc().z);
2024-06-25 21:26:39 -05:00
Logger.error("Mine Tower Was Null For Mine: " + mine.getObjectUUID());
2024-06-16 09:30:14 -05:00
}
2024-06-16 09:30:14 -05:00
writer.putInt(mine.isExpansion() ? mine.mineType.xpacHash : mine.mineType.hash);
2023-01-19 13:46:33 -05:00
2024-07-07 20:53:52 -05:00
if (mine.isStronghold) {
writer.putString("");
GuildTag._serializeForDisplay(Guild.getErrantGuild().getGuildTag(), writer);
writer.putString("");
GuildTag._serializeForDisplay(Guild.getErrantGuild().getGuildTag(), writer);
}else {
writer.putString(mine.guildName);
GuildTag._serializeForDisplay(mine.guildTag, writer);
writer.putString(mine.nationName);
GuildTag._serializeForDisplay(mine.nationTag, writer);
}
2024-06-16 09:30:14 -05:00
} catch (Exception e) {
Logger.error("Failed TO Serialize Mine Because: " + e.getMessage());
}
2023-01-19 13:46:33 -05:00
}
public static ArrayList<Mine> getMinesForGuild(int guildID) {
2023-01-21 14:59:37 -05:00
2023-01-19 13:46:33 -05:00
ArrayList<Mine> mineList = new ArrayList<>();
2023-01-21 14:59:37 -05:00
// Only inactive mines are returned.
2023-01-19 13:46:33 -05:00
for (Mine mine : Mine.mineMap.keySet()) {
if (mine.owningGuild.getObjectUUID() == guildID)
2023-01-19 13:46:33 -05:00
mineList.add(mine);
}
return mineList;
}
/*
* Database
*/
public static Mine getMine(int UID) {
return MineQueries.GET_MINE(UID);
2023-01-19 13:46:33 -05:00
}
2023-01-19 13:46:33 -05:00
public static ArrayList<Mine> getMines() {
return new ArrayList<>(mineMap.keySet());
}
2023-01-21 12:52:52 -05:00
public static boolean validateClaimer(PlayerCharacter playerCharacter) {
// Method validates that the claimer meets
// all the requirements to claim; landed
// guild with a warehouse, etc.
2023-01-19 13:46:33 -05:00
Guild playerGuild;
2023-01-19 13:46:33 -05:00
//verify the player exists
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
if (playerCharacter == null)
return false;
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
//verify the player is in valid guild
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
playerGuild = playerCharacter.getGuild();
2022-04-30 09:41:17 -04:00
2023-01-21 09:39:53 -05:00
// Can't claim something if you don't have a guild!
if (playerGuild.isEmptyGuild())
2023-01-19 13:46:33 -05:00
return false;
2022-04-30 09:41:17 -04:00
if (playerGuild.getNation().isEmptyGuild())
2023-01-19 17:34:45 -05:00
return false;
// Guild must own a city to hold a mine.
2022-04-30 09:41:17 -04:00
2023-01-21 09:39:53 -05:00
City guildCity = playerGuild.getOwnedCity();
2022-04-30 09:41:17 -04:00
2023-01-20 10:17:34 -05:00
if (guildCity == null)
2023-01-19 13:46:33 -05:00
return false;
2022-04-30 09:41:17 -04:00
2023-01-20 13:35:57 -05:00
if (guildCity.getWarehouse() == null) {
ErrorPopupMsg.sendErrorMsg(playerCharacter, "No Warehouse exists for this claim.");
2023-01-19 13:46:33 -05:00
return false;
2023-01-20 13:35:57 -05:00
}
2022-04-30 09:41:17 -04:00
2023-01-21 09:39:53 -05:00
// Number of mines is based on the rank of the nation's tree.
City nationCapitol = playerGuild.getNation().getOwnedCity();
2023-01-20 10:17:34 -05:00
Building nationCapitolTOL = nationCapitol.getTOL();
2022-04-30 09:41:17 -04:00
2023-01-20 10:17:34 -05:00
if (nationCapitolTOL == null)
2023-01-19 13:46:33 -05:00
return false;
2022-04-30 09:41:17 -04:00
2023-01-20 10:17:34 -05:00
int treeRank = nationCapitolTOL.getRank();
if (treeRank < 1)
return false;
2022-04-30 09:41:17 -04:00
2023-01-20 10:17:34 -05:00
return true;
}
2024-09-11 19:51:48 -05:00
public static ArrayList<Mine> getMinesToTeleportTo(PlayerCharacter player) {
ArrayList<Mine> mines = new ArrayList<>();
for(Mine mine : Mine.getMines())
2024-09-12 19:08:08 -05:00
if(!mine.isActive)
if(mine.getOwningGuild() != null)
if(mine.getOwningGuild().getNation().equals(player.getGuild().getNation()))
2025-01-27 13:15:42 -06:00
if(!mine.getOwningGuild().equals(Guild.getErrantGuild()))
2024-09-12 19:08:08 -05:00
mines.add(mine);
2024-09-11 19:51:48 -05:00
return mines;
}
public boolean changeProductionType(Resource resource) {
if (!this.validForMine(resource))
return false;
//update resource in database;
if (!MineQueries.CHANGE_RESOURCE(this, resource))
2023-01-19 13:46:33 -05:00
return false;
2023-01-13 11:46:26 -05:00
this.production = resource;
2023-01-19 13:46:33 -05:00
return true;
}
public MineProduction getMineType() {
return this.mineType;
}
public void setMineType(String type) {
this.mineType = MineProduction.getByName(type);
}
public String getZoneName() {
return this.zoneName;
}
public Resource getProduction() {
return this.production;
}
public boolean getIsActive() {
return this.isActive;
}
public Guild getOwningGuild() {
if (this.owningGuild == null)
return Guild.getErrantGuild();
else
return this.owningGuild;
}
public void setOwningGuild(Guild owningGuild) {
this.owningGuild = owningGuild;
}
/*
* Serialization
*/
public int getFlags() {
return flags;
}
public void setFlags(int flags) {
this.flags = flags;
}
public Zone getParentZone() {
return parentZone;
}
public GuildTag getGuildTag() {
return guildTag;
}
public void setActive(boolean isAc) {
this.isActive = isAc;
Building building = BuildingManager.getBuildingFromCache(this.buildingID);
if (building != null && !this.isActive)
building.isDeranking.compareAndSet(true, false);
2024-06-15 10:31:38 -05:00
if(!isAc){
for(PlayerCharacter player : this.affectedPlayers){
try {
player.ZergMultiplier = 1.0f;
} catch(Exception e){
//something went wrong resetting zerg multiplier, maybe player was deleted?
}
}
}
}
public boolean validForMine(Resource r) {
2024-08-27 19:13:31 -05:00
if (this.mineType == null) {
Logger.error("Mine Was Null Setting Resources for Mine: " + this.getObjectUUID());
return false;
2024-08-27 19:13:31 -05:00
}
return this.mineType.validForMine(r);
}
public void serializeForMineProduction(ByteBufferWriter writer) {
writer.putInt(this.getObjectType().ordinal());
writer.putInt(this.getObjectUUID());
writer.putInt(this.getObjectUUID()); //actually a hash of mine
// writer.putInt(0x215C92BB); //this.unknown1);
writer.putString(this.mineType.name);
writer.putString(this.zoneName);
writer.putInt(this.production.hash);
writer.putInt(this.getModifiedProductionAmount());
writer.putInt(this.getModifiedProductionAmount()); //TODO calculate range penalty here
writer.putInt(3600); //window in seconds
2024-09-12 20:21:11 -05:00
writer.putInt(this.mineType.hash);
}
@Override
public void updateDatabase() {
// TODO Create update logic.
}
public int getBuildingID() {
return buildingID;
}
public void setBuildingID(int buildingID) {
this.buildingID = buildingID;
}
2023-01-19 13:46:33 -05:00
public void handleDestroyMine() {
2023-01-13 11:46:26 -05:00
2023-01-19 13:46:33 -05:00
if (!this.isActive)
return;
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
//remove tags from mine
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
this.guildName = "";
this.nationName = "";
this.owningGuild = Guild.getErrantGuild();
this.lastClaimer = null;
this.wasClaimed = false;
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
// Update database
2023-01-19 13:46:33 -05:00
DbManager.MineQueries.CHANGE_OWNER(this, 0);
2023-01-19 13:46:33 -05:00
// Update mesh
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
Building mineBuilding = BuildingManager.getBuildingFromCache(this.buildingID);
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
if (mineBuilding == null) {
Logger.debug("Null mine building " + this.getObjectUUID() + ". Unable to Load Building with UID " + this.buildingID);
return;
}
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
mineBuilding.setOwner(null);
mineBuilding.refresh(false);
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
// remove hirelings
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
Building building = (Building) getObject(Enum.GameObjectType.Building, this.buildingID);
BuildingManager.cleanupHirelings(building);
}
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
public boolean claimMine(PlayerCharacter claimer) {
2023-01-19 13:46:33 -05:00
if (claimer == null)
return false;
2023-01-21 12:52:52 -05:00
if (!validateClaimer(claimer))
2023-01-19 13:46:33 -05:00
return false;
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
if (!this.isActive) {
ErrorPopupMsg.sendErrorMsg(claimer, "Can not for to claim inactive mine.");
return false;
}
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
if (!updateGuildOwner(claimer))
return false;
2022-04-30 09:41:17 -04:00
2023-01-20 07:50:37 -05:00
// Successful claim
2023-01-19 17:32:11 -05:00
this.lastClaimer = claimer;
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
return true;
}
2023-01-19 13:46:33 -05:00
public boolean depositMineResources() {
2022-04-30 09:41:17 -04:00
if (this.owningGuild.isEmptyGuild())
2023-01-19 13:46:33 -05:00
return false;
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
if (this.owningGuild.getOwnedCity() == null)
return false;
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
if (this.owningGuild.getOwnedCity().getWarehouse() == null)
return false;
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
ItemBase resourceIB = ItemBase.getItemBase(this.production.UUID);
2024-09-07 18:01:23 -05:00
return this.owningGuild.getOwnedCity().getWarehouse().depositFromMine(this, resourceIB, this.getModifiedProductionAmount());
2023-01-19 13:46:33 -05:00
}
2022-04-30 09:41:17 -04:00
2023-01-20 07:50:37 -05:00
public boolean updateGuildOwner(PlayerCharacter playerCharacter) {
2023-01-19 13:46:33 -05:00
Building mineBuilding = BuildingManager.getBuildingFromCache(this.buildingID);
//should never return null, but let's check just in case.
if (mineBuilding == null) {
2023-01-20 07:50:37 -05:00
ChatManager.chatSystemError(playerCharacter, "Unable to find mine tower.");
2023-01-19 13:46:33 -05:00
Logger.debug("Failed to Update Mine with UID " + this.getObjectUUID() + ". Unable to Load Building with UID " + this.buildingID);
return false;
}
2023-01-20 07:50:37 -05:00
if (playerCharacter == null) {
this.owningGuild = Guild.getErrantGuild();
2023-01-19 13:46:33 -05:00
this.guildName = "None";
this.guildTag = GuildTag.ERRANT;
this.nationName = "None";
this.nationTag = GuildTag.ERRANT;
//Update Building.
mineBuilding.setOwner(null);
WorldGrid.updateObject(mineBuilding);
return true;
}
2023-01-20 07:50:37 -05:00
Guild guild = playerCharacter.getGuild();
2023-01-19 13:46:33 -05:00
if (guild.getOwnedCity() == null)
return false;
if (!MineQueries.CHANGE_OWNER(this, guild.getObjectUUID())) {
Logger.debug("Database failed to Change Ownership of Mine with UID " + this.getObjectUUID());
2023-01-20 07:50:37 -05:00
ChatManager.chatSystemError(playerCharacter, "Failed to claim Mine.");
2023-01-19 13:46:33 -05:00
return false;
}
//update mine.
this.owningGuild = guild;
//Update Building.
PlayerCharacter guildLeader = (PlayerCharacter) Guild.GetGL(this.owningGuild);
2023-01-20 07:50:37 -05:00
2023-01-19 13:46:33 -05:00
if (guildLeader != null)
mineBuilding.setOwner(guildLeader);
WorldGrid.updateObject(mineBuilding);
return true;
}
2022-04-30 09:41:17 -04:00
2023-01-19 13:46:33 -05:00
public boolean isExpansion() {
2022-04-30 09:41:17 -04:00
return (this.flags & 2) != 0;
}
2023-01-19 13:46:33 -05:00
public int getModifiedProductionAmount() {
2024-06-13 18:44:35 -05:00
ItemBase resourceBase = ItemBase.getItemBase(this.production.UUID);
if(resourceBase == null)
return 0;
int value = resourceBase.getBaseValue();
int amount = 0;
switch(this.capSize){
case 3:
amount = 1800000;
break;
case 5:
amount = 3000000;
break;
case 10:
amount = 6000000;
break;
case 20:
amount = 12000000;
break;
2023-01-19 13:46:33 -05:00
}
2024-06-13 18:44:35 -05:00
if(this.production.UUID == 7)
value = 1;
2024-09-07 17:45:32 -05:00
amount = amount / value;
2024-06-13 18:44:35 -05:00
2024-09-07 17:45:32 -05:00
return amount;
2023-01-19 13:46:33 -05:00
}
2024-06-12 19:18:05 -05:00
public void onEnter() {
2022-04-30 09:41:17 -04:00
2024-06-12 19:18:05 -05:00
Building tower = BuildingManager.getBuildingFromCache(this.buildingID);
if(tower == null)
return;
// Gather current list of players within the zone bounds
HashSet<AbstractWorldObject> currentPlayers = WorldGrid.getObjectsInRangePartial(tower.loc, MBServerStatics.CHARACTER_LOAD_RANGE * 3, MBServerStatics.MASK_PLAYER);
2024-06-12 19:18:05 -05:00
HashMap<Guild,ArrayList<PlayerCharacter>> charactersByNation = new HashMap<>();
ArrayList<Guild> updatedNations = new ArrayList<>();
for (AbstractWorldObject playerObject : currentPlayers) {
if (playerObject == null)
continue;
PlayerCharacter player = (PlayerCharacter) playerObject;
2024-06-15 10:31:38 -05:00
if(this.affectedPlayers.contains(player) == false)
this.affectedPlayers.add(player);
2024-06-12 19:18:05 -05:00
if(!this._playerMemory.contains(player.getObjectUUID())){
this._playerMemory.add(player.getObjectUUID());
2025-02-19 20:15:19 -06:00
ChatManager.chatSystemInfo(player,"You Have Entered an Active Mine Area");
2024-06-12 19:18:05 -05:00
}
Guild nation = player.guild.getNation();
if(charactersByNation.containsKey(nation)){
if(!charactersByNation.get(nation).contains(player)) {
charactersByNation.get(nation).add(player);
if(!updatedNations.contains(nation)){
updatedNations.add(nation);
}
}
}else{
ArrayList<PlayerCharacter> players = new ArrayList<>();
players.add(player);
charactersByNation.put(nation,players);
if(!updatedNations.contains(nation)){
updatedNations.add(nation);
}
}
}
2025-02-21 20:41:48 -06:00
for(Integer id : this.mineAttendees.keySet()){
PlayerCharacter attendee = PlayerCharacter.getPlayerCharacter(id);
if(attendee == null)
continue;
if(charactersByNation.containsKey(attendee.guild.getNation())){
if(!charactersByNation.get(attendee.guild.getNation()).contains(attendee)){
charactersByNation.get(attendee.guild.getNation()).add(attendee);
}
}
}
2024-06-12 19:18:05 -05:00
for(Guild nation : updatedNations){
float multiplier = ZergManager.getCurrentMultiplier(charactersByNation.get(nation).size(),this.capSize);
for(PlayerCharacter player : charactersByNation.get(nation)){
player.ZergMultiplier = multiplier;
}
}
try
{
this.onExit(this._playerMemory);
}
catch(Exception ignored){
}
}
private void onExit(HashSet<Integer> currentMemory) {
Building tower = BuildingManager.getBuildingFromCache(this.buildingID);
if(tower == null)
return;
ArrayList<Integer>toRemove = new ArrayList<>();
2025-02-19 20:15:19 -06:00
HashSet<AbstractWorldObject> currentPlayers = WorldGrid.getObjectsInRangePartial(tower.loc, MBServerStatics.CHARACTER_LOAD_RANGE * 3, MBServerStatics.MASK_PLAYER);
2024-06-12 19:18:05 -05:00
for(Integer id : currentMemory){
PlayerCharacter pc = PlayerCharacter.getPlayerCharacter(id);
if(!currentPlayers.contains(pc)){
if(this.mineAttendees.containsKey(id)){
long timeGone = System.currentTimeMillis() - this.mineAttendees.get(id).longValue();
if (timeGone > 180000L) { // 3 minutes
toRemove.add(id); // Mark for removal
}
}
2024-06-12 19:18:05 -05:00
pc.ZergMultiplier = 1.0f;
2025-02-19 20:37:43 -06:00
} else {
this.mineAttendees.put(id,System.currentTimeMillis());
2024-06-12 19:18:05 -05:00
}
}
// Remove players from city memory
_playerMemory.removeAll(toRemove);
for(int id : toRemove){
this.mineAttendees.remove(id);
}
2024-06-12 19:18:05 -05:00
}
2024-09-11 19:51:48 -05:00
public static Building getTower(Mine mine){
2024-09-12 19:47:42 -05:00
Building tower = BuildingManager.getBuildingFromCache(mine.buildingID);
if(tower != null)
return tower;
else
return null;
2024-09-11 19:51:48 -05:00
}
public static void serializeForClientMsgTeleport(Mine mine, ByteBufferWriter writer) {
AbstractCharacter guildRuler;
Guild rulingGuild;
Guild rulingNation;
java.time.LocalDateTime dateTime1900;
// Cities aren't a mine without a TOL. Time to early exit.
// No need to spam the log here as non-existant TOL's are indicated
// during bootstrap routines.
2024-09-12 19:47:42 -05:00
Building tower = Mine.getTower(mine);
if (tower == null) {
2024-09-11 19:51:48 -05:00
2024-09-12 19:47:42 -05:00
Logger.error("NULL TOWER FOR " + mine.zoneName + " mine");
return;
2024-09-11 19:51:48 -05:00
}
// Assign mine owner
2024-09-12 19:47:42 -05:00
if (tower.getOwner() != null)
guildRuler = tower.getOwner();
2024-09-11 19:51:48 -05:00
else
guildRuler = null;
// If is an errant tree, use errant guild for serialization.
// otherwise we serialize the soverign guild
if (guildRuler == null)
rulingGuild = Guild.getErrantGuild();
else
rulingGuild = guildRuler.getGuild();
rulingNation = rulingGuild.getNation();
// Begin Serialzing soverign guild data
writer.putInt(mine.getObjectType().ordinal());
writer.putInt(mine.getObjectUUID());
2024-09-12 19:47:42 -05:00
writer.putString(mine.zoneName + " Mine");
2024-09-11 19:51:48 -05:00
writer.putInt(rulingGuild.getObjectType().ordinal());
writer.putInt(rulingGuild.getObjectUUID());
writer.putString(rulingGuild.getName());
writer.putString("");
writer.putString(rulingGuild.getLeadershipType());
// Serialize guild ruler's name
// If tree is abandoned blank out the name
// to allow them a rename.
if (guildRuler == null)
writer.putString("");
else
writer.putString(guildRuler.getFirstName() + ' ' + guildRuler.getLastName());
writer.putInt(rulingGuild.getCharter());
writer.putInt(0); // always 00000000
writer.put((byte)0);
writer.put((byte) 1);
writer.put((byte) 1); // *** Refactor: What are these flags?
writer.put((byte) 1);
writer.put((byte) 1);
writer.put((byte) 1);
GuildTag._serializeForDisplay(rulingGuild.getGuildTag(), writer);
GuildTag._serializeForDisplay(rulingNation.getGuildTag(), writer);
writer.putInt(0);// TODO Implement description text
writer.put((byte) 1);
writer.put((byte) 0);
writer.put((byte) 1);
// Begin serializing nation guild info
if (rulingNation.isEmptyGuild()) {
writer.putInt(rulingGuild.getObjectType().ordinal());
writer.putInt(rulingGuild.getObjectUUID());
} else {
writer.putInt(rulingNation.getObjectType().ordinal());
writer.putInt(rulingNation.getObjectUUID());
}
// Serialize nation name
if (rulingNation.isEmptyGuild())
writer.putString("None");
else
writer.putString(rulingNation.getName());
2024-09-12 19:47:42 -05:00
writer.putInt(1);
2024-09-11 19:51:48 -05:00
writer.putInt(0xFFFFFFFF);
writer.putInt(0);
if (rulingNation.isEmptyGuild())
writer.putString(" ");
else
writer.putString(Guild.GetGL(rulingNation).getFirstName() + ' ' + Guild.GetGL(rulingNation).getLastName());
writer.putLocalDateTime(LocalDateTime.now());
2024-09-12 19:47:42 -05:00
if(tower != null) {
writer.putFloat(tower.loc.x);
writer.putFloat(tower.loc.y);
writer.putFloat(tower.loc.z);
} else{
writer.putFloat(0);
writer.putFloat(0);
writer.putFloat(0);
}
2024-09-11 19:51:48 -05:00
writer.putInt(0);
writer.put((byte) 1);
writer.put((byte) 0);
writer.putInt(0x64);
writer.put((byte) 0);
writer.put((byte) 0);
writer.put((byte) 0);
}
2022-04-30 09:41:17 -04:00
}