Compare commits
900 Commits
master
...
lakebane-a
182 changed files with 10929 additions and 2739 deletions
@ -0,0 +1,139 @@
@@ -0,0 +1,139 @@
|
||||
package engine; |
||||
|
||||
import engine.InterestManagement.WorldGrid; |
||||
import engine.gameManager.BuildingManager; |
||||
import engine.gameManager.ChatManager; |
||||
import engine.math.Vector3fImmutable; |
||||
import engine.objects.*; |
||||
import engine.server.MBServerStatics; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.Random; |
||||
import java.util.concurrent.ThreadLocalRandom; |
||||
|
||||
public class PlayerAi { |
||||
public static ArrayList<PlayerCharacter> ai_players = new ArrayList<>(); |
||||
|
||||
public static void addPlayer(PlayerCharacter pc){ |
||||
ai_players.add(pc); |
||||
int index = ai_players.indexOf(pc); |
||||
pc.setObjectUUID(MBServerStatics.NO_DB_ROW_ASSIGNED_YET - (1 + index)); |
||||
} |
||||
|
||||
public static void populate_world(){ |
||||
for(Mine mine : Mine.getMines()){ |
||||
Building tower = BuildingManager.getBuildingFromCache(mine.getBuildingID()); |
||||
if(tower != null){ |
||||
for(int i = 0; i < mine.capSize; i++){ |
||||
addPlayer(createPlayer(tower)); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
public static PlayerCharacter createPlayer(Building tower){ |
||||
|
||||
Vector3fImmutable loc = Vector3fImmutable.getRandomPointOnCircle(tower.loc,40f); |
||||
|
||||
//get random race
|
||||
Race race = null; |
||||
while(race == null) { |
||||
int raceId = ThreadLocalRandom.current().nextInt(1999, 2030); |
||||
while (raceId == 2021 || raceId == 2020 || raceId == 2019 || raceId == 2018) { |
||||
raceId = ThreadLocalRandom.current().nextInt(1999, 2030); |
||||
} |
||||
race = Race.getRace(raceId); |
||||
} |
||||
|
||||
|
||||
//get random baseClass
|
||||
BaseClass baseClass = null; |
||||
while(baseClass == null) { |
||||
int baseId = ThreadLocalRandom.current().nextInt(2499, 2505); |
||||
BaseClass temp = BaseClass.getBaseClass(baseId); |
||||
if (temp == null || !race.getValidBaseClasses().contains(temp)) { |
||||
continue; |
||||
} |
||||
baseClass = BaseClass.getBaseClass(baseId); |
||||
} |
||||
|
||||
PlayerCharacter newPLayer = new PlayerCharacter("", "AI POWERED", (short) 5, (short) 5, (short) 5, (short) 5, |
||||
(short) 5, Guild.getGuild(5), (byte) 0, (Account) null, race, baseClass |
||||
, (byte) 1, (byte) 1, |
||||
(byte) 1, (byte) 1, (byte) 1); |
||||
|
||||
newPLayer.runAfterLoad(); |
||||
|
||||
if(newPLayer.isMale()) { |
||||
newPLayer.setFirstName(getMaleName()); |
||||
}else { |
||||
newPLayer.setFirstName(getFemaleName()); |
||||
} |
||||
|
||||
newPLayer.setLevel((short)10); |
||||
|
||||
PromotionClass promo = null; |
||||
while(promo == null){ |
||||
int promoId = ThreadLocalRandom.current().nextInt(2508,2526); |
||||
PromotionClass temp = PromotionClass.GetPromtionClassFromCache(promoId); |
||||
if(temp == null) |
||||
continue; |
||||
if(!temp.isAllowedRune(race.getToken())) |
||||
continue; |
||||
if(!temp.isAllowedRune(baseClass.getToken())) |
||||
continue; |
||||
promo = PromotionClass.GetPromtionClassFromCache(promoId); |
||||
} |
||||
newPLayer.setPromotionClass(promo.getObjectUUID()); |
||||
newPLayer.setLevel((short)75); |
||||
|
||||
newPLayer.setLoc(loc); |
||||
|
||||
newPLayer.setObjectTypeMask(MBServerStatics.MASK_PLAYER); |
||||
WorldGrid.addObject(newPLayer,loc.x,loc.z); |
||||
|
||||
return newPLayer; |
||||
} |
||||
|
||||
public static void run_ai_players() { |
||||
for (PlayerCharacter pc : ai_players) { |
||||
|
||||
} |
||||
} |
||||
|
||||
public static String getMaleName(){ |
||||
String[] maleNames = { |
||||
"James", "John", "Robert", "Michael", "William", "David", "Richard", "Joseph", "Thomas", "Charles", |
||||
"Christopher", "Daniel", "Matthew", "Anthony", "Mark", "Donald", "Steven", "Paul", "Andrew", "Joshua", |
||||
"Kenneth", "Kevin", "Brian", "George", "Edward", "Ronald", "Timothy", "Jason", "Jeffrey", "Ryan", |
||||
"Jacob", "Gary", "Nicholas", "Eric", "Jonathan", "Stephen", "Larry", "Justin", "Scott", "Brandon", |
||||
"Benjamin", "Samuel", "Gregory", "Alexander", "Patrick", "Frank", "Raymond", "Jack", "Dennis", "Jerry", |
||||
"Tyler", "Aaron", "Jose", "Adam", "Nathan", "Henry", "Douglas", "Zachary", "Peter", "Kyle", |
||||
"Walter", "Ethan", "Jeremy", "Harold", "Keith", "Christian", "Roger", "Noah", "Gerald", "Carl", |
||||
"Terry", "Sean", "Austin", "Arthur", "Lawrence", "Jesse", "Dylan", "Bryan", "Joe", "Jordan", |
||||
"Billy", "Bruce", "Albert", "Willie", "Gabriel", "Logan", "Alan", "Juan", "Wayne", "Roy", |
||||
"Ralph", "Randy", "Eugene", "Vincent", "Russell", "Louis", "Philip", "Bobby", "Johnny", "Bradley" |
||||
}; |
||||
|
||||
Random random = new Random(); |
||||
return maleNames[random.nextInt(maleNames.length)]; |
||||
} |
||||
|
||||
public static String getFemaleName(){ |
||||
String[] femaleNames = { |
||||
"Mary", "Patricia", "Jennifer", "Linda", "Elizabeth", "Barbara", "Susan", "Jessica", "Sarah", "Karen", |
||||
"Nancy", "Lisa", "Betty", "Margaret", "Sandra", "Ashley", "Kimberly", "Emily", "Donna", "Michelle", |
||||
"Carol", "Amanda", "Melissa", "Deborah", "Stephanie", "Rebecca", "Laura", "Sharon", "Cynthia", "Kathleen", |
||||
"Amy", "Shirley", "Angela", "Helen", "Anna", "Brenda", "Pamela", "Nicole", "Samantha", "Katherine", |
||||
"Christine", "Debra", "Rachel", "Catherine", "Carolyn", "Janet", "Ruth", "Maria", "Heather", "Diane", |
||||
"Virginia", "Julie", "Joyce", "Victoria", "Kelly", "Christina", "Lauren", "Joan", "Evelyn", "Judith", |
||||
"Olivia", "Frances", "Martha", "Cheryl", "Megan", "Andrea", "Hannah", "Jacqueline", "Ann", "Gloria", |
||||
"Jean", "Kathryn", "Alice", "Teresa", "Sara", "Janice", "Doris", "Madison", "Julia", "Grace", |
||||
"Judy", "Abigail", "Marie", "Denise", "Beverly", "Amber", "Theresa", "Marilyn", "Danielle", "Diana", |
||||
"Brittany", "Natalie", "Sophia", "Rose", "Isabella", "Alexis", "Kayla", "Charlotte", "Faith", "Alyssa" |
||||
}; |
||||
|
||||
Random random = new Random(); |
||||
return femaleNames[random.nextInt(femaleNames.length)]; |
||||
} |
||||
} |
@ -0,0 +1,116 @@
@@ -0,0 +1,116 @@
|
||||
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); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,63 @@
@@ -0,0 +1,63 @@
|
||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||
// Magicbane Emulator Project © 2013 - 2022
|
||||
// www.magicbane.com
|
||||
|
||||
|
||||
package engine.devcmd.cmds; |
||||
|
||||
import engine.Enum.ItemContainerType; |
||||
import engine.Enum.ItemType; |
||||
import engine.Enum.OwnerType; |
||||
import engine.devcmd.AbstractDevCmd; |
||||
import engine.gameManager.ChatManager; |
||||
import engine.gameManager.DbManager; |
||||
import engine.objects.*; |
||||
import engine.powers.EffectsBase; |
||||
|
||||
import java.util.ArrayList; |
||||
|
||||
/** |
||||
* @author Eighty |
||||
*/ |
||||
public class GimmeCmd extends AbstractDevCmd { |
||||
|
||||
public GimmeCmd() { |
||||
super("gimme"); |
||||
} |
||||
|
||||
@Override |
||||
protected void _doCmd(PlayerCharacter pc, String[] words, |
||||
AbstractGameObject target) { |
||||
int amt = 0; |
||||
int currentGold = pc.getCharItemManager().getGoldInventory().getNumOfItems(); |
||||
amt = 10000000 - currentGold; |
||||
if (!pc.getCharItemManager().addGoldToInventory(amt, true)) { |
||||
throwbackError(pc, "Failed to add gold to inventory"); |
||||
return; |
||||
} |
||||
|
||||
ChatManager.chatSayInfo(pc, amt + " gold added to inventory"); |
||||
|
||||
if(pc.level < 75) { |
||||
pc.setLevel((short) 75); |
||||
ChatManager.chatSayInfo(pc, "Level set to 75"); |
||||
} |
||||
pc.getCharItemManager().updateInventory(); |
||||
|
||||
} |
||||
|
||||
@Override |
||||
protected String _getHelpString() { |
||||
return "Round up current gold in inventory to 10,000,000"; |
||||
} |
||||
|
||||
@Override |
||||
protected String _getUsageString() { |
||||
return "'./gimme"; |
||||
} |
||||
|
||||
} |
@ -1,77 +0,0 @@
@@ -1,77 +0,0 @@
|
||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||
// Magicbane Emulator Project © 2013 - 2022
|
||||
// www.magicbane.com
|
||||
|
||||
|
||||
package engine.devcmd.cmds; |
||||
|
||||
import engine.devcmd.AbstractDevCmd; |
||||
import engine.gameManager.ZoneManager; |
||||
import engine.objects.AbstractGameObject; |
||||
import engine.objects.PlayerCharacter; |
||||
|
||||
/** |
||||
* ./hotzone <- display the current hotzone & time remaining |
||||
* ./hotzone random <- change hotzone to random new zone |
||||
*/ |
||||
|
||||
public class HotzoneCmd extends AbstractDevCmd { |
||||
|
||||
public HotzoneCmd() { |
||||
super("hotzone"); |
||||
} |
||||
|
||||
@Override |
||||
protected void _doCmd(PlayerCharacter playerCharacter, String[] words, |
||||
AbstractGameObject target) { |
||||
|
||||
StringBuilder data = new StringBuilder(); |
||||
String outString; |
||||
|
||||
for (String s : words) { |
||||
data.append(s); |
||||
data.append(' '); |
||||
} |
||||
|
||||
String input = data.toString().trim(); |
||||
|
||||
if (input.length() == 0) { |
||||
outString = "Current hotZone: " + ZoneManager.hotZone.getName() + "\r\n"; |
||||
outString += "Available hotZones: " + ZoneManager.availableHotZones(); |
||||
throwbackInfo(playerCharacter, outString); |
||||
return; |
||||
} |
||||
|
||||
if (input.equalsIgnoreCase("random")) { |
||||
ZoneManager.generateAndSetRandomHotzone(); |
||||
outString = "New hotZone: " + ZoneManager.hotZone.getName() + "\r\n"; |
||||
outString += "Available hotZones: " + ZoneManager.availableHotZones(); |
||||
throwbackInfo(playerCharacter, outString); |
||||
return; |
||||
} |
||||
|
||||
if (input.equalsIgnoreCase("reset")) { |
||||
ZoneManager.resetHotZones(); |
||||
throwbackInfo(playerCharacter, "Available hotZones: " + ZoneManager.availableHotZones()); |
||||
return; |
||||
} |
||||
|
||||
return; |
||||
} |
||||
|
||||
@Override |
||||
protected String _getHelpString() { |
||||
return "Use no arguments to see the current hotzone or \"random\" to change it randomly."; |
||||
} |
||||
|
||||
@Override |
||||
protected String _getUsageString() { |
||||
return "'./hotzone [random]"; |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,168 @@
@@ -0,0 +1,168 @@
|
||||
package engine.gameManager; |
||||
|
||||
import engine.Enum; |
||||
import engine.InterestManagement.WorldGrid; |
||||
import engine.exception.MsgSendException; |
||||
import engine.math.Vector3f; |
||||
import engine.math.Vector3fImmutable; |
||||
import engine.objects.*; |
||||
import engine.server.MBServerStatics; |
||||
import org.pmw.tinylog.Logger; |
||||
|
||||
import java.util.*; |
||||
import java.util.concurrent.ThreadLocalRandom; |
||||
|
||||
public class ArenaManager { |
||||
private static final List<Arena> activeArenas = new ArrayList<>(); |
||||
public static final List<PlayerCharacter> playerQueue = new ArrayList<>(); |
||||
public static Long pulseDelay = 180000L; |
||||
public static Long lastExecution = 0L; |
||||
|
||||
public static void pulseArenas() { |
||||
if(lastExecution == 0L){ |
||||
lastExecution = System.currentTimeMillis(); |
||||
} |
||||
|
||||
if(activeArenas.isEmpty() && playerQueue.isEmpty()) |
||||
return; |
||||
|
||||
Iterator<Arena> iterator = activeArenas.iterator(); |
||||
|
||||
while (iterator.hasNext()) { |
||||
Arena arena = iterator.next(); |
||||
if (arena.checkToComplete()) { |
||||
iterator.remove(); |
||||
} |
||||
} |
||||
|
||||
if(lastExecution + pulseDelay > System.currentTimeMillis()) |
||||
return; |
||||
|
||||
lastExecution = System.currentTimeMillis(); |
||||
|
||||
while (playerQueue.size() > 1) { |
||||
createArena(); |
||||
} |
||||
} |
||||
|
||||
public static void joinQueue(PlayerCharacter player) { |
||||
if (!playerQueue.contains(player)) { |
||||
playerQueue.add(player); |
||||
} |
||||
for(PlayerCharacter pc : playerQueue){ |
||||
if(pc.equals(player)) |
||||
continue; |
||||
ChatManager.chatSystemInfo(pc, player.getName() + " has joined the arena que. There are now " + playerQueue.size() + " players queued."); |
||||
} |
||||
} |
||||
|
||||
public static void leaveQueue(PlayerCharacter player) { |
||||
playerQueue.remove(player); |
||||
for(PlayerCharacter pc : playerQueue){ |
||||
if(pc.equals(player)) |
||||
continue; |
||||
ChatManager.chatSystemInfo(pc, player.getName() + " has left the arena que. There are now " + playerQueue.size() + " players queued."); |
||||
} |
||||
} |
||||
|
||||
private static void createArena() { |
||||
if (playerQueue.size() > 1) { |
||||
|
||||
Collections.shuffle(playerQueue); |
||||
Arena newArena = new Arena(); |
||||
|
||||
//set starting time
|
||||
newArena.startTime = System.currentTimeMillis(); |
||||
|
||||
//decide an arena location
|
||||
newArena.loc = selectRandomArenaLocation(); |
||||
|
||||
// Assign players to the arena
|
||||
newArena.player1 = playerQueue.remove(0); |
||||
newArena.player2 = playerQueue.remove(0); |
||||
|
||||
// Teleport players to the arena location
|
||||
Zone sdr = ZoneManager.getZoneByUUID(656); |
||||
MovementManager.translocate(newArena.player1, Vector3fImmutable.getRandomPointOnCircle(newArena.loc,75f), null); |
||||
MovementManager.translocate(newArena.player2, Vector3fImmutable.getRandomPointOnCircle(newArena.loc,75f), null); |
||||
|
||||
// Add the new arena to the active arenas list
|
||||
activeArenas.add(newArena); |
||||
} |
||||
} |
||||
|
||||
public static void endArena(Arena arena, PlayerCharacter winner, PlayerCharacter loser, String condition){ |
||||
if (winner != null && loser != null) { |
||||
Logger.info("[ARENA] The fight between {} and {} is concluded. Victor: {}", |
||||
arena.player1.getName(), arena.player2.getName(), winner.getName()); |
||||
} else { |
||||
Logger.info("[ARENA] The fight between {} and {} is concluded. No Winner Declared.", |
||||
arena.player1.getName(), arena.player2.getName()); |
||||
} |
||||
// Teleport players to the arena location
|
||||
Zone sdr = ZoneManager.getZoneByUUID(656); |
||||
MovementManager.translocate(arena.player1, Vector3fImmutable.getRandomPointOnCircle(sdr.getLoc(),50f), null); |
||||
MovementManager.translocate(arena.player2, Vector3fImmutable.getRandomPointOnCircle(sdr.getLoc(),50f), null); |
||||
|
||||
|
||||
|
||||
activeArenas.remove(arena); |
||||
|
||||
if(winner != null){ |
||||
ChatManager.chatPVP("[ARENA] " + winner.getName() + " has slain " + loser.getName() + " in the arena!"); |
||||
//handle prize distribution
|
||||
//ItemBase specialLoot = ItemBase.getItemBase(866);
|
||||
//Item promoted = new MobLoot(winner, specialLoot, 1, false).promoteToItem(winner);
|
||||
//promoted.setNumOfItems(21235);
|
||||
//promoted.setName("Special Banker(21235)");
|
||||
//DbManager.ItemQueries.UPDATE_NUM_ITEMS(promoted,21235);
|
||||
//winner.getCharItemManager().addItemToInventory(promoted);
|
||||
//winner.getCharItemManager().updateInventory();
|
||||
} |
||||
} |
||||
|
||||
public static Vector3fImmutable selectRandomArenaLocation() { |
||||
boolean locSet = false; |
||||
Vector3fImmutable loc = Vector3fImmutable.ZERO; |
||||
|
||||
while (!locSet) { |
||||
try { |
||||
float x = ThreadLocalRandom.current().nextInt(114300, 123600); |
||||
float z = ThreadLocalRandom.current().nextInt(82675, 91700); |
||||
float y = 0; // Y coordinate is always 0
|
||||
|
||||
loc = new Vector3fImmutable(x, y, z * -1); |
||||
HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(loc,500f, MBServerStatics.MASK_PLAYER); |
||||
if(inRange.isEmpty() && !isUnderWater(loc)) |
||||
locSet = true; |
||||
//}
|
||||
}catch(Exception e){ |
||||
|
||||
} |
||||
} |
||||
|
||||
return loc; |
||||
} |
||||
|
||||
public static boolean isUnderWater(Vector3fImmutable loc) { |
||||
|
||||
try { |
||||
|
||||
Zone zone = ZoneManager.findSmallestZone(loc); |
||||
|
||||
if (zone.getSeaLevel() != 0) { |
||||
|
||||
float localAltitude = loc.y; |
||||
if (localAltitude < zone.getSeaLevel()) |
||||
return true; |
||||
} else { |
||||
if (loc.y < 0) |
||||
return true; |
||||
} |
||||
} catch (Exception e) { |
||||
|
||||
} |
||||
|
||||
return false; |
||||
} |
||||
} |
@ -0,0 +1,347 @@
@@ -0,0 +1,347 @@
|
||||
package engine.gameManager; |
||||
|
||||
import engine.Enum; |
||||
import engine.InterestManagement.InterestManager; |
||||
import engine.InterestManagement.WorldGrid; |
||||
import engine.math.Vector3f; |
||||
import engine.math.Vector3fImmutable; |
||||
import engine.objects.*; |
||||
import org.pmw.tinylog.Logger; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.HashMap; |
||||
import java.util.concurrent.ThreadLocalRandom; |
||||
|
||||
public class StrongholdManager { |
||||
|
||||
public static void processStrongholds() { |
||||
ArrayList<Mine> mines = Mine.getMines(); |
||||
|
||||
|
||||
//process strongholds selecting 3 randomly to become active
|
||||
int count = 0; |
||||
while (count < 3) { |
||||
int random = ThreadLocalRandom.current().nextInt(1, mines.size()) - 1; |
||||
Mine mine = mines.get(random); |
||||
if (mine != null) { |
||||
if (!mine.isActive && !mine.isStronghold) { |
||||
StartStronghold(mine); |
||||
count++; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
public static void StartStronghold(Mine mine){ |
||||
|
||||
//remove buildings
|
||||
Building tower = BuildingManager.getBuilding(mine.getBuildingID()); |
||||
if(tower == null) |
||||
return; |
||||
|
||||
mine.isStronghold = true; |
||||
mine.strongholdMobs = new ArrayList<>(); |
||||
mine.oldBuildings = new HashMap<>(); |
||||
|
||||
Zone mineZone = ZoneManager.findSmallestZone(tower.loc); |
||||
for(Building building : mineZone.zoneBuildingSet){ |
||||
mine.oldBuildings.put(building.getObjectUUID(),building.meshUUID); |
||||
building.setMeshUUID(407650); |
||||
building.setMeshScale(new Vector3f(0,0,0)); |
||||
InterestManager.setObjectDirty(building); |
||||
WorldGrid.updateObject(building); |
||||
} |
||||
|
||||
//update tower to become stronghold mesh
|
||||
tower.setMeshUUID(getStrongholdMeshID(mine.getParentZone())); |
||||
tower.setMeshScale(new Vector3f(1,1,1)); |
||||
InterestManager.setObjectDirty(tower); |
||||
WorldGrid.updateObject(tower); |
||||
|
||||
//create elite mobs
|
||||
for(int i = 0; i < mine.capSize * 2; i++){ |
||||
Vector3fImmutable loc = Vector3fImmutable.getRandomPointOnCircle(tower.loc,30); |
||||
MobBase guardBase = MobBase.getMobBase(getStrongholdGuardianID(tower.meshUUID)); |
||||
Mob guard = Mob.createStrongholdMob(guardBase.getLoadID(), loc, Guild.getErrantGuild(),true,mineZone,null,0, guardBase.getFirstName(),65); |
||||
if(guard != null){ |
||||
guard.parentZone = mine.getParentZone(); |
||||
guard.bindLoc = loc; |
||||
guard.setLoc(loc); |
||||
guard.StrongholdGuardian = true; |
||||
guard.equipmentSetID = getStrongholdMobEquipSetID(guard); |
||||
guard.runAfterLoad(); |
||||
guard.setLevel((short)65); |
||||
guard.setResists(new Resists("Elite")); |
||||
guard.spawnTime = 1000000000; |
||||
guard.BehaviourType = Enum.MobBehaviourType.Aggro; |
||||
mine.strongholdMobs.add(guard); |
||||
LootManager.GenerateStrongholdLoot(guard,false,false); |
||||
guard.healthMax = 12500; |
||||
guard.setHealth(guard.healthMax); |
||||
guard.maxDamageHandOne = 1550; |
||||
guard.minDamageHandOne = 750; |
||||
guard.atrHandOne = 1800; |
||||
guard.defenseRating = 2200; |
||||
guard.setFirstName("Elite Guardian"); |
||||
InterestManager.setObjectDirty(guard); |
||||
WorldGrid.addObject(guard,loc.x,loc.z); |
||||
WorldGrid.updateObject(guard); |
||||
guard.stronghold = mine; |
||||
guard.mobPowers.clear(); |
||||
guard.mobPowers.put(429399948,20); // find weakness
|
||||
} |
||||
} |
||||
//create stronghold commander
|
||||
Vector3fImmutable loc = tower.loc; |
||||
MobBase commanderBase = MobBase.getMobBase(getStrongholdCommanderID(tower.meshUUID)); |
||||
Mob commander = Mob.createStrongholdMob(commanderBase.getLoadID(), loc,Guild.getErrantGuild(),true,mineZone,null,0, commanderBase.getFirstName(),75); |
||||
if(commander != null){ |
||||
commander.parentZone = mine.getParentZone(); |
||||
commander.bindLoc = loc; |
||||
commander.setLoc(loc); |
||||
commander.StrongholdCommander = true; |
||||
commander.equipmentSetID = getStrongholdMobEquipSetID(commander); |
||||
commander.runAfterLoad(); |
||||
commander.setLevel((short)75); |
||||
commander.setResists(new Resists("Elite")); |
||||
commander.spawnTime = 1000000000; |
||||
commander.BehaviourType = Enum.MobBehaviourType.Aggro; |
||||
commander.mobPowers.clear(); |
||||
commander.mobPowers.put(429032838, 40); // gravechill
|
||||
commander.mobPowers.put(429757701,20); // magebolt
|
||||
commander.mobPowers.put(429121388,20); // blight
|
||||
commander.mobPowers.put(431566891,20); // lightning bolt
|
||||
commander.mobPowers.put(428716075,20); // fire bolt
|
||||
commander.mobPowers.put(429010987,20); // ice bolt
|
||||
mine.strongholdMobs.add(commander); |
||||
LootManager.GenerateStrongholdLoot(commander,true, false); |
||||
commander.healthMax = 50000; |
||||
commander.setHealth(commander.healthMax); |
||||
commander.maxDamageHandOne = 3500; |
||||
commander.minDamageHandOne = 1500; |
||||
commander.atrHandOne = 3500; |
||||
commander.defenseRating = 3500; |
||||
commander.setFirstName("Guardian Commander"); |
||||
InterestManager.setObjectDirty(commander); |
||||
WorldGrid.addObject(commander,loc.x,loc.z); |
||||
WorldGrid.updateObject(commander); |
||||
commander.stronghold = mine; |
||||
} |
||||
|
||||
mine.isActive = true; |
||||
tower.setProtectionState(Enum.ProtectionState.PROTECTED); |
||||
tower.getBounds().setRegions(tower); |
||||
InterestManager.setObjectDirty(tower); |
||||
WorldGrid.updateObject(tower); |
||||
ChatManager.chatSystemChannel(mine.getZoneName() + "'s Stronghold Has Begun!"); |
||||
Logger.info(mine.getZoneName() + "'s Stronghold Has Begun!"); |
||||
} |
||||
|
||||
public static void EndStronghold(Mine mine){ |
||||
|
||||
//restore the buildings
|
||||
Building tower = BuildingManager.getBuilding(mine.getBuildingID()); |
||||
if(tower == null) |
||||
return; |
||||
|
||||
mine.isStronghold = false; |
||||
|
||||
//get rid of the mobs
|
||||
for(Mob mob : mine.strongholdMobs) { |
||||
mob.despawn(); |
||||
mob.removeFromCache(); |
||||
DbManager.MobQueries.DELETE_MOB(mob); |
||||
} |
||||
|
||||
//restore the buildings
|
||||
Zone mineZone = ZoneManager.findSmallestZone(tower.loc); |
||||
for(Building building : mineZone.zoneBuildingSet){ |
||||
if(mine.oldBuildings.containsKey(building.getObjectUUID())) { |
||||
building.setMeshUUID(mine.oldBuildings.get(building.getObjectUUID())); |
||||
building.setMeshScale(new Vector3f(1, 1, 1)); |
||||
InterestManager.setObjectDirty(building); |
||||
WorldGrid.updateObject(building); |
||||
} |
||||
} |
||||
|
||||
//update tower to become Mine Tower again
|
||||
tower.setMeshUUID(1500100); |
||||
|
||||
mine.isActive = false; |
||||
tower.setProtectionState(Enum.ProtectionState.NPC); |
||||
tower.getBounds().setRegions(tower); |
||||
InterestManager.setObjectDirty(tower); |
||||
WorldGrid.updateObject(tower); |
||||
ChatManager.chatSystemChannel(mine.getZoneName() + "'s Stronghold Has Concluded!"); |
||||
Logger.info(mine.getZoneName() + "'s Stronghold Has Concluded!"); |
||||
} |
||||
|
||||
public static int getStrongholdMeshID(Zone parent){ |
||||
while(!parent.isMacroZone()){ |
||||
parent = parent.getParent(); |
||||
if(parent.getName().equalsIgnoreCase("seafloor")){ |
||||
return 0; |
||||
} |
||||
} |
||||
switch(parent.getObjectUUID()){ |
||||
case 197: |
||||
case 234: |
||||
case 178: |
||||
case 122: |
||||
return 814000; //Frost Giant Hall (ICE)
|
||||
case 968: |
||||
case 951: |
||||
case 313: |
||||
case 331: |
||||
return 5001500; // Lich Queens Keep (UNDEAD)
|
||||
case 785: |
||||
case 761: |
||||
case 717: |
||||
case 737: |
||||
return 1306600; // Temple of the Dragon (DESERT)
|
||||
case 353: |
||||
case 371: |
||||
case 388: |
||||
case 532: |
||||
return 564600; // Undead Lord's Keep (SWAMP)
|
||||
case 550: |
||||
case 508: |
||||
case 475: |
||||
case 418: |
||||
return 1326600; // elven hall
|
||||
case 437: |
||||
case 491: |
||||
case 590: |
||||
case 569: |
||||
return 602400; |
||||
case 824: |
||||
case 842: |
||||
case 632: |
||||
return 1600000; // chaos temple
|
||||
} |
||||
return 456100; // small stockade
|
||||
} |
||||
|
||||
public static int getStrongholdGuardianID(int ID){ |
||||
switch(ID){ |
||||
case 814000: |
||||
return 253004; // Mountain Giant Raider Axe
|
||||
case 5001500: |
||||
return 253008; // Vampire Spear Warrior
|
||||
case 1306600: |
||||
return 253007; // Desert Orc Warrior
|
||||
case 564600: |
||||
return 253010; // Kolthoss Warrior
|
||||
case 1326600: |
||||
return 253005; //elven warrior
|
||||
case 602400: |
||||
return 253009; // templar missionary
|
||||
case 1600000: |
||||
return 253006; // scourger
|
||||
} |
||||
return 13434; // human sword and board warrior
|
||||
} |
||||
|
||||
public static int getStrongholdEpicID(int ID){ |
||||
switch(ID){ |
||||
case 814000: |
||||
return 253023; // Mountain Giant Raider Axe
|
||||
case 5001500: |
||||
return 253022; // Vampire Spear Warrior
|
||||
case 1306600: |
||||
return 253021; // Desert Orc Warrior
|
||||
case 564600: |
||||
return 253018; // Kolthoss Warrior
|
||||
case 1326600: |
||||
return 253019; //elven warrior
|
||||
case 602400: |
||||
return 253024; // templar missionary
|
||||
case 1600000: |
||||
return 253020; // scourger
|
||||
} |
||||
return 13434; // human sword and board warrior
|
||||
} |
||||
|
||||
public static int getStrongholdCommanderID(int ID){ |
||||
switch(ID){ |
||||
case 814000: |
||||
return 253017; |
||||
case 5001500: |
||||
return 253012; |
||||
case 1306600: |
||||
return 253016; // Desert Orc Xbow
|
||||
case 564600: |
||||
return 253011; // xbow kolthoss
|
||||
case 1326600: |
||||
return 253013; //elven bow warrior
|
||||
case 602400: |
||||
return 253015; // dune giant with xbow
|
||||
case 1600000: |
||||
return 253014; // barbator
|
||||
} |
||||
return 13433; |
||||
} |
||||
|
||||
public static int getStrongholdMobEquipSetID(Mob mob) { |
||||
if(mob.StrongholdGuardian){ |
||||
return 6327; |
||||
}else{ |
||||
return 10790; |
||||
} |
||||
} |
||||
|
||||
public static void CheckToEndStronghold(Mine mine) { |
||||
|
||||
boolean stillAlive = false; |
||||
for (Mob mob : mine.strongholdMobs) |
||||
if (mob.isAlive()) |
||||
stillAlive = true; |
||||
|
||||
if (!stillAlive) { |
||||
// Epic encounter
|
||||
|
||||
Building tower = BuildingManager.getBuilding(mine.getBuildingID()); |
||||
if (tower == null) |
||||
return; |
||||
|
||||
Zone mineZone = ZoneManager.findSmallestZone(tower.loc); |
||||
|
||||
Vector3fImmutable loc = tower.loc; |
||||
MobBase commanderBase = MobBase.getMobBase(getStrongholdEpicID(tower.meshUUID)); |
||||
Mob commander = Mob.createStrongholdMob(commanderBase.getLoadID(), loc, Guild.getErrantGuild(), true, mineZone, null, 0, commanderBase.getFirstName(), 75); |
||||
if (commander != null) { |
||||
commander.parentZone = mine.getParentZone(); |
||||
commander.bindLoc = loc; |
||||
commander.setLoc(loc); |
||||
commander.StrongholdEpic = true; |
||||
commander.equipmentSetID = getStrongholdMobEquipSetID(commander); |
||||
commander.runAfterLoad(); |
||||
commander.setLevel((short) 85); |
||||
commander.setResists(new Resists("Elite")); |
||||
commander.spawnTime = 1000000000; |
||||
commander.BehaviourType = Enum.MobBehaviourType.Aggro; |
||||
commander.mobPowers.clear(); |
||||
commander.mobPowers.put(429032838, 40); // gravechill
|
||||
commander.mobPowers.put(429757701,40); // magebolt
|
||||
commander.mobPowers.put(429121388,40); // blight
|
||||
commander.mobPowers.put(431566891,40); // lightning bolt
|
||||
commander.mobPowers.put(428716075,40); // fire bolt
|
||||
commander.mobPowers.put(429010987,40); // ice bolt
|
||||
mine.strongholdMobs.add(commander); |
||||
LootManager.GenerateStrongholdLoot(commander, true, true); |
||||
commander.healthMax = 250000; |
||||
commander.setHealth(commander.healthMax); |
||||
commander.maxDamageHandOne = 5000; |
||||
commander.minDamageHandOne = 2500; |
||||
commander.atrHandOne = 5000; |
||||
commander.defenseRating = 3500; |
||||
commander.setFirstName("Defender of " + mine.getParentZone().getParent().getName()); |
||||
InterestManager.setObjectDirty(commander); |
||||
WorldGrid.addObject(commander,loc.x,loc.z); |
||||
WorldGrid.updateObject(commander); |
||||
commander.stronghold = mine; |
||||
|
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,195 @@
@@ -0,0 +1,195 @@
|
||||
package engine.gameManager; |
||||
import engine.objects.Guild; |
||||
public class ZergManager { |
||||
|
||||
public static float getCurrentMultiplier(int count, int maxCount){ |
||||
switch(maxCount) { |
||||
case 3: return getMultiplier3Man(count); |
||||
case 5: return getMultiplier5Man(count); |
||||
case 10: return getMultiplier10Man(count); |
||||
case 20: return getMultiplier20Man(count); |
||||
case 30: return getMultiplier30Man(count); |
||||
case 40: return getMultiplier40Man(count); |
||||
default: return 1.0f; //unlimited
|
||||
} |
||||
} |
||||
public static float getMultiplier3Man(int count) { |
||||
if(count < 4) |
||||
return 1.0f; |
||||
|
||||
if(count > 6) |
||||
return 0.0f; |
||||
|
||||
switch(count){ |
||||
case 4: return 0.63f; |
||||
case 5: return 0.40f; |
||||
case 6: return 0.25f; |
||||
default: return 1.0f; |
||||
} |
||||
} |
||||
public static float getMultiplier5Man(int count) { |
||||
if(count < 6) |
||||
return 1.0f; |
||||
|
||||
if(count > 10) |
||||
return 0.0f; |
||||
|
||||
switch(count){ |
||||
case 6: return 0.75f; |
||||
case 7: return 0.57f; |
||||
case 8: return 0.44f; |
||||
case 9: return 0.33f; |
||||
case 10: return 0.25f; |
||||
default: return 1.0f; |
||||
} |
||||
} |
||||
public static float getMultiplier10Man(int count) { |
||||
if(count < 11) |
||||
return 1.0f; |
||||
|
||||
if(count > 20) |
||||
return 0.0f; |
||||
|
||||
switch(count){ |
||||
case 11: return 0.86f; |
||||
case 12: return 0.75f; |
||||
case 13: return 0.65f; |
||||
case 14: return 0.57f; |
||||
case 15: return 0.50f; |
||||
case 16: return 0.44f; |
||||
case 17: return 0.38f; |
||||
case 18: return 0.33f; |
||||
case 19: return 0.29f; |
||||
case 20: return 0.25f; |
||||
default: return 1.0f; |
||||
} |
||||
} |
||||
public static float getMultiplier20Man(int count) { |
||||
if(count < 21) |
||||
return 1.0f; |
||||
|
||||
if(count > 40) |
||||
return 0.0f; |
||||
|
||||
switch (count) |
||||
{ |
||||
case 21: return 0.93f; |
||||
case 22: return 0.86f; |
||||
case 23: return 0.80f; |
||||
case 24: return 0.75f; |
||||
case 25: return 0.70f; |
||||
case 26: return 0.65f; |
||||
case 27: return 0.61f; |
||||
case 28: return 0.57f; |
||||
case 29: return 0.53f; |
||||
case 30: return 0.50f; |
||||
case 31: return 0.47f; |
||||
case 32: return 0.44f; |
||||
case 33: return 0.41f; |
||||
case 34: return 0.38f; |
||||
case 35: return 0.36f; |
||||
case 36: return 0.33f; |
||||
case 37: return 0.31f; |
||||
case 38: return 0.29f; |
||||
case 39: return 0.27f; |
||||
case 40: return 0.25f; |
||||
default: return 1.0f; |
||||
} |
||||
|
||||
} |
||||
public static float getMultiplier30Man(int count) { |
||||
if(count < 31) |
||||
return 1.0f; |
||||
|
||||
if(count > 60) |
||||
return 0.0f; |
||||
|
||||
switch (count) |
||||
{ |
||||
case 31: return 0.95f; |
||||
case 32: return 0.91f; |
||||
case 33: return 0.86f; |
||||
case 34: return 0.82f; |
||||
case 35: return 0.79f; |
||||
case 36: return 0.75f; |
||||
case 37: return 0.72f; |
||||
case 38: return 0.68f; |
||||
case 39: return 0.65f; |
||||
case 40: return 0.63f; |
||||
case 41: return 0.60f; |
||||
case 42: return 0.57f; |
||||
case 43: return 0.55f; |
||||
case 44: return 0.52f; |
||||
case 45: return 0.50f; |
||||
case 46: return 0.48f; |
||||
case 47: return 0.46f; |
||||
case 48: return 0.44f; |
||||
case 49: return 0.42f; |
||||
case 50: return 0.40f; |
||||
case 51: return 0.38f; |
||||
case 52: return 0.37f; |
||||
case 53: return 0.35f; |
||||
case 54: return 0.33f; |
||||
case 55: return 0.32f; |
||||
case 56: return 0.30f; |
||||
case 57: return 0.29f; |
||||
case 58: return 0.28f; |
||||
case 59: return 0.26f; |
||||
case 60: return 0.25f; |
||||
default: return 1.0f; |
||||
} |
||||
|
||||
} |
||||
public static float getMultiplier40Man(int count) { |
||||
if(count < 41) |
||||
return 1.0f; |
||||
|
||||
if(count > 80) |
||||
return 0.0f; |
||||
|
||||
switch (count) |
||||
{ |
||||
case 41: return 0.96f; |
||||
case 42: return 0.93f; |
||||
case 43: return 0.90f; |
||||
case 44: return 0.86f; |
||||
case 45: return 0.83f; |
||||
case 46: return 0.80f; |
||||
case 47: return 0.78f; |
||||
case 48: return 0.75f; |
||||
case 49: return 0.72f; |
||||
case 50: return 0.70f; |
||||
case 51: return 0.68f; |
||||
case 52: return 0.65f; |
||||
case 53: return 0.63f; |
||||
case 54: return 0.61f; |
||||
case 55: return 0.59f; |
||||
case 56: return 0.57f; |
||||
case 57: return 0.55f; |
||||
case 58: return 0.53f; |
||||
case 59: return 0.52f; |
||||
case 60: return 0.50f; |
||||
case 61: return 0.48f; |
||||
case 62: return 0.47f; |
||||
case 63: return 0.45f; |
||||
case 64: return 0.44f; |
||||
case 65: return 0.42f; |
||||
case 66: return 0.41f; |
||||
case 67: return 0.40f; |
||||
case 68: return 0.38f; |
||||
case 69: return 0.37f; |
||||
case 70: return 0.36f; |
||||
case 71: return 0.35f; |
||||
case 72: return 0.33f; |
||||
case 73: return 0.32f; |
||||
case 74: return 0.31f; |
||||
case 75: return 0.30f; |
||||
case 76: return 0.29f; |
||||
case 77: return 0.28f; |
||||
case 78: return 0.27f; |
||||
case 79: return 0.26f; |
||||
case 80: return 0.25f; |
||||
default: return 1.0f; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,75 @@
@@ -0,0 +1,75 @@
|
||||
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); |
||||
} |
||||
} |
@ -0,0 +1,33 @@
@@ -0,0 +1,33 @@
|
||||
package engine.mobileAI.MobBehaviours; |
||||
|
||||
import engine.gameManager.ZoneManager; |
||||
import engine.mobileAI.utilities.MovementUtilities; |
||||
import engine.objects.Mob; |
||||
import org.pmw.tinylog.Logger; |
||||
|
||||
public class Pet { |
||||
|
||||
public static void run(Mob pet){ |
||||
|
||||
try { |
||||
|
||||
if(StaticBehaviours.EarlyExit(pet)) |
||||
return; |
||||
|
||||
if (pet.getOwner() == null && pet.isNecroPet() == false && pet.isSiege() == false) |
||||
if (ZoneManager.getSeaFloor().zoneMobSet.contains(pet)) |
||||
pet.killCharacter("no owner"); |
||||
|
||||
if(!pet.isSiege()) |
||||
pet.BehaviourType.canRoam = true; |
||||
|
||||
|
||||
if (MovementUtilities.canMove(pet) && pet.BehaviourType.canRoam) |
||||
StaticBehaviours.CheckMobMovement(pet); |
||||
|
||||
StaticBehaviours.CheckForAttack(pet); |
||||
} catch (Exception e) { |
||||
Logger.info(pet.getObjectUUID() + " " + pet.getName() + " Failed At: PetLogic" + " " + e.getMessage()); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,146 @@
@@ -0,0 +1,146 @@
|
||||
package engine.mobileAI.MobBehaviours; |
||||
|
||||
import engine.Enum; |
||||
import engine.objects.AbstractWorldObject; |
||||
import engine.objects.Mob; |
||||
import engine.objects.PlayerCharacter; |
||||
import org.pmw.tinylog.Logger; |
||||
|
||||
public class PlayerGuard { |
||||
|
||||
public static void run(Mob guard) { |
||||
|
||||
if(StaticBehaviours.EarlyExit(guard)) |
||||
return; |
||||
|
||||
if (guard.mobPowers.isEmpty()) { |
||||
//mele
|
||||
if (guard.BehaviourType.equals(Enum.MobBehaviourType.GuardWallArcher)) { |
||||
GuardWallArcherLogic(guard); |
||||
} else { |
||||
if (guard.BehaviourType.equals(Enum.MobBehaviourType.GuardCaptain)) { |
||||
GuardCaptainLogic(guard); |
||||
} else if (guard.BehaviourType.equals(Enum.MobBehaviourType.GuardMinion)) { |
||||
GuardMinionLogic(guard); |
||||
} |
||||
} |
||||
} else { |
||||
//caster
|
||||
if (guard.BehaviourType.equals(Enum.MobBehaviourType.GuardCaptain)) { |
||||
MagisterCaptainLogic(guard); |
||||
} else if (guard.BehaviourType.equals(Enum.MobBehaviourType.GuardMinion)) { |
||||
MagisterMinionLogic(guard); |
||||
} |
||||
} |
||||
} |
||||
|
||||
public static void GuardCaptainLogic(Mob mob) { |
||||
|
||||
try { |
||||
StaticBehaviours.checkToDropGuardAggro(mob); |
||||
if (mob.getCombatTarget() == null) |
||||
StaticBehaviours.CheckForPlayerGuardAggro(mob); |
||||
|
||||
AbstractWorldObject newTarget = StaticBehaviours.ChangeTargetFromHateValue(mob); |
||||
|
||||
if (newTarget != null) { |
||||
|
||||
if (newTarget.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) { |
||||
if (StaticBehaviours.GuardCanAggro(mob, (PlayerCharacter) newTarget)) |
||||
mob.setCombatTarget(newTarget); |
||||
} else |
||||
mob.setCombatTarget(newTarget); |
||||
|
||||
} |
||||
StaticBehaviours.CheckMobMovement(mob); |
||||
StaticBehaviours.CheckForAttack(mob); |
||||
} catch (Exception e) { |
||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardCaptainLogic" + " " + e.getMessage()); |
||||
} |
||||
} |
||||
|
||||
public static void GuardMinionLogic(Mob mob) { |
||||
|
||||
try { |
||||
StaticBehaviours.checkToDropGuardAggro(mob); |
||||
|
||||
boolean isComanded = mob.npcOwner.isAlive(); |
||||
if (!isComanded) { |
||||
GuardCaptainLogic(mob); |
||||
}else { |
||||
if (mob.npcOwner.getCombatTarget() != null) |
||||
mob.setCombatTarget(mob.npcOwner.getCombatTarget()); |
||||
else |
||||
if (mob.getCombatTarget() != null) |
||||
mob.setCombatTarget(null); |
||||
} |
||||
StaticBehaviours.CheckMobMovement(mob); |
||||
StaticBehaviours.CheckForAttack(mob); |
||||
} catch (Exception e) { |
||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardMinionLogic" + " " + e.getMessage()); |
||||
} |
||||
} |
||||
|
||||
public static void GuardWallArcherLogic(Mob mob) { |
||||
|
||||
try { |
||||
StaticBehaviours.checkToDropGuardAggro(mob); |
||||
|
||||
if (mob.getCombatTarget() == null) |
||||
StaticBehaviours.CheckForPlayerGuardAggro(mob); |
||||
else |
||||
StaticBehaviours.CheckForAttack(mob); |
||||
} catch (Exception e) { |
||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardWallArcherLogic" + " " + e.getMessage()); |
||||
} |
||||
} |
||||
|
||||
public static void MagisterCaptainLogic(Mob mob){ |
||||
try { |
||||
StaticBehaviours.checkToDropGuardAggro(mob); |
||||
if (mob.getCombatTarget() == null) |
||||
StaticBehaviours.CheckForPlayerGuardAggro(mob); |
||||
|
||||
AbstractWorldObject newTarget = StaticBehaviours.ChangeTargetFromHateValue(mob); |
||||
|
||||
if (newTarget != null) { |
||||
|
||||
if (newTarget.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) { |
||||
if (StaticBehaviours.GuardCanAggro(mob, (PlayerCharacter) newTarget)) |
||||
mob.setCombatTarget(newTarget); |
||||
} else |
||||
mob.setCombatTarget(newTarget); |
||||
|
||||
} |
||||
StaticBehaviours.CheckMobMovement(mob); |
||||
CheckForCast(mob); |
||||
} catch (Exception e) { |
||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardCaptainLogic" + " " + e.getMessage()); |
||||
} |
||||
} |
||||
|
||||
public static void MagisterMinionLogic(Mob mob){ |
||||
try { |
||||
StaticBehaviours.checkToDropGuardAggro(mob); |
||||
|
||||
boolean isComanded = mob.npcOwner.isAlive(); |
||||
if (!isComanded) { |
||||
MagisterCaptainLogic(mob); |
||||
}else { |
||||
if (mob.npcOwner.getCombatTarget() != null) |
||||
mob.setCombatTarget(mob.npcOwner.getCombatTarget()); |
||||
else |
||||
if (mob.getCombatTarget() != null) |
||||
mob.setCombatTarget(null); |
||||
} |
||||
StaticBehaviours.CheckMobMovement(mob); |
||||
CheckForCast(mob); |
||||
} catch (Exception e) { |
||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardMinionLogic" + " " + e.getMessage()); |
||||
} |
||||
} |
||||
|
||||
public static void CheckForCast(Mob mob){ |
||||
|
||||
} |
||||
} |
@ -0,0 +1,27 @@
@@ -0,0 +1,27 @@
|
||||
package engine.mobileAI.MobBehaviours; |
||||
|
||||
import engine.Enum; |
||||
import engine.objects.Mob; |
||||
|
||||
public class SiegeEngine { |
||||
|
||||
public static void run(Mob engine){ |
||||
|
||||
if(StaticBehaviours.EarlyExit(engine)) |
||||
return; |
||||
|
||||
if(engine.getOwner() == null) |
||||
return; |
||||
|
||||
if(engine.combatTarget == null) |
||||
return; |
||||
|
||||
if(engine.combatTarget.loc.distanceSquared(engine.loc) > engine.getRange() * engine.getRange()) |
||||
return; |
||||
|
||||
if(!engine.combatTarget.getObjectType().equals(Enum.GameObjectType.Building)) |
||||
return; |
||||
|
||||
StaticBehaviours.CheckForAttack(engine); |
||||
} |
||||
} |
@ -0,0 +1,53 @@
@@ -0,0 +1,53 @@
|
||||
package engine.mobileAI.MobBehaviours; |
||||
|
||||
import engine.Enum; |
||||
import engine.objects.AbstractWorldObject; |
||||
import engine.objects.Mob; |
||||
import org.pmw.tinylog.Logger; |
||||
|
||||
public class Standard { |
||||
|
||||
public static void run(Mob mob){ |
||||
|
||||
try { |
||||
|
||||
if(StaticBehaviours.EarlyExit(mob)) |
||||
return; |
||||
|
||||
//check for players that can be aggroed if mob is agressive and has no target
|
||||
|
||||
if (mob.getCombatTarget() != null && !mob.playerAgroMap.containsKey(mob.getCombatTarget().getObjectUUID())) |
||||
mob.setCombatTarget(null); |
||||
|
||||
if (mob.BehaviourType.isAgressive) { |
||||
|
||||
AbstractWorldObject newTarget = StaticBehaviours.ChangeTargetFromHateValue(mob); |
||||
|
||||
if (newTarget != null) |
||||
mob.setCombatTarget(newTarget); |
||||
else { |
||||
if (mob.getCombatTarget() == null) { |
||||
if (mob.BehaviourType == Enum.MobBehaviourType.HamletGuard) |
||||
StaticBehaviours.SafeGuardAggro(mob); //safehold guard
|
||||
else |
||||
StaticBehaviours.CheckForAggro(mob); //normal aggro
|
||||
} |
||||
} |
||||
} |
||||
|
||||
//check if mob can move for patrol or moving to target
|
||||
|
||||
if (mob.BehaviourType.canRoam) |
||||
StaticBehaviours.CheckMobMovement(mob); |
||||
|
||||
//check if mob can attack if it isn't wimpy
|
||||
|
||||
if (!mob.BehaviourType.isWimpy && mob.getCombatTarget() != null) |
||||
StaticBehaviours.CheckForAttack(mob); |
||||
|
||||
|
||||
} catch (Exception e) { |
||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: DefaultLogic" + " " + e.getMessage()); |
||||
} |
||||
} |
||||
} |
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue