Compare commits
No commits in common. 'lakebane-mobai2' and 'master' have entirely different histories.
lakebane-m
...
master
100 changed files with 1647 additions and 5690 deletions
@ -1,63 +0,0 @@
@@ -1,63 +0,0 @@
|
||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||
// 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"; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,77 @@
@@ -0,0 +1,77 @@
|
||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||
// 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]"; |
||||
} |
||||
|
||||
|
||||
} |
@ -1,168 +0,0 @@
@@ -1,168 +0,0 @@
|
||||
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; |
||||
} |
||||
} |
@ -1,347 +0,0 @@
@@ -1,347 +0,0 @@
|
||||
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; |
||||
|
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,195 +0,0 @@
@@ -1,195 +0,0 @@
|
||||
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; |
||||
} |
||||
} |
||||
} |
@ -1,360 +0,0 @@
@@ -1,360 +0,0 @@
|
||||
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; |
||||
} |
||||
} |
@ -1,82 +0,0 @@
@@ -1,82 +0,0 @@
|
||||
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; |
||||
} |
||||
} |
@ -1,70 +0,0 @@
@@ -1,70 +0,0 @@
|
||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||
// 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(); |
||||
} |
||||
} |
@ -1,174 +0,0 @@
@@ -1,174 +0,0 @@
|
||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||
// 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(); |
||||
|
||||
} |
||||
} |
@ -1,58 +0,0 @@
@@ -1,58 +0,0 @@
|
||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||
// 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