forked from MagicBane/Server
Threads for Zerg Mechanics
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user