Threads for Zerg Mechanics

This commit is contained in:
2024-04-17 20:46:59 -05:00
parent 7e3e337de0
commit f98f54139a
8 changed files with 140 additions and 397 deletions
+4 -133
View File
@@ -326,7 +326,10 @@ public class City extends AbstractWorldObject {
if(city.getBane() != null) {
writer.putInt(city.siegesWithstood);
} else{
writer.putInt(ZergManager.getBaneCapSize(city.getGuild()));
if(city.getTOL().getRank() == 8)
writer.putInt(40);
else
writer.putInt(20);
}
writer.put((byte) 1);
writer.put((byte) 0);
@@ -989,8 +992,6 @@ public class City extends AbstractWorldObject {
public void onEnter() {
this.onEnterZerg();
for (Integer id : this._playerMemory) {
PlayerCharacter player = PlayerCharacter.getFromCache(id);
@@ -1385,134 +1386,4 @@ public class City extends AbstractWorldObject {
return true;
}
public void onEnterZerg() {
if(this.getBane() == null || this.getBane().getLiveDate().dayOfWeek() != DateTime.now().dayOfWeek() || this.getBane().getLiveDate().hourOfDay().get() < DateTime.now().hourOfDay().get() - 1)
return;
HashSet<AbstractWorldObject> currentPlayers;
PlayerCharacter player;
// Gather current list of players within the zone bounds
Building tower = this.getTOL();
currentPlayers = WorldGrid.getObjectsInRangePartial(tower.loc, Enum.CityBoundsType.GRID.extents * 2, MBServerStatics.MASK_PLAYER);
boolean updated = false;
for (AbstractWorldObject playerObject : currentPlayers) {
if (playerObject == null)
continue;
player = (PlayerCharacter) playerObject;
// Player is already in our memory
if (_recentMemory.containsKey(player.getObjectUUID()))
_recentMemory.remove(player.getObjectUUID());
if (_playerMemory.contains(player.getObjectUUID()))
continue;
// Add player to our city's memory
_playerMemory.add(player.getObjectUUID());
updated = true;
// ***For debugging
// Logger.info("PlayerMemory for ", this.getCityName() + ": " + _playerMemory.size());
}
this.totalPlayers = this._playerMemory.size();
try {
if(onExitZerg(currentPlayers)){
updated = true;
}
} catch (Exception e) {
Logger.error(e.getMessage());
}
this.dividedPlayers = new HashMap<>();
for(Integer playerID : this._playerMemory){
player = PlayerCharacter.getFromCache(playerID);
Guild nation = player.getGuild().getNation(); Guild entry;
if(this.dividedPlayers.containsKey(nation)){
this.dividedPlayers.get(nation).add(playerID);
}else{
ArrayList<Integer> newEntry = new ArrayList<>();
newEntry.add(playerID);
this.dividedPlayers.put(nation,newEntry);
}
}
if(updated == true){
for(Integer playerID : this._playerMemory){
player = PlayerCharacter.getFromCache(playerID);
if(this.dividedPlayers.containsKey(player.getGuild().getNation())){
int count = this.dividedPlayers.get(player.getGuild().getNation()).size();
switch(this.getBane().capSize){
case 5:
player.ZergMultiplier = ZergManager.getMultiplier5Man(count,player);
break;
case 10:
player.ZergMultiplier = ZergManager.getMultiplier10Man(count,player);
break;
case 20:
player.ZergMultiplier = ZergManager.getMultiplier20Man(count,player);
break;
case 30:
player.ZergMultiplier = ZergManager.getMultiplier30Man(count,player);
break;
case 40:
player.ZergMultiplier = ZergManager.getMultiplier40Man(count,player);
break;
case 9999999:
player.ZergMultiplier = ZergManager.getMultiplierUnlimited(count,player);
break;
}
} else{
player.ZergMultiplier = 1.0f; //something went wrong reset to default until next cycle
}
}
}
}
private Boolean onExitZerg(HashSet<AbstractWorldObject> currentPlayers) {
PlayerCharacter player;
int playerUUID = 0;
HashSet<Integer> toRemove = new HashSet<>();
Iterator<Integer> iter = _playerMemory.iterator();
while (iter.hasNext()) {
playerUUID = iter.next();
player = PlayerCharacter.getFromCache(playerUUID);
if (currentPlayers.contains(player))
continue;
toRemove.add(playerUUID);
if(_recentMemory.containsKey(playerUUID) == false) {
_recentMemory.put(playerUUID, System.currentTimeMillis());
}
player.ZergMultiplier = 1.0f; // reset damage modifier to 1.0
this.removeAllCityEffects(player, false);
if (this.cityOutlaws.contains(playerUUID))
this.cityOutlaws.remove(playerUUID);
}
// Remove players from mine memory
//_playerMemory.removeAll(toRemove);
HashSet<Integer> purge = new HashSet<>();
for(Integer id : _recentMemory.keySet()){
if(System.currentTimeMillis() > _recentMemory.get(playerUUID) + 60000){
purge.add(id);
}
}
for(Integer id : purge){
_recentMemory.remove(id);
}
if(toRemove.isEmpty()){
return false;
}else{
return true;
}
}
}