|  |  | @ -20,7 +20,10 @@ package engine.objects; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.Enum; |  |  |  | import engine.Enum; | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.InterestManagement.WorldGrid; |  |  |  | import engine.InterestManagement.WorldGrid; | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.gameManager.*; |  |  |  | import engine.gameManager.BuildingManager; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | import engine.gameManager.ChatManager; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | import engine.gameManager.DbManager; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | import engine.gameManager.ZoneManager; | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.net.ByteBufferWriter; |  |  |  | import engine.net.ByteBufferWriter; | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.net.client.msg.ErrorPopupMsg; |  |  |  | import engine.net.client.msg.ErrorPopupMsg; | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.server.MBServerStatics; |  |  |  | import engine.server.MBServerStatics; | 
			
		
	
	
		
		
			
				
					|  |  | @ -33,38 +36,34 @@ import java.time.LocalDateTime; | 
			
		
	
		
		
			
				
					
					|  |  |  | import java.util.ArrayList; |  |  |  | import java.util.ArrayList; | 
			
		
	
		
		
			
				
					
					|  |  |  | import java.util.concurrent.ConcurrentHashMap; |  |  |  | import java.util.concurrent.ConcurrentHashMap; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | import static engine.gameManager.DbManager.*; |  |  |  | import static engine.gameManager.DbManager.MineQueries; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | import static engine.gameManager.DbManager.getObject; | 
			
		
	
		
		
			
				
					
					|  |  |  | import static engine.math.FastMath.sqr; |  |  |  | import static engine.math.FastMath.sqr; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | public class Mine extends AbstractGameObject { |  |  |  | public class Mine extends AbstractGameObject { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     private String zoneName; |  |  |  |     public static ConcurrentHashMap<Mine, Integer> mineMap = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     private Resource production; |  |  |  |     public static ConcurrentHashMap<Integer, Mine> towerMap = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     public boolean isActive = false; |  |  |  |     public boolean isActive = false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     private float latitude; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     private float longitude; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     private float altitude; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     private Guild owningGuild; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public PlayerCharacter lastClaimer; |  |  |  |     public PlayerCharacter lastClaimer; | 
			
		
	
		
		
			
				
					
					|  |  |  |     public boolean wasClaimed = false; |  |  |  |     public boolean wasClaimed = false; | 
			
		
	
		
		
			
				
					
					|  |  |  |     private int flags; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     private int buildingID; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     private Zone parentZone; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     private MineProduction mineType; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     //flags 1: never been claimed (make active).
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     // Not persisted to DB
 |  |  |  |     // Not persisted to DB
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     public String guildName; |  |  |  |     public String guildName; | 
			
		
	
		
		
			
				
					
					|  |  |  |     public GuildTag guildTag; |  |  |  |     public GuildTag guildTag; | 
			
		
	
		
		
			
				
					
					|  |  |  |     public String nationName; |  |  |  |     public String nationName; | 
			
		
	
		
		
			
				
					
					|  |  |  |     public GuildTag nationTag; |  |  |  |     public GuildTag nationTag; | 
			
		
	
		
		
			
				
					
					|  |  |  |     public static ConcurrentHashMap<Mine, Integer> mineMap = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW); |  |  |  |     private final String zoneName; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     public static ConcurrentHashMap<Integer, Mine> towerMap = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW); |  |  |  |     private Resource production; | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     private final float latitude; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     private final float longitude; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     private static long lastChange = System.currentTimeMillis(); |  |  |  |     //flags 1: never been claimed (make active).
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     private final float altitude; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     private Guild owningGuild; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     private int flags; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     private int buildingID; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     private final Zone parentZone; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     private MineProduction mineType; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     /** |  |  |  |     /** | 
			
		
	
		
		
			
				
					
					|  |  |  |      * ResultSet Constructor |  |  |  |      * ResultSet Constructor | 
			
		
	
	
		
		
			
				
					|  |  | @ -139,6 +138,7 @@ public class Mine extends AbstractGameObject { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     public static void SendMineAttackMessage(Building mine) { |  |  |  |     public static void SendMineAttackMessage(Building mine) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (mine.getBlueprint() == null) |  |  |  |         if (mine.getBlueprint() == null) | 
			
		
	
	
		
		
			
				
					|  |  | @ -186,90 +186,10 @@ public class Mine extends AbstractGameObject { | 
			
		
	
		
		
			
				
					
					|  |  |  |      * Getters |  |  |  |      * Getters | 
			
		
	
		
		
			
				
					
					|  |  |  |      */ |  |  |  |      */ | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     public boolean changeProductionType(Resource resource) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (!this.validForMine(resource)) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             return false; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         //update resource in database;
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (!MineQueries.CHANGE_RESOURCE(this, resource)) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             return false; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.production = resource; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         return true; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public MineProduction getMineType() { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         return this.mineType; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public String getZoneName() { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         return this.zoneName; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public Resource getProduction() { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         return this.production; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public boolean getIsActive() { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         return this.isActive; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public float getAltitude() { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         return this.altitude; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public Guild getOwningGuild() { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (this.owningGuild == null) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             return Guild.getErrantGuild(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         else |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             return this.owningGuild; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     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 setMineType(String type) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.mineType = MineProduction.getByName(type); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public void setActive(boolean isAc) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.isActive = isAc; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         Building building = BuildingManager.getBuildingFromCache(this.buildingID); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (building != null && !this.isActive) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             building.isDeranking.compareAndSet(true, false); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public void setOwningGuild(Guild owningGuild) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.owningGuild = owningGuild; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public static Mine getMineFromTower(int towerID) { |  |  |  |     public static Mine getMineFromTower(int towerID) { | 
			
		
	
		
		
			
				
					
					|  |  |  |         return Mine.towerMap.get(towerID); |  |  |  |         return Mine.towerMap.get(towerID); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     public boolean validForMine(Resource r) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (this.mineType == null) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             return false; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         return this.mineType.validForMine(r, this.isExpansion()); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     /* |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |      * Serialization |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |      */ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public static void serializeForClientMsg(Mine mine, ByteBufferWriter writer) { |  |  |  |     public static void serializeForClientMsg(Mine mine, ByteBufferWriter writer) { | 
			
		
	
		
		
			
				
					
					|  |  |  |         writer.putInt(mine.getObjectType().ordinal()); |  |  |  |         writer.putInt(mine.getObjectType().ordinal()); | 
			
		
	
		
		
			
				
					
					|  |  |  |         writer.putInt(mine.getObjectUUID()); |  |  |  |         writer.putInt(mine.getObjectUUID()); | 
			
		
	
	
		
		
			
				
					|  |  | @ -284,15 +204,15 @@ public class Mine extends AbstractGameObject { | 
			
		
	
		
		
			
				
					
					|  |  |  |         // Errant mines are currently open.  Set time to now.
 |  |  |  |         // Errant mines are currently open.  Set time to now.
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         LocalDateTime mineOpenTime = LocalDateTime.now().withMinute(0).withSecond(0).withNano(0); |  |  |  |         LocalDateTime mineOpenTime = LocalDateTime.now().withMinute(0).withSecond(0).withNano(0); | 
			
		
	
		
		
			
				
					
					|  |  |  |          |  |  |  | 
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         // Mine times are those of the nation not individual guild.
 |  |  |  |         // Mine times are those of the nation not individual guild.
 | 
			
		
	
		
		
			
				
					
					|  |  |  |          |  |  |  | 
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         Guild mineNatonGuild = mine.getOwningGuild().getNation(); |  |  |  |         Guild mineNatonGuild = mine.getOwningGuild().getNation(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         // Adjust the serialized mine time based upon whether
 |  |  |  |         // Adjust the serialized mine time based upon whether
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         // the Guild's mine window has passed or not and if it was claimed.
 |  |  |  |         // the Guild's mine window has passed or not and if it was claimed.
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		// If a mine is active serialize current datetime irrespective
 |  |  |  |         // If a mine is active serialize current datetime irrespective
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		// of any claim.
 |  |  |  |         // of any claim.
 | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (mineNatonGuild.isEmptyGuild() == false && mine.isActive == false) { |  |  |  |         if (mineNatonGuild.isEmptyGuild() == false && mine.isActive == false) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -321,20 +241,6 @@ public class Mine extends AbstractGameObject { | 
			
		
	
		
		
			
				
					
					|  |  |  |         GuildTag._serializeForDisplay(mine.nationTag, writer); |  |  |  |         GuildTag._serializeForDisplay(mine.nationTag, writer); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     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.production.baseProduction); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         writer.putInt(this.getModifiedProductionAmount()); //TODO calculate range penalty here
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         writer.putInt(3600); //window in seconds
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         writer.putInt(this.isExpansion() ? this.mineType.xpacHash : this.mineType.hash); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public static ArrayList<Mine> getMinesForGuild(int guildID) { |  |  |  |     public static ArrayList<Mine> getMinesForGuild(int guildID) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         ArrayList<Mine> mineList = new ArrayList<>(); |  |  |  |         ArrayList<Mine> mineList = new ArrayList<>(); | 
			
		
	
	
		
		
			
				
					|  |  | @ -343,20 +249,12 @@ public class Mine extends AbstractGameObject { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         for (Mine mine : Mine.mineMap.keySet()) { |  |  |  |         for (Mine mine : Mine.mineMap.keySet()) { | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mine.owningGuild.getObjectUUID() == guildID && |  |  |  |             if (mine.owningGuild.getObjectUUID() == guildID && | 
			
		
	
		
		
			
				
					
					|  |  |  |                 mine.isActive == false) |  |  |  |                     mine.isActive == false) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                 mineList.add(mine); |  |  |  |                 mineList.add(mine); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         return mineList; |  |  |  |         return mineList; | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     public static long getLastChange() { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         return lastChange; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public static void setLastChange(long lastChange) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         Mine.lastChange = lastChange; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     /* |  |  |  |     /* | 
			
		
	
		
		
			
				
					
					|  |  |  |      * Database |  |  |  |      * Database | 
			
		
	
		
		
			
				
					
					|  |  |  |      */ |  |  |  |      */ | 
			
		
	
	
		
		
			
				
					|  |  | @ -369,19 +267,6 @@ public class Mine extends AbstractGameObject { | 
			
		
	
		
		
			
				
					
					|  |  |  |         return new ArrayList<>(mineMap.keySet()); |  |  |  |         return new ArrayList<>(mineMap.keySet()); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     @Override |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public void updateDatabase() { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         // TODO Create update logic.
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public int getBuildingID() { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         return buildingID; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public void setBuildingID(int buildingID) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.buildingID = buildingID; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public static boolean validateClaimer(PlayerCharacter playerCharacter) { |  |  |  |     public static boolean validateClaimer(PlayerCharacter playerCharacter) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         // Method validates that the claimer meets
 |  |  |  |         // Method validates that the claimer meets
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -407,7 +292,7 @@ public class Mine extends AbstractGameObject { | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (playerGuild.getNation().isEmptyGuild()) |  |  |  |         if (playerGuild.getNation().isEmptyGuild()) | 
			
		
	
		
		
			
				
					
					|  |  |  |             return false; |  |  |  |             return false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |        // Guild must own a city to hold a mine.
 |  |  |  |         // Guild must own a city to hold a mine.
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         City guildCity = playerGuild.getOwnedCity(); |  |  |  |         City guildCity = playerGuild.getOwnedCity(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -433,7 +318,7 @@ public class Mine extends AbstractGameObject { | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (treeRank < 1) |  |  |  |         if (treeRank < 1) | 
			
		
	
		
		
			
				
					
					|  |  |  |             return false; |  |  |  |             return false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (guildUnderMineLimit(playerGuild.getNation(), treeRank) == false){ |  |  |  |         if (guildUnderMineLimit(playerGuild.getNation(), treeRank) == false) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             ErrorPopupMsg.sendErrorMsg(playerCharacter, "Your nation cannot support another mine."); |  |  |  |             ErrorPopupMsg.sendErrorMsg(playerCharacter, "Your nation cannot support another mine."); | 
			
		
	
		
		
			
				
					
					|  |  |  |             return false; |  |  |  |             return false; | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
	
		
		
			
				
					|  |  | @ -450,11 +335,116 @@ public class Mine extends AbstractGameObject { | 
			
		
	
		
		
			
				
					
					|  |  |  |         for (Guild guild : playerGuild.getSubGuildList()) |  |  |  |         for (Guild guild : playerGuild.getSubGuildList()) | 
			
		
	
		
		
			
				
					
					|  |  |  |             mineCnt += Mine.getMinesForGuild(guild.getObjectUUID()).size(); |  |  |  |             mineCnt += Mine.getMinesForGuild(guild.getObjectUUID()).size(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (mineCnt > tolRank) |  |  |  |         return mineCnt <= tolRank; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     public boolean changeProductionType(Resource resource) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (!this.validForMine(resource)) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             return false; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         //update resource in database;
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (!MineQueries.CHANGE_RESOURCE(this, resource)) | 
			
		
	
		
		
			
				
					
					|  |  |  |             return false; |  |  |  |             return false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         this.production = resource; | 
			
		
	
		
		
			
				
					
					|  |  |  |         return true; |  |  |  |         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 float getAltitude() { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         return this.altitude; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     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); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     public boolean validForMine(Resource r) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (this.mineType == null) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             return false; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         return this.mineType.validForMine(r, this.isExpansion()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     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.production.baseProduction); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         writer.putInt(this.getModifiedProductionAmount()); //TODO calculate range penalty here
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         writer.putInt(3600); //window in seconds
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         writer.putInt(this.isExpansion() ? this.mineType.xpacHash : this.mineType.hash); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     @Override | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     public void updateDatabase() { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // TODO Create update logic.
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     public int getBuildingID() { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         return buildingID; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     public void setBuildingID(int buildingID) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         this.buildingID = buildingID; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     public void handleDestroyMine() { |  |  |  |     public void handleDestroyMine() { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (!this.isActive) |  |  |  |         if (!this.isActive) | 
			
		
	
	
		
		
			
				
					|  |  | @ -465,7 +455,6 @@ public class Mine extends AbstractGameObject { | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.guildName = ""; |  |  |  |         this.guildName = ""; | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.nationName = ""; |  |  |  |         this.nationName = ""; | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.owningGuild = Guild.getErrantGuild(); |  |  |  |         this.owningGuild = Guild.getErrantGuild(); | 
			
		
	
		
		
			
				
					
					|  |  |  |         Mine.setLastChange(System.currentTimeMillis()); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.lastClaimer = null; |  |  |  |         this.lastClaimer = null; | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.wasClaimed = false; |  |  |  |         this.wasClaimed = false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -513,6 +502,7 @@ public class Mine extends AbstractGameObject { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         return true; |  |  |  |         return true; | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     public boolean depositMineResources() { |  |  |  |     public boolean depositMineResources() { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (this.owningGuild.isEmptyGuild()) |  |  |  |         if (this.owningGuild.isEmptyGuild()) | 
			
		
	
	
		
		
			
				
					|  |  | 
 |