diff --git a/src/engine/gameManager/PowersManager.java b/src/engine/gameManager/PowersManager.java index 9e15abc2..37cf9641 100644 --- a/src/engine/gameManager/PowersManager.java +++ b/src/engine/gameManager/PowersManager.java @@ -56,6 +56,9 @@ public enum PowersManager { public static HashMap> AllMobPowers; private static JobScheduler js; + public static String[] siegeBuffs = new String[]{"ART-004A","ARM-112A"}; + public static String[] siegeDeBuffs = new String[]{"ACM-003A","WRT-003A"}; + private PowersManager() { } @@ -2707,7 +2710,12 @@ public enum PowersManager { } } } + public static void applyZergBuff(AbstractGameObject obj){ + + } + public static void removeZergBuff(HashSet playersIDs){ + } } diff --git a/src/engine/gameManager/SimulationManager.java b/src/engine/gameManager/SimulationManager.java index ccdcb007..2c8b5b34 100644 --- a/src/engine/gameManager/SimulationManager.java +++ b/src/engine/gameManager/SimulationManager.java @@ -10,10 +10,7 @@ package engine.gameManager; import engine.Enum; import engine.Enum.GameObjectType; -import engine.objects.AbstractGameObject; -import engine.objects.City; -import engine.objects.PlayerCharacter; -import engine.objects.Runegate; +import engine.objects.*; import org.pmw.tinylog.Logger; import java.sql.Connection; @@ -33,6 +30,7 @@ public enum SimulationManager { SERVERHEARTBEAT; private static final long CITY_PULSE = 2000; + private static final long MINE_PULSE = 2000; private static final long RUNEGATE_PULSE = 3000; private static final long UPDATE_PULSE = 1000; private static final long FlIGHT_PULSE = 100; @@ -40,6 +38,7 @@ public enum SimulationManager { public static Duration executionMax = Duration.ofNanos(1); private static SimulationManager instance = null; private long _cityPulseTime = System.currentTimeMillis() + CITY_PULSE; + private long _minePulseTime = System.currentTimeMillis() + MINE_PULSE; private long _runegatePulseTime = System.currentTimeMillis() + RUNEGATE_PULSE; private long _updatePulseTime = System.currentTimeMillis() + UPDATE_PULSE; @@ -126,7 +125,17 @@ public enum SimulationManager { e.printStackTrace(); } + try { + if ((_minePulseTime != 0) + && (System.currentTimeMillis() > _minePulseTime)) + pulseMines(); + } catch (Exception e) { + Logger.error( + "Fatal error in City Pulse: DISABLED. Error Message : " + + e.getMessage()); + e.printStackTrace(); + } SimulationManager.executionTime = Duration.between(startTime, Instant.now()); if (executionTime.compareTo(executionMax) > 0) @@ -206,7 +215,28 @@ public enum SimulationManager { _cityPulseTime = System.currentTimeMillis() + CITY_PULSE; } + private void pulseMines() { + + Mine mine; + + // *** Refactor: Need a list cached somewhere as it doesn't change very + // often at all. Have a cityListIsDirty boolean that gets set if it + // needs an update. Will speed up this method a great deal. + + Collection mineList = DbManager.getList(Enum.GameObjectType.Mine); + + if (mineList == null) { + Logger.info("City List null"); + return; + } + for (AbstractGameObject mineObject : mineList) { + mine = (Mine) mineObject; + mine.onEnter(); + } + + _minePulseTime = System.currentTimeMillis() + MINE_PULSE; + } /* * Method runs proximity collision detection for all active portals on the * game's Runegates diff --git a/src/engine/objects/City.java b/src/engine/objects/City.java index d3d36eac..765d2b37 100644 --- a/src/engine/objects/City.java +++ b/src/engine/objects/City.java @@ -986,7 +986,7 @@ public class City extends AbstractWorldObject { // Gather current list of players within the zone bounds - currentPlayers = WorldGrid.getObjectsInRangePartial(this.location, CityBoundsType.ZONE.extents, MBServerStatics.MASK_PLAYER); + currentPlayers = WorldGrid.getObjectsInRangePartial(this.location, CityBoundsType.ZONE.extents * 2, MBServerStatics.MASK_PLAYER); currentMemory = new HashSet<>(); for (AbstractWorldObject playerObject : currentPlayers) { @@ -1025,7 +1025,7 @@ public class City extends AbstractWorldObject { } catch (Exception e) { Logger.error(e.getMessage()); } - + PowersManager.applyZergBuff(this); } private void onExit(HashSet currentMemory) { @@ -1069,6 +1069,7 @@ public class City extends AbstractWorldObject { if (this.cityOutlaws.contains(removalUUID)) this.cityOutlaws.remove(removalUUID); } + PowersManager.removeZergBuff(toRemove); } public int getWarehouseBuildingID() { diff --git a/src/engine/objects/Mine.java b/src/engine/objects/Mine.java index 7a2a4b56..a19bc892 100644 --- a/src/engine/objects/Mine.java +++ b/src/engine/objects/Mine.java @@ -11,10 +11,7 @@ package engine.objects; import engine.Enum; import engine.InterestManagement.WorldGrid; -import engine.gameManager.BuildingManager; -import engine.gameManager.ChatManager; -import engine.gameManager.DbManager; -import engine.gameManager.ZoneManager; +import engine.gameManager.*; import engine.net.ByteBufferWriter; import engine.net.client.msg.ErrorPopupMsg; import engine.server.MBServerStatics; @@ -25,6 +22,8 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; import static engine.gameManager.DbManager.MineQueries; @@ -33,6 +32,7 @@ import static engine.math.FastMath.sqr; public class Mine extends AbstractGameObject { + public final HashSet _playerMemory = new HashSet<>(); public static ConcurrentHashMap mineMap = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW); public static ConcurrentHashMap towerMap = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW); private final String zoneName; @@ -574,5 +574,67 @@ public class Mine extends AbstractGameObject { } return (int) totalModded; } + public void onEnter() { + HashSet currentPlayers; + HashSet currentMemory; + PlayerCharacter player; + + // Gather current list of players within the zone bounds + + currentPlayers = WorldGrid.getObjectsInRangePartial(BuildingManager.getBuildingFromCache(this.buildingID).loc, Enum.CityBoundsType.ZONE.extents, MBServerStatics.MASK_PLAYER); + currentMemory = new HashSet<>(); + + for (AbstractWorldObject playerObject : currentPlayers) { + + if (playerObject == null) + continue; + + player = (PlayerCharacter) playerObject; + currentMemory.add(player.getObjectUUID()); + + // Player is already in our memory + + if (_playerMemory.contains(player.getObjectUUID())) + continue; + + // Add player to our city's memory + + _playerMemory.add(player.getObjectUUID()); + + // ***For debugging + // Logger.info("PlayerMemory for ", this.getCityName() + ": " + _playerMemory.size()); + } + try { + onExit(currentMemory); + } catch (Exception e) { + Logger.error(e.getMessage()); + } + PowersManager.applyZergBuff(this); + } + private void onExit(HashSet currentMemory) { + + PlayerCharacter player; + int playerUUID = 0; + HashSet toRemove = new HashSet<>(); + Iterator iter = _playerMemory.iterator(); + HashSet inRange = WorldGrid.getObjectsInRangePartial(BuildingManager.getBuildingFromCache(this.buildingID).loc,Enum.CityBoundsType.ZONE.extents * 0.5f,MBServerStatics.MASK_PLAYER); + while (iter.hasNext()) { + + playerUUID = iter.next(); + + + player = PlayerCharacter.getFromCache(playerUUID); + + if (inRange.contains(player)) + continue; + + toRemove.add(playerUUID); + } + + // Remove players from mine memory + + _playerMemory.removeAll(toRemove); + PowersManager.removeZergBuff(toRemove); + } }