Compare commits
305 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 93d80c0005 | |||
| 240198eec6 | |||
| dfe300ba4b | |||
| b48d294eca | |||
| be27262e47 | |||
| d1d51ef791 | |||
| e380c4dddb | |||
| f9a7b91868 | |||
| cb73a81e33 | |||
| 47f1aa8a89 | |||
| ca0738b6ed | |||
| 5fabd31495 | |||
| e90465ee8f | |||
| 1b1c636628 | |||
| 5f28d3ae10 | |||
| d0e93773ad | |||
| 2160719126 | |||
| 0449465af9 | |||
| 891e350362 | |||
| 942c37442e | |||
| 0571d5ded3 | |||
| 1f63df4f08 | |||
| eec07f3a28 | |||
| a199014a98 | |||
| 48f8cf32b7 | |||
| f28b15b95e | |||
| 8e5aec841d | |||
| 9b7bcdc043 | |||
| 2dbaac5bcf | |||
| 2f201151df | |||
| 3d48951184 | |||
| 3d199a9362 | |||
| c8a95cab41 | |||
| 43631af53b | |||
| 89e31fd159 | |||
| ffecdbb06b | |||
| 7331c870c2 | |||
| 4b760baae4 | |||
| 8106b100ec | |||
| 53285ca898 | |||
| 9db7411ee6 | |||
| a12687913e | |||
| 937656a91d | |||
| 5f2034a35b | |||
| 87d39ae29d | |||
| bd95a8d7af | |||
| 1fa9a88ae3 | |||
| 34e3ae20d7 | |||
| 55b6d60141 | |||
| 92d0aec77d | |||
| 1282f58a3c | |||
| 1070d61251 | |||
| f7ab5347ab | |||
| 517e64d613 | |||
| 5ed31c5e2e | |||
| c50bcb0a32 | |||
| 09a6e18d4f | |||
| b0dd7e9b59 | |||
| 92d685c3e3 | |||
| 84a1db1e09 | |||
| d0e3cac4c3 | |||
| 9a5fd53271 | |||
| 8d4fb261b5 | |||
| 4a7a999ed1 | |||
| e69c0f2799 | |||
| 9e36d558bf | |||
| df2271fe2c | |||
| 1f7d2a14bf | |||
| a99047aee8 | |||
| 5dc9e127bb | |||
| bb05bdd87c | |||
| 4c0b480aeb | |||
| 3cf38da567 | |||
| 96731bd9bb | |||
| 9d79afa395 | |||
| 944290f958 | |||
| e6eb753666 | |||
| 4ad7e0f021 | |||
| 8d587538e0 | |||
| 4ae64ab94c | |||
| c5e6205801 | |||
| 5a3f4e690f | |||
| 048474b014 | |||
| 24e01acff4 | |||
| a75670bf0e | |||
| d56d58492a | |||
| 7b33c1392a | |||
| 86c95f0eb5 | |||
| 6ed648d6d4 | |||
| c722450f65 | |||
| c3a7262a7f | |||
| d1c6d9edec | |||
| 1e865eecbc | |||
| 5f735a49c1 | |||
| e609c015b9 | |||
| 5a198669b9 | |||
| fe399664f3 | |||
| 3bc62e9baa | |||
| cf23266f31 | |||
| b097472402 | |||
| 57b18c2d15 | |||
| 040eef576e | |||
| d76403a0c8 | |||
| 8ce1054599 | |||
| 0daf8cfe4c | |||
| 898c4c2fa0 | |||
| ecba693105 | |||
| dbc0da20df | |||
| 354d0ab283 | |||
| c1b66269bb | |||
| 7981acb582 | |||
| 03448397ee | |||
| 685dc572e8 | |||
| 5a161a0808 | |||
| 3e4aad9db9 | |||
| 47981872be | |||
| daea835613 | |||
| 55923559cd | |||
| 9efde874f3 | |||
| 9b2b0073a5 | |||
| 33328f74db | |||
| 41023fb890 | |||
| 54a279c3e6 | |||
| 29aea83217 | |||
| 30d27f8a68 | |||
| 17e54ea4aa | |||
| 86c0bbb065 | |||
| ec4cad5e19 | |||
| b674625f7b | |||
| d57b45ef9c | |||
| 2a38c60a67 | |||
| cd1e38b184 | |||
| 69457d5f7e | |||
| 7728a800d9 | |||
| 8b2c018103 | |||
| 76d39f5cc3 | |||
| 826457fb25 | |||
| 0681d3d116 | |||
| ccdea6f970 | |||
| ab00fd7a85 | |||
| 70d67a2b7f | |||
| f5b27e0c5b | |||
| 3c26df5f86 | |||
| 9ed43b5891 | |||
| 4814404f1c | |||
| b1d41e8e85 | |||
| cc5aa4c140 | |||
| 934c0a98f8 | |||
| 91c2cd47fb | |||
| 22f14fb8f1 | |||
| 93a975dd42 | |||
| 7d1570fdca | |||
| 76db3e1f96 | |||
| afbe23fc03 | |||
| 4e417c8810 | |||
| d79c69658a | |||
| 0d125e2640 | |||
| e4a3405032 | |||
| c391272e5b | |||
| 0d3423d51b | |||
| 549ca25483 | |||
| 603d4ca3a8 | |||
| fababd3e42 | |||
| bec6230a06 | |||
| 773b6253b9 | |||
| 1ffcc1086b | |||
| 992d52a389 | |||
| 61088d0b59 | |||
| 601e97eaca | |||
| eae4675f85 | |||
| 84410114e7 | |||
| 70855acbcf | |||
| 2a8e0dea73 | |||
| 6c4f18218c | |||
| 0b5f469b13 | |||
| 68a43388ff | |||
| 5fe12df436 | |||
| caa0aa5172 | |||
| 37a81ed53e | |||
| 39afb33186 | |||
| 228152596c | |||
| d75a052bd3 | |||
| 81d6a55096 | |||
| 55d9cf6d26 | |||
| 9cf69ec73f | |||
| 4595582def | |||
| 0b2d598261 | |||
| cf342cd1a6 | |||
| 05bb323c0c | |||
| c415bb15e2 | |||
| eac58b086b | |||
| fea39ffa85 | |||
| fb8971ce86 | |||
| e44dd5e2cc | |||
| 3ed303bec4 | |||
| f4267c3c92 | |||
| c5f678ea0e | |||
| 4fe3d92b3f | |||
| 284fc7e37e | |||
| 402d69312c | |||
| 198648d3db | |||
| 3a01dbf5f6 | |||
| 0ec505e37f | |||
| 1e26d7f38c | |||
| 64f9f4d4b9 | |||
| 89c06f714f | |||
| 157d116626 | |||
| de229ddde5 | |||
| 8b456f66ef | |||
| 2e35e35a6e | |||
| cca078f017 | |||
| f658a30132 | |||
| 0a827d2404 | |||
| 806adee3de | |||
| bdd108065b | |||
| 8d41c5475c | |||
| 99ad461a82 | |||
| 9da56b4226 | |||
| beeca529cd | |||
| ebb765ae82 | |||
| 65e391f6f7 | |||
| ab45d92bd1 | |||
| a366c95941 | |||
| f2d9eb003c | |||
| bb1a99912c | |||
| fd30e52741 | |||
| 58a0b6150f | |||
| 9aa053beb6 | |||
| 7eb084efaa | |||
| 1568377725 | |||
| 7b32cfe235 | |||
| 7ef3efafd3 | |||
| ffdd79c497 | |||
| b156da7ded | |||
| 9278954f2f | |||
| 4324ebe855 | |||
| 4a69dca5cc | |||
| 2cc54b4002 | |||
| eac0aebd59 | |||
| 172dcfb6d8 | |||
| d320d83c22 | |||
| af2dd004e4 | |||
| dfbace76db | |||
| 119f762492 | |||
| e586c442c1 | |||
| c01e87ee8b | |||
| af4025d948 | |||
| b7c2b7a0d5 | |||
| f073a93d47 | |||
| 47914838f5 | |||
| 69e2630d77 | |||
| 08148c058c | |||
| a7ee8f553b | |||
| 8395bb80f1 | |||
| becd3cbf65 | |||
| 80ec681a2c | |||
| 96a80ce1b6 | |||
| f18cf5c8a6 | |||
| 4c21159553 | |||
| 475c0a9b09 | |||
| f80ad61179 | |||
| 10ccfb1086 | |||
| 44197fd83c | |||
| 0d9e03f848 | |||
| 810812d06b | |||
| 539d7f6e79 | |||
| 3358d9e943 | |||
| eeffd9b357 | |||
| b33f41200e | |||
| 030d1110b9 | |||
| 09af8084b9 | |||
| 0cff9524c2 | |||
| f6299f5b97 | |||
| b1250ae4e4 | |||
| a9144471b1 | |||
| 9f924da18b | |||
| aac92f1760 | |||
| fdf42bd913 | |||
| ecee2f2e8c | |||
| 1b487fdbb6 | |||
| bb7bd6d71b | |||
| 34178906a3 | |||
| c689722459 | |||
| 8e4ff8c67f | |||
| 4ff22d1d20 | |||
| 5ed7712aed | |||
| a6fcb5ea00 | |||
| 8f402c8c03 | |||
| 5761e313fd | |||
| 441771839a | |||
| ad6700974f | |||
| 499aec2c61 | |||
| ceed4c641a | |||
| 669c0b4cd7 | |||
| 7964de1045 | |||
| 961e2915b4 | |||
| 6c6a64fa98 | |||
| 7a8a751bca | |||
| 69bf6ef8cd | |||
| 05e542215d | |||
| 868eaab5ed | |||
| e7d22717cd | |||
| bbabf814e1 | |||
| 938fcb1352 | |||
| 42a71396cd |
@@ -150,7 +150,8 @@ public class Enum {
|
||||
NEPHFEMALE(2026, MonsterType.Nephilim, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.1f),
|
||||
HALFGIANTFEMALE(2027, MonsterType.HalfGiant, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.15f),
|
||||
VAMPMALE(2028, MonsterType.Vampire, RunSpeed.STANDARD, CharacterSex.MALE, 1),
|
||||
VAMPFEMALE(2029, MonsterType.Vampire, RunSpeed.STANDARD, CharacterSex.FEMALE, 1);
|
||||
VAMPFEMALE(2029, MonsterType.Vampire, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
|
||||
SAETOR(1999,MonsterType.Minotaur, RunSpeed.MINOTAUR, CharacterSex.MALE,1);
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private static HashMap<Integer, RaceType> _raceTypeByID = new HashMap<>();
|
||||
@@ -170,8 +171,6 @@ public class Enum {
|
||||
}
|
||||
|
||||
public static RaceType getRaceTypebyRuneID(int runeID) {
|
||||
if(runeID == 1999)
|
||||
return _raceTypeByID.get(2017);
|
||||
return _raceTypeByID.get(runeID);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,8 @@ import engine.Enum;
|
||||
import engine.Enum.GameObjectType;
|
||||
import engine.gameManager.ConfigManager;
|
||||
import engine.gameManager.DbManager;
|
||||
import engine.net.DispatchMessage;
|
||||
import engine.net.client.msg.chat.ChatSystemMsg;
|
||||
import engine.objects.Account;
|
||||
import engine.objects.PlayerCharacter;
|
||||
import org.pmw.tinylog.Logger;
|
||||
@@ -77,18 +79,24 @@ public class dbAccountHandler extends dbHandlerBase {
|
||||
}
|
||||
}
|
||||
|
||||
public void SET_TRASH(String machineID) {
|
||||
|
||||
public void SET_TRASH(String machineID, String type) {
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO dyn_trash(`machineID`, `count`)"
|
||||
+ " VALUES (?, 1) ON DUPLICATE KEY UPDATE `count` = `count` + 1;")) {
|
||||
PreparedStatement preparedStatement = connection.prepareStatement(
|
||||
"INSERT INTO dyn_trash(`machineID`, `count`, `type`)"
|
||||
+ " VALUES (?, 1, ?) ON DUPLICATE KEY UPDATE `count` = `count` + 1;")) {
|
||||
|
||||
preparedStatement.setString(1, machineID);
|
||||
preparedStatement.setString(2, type);
|
||||
preparedStatement.execute();
|
||||
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
|
||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, "Account: " + machineID + " has been kicked from game for cheating");
|
||||
chatMsg.setMessageType(10);
|
||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
||||
}
|
||||
|
||||
public ArrayList<String> GET_TRASH_LIST() {
|
||||
|
||||
@@ -22,6 +22,7 @@ import java.util.HashMap;
|
||||
|
||||
public class dbItemBaseHandler extends dbHandlerBase {
|
||||
|
||||
public static final HashMap<Integer,Float> dexReductions = new HashMap<>();
|
||||
public dbItemBaseHandler() {
|
||||
|
||||
}
|
||||
@@ -45,6 +46,14 @@ public class dbItemBaseHandler extends dbHandlerBase {
|
||||
}
|
||||
}
|
||||
|
||||
public void LOAD_DEX_REDUCTION(ItemBase itemBase) {
|
||||
if(dexReductions.containsKey(itemBase.getUUID())){
|
||||
itemBase.dexReduction = dexReductions.get(itemBase.getUUID());
|
||||
}else{
|
||||
itemBase.dexReduction = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
public void LOAD_ANIMATIONS(ItemBase itemBase) {
|
||||
|
||||
ArrayList<Integer> tempList = new ArrayList<>();
|
||||
@@ -94,6 +103,21 @@ public class dbItemBaseHandler extends dbHandlerBase {
|
||||
}
|
||||
|
||||
Logger.info("read: " + recordsRead + " cached: " + ItemBase.getUUIDCache().size());
|
||||
try (Connection connection = DbManager.getConnection();
|
||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_item_dexpenalty`")) {
|
||||
|
||||
ResultSet rs = preparedStatement.executeQuery();
|
||||
|
||||
// Check if a result was found
|
||||
if (rs.next()) {
|
||||
int ID = rs.getInt("ID");
|
||||
float factor = rs.getInt("item_bulk_factor");
|
||||
dexReductions.put(ID,factor);
|
||||
}
|
||||
|
||||
} catch (SQLException e) {
|
||||
Logger.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
public HashMap<Integer, ArrayList<Integer>> LOAD_RUNES_FOR_NPC_AND_MOBS() {
|
||||
|
||||
@@ -335,14 +335,18 @@ public class InfoCmd extends AbstractDevCmd {
|
||||
output += "Movement State: " + targetPC.getMovementState().name();
|
||||
output += newline;
|
||||
output += "Movement Speed: " + targetPC.getSpeed();
|
||||
|
||||
output += newline;
|
||||
output += "Altitude : " + targetPC.getLoc().y;
|
||||
|
||||
output += newline;
|
||||
output += "Swimming : " + targetPC.isSwimming();
|
||||
output += newline;
|
||||
output += "isMoving : " + targetPC.isMoving();
|
||||
output += newline;
|
||||
output += "Zerg Multiplier : " + targetPC.ZergMultiplier;
|
||||
output += "Zerg Multiplier : " + targetPC.ZergMultiplier + newline;
|
||||
output += "Hidden : " + targetPC.getHidden() + newline;
|
||||
output += "Target Loc: " + targetPC.loc + newline;
|
||||
output += "Player Loc: " + pc.loc + newline;
|
||||
output += "Distance Squared: " + pc.loc.distanceSquared(targetPC.loc);
|
||||
break;
|
||||
|
||||
case NPC:
|
||||
|
||||
@@ -49,6 +49,8 @@ public class PrintSkillsCmd extends AbstractDevCmd {
|
||||
+ skill.getModifiedAmount() + '('
|
||||
+ skill.getTotalSkillPercet() + " )");
|
||||
}
|
||||
//throwbackInfo(pc, "= = = = = NEW CALCULATIONS = = = = =");
|
||||
// PlayerCombatStats.PrintSkillsToClient(pc);
|
||||
} else
|
||||
throwbackInfo(pc, "Skills not found for player");
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ package engine.devcmd.cmds;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.devcmd.AbstractDevCmd;
|
||||
import engine.gameManager.PowersManager;
|
||||
import engine.objects.*;
|
||||
|
||||
import java.util.HashMap;
|
||||
@@ -57,27 +58,42 @@ public class PrintStatsCmd extends AbstractDevCmd {
|
||||
|
||||
public void printStatsPlayer(PlayerCharacter pc, PlayerCharacter tar) {
|
||||
String newline = "\r\n ";
|
||||
String out = "Server stats for Player " + tar.getFirstName() + newline;
|
||||
out += "Unused Stats: " + tar.getUnusedStatPoints() + newline;
|
||||
out += "Stats Base (Modified)" + newline;
|
||||
out += " Str: " + (int) tar.statStrBase + " (" + tar.getStatStrCurrent() + ')' + ", maxStr: " + tar.getStrMax() + newline;
|
||||
out += " Dex: " + (int) tar.statDexBase + " (" + tar.getStatDexCurrent() + ')' + ", maxDex: " + tar.getDexMax() + newline;
|
||||
out += " Con: " + (int) tar.statConBase + " (" + tar.getStatConCurrent() + ')' + ", maxCon: " + tar.getConMax() + newline;
|
||||
out += " Int: " + (int) tar.statIntBase + " (" + tar.getStatIntCurrent() + ')' + ", maxInt: " + tar.getIntMax() + newline;
|
||||
out += " Spi: " + (int) tar.statSpiBase + " (" + tar.getStatSpiCurrent() + ')' + ", maxSpi: " + tar.getSpiMax() + newline;
|
||||
throwbackInfo(pc, out);
|
||||
out = "Health: " + tar.getHealth() + ", maxHealth: " + tar.getHealthMax() + newline;
|
||||
out += "Mana: " + tar.getMana() + ", maxMana: " + tar.getManaMax() + newline;
|
||||
out += "Stamina: " + tar.getStamina() + ", maxStamina: " + tar.getStaminaMax() + newline;
|
||||
out += "Defense: " + tar.getDefenseRating() + newline;
|
||||
out += "Main Hand: atr: " + tar.getAtrHandOne() + ", damage: " + tar.getMinDamageHandOne() + " to " + tar.getMaxDamageHandOne() + ", speed: " + tar.getSpeedHandOne() + newline;
|
||||
out += "Off Hand: atr: " + tar.getAtrHandTwo() + ", damage: " + tar.getMinDamageHandTwo() + " to " + tar.getMaxDamageHandTwo() + ", speed: " + tar.getSpeedHandTwo() + newline;
|
||||
out += "isAlive: " + tar.isAlive() + ", Combat: " + tar.isCombat() + newline;
|
||||
out += "Move Speed: " + tar.getSpeed() + newline;
|
||||
out += "Health Regen: " + tar.getRegenModifier(Enum.ModType.HealthRecoverRate) + newline;
|
||||
out += "Mana Regen: " + tar.getRegenModifier(Enum.ModType.ManaRecoverRate) + newline;
|
||||
out += "Stamina Regen: " + tar.getRegenModifier(Enum.ModType.StaminaRecoverRate) + newline;
|
||||
throwbackInfo(pc, out);
|
||||
|
||||
String newOut = "Server stats for Player " + tar.getFirstName() + newline;
|
||||
newOut += "HEALTH: " + tar.getHealth() + " / " + tar.getHealthMax() + newline;
|
||||
newOut += "MANA: " + tar.getMana() + " / " + tar.getManaMax() + newline;
|
||||
newOut += "STAMINA: " + tar.getStamina() + " / " + tar.getStaminaMax() + newline;
|
||||
newOut += "Unused Stats: " + tar.getUnusedStatPoints() + newline;
|
||||
newOut += "Stats Base (Modified)" + newline;
|
||||
newOut += " Str: " + (int) tar.statStrBase + " (" + tar.getStatStrCurrent() + ')' + ", maxStr: " + tar.getStrMax() + newline;
|
||||
newOut += " Dex: " + (int) tar.statDexBase + " (" + tar.getStatDexCurrent() + ')' + ", maxDex: " + tar.getDexMax() + newline;
|
||||
newOut += " Con: " + (int) tar.statConBase + " (" + tar.getStatConCurrent() + ')' + ", maxCon: " + tar.getConMax() + newline;
|
||||
newOut += " Int: " + (int) tar.statIntBase + " (" + tar.getStatIntCurrent() + ')' + ", maxInt: " + tar.getIntMax() + newline;
|
||||
newOut += " Spi: " + (int) tar.statSpiBase + " (" + tar.getStatSpiCurrent() + ')' + ", maxSpi: " + tar.getSpiMax() + newline;
|
||||
newOut += "Move Speed: " + tar.getSpeed() + newline;
|
||||
newOut += "Health Regen: " + tar.combatStats.healthRegen + newline;
|
||||
newOut += "Mana Regen: " + tar.combatStats.manaRegen + newline;
|
||||
newOut += "Stamina Regen: " + tar.combatStats.staminaRegen + newline;
|
||||
newOut += "DEFENSE: " + tar.combatStats.defense + newline;
|
||||
newOut += "HAND ONE" + newline;
|
||||
newOut += "ATR: " + tar.combatStats.atrHandOne + newline;
|
||||
newOut += "MIN: " + tar.combatStats.minDamageHandOne + newline;
|
||||
newOut += "MAX: " + tar.combatStats.maxDamageHandOne + newline;
|
||||
newOut += "RANGE: " + tar.combatStats.rangeHandOne + newline;
|
||||
newOut += "ATTACK SPEED: " + tar.combatStats.attackSpeedHandOne + newline;
|
||||
newOut += "HAND TWO" + newline;
|
||||
newOut += "ATR: " + tar.combatStats.atrHandTwo + newline;
|
||||
newOut += "MIN: " + tar.combatStats.minDamageHandTwo + newline;
|
||||
newOut += "MAX: " + tar.combatStats.maxDamageHandTwo + newline;
|
||||
newOut += "RANGE: " + tar.combatStats.rangeHandTwo + newline;
|
||||
newOut += "ATTACK SPEED: " + tar.combatStats.attackSpeedHandTwo + newline;
|
||||
newOut += "=== POWERS ===" + newline;
|
||||
for(CharacterPower power : pc.getPowers().values()){
|
||||
if(power.getPower().requiresHitRoll) {
|
||||
newOut += power.getPower().name + " ATR: " + Math.round(PlayerCombatStats.getSpellAtr(pc,power.getPower())) + newline;
|
||||
}
|
||||
}
|
||||
throwbackInfo(pc, newOut);
|
||||
}
|
||||
|
||||
public void printStatsMob(PlayerCharacter pc, Mob tar) {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package engine.devcmd.cmds;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.devcmd.AbstractDevCmd;
|
||||
import engine.gameManager.LootManager;
|
||||
import engine.gameManager.ZoneManager;
|
||||
@@ -26,7 +27,52 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
||||
String newline = "\r\n ";
|
||||
|
||||
String output;
|
||||
if(target.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)){
|
||||
int ATR = Integer.parseInt(words[0]);
|
||||
int DEF = Integer.parseInt(words[1]);
|
||||
int attacks = Integer.parseInt(words[2]);
|
||||
|
||||
int hits = 0;
|
||||
int misses = 0;
|
||||
int defaultHits = 0;
|
||||
int defualtMisses = 0;
|
||||
|
||||
float chance = (ATR-((ATR+DEF) * 0.315f)) / ((DEF-((ATR+DEF) * 0.315f)) + (ATR-((ATR+DEF) * 0.315f)));
|
||||
float convertedChance = chance * 100;
|
||||
output = "" + newline;
|
||||
output += "DEF VS ATR SIMULATION: " + attacks + " ATTACKS SIMULATED" + newline;
|
||||
output += "DEF = " + DEF + newline;
|
||||
output += "ATR = " + ATR + newline;
|
||||
output += "CHANCE TO LAND HIT: " + convertedChance + "%" + newline;
|
||||
if(convertedChance < 5){
|
||||
output += "CHANCE ADJUSTED TO 5.0%" + newline;
|
||||
convertedChance = 5.0f;
|
||||
}
|
||||
if(convertedChance > 95){
|
||||
output += "CHANCE ADJUSTED TO 95.0%" + newline;
|
||||
convertedChance = 95.0f;
|
||||
}
|
||||
for(int i = 0; i < attacks; i++){
|
||||
int roll = ThreadLocalRandom.current().nextInt(101);
|
||||
|
||||
if(roll <= convertedChance){
|
||||
hits += 1;
|
||||
}else{
|
||||
misses += 1;
|
||||
}
|
||||
}
|
||||
|
||||
float totalHits = defaultHits + hits;
|
||||
float totalMisses = defualtMisses + misses;
|
||||
float hitPercent = Math.round(totalHits / attacks * 100);
|
||||
float missPercent = Math.round(totalMisses / attacks * 100);
|
||||
|
||||
output += "HITS LANDED: " + (defaultHits + hits) + "(" + Math.round(hitPercent) + "%)" + newline;
|
||||
output += "HITS MISSED: " + (defualtMisses + misses) + "(" + Math.round(missPercent) + "%)";
|
||||
|
||||
throwbackInfo(playerCharacter,output);
|
||||
return;
|
||||
}
|
||||
try
|
||||
{
|
||||
simCount = Integer.parseInt(words[0]);
|
||||
|
||||
@@ -27,6 +27,7 @@ import engine.objects.*;
|
||||
import engine.server.MBServerStatics;
|
||||
import engine.server.world.WorldServer;
|
||||
import engine.session.Session;
|
||||
import engine.util.KeyCloneAudit;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -84,6 +85,10 @@ public enum ChatManager {
|
||||
if ((checkTime > 0L) && (curMsgTime - checkTime < FLOOD_TIME_THRESHOLD))
|
||||
isFlood = true;
|
||||
|
||||
if(KeyCloneAudit.auditChatMsg(pc,msg.getMessage())){
|
||||
return;
|
||||
}
|
||||
|
||||
switch (protocolMsg) {
|
||||
case CHATSAY:
|
||||
ChatManager.chatSay(pc, msg.getMessage(), isFlood);
|
||||
|
||||
@@ -26,7 +26,6 @@ import engine.powers.effectmodifiers.WeaponProcEffectModifier;
|
||||
import engine.server.MBServerStatics;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
@@ -301,6 +300,17 @@ public enum CombatManager {
|
||||
if (target == null)
|
||||
return 0;
|
||||
|
||||
//pet to assist in attacking target
|
||||
if(abstractCharacter.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
PlayerCharacter attacker = (PlayerCharacter)abstractCharacter;
|
||||
if(attacker.getPet() != null){
|
||||
Mob pet = attacker.getPet();
|
||||
if(pet.combatTarget == null && pet.assist)
|
||||
pet.setCombatTarget(attacker.combatTarget);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//target must be valid type
|
||||
|
||||
if (AbstractWorldObject.IsAbstractCharacter(target)) {
|
||||
@@ -452,6 +462,17 @@ public enum CombatManager {
|
||||
|
||||
//Range check.
|
||||
|
||||
if(abstractCharacter.isMoving()){
|
||||
range += (abstractCharacter.getSpeed() * 0.1f);
|
||||
}
|
||||
|
||||
if(AbstractWorldObject.IsAbstractCharacter(target)) {
|
||||
AbstractCharacter tarAc = (AbstractCharacter) target;
|
||||
if(tarAc != null && tarAc.isMoving()){
|
||||
range += (tarAc.getSpeed() * 0.1f);
|
||||
}
|
||||
}
|
||||
|
||||
if (NotInRange(abstractCharacter, target, range)) {
|
||||
|
||||
//target is in stealth and can't be seen by source
|
||||
@@ -483,16 +504,24 @@ public enum CombatManager {
|
||||
createTimer(abstractCharacter, slot, 20, true); //2 second for no weapon
|
||||
else {
|
||||
int wepSpeed = (int) (wb.getSpeed());
|
||||
if(abstractCharacter.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
PlayerCharacter pc = (PlayerCharacter)abstractCharacter;
|
||||
if(slot == 1){
|
||||
wepSpeed = (int) pc.combatStats.attackSpeedHandOne;
|
||||
}else{
|
||||
wepSpeed = (int) pc.combatStats.attackSpeedHandTwo;
|
||||
}
|
||||
}else {
|
||||
|
||||
if (weapon != null && weapon.getBonusPercent(ModType.WeaponSpeed, SourceType.None) != 0f) //add weapon speed bonus
|
||||
wepSpeed *= (1 + weapon.getBonus(ModType.WeaponSpeed, SourceType.None));
|
||||
if (weapon != null && weapon.getBonusPercent(ModType.WeaponSpeed, SourceType.None) != 0f) //add weapon speed bonus
|
||||
wepSpeed *= (1 + weapon.getBonus(ModType.WeaponSpeed, SourceType.None));
|
||||
|
||||
if (abstractCharacter.getBonuses() != null && abstractCharacter.getBonuses().getFloatPercentAll(ModType.AttackDelay, SourceType.None) != 0f) //add effects speed bonus
|
||||
wepSpeed *= (1 + abstractCharacter.getBonuses().getFloatPercentAll(ModType.AttackDelay, SourceType.None));
|
||||
|
||||
if (wepSpeed < 10)
|
||||
wepSpeed = 10; //Old was 10, but it can be reached lower with legit buffs,effects.
|
||||
if (abstractCharacter.getBonuses() != null && abstractCharacter.getBonuses().getFloatPercentAll(ModType.AttackDelay, SourceType.None) != 0f) //add effects speed bonus
|
||||
wepSpeed *= (1 + abstractCharacter.getBonuses().getFloatPercentAll(ModType.AttackDelay, SourceType.None));
|
||||
|
||||
if (wepSpeed < 10)
|
||||
wepSpeed = 10; //Old was 10, but it can be reached lower with legit buffs,effects.
|
||||
}
|
||||
createTimer(abstractCharacter, slot, wepSpeed, true);
|
||||
}
|
||||
|
||||
@@ -537,14 +566,32 @@ public enum CombatManager {
|
||||
if (target == null)
|
||||
return;
|
||||
|
||||
if (mainHand) {
|
||||
atr = ac.getAtrHandOne();
|
||||
minDamage = ac.getMinDamageHandOne();
|
||||
maxDamage = ac.getMaxDamageHandOne();
|
||||
} else {
|
||||
atr = ac.getAtrHandTwo();
|
||||
minDamage = ac.getMinDamageHandTwo();
|
||||
maxDamage = ac.getMaxDamageHandTwo();
|
||||
if(ac.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
PlayerCharacter pc = (PlayerCharacter) ac;
|
||||
if( pc.combatStats == null){
|
||||
pc.combatStats = new PlayerCombatStats(pc);
|
||||
}
|
||||
pc.combatStats.calculateATR(true);
|
||||
pc.combatStats.calculateATR(false);
|
||||
if (mainHand) {
|
||||
atr = pc.combatStats.atrHandOne;
|
||||
minDamage = pc.combatStats.minDamageHandOne;
|
||||
maxDamage = pc.combatStats.maxDamageHandOne;
|
||||
} else {
|
||||
atr = pc.combatStats.atrHandTwo;
|
||||
minDamage = pc.combatStats.minDamageHandTwo;
|
||||
maxDamage = pc.combatStats.maxDamageHandTwo;
|
||||
}
|
||||
}else {
|
||||
if (mainHand) {
|
||||
atr = ac.getAtrHandOne();
|
||||
minDamage = ac.getMinDamageHandOne();
|
||||
maxDamage = ac.getMaxDamageHandOne();
|
||||
} else {
|
||||
atr = ac.getAtrHandTwo();
|
||||
minDamage = ac.getMinDamageHandTwo();
|
||||
maxDamage = ac.getMaxDamageHandTwo();
|
||||
}
|
||||
}
|
||||
|
||||
boolean tarIsRat = false;
|
||||
@@ -638,7 +685,12 @@ public enum CombatManager {
|
||||
}
|
||||
} else {
|
||||
AbstractCharacter tar = (AbstractCharacter) target;
|
||||
defense = tar.getDefenseRating();
|
||||
if(tar.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
((PlayerCharacter)tar).combatStats.calculateDefense();
|
||||
defense = ((PlayerCharacter)tar).combatStats.defense;
|
||||
}else {
|
||||
defense = tar.getDefenseRating();
|
||||
}
|
||||
handleRetaliate(tar, ac); //Handle target attacking back if in combat and has no other target
|
||||
}
|
||||
|
||||
@@ -647,7 +699,7 @@ public enum CombatManager {
|
||||
//Get hit chance
|
||||
|
||||
//int chance;
|
||||
float dif = atr - defense;
|
||||
//float dif = atr - defense;
|
||||
|
||||
//if (dif > 100)
|
||||
// chance = 94;
|
||||
@@ -692,6 +744,18 @@ public enum CombatManager {
|
||||
|
||||
PlayerBonuses bonus = ac.getBonuses();
|
||||
float attackRange = getWeaponRange(wb, bonus);
|
||||
|
||||
if(ac.isMoving()){
|
||||
attackRange += (ac.getSpeed() * 0.1f);
|
||||
}
|
||||
|
||||
if(AbstractWorldObject.IsAbstractCharacter(target)) {
|
||||
//AbstractCharacter tarAc = (AbstractCharacter) target;
|
||||
if(tarAc != null && tarAc.isMoving()){
|
||||
attackRange += (tarAc.getSpeed() * 0.1f);
|
||||
}
|
||||
}
|
||||
|
||||
if(specialCaseHitRoll(dpj.getPowerToken())) {
|
||||
if(hitLanded) {
|
||||
dpj.attack(target, attackRange);
|
||||
@@ -713,6 +777,18 @@ public enum CombatManager {
|
||||
|
||||
if (dpj != null && dpj.getPower() != null && (dpj.getPowerToken() == -1851459567 || dpj.getPowerToken() == -1851489518)) {
|
||||
float attackRange = getWeaponRange(wb, bonuses);
|
||||
|
||||
if(ac.isMoving()){
|
||||
attackRange += (ac.getSpeed() * 0.1f);
|
||||
}
|
||||
|
||||
if(AbstractWorldObject.IsAbstractCharacter(target)) {
|
||||
//AbstractCharacter tarAc = (AbstractCharacter) target;
|
||||
if(tarAc != null && tarAc.isMoving()){
|
||||
attackRange += (tarAc.getSpeed() * 0.1f);
|
||||
}
|
||||
}
|
||||
|
||||
if(specialCaseHitRoll(dpj.getPowerToken())) {
|
||||
if(hitLanded) {
|
||||
dpj.attack(target, attackRange);
|
||||
@@ -826,6 +902,22 @@ public enum CombatManager {
|
||||
else
|
||||
damage = calculateDamage(ac, tarAc, minDamage, maxDamage, damageType, resists);
|
||||
|
||||
if(weapon != null && weapon.effects != null){
|
||||
float armorPierce = 0;
|
||||
for(Effect eff : weapon.effects.values()){
|
||||
for(AbstractEffectModifier mod : eff.getEffectModifiers()){
|
||||
if(mod.modType.equals(ModType.ArmorPiercing)){
|
||||
armorPierce += mod.getPercentMod() + (mod.getRamp() * eff.getTrains());
|
||||
}
|
||||
}
|
||||
}
|
||||
if(armorPierce > 0){
|
||||
damage *= 1 + (armorPierce * 0.01f);
|
||||
}
|
||||
}
|
||||
|
||||
//Resists.handleFortitude(tarAc,damageType,damage);
|
||||
|
||||
float d = 0f;
|
||||
|
||||
errorTrack = 12;
|
||||
@@ -845,6 +937,8 @@ public enum CombatManager {
|
||||
if (tarAc.getHealth() > 0)
|
||||
d = tarAc.modifyHealth(-damage, ac, false);
|
||||
|
||||
tarAc.cancelOnTakeDamage();
|
||||
|
||||
} else if (target.getObjectType().equals(GameObjectType.Building)) {
|
||||
|
||||
if (BuildingManager.getBuildingFromCache(target.getObjectUUID()) == null) {
|
||||
@@ -878,27 +972,18 @@ public enum CombatManager {
|
||||
|
||||
if (weapon != null && tarAc != null && tarAc.isAlive()) {
|
||||
|
||||
ConcurrentHashMap<String, Effect> effects = weapon.getEffects();
|
||||
|
||||
for (Effect eff : effects.values()) {
|
||||
if (eff == null)
|
||||
continue;
|
||||
|
||||
HashSet<AbstractEffectModifier> aems = eff.getEffectModifiers();
|
||||
|
||||
if (aems != null) {
|
||||
for (AbstractEffectModifier aem : aems) {
|
||||
|
||||
if (!tarAc.isAlive())
|
||||
break;
|
||||
|
||||
if (aem instanceof WeaponProcEffectModifier) {
|
||||
|
||||
if(weapon.effects != null){
|
||||
for (Effect eff : weapon.effects.values()){
|
||||
for(AbstractEffectModifier mod : eff.getEffectModifiers()){
|
||||
if(mod.modType.equals(ModType.WeaponProc)){
|
||||
int procChance = ThreadLocalRandom.current().nextInt(100);
|
||||
|
||||
if (procChance < MBServerStatics.PROC_CHANCE)
|
||||
((WeaponProcEffectModifier) aem).applyProc(ac, target);
|
||||
|
||||
if (procChance < MBServerStatics.PROC_CHANCE) {
|
||||
try {
|
||||
((WeaponProcEffectModifier) mod).applyProc(ac, target);
|
||||
}catch(Exception e){
|
||||
Logger.error(eff.getName() + " Failed To Cast Proc");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -927,6 +1012,19 @@ public enum CombatManager {
|
||||
if (wp.requiresHitRoll() == false) {
|
||||
PlayerBonuses bonus = ac.getBonuses();
|
||||
float attackRange = getWeaponRange(wb, bonus);
|
||||
|
||||
if(ac.isMoving()){
|
||||
attackRange += (ac.getSpeed() * 0.1f);
|
||||
}
|
||||
|
||||
if(AbstractWorldObject.IsAbstractCharacter(target)) {
|
||||
AbstractCharacter tarAc = (AbstractCharacter) target;
|
||||
if(tarAc != null && tarAc.isMoving()){
|
||||
attackRange += (tarAc.getSpeed() * 0.1f);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(specialCaseHitRoll(dpj.getPowerToken())) {
|
||||
if(hitLanded) {
|
||||
dpj.attack(target, attackRange);
|
||||
@@ -971,6 +1069,12 @@ public enum CombatManager {
|
||||
|
||||
AbstractCharacter tar = (AbstractCharacter) target;
|
||||
|
||||
if(target.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
PlayerCharacter pc = (PlayerCharacter) target;
|
||||
if(pc.getRaceID() == 1999)
|
||||
return true;
|
||||
}
|
||||
|
||||
CharacterItemManager acItem = ac.getCharItemManager();
|
||||
CharacterItemManager tarItem = tar.getCharItemManager();
|
||||
|
||||
@@ -1040,10 +1144,12 @@ public enum CombatManager {
|
||||
|
||||
//calculate resists in if any
|
||||
|
||||
|
||||
|
||||
if (resists != null)
|
||||
return resists.getResistedDamage(source, target, damageType, damage, 0);
|
||||
else
|
||||
return damage;
|
||||
damage = resists.getResistedDamage(source, target, damageType, damage, 0);
|
||||
|
||||
return damage;
|
||||
}
|
||||
|
||||
private static void sendPassiveDefenseMessage(AbstractCharacter source, ItemBase wb, AbstractWorldObject target, int passiveType, DeferredPowerJob dpj, boolean mainHand) {
|
||||
@@ -1197,6 +1303,14 @@ public enum CombatManager {
|
||||
|
||||
private static boolean testPassive(AbstractCharacter source, AbstractCharacter target, String type) {
|
||||
|
||||
if(target.getBonuses() != null)
|
||||
if(target.getBonuses().getBool(ModType.Stunned, SourceType.None))
|
||||
return false;
|
||||
|
||||
if(source.getBonuses() != null)
|
||||
if(source.getBonuses().getBool(ModType.IgnorePassiveDefense, SourceType.None))
|
||||
return false;
|
||||
|
||||
float chance = target.getPassiveChance(type, source.getLevel(), true);
|
||||
|
||||
if (chance == 0f)
|
||||
@@ -1207,7 +1321,7 @@ public enum CombatManager {
|
||||
if (chance > 75f)
|
||||
chance = 75f;
|
||||
|
||||
int roll = ThreadLocalRandom.current().nextInt(100);
|
||||
int roll = ThreadLocalRandom.current().nextInt(1,100);
|
||||
|
||||
return roll < chance;
|
||||
|
||||
@@ -1385,9 +1499,9 @@ public enum CombatManager {
|
||||
|
||||
Resists resists = ac.getResists();
|
||||
|
||||
if (resists != null)
|
||||
if (resists != null) {
|
||||
amount = resists.getResistedDamage(target, ac, ds.getDamageType(), amount, 0);
|
||||
|
||||
}
|
||||
total += amount;
|
||||
}
|
||||
|
||||
@@ -1470,18 +1584,21 @@ public enum CombatManager {
|
||||
((AbstractCharacter) awo).getCharItemManager().damageRandomArmor(1);
|
||||
}
|
||||
|
||||
public static boolean LandHit(int C5, int D5){
|
||||
public static boolean LandHit(int ATR, int DEF){
|
||||
|
||||
float chance = (C5-((C5+D5)*.315f)) / ((D5-((C5+D5)*.315f)) + (C5-((C5+D5)*.315f)));
|
||||
int convertedChance = Math.round(chance * 100);
|
||||
//convertedChance = Math.max(5, Math.min(95, convertedChance));
|
||||
//float chance = (ATR-((ATR+DEF) * 0.315f)) / ((DEF-((ATR+DEF) * 0.315f)) + (ATR-((ATR+DEF) * 0.315f)));
|
||||
//float convertedChance = chance * 100;
|
||||
|
||||
int roll = ThreadLocalRandom.current().nextInt(101);
|
||||
|
||||
if(roll < 5)//always 5% chance ot miss
|
||||
return false;
|
||||
//if(roll <= 5)//always 5% chance to miss
|
||||
// return false;
|
||||
|
||||
return roll <= convertedChance;
|
||||
//if(roll >= 95)//always 5% chance to hit
|
||||
// return true;
|
||||
|
||||
float chance = PlayerCombatStats.getHitChance(ATR,DEF);
|
||||
return chance >= roll;
|
||||
}
|
||||
|
||||
public static boolean specialCaseHitRoll(int powerID){
|
||||
|
||||
@@ -98,7 +98,8 @@ public enum ConfigManager {
|
||||
MB_MAGICBOT_FORTOFIX,
|
||||
MB_MAGICBOT_RECRUIT,
|
||||
MB_MAGICBOT_MAGICBOX,
|
||||
MB_MAGICBOT_ADMINLOG;
|
||||
MB_MAGICBOT_ADMINLOG,
|
||||
MB_WORLD_BOXLIMIT;
|
||||
|
||||
// Map to hold our config pulled in from the environment
|
||||
// We also use the config to point to the current message pump
|
||||
|
||||
@@ -177,6 +177,11 @@ public enum DevCmdManager {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!pcSender.getTimestamps().containsKey("DEVCOMMAND"))
|
||||
pcSender.getTimestamps().put("DEVCOMMAND",System.currentTimeMillis() - 1500L);
|
||||
else if(System.currentTimeMillis() - pcSender.getTimestamps().get("DEVCOMMAND") < 1000L)
|
||||
return false;
|
||||
|
||||
//kill any commands not available to everyone on production server
|
||||
//only admin level can run dev commands on production
|
||||
boolean playerAllowed = false;
|
||||
@@ -189,6 +194,20 @@ public enum DevCmdManager {
|
||||
case "gimme":
|
||||
case "goto":
|
||||
case "teleportmode":
|
||||
case "printbonuses":
|
||||
playerAllowed = true;
|
||||
if (!a.status.equals(Enum.AccountStatus.ADMIN))
|
||||
target = pcSender;
|
||||
break;
|
||||
}
|
||||
}else{
|
||||
switch (adc.getMainCmdString()) {
|
||||
case "printresists":
|
||||
case "printstats":
|
||||
case "printskills":
|
||||
case "printpowers":
|
||||
case "printbonuses":
|
||||
//case "gimme":
|
||||
playerAllowed = true;
|
||||
if (!a.status.equals(Enum.AccountStatus.ADMIN))
|
||||
target = pcSender;
|
||||
|
||||
@@ -14,6 +14,7 @@ import engine.net.DispatchMessage;
|
||||
import engine.net.client.msg.ErrorPopupMsg;
|
||||
import engine.net.client.msg.chat.ChatSystemMsg;
|
||||
import engine.objects.*;
|
||||
import engine.server.MBServerStatics;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -42,6 +43,15 @@ public enum LootManager {
|
||||
public static final ArrayList<Integer> vorg_cloth_uuids = new ArrayList<>(Arrays.asList(27600,188700,188720,189550,189560));
|
||||
public static final ArrayList<Integer> racial_guard_uuids = new ArrayList<>(Arrays.asList(841,951,952,1050,1052,1180,1182,1250,1252,1350,1352,1450,1452,1500,1502,1525,1527,1550,1552,1575,1577,1600,1602,1650,1652,1700,980100,980102));
|
||||
|
||||
public static final ArrayList<Integer> static_rune_ids = new ArrayList<>(Arrays.asList(
|
||||
250001, 250002, 250003, 250004, 250005, 250006, 250007, 250008, 250010, 250011,
|
||||
250012, 250013, 250014, 250015, 250016, 250017, 250019, 250020, 250021, 250022,
|
||||
250023, 250024, 250025, 250026, 250028, 250029, 250030, 250031, 250032, 250033,
|
||||
250034, 250035, 250037, 250038, 250039, 250040, 250041, 250042, 250043, 250044,
|
||||
250115, 250118, 250119, 250120, 250121, 250122, 252123, 252124, 252125, 252126,
|
||||
252127
|
||||
));
|
||||
|
||||
// Drop Rates
|
||||
|
||||
public static float NORMAL_DROP_RATE;
|
||||
@@ -258,33 +268,40 @@ public enum LootManager {
|
||||
}
|
||||
|
||||
public static void SpecialCaseRuneDrop(Mob mob,ArrayList<BootySetEntry> entries){
|
||||
int lootTableID = 0;
|
||||
for(BootySetEntry entry : entries){
|
||||
if(entry.bootyType.equals("LOOT")){
|
||||
lootTableID = entry.genTable;
|
||||
break;
|
||||
}
|
||||
//int lootTableID = 0;
|
||||
//for(BootySetEntry entry : entries){
|
||||
// if(entry.bootyType.equals("LOOT")){
|
||||
// lootTableID = entry.genTable;
|
||||
// break;
|
||||
// }
|
||||
//}
|
||||
|
||||
// if(lootTableID == 0)
|
||||
// return;
|
||||
|
||||
//int RuneTableID = 0;
|
||||
//for(GenTableEntry entry : _genTables.get(lootTableID)){
|
||||
// try {
|
||||
// if (ItemBase.getItemBase(_itemTables.get(entry.itemTableID).get(0).cacheID).getType().equals(Enum.ItemType.RUNE)) {
|
||||
// RuneTableID = entry.itemTableID;
|
||||
// break;
|
||||
// }
|
||||
// }catch(Exception e){
|
||||
|
||||
// }
|
||||
//}
|
||||
|
||||
//if(RuneTableID == 0)
|
||||
// return;
|
||||
|
||||
int roll = ThreadLocalRandom.current().nextInt(static_rune_ids.size() + 1);
|
||||
int itemId = static_rune_ids.get(0);
|
||||
try {
|
||||
itemId = static_rune_ids.get(roll);
|
||||
}catch(Exception e){
|
||||
|
||||
}
|
||||
|
||||
if(lootTableID == 0)
|
||||
return;
|
||||
|
||||
int RuneTableID = 0;
|
||||
for(GenTableEntry entry : _genTables.get(lootTableID)){
|
||||
try {
|
||||
if (ItemBase.getItemBase(_itemTables.get(entry.itemTableID).get(0).cacheID).getType().equals(Enum.ItemType.RUNE)) {
|
||||
RuneTableID = entry.itemTableID;
|
||||
break;
|
||||
}
|
||||
}catch(Exception e){
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if(RuneTableID == 0)
|
||||
return;
|
||||
|
||||
ItemBase ib = ItemBase.getItemBase(rollRandomItem(RuneTableID));
|
||||
ItemBase ib = ItemBase.getItemBase(itemId);
|
||||
if(ib != null){
|
||||
MobLoot toAdd = new MobLoot(mob,ib,false);
|
||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
||||
@@ -460,7 +477,27 @@ public enum LootManager {
|
||||
if (suffixMod == null)
|
||||
return inItem;
|
||||
|
||||
if (suffixMod.action.length() > 0) {
|
||||
int moveSpeedRoll = ThreadLocalRandom.current().nextInt(100);
|
||||
if(inItem.getItemBase().getValidSlot() == MBServerStatics.SLOT_FEET && moveSpeedRoll < 10){
|
||||
int rankRoll = ThreadLocalRandom.current().nextInt(10);
|
||||
String suffixSpeed = "SUF-148";
|
||||
switch(rankRoll) {
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
suffixSpeed = "SUF-149";
|
||||
break;
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
suffixSpeed = "SUF-150";
|
||||
break;
|
||||
|
||||
}
|
||||
inItem.setSuffix(suffixSpeed);
|
||||
inItem.addPermanentEnchantment(suffixSpeed, 0, suffixMod.level, false);
|
||||
}else if (suffixMod.action.length() > 0) {
|
||||
inItem.setSuffix(suffixMod.action);
|
||||
inItem.addPermanentEnchantment(suffixMod.action, 0, suffixMod.level, false);
|
||||
}
|
||||
@@ -572,7 +609,7 @@ public enum LootManager {
|
||||
ItemBase itemBase = me.getItemBase();
|
||||
if(isVorg) {
|
||||
mob.spawnTime = ThreadLocalRandom.current().nextInt(300, 2700);
|
||||
dropChance = 10;
|
||||
dropChance = 7.5f;
|
||||
itemBase = getRandomVorg(itemBase);
|
||||
}
|
||||
if (equipmentRoll > dropChance)
|
||||
@@ -605,6 +642,82 @@ public enum LootManager {
|
||||
}
|
||||
}
|
||||
|
||||
public static void newFatePeddler(PlayerCharacter playerCharacter, Item gift) {
|
||||
|
||||
CharacterItemManager itemMan = playerCharacter.getCharItemManager();
|
||||
|
||||
if (itemMan == null)
|
||||
return;
|
||||
|
||||
//check if player owns the gift he is trying to open
|
||||
|
||||
if (!itemMan.doesCharOwnThisItem(gift.getObjectUUID()))
|
||||
return;
|
||||
|
||||
ItemBase ib = gift.getItemBase();
|
||||
|
||||
MobLoot winnings = null;
|
||||
|
||||
if (ib == null)
|
||||
return;
|
||||
switch (ib.getUUID()) {
|
||||
case 971070: //wrapped rune
|
||||
ItemBase runeBase = null;
|
||||
int roll = ThreadLocalRandom.current().nextInt(static_rune_ids.size() + 1);
|
||||
int itemId = static_rune_ids.get(0);
|
||||
try {
|
||||
itemId = static_rune_ids.get(roll);
|
||||
}catch(Exception e){
|
||||
|
||||
}
|
||||
runeBase = ItemBase.getItemBase(itemId);
|
||||
if(runeBase != null) {
|
||||
winnings = new MobLoot(playerCharacter, runeBase, 1, false);
|
||||
}
|
||||
break;
|
||||
case 971012: //wrapped glass
|
||||
int chance = ThreadLocalRandom.current().nextInt(100);
|
||||
if(chance == 50){
|
||||
int ID = 7000000;
|
||||
int additional = ThreadLocalRandom.current().nextInt(0,28);
|
||||
ID += (additional * 10);
|
||||
ItemBase glassBase = ItemBase.getItemBase(ID);
|
||||
if(glassBase != null) {
|
||||
winnings = new MobLoot(playerCharacter, glassBase, 1, false);
|
||||
ChatManager.chatSystemInfo(playerCharacter, "You've Won A " + glassBase.getName());
|
||||
}
|
||||
}else{
|
||||
ChatManager.chatSystemInfo(playerCharacter, "Please Try Again!");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (winnings == null) {
|
||||
itemMan.consume(gift);
|
||||
itemMan.updateInventory();
|
||||
return;
|
||||
}
|
||||
|
||||
//early exit if the inventory of the player will not hold the item
|
||||
|
||||
if (!itemMan.hasRoomInventory(winnings.getItemBase().getWeight())) {
|
||||
ErrorPopupMsg.sendErrorPopup(playerCharacter, 21);
|
||||
return;
|
||||
}
|
||||
|
||||
winnings.setIsID(true);
|
||||
|
||||
//remove gift from inventory
|
||||
|
||||
itemMan.consume(gift);
|
||||
|
||||
//add winnings to player inventory
|
||||
|
||||
Item playerWinnings = winnings.promoteToItem(playerCharacter);
|
||||
itemMan.addItemToInventory(playerWinnings);
|
||||
itemMan.updateInventory();
|
||||
|
||||
}
|
||||
public static void peddleFate(PlayerCharacter playerCharacter, Item gift) {
|
||||
|
||||
//get table ID for the itembase ID
|
||||
@@ -708,7 +821,7 @@ public enum LootManager {
|
||||
public static ItemBase getRandomVorg(ItemBase itemBase){
|
||||
int roll = 0;
|
||||
if(vorg_ha_uuids.contains(itemBase.getUUID())) {
|
||||
roll = ThreadLocalRandom.current().nextInt(0, 10);
|
||||
roll = ThreadLocalRandom.current().nextInt(0, 9);
|
||||
switch (roll) {
|
||||
case 1:
|
||||
return ItemBase.getItemBase(vorg_ha_uuids.get(0));
|
||||
@@ -732,7 +845,7 @@ public enum LootManager {
|
||||
}
|
||||
|
||||
if(vorg_ma_uuids.contains(itemBase.getUUID())) {
|
||||
roll = ThreadLocalRandom.current().nextInt(0, 10);
|
||||
roll = ThreadLocalRandom.current().nextInt(0, 8);
|
||||
switch (roll) {
|
||||
case 1:
|
||||
return ItemBase.getItemBase(vorg_ma_uuids.get(0));
|
||||
@@ -754,7 +867,7 @@ public enum LootManager {
|
||||
}
|
||||
|
||||
if(vorg_la_uuids.contains(itemBase.getUUID())) {
|
||||
roll = ThreadLocalRandom.current().nextInt(0, 10);
|
||||
roll = ThreadLocalRandom.current().nextInt(0, 8);
|
||||
switch (roll) {
|
||||
case 1:
|
||||
return ItemBase.getItemBase(vorg_la_uuids.get(0));
|
||||
@@ -776,7 +889,7 @@ public enum LootManager {
|
||||
}
|
||||
|
||||
if(vorg_cloth_uuids.contains(itemBase.getUUID())) {
|
||||
roll = ThreadLocalRandom.current().nextInt(0, 10);
|
||||
roll = ThreadLocalRandom.current().nextInt(0, 5);
|
||||
switch (roll) {
|
||||
case 1:
|
||||
return ItemBase.getItemBase(vorg_cloth_uuids.get(0));
|
||||
|
||||
@@ -67,8 +67,10 @@ public enum MovementManager {
|
||||
return;
|
||||
|
||||
if (toMove.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
||||
if (((PlayerCharacter) toMove).isCasting())
|
||||
((PlayerCharacter) toMove).update(false);
|
||||
if (((PlayerCharacter) toMove).isCasting()) {
|
||||
((PlayerCharacter) toMove).updateLocation();
|
||||
((PlayerCharacter) toMove).updateMovementState();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -408,7 +410,9 @@ public enum MovementManager {
|
||||
if (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotMove, SourceType.None))
|
||||
continue;
|
||||
|
||||
member.update(false);
|
||||
//member.update(false);
|
||||
member.updateLocation();
|
||||
member.updateMovementState();
|
||||
|
||||
|
||||
// All checks passed, let's move the player
|
||||
|
||||
@@ -10,6 +10,7 @@ package engine.gameManager;
|
||||
|
||||
import engine.Enum.*;
|
||||
import engine.InterestManagement.HeightMap;
|
||||
import engine.InterestManagement.InterestManager;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.db.handlers.dbEffectsBaseHandler;
|
||||
import engine.db.handlers.dbPowerHandler;
|
||||
@@ -165,12 +166,26 @@ public enum PowersManager {
|
||||
|
||||
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
|
||||
|
||||
if(pc == null)
|
||||
return;
|
||||
|
||||
if(!pc.isFlying() && powersBaseByToken.get(msg.getPowerUsedID()) != null && powersBaseByToken.get(msg.getPowerUsedID()).isSpell) //cant be sitting if flying
|
||||
CombatManager.toggleSit(false,origin);
|
||||
|
||||
if(pc.isMoving())
|
||||
pc.stopMovement(pc.getMovementLoc());
|
||||
|
||||
if(msg.getPowerUsedID() == 429429978){
|
||||
applyPower(origin.getPlayerCharacter(),origin.getPlayerCharacter(),origin.getPlayerCharacter().getLoc(),429429978,msg.getNumTrains(),false);
|
||||
origin.getPlayerCharacter().getRecycleTimers().remove(429429978);
|
||||
return;
|
||||
}
|
||||
|
||||
if(!origin.getPlayerCharacter().getPowers().containsKey(msg.getPowerUsedID())){
|
||||
Logger.error(origin.getPlayerCharacter().getFirstName() + " attempted to cast a power they do not have");
|
||||
return;
|
||||
}
|
||||
|
||||
if (usePowerA(msg, origin, sendCastToSelf)) {
|
||||
// Cast failed for some reason, reset timer
|
||||
|
||||
@@ -197,7 +212,8 @@ public enum PowersManager {
|
||||
msg.setUnknown04(1);
|
||||
|
||||
if (useMobPowerA(msg, caster)) {
|
||||
//sendMobPowerMsg(caster,2,msg); //Lol wtf was i thinking sending msg's to mobs... ZZZZ
|
||||
if(pb.token == -1994153779)
|
||||
InterestManager.setObjectDirty(caster);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -216,16 +232,16 @@ public enum PowersManager {
|
||||
City city = ZoneManager.getCityAtLocation(playerCharacter.loc);
|
||||
if (city == null) {
|
||||
failed = true;
|
||||
}else{
|
||||
Bane bane = city.getBane();
|
||||
if (bane == null) {
|
||||
failed = true;
|
||||
}else{
|
||||
if(!bane.getSiegePhase().equals(SiegePhase.WAR)){
|
||||
failed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}//else{
|
||||
// Bane bane = city.getBane();
|
||||
// if (bane == null) {
|
||||
// failed = true;
|
||||
// }else{
|
||||
// if(!bane.getSiegePhase().equals(SiegePhase.WAR)){
|
||||
// failed = true;
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
if(failed){
|
||||
//check to see if we are at an active mine
|
||||
Zone zone = ZoneManager.findSmallestZone(playerCharacter.loc);
|
||||
@@ -242,8 +258,15 @@ public enum PowersManager {
|
||||
}
|
||||
}
|
||||
|
||||
if(failed)
|
||||
if(failed) {
|
||||
playerCharacter.setIsCasting(false);
|
||||
|
||||
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
|
||||
Dispatch dispatch = Dispatch.borrow(playerCharacter, recyclePowerMsg);
|
||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (MBServerStatics.POWERS_DEBUG) {
|
||||
@@ -329,17 +352,18 @@ public enum PowersManager {
|
||||
|
||||
|
||||
// Check powers for normal users
|
||||
if (playerCharacter.getPowers() == null || !playerCharacter.getPowers().containsKey(msg.getPowerUsedID()))
|
||||
if (!playerCharacter.isCSR()) {
|
||||
if (!MBServerStatics.POWERS_DEBUG) {
|
||||
// ChatManager.chatSayInfo(pc, "You may not cast that spell!");
|
||||
|
||||
Logger.info("usePowerA(): Cheat attempted? '" + msg.getPowerUsedID() + "' was not associated with " + playerCharacter.getName());
|
||||
return true;
|
||||
}
|
||||
} else
|
||||
CSRCast = true;
|
||||
if(msg.getPowerUsedID() != 421084024) {
|
||||
if (playerCharacter.getPowers() == null || !playerCharacter.getPowers().containsKey(msg.getPowerUsedID()))
|
||||
if (!playerCharacter.isCSR()) {
|
||||
if (!MBServerStatics.POWERS_DEBUG) {
|
||||
// ChatManager.chatSayInfo(pc, "You may not cast that spell!");
|
||||
|
||||
Logger.info("usePowerA(): Cheat attempted? '" + msg.getPowerUsedID() + "' was not associated with " + playerCharacter.getName());
|
||||
return true;
|
||||
}
|
||||
} else
|
||||
CSRCast = true;
|
||||
}
|
||||
// get numTrains for power
|
||||
int trains = msg.getNumTrains();
|
||||
|
||||
@@ -492,6 +516,23 @@ public enum PowersManager {
|
||||
}
|
||||
}
|
||||
|
||||
if(!passed){
|
||||
if (playerCharacter.getRace().getName().contains("Shade")) {
|
||||
if(playerCharacter.getHidden() > 0){
|
||||
switch(msg.getPowerUsedID()){
|
||||
case -1851459567:
|
||||
case 2094922127:
|
||||
case -355707373:
|
||||
case 246186475:
|
||||
case 666419835:
|
||||
case 1480354319:
|
||||
passed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!passed)
|
||||
return true;
|
||||
}
|
||||
@@ -790,15 +831,35 @@ public enum PowersManager {
|
||||
if (playerCharacter == null || msg == null)
|
||||
return;
|
||||
|
||||
if(msg.getPowerUsedID() == 429005674){ //bard sprint
|
||||
//use sprint instead of ballad of beregund the bold
|
||||
//applyPower(playerCharacter,playerCharacter,playerCharacter.loc,429611355,msg.getNumTrains(),false);
|
||||
//handle sprint for bard sprint
|
||||
if(msg.getPowerUsedID() == 429005674){
|
||||
msg.setPowerUsedID(429611355);
|
||||
}
|
||||
if(msg.getPowerUsedID() == 429494441) {//wildkins chase
|
||||
|
||||
//handle root and snare break for wildkin's chase
|
||||
if(msg.getPowerUsedID() == 429494441) {
|
||||
playerCharacter.removeEffectBySource(EffectSourceType.Root,40,true);
|
||||
playerCharacter.removeEffectBySource(EffectSourceType.Snare,40,true);
|
||||
}
|
||||
|
||||
//handle power block portion for shade hide
|
||||
if(playerCharacter.getRace().getName().contains("Shade")) {
|
||||
if (msg.getPowerUsedID() == 429407306 || msg.getPowerUsedID() == 429495514) {
|
||||
int trains = msg.getNumTrains() - 1;
|
||||
if (trains < 1)
|
||||
trains = 1;
|
||||
applyPower(playerCharacter, playerCharacter, playerCharacter.loc, 429397210, trains, false);
|
||||
playerCharacter.removeEffectBySource(EffectSourceType.Invisibility,40,true);
|
||||
applyPower(playerCharacter, playerCharacter, playerCharacter.loc, msg.getPowerUsedID(), msg.getNumTrains(), false);
|
||||
}
|
||||
}
|
||||
if(msg.getTargetType() == GameObjectType.PlayerCharacter.ordinal()) {
|
||||
PlayerCharacter target = PlayerCharacter.getPlayerCharacter(msg.getTargetID());
|
||||
if (msg.getPowerUsedID() == 429601664)
|
||||
if(target.getPromotionClassID() != 2516)//templar
|
||||
PlayerCharacter.getPlayerCharacter(msg.getTargetID()).removeEffectBySource(EffectSourceType.Transform, msg.getNumTrains(), true);
|
||||
}
|
||||
|
||||
if (playerCharacter.isCasting()) {
|
||||
playerCharacter.update(false);
|
||||
playerCharacter.updateStamRegen(-100);
|
||||
@@ -840,6 +901,9 @@ public enum PowersManager {
|
||||
return;
|
||||
}
|
||||
|
||||
if(pb.targetSelf)
|
||||
msg.setTargetID(playerCharacter.getObjectUUID());
|
||||
|
||||
int trains = msg.getNumTrains();
|
||||
|
||||
// verify player is not stunned or power type is blocked
|
||||
@@ -1567,17 +1631,28 @@ public enum PowersManager {
|
||||
|
||||
// create list of characters
|
||||
HashSet<AbstractCharacter> trackChars;
|
||||
switch(msg.getPowerToken()){
|
||||
case 431511776:
|
||||
case 429578587:
|
||||
case 429503360:
|
||||
trackChars = getTrackList(playerCharacter);
|
||||
break;
|
||||
default:
|
||||
trackChars = RangeBasedAwo.getTrackList(allTargets, playerCharacter, maxTargets);
|
||||
break;
|
||||
|
||||
PowersBase trackPower = PowersManager.getPowerByToken(msg.getPowerToken());
|
||||
if(trackPower != null && trackPower.category.equals("TRACK")){
|
||||
trackChars = getTrackList(playerCharacter);
|
||||
}else{
|
||||
trackChars = RangeBasedAwo.getTrackList(allTargets, playerCharacter, maxTargets);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//switch(msg.getPowerToken()){
|
||||
// case 431511776: // Hunt Foe Huntress
|
||||
// case 429578587: // Hunt Foe Scout
|
||||
// case 429503360: // Track Huntsman
|
||||
// case 44106356: //
|
||||
// trackChars = getTrackList(playerCharacter);
|
||||
// break;
|
||||
// default:
|
||||
// trackChars = RangeBasedAwo.getTrackList(allTargets, playerCharacter, maxTargets);
|
||||
// break;
|
||||
//}
|
||||
|
||||
TrackWindowMsg trackWindowMsg = new TrackWindowMsg(msg);
|
||||
|
||||
// send track window
|
||||
@@ -2368,7 +2443,8 @@ public enum PowersManager {
|
||||
public static boolean testAttack(PlayerCharacter pc, AbstractWorldObject awo,
|
||||
PowersBase pb, PerformActionMsg msg) {
|
||||
// Get defense for target
|
||||
float atr = CharacterSkill.getATR(pc, pb.getSkillName());
|
||||
//float atr = CharacterSkill.getATR(pc, pb.getSkillName());
|
||||
float atr = PlayerCombatStats.getSpellAtr(pc, pb);
|
||||
float defense;
|
||||
|
||||
if (AbstractWorldObject.IsAbstractCharacter(awo)) {
|
||||
@@ -2409,6 +2485,13 @@ public enum PowersManager {
|
||||
dodgeMsg.setTargetID(awo.getObjectUUID());
|
||||
sendPowerMsg(pc, 4, dodgeMsg);
|
||||
return true;
|
||||
} else if (testPassive(pc, tarAc, "Block")) {
|
||||
// Dodge fired, send dodge message
|
||||
PerformActionMsg dodgeMsg = new PerformActionMsg(msg);
|
||||
dodgeMsg.setTargetType(awo.getObjectType().ordinal());
|
||||
dodgeMsg.setTargetID(awo.getObjectUUID());
|
||||
sendPowerMsg(pc, 4, dodgeMsg);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
@@ -2456,7 +2539,12 @@ public enum PowersManager {
|
||||
if (AbstractWorldObject.IsAbstractCharacter(awo)) {
|
||||
AbstractCharacter tarAc = (AbstractCharacter) awo;
|
||||
// Handle Dodge passive
|
||||
return testPassive(caster, tarAc, "Dodge");
|
||||
boolean passiveFired = false;
|
||||
passiveFired = testPassive(caster, tarAc, "Dodge");
|
||||
if(!passiveFired)
|
||||
passiveFired = testPassive(caster, tarAc, "Block");
|
||||
|
||||
return passiveFired;
|
||||
}
|
||||
return false;
|
||||
} else
|
||||
@@ -2958,6 +3046,10 @@ public enum PowersManager {
|
||||
case 429517915:
|
||||
case 431854842:
|
||||
case 429767544:
|
||||
case 429502507:
|
||||
case 428398816:
|
||||
case 429446315:
|
||||
case 429441979:
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
@@ -93,13 +93,10 @@ public enum SimulationManager {
|
||||
}
|
||||
try {
|
||||
|
||||
if ((_updatePulseTime != 0)
|
||||
&& (System.currentTimeMillis() > _updatePulseTime))
|
||||
if ((_updatePulseTime != 0) && (System.currentTimeMillis() > _updatePulseTime))
|
||||
pulseUpdate();
|
||||
} catch (Exception e) {
|
||||
Logger.error(
|
||||
"Fatal error in Update Pulse: DISABLED");
|
||||
// _runegatePulseTime = 0;
|
||||
Logger.error("Fatal error in Update Pulse: DISABLED");
|
||||
}
|
||||
|
||||
try {
|
||||
@@ -160,7 +157,11 @@ public enum SimulationManager {
|
||||
|
||||
if (player == null)
|
||||
continue;
|
||||
player.update(false);
|
||||
try {
|
||||
player.update(false);
|
||||
}catch(Exception e){
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
_updatePulseTime = System.currentTimeMillis() + 500;
|
||||
|
||||
@@ -68,7 +68,7 @@ public abstract class AbstractJob implements Runnable {
|
||||
this.markStopRunTime();
|
||||
}
|
||||
|
||||
protected abstract void doJob();
|
||||
public abstract void doJob();
|
||||
|
||||
public void executeJob(String threadName) {
|
||||
this.workerID.set(threadName);
|
||||
|
||||
@@ -17,7 +17,7 @@ public abstract class AbstractScheduleJob extends AbstractJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected abstract void doJob();
|
||||
public abstract void doJob();
|
||||
|
||||
public void cancelJob() {
|
||||
JobScheduler.getInstance().cancelScheduledJob(this);
|
||||
|
||||
@@ -16,7 +16,7 @@ public class JobContainer implements Comparable<JobContainer> {
|
||||
final long timeOfExecution;
|
||||
final boolean noTimer;
|
||||
|
||||
JobContainer(AbstractJob job, long timeOfExecution) {
|
||||
public JobContainer(AbstractJob job, long timeOfExecution) {
|
||||
if (job == null) {
|
||||
throw new IllegalArgumentException("No 'null' jobs allowed.");
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -58,10 +58,13 @@ public class JobWorker extends ControlledRunnable {
|
||||
} else {
|
||||
|
||||
// execute the new job..
|
||||
this.currentJob.executeJob(this.getThreadName());
|
||||
this.currentJob = null;
|
||||
//this.currentJob.executeJob(this.getThreadName());
|
||||
if(this.currentJob != null) {
|
||||
JobThread.startJobThread(this.currentJob);
|
||||
this.currentJob = null;
|
||||
}
|
||||
}
|
||||
|
||||
Thread.yield();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ public abstract class AbstractEffectJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected abstract void doJob();
|
||||
public abstract void doJob();
|
||||
|
||||
@Override
|
||||
protected abstract void _cancelJob();
|
||||
|
||||
@@ -29,7 +29,7 @@ public class ActivateBaneJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
City city;
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ public class AttackJob extends AbstractJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
CombatManager.doCombat(this.source, slot);
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ public class BaneDefaultTimeJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
//bane already set.
|
||||
if (this.bane.getLiveDate() != null) {
|
||||
|
||||
@@ -97,7 +97,7 @@ public class BasicScheduledJob extends AbstractJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (execution == null) {
|
||||
Logger.error("BasicScheduledJob executed with nothing to execute.");
|
||||
return;
|
||||
|
||||
@@ -22,7 +22,7 @@ public class BonusCalcJob extends AbstractJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (this.ac != null) {
|
||||
this.ac.applyBonuses();
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ public class CSessionCleanupJob extends AbstractJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
SessionManager.cSessionCleanup(secKey);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ public class ChangeAltitudeJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (this.ac != null)
|
||||
MovementManager.finishChangeAltitude(ac, targetAlt);
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ public class ChantJob extends AbstractEffectJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (this.aej == null || this.source == null || this.target == null || this.action == null || this.power == null || this.source == null || this.eb == null)
|
||||
return;
|
||||
PlayerBonuses bonuses = null;
|
||||
|
||||
@@ -29,7 +29,7 @@ public class CloseGateJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (building == null) {
|
||||
Logger.error("Rungate building was null");
|
||||
|
||||
@@ -37,7 +37,7 @@ public class DamageOverTimeJob extends AbstractEffectJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (this.target.getObjectType().equals(GameObjectType.Building)
|
||||
&& ((Building) this.target).isVulnerable() == false) {
|
||||
_cancelJob();
|
||||
@@ -60,6 +60,8 @@ public class DamageOverTimeJob extends AbstractEffectJob {
|
||||
|
||||
if (this.iteration < 0) {
|
||||
PowersManager.finishEffectTime(this.source, this.target, this.action, this.trains);
|
||||
if (AbstractWorldObject.IsAbstractCharacter(source))
|
||||
eb.startEffect((AbstractCharacter) this.source, this.target, this.trains, this);
|
||||
return;
|
||||
}
|
||||
this.skipSendEffect = true;
|
||||
|
||||
@@ -28,7 +28,7 @@ public class DatabaseUpdateJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (this.ago == null)
|
||||
return;
|
||||
ago.removeDatabaseJob(this.type, false);
|
||||
|
||||
@@ -29,7 +29,7 @@ public class DebugTimerJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (this.pc == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ public class DeferredPowerJob extends AbstractEffectJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
//Power ended with no attack, cancel weapon power boost
|
||||
if (this.source != null && this.source instanceof PlayerCharacter) {
|
||||
((PlayerCharacter) this.source).setWeaponPower(null);
|
||||
|
||||
@@ -22,7 +22,7 @@ public class DisconnectJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (this.origin != null) {
|
||||
this.origin.disconnect();
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ public class DoorCloseJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
int doorNumber;
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ public class EndFearJob extends AbstractEffectJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
//cancel fear for mob.
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ public class FinishCooldownTimeJob extends AbstractJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
PowersManager.finishCooldownTime(this.msg, this.pc);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ public class FinishEffectTimeJob extends AbstractEffectJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
PowersManager.finishEffectTime(this.source, this.target, this.action, this.trains);
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ public class FinishRecycleTimeJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
PowersManager.finishRecycleTime(this.msg, this.pc, false);
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ public class FinishSpireEffectJob extends AbstractEffectJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
PlayerCharacter pc = (PlayerCharacter) target;
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ public class FinishSummonsJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (this.target == null)
|
||||
return;
|
||||
|
||||
@@ -28,7 +28,7 @@ public class LoadEffectsJob extends AbstractJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (this.originToSend == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ public class LogoutCharacterJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
server.logoutCharacter(this.pc);
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ public class NoTimeJob extends AbstractEffectJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -40,7 +40,7 @@ public class PersistentAoeJob extends AbstractEffectJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (this.aej == null || this.source == null || this.action == null || this.power == null || this.source == null || this.eb == null)
|
||||
return;
|
||||
|
||||
@@ -45,7 +45,7 @@ public class RefreshGroupJob extends AbstractJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (this.pc == null || this.origin == null || grp == null) {
|
||||
return;
|
||||
|
||||
@@ -22,7 +22,7 @@ public class RemoveCorpseJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (this.corpse != null)
|
||||
Corpse.removeCorpse(corpse, true);
|
||||
|
||||
@@ -25,7 +25,7 @@ public class SiegeSpireWithdrawlJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (spire == null)
|
||||
return;
|
||||
|
||||
@@ -30,7 +30,7 @@ public class StuckJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
Vector3fImmutable stuckLoc;
|
||||
Building building = null;
|
||||
|
||||
@@ -27,7 +27,7 @@ public class SummonSendJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (this.source == null)
|
||||
return;
|
||||
|
||||
@@ -39,7 +39,7 @@ public class TeleportJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (this.pc == null || this.npc == null || this.origin == null)
|
||||
return;
|
||||
|
||||
@@ -35,7 +35,7 @@ public class TrackJob extends AbstractEffectJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (this.tpa == null || this.target == null || this.action == null || this.source == null || this.eb == null || !(this.source instanceof PlayerCharacter))
|
||||
return;
|
||||
|
||||
@@ -29,7 +29,7 @@ public class TransferStatOTJob extends AbstractEffectJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (this.dot == null || this.target == null || this.action == null || this.source == null || this.eb == null || this.action == null || this.power == null)
|
||||
return;
|
||||
if (!this.target.isAlive()) {
|
||||
|
||||
@@ -26,7 +26,7 @@ public class UpdateGroupJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (this.group == null)
|
||||
return;
|
||||
|
||||
@@ -22,7 +22,7 @@ public class UpgradeBuildingJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
|
||||
// Must have a building to rank!
|
||||
|
||||
@@ -27,7 +27,7 @@ public class UpgradeNPCJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
int newRank;
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ public class UseItemJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
PowersManager.finishApplyPower(ac, target, Vector3fImmutable.ZERO, pb, trains, liveCounter);
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ public class UseMobPowerJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
PowersManager.finishUseMobPower(this.msg, this.caster, casterLiveCounter, targetLiveCounter);
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ public class UsePowerJob extends AbstractScheduleJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
PowersManager.finishUsePower(this.msg, this.pc, casterLiveCounter, targetLiveCounter);
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
package engine.mobileAI;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.InterestManagement.InterestManager;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.gameManager.*;
|
||||
import engine.math.Vector3f;
|
||||
@@ -48,18 +49,19 @@ public class MobAI {
|
||||
return;
|
||||
}
|
||||
|
||||
if (target.getObjectType() == Enum.GameObjectType.PlayerCharacter && canCast(mob)) {
|
||||
//mob casting disabled
|
||||
//if (target.getObjectType() == Enum.GameObjectType.PlayerCharacter && canCast(mob)) {
|
||||
|
||||
if (mob.isPlayerGuard() == false && MobCast(mob)) {
|
||||
mob.updateLocation();
|
||||
return;
|
||||
}
|
||||
//if (mob.isPlayerGuard() == false && MobCast(mob)) {
|
||||
// mob.updateLocation();
|
||||
// return;
|
||||
//}
|
||||
|
||||
if (mob.isPlayerGuard() == true && GuardCast(mob)) {
|
||||
mob.updateLocation();
|
||||
return;
|
||||
}
|
||||
}
|
||||
//if (mob.isPlayerGuard() == true && GuardCast(mob)) {
|
||||
// mob.updateLocation();
|
||||
// return;
|
||||
//}
|
||||
//}
|
||||
|
||||
if (!CombatUtilities.inRangeToAttack(mob, target))
|
||||
return;
|
||||
@@ -105,6 +107,12 @@ public class MobAI {
|
||||
return;
|
||||
}
|
||||
|
||||
if(target.getPet() != null && target.getPet().isAlive() && !target.getPet().isSiege()){
|
||||
mob.setCombatTarget(target.getPet());
|
||||
AttackTarget(mob,mob.combatTarget);
|
||||
return;
|
||||
}
|
||||
|
||||
if (mob.BehaviourType.callsForHelp)
|
||||
MobCallForHelp(mob);
|
||||
|
||||
@@ -155,6 +163,12 @@ public class MobAI {
|
||||
if (target.getPet().getCombatTarget() == null && target.getPet().assist == true)
|
||||
target.getPet().setCombatTarget(mob);
|
||||
|
||||
try{
|
||||
InterestManager.forceLoad(mob);
|
||||
}catch(Exception e){
|
||||
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackPlayer" + " " + e.getMessage());
|
||||
}
|
||||
@@ -170,14 +184,14 @@ public class MobAI {
|
||||
|
||||
if (target.getRank() == -1 || !target.isVulnerable() || BuildingManager.getBuildingFromCache(target.getObjectUUID()) == null) {
|
||||
mob.setCombatTarget(null);
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
City playercity = ZoneManager.getCityAtLocation(mob.getLoc());
|
||||
|
||||
if (playercity != null)
|
||||
for (Mob guard : playercity.getParent().zoneMobSet)
|
||||
if (guard.BehaviourType != null && guard.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal())
|
||||
if (guard.BehaviourType != null && guard.BehaviourType.equals(Enum.MobBehaviourType.GuardCaptain))
|
||||
if (guard.getCombatTarget() == null && guard.getGuild() != null && mob.getGuild() != null && !guard.getGuild().equals(mob.getGuild()))
|
||||
guard.setCombatTarget(mob);
|
||||
|
||||
@@ -320,6 +334,12 @@ public class MobAI {
|
||||
if (mob == null)
|
||||
return false;
|
||||
|
||||
if (mob.nextCastTime == 0)
|
||||
mob.nextCastTime = System.currentTimeMillis() - 1000L;
|
||||
|
||||
if(mob.nextCastTime > System.currentTimeMillis())
|
||||
return false;
|
||||
|
||||
if(mob.isPlayerGuard){
|
||||
|
||||
int contractID = 0;
|
||||
@@ -340,8 +360,6 @@ public class MobAI {
|
||||
mob.setCombatTarget(null);
|
||||
return false;
|
||||
}
|
||||
if (mob.nextCastTime == 0)
|
||||
mob.nextCastTime = System.currentTimeMillis();
|
||||
|
||||
return mob.nextCastTime <= System.currentTimeMillis();
|
||||
|
||||
@@ -400,6 +418,9 @@ public class MobAI {
|
||||
|
||||
PowersBase mobPower = PowersManager.getPowerByToken(powerToken);
|
||||
|
||||
if(mobPower.powerCategory.equals(Enum.PowerCategoryType.DEBUFF))
|
||||
return false;
|
||||
|
||||
//check for hit-roll
|
||||
|
||||
if (mobPower.requiresHitRoll)
|
||||
@@ -423,9 +444,9 @@ public class MobAI {
|
||||
msg.setUnknown04(2);
|
||||
|
||||
PowersManager.finishUseMobPower(msg, mob, 0, 0);
|
||||
long randomCooldown = (long)((ThreadLocalRandom.current().nextInt(10,15) * 1000) * MobAIThread.AI_CAST_FREQUENCY);
|
||||
long delay = 20000L;
|
||||
mob.nextCastTime = System.currentTimeMillis() + delay;
|
||||
|
||||
mob.nextCastTime = System.currentTimeMillis() + randomCooldown;
|
||||
return true;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
@@ -548,7 +569,6 @@ public class MobAI {
|
||||
PowersManager.finishUseMobPower(msg, mob, 0, 0);
|
||||
|
||||
long randomCooldown = (long)((ThreadLocalRandom.current().nextInt(10,15) * 1000) * MobAIThread.AI_CAST_FREQUENCY);
|
||||
mob.nextCastTime = System.currentTimeMillis() + randomCooldown;
|
||||
return true;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
@@ -600,9 +620,6 @@ public class MobAI {
|
||||
|
||||
if (mob == null)
|
||||
return;
|
||||
if(mob.isAlive())
|
||||
if(!mob.getMovementLoc().equals(Vector3fImmutable.ZERO))
|
||||
mob.setLoc(mob.getMovementLoc());
|
||||
|
||||
if (mob.getTimestamps().containsKey("lastExecution") == false)
|
||||
mob.getTimestamps().put("lastExecution", System.currentTimeMillis());
|
||||
@@ -658,6 +675,10 @@ public class MobAI {
|
||||
return;
|
||||
}
|
||||
|
||||
if(mob.isAlive())
|
||||
if(!mob.getMovementLoc().equals(Vector3fImmutable.ZERO))
|
||||
mob.setLoc(mob.getMovementLoc());
|
||||
|
||||
if(mob.isPet() == false && mob.isPlayerGuard == false)
|
||||
CheckToSendMobHome(mob);
|
||||
|
||||
@@ -964,7 +985,6 @@ public class MobAI {
|
||||
PowersBase recall = PowersManager.getPowerByToken(-1994153779);
|
||||
PowersManager.useMobPower(mob, mob, recall, 40);
|
||||
mob.setCombatTarget(null);
|
||||
|
||||
if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal() && mob.isAlive()) {
|
||||
|
||||
//guard captain pulls his minions home with him
|
||||
@@ -994,6 +1014,11 @@ public class MobAI {
|
||||
|
||||
try {
|
||||
|
||||
if(mob.combatTarget != null && mob.combatTarget.getObjectType().equals(Enum.GameObjectType.PlayerCharacter) && !mob.canSee((PlayerCharacter)mob.combatTarget)){
|
||||
mob.setCombatTarget(null);
|
||||
return;
|
||||
}
|
||||
|
||||
float rangeSquared = mob.getRange() * mob.getRange();
|
||||
float distanceSquared = mob.getLoc().distanceSquared2D(mob.getCombatTarget().getLoc());
|
||||
|
||||
@@ -1141,6 +1166,10 @@ public class MobAI {
|
||||
if (ZoneManager.getSeaFloor().zoneMobSet.contains(mob))
|
||||
mob.killCharacter("no owner");
|
||||
|
||||
if(!mob.isSiege())
|
||||
mob.BehaviourType.canRoam = true;
|
||||
|
||||
|
||||
if (MovementUtilities.canMove(mob) && mob.BehaviourType.canRoam)
|
||||
CheckMobMovement(mob);
|
||||
|
||||
@@ -1201,6 +1230,7 @@ public class MobAI {
|
||||
if (!mob.BehaviourType.isWimpy && mob.getCombatTarget() != null)
|
||||
CheckForAttack(mob);
|
||||
|
||||
|
||||
} catch (Exception e) {
|
||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: DefaultLogic" + " " + e.getMessage());
|
||||
}
|
||||
|
||||
@@ -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 @@
|
||||
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 @@
|
||||
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 @@
|
||||
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
@@ -3,6 +3,7 @@ package engine.mobileAI.Threads;
|
||||
import engine.gameManager.ConfigManager;
|
||||
import engine.mobileAI.MobAI;
|
||||
import engine.gameManager.ZoneManager;
|
||||
import engine.mobileAI.MobBehaviours.StaticBehaviours;
|
||||
import engine.objects.Mob;
|
||||
import engine.objects.Zone;
|
||||
import engine.server.MBServerStatics;
|
||||
@@ -33,7 +34,8 @@ public class MobAIThread implements Runnable{
|
||||
for (Mob mob : zone.zoneMobSet) {
|
||||
try {
|
||||
if (mob != null) {
|
||||
MobAI.DetermineAction(mob);
|
||||
//MobAI.DetermineAction(mob);
|
||||
StaticBehaviours.runBehaviour(mob);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Logger.error("Error processing Mob [Name: {}, UUID: {}]", mob.getName(), mob.getObjectUUID(), e);
|
||||
|
||||
@@ -43,14 +43,14 @@ public class MobRespawnThread implements Runnable {
|
||||
if (zones != null) {
|
||||
for (Zone zone : zones) {
|
||||
synchronized (zone) { // Optional: Synchronize on zone
|
||||
if (!zone.respawnQue.isEmpty() &&
|
||||
zone.lastRespawn + RESPAWN_INTERVAL < System.currentTimeMillis()) {
|
||||
if (!Zone.respawnQue.isEmpty() && Zone.lastRespawn + RESPAWN_INTERVAL < System.currentTimeMillis()) {
|
||||
|
||||
Mob respawner = zone.respawnQue.iterator().next();
|
||||
Mob respawner = Zone.respawnQue.iterator().next();
|
||||
if (respawner != null) {
|
||||
respawner.respawn();
|
||||
zone.respawnQue.remove(respawner);
|
||||
zone.lastRespawn = System.currentTimeMillis();
|
||||
Zone.respawnQue.remove(respawner);
|
||||
Zone.lastRespawn = System.currentTimeMillis();
|
||||
Thread.sleep(100);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,6 @@ import org.pmw.tinylog.Logger;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
import static engine.math.FastMath.sqr;
|
||||
import static java.lang.Math.pow;
|
||||
|
||||
public class CombatUtilities {
|
||||
|
||||
@@ -101,9 +100,18 @@ public class CombatUtilities {
|
||||
if (!target.isAlive())
|
||||
return;
|
||||
|
||||
if (AbstractWorldObject.IsAbstractCharacter(target))
|
||||
if(agent.isPet()){
|
||||
try{
|
||||
damage *= agent.getOwner().ZergMultiplier;
|
||||
}catch(Exception ignored){
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (AbstractWorldObject.IsAbstractCharacter(target)) {
|
||||
//damage = Resists.handleFortitude((AbstractCharacter) target,DamageType.Crush,damage);
|
||||
trueDamage = ((AbstractCharacter) target).modifyHealth(-damage, agent, false);
|
||||
else if (target.getObjectType() == GameObjectType.Building)
|
||||
}else if (target.getObjectType() == GameObjectType.Building)
|
||||
trueDamage = ((Building) target).modifyHealth(-damage, agent);
|
||||
|
||||
//Don't send 0 damage kay thanx.
|
||||
@@ -147,13 +155,17 @@ public class CombatUtilities {
|
||||
}
|
||||
switch (target.getObjectType()) {
|
||||
case PlayerCharacter:
|
||||
defense = ((AbstractCharacter) target).getDefenseRating();
|
||||
PlayerCharacter pc = (PlayerCharacter)target;
|
||||
pc.combatStats.calculateDefense();
|
||||
defense = pc.combatStats.defense;
|
||||
break;
|
||||
case Mob:
|
||||
|
||||
Mob mob = (Mob) target;
|
||||
if (mob.isSiege())
|
||||
defense = atr;
|
||||
else
|
||||
defense = ((Mob) target).mobBase.getDefense();
|
||||
break;
|
||||
case Building:
|
||||
return false;
|
||||
@@ -196,12 +208,10 @@ public class CombatUtilities {
|
||||
return;
|
||||
|
||||
int anim = 75;
|
||||
float speed;
|
||||
|
||||
if (mainHand)
|
||||
speed = agent.getSpeedHandOne();
|
||||
else
|
||||
speed = agent.getSpeedHandTwo();
|
||||
//handle the retaliate here because even if the mob misses you can still retaliate
|
||||
if (AbstractWorldObject.IsAbstractCharacter(target))
|
||||
CombatManager.handleRetaliate((AbstractCharacter) target, agent);
|
||||
|
||||
DamageType dt = DamageType.Crush;
|
||||
|
||||
@@ -283,11 +293,6 @@ public class CombatUtilities {
|
||||
if (((Mob) target).isSiege())
|
||||
return;
|
||||
|
||||
//handle the retaliate
|
||||
|
||||
if (AbstractWorldObject.IsAbstractCharacter(target))
|
||||
CombatManager.handleRetaliate((AbstractCharacter) target, agent);
|
||||
|
||||
if (target.getObjectType() == GameObjectType.Mob) {
|
||||
Mob targetMob = (Mob) target;
|
||||
if (targetMob.isSiege())
|
||||
@@ -322,9 +327,9 @@ public class CombatUtilities {
|
||||
damage = calculateMobDamage(agent);
|
||||
}
|
||||
if (AbstractWorldObject.IsAbstractCharacter(target)) {
|
||||
if (((AbstractCharacter) target).isSit()) {
|
||||
damage *= 2.5f; //increase damage if sitting
|
||||
}
|
||||
//if (((AbstractCharacter) target).isSit()) {
|
||||
// damage *= 2.5f; //increase damage if sitting
|
||||
//}
|
||||
return (int) (((AbstractCharacter) target).getResists().getResistedDamage(agent, (AbstractCharacter) target, dt, damage, 0));
|
||||
}
|
||||
if (target.getObjectType() == GameObjectType.Building) {
|
||||
|
||||
@@ -38,7 +38,7 @@ public abstract class AbstractConnection implements
|
||||
protected final AtomicBoolean execTask = new AtomicBoolean(false);
|
||||
protected final ReentrantLock writeLock = new ReentrantLock();
|
||||
protected final ReentrantLock readLock = new ReentrantLock();
|
||||
protected long lastMsgTime = System.currentTimeMillis();
|
||||
public long lastMsgTime = System.currentTimeMillis();
|
||||
protected long lastKeepAliveTime = System.currentTimeMillis();
|
||||
protected long lastOpcode = -1;
|
||||
protected ConcurrentLinkedQueue<ByteBuffer> outbox = new ConcurrentLinkedQueue<>();
|
||||
|
||||
@@ -87,6 +87,7 @@ public abstract class AbstractConnectionManager extends ControlledRunnable {
|
||||
|
||||
this.processChangeRequests();
|
||||
this.auditSocketChannelToConnectionMap();
|
||||
//this.selector.select();
|
||||
this.selector.select(250L);
|
||||
this.processNewEvents();
|
||||
|
||||
@@ -664,7 +665,7 @@ public abstract class AbstractConnectionManager extends ControlledRunnable {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (runStatus) {
|
||||
this.ac.connMan.receive(sk);
|
||||
this.ac.execTask.compareAndSet(true, false);
|
||||
@@ -693,7 +694,7 @@ public abstract class AbstractConnectionManager extends ControlledRunnable {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
if (runStatus) {
|
||||
this.ac.connMan.sendFinish(sk);
|
||||
this.ac.execTask.compareAndSet(true, false);
|
||||
|
||||
@@ -23,7 +23,7 @@ public class CheckNetMsgFactoryJob extends AbstractJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
NetMsgFactory factory = conn.getFactory();
|
||||
|
||||
// Make any/all msg possible
|
||||
|
||||
@@ -26,7 +26,7 @@ public class ConnectionMonitorJob extends AbstractJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doJob() {
|
||||
public void doJob() {
|
||||
|
||||
if (this.cnt >= 5) {
|
||||
this.connMan.auditSocketChannelToConnectionMap();
|
||||
|
||||
@@ -44,9 +44,16 @@ public class ClientConnection extends AbstractConnection {
|
||||
public ReentrantLock buyLock = new ReentrantLock();
|
||||
public boolean desyncDebug = false;
|
||||
public byte[] lastByteBuffer;
|
||||
public long lastTargetSwitchTime;
|
||||
protected SessionID sessionID = null;
|
||||
private byte cryptoInitTries = 0;
|
||||
|
||||
public int strikes = 0;
|
||||
public Long lastStrike = 0L;
|
||||
|
||||
public int finalStrikes = 0;
|
||||
public long finalStrikeRefresh = 0L;
|
||||
|
||||
public ClientConnection(ClientConnectionManager connMan,
|
||||
SocketChannel sockChan) {
|
||||
super(connMan, sockChan, true);
|
||||
|
||||
@@ -29,6 +29,7 @@ import engine.objects.*;
|
||||
import engine.server.MBServerStatics;
|
||||
import engine.server.world.WorldServer;
|
||||
import engine.session.Session;
|
||||
import engine.util.KeyCloneAudit;
|
||||
import engine.util.StringUtils;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
@@ -238,6 +239,11 @@ public class ClientMessagePump implements NetMsgHandler {
|
||||
return;
|
||||
}
|
||||
|
||||
if(pc.getRaceID() == 1999 && msg.getSlotNumber() == MBServerStatics.SLOT_FEET){
|
||||
forceTransferFromEquipToInventory(msg, origin, "Saetors Cannot Wear FEET Slot Items");
|
||||
return;
|
||||
}
|
||||
|
||||
//dupe check
|
||||
if (!i.validForInventory(origin, pc, itemManager))
|
||||
return;
|
||||
@@ -1880,6 +1886,7 @@ public class ClientMessagePump implements NetMsgHandler {
|
||||
|
||||
switch (protocolMsg) {
|
||||
case SETSELECTEDOBECT:
|
||||
KeyCloneAudit.auditTargetMsg(msg);
|
||||
ClientMessagePump.targetObject((TargetObjectMsg) msg, origin);
|
||||
break;
|
||||
|
||||
|
||||
@@ -232,11 +232,13 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
|
||||
if (pc == null || origin == null) {
|
||||
return;
|
||||
}
|
||||
ItemBase runeBase = ItemBase.getItemBase(runeID);
|
||||
|
||||
//remove only if rune is discipline
|
||||
if (runeID < 3001 || runeID > 3048) {
|
||||
boolean discRune = runeBase.isDiscRune();
|
||||
boolean statRune = runeBase.isStatRune();
|
||||
if(!runeBase.isDiscRune() && !runeBase.isStatRune())
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
//see if pc has rune
|
||||
ArrayList<CharacterRune> runes = pc.getRunes();
|
||||
@@ -422,9 +424,9 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
|
||||
}
|
||||
break;
|
||||
case 31:
|
||||
LootManager.peddleFate(player,item);
|
||||
//LootManager.peddleFate(player,item);
|
||||
LootManager.newFatePeddler(player,item);
|
||||
break;
|
||||
|
||||
case 30: //water bucket
|
||||
case 8: //potions, tears of saedron
|
||||
case 5: //runes, petition, warrant, scrolls
|
||||
|
||||
@@ -78,6 +78,27 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
||||
}
|
||||
int raceID = playerCharacter.getRaceID();
|
||||
//Check race is met
|
||||
|
||||
//confirm sub-race runes are applicable only by proper races
|
||||
switch(runeID){
|
||||
case 252134: //elf
|
||||
case 252135: // elf
|
||||
case 252136: // elf
|
||||
if(playerCharacter.getRaceID() != 2008 && playerCharacter.getRaceID() != 2009)
|
||||
return false;
|
||||
break;
|
||||
case 252129: // human
|
||||
case 252130: // human
|
||||
case 252131: // human
|
||||
case 252132: // human
|
||||
case 252133: // human
|
||||
if(playerCharacter.getRaceID() != 2011 && playerCharacter.getRaceID() != 2012)
|
||||
return false;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
|
||||
ConcurrentHashMap<Integer, Boolean> races = rb.getRace();
|
||||
if(runeID != 3007 && runeID != 3014) {//bounty hunter and huntsman
|
||||
if (races.size() > 0) {
|
||||
@@ -345,8 +366,6 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
||||
discAllowed = 3;
|
||||
break;
|
||||
case 7:
|
||||
discAllowed = 4;
|
||||
break;
|
||||
case 8:
|
||||
discAllowed = 5;
|
||||
break;
|
||||
|
||||
@@ -124,6 +124,9 @@ public class VendorDialogMsg extends ClientNetMsg {
|
||||
}else if(contract.getContractID() == 1502042){
|
||||
vd = Contract.HandleBaneCommanderOptions(msg.unknown03, npc, playerCharacter);
|
||||
msg.updateMessage(3, vd);
|
||||
}else if(contract.getContractID() == 1502044){
|
||||
vd = Contract.HandleGamblerOptions(msg.unknown03, npc, playerCharacter);
|
||||
msg.updateMessage(3, vd);
|
||||
}else {
|
||||
|
||||
if (contract == null)
|
||||
@@ -576,6 +579,7 @@ public class VendorDialogMsg extends ClientNetMsg {
|
||||
case 2520:
|
||||
case 2521:
|
||||
case 2523:
|
||||
case 2525:
|
||||
valid = true;
|
||||
break;
|
||||
}
|
||||
@@ -632,7 +636,7 @@ public class VendorDialogMsg extends ClientNetMsg {
|
||||
DispatchMessage.dispatchMsgToInterestArea(pc, arm, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
|
||||
|
||||
if(pc.getCharItemManager() != null && pc.getCharItemManager().getGoldInventory() != null && pc.getCharItemManager().getGoldInventory().getNumOfItems() < 1000) {
|
||||
pc.getCharItemManager().addGoldToInventory(1000, false);
|
||||
pc.getCharItemManager().addGoldToInventory(1500, false);
|
||||
pc.getCharItemManager().addItemToInventory(new MobLoot(pc, ItemBase.getItemBase(980066), 1, false).promoteToItem(pc));
|
||||
pc.getCharItemManager().updateInventory();
|
||||
}
|
||||
|
||||
@@ -1187,13 +1187,13 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
||||
|
||||
public final float modifyHealth(float value, final AbstractCharacter attacker, final boolean fromCost) {
|
||||
|
||||
if(attacker != null && attacker.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
value *= ((PlayerCharacter)attacker).ZergMultiplier;
|
||||
} // Health modifications are modified by the ZergMechanic
|
||||
//if(attacker != null && attacker.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
// value *= ((PlayerCharacter)attacker).ZergMultiplier;
|
||||
//} // Health modifications are modified by the ZergMechanic
|
||||
|
||||
if(attacker != null && attacker.getObjectType().equals(GameObjectType.Mob) && ((Mob)attacker).getOwner() != null){
|
||||
value *= ((Mob)attacker).getOwner().ZergMultiplier;
|
||||
}// Health modifications from pets are modified by the owner's ZergMechanic
|
||||
//if(attacker != null && attacker.getObjectType().equals(GameObjectType.Mob) && ((Mob)attacker).getOwner() != null){
|
||||
// value *= ((Mob)attacker).getOwner().ZergMultiplier;
|
||||
//}// Health modifications from pets are modified by the owner's ZergMechanic
|
||||
|
||||
try {
|
||||
|
||||
@@ -1262,13 +1262,13 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
||||
final boolean fromCost
|
||||
) {
|
||||
|
||||
if(attacker != null && attacker.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
value *= ((PlayerCharacter)attacker).ZergMultiplier;
|
||||
} // Health modifications are modified by the ZergMechanic
|
||||
//if(attacker != null && attacker.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
// value *= ((PlayerCharacter)attacker).ZergMultiplier;
|
||||
//} // Health modifications are modified by the ZergMechanic
|
||||
|
||||
if(attacker != null && attacker.getObjectType().equals(GameObjectType.Mob) && ((Mob)attacker).getOwner() != null){
|
||||
value *= ((Mob)attacker).getOwner().ZergMultiplier;
|
||||
}// Health modifications from pets are modified by the owner's ZergMechanic
|
||||
//if(attacker != null && attacker.getObjectType().equals(GameObjectType.Mob) && ((Mob)attacker).getOwner() != null){
|
||||
// value *= ((Mob)attacker).getOwner().ZergMultiplier;
|
||||
//}// Health modifications from pets are modified by the owner's ZergMechanic
|
||||
|
||||
if (!this.isAlive()) {
|
||||
return 0f;
|
||||
@@ -1309,13 +1309,13 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
||||
final boolean fromCost
|
||||
) {
|
||||
|
||||
if(attacker != null && attacker.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
value *= ((PlayerCharacter)attacker).ZergMultiplier;
|
||||
} // Health modifications are modified by the ZergMechanic
|
||||
//if(attacker != null && attacker.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
||||
// value *= ((PlayerCharacter)attacker).ZergMultiplier;
|
||||
//} // Health modifications are modified by the ZergMechanic
|
||||
|
||||
if(attacker != null && attacker.getObjectType().equals(GameObjectType.Mob) && ((Mob)attacker).getOwner() != null){
|
||||
value *= ((Mob)attacker).getOwner().ZergMultiplier;
|
||||
}// Health modifications from pets are modified by the owner's ZergMechanic
|
||||
//if(attacker != null && attacker.getObjectType().equals(GameObjectType.Mob) && ((Mob)attacker).getOwner() != null){
|
||||
// value *= ((Mob)attacker).getOwner().ZergMultiplier;
|
||||
//}// Health modifications from pets are modified by the owner's ZergMechanic
|
||||
|
||||
if (!this.isAlive()) {
|
||||
return 0f;
|
||||
@@ -1718,7 +1718,11 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
||||
|
||||
// clear bonuses and reapply rune bonuses
|
||||
if (this.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
||||
this.bonuses.calculateRuneBaseEffects((PlayerCharacter) this);
|
||||
try {
|
||||
this.bonuses.calculateRuneBaseEffects((PlayerCharacter) this);
|
||||
}catch(Exception ignored){
|
||||
|
||||
}
|
||||
} else {
|
||||
this.bonuses.clearRuneBaseEffects();
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import engine.Enum.GameObjectType;
|
||||
import engine.Enum.GridObjectType;
|
||||
import engine.InterestManagement.HeightMap;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.gameManager.ZoneManager;
|
||||
import engine.job.AbstractScheduleJob;
|
||||
import engine.job.JobContainer;
|
||||
import engine.job.JobScheduler;
|
||||
@@ -175,11 +176,11 @@ public abstract class AbstractWorldObject extends AbstractGameObject {
|
||||
}
|
||||
|
||||
//set players new altitude to region lerp altitude.
|
||||
if (region != null)
|
||||
if (region.center.y == region.highLerp.y)
|
||||
worldObject.loc = worldObject.loc.setY(region.center.y + worldObject.getAltitude());
|
||||
else
|
||||
worldObject.loc = worldObject.loc.setY(region.lerpY(worldObject) + worldObject.getAltitude());
|
||||
//if (region != null)
|
||||
// if (region.center.y == region.highLerp.y)
|
||||
// worldObject.loc = worldObject.loc.setY(region.center.y + worldObject.getAltitude());
|
||||
// else
|
||||
// worldObject.loc = worldObject.loc.setY(region.lerpY(worldObject) + worldObject.getAltitude());
|
||||
|
||||
return region;
|
||||
}
|
||||
@@ -271,7 +272,8 @@ public abstract class AbstractWorldObject extends AbstractGameObject {
|
||||
if (this.getObjectType().equals(GameObjectType.PlayerCharacter))
|
||||
if (name.equals("Flight")) {
|
||||
((PlayerCharacter) this).update(false);
|
||||
PlayerCharacter.GroundPlayer((PlayerCharacter) this);
|
||||
if(!AbstractCharacter.CanFly((PlayerCharacter) this))
|
||||
PlayerCharacter.GroundPlayer((PlayerCharacter) this);
|
||||
}
|
||||
}
|
||||
applyAllBonuses();
|
||||
@@ -499,8 +501,28 @@ public abstract class AbstractWorldObject extends AbstractGameObject {
|
||||
if (loc.x > MBServerStatics.MAX_WORLD_WIDTH || loc.z < MBServerStatics.MAX_WORLD_HEIGHT)
|
||||
return;
|
||||
this.lastLoc = new Vector3fImmutable(this.loc);
|
||||
this.loc = loc;
|
||||
this.loc = this.loc.setY(HeightMap.getWorldHeight(this) + this.getAltitude());
|
||||
if(AbstractCharacter.IsAbstractCharacter(this)){
|
||||
float y;
|
||||
float worldHeight = HeightMap.getWorldHeight(loc);
|
||||
Zone zone = ZoneManager.findSmallestZone(loc);
|
||||
if(zone != null && zone.isPlayerCity()){
|
||||
worldHeight = zone.getWorldAltitude();
|
||||
}
|
||||
if(this.region != null){
|
||||
float regionAlt = this.region.lerpY(this);
|
||||
float altitude = this.getAltitude();
|
||||
y = regionAlt + altitude + worldHeight;
|
||||
}else{
|
||||
y = HeightMap.getWorldHeight(loc) + this.getAltitude();
|
||||
}
|
||||
Vector3fImmutable newLoc = new Vector3fImmutable(loc.x,y,loc.z);
|
||||
this.loc = newLoc;
|
||||
WorldGrid.addObject(this, newLoc.x, newLoc.z);
|
||||
return;
|
||||
}else{
|
||||
this.loc = loc;
|
||||
}
|
||||
//this.loc = this.loc.setY(HeightMap.getWorldHeight(this) + this.getAltitude());
|
||||
|
||||
//lets not add mob to world grid if he is currently despawned.
|
||||
if (this.getObjectType().equals(GameObjectType.Mob) && ((Mob) this).despawned)
|
||||
|
||||
@@ -59,6 +59,11 @@ public class Account extends AbstractGameObject {
|
||||
this.status = Enum.AccountStatus.valueOf(resultSet.getString("status"));
|
||||
}
|
||||
|
||||
public Account() {
|
||||
this.uname = "";
|
||||
this.status = Enum.AccountStatus.ACTIVE;
|
||||
}
|
||||
|
||||
public ArrayList<Item> getVault() {
|
||||
return vault;
|
||||
}
|
||||
|
||||
@@ -610,7 +610,7 @@ public class CharacterItemManager {
|
||||
if (i == null)
|
||||
return false;
|
||||
|
||||
i.stripCastableEnchants();
|
||||
//i.stripCastableEnchants();
|
||||
|
||||
if (!this.doesCharOwnThisItem(i.getObjectUUID()))
|
||||
return false;
|
||||
@@ -1056,7 +1056,11 @@ public class CharacterItemManager {
|
||||
// add to Bank
|
||||
this.bank.add(i);
|
||||
i.addToCache();
|
||||
i.stripCastableEnchants();
|
||||
try {
|
||||
i.stripCastableEnchants();
|
||||
}catch(Exception ignored){
|
||||
Logger.error("FAILED TO STRIP CASTABLE ENCHANTS: Move Item To Bank");
|
||||
}
|
||||
|
||||
calculateWeights();
|
||||
|
||||
@@ -1197,6 +1201,12 @@ public class CharacterItemManager {
|
||||
} else
|
||||
return false; // NPC's dont have vaults!
|
||||
|
||||
try {
|
||||
i.stripCastableEnchants();
|
||||
}catch(Exception ignored){
|
||||
Logger.error("FAILED TO STRIP CASTABLE ENCHANTS: Move Item To Vault");
|
||||
}
|
||||
|
||||
// remove it from other lists:
|
||||
this.remItemFromLists(i, slot);
|
||||
|
||||
@@ -1205,7 +1215,6 @@ public class CharacterItemManager {
|
||||
|
||||
calculateWeights();
|
||||
|
||||
i.stripCastableEnchants();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -2013,7 +2022,7 @@ public class CharacterItemManager {
|
||||
if (item.getItemBase().getType().equals(ItemType.GOLD)) {
|
||||
int amt = item.getNumOfItems();
|
||||
item.setNumOfItems(0);
|
||||
item.stripCastableEnchants();
|
||||
//item.stripCastableEnchants();
|
||||
MobLoot ml = new MobLoot(this.absCharacter, amt);
|
||||
ml.zeroItem();
|
||||
ml.containerType = Enum.ItemContainerType.INVENTORY;
|
||||
|
||||
@@ -164,6 +164,19 @@ public class CharacterRune extends AbstractGameObject {
|
||||
runes.remove(runes.indexOf(rune));
|
||||
CharacterSkill.calculateSkills(pc);
|
||||
pc.applyBonuses();
|
||||
if(ItemBase.getItemBase(rune.getRuneBaseID()) != null && ItemBase.getItemBase(rune.getRuneBaseID()).isStatRune()){
|
||||
//handle point refund
|
||||
int creationCost = 0;
|
||||
for(RuneBaseAttribute attr : rune.runeBase.getAttrs()){
|
||||
if(attr.getAttributeID() == MBServerStatics.RUNE_COST_ATTRIBUTE_ID){
|
||||
creationCost = (int)attr.getModValue();
|
||||
}
|
||||
}
|
||||
if(creationCost > 0){
|
||||
pc.unusedStatPoints += creationCost;
|
||||
pc.syncClient();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,7 +68,7 @@ public class CharacterSkill extends AbstractGameObject {
|
||||
165, 166, 166, 167, 167, //185 to 189
|
||||
168}; //190
|
||||
|
||||
private static final float[] baseSkillValues = {
|
||||
static final float[] baseSkillValues = {
|
||||
0.0f, 0.0f, 0.2f, 0.4f, 0.6f, //0 to 4
|
||||
0.8f, 1.0f, 1.1666666f, 1.3333334f, 1.5f, //5 to 9
|
||||
1.6666667f, 1.8333334f, 2.0f, 2.2f, 2.4f, //10 to 14
|
||||
|
||||
@@ -389,18 +389,22 @@ public class City extends AbstractWorldObject {
|
||||
|
||||
if (pc.getAccount().status.equals(AccountStatus.ADMIN)) {
|
||||
cities.add(city);
|
||||
} else
|
||||
} else {
|
||||
//list Player cities
|
||||
|
||||
//open city, just list
|
||||
if (city.open && city.getTOL() != null && city.getTOL().getRank() > 4) {
|
||||
|
||||
if (!BuildingManager.IsPlayerHostile(city.getTOL(), pc))
|
||||
cities.add(city); //verify nation or guild is same
|
||||
} else if (Guild.sameNationExcludeErrant(city.getGuild(), pcG))
|
||||
cities.add(city);
|
||||
|
||||
|
||||
}else {
|
||||
try {
|
||||
if (city.getGuild().getNation().equals(pc.guild.getNation())) {
|
||||
cities.add(city);
|
||||
}
|
||||
}catch(Exception e){
|
||||
Logger.error(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (city.isNpc == 1) {
|
||||
//list NPC cities
|
||||
Guild g = city.getGuild();
|
||||
@@ -451,7 +455,7 @@ public class City extends AbstractWorldObject {
|
||||
|
||||
if (!BuildingManager.IsPlayerHostile(city.getTOL(), pc))
|
||||
cities.add(city); //verify nation or guild is same
|
||||
} else if (Guild.sameNationExcludeErrant(city.getGuild(), pcG))
|
||||
} else if (city.open && Guild.sameNationExcludeErrant(city.getGuild(), pcG))
|
||||
cities.add(city);
|
||||
|
||||
} else if (city.isNpc == 1) {
|
||||
@@ -811,8 +815,10 @@ public class City extends AbstractWorldObject {
|
||||
|
||||
// Set city motto to current guild motto
|
||||
|
||||
if (BuildingManager.getBuilding(this.treeOfLifeID) == null)
|
||||
if (BuildingManager.getBuilding(this.treeOfLifeID) == null) {
|
||||
Logger.info("City UID " + this.getObjectUUID() + " Failed to Load Tree of Life with ID " + this.treeOfLifeID);
|
||||
this.destroy();
|
||||
}
|
||||
|
||||
if ((ConfigManager.serverType.equals(ServerType.WORLDSERVER))
|
||||
&& (this.isNpc == (byte) 0)) {
|
||||
|
||||
@@ -16,12 +16,14 @@ import engine.net.Dispatch;
|
||||
import engine.net.DispatchMessage;
|
||||
import engine.net.client.msg.CityDataMsg;
|
||||
import engine.net.client.msg.ErrorPopupMsg;
|
||||
import engine.net.client.msg.VendorDialogMsg;
|
||||
import org.joda.time.DateTime;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
public class Contract extends AbstractGameObject {
|
||||
|
||||
@@ -248,6 +250,86 @@ public class Contract extends AbstractGameObject {
|
||||
}
|
||||
return vd;
|
||||
}
|
||||
public static VendorDialog HandleGamblerOptions(int optionId, NPC npc, PlayerCharacter pc){
|
||||
pc.setLastNPCDialog(npc);
|
||||
VendorDialog vd = new VendorDialog(VendorDialog.getHostileVendorDialog().getDialogType(),VendorDialog.getHostileVendorDialog().getIntro(),-1);//VendorDialog.getHostileVendorDialog();
|
||||
vd.getOptions().clear();
|
||||
MenuOption option1 = new MenuOption(15020441, "Gamble 1000", 15020441);
|
||||
vd.getOptions().add(option1);
|
||||
|
||||
MenuOption option2 = new MenuOption(15020442, "Gamble 10,000", 15020442);
|
||||
vd.getOptions().add(option2);
|
||||
|
||||
MenuOption option3 = new MenuOption(15020443, "Gamble 100,000", 15020443);
|
||||
vd.getOptions().add(option3);
|
||||
switch(optionId) {
|
||||
case 15020441: // gamble 1000
|
||||
gamble(pc,1000);
|
||||
break;
|
||||
case 15020442: // gamble 10,000
|
||||
gamble(pc,10000);
|
||||
break;
|
||||
case 15020443: // gamble 100,000
|
||||
gamble(pc,100000);
|
||||
break;
|
||||
}
|
||||
return vd;
|
||||
}
|
||||
|
||||
public static void gamble(PlayerCharacter pc, int amount){
|
||||
|
||||
if(!pc.timestamps.containsKey("NextSlot"))
|
||||
pc.timestamps.put("NextSlot",System.currentTimeMillis());
|
||||
|
||||
if(pc.timestamps.get("NextSlot") > System.currentTimeMillis())
|
||||
return;
|
||||
|
||||
pc.timestamps.put("NextSlot",System.currentTimeMillis() + 2000L);
|
||||
|
||||
if(pc.charItemManager == null){
|
||||
return;
|
||||
}
|
||||
|
||||
int goldAmount = pc.charItemManager.getGoldInventory().getNumOfItems();
|
||||
|
||||
if(goldAmount < amount) {
|
||||
ChatManager.chatSystemInfo(pc, "You Cannot Afford This Wager");
|
||||
return;
|
||||
}
|
||||
goldAmount -= amount;
|
||||
|
||||
pc.charItemManager.getGoldInventory().setNumOfItems(goldAmount);
|
||||
pc.charItemManager.updateInventory();
|
||||
|
||||
ChatManager.chatSystemInfo(pc, "You Attempt To Gamble " + amount + " ...");
|
||||
int roll1 = ThreadLocalRandom.current().nextInt(1,7);
|
||||
int roll2 = ThreadLocalRandom.current().nextInt(1,7);
|
||||
int roll3 = ThreadLocalRandom.current().nextInt(1,7);
|
||||
|
||||
ChatManager.chatSystemInfo(pc, "Gambler Has Rolled: " + roll1 + " " + roll2 + " " + roll3);
|
||||
|
||||
int winnings = 0;
|
||||
|
||||
if(roll1 == roll2 && roll1 == roll3)
|
||||
winnings = amount * roll1 * 10;
|
||||
|
||||
if(winnings > 0)
|
||||
ChatManager.chatSystemInfo(pc, "You Have Won " + winnings + " Gold Coins!");
|
||||
else
|
||||
ChatManager.chatSystemInfo(pc, "You Have Lost The Wager");
|
||||
|
||||
goldAmount += winnings;
|
||||
|
||||
pc.charItemManager.getGoldInventory().setNumOfItems(goldAmount);
|
||||
pc.charItemManager.updateInventory();
|
||||
|
||||
}
|
||||
|
||||
public static boolean isClassTrainer(int id){
|
||||
if(id >= 5 && id <= 30)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
public static VendorDialog HandleBaneCommanderOptions(int optionId, NPC npc, PlayerCharacter pc){
|
||||
pc.setLastNPCDialog(npc);
|
||||
VendorDialog vd = new VendorDialog(VendorDialog.getHostileVendorDialog().getDialogType(),VendorDialog.getHostileVendorDialog().getIntro(),-1);//VendorDialog.getHostileVendorDialog();
|
||||
@@ -505,6 +587,19 @@ public class Contract extends AbstractGameObject {
|
||||
}
|
||||
}
|
||||
|
||||
if(this.getObjectUUID() == 1502050){
|
||||
for(MobEquipment me : this.sellInventory){
|
||||
switch(me.getItemBase().getUUID()) {
|
||||
case 971070:
|
||||
me.magicValue = 3000000;
|
||||
break;
|
||||
case 971012:
|
||||
me.magicValue = 1000000;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(this.getObjectUUID() == 1202){ //rune merchant
|
||||
for(MobEquipment me : this.sellInventory){
|
||||
switch(me.getItemBase().getUUID()){
|
||||
|
||||
@@ -326,6 +326,10 @@ public class Effect {
|
||||
writer.putString(item.getName());
|
||||
writer.putFloat(-1000f);
|
||||
} else {
|
||||
if(true){
|
||||
serializeForClientMsg(writer);
|
||||
return;
|
||||
}
|
||||
float duration = this.jc.timeToExecutionLeft() / 1000;
|
||||
writer.putInt(this.eb.getToken());
|
||||
writer.putInt(aej.getTrains());
|
||||
@@ -338,6 +342,10 @@ public class Effect {
|
||||
}
|
||||
|
||||
public void serializeForClientMsg(ByteBufferWriter writer) {
|
||||
if(true){
|
||||
serializeForLoad(writer);
|
||||
return;
|
||||
}
|
||||
AbstractJob aj = this.jc.getJob();
|
||||
if (aj == null || (!(aj instanceof AbstractEffectJob))) {
|
||||
//TODO put error message here
|
||||
|
||||
@@ -23,7 +23,7 @@ import static engine.gameManager.LootManager.LOOTMANAGER;
|
||||
public class Experience {
|
||||
|
||||
private static final TreeMap<Integer, Integer> ExpToLevel;
|
||||
private static final int[] LevelToExp = {Integer.MIN_VALUE, // Pad
|
||||
public static final int[] LevelToExp = {Integer.MIN_VALUE, // Pad
|
||||
// everything
|
||||
// over 1
|
||||
|
||||
@@ -121,6 +121,8 @@ public class Experience {
|
||||
190585732, // Level 77
|
||||
201714185, // Level 78
|
||||
213319687, // Level 79
|
||||
|
||||
// R8
|
||||
225415457, // Level 80
|
||||
238014819 // Level 81
|
||||
|
||||
@@ -302,7 +304,7 @@ public class Experience {
|
||||
case Cyan:
|
||||
return 0.9;
|
||||
case Green:
|
||||
return 0.7;
|
||||
return 0.8;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@@ -352,6 +354,14 @@ public class Experience {
|
||||
if(killer.pvpKills.contains(mob.getObjectUUID()))
|
||||
return;
|
||||
|
||||
if(true){
|
||||
if(killer.combatStats == null)
|
||||
killer.combatStats = new PlayerCombatStats(killer);
|
||||
|
||||
killer.combatStats.grantExperience(mob,g);
|
||||
return;
|
||||
}
|
||||
|
||||
double grantedExperience = 0.0;
|
||||
|
||||
if (g != null) { // Do group EXP stuff
|
||||
@@ -409,7 +419,6 @@ public class Experience {
|
||||
|
||||
grantedExperience = (double) LOOTMANAGER.NORMAL_EXP_RATE * maxXPPerKill(playerCharacter.getLevel());
|
||||
|
||||
grantedExperience *= (1/ giveEXPTo.size()+0.9);
|
||||
// Adjust XP for Mob Level
|
||||
|
||||
grantedExperience *= getConMod(playerCharacter, mob);
|
||||
@@ -446,6 +455,9 @@ public class Experience {
|
||||
if (grantedExperience == 0)
|
||||
grantedExperience = 1;
|
||||
|
||||
//scaling
|
||||
grantedExperience *= (1 / giveEXPTo.size()+0.9);
|
||||
|
||||
// Grant the player the EXP
|
||||
playerCharacter.grantXP((int) Math.floor(grantedExperience));
|
||||
}
|
||||
@@ -469,9 +481,13 @@ public class Experience {
|
||||
grantedExperience *= LOOTMANAGER.HOTZONE_EXP_RATE;
|
||||
|
||||
// Errant penalty
|
||||
if (grantedExperience != 1)
|
||||
if (grantedExperience != 1) {
|
||||
if (killer.getGuild().isEmptyGuild())
|
||||
grantedExperience *= .6;
|
||||
grantedExperience *= 0.6f;
|
||||
}
|
||||
|
||||
//bonus for no group
|
||||
grantedExperience *= 1.9f;
|
||||
|
||||
// Grant XP
|
||||
killer.grantXP((int) Math.floor(grantedExperience));
|
||||
|
||||
@@ -818,24 +818,15 @@ public class Item extends AbstractWorldObject {
|
||||
}
|
||||
|
||||
public void stripCastableEnchants(){
|
||||
ArrayList<String> keys =new ArrayList<>();
|
||||
|
||||
for(String eff : this.effects.keySet()){
|
||||
for(AbstractEffectModifier mod : this.effects.get(eff).getEffectsBase().getModifiers()){
|
||||
if(mod.modType.equals(ModType.WeaponProc)){
|
||||
keys.add(eff);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(String eff : keys){
|
||||
try {
|
||||
this.effects.get(eff).endEffect();
|
||||
this.effects.remove(eff);
|
||||
}catch(Exception e){
|
||||
|
||||
ArrayList<Effect> ToRemove = new ArrayList<>();
|
||||
for(Effect eff : this.effects.values()){
|
||||
if(eff.getJobContainer() != null && !eff.getJobContainer().noTimer()){
|
||||
eff.endEffectNoPower();
|
||||
eff.getJobContainer().cancelJob();
|
||||
ToRemove.add(eff);
|
||||
}
|
||||
}
|
||||
this.effects.values().removeAll(ToRemove);
|
||||
}
|
||||
//Only to be used for trading
|
||||
public void setOwnerID(int ownerID) {
|
||||
@@ -1085,7 +1076,7 @@ public class Item extends AbstractWorldObject {
|
||||
this.ownerID = pc.getObjectUUID();
|
||||
this.ownerType = OwnerType.PlayerCharacter;
|
||||
this.containerType = ItemContainerType.INVENTORY;
|
||||
this.stripCastableEnchants();
|
||||
//this.stripCastableEnchants();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1106,7 +1097,7 @@ public class Item extends AbstractWorldObject {
|
||||
this.ownerID = npc.getObjectUUID();
|
||||
this.ownerType = OwnerType.Npc;
|
||||
this.containerType = Enum.ItemContainerType.INVENTORY;
|
||||
this.stripCastableEnchants();
|
||||
//this.stripCastableEnchants();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1124,7 +1115,7 @@ public class Item extends AbstractWorldObject {
|
||||
this.ownerID = 0;
|
||||
this.ownerType = null;
|
||||
this.containerType = Enum.ItemContainerType.INVENTORY;
|
||||
this.stripCastableEnchants();
|
||||
//this.stripCastableEnchants();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1492,4 +1483,21 @@ public class Item extends AbstractWorldObject {
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public float getModifiedSpeed() {
|
||||
float speed = this.getItemBase().getSpeed();
|
||||
try {
|
||||
for (Effect eff : this.effects.values()) {
|
||||
for (AbstractEffectModifier mod : eff.getEffectModifiers()) {
|
||||
if (mod.modType.equals(ModType.WeaponSpeed)) {
|
||||
float modValue = 1 + mod.getPercentMod() * 0.01f;
|
||||
speed *= modValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}catch(Exception e){
|
||||
|
||||
}
|
||||
return speed;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,6 +76,8 @@ public class ItemBase {
|
||||
private ArrayList<Integer> animations = new ArrayList<>();
|
||||
private ArrayList<Integer> offHandAnimations = new ArrayList<>();
|
||||
|
||||
public float dexReduction = 0.0f;
|
||||
|
||||
/**
|
||||
* ResultSet Constructor
|
||||
*/
|
||||
@@ -151,7 +153,7 @@ public class ItemBase {
|
||||
}
|
||||
initBakedInStats();
|
||||
initializeHashes();
|
||||
|
||||
initDexReduction();
|
||||
}
|
||||
|
||||
public static void addToCache(ItemBase itemBase) {
|
||||
@@ -319,6 +321,10 @@ public class ItemBase {
|
||||
DbManager.ItemBaseQueries.LOAD_BAKEDINSTATS(this);
|
||||
}
|
||||
|
||||
private void initDexReduction(){
|
||||
DbManager.ItemBaseQueries.LOAD_DEX_REDUCTION(this);
|
||||
}
|
||||
|
||||
//TODO fix this later. Shouldn't be gotten from item base
|
||||
public int getMagicValue() {
|
||||
return this.value;
|
||||
|
||||
@@ -705,9 +705,11 @@ public class ItemFactory {
|
||||
|
||||
int rollPrefix = ThreadLocalRandom.current().nextInt(1, 100 + 1);
|
||||
|
||||
if (rollPrefix < 80) {
|
||||
if (rollPrefix < vendor.getLevel() + 30) {
|
||||
|
||||
int randomPrefix = TableRoll(vendor.getLevel());
|
||||
if(vendor.contract.getName().contains("Heavy") || vendor.contract.getName().contains("Medium") || vendor.contract.getName().contains("Leather"))
|
||||
randomPrefix += vendor.level * 0.5f;
|
||||
prefixEntry = ModTableEntry.rollTable(prefixTypeTable.modTableID, randomPrefix);
|
||||
|
||||
if (prefixEntry != null)
|
||||
@@ -720,9 +722,11 @@ public class ItemFactory {
|
||||
// Always have at least one mod on a magic rolled item.
|
||||
// Suffix will be our backup plan.
|
||||
|
||||
if (rollSuffix < 80 || prefixEntry == null) {
|
||||
if (rollSuffix < vendor.getLevel() + 30) {
|
||||
|
||||
int randomSuffix = TableRoll(vendor.getLevel());
|
||||
if(vendor.contract.getName().contains("Heavy") || vendor.contract.getName().contains("Medium") || vendor.contract.getName().contains("Leather"))
|
||||
randomSuffix += vendor.level * 0.25f;
|
||||
suffixEntry = ModTableEntry.rollTable(suffixTypeTable.modTableID, randomSuffix);
|
||||
|
||||
if (suffixEntry != null)
|
||||
@@ -776,31 +780,31 @@ public class ItemFactory {
|
||||
|
||||
public static int TableRoll(int vendorLevel) {
|
||||
// Calculate min and max based on mobLevel
|
||||
int min = 60;
|
||||
int max = 120;
|
||||
int min = 100;
|
||||
int max = 160;
|
||||
switch(vendorLevel){
|
||||
case 20:
|
||||
min = 70;
|
||||
max = 140;
|
||||
break;
|
||||
case 30:
|
||||
min = 80;
|
||||
max = 160;
|
||||
break;
|
||||
case 40:
|
||||
min = 90;
|
||||
min = 120;
|
||||
max = 180;
|
||||
break;
|
||||
case 50:
|
||||
min = 100;
|
||||
case 30:
|
||||
min = 140;
|
||||
max = 200;
|
||||
break;
|
||||
case 40:
|
||||
min = 160;
|
||||
max = 220;
|
||||
break;
|
||||
case 50:
|
||||
min = 180;
|
||||
max = 240;
|
||||
break;
|
||||
case 60:
|
||||
min = 175;
|
||||
min = 200;
|
||||
max = 260;
|
||||
break;
|
||||
case 70:
|
||||
min = 220;
|
||||
min = 240;
|
||||
max = 320;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -65,6 +65,7 @@ public class Mine extends AbstractGameObject {
|
||||
public boolean isStronghold = false;
|
||||
public ArrayList<Mob> strongholdMobs;
|
||||
public HashMap<Integer,Integer> oldBuildings;
|
||||
public HashMap<Integer, Long> mineAttendees = new HashMap<>();
|
||||
|
||||
/**
|
||||
* ResultSet Constructor
|
||||
@@ -341,6 +342,7 @@ public class Mine extends AbstractGameObject {
|
||||
if(!mine.isActive)
|
||||
if(mine.getOwningGuild() != null)
|
||||
if(mine.getOwningGuild().getNation().equals(player.getGuild().getNation()))
|
||||
if(!mine.getOwningGuild().equals(Guild.getErrantGuild()))
|
||||
mines.add(mine);
|
||||
|
||||
return mines;
|
||||
@@ -621,7 +623,7 @@ public class Mine extends AbstractGameObject {
|
||||
|
||||
// Gather current list of players within the zone bounds
|
||||
|
||||
HashSet<AbstractWorldObject> currentPlayers = WorldGrid.getObjectsInRangePartial(tower.loc, Enum.CityBoundsType.GRID.extents, MBServerStatics.MASK_PLAYER);
|
||||
HashSet<AbstractWorldObject> currentPlayers = WorldGrid.getObjectsInRangePartial(tower.loc, MBServerStatics.CHARACTER_LOAD_RANGE * 3, MBServerStatics.MASK_PLAYER);
|
||||
HashMap<Guild,ArrayList<PlayerCharacter>> charactersByNation = new HashMap<>();
|
||||
ArrayList<Guild> updatedNations = new ArrayList<>();
|
||||
for (AbstractWorldObject playerObject : currentPlayers) {
|
||||
@@ -636,6 +638,7 @@ public class Mine extends AbstractGameObject {
|
||||
|
||||
if(!this._playerMemory.contains(player.getObjectUUID())){
|
||||
this._playerMemory.add(player.getObjectUUID());
|
||||
ChatManager.chatSystemInfo(player,"You Have Entered an Active Mine Area");
|
||||
}
|
||||
Guild nation = player.guild.getNation();
|
||||
if(charactersByNation.containsKey(nation)){
|
||||
@@ -654,6 +657,19 @@ public class Mine extends AbstractGameObject {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(Integer id : this.mineAttendees.keySet()){
|
||||
PlayerCharacter attendee = PlayerCharacter.getPlayerCharacter(id);
|
||||
if(attendee == null)
|
||||
continue;
|
||||
|
||||
if(charactersByNation.containsKey(attendee.guild.getNation())){
|
||||
if(!charactersByNation.get(attendee.guild.getNation()).contains(attendee)){
|
||||
charactersByNation.get(attendee.guild.getNation()).add(attendee);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
for(Guild nation : updatedNations){
|
||||
float multiplier = ZergManager.getCurrentMultiplier(charactersByNation.get(nation).size(),this.capSize);
|
||||
for(PlayerCharacter player : charactersByNation.get(nation)){
|
||||
@@ -675,18 +691,28 @@ public class Mine extends AbstractGameObject {
|
||||
if(tower == null)
|
||||
return;
|
||||
ArrayList<Integer>toRemove = new ArrayList<>();
|
||||
HashSet<AbstractWorldObject> currentPlayers = WorldGrid.getObjectsInRangePartial(tower.loc, Enum.CityBoundsType.GRID.extents, MBServerStatics.MASK_PLAYER);
|
||||
HashSet<AbstractWorldObject> currentPlayers = WorldGrid.getObjectsInRangePartial(tower.loc, MBServerStatics.CHARACTER_LOAD_RANGE * 3, MBServerStatics.MASK_PLAYER);
|
||||
for(Integer id : currentMemory){
|
||||
PlayerCharacter pc = PlayerCharacter.getPlayerCharacter(id);
|
||||
if(currentPlayers.contains(pc) == false){
|
||||
toRemove.add(id);
|
||||
if(!currentPlayers.contains(pc)){
|
||||
if(this.mineAttendees.containsKey(id)){
|
||||
long timeGone = System.currentTimeMillis() - this.mineAttendees.get(id).longValue();
|
||||
if (timeGone > 180000L) { // 3 minutes
|
||||
toRemove.add(id); // Mark for removal
|
||||
}
|
||||
}
|
||||
pc.ZergMultiplier = 1.0f;
|
||||
} else {
|
||||
this.mineAttendees.put(id,System.currentTimeMillis());
|
||||
}
|
||||
}
|
||||
|
||||
// Remove players from city memory
|
||||
|
||||
_playerMemory.removeAll(toRemove);
|
||||
for(int id : toRemove){
|
||||
this.mineAttendees.remove(id);
|
||||
}
|
||||
}
|
||||
public static Building getTower(Mine mine){
|
||||
Building tower = BuildingManager.getBuildingFromCache(mine.buildingID);
|
||||
|
||||
@@ -620,6 +620,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
DbManager.addToCache(mob);
|
||||
mob.setPet(owner, true);
|
||||
mob.setWalkMode(false);
|
||||
mob.level = level;
|
||||
mob.runAfterLoad();
|
||||
|
||||
} catch (Exception e) {
|
||||
@@ -628,8 +629,12 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
createLock.writeLock().unlock();
|
||||
}
|
||||
parent.zoneMobSet.add(mob);
|
||||
mob.level = level;
|
||||
mob.healthMax = mob.getMobBase().getHealthMax() * (mob.level * 0.5f);
|
||||
// mob.level = level;
|
||||
float healthMax = mob.getMobBase().getHealthMax();
|
||||
if(mob.bonuses != null){
|
||||
healthMax += mob.bonuses.getFloat(ModType.HealthFull,SourceType.None);
|
||||
}
|
||||
mob.healthMax = healthMax;
|
||||
mob.health.set(mob.healthMax);
|
||||
return mob;
|
||||
}
|
||||
@@ -1444,6 +1449,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
this.updateLocation();
|
||||
this.stopPatrolTime = 0;
|
||||
this.lastPatrolPointIndex = 0;
|
||||
InterestManager.setObjectDirty(this);
|
||||
}
|
||||
|
||||
public void despawn() {
|
||||
@@ -1698,7 +1704,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
}
|
||||
// calculate defense for equipment
|
||||
}
|
||||
if(this.isDropper || Mob.discDroppers.contains(this)){
|
||||
if((this.isDropper || Mob.discDroppers.contains(this)) && !this.mobBase.getFirstName().contains("Blood Mage")){
|
||||
this.defenseRating *= 2;
|
||||
this.atrHandOne *= 2;
|
||||
this.atrHandTwo *= 2;
|
||||
|
||||
@@ -308,6 +308,10 @@ public class MobBase extends AbstractGameObject {
|
||||
}
|
||||
|
||||
public static void applyMobbaseEffects(Mob mob){
|
||||
if(mob.getMobBaseID() == 12008)
|
||||
mob.level = 65;
|
||||
else if(mob.getMobBaseID() == 12019)
|
||||
mob.level = 80;
|
||||
for(MobBaseEffects mbe : mob.mobBase.mobbaseEffects){
|
||||
if(mob.level >= mbe.getReqLvl()){
|
||||
try {
|
||||
|
||||
@@ -274,14 +274,14 @@ public class MobEquipment extends AbstractGameObject {
|
||||
EffectsBase effect = PowersManager.getEffectByToken(token);
|
||||
|
||||
AbstractPowerAction apa = PowersManager.getPowerActionByIDString(effect.getIDString());
|
||||
if (apa.getEffectsBase() != null)
|
||||
if (apa != null && apa.getEffectsBase() != null)
|
||||
if (apa.getEffectsBase().getValue() > 0) {
|
||||
//System.out.println(apa.getEffectsBase().getValue());
|
||||
value += apa.getEffectsBase().getValue();
|
||||
}
|
||||
|
||||
|
||||
if (apa.getEffectsBase2() != null)
|
||||
if (apa != null && apa.getEffectsBase2() != null)
|
||||
value += apa.getEffectsBase2().getValue();
|
||||
}
|
||||
|
||||
|
||||
@@ -876,6 +876,11 @@ public class NPC extends AbstractCharacter {
|
||||
// zone collection
|
||||
|
||||
this.parentZone = ZoneManager.getZoneByUUID(this.parentZoneUUID);
|
||||
if(this.parentZone == null) {
|
||||
Logger.error("PARENT ZONE NOT IDENTIFIED FOR NPC : " + this.getObjectUUID());
|
||||
return;
|
||||
}
|
||||
|
||||
this.parentZone.zoneNPCSet.remove(this);
|
||||
this.parentZone.zoneNPCSet.add(this);
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||
public class PlayerBonuses {
|
||||
|
||||
//First bonus set
|
||||
private ConcurrentHashMap<AbstractEffectModifier, Float> bonusFloats = new ConcurrentHashMap<>();
|
||||
ConcurrentHashMap<AbstractEffectModifier, Float> bonusFloats = new ConcurrentHashMap<>();
|
||||
private ConcurrentHashMap<AbstractEffectModifier, DamageShield> bonusDamageShields = new ConcurrentHashMap<>();
|
||||
private ConcurrentHashMap<AbstractEffectModifier, String> bonusStrings = new ConcurrentHashMap<>();
|
||||
private ConcurrentHashMap<ModType, HashSet<SourceType>> bonusLists = new ConcurrentHashMap<>();
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
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
Reference in New Issue
Block a user