Files
Server/src/engine/workthreads/ZergMechanicThread.java
T

204 lines
8.0 KiB
Java
Raw Normal View History

2024-04-16 19:52:41 -05:00
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.workthreads;
import engine.Enum;
import engine.InterestManagement.WorldGrid;
import engine.db.archive.DataWarehouse;
import engine.db.archive.MineRecord;
import engine.gameManager.*;
2024-04-20 10:09:13 -05:00
import engine.mobileAI.Threads.MobAIThread;
2024-04-16 19:52:41 -05:00
import engine.net.DispatchMessage;
import engine.net.MessageDispatcher;
import engine.net.client.msg.chat.ChatSystemMsg;
import engine.objects.*;
import engine.server.MBServerStatics;
import engine.server.world.WorldServer;
import org.pmw.tinylog.Logger;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.concurrent.ConcurrentHashMap;
import static engine.server.MBServerStatics.MINE_LATE_WINDOW;
public class ZergMechanicThread implements Runnable {
public Bane bane = null;
public Mine mine = null;
2024-04-23 19:18:30 -05:00
public ArrayList<PlayerCharacter> affectedPlayers = new ArrayList<>();
2024-04-16 19:52:41 -05:00
public ZergMechanicThread(Bane b, Mine m) {
2024-04-20 10:16:24 -05:00
this.mine = m;
this.bane = b;
2024-04-16 19:52:41 -05:00
}
@Override
public void run() {
2024-04-20 10:02:41 -05:00
if (mine != null)
2024-04-16 19:52:41 -05:00
RunMineMechanic();
2024-04-20 10:02:41 -05:00
if (bane != null)
2024-04-16 19:52:41 -05:00
RunBaneMechanic();
}
public void RunMineMechanic(){
2024-04-20 10:02:41 -05:00
while(mine.isActive) {
HashSet<AbstractWorldObject> currentPlayers;
PlayerCharacter player;
2024-04-16 19:52:41 -05:00
2024-04-20 10:02:41 -05:00
// Gather current list of players within the zone bounds
Building tower = BuildingManager.getBuildingFromCache(mine.getBuildingID());
currentPlayers = WorldGrid.getObjectsInRangePartial(tower.loc, Enum.CityBoundsType.GRID.extents * 0.5f, MBServerStatics.MASK_PLAYER);
2024-04-16 19:52:41 -05:00
2024-04-20 10:02:41 -05:00
for (AbstractWorldObject playerObject : currentPlayers) {
2024-04-16 19:52:41 -05:00
2024-04-20 10:02:41 -05:00
if (playerObject == null)
continue;
2024-04-16 19:52:41 -05:00
2024-04-20 10:02:41 -05:00
player = (PlayerCharacter) playerObject;
2024-04-23 19:18:30 -05:00
if(!this.affectedPlayers.contains(player))
this.affectedPlayers.add(player);
2024-04-20 10:16:24 -05:00
//ChatManager.chatSystemInfo(player, "TESTING ZERG MECHANIC");
2024-04-20 10:02:41 -05:00
if (mine._recentMemory.containsKey(player.getObjectUUID()))
mine._recentMemory.remove(player.getObjectUUID());
2024-04-16 19:52:41 -05:00
2024-04-20 10:02:41 -05:00
if (mine._playerMemory.contains(player.getObjectUUID()))
continue;
2024-04-16 19:52:41 -05:00
2024-04-20 10:02:41 -05:00
mine._playerMemory.add(player.getObjectUUID());
2024-04-20 10:16:24 -05:00
2024-04-16 19:52:41 -05:00
}
2024-04-20 10:02:41 -05:00
boolean updated = false;
try {
mine.onExit(currentPlayers);
} catch (Exception e) {
Logger.error(e.getMessage());
}
mine.dividedPlayers = new HashMap<>();
for (Integer playerID : mine._playerMemory) {
player = PlayerCharacter.getFromCache(playerID);
Guild nation = player.getGuild().getNation();
Guild entry;
if (mine.dividedPlayers.containsKey(nation)) {
mine.dividedPlayers.get(nation).add(playerID);
} else {
ArrayList<Integer> newEntry = new ArrayList<>();
newEntry.add(playerID);
mine.dividedPlayers.put(nation, newEntry);
}
}
for (Integer playerID : mine._playerMemory) {
player = PlayerCharacter.getFromCache(playerID);
if (mine.dividedPlayers.containsKey(player.getGuild().getNation())) {
int count = mine.dividedPlayers.get(player.getGuild().getNation()).size();
switch (mine.capSize) {
case 3:
player.ZergMultiplier = ZergManager.getMultiplier3Man(count);
break;
case 5:
player.ZergMultiplier = ZergManager.getMultiplier5Man(count);
break;
case 10:
player.ZergMultiplier = ZergManager.getMultiplier10Man(count);
break;
case 20:
player.ZergMultiplier = ZergManager.getMultiplier20Man(count);
break;
}
player.mineAppliedID = mine.getObjectUUID();
} else {
player.ZergMultiplier = 1.0f;
player.mineAppliedID = 0;
2024-04-16 19:52:41 -05:00
}
}
}
2024-04-23 19:18:30 -05:00
for(PlayerCharacter player : this.affectedPlayers)
player.ZergMultiplier = 1.0f;
2024-04-16 19:52:41 -05:00
}
public void RunBaneMechanic(){
2024-04-20 10:02:41 -05:00
while(bane.getSiegePhase().equals(Enum.SiegePhase.WAR)) {
HashSet<AbstractWorldObject> currentPlayers;
2024-04-16 19:52:41 -05:00
2024-04-20 10:02:41 -05:00
currentPlayers = WorldGrid.getObjectsInRangePartial(bane.getCity().loc, Enum.CityBoundsType.GRID.extents * 2.0f, MBServerStatics.MASK_PLAYER);
2024-04-17 20:46:59 -05:00
2024-04-20 10:02:41 -05:00
Guild attacker = bane.getStone().getGuild().getNation();
Guild defender = bane.getCity().getGuild().getNation();
2024-04-17 20:46:59 -05:00
2024-04-20 10:02:41 -05:00
ArrayList<PlayerCharacter> attackers = new ArrayList<>();
ArrayList<PlayerCharacter> defenders = new ArrayList<>();
2024-04-17 20:46:59 -05:00
2024-04-20 10:02:41 -05:00
for (AbstractWorldObject awo : currentPlayers) {
2024-04-23 19:18:30 -05:00
if(!this.affectedPlayers.contains((PlayerCharacter)awo))
this.affectedPlayers.add((PlayerCharacter)awo);
2024-04-20 10:02:41 -05:00
PlayerCharacter pc = (PlayerCharacter) awo;
if (!pc.getGuild().getNation().equals(attacker) && !pc.getGuild().getNation().equals(defender)) {
pc.teleport(pc.bindLoc);
pc.ZergMultiplier = 1.0f;
}
2024-04-16 19:52:41 -05:00
2024-04-20 10:02:41 -05:00
if (pc.getGuild().getNation().equals(attacker))
attackers.add(pc);
2024-04-16 19:52:41 -05:00
2024-04-20 10:02:41 -05:00
if (pc.getGuild().getNation().equals(defender))
defenders.add(pc);
}
2024-04-17 20:46:59 -05:00
//int treeRank = bane.getCity().getTOL().getRank();
2024-04-17 20:46:59 -05:00
2024-04-20 10:02:41 -05:00
for (PlayerCharacter pc : attackers) {
switch(bane.capSize){
case 10:
pc.ZergMultiplier = ZergManager.getMultiplier10Man(attackers.size());
break;
case 20:
pc.ZergMultiplier = ZergManager.getMultiplier20Man(attackers.size());
break;
2024-04-20 10:02:41 -05:00
}
2024-04-17 20:46:59 -05:00
}
2024-04-20 10:02:41 -05:00
for (PlayerCharacter pc : defenders) {
switch(bane.capSize){
case 10:
pc.ZergMultiplier = ZergManager.getMultiplier10Man(defenders.size());
break;
case 20:
pc.ZergMultiplier = ZergManager.getMultiplier20Man(defenders.size());
break;
2024-04-20 10:02:41 -05:00
}
2024-04-17 20:46:59 -05:00
}
2024-04-16 19:52:41 -05:00
}
2024-04-23 19:18:30 -05:00
for(PlayerCharacter player : this.affectedPlayers)
player.ZergMultiplier = 1.0f;
2024-04-16 19:52:41 -05:00
}
2024-04-20 10:09:13 -05:00
public static void startZergThreadMine(Mine mine) {
Thread zergMechanicThread;
zergMechanicThread = new Thread(new ZergMechanicThread(null, mine));
zergMechanicThread.setName(mine.getParentZone().getName() + "Mine");
zergMechanicThread.start();
}
public static void startZergThreadBane(Bane bane) {
Thread zergMechanicThread;
zergMechanicThread = new Thread(new ZergMechanicThread(bane, null));
zergMechanicThread.setName(bane.getCity().getGuild().getName() + "Bane");
zergMechanicThread.start();
}
2024-04-16 19:52:41 -05:00
}