Compare commits
No commits in common. 'lakebane' and 'master' have entirely different histories.
180 changed files with 2843 additions and 10276 deletions
@ -1,150 +0,0 @@ |
|||||||
package engine.Dungeons; |
|
||||||
|
|
||||||
import engine.Enum; |
|
||||||
import engine.InterestManagement.WorldGrid; |
|
||||||
import engine.gameManager.BuildingManager; |
|
||||||
import engine.gameManager.PowersManager; |
|
||||||
import engine.gameManager.ZoneManager; |
|
||||||
import engine.math.Vector3fImmutable; |
|
||||||
import engine.net.ByteBufferWriter; |
|
||||||
import engine.objects.*; |
|
||||||
import engine.powers.EffectsBase; |
|
||||||
import engine.server.MBServerStatics; |
|
||||||
import org.pmw.tinylog.Logger; |
|
||||||
|
|
||||||
import java.time.LocalDateTime; |
|
||||||
import java.util.ArrayList; |
|
||||||
import java.util.HashSet; |
|
||||||
|
|
||||||
public class Dungeon { |
|
||||||
|
|
||||||
public static int NoFlyEffectID = -1733819072; |
|
||||||
public static int NoTeleportEffectID = -1971545187; |
|
||||||
public static int NoSummonEffectID = 2122002462; |
|
||||||
public ArrayList<PlayerCharacter> participants; |
|
||||||
public int maxPerGuild; |
|
||||||
public Vector3fImmutable entrance; |
|
||||||
public ArrayList<Mob> dungeon_mobs; |
|
||||||
public Long respawnTime = 0L; |
|
||||||
|
|
||||||
public Dungeon(Vector3fImmutable entrance, int maxCount){ |
|
||||||
this.participants = new ArrayList<>(); |
|
||||||
this.entrance = entrance; |
|
||||||
this.dungeon_mobs = new ArrayList<>(); |
|
||||||
this.maxPerGuild = maxCount; |
|
||||||
} |
|
||||||
public void applyDungeonEffects(PlayerCharacter player){ |
|
||||||
EffectsBase noFly = PowersManager.getEffectByToken(NoFlyEffectID); |
|
||||||
EffectsBase noTele = PowersManager.getEffectByToken(NoTeleportEffectID); |
|
||||||
EffectsBase noSum = PowersManager.getEffectByToken(NoSummonEffectID); |
|
||||||
|
|
||||||
if(noFly != null) |
|
||||||
player.addEffectNoTimer(noFly.getName(),noFly,40,true); |
|
||||||
|
|
||||||
if(noTele != null) |
|
||||||
player.addEffectNoTimer(noTele.getName(),noTele,40,true); |
|
||||||
|
|
||||||
if(noSum != null) |
|
||||||
player.addEffectNoTimer(noSum.getName(),noSum,40,true); |
|
||||||
} |
|
||||||
|
|
||||||
public void removeDungeonEffects(PlayerCharacter player) { |
|
||||||
EffectsBase noFly = PowersManager.getEffectByToken(NoFlyEffectID); |
|
||||||
EffectsBase noTele = PowersManager.getEffectByToken(NoTeleportEffectID); |
|
||||||
EffectsBase noSum = PowersManager.getEffectByToken(NoSummonEffectID); |
|
||||||
for (Effect eff : player.effects.values()) { |
|
||||||
if (noFly != null && eff.getEffectsBase().equals(noFly)) |
|
||||||
eff.endEffect(); |
|
||||||
|
|
||||||
if (noTele != null && eff.getEffectsBase().equals(noTele)) |
|
||||||
eff.endEffect(); |
|
||||||
|
|
||||||
if (noSum != null && eff.getEffectsBase().equals(noSum)) |
|
||||||
eff.endEffect(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public static void serializeForClientMsgTeleport(ByteBufferWriter writer) { |
|
||||||
Guild rulingGuild = Guild.getErrantGuild(); |
|
||||||
Guild rulingNation = Guild.getErrantGuild(); |
|
||||||
|
|
||||||
Zone zone = ZoneManager.getZoneByUUID(994); |
|
||||||
// Begin Serialzing soverign guild data
|
|
||||||
writer.putInt(Enum.GameObjectType.Zone.ordinal()); |
|
||||||
writer.putInt(994); |
|
||||||
writer.putString("Whitehorn Citadel"); |
|
||||||
writer.putInt(rulingGuild.getObjectType().ordinal()); |
|
||||||
writer.putInt(rulingGuild.getObjectUUID()); |
|
||||||
|
|
||||||
writer.putString("Whitehorn Militants"); // guild name
|
|
||||||
writer.putString("In the Citadel, We Fight!"); // motto
|
|
||||||
writer.putString(rulingGuild.getLeadershipType()); |
|
||||||
|
|
||||||
// Serialize guild ruler's name
|
|
||||||
// If tree is abandoned blank out the name
|
|
||||||
// to allow them a rename.
|
|
||||||
|
|
||||||
writer.putString("Kol'roth The Destroyer");//sovreign
|
|
||||||
|
|
||||||
writer.putInt(rulingGuild.getCharter()); |
|
||||||
writer.putInt(0); // always 00000000
|
|
||||||
|
|
||||||
writer.put((byte)0); |
|
||||||
|
|
||||||
writer.put((byte) 1); |
|
||||||
writer.put((byte) 1); // *** Refactor: What are these flags?
|
|
||||||
writer.put((byte) 1); |
|
||||||
writer.put((byte) 1); |
|
||||||
writer.put((byte) 1); |
|
||||||
|
|
||||||
GuildTag._serializeForDisplay(rulingGuild.getGuildTag(), writer); |
|
||||||
GuildTag._serializeForDisplay(rulingNation.getGuildTag(), writer); |
|
||||||
|
|
||||||
writer.putInt(0);// TODO Implement description text
|
|
||||||
|
|
||||||
writer.put((byte) 1); |
|
||||||
writer.put((byte) 0); |
|
||||||
writer.put((byte) 1); |
|
||||||
|
|
||||||
// Begin serializing nation guild info
|
|
||||||
|
|
||||||
if (rulingNation.isEmptyGuild()) { |
|
||||||
writer.putInt(rulingGuild.getObjectType().ordinal()); |
|
||||||
writer.putInt(rulingGuild.getObjectUUID()); |
|
||||||
} else { |
|
||||||
writer.putInt(rulingNation.getObjectType().ordinal()); |
|
||||||
writer.putInt(rulingNation.getObjectUUID()); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
// Serialize nation name
|
|
||||||
|
|
||||||
writer.putString("Whitehorn Militants"); //nation name
|
|
||||||
|
|
||||||
writer.putInt(-1);//city rank, -1 puts it at top of list always
|
|
||||||
|
|
||||||
writer.putInt(0xFFFFFFFF); |
|
||||||
|
|
||||||
writer.putInt(0); |
|
||||||
|
|
||||||
writer.putString("Kol'roth The Destroyer");//nation ruler
|
|
||||||
|
|
||||||
writer.putLocalDateTime(LocalDateTime.now()); |
|
||||||
|
|
||||||
//location
|
|
||||||
Vector3fImmutable loc = Vector3fImmutable.getRandomPointOnCircle(BuildingManager.getBuilding(2827951).loc,30f); |
|
||||||
|
|
||||||
writer.putFloat(loc.x); |
|
||||||
writer.putFloat(loc.y); |
|
||||||
writer.putFloat(loc.z); |
|
||||||
|
|
||||||
writer.putInt(0); |
|
||||||
|
|
||||||
writer.put((byte) 1); |
|
||||||
writer.put((byte) 0); |
|
||||||
writer.putInt(0x64); |
|
||||||
writer.put((byte) 0); |
|
||||||
writer.put((byte) 0); |
|
||||||
writer.put((byte) 0); |
|
||||||
} |
|
||||||
} |
|
@ -1,105 +0,0 @@ |
|||||||
package engine.Dungeons; |
|
||||||
|
|
||||||
import engine.Enum; |
|
||||||
import engine.InterestManagement.WorldGrid; |
|
||||||
import engine.gameManager.DbManager; |
|
||||||
import engine.gameManager.ZoneManager; |
|
||||||
import engine.math.Vector3fImmutable; |
|
||||||
import engine.objects.*; |
|
||||||
import engine.powers.EffectsBase; |
|
||||||
import engine.server.MBServerStatics; |
|
||||||
|
|
||||||
import java.util.ArrayList; |
|
||||||
import java.util.HashSet; |
|
||||||
|
|
||||||
public class DungeonManager { |
|
||||||
public static ArrayList<Dungeon> dungeons; |
|
||||||
|
|
||||||
private static final float dungeonAiRange = 64f; |
|
||||||
private static final float maxTravel = 64f; |
|
||||||
|
|
||||||
public static void joinDungeon(PlayerCharacter pc, Dungeon dungeon){ |
|
||||||
if(requestEnter(pc,dungeon)) { |
|
||||||
dungeon.participants.add(pc); |
|
||||||
dungeon.applyDungeonEffects(pc); |
|
||||||
translocateToDungeon(pc, dungeon); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public static void leaveDungeon(PlayerCharacter pc, Dungeon dungeon){ |
|
||||||
dungeon.participants.remove(pc); |
|
||||||
dungeon.removeDungeonEffects(pc); |
|
||||||
translocateOutOfDungeon(pc); |
|
||||||
} |
|
||||||
|
|
||||||
public static boolean requestEnter(PlayerCharacter pc, Dungeon dungeon){ |
|
||||||
int current = 0; |
|
||||||
Guild nation = pc.guild.getNation(); |
|
||||||
|
|
||||||
if(nation == null) |
|
||||||
return false; |
|
||||||
|
|
||||||
for(PlayerCharacter participant : dungeon.participants){ |
|
||||||
if(participant.guild.getNation().equals(nation)){ |
|
||||||
current ++; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
if(current >= dungeon.maxPerGuild) |
|
||||||
return false; |
|
||||||
|
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
public static void translocateToDungeon(PlayerCharacter pc, Dungeon dungeon){ |
|
||||||
pc.teleport(dungeon.entrance); |
|
||||||
pc.setSafeMode(); |
|
||||||
} |
|
||||||
|
|
||||||
public static void translocateOutOfDungeon(PlayerCharacter pc){ |
|
||||||
pc.teleport(pc.bindLoc); |
|
||||||
pc.setSafeMode(); |
|
||||||
} |
|
||||||
|
|
||||||
public static void pulse_dungeons(){ |
|
||||||
for(Dungeon dungeon : dungeons){ |
|
||||||
|
|
||||||
//early exit, if no players present don't waste resources
|
|
||||||
if(dungeon.participants.isEmpty()) |
|
||||||
continue; |
|
||||||
|
|
||||||
if(dungeon.respawnTime > 0 && System.currentTimeMillis() > dungeon.respawnTime){ |
|
||||||
respawnMobs(dungeon); |
|
||||||
} |
|
||||||
|
|
||||||
//remove any players that have left
|
|
||||||
HashSet<AbstractWorldObject> obj = WorldGrid.getObjectsInRangePartial(dungeon.entrance,4096f,MBServerStatics.MASK_PLAYER); |
|
||||||
for(PlayerCharacter player : dungeon.participants) |
|
||||||
if(!obj.contains(player)) |
|
||||||
leaveDungeon(player,dungeon); |
|
||||||
|
|
||||||
//cycle dungeon mob AI
|
|
||||||
for(Mob mob : dungeon.dungeon_mobs) |
|
||||||
dungeonMobAI(mob); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public static void dungeonMobAI(Mob mob){ |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
public static void respawnMobs(Dungeon dungeon){ |
|
||||||
for(Mob mob : dungeon.dungeon_mobs){ |
|
||||||
|
|
||||||
if(!mob.isAlive() && mob.despawned) |
|
||||||
mob.respawn(); |
|
||||||
|
|
||||||
if(!mob.isAlive() && !mob.despawned){ |
|
||||||
mob.despawn(); |
|
||||||
mob.respawn(); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,116 +0,0 @@ |
|||||||
package engine.ZergMehcanics; |
|
||||||
|
|
||||||
import engine.InterestManagement.WorldGrid; |
|
||||||
import engine.gameManager.BuildingManager; |
|
||||||
import engine.gameManager.ZergManager; |
|
||||||
import engine.objects.*; |
|
||||||
import engine.server.MBServerStatics; |
|
||||||
|
|
||||||
import java.util.ArrayList; |
|
||||||
import java.util.HashMap; |
|
||||||
import java.util.HashSet; |
|
||||||
|
|
||||||
public class MineAntiZerg { |
|
||||||
|
|
||||||
public static HashMap<Mine,HashMap<PlayerCharacter,Long>> leaveTimers = new HashMap<>(); |
|
||||||
public static HashMap<Mine,ArrayList<PlayerCharacter>> currentPlayers = new HashMap<>(); |
|
||||||
|
|
||||||
public static void runMines(){ |
|
||||||
for(Mine mine : Mine.getMines()){ |
|
||||||
|
|
||||||
Building tower = BuildingManager.getBuildingFromCache(mine.getBuildingID()); |
|
||||||
|
|
||||||
if(tower == null) |
|
||||||
continue; |
|
||||||
|
|
||||||
if(!mine.isActive) |
|
||||||
continue; |
|
||||||
|
|
||||||
logPlayersPresent(tower,mine); |
|
||||||
|
|
||||||
auditPlayersPresent(tower,mine); |
|
||||||
|
|
||||||
auditPlayers(mine); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public static void logPlayersPresent(Building tower, Mine mine){ |
|
||||||
HashSet<AbstractWorldObject> loadedPlayers = WorldGrid.getObjectsInRangePartial(tower.loc, MBServerStatics.CHARACTER_LOAD_RANGE * 3,MBServerStatics.MASK_PLAYER); |
|
||||||
|
|
||||||
ArrayList<PlayerCharacter> playersPresent = new ArrayList<>(); |
|
||||||
for(AbstractWorldObject player : loadedPlayers){ |
|
||||||
playersPresent.add((PlayerCharacter)player); |
|
||||||
} |
|
||||||
|
|
||||||
currentPlayers.put(mine,playersPresent); |
|
||||||
} |
|
||||||
|
|
||||||
public static void auditPlayersPresent(Building tower, Mine mine){ |
|
||||||
HashSet<AbstractWorldObject> loadedPlayers = WorldGrid.getObjectsInRangePartial(tower.loc, MBServerStatics.CHARACTER_LOAD_RANGE * 3,MBServerStatics.MASK_PLAYER); |
|
||||||
|
|
||||||
ArrayList<PlayerCharacter> toRemove = new ArrayList<>(); |
|
||||||
|
|
||||||
for(PlayerCharacter player : currentPlayers.get(mine)){ |
|
||||||
if(!loadedPlayers.contains(player)){ |
|
||||||
toRemove.add(player); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
currentPlayers.get(mine).removeAll(toRemove); |
|
||||||
|
|
||||||
for(PlayerCharacter player : toRemove){ |
|
||||||
if(leaveTimers.containsKey(mine)){ |
|
||||||
leaveTimers.get(mine).put(player,System.currentTimeMillis()); |
|
||||||
}else{ |
|
||||||
HashMap<PlayerCharacter,Long> leaveTime = new HashMap<>(); |
|
||||||
leaveTime.put(player,System.currentTimeMillis()); |
|
||||||
leaveTimers.put(mine,leaveTime); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
toRemove.clear(); |
|
||||||
|
|
||||||
for(PlayerCharacter player : leaveTimers.get(mine).keySet()){ |
|
||||||
long timeGone = System.currentTimeMillis() - leaveTimers.get(mine).get(player); |
|
||||||
if(timeGone > 180000L) {//3 minutes
|
|
||||||
toRemove.add(player); |
|
||||||
player.ZergMultiplier = 1.0f; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
for(PlayerCharacter player : toRemove) { |
|
||||||
leaveTimers.get(mine).remove(player); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public static void auditPlayers(Mine mine){ |
|
||||||
|
|
||||||
HashMap<Guild,ArrayList<PlayerCharacter>> playersByNation = new HashMap<>(); |
|
||||||
|
|
||||||
for(PlayerCharacter player : currentPlayers.get(mine)){ |
|
||||||
if(playersByNation.containsKey(player.guild.getNation())){ |
|
||||||
playersByNation.get(player.guild.getNation()).add(player); |
|
||||||
}else{ |
|
||||||
ArrayList<PlayerCharacter> players = new ArrayList<>(); |
|
||||||
players.add(player); |
|
||||||
playersByNation.put(player.guild.getNation(),players); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
for(PlayerCharacter player : leaveTimers.get(mine).keySet()){ |
|
||||||
if(playersByNation.containsKey(player.guild.getNation())){ |
|
||||||
playersByNation.get(player.guild.getNation()).add(player); |
|
||||||
}else{ |
|
||||||
ArrayList<PlayerCharacter> players = new ArrayList<>(); |
|
||||||
players.add(player); |
|
||||||
playersByNation.put(player.guild.getNation(),players); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
for(Guild nation : playersByNation.keySet()){ |
|
||||||
for(PlayerCharacter player : playersByNation.get(nation)){ |
|
||||||
player.ZergMultiplier = ZergManager.getCurrentMultiplier(playersByNation.get(nation).size(), mine.capSize); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,54 +0,0 @@ |
|||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.devcmd.cmds; |
|
||||||
|
|
||||||
import engine.Dungeons.DungeonManager; |
|
||||||
import engine.Enum.GameObjectType; |
|
||||||
import engine.devcmd.AbstractDevCmd; |
|
||||||
import engine.gameManager.BuildingManager; |
|
||||||
import engine.gameManager.ChatManager; |
|
||||||
import engine.gameManager.DbManager; |
|
||||||
import engine.gameManager.ZoneManager; |
|
||||||
import engine.math.Vector3fImmutable; |
|
||||||
import engine.objects.*; |
|
||||||
import org.pmw.tinylog.Logger; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author Eighty |
|
||||||
*/ |
|
||||||
public class DungenonCmd extends AbstractDevCmd { |
|
||||||
|
|
||||||
public DungenonCmd() { |
|
||||||
super("dungeon"); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected void _doCmd(PlayerCharacter pc, String[] words, |
|
||||||
AbstractGameObject target) { |
|
||||||
|
|
||||||
Zone parent = ZoneManager.findSmallestZone(pc.loc); |
|
||||||
if(parent == null) |
|
||||||
return; |
|
||||||
|
|
||||||
Vector3fImmutable loc = Vector3fImmutable.getRandomPointOnCircle(BuildingManager.getBuilding(2827951).loc,30f); |
|
||||||
pc.teleport(loc); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected String _getHelpString() { |
|
||||||
return "indicate mob or building followed by an id and a level"; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected String _getUsageString() { |
|
||||||
return "'/dungeon mob 2001 10'"; |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -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 @@ |
|||||||
|
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||||
|
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||||
|
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||||
|
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||||
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||||
|
// 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 @@ |
|||||||
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 @@ |
|||||||
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 @@ |
|||||||
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.50f; |
|
||||||
case 5: return 0.0f; |
|
||||||
case 6: return 0.0f; |
|
||||||
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,75 +0,0 @@ |
|||||||
package engine.job; |
|
||||||
|
|
||||||
import engine.server.world.WorldServer; |
|
||||||
import org.pmw.tinylog.Logger; |
|
||||||
|
|
||||||
import java.util.concurrent.TimeUnit; |
|
||||||
import java.util.concurrent.locks.ReentrantLock; |
|
||||||
|
|
||||||
public class JobThread implements Runnable { |
|
||||||
private final AbstractJob currentJob; |
|
||||||
private final ReentrantLock lock = new ReentrantLock(); |
|
||||||
|
|
||||||
private static Long nextThreadPrint; |
|
||||||
|
|
||||||
public JobThread(AbstractJob job){ |
|
||||||
this.currentJob = job; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void run() { |
|
||||||
try { |
|
||||||
if (this.currentJob != null) { |
|
||||||
if (lock.tryLock(5, TimeUnit.SECONDS)) { // Timeout to prevent deadlock
|
|
||||||
try { |
|
||||||
this.currentJob.doJob(); |
|
||||||
} finally { |
|
||||||
lock.unlock(); |
|
||||||
} |
|
||||||
} else { |
|
||||||
Logger.warn("JobThread could not acquire lock in time, skipping job."); |
|
||||||
} |
|
||||||
} |
|
||||||
} catch (Exception e) { |
|
||||||
Logger.error(e); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public static void startJobThread(AbstractJob job){ |
|
||||||
JobThread jobThread = new JobThread(job); |
|
||||||
Thread thread = new Thread(jobThread); |
|
||||||
thread.setName("JOB THREAD: " + job.getWorkerID()); |
|
||||||
thread.start(); |
|
||||||
|
|
||||||
if(JobThread.nextThreadPrint == null){ |
|
||||||
JobThread.nextThreadPrint = System.currentTimeMillis(); |
|
||||||
}else{ |
|
||||||
if(JobThread.nextThreadPrint < System.currentTimeMillis()){ |
|
||||||
JobThread.tryPrintThreads(); |
|
||||||
JobThread.nextThreadPrint = System.currentTimeMillis() + 10000L; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public static void tryPrintThreads(){ |
|
||||||
ThreadGroup rootGroup = Thread.currentThread().getThreadGroup(); |
|
||||||
while (rootGroup.getParent() != null) { |
|
||||||
rootGroup = rootGroup.getParent(); |
|
||||||
} |
|
||||||
|
|
||||||
// Estimate the number of threads
|
|
||||||
int activeThreads = rootGroup.activeCount(); |
|
||||||
|
|
||||||
// Create an array to hold the threads
|
|
||||||
Thread[] threads = new Thread[activeThreads]; |
|
||||||
|
|
||||||
// Get the active threads
|
|
||||||
rootGroup.enumerate(threads, true); |
|
||||||
|
|
||||||
int availableThreads = Runtime.getRuntime().availableProcessors(); |
|
||||||
|
|
||||||
// Print the count
|
|
||||||
if(threads.length > 30) |
|
||||||
Logger.info("Total threads in application: " + threads.length + " / " + availableThreads); |
|
||||||
} |
|
||||||
} |
|
@ -1,266 +0,0 @@ |
|||||||
package engine.mobileAI.Behaviours; |
|
||||||
|
|
||||||
import engine.Enum; |
|
||||||
import engine.InterestManagement.InterestManager; |
|
||||||
import engine.InterestManagement.WorldGrid; |
|
||||||
import engine.math.Vector3fImmutable; |
|
||||||
import engine.mobileAI.utilities.CombatUtilities; |
|
||||||
import engine.mobileAI.utilities.MovementUtilities; |
|
||||||
import engine.objects.*; |
|
||||||
import engine.server.MBServerStatics; |
|
||||||
|
|
||||||
import java.util.ArrayList; |
|
||||||
import java.util.HashMap; |
|
||||||
import java.util.HashSet; |
|
||||||
|
|
||||||
public class StandardMob { |
|
||||||
|
|
||||||
public static void run(Mob mob){ |
|
||||||
|
|
||||||
HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(mob.loc, MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER); |
|
||||||
|
|
||||||
if(inRange.isEmpty()) |
|
||||||
return; |
|
||||||
|
|
||||||
if(!mob.isAlive()){ |
|
||||||
CheckForRespawn(mob); |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
if (mob.isMoving()) { |
|
||||||
mob.setLoc(mob.getMovementLoc()); |
|
||||||
mob.updateLocation(); |
|
||||||
} |
|
||||||
|
|
||||||
if(mob.combatTarget == null) { |
|
||||||
if (!inRange.isEmpty()) { |
|
||||||
CheckForAggro(mob); |
|
||||||
} |
|
||||||
}else{ |
|
||||||
CheckToDropCombatTarget(mob); |
|
||||||
if(mob.combatTarget == null){ |
|
||||||
CheckForAggro(mob); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
if(MovementUtilities.canMove(mob)) |
|
||||||
CheckForMovement(mob); |
|
||||||
|
|
||||||
if(mob.combatTarget != null && !mob.isMoving()) |
|
||||||
CheckForAttack(mob); |
|
||||||
} |
|
||||||
|
|
||||||
public static void CheckToDropCombatTarget(Mob mob){ |
|
||||||
|
|
||||||
if(!mob.combatTarget.isAlive()){ |
|
||||||
mob.setCombatTarget(null); |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
if(mob.combatTarget.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)){ |
|
||||||
PlayerCharacter pcTarget = (PlayerCharacter) mob.combatTarget; |
|
||||||
if (!mob.canSee(pcTarget)) { |
|
||||||
mob.setCombatTarget(null); |
|
||||||
return; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
if(mob.bindLoc.distanceSquared(mob.combatTarget.loc) > 90 * 90){ |
|
||||||
mob.setCombatTarget(null); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
public static void CheckForRespawn(Mob mob){ |
|
||||||
if (mob.deathTime == 0) { |
|
||||||
mob.setDeathTime(System.currentTimeMillis()); |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
if (!mob.despawned) { |
|
||||||
if (mob.getCharItemManager().getInventoryCount() > 0) { |
|
||||||
if (System.currentTimeMillis() > mob.deathTime + MBServerStatics.DESPAWN_TIMER_WITH_LOOT) { |
|
||||||
mob.despawn(); |
|
||||||
mob.deathTime = System.currentTimeMillis(); |
|
||||||
return; |
|
||||||
} |
|
||||||
//No items in inventory.
|
|
||||||
} else if (mob.isHasLoot()) { |
|
||||||
if (System.currentTimeMillis() > mob.deathTime + 1000L) { |
|
||||||
mob.despawn(); |
|
||||||
mob.deathTime = System.currentTimeMillis(); |
|
||||||
return; |
|
||||||
} |
|
||||||
//Mob never had Loot.
|
|
||||||
} else { |
|
||||||
if (System.currentTimeMillis() > mob.deathTime + 1000L){//MBServerStatics.DESPAWN_TIMER_ONCE_LOOTED) {
|
|
||||||
mob.despawn(); |
|
||||||
mob.deathTime = System.currentTimeMillis(); |
|
||||||
return; |
|
||||||
} |
|
||||||
} |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
if(Mob.discDroppers.contains(mob)) |
|
||||||
return; |
|
||||||
float baseRespawnTimer = mob.spawnTime; |
|
||||||
float reduction = (100-mob.level) * 0.01f; |
|
||||||
float reducedRespawnTime = baseRespawnTimer * (1.0f - reduction); |
|
||||||
float respawnTimer = reducedRespawnTime * 1000f; |
|
||||||
if (System.currentTimeMillis() > (mob.deathTime + respawnTimer)) { |
|
||||||
Zone.respawnQue.add(mob); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public static void CheckForAggro(Mob mob){ |
|
||||||
|
|
||||||
if(mob == null || !mob.isAlive() || mob.playerAgroMap.isEmpty()){ |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
if(!mob.BehaviourType.isAgressive) |
|
||||||
return; |
|
||||||
|
|
||||||
if(mob.BehaviourType.equals(Enum.MobBehaviourType.HamletGuard)){ |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
if(mob.hate_values == null) |
|
||||||
mob.hate_values = new HashMap<>(); |
|
||||||
|
|
||||||
if(mob.combatTarget != null) |
|
||||||
return; |
|
||||||
|
|
||||||
HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(mob.loc, 60f, MBServerStatics.MASK_PLAYER); |
|
||||||
|
|
||||||
if(inRange.isEmpty()){ |
|
||||||
mob.setCombatTarget(null); |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
//clear out any players who are not in hated range anymore
|
|
||||||
ArrayList<PlayerCharacter> toRemove = new ArrayList<>(); |
|
||||||
for(PlayerCharacter pc : mob.hate_values.keySet()){ |
|
||||||
if(!inRange.contains(pc)) |
|
||||||
toRemove.add(pc); |
|
||||||
} |
|
||||||
for(PlayerCharacter pc : toRemove){ |
|
||||||
mob.hate_values.remove(pc); |
|
||||||
} |
|
||||||
|
|
||||||
//find most hated target
|
|
||||||
PlayerCharacter mostHated = null; |
|
||||||
for(AbstractWorldObject awo : inRange){ |
|
||||||
PlayerCharacter loadedPlayer = (PlayerCharacter)awo; |
|
||||||
if (loadedPlayer == null) |
|
||||||
continue; |
|
||||||
|
|
||||||
//Player is Dead, Mob no longer needs to attempt to aggro. Remove them from aggro map.
|
|
||||||
if (!loadedPlayer.isAlive()) |
|
||||||
continue; |
|
||||||
|
|
||||||
//Can't see target, skip aggro.
|
|
||||||
if (!mob.canSee(loadedPlayer)) |
|
||||||
continue; |
|
||||||
|
|
||||||
// No aggro for this race type
|
|
||||||
if (mob.notEnemy != null && mob.notEnemy.size() > 0 && mob.notEnemy.contains(loadedPlayer.getRace().getRaceType().getMonsterType())) |
|
||||||
continue; |
|
||||||
|
|
||||||
//mob has enemies and this player race is not it
|
|
||||||
if (mob.enemy != null && mob.enemy.size() > 0 && !mob.enemy.contains(loadedPlayer.getRace().getRaceType().getMonsterType())) |
|
||||||
continue; |
|
||||||
|
|
||||||
if(mostHated == null) |
|
||||||
mostHated = loadedPlayer; |
|
||||||
|
|
||||||
if(mob.hate_values.containsKey(loadedPlayer)) |
|
||||||
if(mob.hate_values.get(loadedPlayer) > mob.hate_values.get(mostHated)) |
|
||||||
mostHated = loadedPlayer; |
|
||||||
} |
|
||||||
|
|
||||||
if(mostHated != null) |
|
||||||
mob.setCombatTarget(mostHated); |
|
||||||
} |
|
||||||
|
|
||||||
public static void CheckForMovement(Mob mob){ |
|
||||||
|
|
||||||
if(!mob.BehaviourType.canRoam) |
|
||||||
return; |
|
||||||
|
|
||||||
if(mob.combatTarget != null){ |
|
||||||
//chase player
|
|
||||||
if(!CombatUtilities.inRange2D(mob,mob.combatTarget,mob.getRange())) { |
|
||||||
if(mob.combatTarget.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) { |
|
||||||
PlayerCharacter target = (PlayerCharacter)mob.combatTarget; |
|
||||||
if(target.isMoving()){ |
|
||||||
MovementUtilities.aiMove(mob, mob.combatTarget.loc, false); |
|
||||||
return; |
|
||||||
}else{ |
|
||||||
Vector3fImmutable smoothLoc = Vector3fImmutable.getRandomPointOnCircle(mob.combatTarget.loc,mob.getRange() -1); |
|
||||||
MovementUtilities.aiMove(mob, smoothLoc, false); |
|
||||||
return; |
|
||||||
} |
|
||||||
} |
|
||||||
MovementUtilities.aiMove(mob, mob.combatTarget.loc, false); |
|
||||||
} |
|
||||||
|
|
||||||
}else{ |
|
||||||
//patrol
|
|
||||||
if (mob.isMoving()) { |
|
||||||
mob.stopPatrolTime = System.currentTimeMillis(); |
|
||||||
return; |
|
||||||
} |
|
||||||
if(mob.stopPatrolTime + 5000L < System.currentTimeMillis()) { |
|
||||||
Vector3fImmutable patrolPoint = Vector3fImmutable.getRandomPointOnCircle(mob.bindLoc, 40f); |
|
||||||
MovementUtilities.aiMove(mob, patrolPoint, true); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public static void CheckForAttack(Mob mob){ |
|
||||||
|
|
||||||
if(mob.isMoving()) |
|
||||||
return; |
|
||||||
|
|
||||||
if(mob.getLastAttackTime() > System.currentTimeMillis()) |
|
||||||
return; |
|
||||||
|
|
||||||
if (mob.BehaviourType.callsForHelp) |
|
||||||
MobCallForHelp(mob); |
|
||||||
|
|
||||||
ItemBase mainHand = mob.getWeaponItemBase(true); |
|
||||||
ItemBase offHand = mob.getWeaponItemBase(false); |
|
||||||
|
|
||||||
if(!CombatUtilities.inRange2D(mob,mob.combatTarget,mob.getRange())) |
|
||||||
return; |
|
||||||
|
|
||||||
InterestManager.setObjectDirty(mob); |
|
||||||
|
|
||||||
if (mainHand == null && offHand == null) { |
|
||||||
CombatUtilities.combatCycle(mob, mob.combatTarget, true, null); |
|
||||||
int delay = 3000; |
|
||||||
mob.setLastAttackTime(System.currentTimeMillis() + delay); |
|
||||||
} else if (mob.getWeaponItemBase(true) != null) { |
|
||||||
int delay = 3000; |
|
||||||
CombatUtilities.combatCycle(mob, mob.combatTarget, true, mob.getWeaponItemBase(true)); |
|
||||||
mob.setLastAttackTime(System.currentTimeMillis() + delay); |
|
||||||
} else if (mob.getWeaponItemBase(false) != null) { |
|
||||||
int attackDelay = 3000; |
|
||||||
CombatUtilities.combatCycle(mob, mob.combatTarget, false, mob.getWeaponItemBase(false)); |
|
||||||
mob.setLastAttackTime(System.currentTimeMillis() + attackDelay); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public static void MobCallForHelp(Mob mob){ |
|
||||||
HashSet<AbstractWorldObject> mobs = WorldGrid.getObjectsInRangePartial(mob.loc,60f, MBServerStatics.MASK_MOB); |
|
||||||
for(AbstractWorldObject awo : mobs){ |
|
||||||
Mob responder = (Mob)awo; |
|
||||||
if(responder.combatTarget == null) |
|
||||||
if(MovementUtilities.canMove(responder)) |
|
||||||
MovementUtilities.aiMove(responder,mob.loc,false); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue