Compare commits
	
		
			541 Commits 
		
	
	
		
			master
			...
			lakebane-m
		
	
	
				 100 changed files with 5690 additions and 1647 deletions
			
			
		| @ -0,0 +1,63 @@ | |||||||
|  | // • ▌ ▄ ·.  ▄▄▄·  ▄▄ • ▪   ▄▄· ▄▄▄▄·  ▄▄▄·  ▐▄▄▄  ▄▄▄ .
 | ||||||
|  | // ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
 | ||||||
|  | // ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
 | ||||||
|  | // ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
 | ||||||
|  | // ▀▀  █▪▀▀▀ ▀  ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀  ▀  ▀ ▀▀  █▪ ▀▀▀
 | ||||||
|  | //      Magicbane Emulator Project © 2013 - 2022
 | ||||||
|  | //                www.magicbane.com
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | package engine.devcmd.cmds; | ||||||
|  | 
 | ||||||
|  | import engine.Enum.ItemContainerType; | ||||||
|  | import engine.Enum.ItemType; | ||||||
|  | import engine.Enum.OwnerType; | ||||||
|  | import engine.devcmd.AbstractDevCmd; | ||||||
|  | import engine.gameManager.ChatManager; | ||||||
|  | import engine.gameManager.DbManager; | ||||||
|  | import engine.objects.*; | ||||||
|  | import engine.powers.EffectsBase; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * @author Eighty | ||||||
|  |  */ | ||||||
|  | public class GimmeCmd extends AbstractDevCmd { | ||||||
|  | 
 | ||||||
|  |     public GimmeCmd() { | ||||||
|  |         super("gimme"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     protected void _doCmd(PlayerCharacter pc, String[] words, | ||||||
|  |                           AbstractGameObject target) { | ||||||
|  |         int amt = 0; | ||||||
|  |         int currentGold = pc.getCharItemManager().getGoldInventory().getNumOfItems(); | ||||||
|  |         amt = 10000000 - currentGold; | ||||||
|  |         if (!pc.getCharItemManager().addGoldToInventory(amt, true)) { | ||||||
|  |             throwbackError(pc, "Failed to add gold to inventory"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         ChatManager.chatSayInfo(pc, amt + " gold added to inventory"); | ||||||
|  | 
 | ||||||
|  |         if(pc.level < 75) { | ||||||
|  |             pc.setLevel((short) 75); | ||||||
|  |             ChatManager.chatSayInfo(pc, "Level set to 75"); | ||||||
|  |         } | ||||||
|  |         pc.getCharItemManager().updateInventory(); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     protected String _getHelpString() { | ||||||
|  |         return "Round up current gold in inventory to 10,000,000"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     protected String _getUsageString() { | ||||||
|  |         return "'./gimme"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -1,77 +0,0 @@ | |||||||
| // • ▌ ▄ ·.  ▄▄▄·  ▄▄ • ▪   ▄▄· ▄▄▄▄·  ▄▄▄·  ▐▄▄▄  ▄▄▄ .
 |  | ||||||
| // ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
 |  | ||||||
| // ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
 |  | ||||||
| // ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
 |  | ||||||
| // ▀▀  █▪▀▀▀ ▀  ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀  ▀  ▀ ▀▀  █▪ ▀▀▀
 |  | ||||||
| //      Magicbane Emulator Project © 2013 - 2022
 |  | ||||||
| //                www.magicbane.com
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| package engine.devcmd.cmds; |  | ||||||
| 
 |  | ||||||
| import engine.devcmd.AbstractDevCmd; |  | ||||||
| import engine.gameManager.ZoneManager; |  | ||||||
| import engine.objects.AbstractGameObject; |  | ||||||
| import engine.objects.PlayerCharacter; |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * ./hotzone                      <- display the current hotzone & time remaining |  | ||||||
|  * ./hotzone random               <- change hotzone to random new zone |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| public class HotzoneCmd extends AbstractDevCmd { |  | ||||||
| 
 |  | ||||||
|     public HotzoneCmd() { |  | ||||||
|         super("hotzone"); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Override |  | ||||||
|     protected void _doCmd(PlayerCharacter playerCharacter, String[] words, |  | ||||||
|                           AbstractGameObject target) { |  | ||||||
| 
 |  | ||||||
|         StringBuilder data = new StringBuilder(); |  | ||||||
|         String outString; |  | ||||||
| 
 |  | ||||||
|         for (String s : words) { |  | ||||||
|             data.append(s); |  | ||||||
|             data.append(' '); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         String input = data.toString().trim(); |  | ||||||
| 
 |  | ||||||
|         if (input.length() == 0) { |  | ||||||
|             outString = "Current hotZone: " + ZoneManager.hotZone.getName() + "\r\n"; |  | ||||||
|             outString += "Available hotZones: " + ZoneManager.availableHotZones(); |  | ||||||
|             throwbackInfo(playerCharacter, outString); |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         if (input.equalsIgnoreCase("random")) { |  | ||||||
|             ZoneManager.generateAndSetRandomHotzone(); |  | ||||||
|             outString = "New hotZone: " + ZoneManager.hotZone.getName() + "\r\n"; |  | ||||||
|             outString += "Available hotZones: " + ZoneManager.availableHotZones(); |  | ||||||
|             throwbackInfo(playerCharacter, outString); |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         if (input.equalsIgnoreCase("reset")) { |  | ||||||
|             ZoneManager.resetHotZones(); |  | ||||||
|             throwbackInfo(playerCharacter, "Available hotZones: " + ZoneManager.availableHotZones()); |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Override |  | ||||||
|     protected String _getHelpString() { |  | ||||||
|         return "Use no arguments to see the current hotzone or \"random\" to change it randomly."; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Override |  | ||||||
|     protected String _getUsageString() { |  | ||||||
|         return "'./hotzone [random]"; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| @ -0,0 +1,168 @@ | |||||||
|  | package engine.gameManager; | ||||||
|  | 
 | ||||||
|  | import engine.Enum; | ||||||
|  | import engine.InterestManagement.WorldGrid; | ||||||
|  | import engine.exception.MsgSendException; | ||||||
|  | import engine.math.Vector3f; | ||||||
|  | import engine.math.Vector3fImmutable; | ||||||
|  | import engine.objects.*; | ||||||
|  | import engine.server.MBServerStatics; | ||||||
|  | import org.pmw.tinylog.Logger; | ||||||
|  | 
 | ||||||
|  | import java.util.*; | ||||||
|  | import java.util.concurrent.ThreadLocalRandom; | ||||||
|  | 
 | ||||||
|  | public class ArenaManager { | ||||||
|  |     private static final List<Arena> activeArenas = new ArrayList<>(); | ||||||
|  |     public static final List<PlayerCharacter> playerQueue = new ArrayList<>(); | ||||||
|  |     public static Long pulseDelay = 180000L; | ||||||
|  |     public static Long lastExecution = 0L; | ||||||
|  | 
 | ||||||
|  |     public static void pulseArenas() { | ||||||
|  |         if(lastExecution == 0L){ | ||||||
|  |             lastExecution = System.currentTimeMillis(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if(activeArenas.isEmpty() && playerQueue.isEmpty()) | ||||||
|  |             return; | ||||||
|  | 
 | ||||||
|  |         Iterator<Arena> iterator = activeArenas.iterator(); | ||||||
|  | 
 | ||||||
|  |         while (iterator.hasNext()) { | ||||||
|  |             Arena arena = iterator.next(); | ||||||
|  |             if (arena.checkToComplete()) { | ||||||
|  |                 iterator.remove(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if(lastExecution + pulseDelay > System.currentTimeMillis()) | ||||||
|  |             return; | ||||||
|  | 
 | ||||||
|  |         lastExecution = System.currentTimeMillis(); | ||||||
|  | 
 | ||||||
|  |         while (playerQueue.size() > 1) { | ||||||
|  |             createArena(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static void joinQueue(PlayerCharacter player) { | ||||||
|  |         if (!playerQueue.contains(player)) { | ||||||
|  |             playerQueue.add(player); | ||||||
|  |         } | ||||||
|  |         for(PlayerCharacter pc : playerQueue){ | ||||||
|  |             if(pc.equals(player)) | ||||||
|  |                 continue; | ||||||
|  |             ChatManager.chatSystemInfo(pc, player.getName() + " has joined the arena que. There are now " + playerQueue.size() + " players queued."); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static void leaveQueue(PlayerCharacter player) { | ||||||
|  |         playerQueue.remove(player); | ||||||
|  |         for(PlayerCharacter pc : playerQueue){ | ||||||
|  |             if(pc.equals(player)) | ||||||
|  |                 continue; | ||||||
|  |             ChatManager.chatSystemInfo(pc, player.getName() + " has left the arena que. There are now " + playerQueue.size() + " players queued."); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private static void createArena() { | ||||||
|  |         if (playerQueue.size() > 1) { | ||||||
|  | 
 | ||||||
|  |             Collections.shuffle(playerQueue); | ||||||
|  |             Arena newArena = new Arena(); | ||||||
|  | 
 | ||||||
|  |             //set starting time
 | ||||||
|  |             newArena.startTime = System.currentTimeMillis(); | ||||||
|  | 
 | ||||||
|  |             //decide an arena location
 | ||||||
|  |             newArena.loc = selectRandomArenaLocation(); | ||||||
|  | 
 | ||||||
|  |             // Assign players to the arena
 | ||||||
|  |             newArena.player1 = playerQueue.remove(0); | ||||||
|  |             newArena.player2 = playerQueue.remove(0); | ||||||
|  | 
 | ||||||
|  |             // Teleport players to the arena location
 | ||||||
|  |             Zone sdr = ZoneManager.getZoneByUUID(656); | ||||||
|  |             MovementManager.translocate(newArena.player1, Vector3fImmutable.getRandomPointOnCircle(newArena.loc,75f), null); | ||||||
|  |             MovementManager.translocate(newArena.player2, Vector3fImmutable.getRandomPointOnCircle(newArena.loc,75f), null); | ||||||
|  | 
 | ||||||
|  |             // Add the new arena to the active arenas list
 | ||||||
|  |             activeArenas.add(newArena); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static void endArena(Arena arena, PlayerCharacter winner, PlayerCharacter loser, String condition){ | ||||||
|  |         if (winner != null && loser != null) { | ||||||
|  |             Logger.info("[ARENA] The fight between {} and {} is concluded. Victor: {}", | ||||||
|  |                     arena.player1.getName(), arena.player2.getName(), winner.getName()); | ||||||
|  |         } else { | ||||||
|  |             Logger.info("[ARENA] The fight between {} and {} is concluded. No Winner Declared.", | ||||||
|  |                     arena.player1.getName(), arena.player2.getName()); | ||||||
|  |         } | ||||||
|  |         // Teleport players to the arena location
 | ||||||
|  |         Zone sdr = ZoneManager.getZoneByUUID(656); | ||||||
|  |         MovementManager.translocate(arena.player1, Vector3fImmutable.getRandomPointOnCircle(sdr.getLoc(),50f), null); | ||||||
|  |         MovementManager.translocate(arena.player2, Vector3fImmutable.getRandomPointOnCircle(sdr.getLoc(),50f), null); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         activeArenas.remove(arena); | ||||||
|  | 
 | ||||||
|  |         if(winner != null){ | ||||||
|  |             ChatManager.chatPVP("[ARENA] " + winner.getName() + " has slain " + loser.getName() + " in the arena!"); | ||||||
|  |             //handle prize distribution
 | ||||||
|  |             //ItemBase specialLoot = ItemBase.getItemBase(866);
 | ||||||
|  |             //Item promoted = new MobLoot(winner, specialLoot, 1, false).promoteToItem(winner);
 | ||||||
|  |             //promoted.setNumOfItems(21235);
 | ||||||
|  |             //promoted.setName("Special Banker(21235)");
 | ||||||
|  |             //DbManager.ItemQueries.UPDATE_NUM_ITEMS(promoted,21235);
 | ||||||
|  |             //winner.getCharItemManager().addItemToInventory(promoted);
 | ||||||
|  |             //winner.getCharItemManager().updateInventory();
 | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static Vector3fImmutable selectRandomArenaLocation() { | ||||||
|  |         boolean locSet = false; | ||||||
|  |         Vector3fImmutable loc = Vector3fImmutable.ZERO; | ||||||
|  | 
 | ||||||
|  |         while (!locSet) { | ||||||
|  |             try { | ||||||
|  |                 float x = ThreadLocalRandom.current().nextInt(114300, 123600); | ||||||
|  |                 float z = ThreadLocalRandom.current().nextInt(82675, 91700); | ||||||
|  |                 float y = 0; // Y coordinate is always 0
 | ||||||
|  | 
 | ||||||
|  |                 loc = new Vector3fImmutable(x, y, z * -1); | ||||||
|  |                 HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(loc,500f, MBServerStatics.MASK_PLAYER); | ||||||
|  |                 if(inRange.isEmpty() && !isUnderWater(loc)) | ||||||
|  |                     locSet = true; | ||||||
|  |                 //}
 | ||||||
|  |             }catch(Exception e){ | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return loc; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static boolean isUnderWater(Vector3fImmutable loc) { | ||||||
|  | 
 | ||||||
|  |         try { | ||||||
|  | 
 | ||||||
|  |             Zone zone = ZoneManager.findSmallestZone(loc); | ||||||
|  | 
 | ||||||
|  |             if (zone.getSeaLevel() != 0) { | ||||||
|  | 
 | ||||||
|  |                 float localAltitude = loc.y; | ||||||
|  |                 if (localAltitude < zone.getSeaLevel()) | ||||||
|  |                     return true; | ||||||
|  |             } else { | ||||||
|  |                 if (loc.y < 0) | ||||||
|  |                     return true; | ||||||
|  |             } | ||||||
|  |         } catch (Exception e) { | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,347 @@ | |||||||
|  | package engine.gameManager; | ||||||
|  | 
 | ||||||
|  | import engine.Enum; | ||||||
|  | import engine.InterestManagement.InterestManager; | ||||||
|  | import engine.InterestManagement.WorldGrid; | ||||||
|  | import engine.math.Vector3f; | ||||||
|  | import engine.math.Vector3fImmutable; | ||||||
|  | import engine.objects.*; | ||||||
|  | import org.pmw.tinylog.Logger; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.concurrent.ThreadLocalRandom; | ||||||
|  | 
 | ||||||
|  | public class StrongholdManager { | ||||||
|  | 
 | ||||||
|  |     public static void processStrongholds() { | ||||||
|  |         ArrayList<Mine> mines = Mine.getMines(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         //process strongholds selecting 3 randomly to become active
 | ||||||
|  |         int count = 0; | ||||||
|  |         while (count < 3) { | ||||||
|  |             int random = ThreadLocalRandom.current().nextInt(1, mines.size()) - 1; | ||||||
|  |             Mine mine = mines.get(random); | ||||||
|  |             if (mine != null) { | ||||||
|  |                 if (!mine.isActive && !mine.isStronghold) { | ||||||
|  |                     StartStronghold(mine); | ||||||
|  |                     count++; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static void StartStronghold(Mine mine){ | ||||||
|  | 
 | ||||||
|  |         //remove buildings
 | ||||||
|  |         Building tower = BuildingManager.getBuilding(mine.getBuildingID()); | ||||||
|  |         if(tower == null) | ||||||
|  |             return; | ||||||
|  | 
 | ||||||
|  |         mine.isStronghold = true; | ||||||
|  |         mine.strongholdMobs = new ArrayList<>(); | ||||||
|  |         mine.oldBuildings = new HashMap<>(); | ||||||
|  | 
 | ||||||
|  |         Zone mineZone = ZoneManager.findSmallestZone(tower.loc); | ||||||
|  |         for(Building building : mineZone.zoneBuildingSet){ | ||||||
|  |             mine.oldBuildings.put(building.getObjectUUID(),building.meshUUID); | ||||||
|  |             building.setMeshUUID(407650); | ||||||
|  |             building.setMeshScale(new Vector3f(0,0,0)); | ||||||
|  |             InterestManager.setObjectDirty(building); | ||||||
|  |             WorldGrid.updateObject(building); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         //update tower to become stronghold mesh
 | ||||||
|  |         tower.setMeshUUID(getStrongholdMeshID(mine.getParentZone())); | ||||||
|  |         tower.setMeshScale(new Vector3f(1,1,1)); | ||||||
|  |         InterestManager.setObjectDirty(tower); | ||||||
|  |         WorldGrid.updateObject(tower); | ||||||
|  | 
 | ||||||
|  |         //create elite mobs
 | ||||||
|  |         for(int i = 0; i < mine.capSize * 2; i++){ | ||||||
|  |             Vector3fImmutable loc = Vector3fImmutable.getRandomPointOnCircle(tower.loc,30); | ||||||
|  |             MobBase guardBase = MobBase.getMobBase(getStrongholdGuardianID(tower.meshUUID)); | ||||||
|  |             Mob guard = Mob.createStrongholdMob(guardBase.getLoadID(), loc, Guild.getErrantGuild(),true,mineZone,null,0, guardBase.getFirstName(),65); | ||||||
|  |             if(guard != null){ | ||||||
|  |                 guard.parentZone = mine.getParentZone(); | ||||||
|  |                 guard.bindLoc = loc; | ||||||
|  |                 guard.setLoc(loc); | ||||||
|  |                 guard.StrongholdGuardian = true; | ||||||
|  |                 guard.equipmentSetID = getStrongholdMobEquipSetID(guard); | ||||||
|  |                 guard.runAfterLoad(); | ||||||
|  |                 guard.setLevel((short)65); | ||||||
|  |                 guard.setResists(new Resists("Elite")); | ||||||
|  |                 guard.spawnTime = 1000000000; | ||||||
|  |                 guard.BehaviourType = Enum.MobBehaviourType.Aggro; | ||||||
|  |                 mine.strongholdMobs.add(guard); | ||||||
|  |                 LootManager.GenerateStrongholdLoot(guard,false,false); | ||||||
|  |                 guard.healthMax  = 12500; | ||||||
|  |                 guard.setHealth(guard.healthMax); | ||||||
|  |                 guard.maxDamageHandOne = 1550; | ||||||
|  |                 guard.minDamageHandOne = 750; | ||||||
|  |                 guard.atrHandOne = 1800; | ||||||
|  |                 guard.defenseRating = 2200; | ||||||
|  |                 guard.setFirstName("Elite Guardian"); | ||||||
|  |                 InterestManager.setObjectDirty(guard); | ||||||
|  |                 WorldGrid.addObject(guard,loc.x,loc.z); | ||||||
|  |                 WorldGrid.updateObject(guard); | ||||||
|  |                 guard.stronghold = mine; | ||||||
|  |                 guard.mobPowers.clear(); | ||||||
|  |                 guard.mobPowers.put(429399948,20); // find weakness
 | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         //create stronghold commander
 | ||||||
|  |         Vector3fImmutable loc = tower.loc; | ||||||
|  |         MobBase commanderBase = MobBase.getMobBase(getStrongholdCommanderID(tower.meshUUID)); | ||||||
|  |         Mob commander = Mob.createStrongholdMob(commanderBase.getLoadID(), loc,Guild.getErrantGuild(),true,mineZone,null,0, commanderBase.getFirstName(),75); | ||||||
|  |         if(commander != null){ | ||||||
|  |             commander.parentZone = mine.getParentZone(); | ||||||
|  |             commander.bindLoc = loc; | ||||||
|  |             commander.setLoc(loc); | ||||||
|  |             commander.StrongholdCommander = true; | ||||||
|  |             commander.equipmentSetID = getStrongholdMobEquipSetID(commander); | ||||||
|  |             commander.runAfterLoad(); | ||||||
|  |             commander.setLevel((short)75); | ||||||
|  |             commander.setResists(new Resists("Elite")); | ||||||
|  |             commander.spawnTime = 1000000000; | ||||||
|  |             commander.BehaviourType = Enum.MobBehaviourType.Aggro; | ||||||
|  |             commander.mobPowers.clear(); | ||||||
|  |             commander.mobPowers.put(429032838, 40); // gravechill
 | ||||||
|  |             commander.mobPowers.put(429757701,20); // magebolt
 | ||||||
|  |             commander.mobPowers.put(429121388,20); // blight
 | ||||||
|  |             commander.mobPowers.put(431566891,20); // lightning bolt
 | ||||||
|  |             commander.mobPowers.put(428716075,20); // fire bolt
 | ||||||
|  |             commander.mobPowers.put(429010987,20); // ice bolt
 | ||||||
|  |             mine.strongholdMobs.add(commander); | ||||||
|  |             LootManager.GenerateStrongholdLoot(commander,true, false); | ||||||
|  |             commander.healthMax = 50000; | ||||||
|  |             commander.setHealth(commander.healthMax); | ||||||
|  |             commander.maxDamageHandOne = 3500; | ||||||
|  |             commander.minDamageHandOne = 1500; | ||||||
|  |             commander.atrHandOne = 3500; | ||||||
|  |             commander.defenseRating = 3500; | ||||||
|  |             commander.setFirstName("Guardian Commander"); | ||||||
|  |             InterestManager.setObjectDirty(commander); | ||||||
|  |             WorldGrid.addObject(commander,loc.x,loc.z); | ||||||
|  |             WorldGrid.updateObject(commander); | ||||||
|  |             commander.stronghold = mine; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         mine.isActive = true; | ||||||
|  |         tower.setProtectionState(Enum.ProtectionState.PROTECTED); | ||||||
|  |         tower.getBounds().setRegions(tower); | ||||||
|  |         InterestManager.setObjectDirty(tower); | ||||||
|  |         WorldGrid.updateObject(tower); | ||||||
|  |         ChatManager.chatSystemChannel(mine.getZoneName() + "'s Stronghold Has Begun!"); | ||||||
|  |         Logger.info(mine.getZoneName() + "'s Stronghold Has Begun!"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static void EndStronghold(Mine mine){ | ||||||
|  | 
 | ||||||
|  |         //restore the buildings
 | ||||||
|  |         Building tower = BuildingManager.getBuilding(mine.getBuildingID()); | ||||||
|  |         if(tower == null) | ||||||
|  |             return; | ||||||
|  | 
 | ||||||
|  |         mine.isStronghold = false; | ||||||
|  | 
 | ||||||
|  |         //get rid of the mobs
 | ||||||
|  |         for(Mob mob : mine.strongholdMobs) { | ||||||
|  |             mob.despawn(); | ||||||
|  |             mob.removeFromCache(); | ||||||
|  |             DbManager.MobQueries.DELETE_MOB(mob); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         //restore the buildings
 | ||||||
|  |         Zone mineZone = ZoneManager.findSmallestZone(tower.loc); | ||||||
|  |         for(Building building : mineZone.zoneBuildingSet){ | ||||||
|  |             if(mine.oldBuildings.containsKey(building.getObjectUUID())) { | ||||||
|  |                 building.setMeshUUID(mine.oldBuildings.get(building.getObjectUUID())); | ||||||
|  |                 building.setMeshScale(new Vector3f(1, 1, 1)); | ||||||
|  |                 InterestManager.setObjectDirty(building); | ||||||
|  |                 WorldGrid.updateObject(building); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         //update tower to become Mine Tower again
 | ||||||
|  |         tower.setMeshUUID(1500100); | ||||||
|  | 
 | ||||||
|  |         mine.isActive = false; | ||||||
|  |         tower.setProtectionState(Enum.ProtectionState.NPC); | ||||||
|  |         tower.getBounds().setRegions(tower); | ||||||
|  |         InterestManager.setObjectDirty(tower); | ||||||
|  |         WorldGrid.updateObject(tower); | ||||||
|  |         ChatManager.chatSystemChannel(mine.getZoneName() + "'s Stronghold Has Concluded!"); | ||||||
|  |         Logger.info(mine.getZoneName() + "'s Stronghold Has Concluded!"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static int getStrongholdMeshID(Zone parent){ | ||||||
|  |         while(!parent.isMacroZone()){ | ||||||
|  |             parent = parent.getParent(); | ||||||
|  |             if(parent.getName().equalsIgnoreCase("seafloor")){ | ||||||
|  |                 return 0; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         switch(parent.getObjectUUID()){ | ||||||
|  |             case 197: | ||||||
|  |             case 234: | ||||||
|  |             case 178: | ||||||
|  |             case 122: | ||||||
|  |                 return 814000; //Frost Giant Hall (ICE)
 | ||||||
|  |             case 968: | ||||||
|  |             case 951: | ||||||
|  |             case 313: | ||||||
|  |             case 331: | ||||||
|  |                 return 5001500; // Lich Queens Keep (UNDEAD)
 | ||||||
|  |             case 785: | ||||||
|  |             case 761: | ||||||
|  |             case 717: | ||||||
|  |             case 737: | ||||||
|  |                 return 1306600; // Temple of the Dragon (DESERT)
 | ||||||
|  |             case 353: | ||||||
|  |             case 371: | ||||||
|  |             case 388: | ||||||
|  |             case 532: | ||||||
|  |                 return 564600; // Undead Lord's Keep (SWAMP)
 | ||||||
|  |             case 550: | ||||||
|  |             case 508: | ||||||
|  |             case 475: | ||||||
|  |             case 418: | ||||||
|  |                 return 1326600; // elven hall
 | ||||||
|  |             case 437: | ||||||
|  |             case 491: | ||||||
|  |             case 590: | ||||||
|  |             case 569: | ||||||
|  |                 return 602400; | ||||||
|  |             case 824: | ||||||
|  |             case 842: | ||||||
|  |             case 632: | ||||||
|  |                 return 1600000; // chaos temple
 | ||||||
|  |         } | ||||||
|  |         return 456100; // small stockade
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static int getStrongholdGuardianID(int ID){ | ||||||
|  |         switch(ID){ | ||||||
|  |             case 814000: | ||||||
|  |                 return 253004; // Mountain Giant Raider Axe
 | ||||||
|  |             case 5001500: | ||||||
|  |                 return 253008; // Vampire Spear Warrior
 | ||||||
|  |             case 1306600: | ||||||
|  |                 return 253007; // Desert Orc Warrior
 | ||||||
|  |             case 564600: | ||||||
|  |                 return 253010; // Kolthoss Warrior
 | ||||||
|  |             case 1326600: | ||||||
|  |                 return 253005; //elven warrior
 | ||||||
|  |             case 602400: | ||||||
|  |                 return 253009; // templar missionary
 | ||||||
|  |             case 1600000: | ||||||
|  |                 return 253006; // scourger
 | ||||||
|  |         } | ||||||
|  |         return 13434; // human sword and board warrior
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static int getStrongholdEpicID(int ID){ | ||||||
|  |         switch(ID){ | ||||||
|  |             case 814000: | ||||||
|  |                 return 253023; // Mountain Giant Raider Axe
 | ||||||
|  |             case 5001500: | ||||||
|  |                 return 253022; // Vampire Spear Warrior
 | ||||||
|  |             case 1306600: | ||||||
|  |                 return 253021; // Desert Orc Warrior
 | ||||||
|  |             case 564600: | ||||||
|  |                 return 253018; // Kolthoss Warrior
 | ||||||
|  |             case 1326600: | ||||||
|  |                 return 253019; //elven warrior
 | ||||||
|  |             case 602400: | ||||||
|  |                 return 253024; // templar missionary
 | ||||||
|  |             case 1600000: | ||||||
|  |                 return 253020; // scourger
 | ||||||
|  |         } | ||||||
|  |         return 13434; // human sword and board warrior
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static int getStrongholdCommanderID(int ID){ | ||||||
|  |         switch(ID){ | ||||||
|  |             case 814000: | ||||||
|  |                 return 253017; | ||||||
|  |             case 5001500: | ||||||
|  |                 return 253012; | ||||||
|  |             case 1306600: | ||||||
|  |                 return 253016; // Desert Orc Xbow
 | ||||||
|  |             case 564600: | ||||||
|  |                 return 253011; // xbow kolthoss
 | ||||||
|  |             case 1326600: | ||||||
|  |                 return 253013; //elven bow warrior
 | ||||||
|  |             case 602400: | ||||||
|  |                 return 253015; // dune giant with xbow
 | ||||||
|  |             case 1600000: | ||||||
|  |                 return 253014; // barbator
 | ||||||
|  |         } | ||||||
|  |         return 13433; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static int getStrongholdMobEquipSetID(Mob mob) { | ||||||
|  |         if(mob.StrongholdGuardian){ | ||||||
|  |             return 6327; | ||||||
|  |         }else{ | ||||||
|  |             return 10790; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static void CheckToEndStronghold(Mine mine) { | ||||||
|  | 
 | ||||||
|  |         boolean stillAlive = false; | ||||||
|  |         for (Mob mob : mine.strongholdMobs) | ||||||
|  |             if (mob.isAlive()) | ||||||
|  |                 stillAlive = true; | ||||||
|  | 
 | ||||||
|  |         if (!stillAlive) { | ||||||
|  |             // Epic encounter
 | ||||||
|  | 
 | ||||||
|  |             Building tower = BuildingManager.getBuilding(mine.getBuildingID()); | ||||||
|  |             if (tower == null) | ||||||
|  |                 return; | ||||||
|  | 
 | ||||||
|  |             Zone mineZone = ZoneManager.findSmallestZone(tower.loc); | ||||||
|  | 
 | ||||||
|  |             Vector3fImmutable loc = tower.loc; | ||||||
|  |             MobBase commanderBase = MobBase.getMobBase(getStrongholdEpicID(tower.meshUUID)); | ||||||
|  |             Mob commander = Mob.createStrongholdMob(commanderBase.getLoadID(), loc, Guild.getErrantGuild(), true, mineZone, null, 0, commanderBase.getFirstName(), 75); | ||||||
|  |             if (commander != null) { | ||||||
|  |                 commander.parentZone = mine.getParentZone(); | ||||||
|  |                 commander.bindLoc = loc; | ||||||
|  |                 commander.setLoc(loc); | ||||||
|  |                 commander.StrongholdEpic = true; | ||||||
|  |                 commander.equipmentSetID = getStrongholdMobEquipSetID(commander); | ||||||
|  |                 commander.runAfterLoad(); | ||||||
|  |                 commander.setLevel((short) 85); | ||||||
|  |                 commander.setResists(new Resists("Elite")); | ||||||
|  |                 commander.spawnTime = 1000000000; | ||||||
|  |                 commander.BehaviourType = Enum.MobBehaviourType.Aggro; | ||||||
|  |                 commander.mobPowers.clear(); | ||||||
|  |                 commander.mobPowers.put(429032838, 40); // gravechill
 | ||||||
|  |                 commander.mobPowers.put(429757701,40); // magebolt
 | ||||||
|  |                 commander.mobPowers.put(429121388,40); // blight
 | ||||||
|  |                 commander.mobPowers.put(431566891,40); // lightning bolt
 | ||||||
|  |                 commander.mobPowers.put(428716075,40); // fire bolt
 | ||||||
|  |                 commander.mobPowers.put(429010987,40); // ice bolt
 | ||||||
|  |                 mine.strongholdMobs.add(commander); | ||||||
|  |                 LootManager.GenerateStrongholdLoot(commander, true, true); | ||||||
|  |                 commander.healthMax = 250000; | ||||||
|  |                 commander.setHealth(commander.healthMax); | ||||||
|  |                 commander.maxDamageHandOne = 5000; | ||||||
|  |                 commander.minDamageHandOne = 2500; | ||||||
|  |                 commander.atrHandOne = 5000; | ||||||
|  |                 commander.defenseRating = 3500; | ||||||
|  |                 commander.setFirstName("Defender of " + mine.getParentZone().getParent().getName()); | ||||||
|  |                 InterestManager.setObjectDirty(commander); | ||||||
|  |                 WorldGrid.addObject(commander,loc.x,loc.z); | ||||||
|  |                 WorldGrid.updateObject(commander); | ||||||
|  |                 commander.stronghold = mine; | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,195 @@ | |||||||
|  | package engine.gameManager; | ||||||
|  | import engine.objects.Guild; | ||||||
|  | public class ZergManager { | ||||||
|  | 
 | ||||||
|  |     public static float getCurrentMultiplier(int count, int maxCount){ | ||||||
|  |         switch(maxCount) { | ||||||
|  |             case 3: return getMultiplier3Man(count); | ||||||
|  |             case 5: return getMultiplier5Man(count); | ||||||
|  |             case 10: return getMultiplier10Man(count); | ||||||
|  |             case 20: return getMultiplier20Man(count); | ||||||
|  |             case 30: return getMultiplier30Man(count); | ||||||
|  |             case 40: return getMultiplier40Man(count); | ||||||
|  |             default: return 1.0f; //unlimited
 | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     public static float getMultiplier3Man(int count) { | ||||||
|  |         if(count < 4) | ||||||
|  |             return 1.0f; | ||||||
|  | 
 | ||||||
|  |         if(count > 6) | ||||||
|  |             return 0.0f; | ||||||
|  | 
 | ||||||
|  |         switch(count){ | ||||||
|  |             case 4: return 0.63f; | ||||||
|  |             case 5: return 0.40f; | ||||||
|  |             case 6: return 0.25f; | ||||||
|  |             default: return 1.0f; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     public static float getMultiplier5Man(int count) { | ||||||
|  |         if(count < 6) | ||||||
|  |             return 1.0f; | ||||||
|  | 
 | ||||||
|  |         if(count > 10) | ||||||
|  |             return 0.0f; | ||||||
|  | 
 | ||||||
|  |         switch(count){ | ||||||
|  |             case 6: return 0.75f; | ||||||
|  |             case 7: return 0.57f; | ||||||
|  |             case 8: return 0.44f; | ||||||
|  |             case 9: return 0.33f; | ||||||
|  |             case 10: return 0.25f; | ||||||
|  |             default: return 1.0f; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     public static float getMultiplier10Man(int count) { | ||||||
|  |         if(count < 11) | ||||||
|  |             return 1.0f; | ||||||
|  | 
 | ||||||
|  |         if(count > 20) | ||||||
|  |             return 0.0f; | ||||||
|  | 
 | ||||||
|  |         switch(count){ | ||||||
|  |             case 11: return 0.86f; | ||||||
|  |             case 12: return 0.75f; | ||||||
|  |             case 13: return 0.65f; | ||||||
|  |             case 14: return 0.57f; | ||||||
|  |             case 15: return 0.50f; | ||||||
|  |             case 16: return 0.44f; | ||||||
|  |             case 17: return 0.38f; | ||||||
|  |             case 18: return 0.33f; | ||||||
|  |             case 19: return 0.29f; | ||||||
|  |             case 20: return 0.25f; | ||||||
|  |             default: return 1.0f; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     public static float getMultiplier20Man(int count) { | ||||||
|  |         if(count < 21) | ||||||
|  |             return 1.0f; | ||||||
|  | 
 | ||||||
|  |         if(count > 40) | ||||||
|  |             return 0.0f; | ||||||
|  | 
 | ||||||
|  |         switch (count) | ||||||
|  |         { | ||||||
|  |             case 21: return 0.93f; | ||||||
|  |             case 22: return 0.86f; | ||||||
|  |             case 23: return 0.80f; | ||||||
|  |             case 24: return 0.75f; | ||||||
|  |             case 25: return 0.70f; | ||||||
|  |             case 26: return 0.65f; | ||||||
|  |             case 27: return 0.61f; | ||||||
|  |             case 28: return 0.57f; | ||||||
|  |             case 29: return 0.53f; | ||||||
|  |             case 30: return 0.50f; | ||||||
|  |             case 31: return 0.47f; | ||||||
|  |             case 32: return 0.44f; | ||||||
|  |             case 33: return 0.41f; | ||||||
|  |             case 34: return 0.38f; | ||||||
|  |             case 35: return 0.36f; | ||||||
|  |             case 36: return 0.33f; | ||||||
|  |             case 37: return 0.31f; | ||||||
|  |             case 38: return 0.29f; | ||||||
|  |             case 39: return 0.27f; | ||||||
|  |             case 40: return 0.25f; | ||||||
|  |             default: return 1.0f; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     public static float getMultiplier30Man(int count) { | ||||||
|  |         if(count < 31) | ||||||
|  |             return 1.0f; | ||||||
|  | 
 | ||||||
|  |         if(count > 60) | ||||||
|  |             return 0.0f; | ||||||
|  | 
 | ||||||
|  |         switch (count) | ||||||
|  |         { | ||||||
|  |             case 31: return 0.95f; | ||||||
|  |             case 32: return 0.91f; | ||||||
|  |             case 33: return 0.86f; | ||||||
|  |             case 34: return 0.82f; | ||||||
|  |             case 35: return 0.79f; | ||||||
|  |             case 36: return 0.75f; | ||||||
|  |             case 37: return 0.72f; | ||||||
|  |             case 38: return 0.68f; | ||||||
|  |             case 39: return 0.65f; | ||||||
|  |             case 40: return 0.63f; | ||||||
|  |             case 41: return 0.60f; | ||||||
|  |             case 42: return 0.57f; | ||||||
|  |             case 43: return 0.55f; | ||||||
|  |             case 44: return 0.52f; | ||||||
|  |             case 45: return 0.50f; | ||||||
|  |             case 46: return 0.48f; | ||||||
|  |             case 47: return 0.46f; | ||||||
|  |             case 48: return 0.44f; | ||||||
|  |             case 49: return 0.42f; | ||||||
|  |             case 50: return 0.40f; | ||||||
|  |             case 51: return 0.38f; | ||||||
|  |             case 52: return 0.37f; | ||||||
|  |             case 53: return 0.35f; | ||||||
|  |             case 54: return 0.33f; | ||||||
|  |             case 55: return 0.32f; | ||||||
|  |             case 56: return 0.30f; | ||||||
|  |             case 57: return 0.29f; | ||||||
|  |             case 58: return 0.28f; | ||||||
|  |             case 59: return 0.26f; | ||||||
|  |             case 60: return 0.25f; | ||||||
|  |             default: return 1.0f; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     public static float getMultiplier40Man(int count) { | ||||||
|  |         if(count < 41) | ||||||
|  |             return 1.0f; | ||||||
|  | 
 | ||||||
|  |         if(count > 80) | ||||||
|  |             return 0.0f; | ||||||
|  | 
 | ||||||
|  |         switch (count) | ||||||
|  |         { | ||||||
|  |             case 41: return 0.96f; | ||||||
|  |             case 42: return 0.93f; | ||||||
|  |             case 43: return 0.90f; | ||||||
|  |             case 44: return 0.86f; | ||||||
|  |             case 45: return 0.83f; | ||||||
|  |             case 46: return 0.80f; | ||||||
|  |             case 47: return 0.78f; | ||||||
|  |             case 48: return 0.75f; | ||||||
|  |             case 49: return 0.72f; | ||||||
|  |             case 50: return 0.70f; | ||||||
|  |             case 51: return 0.68f; | ||||||
|  |             case 52: return 0.65f; | ||||||
|  |             case 53: return 0.63f; | ||||||
|  |             case 54: return 0.61f; | ||||||
|  |             case 55: return 0.59f; | ||||||
|  |             case 56: return 0.57f; | ||||||
|  |             case 57: return 0.55f; | ||||||
|  |             case 58: return 0.53f; | ||||||
|  |             case 59: return 0.52f; | ||||||
|  |             case 60: return 0.50f; | ||||||
|  |             case 61: return 0.48f; | ||||||
|  |             case 62: return 0.47f; | ||||||
|  |             case 63: return 0.45f; | ||||||
|  |             case 64: return 0.44f; | ||||||
|  |             case 65: return 0.42f; | ||||||
|  |             case 66: return 0.41f; | ||||||
|  |             case 67: return 0.40f; | ||||||
|  |             case 68: return 0.38f; | ||||||
|  |             case 69: return 0.37f; | ||||||
|  |             case 70: return 0.36f; | ||||||
|  |             case 71: return 0.35f; | ||||||
|  |             case 72: return 0.33f; | ||||||
|  |             case 73: return 0.32f; | ||||||
|  |             case 74: return 0.31f; | ||||||
|  |             case 75: return 0.30f; | ||||||
|  |             case 76: return 0.29f; | ||||||
|  |             case 77: return 0.28f; | ||||||
|  |             case 78: return 0.27f; | ||||||
|  |             case 79: return 0.26f; | ||||||
|  |             case 80: return 0.25f; | ||||||
|  |             default: return 1.0f; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,360 @@ | |||||||
|  | package engine.mobileAI; | ||||||
|  | 
 | ||||||
|  | import engine.Enum; | ||||||
|  | import engine.InterestManagement.WorldGrid; | ||||||
|  | import engine.gameManager.*; | ||||||
|  | import engine.mobileAI.Threads.MobAIThread; | ||||||
|  | import engine.mobileAI.utilities.CombatUtilities; | ||||||
|  | import engine.mobileAI.utilities.MovementUtilities; | ||||||
|  | import engine.objects.*; | ||||||
|  | import engine.server.MBServerStatics; | ||||||
|  | import org.pmw.tinylog.Logger; | ||||||
|  | 
 | ||||||
|  | import java.util.HashSet; | ||||||
|  | import java.util.concurrent.ThreadLocalRandom; | ||||||
|  | 
 | ||||||
|  | public class MobAi2 { | ||||||
|  | 
 | ||||||
|  |     public enum State | ||||||
|  |     { | ||||||
|  |         Idle, | ||||||
|  |         Patrolling, | ||||||
|  |         Attacking, | ||||||
|  |         Dead | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static boolean Agressive(Mob mob){ | ||||||
|  |         return mob.BehaviourType.name().contains("Aggro"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static boolean Caster(Mob mob){ | ||||||
|  |         return mob.BehaviourType.name().contains("Power"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static boolean HelpResponder(Mob mob){ | ||||||
|  |         return mob.BehaviourType.name().contains("Helpee"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static State getState(Mob mob){ | ||||||
|  | 
 | ||||||
|  |         if(!mob.isAlive()) | ||||||
|  |             return State.Dead; | ||||||
|  | 
 | ||||||
|  |         if(mob.playerAgroMap.isEmpty()) | ||||||
|  |             return State.Idle; | ||||||
|  | 
 | ||||||
|  |         if(mob.combatTarget != null) | ||||||
|  |             return State.Attacking; | ||||||
|  | 
 | ||||||
|  |         return State.Patrolling; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static void runAI(Mob mob){ | ||||||
|  | 
 | ||||||
|  |         //these will be handled in special conditions later
 | ||||||
|  |         switch(mob.BehaviourType){ | ||||||
|  |             case GuardCaptain: | ||||||
|  |             case GuardMinion: | ||||||
|  |             case Pet1: | ||||||
|  |             case GuardWallArcher: | ||||||
|  |             case HamletGuard: | ||||||
|  |             case SimpleStandingGuard: | ||||||
|  |                 return; | ||||||
|  |         } | ||||||
|  |         switch(getState(mob)){ | ||||||
|  |             case Idle: | ||||||
|  |                 if(mob.isMoving()) | ||||||
|  |                     mob.stopMovement(mob.loc); | ||||||
|  |                 if(mob.combatTarget != null) { | ||||||
|  |                     mob.setCombatTarget(null); | ||||||
|  |                     mob.setCombat(false); | ||||||
|  |                 } | ||||||
|  |                 return; | ||||||
|  |             case Dead: | ||||||
|  |                 respawn(mob); | ||||||
|  |                 break; | ||||||
|  |             case Patrolling: | ||||||
|  |                 patrol(mob); | ||||||
|  |                 break; | ||||||
|  |             case Attacking: | ||||||
|  |                 attack(mob); | ||||||
|  |                 break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     //handles respawning and de-spawning for mobs and their corpses
 | ||||||
|  |     public static void respawn(Mob mob){ | ||||||
|  | 
 | ||||||
|  |         //if mob doesn't have a death time somehow, set it to now
 | ||||||
|  |         if (mob.deathTime == 0) | ||||||
|  |             mob.setDeathTime(System.currentTimeMillis()); | ||||||
|  | 
 | ||||||
|  |         //only execute this logic is the mob hasn't de-spawned yet
 | ||||||
|  |         if (!mob.despawned) { | ||||||
|  | 
 | ||||||
|  |             //if the inventory is empty, the mob can disappear
 | ||||||
|  |             if(mob.getInventory(true).isEmpty() && System.currentTimeMillis() > mob.deathTime + 10000L) { | ||||||
|  |                 mob.despawn(); | ||||||
|  |                 mob.deathTime = System.currentTimeMillis(); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             //if the mob has been dead for 10 seconds it can disappear
 | ||||||
|  |             if (System.currentTimeMillis() > mob.deathTime + 10000L) { | ||||||
|  |                 mob.despawn(); | ||||||
|  |                 mob.deathTime = System.currentTimeMillis(); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         //disc dropper respawns are handled elsewhere
 | ||||||
|  |         if(Mob.discDroppers.contains(mob)) | ||||||
|  |             return; | ||||||
|  | 
 | ||||||
|  |         //if mob isn't queued for respawn, do so now
 | ||||||
|  |         if (!Zone.respawnQue.contains(mob)) { | ||||||
|  |             if (System.currentTimeMillis() > (mob.deathTime + (mob.spawnTime * 1000L))) { | ||||||
|  |                 Zone.respawnQue.add(mob); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     //handles patrolling and looking for potential combat targets
 | ||||||
|  |     public static void patrol(Mob mob){ | ||||||
|  |         if(Agressive(mob) && mob.combatTarget == null) { | ||||||
|  |             HashSet<AbstractWorldObject> potentialTargets = WorldGrid.getObjectsInRangePartial(mob.loc, 50, MBServerStatics.MASK_PLAYER); | ||||||
|  |             for (AbstractWorldObject awo : potentialTargets) { | ||||||
|  |                 PlayerCharacter target = (PlayerCharacter) awo; | ||||||
|  |                 if (mob.canSee(target)) | ||||||
|  |                     mob.setCombatTarget(target); | ||||||
|  |                 if (mob.combatTarget != null) { | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         if(mob.isMoving() || !mob.BehaviourType.canRoam) | ||||||
|  |             return; | ||||||
|  | 
 | ||||||
|  |         int patrolDelay = ThreadLocalRandom.current().nextInt((int) (MobAIThread.AI_PATROL_DIVISOR * 0.5f), MobAIThread.AI_PATROL_DIVISOR) + MobAIThread.AI_PATROL_DIVISOR; | ||||||
|  | 
 | ||||||
|  |         if (mob.stopPatrolTime + (patrolDelay * 1000L) > System.currentTimeMillis()) | ||||||
|  |             return; | ||||||
|  | 
 | ||||||
|  |         if (mob.lastPatrolPointIndex > mob.patrolPoints.size() - 1) | ||||||
|  |             mob.lastPatrolPointIndex = 0; | ||||||
|  | 
 | ||||||
|  |         mob.destination = mob.patrolPoints.get(mob.lastPatrolPointIndex); | ||||||
|  |         mob.lastPatrolPointIndex += 1; | ||||||
|  |         MovementUtilities.aiMove(mob, mob.destination, true); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static void attack(Mob mob){ | ||||||
|  |         AbstractWorldObject target = mob.combatTarget; | ||||||
|  | 
 | ||||||
|  |         if (target == null || !target.isAlive()) { | ||||||
|  |             mob.setCombatTarget(null); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if(!mob.isCombat()) | ||||||
|  |             mob.setCombat(true); | ||||||
|  | 
 | ||||||
|  |         if (!CombatUtilities.inRangeToAttack(mob, target) && mob.BehaviourType.canRoam) { | ||||||
|  |             if(mob.nextChaseUpdate < System.currentTimeMillis()) { | ||||||
|  |                 mob.nextChaseUpdate = System.currentTimeMillis() + 2500L; | ||||||
|  |                 MovementUtilities.aiMove(mob, target.loc, false); | ||||||
|  |             } | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         switch (target.getObjectType()) { | ||||||
|  |             case PlayerCharacter: | ||||||
|  |                 PlayerCharacter targetPlayer = (PlayerCharacter) target; | ||||||
|  |                 AttackPlayer(mob, targetPlayer); | ||||||
|  |                 break; | ||||||
|  |             case Building: | ||||||
|  |                 Building targetBuilding = (Building) target; | ||||||
|  |                 AttackBuilding(mob, targetBuilding); | ||||||
|  |                 break; | ||||||
|  |             case Mob: | ||||||
|  |                 Mob targetMob = (Mob) target; | ||||||
|  |                 AttackMob(mob, targetMob); | ||||||
|  |                 break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static void AttackPlayer(Mob mob, PlayerCharacter target) { | ||||||
|  | 
 | ||||||
|  |         try { | ||||||
|  | 
 | ||||||
|  |             if (!mob.canSee(target)) { | ||||||
|  |                 mob.setCombatTarget(null); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (mob.BehaviourType.callsForHelp) | ||||||
|  |                 MobCallForHelp(mob); | ||||||
|  | 
 | ||||||
|  |             if (!MovementUtilities.inRangeDropAggro(mob, target)) { | ||||||
|  |                 mob.setCombatTarget(null); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (CombatUtilities.inRange2D(mob, target, mob.getRange())) { | ||||||
|  | 
 | ||||||
|  |                 //no weapons, default mob attack speed 3 seconds.
 | ||||||
|  | 
 | ||||||
|  |                 if (System.currentTimeMillis() < mob.getLastAttackTime()) | ||||||
|  |                     return; | ||||||
|  | 
 | ||||||
|  |                 // ranged mobs can't attack while running. skip until they finally stop.
 | ||||||
|  | 
 | ||||||
|  |                 if (mob.isMoving() && mob.getRange() > 20) | ||||||
|  |                     return; | ||||||
|  | 
 | ||||||
|  |                 // add timer for last attack.
 | ||||||
|  | 
 | ||||||
|  |                 ItemBase mainHand = mob.getWeaponItemBase(true); | ||||||
|  |                 ItemBase offHand = mob.getWeaponItemBase(false); | ||||||
|  | 
 | ||||||
|  |                 if (mainHand == null && offHand == null) { | ||||||
|  |                     CombatUtilities.combatCycle(mob, target, true, null); | ||||||
|  |                     int delay = 3000; | ||||||
|  |                     if (mob.isSiege()) | ||||||
|  |                         delay = 11000; | ||||||
|  |                     mob.setLastAttackTime(System.currentTimeMillis() + delay); | ||||||
|  |                 } else if (mob.getWeaponItemBase(true) != null) { | ||||||
|  |                     int delay = 3000; | ||||||
|  |                     if (mob.isSiege()) | ||||||
|  |                         delay = 11000; | ||||||
|  |                     CombatUtilities.combatCycle(mob, target, true, mob.getWeaponItemBase(true)); | ||||||
|  |                     mob.setLastAttackTime(System.currentTimeMillis() + delay); | ||||||
|  |                 } else if (mob.getWeaponItemBase(false) != null) { | ||||||
|  |                     int attackDelay = 3000; | ||||||
|  |                     if (mob.isSiege()) | ||||||
|  |                         attackDelay = 11000; | ||||||
|  |                     CombatUtilities.combatCycle(mob, target, false, mob.getWeaponItemBase(false)); | ||||||
|  |                     mob.setLastAttackTime(System.currentTimeMillis() + attackDelay); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (target.getPet() != null) | ||||||
|  |                 if (target.getPet().getCombatTarget() == null && target.getPet().assist) | ||||||
|  |                     target.getPet().setCombatTarget(mob); | ||||||
|  | 
 | ||||||
|  |         } catch (Exception e) { | ||||||
|  |             Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackPlayer" + " " + e.getMessage()); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static void AttackBuilding(Mob mob, Building target) { | ||||||
|  | 
 | ||||||
|  |         try { | ||||||
|  | 
 | ||||||
|  |             if(mob == null || target == null) | ||||||
|  |                 return; | ||||||
|  | 
 | ||||||
|  |             if (target.getRank() == -1 || !target.isVulnerable() || BuildingManager.getBuildingFromCache(target.getObjectUUID()) == null) { | ||||||
|  |                 mob.setCombatTarget(null); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             City playerCity = ZoneManager.getCityAtLocation(mob.getLoc()); | ||||||
|  | 
 | ||||||
|  |             if (playerCity != null) | ||||||
|  |                 for (Mob guard : playerCity.getParent().zoneMobSet) | ||||||
|  |                     if (guard.BehaviourType != null && guard.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal()) | ||||||
|  |                         if (guard.getCombatTarget() == null && guard.getGuild() != null && mob.getGuild() != null && !guard.getGuild().equals(mob.getGuild())) | ||||||
|  |                             guard.setCombatTarget(mob); | ||||||
|  | 
 | ||||||
|  |             if (mob.isSiege()) | ||||||
|  |                 MovementManager.sendRWSSMsg(mob); | ||||||
|  | 
 | ||||||
|  |             ItemBase mainHand = mob.getWeaponItemBase(true); | ||||||
|  |             ItemBase offHand = mob.getWeaponItemBase(false); | ||||||
|  | 
 | ||||||
|  |             if (mainHand == null && offHand == null) { | ||||||
|  |                 CombatUtilities.combatCycle(mob, target, true, null); | ||||||
|  |                 int delay = 3000; | ||||||
|  |                 if (mob.isSiege()) | ||||||
|  |                     delay = 15000; | ||||||
|  |                 mob.setLastAttackTime(System.currentTimeMillis() + delay); | ||||||
|  |             } else if (mob.getWeaponItemBase(true) != null) { | ||||||
|  |                 int attackDelay = 3000; | ||||||
|  |                 if (mob.isSiege()) | ||||||
|  |                     attackDelay = 15000; | ||||||
|  |                 CombatUtilities.combatCycle(mob, target, true, mob.getWeaponItemBase(true)); | ||||||
|  |                 mob.setLastAttackTime(System.currentTimeMillis() + attackDelay); | ||||||
|  |             } else if (mob.getWeaponItemBase(false) != null) { | ||||||
|  |                 int attackDelay = 3000; | ||||||
|  |                 if (mob.isSiege()) | ||||||
|  |                     attackDelay = 15000; | ||||||
|  |                 CombatUtilities.combatCycle(mob, target, false, mob.getWeaponItemBase(false)); | ||||||
|  |                 mob.setLastAttackTime(System.currentTimeMillis() + attackDelay); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |         } catch (Exception e) { | ||||||
|  |             Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackBuilding" + " " + e.getMessage()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static void AttackMob(Mob mob, Mob target) { | ||||||
|  | 
 | ||||||
|  |         try { | ||||||
|  | 
 | ||||||
|  |             if (mob.getRange() >= 30 && mob.isMoving()) | ||||||
|  |                 return; | ||||||
|  | 
 | ||||||
|  |             //no weapons, default mob attack speed 3 seconds.
 | ||||||
|  | 
 | ||||||
|  |             ItemBase mainHand = mob.getWeaponItemBase(true); | ||||||
|  |             ItemBase offHand = mob.getWeaponItemBase(false); | ||||||
|  | 
 | ||||||
|  |             if (mainHand == null && offHand == null) { | ||||||
|  |                 CombatUtilities.combatCycle(mob, target, true, null); | ||||||
|  |                 int delay = 3000; | ||||||
|  |                 if (mob.isSiege()) | ||||||
|  |                     delay = 11000; | ||||||
|  |                 mob.setLastAttackTime(System.currentTimeMillis() + delay); | ||||||
|  |             } else if (mob.getWeaponItemBase(true) != null) { | ||||||
|  |                 int attackDelay = 3000; | ||||||
|  |                 if (mob.isSiege()) | ||||||
|  |                     attackDelay = 11000; | ||||||
|  |                 CombatUtilities.combatCycle(mob, target, true, mob.getWeaponItemBase(true)); | ||||||
|  |                 mob.setLastAttackTime(System.currentTimeMillis() + attackDelay); | ||||||
|  |             } else if (mob.getWeaponItemBase(false) != null) { | ||||||
|  |                 int attackDelay = 3000; | ||||||
|  |                 if (mob.isSiege()) | ||||||
|  |                     attackDelay = 11000; | ||||||
|  |                 CombatUtilities.combatCycle(mob, target, false, mob.getWeaponItemBase(false)); | ||||||
|  |                 mob.setLastAttackTime(System.currentTimeMillis() + attackDelay); | ||||||
|  |                 if (target.getCombatTarget() == null) { | ||||||
|  |                     target.setCombatTarget(mob); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } catch (Exception e) { | ||||||
|  |             Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackMob" + " " + e.getMessage()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static void MobCallForHelp(Mob mob) { | ||||||
|  | 
 | ||||||
|  |             if (mob.nextCallForHelp == 0) | ||||||
|  |                 mob.nextCallForHelp = System.currentTimeMillis(); | ||||||
|  | 
 | ||||||
|  |             if (mob.nextCallForHelp > System.currentTimeMillis()) | ||||||
|  |                 return; | ||||||
|  | 
 | ||||||
|  |             Zone mobCamp = mob.getParentZone(); | ||||||
|  | 
 | ||||||
|  |             for (Mob helper : mobCamp.zoneMobSet) { | ||||||
|  |                 if (HelpResponder(helper)) { | ||||||
|  |                     helper.setCombatTarget(mob.getCombatTarget()); | ||||||
|  |                     break; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             mob.nextCallForHelp = System.currentTimeMillis() + 30000L; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,82 @@ | |||||||
|  | package engine.objects; | ||||||
|  | 
 | ||||||
|  | import engine.InterestManagement.WorldGrid; | ||||||
|  | import engine.gameManager.ArenaManager; | ||||||
|  | import engine.gameManager.ChatManager; | ||||||
|  | import engine.gameManager.MovementManager; | ||||||
|  | import engine.math.Vector3fImmutable; | ||||||
|  | import engine.server.MBServerStatics; | ||||||
|  | 
 | ||||||
|  | import java.util.HashSet; | ||||||
|  | 
 | ||||||
|  | public class Arena { | ||||||
|  |     public PlayerCharacter player1; | ||||||
|  |     public PlayerCharacter player2; | ||||||
|  |     public Long startTime; | ||||||
|  |     public Vector3fImmutable loc; | ||||||
|  | 
 | ||||||
|  |     public Arena(){ | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     public Boolean disqualify() { | ||||||
|  |         HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(this.loc, 250f, MBServerStatics.MASK_PLAYER); | ||||||
|  |         HashSet<AbstractWorldObject> warningRange = WorldGrid.getObjectsInRangePartial(this.loc, 500f, MBServerStatics.MASK_PLAYER); | ||||||
|  |         for(AbstractWorldObject obj : warningRange){ | ||||||
|  |             PlayerCharacter pc = (PlayerCharacter)obj; | ||||||
|  |             if(pc.equals(this.player1) || pc.equals(this.player2)) | ||||||
|  |                 continue; | ||||||
|  | 
 | ||||||
|  |             ChatManager.chatSystemInfo(pc, "WARNING!! You are entering an arena zone!"); | ||||||
|  |         } | ||||||
|  |         //boot out all non competitors
 | ||||||
|  |         for(AbstractWorldObject obj : inRange){ | ||||||
|  |             if(obj.equals(this.player1)) | ||||||
|  |                 continue; | ||||||
|  | 
 | ||||||
|  |             if(obj.equals(this.player2)) | ||||||
|  |                 continue; | ||||||
|  | 
 | ||||||
|  |             PlayerCharacter intruder = (PlayerCharacter)obj; | ||||||
|  |             MovementManager.translocate(intruder,new Vector3fImmutable(88853,32,45079),Regions.GetRegionForTeleport(new Vector3fImmutable(88853,32,45079))); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (!inRange.contains(this.player1) && inRange.contains(this.player2)) { | ||||||
|  |             ArenaManager.endArena(this,this.player2,this.player1,"Player Has Left Arena"); | ||||||
|  |             return true; | ||||||
|  |         } else if (!inRange.contains(this.player2) && inRange.contains(this.player1)) { | ||||||
|  |             ArenaManager.endArena(this,this.player1,this.player2,"Player Has Left Arena"); | ||||||
|  |             return true; | ||||||
|  |         }else if (!inRange.contains(this.player2) && !inRange.contains(this.player1)) { | ||||||
|  |             ArenaManager.endArena(this,null,null,"Both Parties Have Left The Arena"); | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public Boolean checkToComplete(){ | ||||||
|  | 
 | ||||||
|  |         if(this.startTime == null) | ||||||
|  |             this.startTime = System.currentTimeMillis(); | ||||||
|  | 
 | ||||||
|  |         if(System.currentTimeMillis() - this.startTime < 10000L) | ||||||
|  |             return false; | ||||||
|  | 
 | ||||||
|  |         if(this.disqualify()) | ||||||
|  |             return true; | ||||||
|  | 
 | ||||||
|  |         if(!this.player1.isAlive() && this.player2.isAlive()){ | ||||||
|  |             ArenaManager.endArena(this,this.player2,this.player1,"Player Has Died"); | ||||||
|  |             return true; | ||||||
|  |         } else if(this.player1.isAlive() && !this.player2.isAlive()){ | ||||||
|  |             ArenaManager.endArena(this,this.player1,this.player2,"Player Has Died"); | ||||||
|  |             return true; | ||||||
|  |         } else if(!this.player1.isAlive() && !this.player2.isAlive()){ | ||||||
|  |             ArenaManager.endArena(this,null,null,"Both Players Have Died"); | ||||||
|  |             return true; | ||||||
|  |         } else if(this.startTime + 300000L < System.currentTimeMillis()){ | ||||||
|  |             ArenaManager.endArena(this,null,null,"Time Has Elapsed"); | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,70 @@ | |||||||
|  | // • ▌ ▄ ·.  ▄▄▄·  ▄▄ • ▪   ▄▄· ▄▄▄▄·  ▄▄▄·  ▐▄▄▄  ▄▄▄ .
 | ||||||
|  | // ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
 | ||||||
|  | // ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
 | ||||||
|  | // ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
 | ||||||
|  | // ▀▀  █▪▀▀▀ ▀  ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀  ▀  ▀ ▀▀  █▪ ▀▀▀
 | ||||||
|  | //      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.BuildingManager; | ||||||
|  | import engine.gameManager.ChatManager; | ||||||
|  | import engine.gameManager.StrongholdManager; | ||||||
|  | import engine.mobileAI.Threads.MobAIThread; | ||||||
|  | import engine.net.DispatchMessage; | ||||||
|  | import engine.net.client.msg.chat.ChatSystemMsg; | ||||||
|  | import engine.objects.*; | ||||||
|  | import org.pmw.tinylog.Logger; | ||||||
|  | 
 | ||||||
|  | import java.time.LocalDateTime; | ||||||
|  | import java.util.ArrayList; | ||||||
|  | 
 | ||||||
|  | public class BaneThread implements Runnable { | ||||||
|  | 
 | ||||||
|  |     public Long lastRun; | ||||||
|  |     public static int instancedelay = 10000; | ||||||
|  |     public BaneThread() { | ||||||
|  |         Logger.info(" BaneThread thread has started!"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     public void processBanesWindow() { | ||||||
|  | 
 | ||||||
|  |         try { | ||||||
|  |             for(int baneId : Bane.banes.keySet()){ | ||||||
|  |                 Bane bane = Bane.banes.get(baneId); | ||||||
|  |                 if(bane.getSiegePhase().equals(Enum.SiegePhase.WAR)){ | ||||||
|  |                     bane.applyZergBuffs(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } catch (Exception e) { | ||||||
|  |             Logger.error("BANE ERROR"); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void run() { | ||||||
|  |         lastRun = System.currentTimeMillis(); | ||||||
|  |         while (true) { | ||||||
|  |             if (System.currentTimeMillis() >= lastRun + instancedelay) { // Correct condition
 | ||||||
|  |                 this.processBanesWindow(); | ||||||
|  |                 lastRun = System.currentTimeMillis(); // Update lastRun after processing
 | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     public static void startBaneThread() { | ||||||
|  |         Thread baneThread; | ||||||
|  |         baneThread = new Thread(new BaneThread()); | ||||||
|  |         baneThread.setName("baneThread"); | ||||||
|  |         baneThread.start(); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,174 @@ | |||||||
|  | // • ▌ ▄ ·.  ▄▄▄·  ▄▄ • ▪   ▄▄· ▄▄▄▄·  ▄▄▄·  ▐▄▄▄  ▄▄▄ .
 | ||||||
|  | // ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
 | ||||||
|  | // ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
 | ||||||
|  | // ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
 | ||||||
|  | // ▀▀  █▪▀▀▀ ▀  ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀  ▀  ▀ ▀▀  █▪ ▀▀▀
 | ||||||
|  | //      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.*; | ||||||
|  | import engine.net.DispatchMessage; | ||||||
|  | import engine.net.MessageDispatcher; | ||||||
|  | import engine.net.client.msg.chat.ChatSystemMsg; | ||||||
|  | import engine.objects.*; | ||||||
|  | import engine.server.world.WorldServer; | ||||||
|  | import org.pmw.tinylog.Logger; | ||||||
|  | 
 | ||||||
|  | import java.time.LocalDateTime; | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.concurrent.ConcurrentHashMap; | ||||||
|  | import java.util.concurrent.ThreadLocalRandom; | ||||||
|  | 
 | ||||||
|  | import static engine.gameManager.StrongholdManager.EndStronghold; | ||||||
|  | import static engine.server.MBServerStatics.MINE_LATE_WINDOW; | ||||||
|  | 
 | ||||||
|  | public class HalfHourlyJobThread implements Runnable { | ||||||
|  | 
 | ||||||
|  |     public HalfHourlyJobThread() { | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     public static void processMineWindow() { | ||||||
|  | 
 | ||||||
|  |         try { | ||||||
|  | 
 | ||||||
|  |             ArrayList<Mine> mines = Mine.getMines(); | ||||||
|  |             for(Mine mine : mines){ | ||||||
|  |                 if (mine.isStronghold) | ||||||
|  |                     StrongholdManager.EndStronghold(mine); | ||||||
|  |             } | ||||||
|  |             for (Mine mine : mines) { | ||||||
|  |                 try { | ||||||
|  |                     //handle mines opening on server reboot weird time interval
 | ||||||
|  |                     if (LocalDateTime.now().isAfter(LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute))) { | ||||||
|  |                         if (LocalDateTime.now().isBefore(LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute).plusMinutes(30))) { | ||||||
|  |                             HalfHourlyJobThread.mineWindowOpen(mine); | ||||||
|  |                             continue; | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |                     // set to the current mine window.
 | ||||||
|  | 
 | ||||||
|  |                     if (mine.openHour == LocalDateTime.now().getHour() && mine.openMinute == LocalDateTime.now().getMinute() && !mine.wasClaimed) { | ||||||
|  |                         HalfHourlyJobThread.mineWindowOpen(mine); | ||||||
|  |                         continue; | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |                     // Close the mine if it reaches this far
 | ||||||
|  |                     LocalDateTime openTime = LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute); | ||||||
|  |                     if (LocalDateTime.now().plusMinutes(1).isAfter(openTime.plusMinutes(30))) | ||||||
|  |                         mineWindowClose(mine); | ||||||
|  | 
 | ||||||
|  |                 } catch (Exception e) { | ||||||
|  |                     Logger.error("mineID: " + mine.getObjectUUID(), e.toString()); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             //StrongholdManager.processStrongholds();
 | ||||||
|  |         } catch (Exception e) { | ||||||
|  |             Logger.error(e.toString()); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static void mineWindowOpen(Mine mine) { | ||||||
|  | 
 | ||||||
|  |         mine.setActive(true); | ||||||
|  |         ChatManager.chatSystemChannel(mine.getZoneName() + "'s Mine is now Active!"); | ||||||
|  |         Logger.info(mine.getZoneName() + "'s Mine is now Active!"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static boolean mineWindowClose(Mine mine) { | ||||||
|  | 
 | ||||||
|  |         // No need to end the window of a mine which never opened.
 | ||||||
|  | 
 | ||||||
|  |         if (mine.isActive == false) | ||||||
|  |             return false; | ||||||
|  | 
 | ||||||
|  |         Building mineBuilding = BuildingManager.getBuildingFromCache(mine.getBuildingID()); | ||||||
|  | 
 | ||||||
|  |         if (mineBuilding == null) { | ||||||
|  |             Logger.debug("Null mine building for Mine " + mine.getObjectUUID() + " Building " + mine.getBuildingID()); | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Mine building still stands; nothing to do.
 | ||||||
|  |         // We can early exit here.
 | ||||||
|  | 
 | ||||||
|  |         if (mineBuilding.getRank() > 0) { | ||||||
|  |             mine.setActive(false); | ||||||
|  |             mine.lastClaimer = null; | ||||||
|  |             ChatSystemMsg chatMsg = new ChatSystemMsg(null, mine.guildName + " has defended the mine in " + mine.getParentZone().getParent().getName() + ". The mine is no longer active."); | ||||||
|  |             chatMsg.setMessageType(10); | ||||||
|  |             chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID()); | ||||||
|  |             DispatchMessage.dispatchMsgToAll(chatMsg); | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // This mine does not have a valid claimer
 | ||||||
|  |         // we will therefore set it to errant
 | ||||||
|  |         // and keep the window open.
 | ||||||
|  | 
 | ||||||
|  |         if (!Mine.validateClaimer(mine.lastClaimer)) { | ||||||
|  |             mine.lastClaimer = null; | ||||||
|  |             mine.updateGuildOwner(null); | ||||||
|  |             mine.setActive(true); | ||||||
|  |             ChatSystemMsg chatMsg = new ChatSystemMsg(null, mine.getParentZone().getParent().getName() + " Was not claimed, the battle rages on!"); | ||||||
|  |             chatMsg.setMessageType(10); | ||||||
|  |             chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID()); | ||||||
|  |             DispatchMessage.dispatchMsgToAll(chatMsg); | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         //Update ownership to map
 | ||||||
|  | 
 | ||||||
|  |         mine.guildName = mine.getOwningGuild().getName(); | ||||||
|  |         mine.guildTag = mine.getOwningGuild().getGuildTag(); | ||||||
|  |         Guild nation = mine.getOwningGuild().getNation(); | ||||||
|  |         mine.nationName = nation.getName(); | ||||||
|  |         mine.nationTag = nation.getGuildTag(); | ||||||
|  | 
 | ||||||
|  |         mineBuilding.rebuildMine(); | ||||||
|  |         WorldGrid.updateObject(mineBuilding); | ||||||
|  | 
 | ||||||
|  |         ChatSystemMsg chatMsg = new ChatSystemMsg(null, mine.lastClaimer.getName() + " has claimed the mine in " + mine.getParentZone().getParent().getName() + " for " + mine.getOwningGuild().getName() + ". The mine is no longer active."); | ||||||
|  |         chatMsg.setMessageType(10); | ||||||
|  |         chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID()); | ||||||
|  |         DispatchMessage.dispatchMsgToAll(chatMsg); | ||||||
|  | 
 | ||||||
|  |         // Warehouse this claim event
 | ||||||
|  | 
 | ||||||
|  |         MineRecord mineRecord = MineRecord.borrow(mine, mine.lastClaimer, Enum.RecordEventType.CAPTURE); | ||||||
|  |         DataWarehouse.pushToWarehouse(mineRecord); | ||||||
|  | 
 | ||||||
|  |         mineBuilding.setRank(mineBuilding.getRank()); | ||||||
|  |         mine.lastClaimer = null; | ||||||
|  |         mine.setActive(false); | ||||||
|  |         mine.wasClaimed = true; | ||||||
|  |         for(Integer id : mine._playerMemory){ | ||||||
|  |             PlayerCharacter pc = PlayerCharacter.getFromCache(id); | ||||||
|  |             if(pc != null) | ||||||
|  |                 pc.ZergMultiplier = 1.0f; | ||||||
|  |         } | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void run() { | ||||||
|  | 
 | ||||||
|  |         Logger.info("Half-Hourly job is now running."); | ||||||
|  | 
 | ||||||
|  |         // Open or Close mines for the current mine window.
 | ||||||
|  | 
 | ||||||
|  |         processMineWindow(); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,58 @@ | |||||||
|  | // • ▌ ▄ ·.  ▄▄▄·  ▄▄ • ▪   ▄▄· ▄▄▄▄·  ▄▄▄·  ▐▄▄▄  ▄▄▄ .
 | ||||||
|  | // ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
 | ||||||
|  | // ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
 | ||||||
|  | // ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
 | ||||||
|  | // ▀▀  █▪▀▀▀ ▀  ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀  ▀  ▀ ▀▀  █▪ ▀▀▀
 | ||||||
|  | //      Magicbane Emulator Project © 2013 - 2022
 | ||||||
|  | //                www.magicbane.com
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | package engine.workthreads; | ||||||
|  | 
 | ||||||
|  | import engine.Enum; | ||||||
|  | import engine.gameManager.SessionManager; | ||||||
|  | import engine.gameManager.SimulationManager; | ||||||
|  | import engine.objects.Bane; | ||||||
|  | import engine.objects.PlayerCharacter; | ||||||
|  | import org.pmw.tinylog.Logger; | ||||||
|  | 
 | ||||||
|  | public class UpdateThread implements Runnable { | ||||||
|  | 
 | ||||||
|  |     public Long lastRun; | ||||||
|  |     public static int instancedelay = 1000; | ||||||
|  |     public UpdateThread() { | ||||||
|  |         Logger.info(" UpdateThread thread has started!"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     public void processPlayerUpdate() { | ||||||
|  | 
 | ||||||
|  |         try { | ||||||
|  |             for(PlayerCharacter player : SessionManager.getAllActivePlayerCharacters()){ | ||||||
|  |                 player.update(true); | ||||||
|  |             } | ||||||
|  |         } catch (Exception e) { | ||||||
|  |             Logger.error("UPDATE ERROR"); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void run() { | ||||||
|  |         lastRun = System.currentTimeMillis(); | ||||||
|  |         while (true) { | ||||||
|  |             if (System.currentTimeMillis() >= lastRun + instancedelay) { // Correct condition
 | ||||||
|  |                 this.processPlayerUpdate(); | ||||||
|  |                 lastRun = System.currentTimeMillis(); // Update lastRun after processing
 | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     public static void startUpdateThread() { | ||||||
|  |         Thread updateThread; | ||||||
|  |         updateThread = new Thread(new UpdateThread()); | ||||||
|  |         updateThread.setName("updateThread"); | ||||||
|  |         updateThread.start(); | ||||||
|  |     } | ||||||
|  | } | ||||||
					Loading…
					
					
				
		Reference in new issue