Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 779e3da74e | |||
| e358c08773 | |||
| 2945fa3a47 | |||
| ab1541e741 | |||
| 3aeaa709a5 | |||
| 91e627df6b | |||
| d0795e9e1c | |||
| 0e12dd4874 | |||
| 25c0e48181 | |||
| 0d43c3620d | |||
| 2f6137f8df | |||
| 2843b86a93 | |||
| 8235de07ff | |||
| e2f9a4c7f0 | |||
| 55c6e3cf93 | |||
| 11c154e564 | |||
| 7fc0d27c3c | |||
| 1ac76cfcd8 | |||
| c8ed04aaaf |
+10
-40
@@ -139,8 +139,8 @@ public class Enum {
|
|||||||
HALFGIANTMALE(2010, MonsterType.HalfGiant, RunSpeed.STANDARD, CharacterSex.MALE, 1.15f),
|
HALFGIANTMALE(2010, MonsterType.HalfGiant, RunSpeed.STANDARD, CharacterSex.MALE, 1.15f),
|
||||||
HUMANMALE(2011, MonsterType.Human, RunSpeed.STANDARD, CharacterSex.MALE, 1),
|
HUMANMALE(2011, MonsterType.Human, RunSpeed.STANDARD, CharacterSex.MALE, 1),
|
||||||
HUMANFEMALE(2012, MonsterType.Human, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
|
HUMANFEMALE(2012, MonsterType.Human, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
|
||||||
IREKEIMALE(2013, MonsterType.Irekei, RunSpeed.IREKEI, CharacterSex.MALE, 1.1f),
|
IREKEIMALE(2013, MonsterType.Irekei, RunSpeed.STANDARD, CharacterSex.MALE, 1.1f),
|
||||||
IREKEIFEMALE(2014, MonsterType.Irekei, RunSpeed.IREKEI, CharacterSex.FEMALE, 1.1f),
|
IREKEIFEMALE(2014, MonsterType.Irekei, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.1f),
|
||||||
SHADEMALE(2015, MonsterType.Shade, RunSpeed.STANDARD, CharacterSex.MALE, 1),
|
SHADEMALE(2015, MonsterType.Shade, RunSpeed.STANDARD, CharacterSex.MALE, 1),
|
||||||
SHADEFEMALE(2016, MonsterType.Shade, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
|
SHADEFEMALE(2016, MonsterType.Shade, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
|
||||||
MINOMALE(2017, MonsterType.Minotaur, RunSpeed.MINOTAUR, CharacterSex.MALE, 1.3f),
|
MINOMALE(2017, MonsterType.Minotaur, RunSpeed.MINOTAUR, CharacterSex.MALE, 1.3f),
|
||||||
@@ -152,9 +152,7 @@ public class Enum {
|
|||||||
NEPHFEMALE(2026, MonsterType.Nephilim, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.1f),
|
NEPHFEMALE(2026, MonsterType.Nephilim, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.1f),
|
||||||
HALFGIANTFEMALE(2027, MonsterType.HalfGiant, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.15f),
|
HALFGIANTFEMALE(2027, MonsterType.HalfGiant, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.15f),
|
||||||
VAMPMALE(2028, MonsterType.Vampire, RunSpeed.STANDARD, CharacterSex.MALE, 1),
|
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, 0.80000001f),
|
|
||||||
LIZARDMAN(1998, MonsterType.Reptile, RunSpeed.STANDARD, CharacterSex.MALE, 1.05f);
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private static HashMap<Integer, RaceType> _raceTypeByID = new HashMap<>();
|
private static HashMap<Integer, RaceType> _raceTypeByID = new HashMap<>();
|
||||||
@@ -210,7 +208,6 @@ public class Enum {
|
|||||||
SENTINEL(0, 0, 0, 0, 0, 0, 0),
|
SENTINEL(0, 0, 0, 0, 0, 0, 0),
|
||||||
STANDARD(6.1900001f, 13.97f, 4.2199998f, 13.97f, 6.3299999f, 18.379999f, 6.5f),
|
STANDARD(6.1900001f, 13.97f, 4.2199998f, 13.97f, 6.3299999f, 18.379999f, 6.5f),
|
||||||
CENTAUR(6.1900001f, 16.940001f, 5.5500002f, 16.940001f, 6.3299999f, 18.379999f, 6.5f),
|
CENTAUR(6.1900001f, 16.940001f, 5.5500002f, 16.940001f, 6.3299999f, 18.379999f, 6.5f),
|
||||||
IREKEI(6.35f, 15.25f, 4.2199998f, 14.5f, 6.3299999f, 18.379999f, 6.5f),
|
|
||||||
MINOTAUR(6.6300001f, 15.95f, 4.2199998f, 15.95f, 6.3299999f, 18.379999f, 6.5f);
|
MINOTAUR(6.6300001f, 15.95f, 4.2199998f, 15.95f, 6.3299999f, 18.379999f, 6.5f);
|
||||||
|
|
||||||
private float walkStandard;
|
private float walkStandard;
|
||||||
@@ -963,17 +960,7 @@ public class Enum {
|
|||||||
SourceType returnMod;
|
SourceType returnMod;
|
||||||
if (modName.isEmpty())
|
if (modName.isEmpty())
|
||||||
return SourceType.None;
|
return SourceType.None;
|
||||||
switch(modName) {
|
|
||||||
case "Piercing":
|
|
||||||
modName = "Pierce";
|
|
||||||
break;
|
|
||||||
case "Crushing":
|
|
||||||
modName = "Crush";
|
|
||||||
break;
|
|
||||||
case "Slashing":
|
|
||||||
modName = "Slash";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
returnMod = SourceType.valueOf(modName.replace(",", ""));
|
returnMod = SourceType.valueOf(modName.replace(",", ""));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -1665,24 +1652,6 @@ public class Enum {
|
|||||||
return extents;
|
return extents;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isTrainerBuilding(){
|
|
||||||
switch(this){
|
|
||||||
case AMAZONHALL:
|
|
||||||
case CATHEDRAL:
|
|
||||||
case GREATHALL:
|
|
||||||
case KEEP:
|
|
||||||
case THIEFHALL:
|
|
||||||
case TEMPLEHALL:
|
|
||||||
case WIZARDHALL:
|
|
||||||
case ELVENHALL:
|
|
||||||
case ELVENSANCTUM:
|
|
||||||
case IREKEIHALL:
|
|
||||||
case FORESTHALL:
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum UpdateType {
|
public enum UpdateType {
|
||||||
@@ -2338,8 +2307,8 @@ public class Enum {
|
|||||||
public enum CityBoundsType {
|
public enum CityBoundsType {
|
||||||
|
|
||||||
GRID(640),
|
GRID(640),
|
||||||
ZONE(680),
|
ZONE(875),
|
||||||
PLACEMENT(681);
|
PLACEMENT(876);
|
||||||
|
|
||||||
public final float extents;
|
public final float extents;
|
||||||
|
|
||||||
@@ -2908,10 +2877,11 @@ public class Enum {
|
|||||||
|
|
||||||
public enum AIAgentType {
|
public enum AIAgentType {
|
||||||
MOBILE,
|
MOBILE,
|
||||||
|
GUARDCAPTAIN,
|
||||||
|
GUARDMINION,
|
||||||
|
GUARDWALLARCHER,
|
||||||
PET,
|
PET,
|
||||||
CHARMED,
|
CHARMED,
|
||||||
|
SIEGEENGINE;
|
||||||
SIEGEENGINE,
|
|
||||||
GUARD;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ import engine.net.client.msg.MoveToPointMsg;
|
|||||||
import engine.net.client.msg.UnloadObjectsMsg;
|
import engine.net.client.msg.UnloadObjectsMsg;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import engine.util.BoxTracker;
|
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -110,7 +109,7 @@ public enum InterestManager implements Runnable {
|
|||||||
origin.sendMsg(moveMsg);
|
origin.sendMsg(moveMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void reloadCharacter(AbstractCharacter absChar, boolean sendToSelf) {
|
public static void reloadCharacter(AbstractCharacter absChar) {
|
||||||
|
|
||||||
UnloadObjectsMsg uom = new UnloadObjectsMsg();
|
UnloadObjectsMsg uom = new UnloadObjectsMsg();
|
||||||
uom.addObject(absChar);
|
uom.addObject(absChar);
|
||||||
@@ -211,7 +210,7 @@ public enum InterestManager implements Runnable {
|
|||||||
if (origin == null)
|
if (origin == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!playerCharacter.enteredWorld)
|
if (!playerCharacter.isEnteredWorld())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (playerCharacter.getTeleportLock().readLock().tryLock()) {
|
if (playerCharacter.getTeleportLock().readLock().tryLock()) {
|
||||||
@@ -525,7 +524,6 @@ public enum InterestManager implements Runnable {
|
|||||||
player.setDirtyLoad(true);
|
player.setDirtyLoad(true);
|
||||||
updateStaticList(player, origin);
|
updateStaticList(player, origin);
|
||||||
updateMobileList(player, origin);
|
updateMobileList(player, origin);
|
||||||
BoxTracker.addPlayer(origin.machineID,player);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -73,14 +73,6 @@ public class dbBlueprintHandler extends dbHandlerBase {
|
|||||||
Blueprint._meshLookup.putIfAbsent(thisBlueprint.getMeshForRank(3), thisBlueprint);
|
Blueprint._meshLookup.putIfAbsent(thisBlueprint.getMeshForRank(3), thisBlueprint);
|
||||||
Blueprint._meshLookup.putIfAbsent(thisBlueprint.getMeshForRank(7), thisBlueprint);
|
Blueprint._meshLookup.putIfAbsent(thisBlueprint.getMeshForRank(7), thisBlueprint);
|
||||||
|
|
||||||
if(thisBlueprint.getName().contains("Vampire Shrine")){
|
|
||||||
Blueprint saetorShrine = new Blueprint(rs);
|
|
||||||
saetorShrine.setBlueprintUUID(1720000);
|
|
||||||
saetorShrine.rank1UUID = 1720000;
|
|
||||||
saetorShrine.rank3UUID = 1720000;
|
|
||||||
saetorShrine.rank7UUID = 1720000;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import engine.gameManager.DbManager;
|
|||||||
import engine.objects.AbstractCharacter;
|
import engine.objects.AbstractCharacter;
|
||||||
import engine.objects.CharacterSkill;
|
import engine.objects.CharacterSkill;
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
import engine.objects.SkillsBase;
|
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
|
|||||||
@@ -63,9 +63,6 @@ public abstract class dbHandlerBase {
|
|||||||
} else {
|
} else {
|
||||||
AbstractGameObject toAdd = localClass.getConstructor(ResultSet.class).newInstance(rs);
|
AbstractGameObject toAdd = localClass.getConstructor(ResultSet.class).newInstance(rs);
|
||||||
DbManager.addToCache(toAdd);
|
DbManager.addToCache(toAdd);
|
||||||
if(toAdd.getObjectType().equals(GameObjectType.Zone) && rs.getInt("canLoad") == 0){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
objectList.add((T) toAdd);
|
objectList.add((T) toAdd);
|
||||||
|
|
||||||
if (toAdd != null && toAdd instanceof AbstractWorldObject)
|
if (toAdd != null && toAdd instanceof AbstractWorldObject)
|
||||||
|
|||||||
@@ -28,67 +28,10 @@ public class dbItemBaseHandler extends dbHandlerBase {
|
|||||||
|
|
||||||
public void LOAD_BAKEDINSTATS(ItemBase itemBase) {
|
public void LOAD_BAKEDINSTATS(ItemBase itemBase) {
|
||||||
|
|
||||||
int itemBaseID = itemBase.getUUID();
|
|
||||||
switch(itemBaseID){
|
|
||||||
case 27550://bow
|
|
||||||
case 27560://dagger
|
|
||||||
case 27570://hammer
|
|
||||||
case 27580://axe
|
|
||||||
case 27590://sword
|
|
||||||
//return new String[]{"PRE-010","SUF-260"};
|
|
||||||
itemBaseID = 8000000;
|
|
||||||
break;
|
|
||||||
case 27600://staff
|
|
||||||
//return new String[]{"PRE-334","PRE-315"};
|
|
||||||
itemBaseID = 8000010;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 188500://HA chest
|
|
||||||
case 188510://HA arms
|
|
||||||
case 188520://HA legs
|
|
||||||
case 188530://HA gloves
|
|
||||||
case 188550://HA helm
|
|
||||||
case 188720://CC hood
|
|
||||||
case 188900://MA chest
|
|
||||||
case 188910://MA Sleeves
|
|
||||||
case 188920://MA Legs
|
|
||||||
case 188930://MA gloves
|
|
||||||
case 188950://MA helm
|
|
||||||
case 189100://la chest
|
|
||||||
case 189110://la arms
|
|
||||||
case 189120://la legs
|
|
||||||
case 189130://la gloves
|
|
||||||
case 189150://la helm
|
|
||||||
case 189550://CC gloves
|
|
||||||
//return new String[]{"PRE-130", "PRE-232", "PRE-212", "PRE-222", "SUF-007"};
|
|
||||||
itemBaseID = 8000020;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 188540://HA boots
|
|
||||||
case 188940://MA boots
|
|
||||||
case 189140://LA boots
|
|
||||||
case 189560://CC boots
|
|
||||||
//return new String[]{"PRE-133", "PRE-230", "PRE-210", "PRE-220", "SUF-003","SUF-150"};
|
|
||||||
itemBaseID = 8000030;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 188700://CC robe
|
|
||||||
//return new String[]{"PRE-130", "PRE-232", "PRE-212", "PRE-222","SUF-317","SUF-317","SUF-317"};
|
|
||||||
itemBaseID = 8000040;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 189500://MA shield
|
|
||||||
case 189510://HA shield
|
|
||||||
//return new String[]{"PRE-125","PRE-125","PRE-125", "PRE-230", "PRE-210", "PRE-220"};
|
|
||||||
itemBaseID = 8000050;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
try (Connection connection = DbManager.getConnection();
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_item_bakedinstat` WHERE `itemID` = ?")) {
|
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_item_bakedinstat` WHERE `itemID` = ?")) {
|
||||||
|
|
||||||
preparedStatement.setInt(1, itemBaseID);
|
preparedStatement.setInt(1, itemBase.getUUID());
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
@@ -144,19 +87,12 @@ public class dbItemBaseHandler extends dbHandlerBase {
|
|||||||
recordsRead++;
|
recordsRead++;
|
||||||
itemBase = new ItemBase(rs);
|
itemBase = new ItemBase(rs);
|
||||||
ItemBase.addToCache(itemBase);
|
ItemBase.addToCache(itemBase);
|
||||||
|
|
||||||
//copy the vampire shrine for saetor and change uuid and name
|
|
||||||
if(itemBase.getName().contains("Vampire Shrine")){
|
|
||||||
ItemBase saetorShrine = new ItemBase(rs);
|
|
||||||
saetorShrine.setUUID(1035);
|
|
||||||
saetorShrine.setName(saetorShrine.getName().replace("Vampire","Saetor"));
|
|
||||||
ItemBase.addToCache(saetorShrine);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
Logger.error(e);
|
Logger.error(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.info("read: " + recordsRead + " cached: " + ItemBase.getUUIDCache().size());
|
Logger.info("read: " + recordsRead + " cached: " + ItemBase.getUUIDCache().size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -135,11 +135,7 @@ public class dbItemHandler extends dbHandlerBase {
|
|||||||
ResultSet rs = preparedStatement.executeQuery();
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
|
||||||
if (rs.next())
|
if (rs.next())
|
||||||
try {
|
worked = rs.getBoolean("result");
|
||||||
worked = rs.getBoolean("result");
|
|
||||||
}catch(Exception e){
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
Logger.error(e);
|
Logger.error(e);
|
||||||
@@ -354,11 +350,7 @@ public class dbItemHandler extends dbHandlerBase {
|
|||||||
ResultSet rs = preparedStatement.executeQuery();
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
|
||||||
if (rs.next())
|
if (rs.next())
|
||||||
try {
|
worked = rs.getBoolean("result");
|
||||||
worked = rs.getBoolean("result");
|
|
||||||
} catch(Exception e){
|
|
||||||
worked = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
Logger.error(e);
|
Logger.error(e);
|
||||||
@@ -504,18 +496,4 @@ public class dbItemHandler extends dbHandlerBase {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean UPDATE_NUM_ITEMS(final Item item, int newValue) {
|
|
||||||
if (item.getItemBase().getType().equals(ItemType.GOLD))
|
|
||||||
return false;
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_item` SET `item_numberOfItems`=? WHERE `UID`=?")) {
|
|
||||||
preparedStatement.setInt(1, newValue);
|
|
||||||
preparedStatement.setLong(2, item.getObjectUUID());
|
|
||||||
return (preparedStatement.executeUpdate() > 0);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
Logger.error(e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,14 +9,12 @@
|
|||||||
package engine.db.handlers;
|
package engine.db.handlers;
|
||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.gameManager.BuildingManager;
|
|
||||||
import engine.gameManager.DbManager;
|
import engine.gameManager.DbManager;
|
||||||
import engine.objects.Mine;
|
import engine.objects.Mine;
|
||||||
import engine.objects.MineProduction;
|
import engine.objects.MineProduction;
|
||||||
import engine.objects.Resource;
|
import engine.objects.Resource;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.net.UnknownHostException;
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
@@ -34,24 +32,8 @@ public class dbMineHandler extends dbHandlerBase {
|
|||||||
|
|
||||||
if (id == 0)
|
if (id == 0)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
Mine mine = (Mine) DbManager.getFromCache(Enum.GameObjectType.Mine, id);
|
Mine mine = (Mine) DbManager.getFromCache(Enum.GameObjectType.Mine, id);
|
||||||
try (Connection connection = DbManager.getConnection();
|
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM obj_mine;")) {
|
|
||||||
|
|
||||||
//preparedStatement.setInt(1, id);
|
|
||||||
|
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
|
||||||
while(rs.next()){
|
|
||||||
if(rs.getInt("UID") == id){
|
|
||||||
int towerUID = rs.getInt("mine_buildingUID");
|
|
||||||
mine = Mine.getMineFromTower(towerUID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
|
||||||
Logger.error(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mine != null)
|
if (mine != null)
|
||||||
return mine;
|
return mine;
|
||||||
@@ -74,27 +56,13 @@ public class dbMineHandler extends dbHandlerBase {
|
|||||||
|
|
||||||
ArrayList<Mine> mines = new ArrayList<>();
|
ArrayList<Mine> mines = new ArrayList<>();
|
||||||
|
|
||||||
//try (Connection connection = DbManager.getConnection();
|
|
||||||
// PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_mine`.*, `object`.`parent` FROM `object` INNER JOIN `obj_mine` ON `obj_mine`.`UID` = `object`.`UID`")) {
|
|
||||||
|
|
||||||
// ResultSet rs = preparedStatement.executeQuery();
|
|
||||||
// mines = getObjectsFromRs(rs, 1000);
|
|
||||||
|
|
||||||
// } catch (SQLException e) {
|
|
||||||
// Logger.error(e);
|
|
||||||
//}
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
try (Connection connection = DbManager.getConnection();
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM obj_mine;")) {
|
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_mine`.*, `object`.`parent` FROM `object` INNER JOIN `obj_mine` ON `obj_mine`.`UID` = `object`.`UID`")) {
|
||||||
|
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
while(rs.next()){
|
mines = getObjectsFromRs(rs, 1000);
|
||||||
if(BuildingManager.getBuildingFromCache(rs.getInt("mine_buildingUID")) == null)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
mines.add(new Mine(rs));
|
} catch (SQLException e) {
|
||||||
}
|
|
||||||
|
|
||||||
} catch (SQLException | UnknownHostException e) {
|
|
||||||
Logger.error(e);
|
Logger.error(e);
|
||||||
}
|
}
|
||||||
return mines;
|
return mines;
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import java.sql.PreparedStatement;
|
|||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
public class dbMobBaseHandler extends dbHandlerBase {
|
public class dbMobBaseHandler extends dbHandlerBase {
|
||||||
|
|
||||||
@@ -113,25 +112,6 @@ public class dbMobBaseHandler extends dbHandlerBase {
|
|||||||
return mobBaseStats;
|
return mobBaseStats;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LOAD_ALL_MOBBASE_RACES() {
|
|
||||||
MobBase.mobbase_race_types = new HashMap<>();
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_mobbase`;")) {
|
|
||||||
|
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
|
||||||
|
|
||||||
while (rs.next()) {
|
|
||||||
int id = rs.getInt("loadID");
|
|
||||||
if(MobBase.mobbase_race_types.containsKey(id) == false){
|
|
||||||
MobBase.mobbase_race_types.put(id,rs.getString("raceType"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
|
||||||
Logger.error(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void LOAD_ALL_MOBBASE_SPEEDS(MobBase mobBase) {
|
public void LOAD_ALL_MOBBASE_SPEEDS(MobBase mobBase) {
|
||||||
|
|
||||||
if (mobBase.getLoadID() == 0)
|
if (mobBase.getLoadID() == 0)
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ public class dbMobHandler extends dbHandlerBase {
|
|||||||
Mob mobile = null;
|
Mob mobile = null;
|
||||||
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
try (Connection connection = DbManager.getConnection();
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("CALL `mob_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);")) {
|
PreparedStatement preparedStatement = connection.prepareStatement("CALL `mob_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);")) {
|
||||||
|
|
||||||
preparedStatement.setLong(1, toAdd.parentZoneUUID);
|
preparedStatement.setLong(1, toAdd.parentZoneUUID);
|
||||||
preparedStatement.setInt(2, toAdd.loadID);
|
preparedStatement.setInt(2, toAdd.loadID);
|
||||||
@@ -48,6 +48,7 @@ public class dbMobHandler extends dbHandlerBase {
|
|||||||
preparedStatement.setInt(11, toAdd.buildingUUID);
|
preparedStatement.setInt(11, toAdd.buildingUUID);
|
||||||
preparedStatement.setInt(12, toAdd.level);
|
preparedStatement.setInt(12, toAdd.level);
|
||||||
preparedStatement.setString(13, toAdd.firstName);
|
preparedStatement.setString(13, toAdd.firstName);
|
||||||
|
preparedStatement.setString(14, toAdd.behaviourType.toString());
|
||||||
|
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
|
||||||
|
|||||||
@@ -23,25 +23,7 @@ public class dbResistHandler extends dbHandlerBase {
|
|||||||
public dbResistHandler() {
|
public dbResistHandler() {
|
||||||
|
|
||||||
}
|
}
|
||||||
public void LOAD_RESISTS_FOR_MOBS() {
|
|
||||||
|
|
||||||
Resists resists = null;
|
|
||||||
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_mob_resists`;")) {
|
|
||||||
|
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
|
||||||
|
|
||||||
while(rs.next()){
|
|
||||||
resists = new Resists(rs);
|
|
||||||
if(!Resists.mobResists.containsKey(rs.getInt("ID")))
|
|
||||||
Resists.mobResists.put(rs.getInt("ID"),resists);
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
|
||||||
Logger.error(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public Resists GET_RESISTS_FOR_MOB(int resistID) {
|
public Resists GET_RESISTS_FOR_MOB(int resistID) {
|
||||||
|
|
||||||
Resists resists = null;
|
Resists resists = null;
|
||||||
|
|||||||
@@ -59,43 +59,6 @@ public class dbRuneBaseHandler extends dbHandlerBase {
|
|||||||
rb.setLevelRequired(rs.getInt("requiredRuneID"));
|
rb.setLevelRequired(rs.getInt("requiredRuneID"));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
int id = rs.getInt("runeID");
|
|
||||||
switch(id) {
|
|
||||||
case 3001:
|
|
||||||
case 3002:
|
|
||||||
case 3003:
|
|
||||||
case 3004:
|
|
||||||
case 3007:
|
|
||||||
case 3008:
|
|
||||||
case 3009:
|
|
||||||
case 3013:
|
|
||||||
case 3014:
|
|
||||||
case 3016:
|
|
||||||
case 3017:
|
|
||||||
case 3018:
|
|
||||||
case 3019:
|
|
||||||
case 3020:
|
|
||||||
case 3021:
|
|
||||||
case 3026:
|
|
||||||
case 3030:
|
|
||||||
case 3031:
|
|
||||||
case 3033:
|
|
||||||
case 3037:
|
|
||||||
case 3040:
|
|
||||||
case 3045:
|
|
||||||
case 3046:
|
|
||||||
case 3047:
|
|
||||||
case 3048:
|
|
||||||
case 2514:
|
|
||||||
rb.getRace().put(1999, true);
|
|
||||||
break;
|
|
||||||
case 3035:
|
|
||||||
rb.getBaseClass().put(2501,true);
|
|
||||||
break;
|
|
||||||
case 3049:
|
|
||||||
rb.getRace().clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
|||||||
@@ -143,13 +143,6 @@ public class dbSkillBaseHandler extends dbHandlerBase {
|
|||||||
|
|
||||||
SkillsBase.runeSkillsCache.get(runeID).put(token, amount);
|
SkillsBase.runeSkillsCache.get(runeID).put(token, amount);
|
||||||
}
|
}
|
||||||
//add saetor skills
|
|
||||||
HashMap<Integer, Integer> skills = new HashMap<>();
|
|
||||||
skills.put(71438003,15); // staff
|
|
||||||
skills.put(-61022283,10); // staff mastery
|
|
||||||
skills.put(95961104,10); // parry
|
|
||||||
SkillsBase.runeSkillsCache.put(1999,skills);
|
|
||||||
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
Logger.error(e);
|
Logger.error(e);
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import engine.Enum.GameObjectType;
|
|||||||
import engine.InterestManagement.WorldGrid;
|
import engine.InterestManagement.WorldGrid;
|
||||||
import engine.devcmd.AbstractDevCmd;
|
import engine.devcmd.AbstractDevCmd;
|
||||||
import engine.gameManager.*;
|
import engine.gameManager.*;
|
||||||
import engine.math.Vector3fImmutable;
|
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
@@ -71,30 +70,28 @@ public class AddNPCCmd extends AbstractDevCmd {
|
|||||||
throwbackError(pc, "Failed to find zone to place npc in.");
|
throwbackError(pc, "Failed to find zone to place npc in.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Building building = null;
|
|
||||||
if (target != null)
|
if (target != null)
|
||||||
if (target.getObjectType() == GameObjectType.Building) {
|
if (target.getObjectType() == GameObjectType.Building) {
|
||||||
building = (Building)target;
|
Building parentBuilding = (Building) target;
|
||||||
|
BuildingManager.addHirelingForWorld(parentBuilding, pc, parentBuilding.getLoc(), parentBuilding.getParentZone(), contract, level);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
NPC created;
|
|
||||||
Guild guild = null;
|
NPC npc = NPC.createNPC(name, contractID,
|
||||||
Vector3fImmutable loc;
|
pc.getLoc(), null, zone, (short) level, null);
|
||||||
if(building != null){
|
|
||||||
guild = building.getGuild();
|
if (npc != null) {
|
||||||
loc = building.loc;
|
WorldGrid.addObject(npc, pc);
|
||||||
} else{
|
ChatManager.chatSayInfo(pc,
|
||||||
loc = pc.loc;
|
"NPC with ID " + npc.getDBID() + " added");
|
||||||
|
this.setResult(String.valueOf(npc.getDBID()));
|
||||||
|
} else {
|
||||||
|
throwbackError(pc, "Failed to create npc of contract type "
|
||||||
|
+ contractID);
|
||||||
|
Logger.error(
|
||||||
|
"Failed to create npc of contract type " + contractID);
|
||||||
}
|
}
|
||||||
created = NPC.createNPC(name, contractID, loc, guild, zone, (short)level, building);
|
|
||||||
created.bindLoc = loc;
|
|
||||||
if(building != null) {
|
|
||||||
created.buildingUUID = building.getObjectUUID();
|
|
||||||
created.building = building;
|
|
||||||
NPCManager.slotCharacterInBuilding(created);
|
|
||||||
}
|
|
||||||
created.setLoc(created.bindLoc);
|
|
||||||
created.updateDatabase();
|
|
||||||
throwbackInfo(pc, "Created NPC with UUID: " + created.getObjectUUID());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ package engine.devcmd.cmds;
|
|||||||
|
|
||||||
import engine.devcmd.AbstractDevCmd;
|
import engine.devcmd.AbstractDevCmd;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import engine.powers.EffectsBase;
|
|
||||||
|
|
||||||
public class EnchantCmd extends AbstractDevCmd {
|
public class EnchantCmd extends AbstractDevCmd {
|
||||||
|
|
||||||
@@ -56,9 +55,21 @@ public class EnchantCmd extends AbstractDevCmd {
|
|||||||
this.setResult(String.valueOf(item.getObjectUUID()));
|
this.setResult(String.valueOf(item.getObjectUUID()));
|
||||||
} else {
|
} else {
|
||||||
int cnt = words.length;
|
int cnt = words.length;
|
||||||
String enchant = words[1];
|
for (int i = 1; i < cnt; i++) {
|
||||||
enchant = EffectsBase.getItemEffectsByName(enchant.toLowerCase());
|
String enchant = words[i];
|
||||||
item.addPermanentEnchantmentForDev(enchant, 0);
|
boolean valid = true;
|
||||||
|
for (Effect eff : item.getEffects().values()) {
|
||||||
|
if (eff.getEffectsBase().getIDString().equals(enchant)) {
|
||||||
|
throwbackError(pc, "This item already has that enchantment");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (valid) {
|
||||||
|
item.addPermanentEnchantmentForDev(enchant, rank);
|
||||||
|
this.setResult(String.valueOf(item.getObjectUUID()));
|
||||||
|
} else
|
||||||
|
throwbackError(pc, "Invalid Enchantment. Enchantment must consist of SUF-001 to SUF-328 or PRE-001 to PRE-334. Sent " + enchant + '.');
|
||||||
|
}
|
||||||
cim.updateInventory();
|
cim.updateInventory();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ public class FlashMsgCmd extends AbstractDevCmd {
|
|||||||
this.sendUsage(pcSender);
|
this.sendUsage(pcSender);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ChatManager.chatSystemFlash(String.join(" ", args));
|
ChatManager.chatSystemFlash(args[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -280,7 +280,7 @@ public class InfoCmd extends AbstractDevCmd {
|
|||||||
output += newline;
|
output += newline;
|
||||||
output += "Inventory Weight:" + (targetPC.getCharItemManager().getInventoryWeight() + targetPC.getCharItemManager().getEquipWeight());
|
output += "Inventory Weight:" + (targetPC.getCharItemManager().getInventoryWeight() + targetPC.getCharItemManager().getEquipWeight());
|
||||||
output += newline;
|
output += newline;
|
||||||
output += "Max Inventory Weight:" + targetPC.getInventoryCapacity();
|
output += "Max Inventory Weight:" + ((int) targetPC.statStrBase * 3);
|
||||||
output += newline;
|
output += newline;
|
||||||
output += "ALTITUDE :" + targetPC.getAltitude();
|
output += "ALTITUDE :" + targetPC.getAltitude();
|
||||||
output += newline;
|
output += newline;
|
||||||
@@ -336,9 +336,8 @@ public class InfoCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
output += "Swimming : " + targetPC.isSwimming();
|
output += "Swimming : " + targetPC.isSwimming();
|
||||||
output += newline;
|
output += newline;
|
||||||
output += "isMoving : " + targetPC.isMoving() + newline;
|
output += "isMoving : " + targetPC.isMoving();
|
||||||
output += "Zerg Multiplier: " + targetPC.ZergMultiplier + newline;
|
|
||||||
output += "isBoxed: " + targetPC.isBoxed + newline;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NPC:
|
case NPC:
|
||||||
@@ -526,7 +525,7 @@ public class InfoCmd extends AbstractDevCmd {
|
|||||||
ConcurrentHashMap<String, Effect> effects = item.getEffects();
|
ConcurrentHashMap<String, Effect> effects = item.getEffects();
|
||||||
for (String name : effects.keySet()) {
|
for (String name : effects.keySet()) {
|
||||||
Effect eff = effects.get(name);
|
Effect eff = effects.get(name);
|
||||||
output += eff.getEffectsBase().getIDString() + " Static:" + eff.isStatic();
|
output += eff.getEffectsBase().getIDString();
|
||||||
output += newline;
|
output += newline;
|
||||||
// output += eff.getEffectToken() + (eff.bakedInStat() ? " (baked in)" : "") + newline;
|
// output += eff.getEffectToken() + (eff.bakedInStat() ? " (baked in)" : "") + newline;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,10 +65,6 @@ public class MakeItemCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
if (item == null || !worked) {
|
if (item == null || !worked) {
|
||||||
throwbackError(pc, "DB error 2: Unable to create item.");
|
throwbackError(pc, "DB error 2: Unable to create item.");
|
||||||
if(item == null)
|
|
||||||
throwbackError(pc, "Item Null");
|
|
||||||
else
|
|
||||||
throwbackError(pc, "Worked = false");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,10 +222,6 @@ public class MakeItemCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
if (item == null || !worked) {
|
if (item == null || !worked) {
|
||||||
throwbackError(pc, "DB error 2: Unable to create item.");
|
throwbackError(pc, "DB error 2: Unable to create item.");
|
||||||
if(item == null)
|
|
||||||
throwbackError(pc, "Item Null");
|
|
||||||
else
|
|
||||||
throwbackError(pc, "Worked = false");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import engine.objects.AbstractGameObject;
|
|||||||
import engine.objects.Building;
|
import engine.objects.Building;
|
||||||
import engine.objects.Mine;
|
import engine.objects.Mine;
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
|
import engine.workthreads.HourlyJobThread;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@@ -40,10 +41,10 @@ public class MineActiveCmd extends AbstractDevCmd {
|
|||||||
String trigger = args[0];
|
String trigger = args[0];
|
||||||
switch (trigger) {
|
switch (trigger) {
|
||||||
case "true":
|
case "true":
|
||||||
Mine.mineWindowOpen(mine);
|
HourlyJobThread.mineWindowOpen(mine);
|
||||||
break;
|
break;
|
||||||
case "false":
|
case "false":
|
||||||
Mine.mineWindowClose(mine);
|
HourlyJobThread.mineWindowClose(mine);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
this.sendUsage(pcSender);
|
this.sendUsage(pcSender);
|
||||||
|
|||||||
@@ -39,9 +39,6 @@ public class PrintResistsCmd extends AbstractDevCmd {
|
|||||||
if (mb != null)
|
if (mb != null)
|
||||||
name = mb.getFirstName();
|
name = mb.getFirstName();
|
||||||
type = "Mob";
|
type = "Mob";
|
||||||
throwbackInfo(pc, "Server resists for " + type + ' ' + name);
|
|
||||||
tar.getResists().printResistsToClient(pc);
|
|
||||||
return;
|
|
||||||
} else if (tar instanceof NPC) {
|
} else if (tar instanceof NPC) {
|
||||||
NPC npc = (NPC) tar;
|
NPC npc = (NPC) tar;
|
||||||
Contract contract = npc.getContract();
|
Contract contract = npc.getContract();
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
package engine.devcmd.cmds;
|
package engine.devcmd.cmds;
|
||||||
|
|
||||||
import engine.Enum;
|
|
||||||
import engine.devcmd.AbstractDevCmd;
|
import engine.devcmd.AbstractDevCmd;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
|
|
||||||
@@ -56,7 +55,6 @@ public class PrintStatsCmd extends AbstractDevCmd {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void printStatsPlayer(PlayerCharacter pc, PlayerCharacter tar) {
|
public void printStatsPlayer(PlayerCharacter pc, PlayerCharacter tar) {
|
||||||
tar.calculateMaxHealthManaStamina();
|
|
||||||
String newline = "\r\n ";
|
String newline = "\r\n ";
|
||||||
String out = "Server stats for Player " + tar.getFirstName() + newline;
|
String out = "Server stats for Player " + tar.getFirstName() + newline;
|
||||||
out += "Unused Stats: " + tar.getUnusedStatPoints() + newline;
|
out += "Unused Stats: " + tar.getUnusedStatPoints() + newline;
|
||||||
@@ -74,11 +72,6 @@ public class PrintStatsCmd extends AbstractDevCmd {
|
|||||||
out += "Main Hand: atr: " + tar.getAtrHandOne() + ", damage: " + tar.getMinDamageHandOne() + " to " + tar.getMaxDamageHandOne() + ", speed: " + tar.getSpeedHandOne() + 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 += "Off Hand: atr: " + tar.getAtrHandTwo() + ", damage: " + tar.getMinDamageHandTwo() + " to " + tar.getMaxDamageHandTwo() + ", speed: " + tar.getSpeedHandTwo() + newline;
|
||||||
out += "isAlive: " + tar.isAlive() + ", Combat: " + tar.isCombat() + newline;
|
out += "isAlive: " + tar.isAlive() + ", Combat: " + tar.isCombat() + newline;
|
||||||
out += "Health Regen: " + tar.getRegenModifier(Enum.ModType.HealthRecoverRate) + newline;
|
|
||||||
out += "Stamina Regen: " + tar.getRegenModifier(Enum.ModType.StaminaRecoverRate) + newline;
|
|
||||||
out += "Mana Regen: " + tar.getRegenModifier(Enum.ModType.ManaRecoverRate) + newline;
|
|
||||||
out += "Zerg Multiplier: " + tar.ZergMultiplier + newline;
|
|
||||||
|
|
||||||
throwbackInfo(pc, out);
|
throwbackInfo(pc, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ public class SetAdminRuneCmd extends AbstractDevCmd {
|
|||||||
if (worked) {
|
if (worked) {
|
||||||
ChatManager.chatSayInfo(pcSender,
|
ChatManager.chatSayInfo(pcSender,
|
||||||
"rune of ID " + runeID + " removed");
|
"rune of ID " + runeID + " removed");
|
||||||
InterestManager.reloadCharacter(pcSender,false);
|
InterestManager.reloadCharacter(pcSender);
|
||||||
} else
|
} else
|
||||||
throwbackError(pcSender, "Failed to remove the rune of type "
|
throwbackError(pcSender, "Failed to remove the rune of type "
|
||||||
+ runeID);
|
+ runeID);
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ public class SetBaseClassCmd extends AbstractDevCmd {
|
|||||||
this.setTarget(pc); //for logging
|
this.setTarget(pc); //for logging
|
||||||
ChatManager.chatSayInfo(pc,
|
ChatManager.chatSayInfo(pc,
|
||||||
"BaseClass changed to " + classID);
|
"BaseClass changed to " + classID);
|
||||||
InterestManager.reloadCharacter(pc,false);
|
InterestManager.reloadCharacter(pc);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import engine.devcmd.AbstractDevCmd;
|
|||||||
import engine.gameManager.ChatManager;
|
import engine.gameManager.ChatManager;
|
||||||
import engine.objects.AbstractGameObject;
|
import engine.objects.AbstractGameObject;
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
import engine.server.MBServerStatics;
|
|
||||||
|
|
||||||
public class SetLevelCmd extends AbstractDevCmd {
|
public class SetLevelCmd extends AbstractDevCmd {
|
||||||
|
|
||||||
@@ -47,7 +46,7 @@ public class SetLevelCmd extends AbstractDevCmd {
|
|||||||
this.sendUsage(pc);
|
this.sendUsage(pc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (level < 1 || level > MBServerStatics.LEVELCAP) {
|
if (level < 1 || level > 75) {
|
||||||
this.sendHelp(pc);
|
this.sendHelp(pc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -58,12 +57,12 @@ public class SetLevelCmd extends AbstractDevCmd {
|
|||||||
tar.setLevel((short) level);
|
tar.setLevel((short) level);
|
||||||
this.setTarget(tar); //for logging
|
this.setTarget(tar); //for logging
|
||||||
ChatManager.chatSayInfo(pc, tar.getFirstName() + " level changed to " + level);
|
ChatManager.chatSayInfo(pc, tar.getFirstName() + " level changed to " + level);
|
||||||
InterestManager.reloadCharacter(tar,false);
|
InterestManager.reloadCharacter(tar);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String _getHelpString() {
|
protected String _getHelpString() {
|
||||||
return "Sets your character's level to 'amount'. 'amount' must be between 1-" + MBServerStatics.LEVELCAP;
|
return "Sets your character's level to 'amount'. 'amount' must be between 1-75";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ public class SetPromotionClassCmd extends AbstractDevCmd {
|
|||||||
pc.setPromotionClass(classID);
|
pc.setPromotionClass(classID);
|
||||||
ChatManager.chatSayInfo(pc,
|
ChatManager.chatSayInfo(pc,
|
||||||
"PromotionClass changed to " + classID);
|
"PromotionClass changed to " + classID);
|
||||||
InterestManager.reloadCharacter(pc,false);
|
InterestManager.reloadCharacter(pc);
|
||||||
this.setTarget(pc); //for logging
|
this.setTarget(pc); //for logging
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ public class SetRuneCmd extends AbstractDevCmd {
|
|||||||
if (worked) {
|
if (worked) {
|
||||||
ChatManager.chatSayInfo(pcSender,
|
ChatManager.chatSayInfo(pcSender,
|
||||||
"rune of ID " + runeID + " removed");
|
"rune of ID " + runeID + " removed");
|
||||||
InterestManager.reloadCharacter(pcSender,false);
|
InterestManager.reloadCharacter(pcSender);
|
||||||
} else
|
} else
|
||||||
throwbackError(pcSender, "Failed to remove the rune of type "
|
throwbackError(pcSender, "Failed to remove the rune of type "
|
||||||
+ runeID);
|
+ runeID);
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
package engine.devcmd.cmds;
|
package engine.devcmd.cmds;
|
||||||
|
|
||||||
import engine.Enum;
|
|
||||||
import engine.devcmd.AbstractDevCmd;
|
import engine.devcmd.AbstractDevCmd;
|
||||||
import engine.gameManager.LootManager;
|
import engine.gameManager.LootManager;
|
||||||
import engine.gameManager.ZoneManager;
|
import engine.gameManager.ZoneManager;
|
||||||
import engine.loot.BootySetEntry;
|
import engine.loot.BootySetEntry;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import org.pmw.tinylog.Logger;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
@@ -28,9 +26,7 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
|||||||
String output;
|
String output;
|
||||||
|
|
||||||
output = "Booty Simulation:" + newline;
|
output = "Booty Simulation:" + newline;
|
||||||
if(target.getObjectType().equals(Enum.GameObjectType.Mob) == false){
|
|
||||||
return;//ugh what?
|
|
||||||
}
|
|
||||||
Mob mob = (Mob) target;
|
Mob mob = (Mob) target;
|
||||||
output += "Name: " + mob.getName() + newline;
|
output += "Name: " + mob.getName() + newline;
|
||||||
output += "Special Loot:" + newline;
|
output += "Special Loot:" + newline;
|
||||||
@@ -55,7 +51,7 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
|||||||
int failures = 0;
|
int failures = 0;
|
||||||
int goldAmount = 0;
|
int goldAmount = 0;
|
||||||
|
|
||||||
for (int i = 0; i < 10000; ++i) {
|
for (int i = 0; i < 100; ++i) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
mob.loadInventory();
|
mob.loadInventory();
|
||||||
@@ -83,19 +79,12 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
|||||||
goldAmount += lootItem.getNumOfItems();
|
goldAmount += lootItem.getNumOfItems();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if(Warehouse.maxResources.containsKey(lootItem.getItemBaseID())){
|
OtherDrops.add(lootItem);
|
||||||
Resources.add(lootItem);
|
|
||||||
} else {
|
|
||||||
OtherDrops.add(lootItem);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
failures++;
|
failures++;
|
||||||
//throwbackError(playerCharacter,ex.getLocalizedMessage());
|
|
||||||
//Logger.error(ex.fillInStackTrace());
|
|
||||||
//return;
|
|
||||||
}
|
}
|
||||||
if (mob.getEquip() != null) {
|
if (mob.getEquip() != null) {
|
||||||
for (MobEquipment me : mob.getEquip().values()) {
|
for (MobEquipment me : mob.getEquip().values()) {
|
||||||
@@ -142,17 +131,8 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
|||||||
}
|
}
|
||||||
|
|
||||||
output += "GLASS DROPS: " + GlassItems.size() + newline;
|
output += "GLASS DROPS: " + GlassItems.size() + newline;
|
||||||
for(Item glass : GlassItems){
|
|
||||||
output += " " + glass.getName() + newline;
|
|
||||||
}
|
|
||||||
output += "RUNE DROPS: " + Runes.size() + newline;
|
output += "RUNE DROPS: " + Runes.size() + newline;
|
||||||
for(Item rune : Runes){
|
|
||||||
output += " " + rune.getName() + newline;
|
|
||||||
}
|
|
||||||
output += "CONTRACTS DROPS: " + Contracts.size() + newline;
|
output += "CONTRACTS DROPS: " + Contracts.size() + newline;
|
||||||
for(Item contract : Contracts){
|
|
||||||
output += " " + contract.getName() + newline;
|
|
||||||
}
|
|
||||||
output += "RESOURCE DROPS: " + Resources.size() + newline;
|
output += "RESOURCE DROPS: " + Resources.size() + newline;
|
||||||
output += "OFFERINGS DROPPED: " + Offerings.size() + newline;
|
output += "OFFERINGS DROPPED: " + Offerings.size() + newline;
|
||||||
output += "ENCHANTED ITEMS DROPPED: " + OtherDrops.size() + newline;
|
output += "ENCHANTED ITEMS DROPPED: " + OtherDrops.size() + newline;
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ public class SlotTestCmd extends AbstractDevCmd {
|
|||||||
outString += "Hirelings List:";
|
outString += "Hirelings List:";
|
||||||
|
|
||||||
for (AbstractCharacter hireling : building.getHirelings().keySet())
|
for (AbstractCharacter hireling : building.getHirelings().keySet())
|
||||||
outString += "\r\n" + hireling.getName() + "(" + hireling.getObjectUUID() + ") slot : " + building.getHirelings().get(hireling);
|
outString += "\r\n" + hireling.getName() + " slot : " + building.getHirelings().get(hireling);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,8 +14,8 @@ import engine.devcmd.AbstractDevCmd;
|
|||||||
import engine.gameManager.PowersManager;
|
import engine.gameManager.PowersManager;
|
||||||
import engine.objects.AbstractGameObject;
|
import engine.objects.AbstractGameObject;
|
||||||
import engine.objects.Mob;
|
import engine.objects.Mob;
|
||||||
import engine.objects.MobBase;
|
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
|
import engine.powers.MobPowerEntry;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@@ -91,14 +91,10 @@ public class aiInfoCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
output += "Powers:" + newline;
|
output += "Powers:" + newline;
|
||||||
|
|
||||||
for (int token : mob.mobPowers.keySet())
|
for (MobPowerEntry mobPowerEntry : PowersManager.getPowersForMobile(mob))
|
||||||
output += PowersManager.getPowerByToken(token).getName() + newline;
|
output += PowersManager.getPowerByToken(mobPowerEntry.token).getName() + newline;
|
||||||
|
|
||||||
output += "Race type: " + MobBase.mobbase_race_types.get(mob.getMobBaseID());
|
|
||||||
throwbackInfo(playerCharacter, output);
|
throwbackInfo(playerCharacter, output);
|
||||||
|
|
||||||
throwbackInfo(playerCharacter, "Race Types: " + MobBase.mobbase_race_types.size());
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,72 +0,0 @@
|
|||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.devcmd.cmds;
|
|
||||||
|
|
||||||
import engine.Enum.GameObjectType;
|
|
||||||
import engine.InterestManagement.WorldGrid;
|
|
||||||
import engine.devcmd.AbstractDevCmd;
|
|
||||||
import engine.gameManager.*;
|
|
||||||
import engine.objects.*;
|
|
||||||
import org.pmw.tinylog.Logger;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Eighty
|
|
||||||
*/
|
|
||||||
public class setProfit extends AbstractDevCmd {
|
|
||||||
|
|
||||||
public setProfit() {
|
|
||||||
super("setprofit");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void _doCmd(PlayerCharacter pc, String[] words,
|
|
||||||
AbstractGameObject target) {
|
|
||||||
|
|
||||||
if (words.length < 2) {
|
|
||||||
this.sendUsage(pc);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
float updateValue;
|
|
||||||
try {
|
|
||||||
updateValue = Float.parseFloat(words[1]);
|
|
||||||
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
throwbackError(pc,
|
|
||||||
"Failed to parse supplied contractID or level to an Integer.");
|
|
||||||
return; // NaN
|
|
||||||
}
|
|
||||||
if(target.getObjectType().equals(GameObjectType.NPC) == false){
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
NPC npc = (NPC)target;
|
|
||||||
if(words[0].toLowerCase().equals("buy")){
|
|
||||||
npc.buyPercent = updateValue;
|
|
||||||
npc.updateDatabase();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(words[0].toLowerCase().equals("sell")){
|
|
||||||
npc.sellPercent = updateValue;
|
|
||||||
npc.updateDatabase();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String _getHelpString() {
|
|
||||||
return "Sets profit margin of targeted NPC";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String _getUsageString() {
|
|
||||||
return "' /setprofit buy/sell VALUE(1.0)'";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -520,10 +520,9 @@ public enum BuildingManager {
|
|||||||
if (building.getBlueprintUUID() == 0)
|
if (building.getBlueprintUUID() == 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (building.getBlueprint().getSlotsForRank(building.getRank()) == building.getHirelings().size()) {
|
if (building.getBlueprint().getMaxSlots() == building.getHirelings().size())
|
||||||
Logger.error("failed at addHireling with contract: " + contract.getContractID());
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
String pirateName = NPCManager.getPirateName(contract.getMobbaseID());
|
String pirateName = NPCManager.getPirateName(contract.getMobbaseID());
|
||||||
|
|
||||||
if (item.getChargesRemaining() > 0)
|
if (item.getChargesRemaining() > 0)
|
||||||
@@ -531,41 +530,63 @@ public enum BuildingManager {
|
|||||||
else
|
else
|
||||||
rank = 10;
|
rank = 10;
|
||||||
|
|
||||||
Mob mob;
|
Mob mobile;
|
||||||
NPC npc;
|
NPC npc;
|
||||||
|
|
||||||
if (NPC.ISWallArcher(contract)) {
|
if (NPC.ISWallArcher(contract)) {
|
||||||
|
|
||||||
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank);
|
mobile = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank);
|
||||||
|
|
||||||
if (mob == null)
|
if (mobile == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
mob.setLoc(mob.getLoc());
|
// Configure AI and write new mobile to disk
|
||||||
|
|
||||||
|
mobile.behaviourType = Enum.MobBehaviourType.GuardWallArcher;
|
||||||
|
mobile = DbManager.MobQueries.PERSIST(mobile);
|
||||||
|
|
||||||
|
// Spawn new mobile
|
||||||
|
|
||||||
|
mobile.setLoc(mobile.getLoc());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NPC.ISGuardCaptain(contract.getContractID())) {
|
if (NPC.ISGuardCaptain(contract.getContractID())) {
|
||||||
|
|
||||||
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank);
|
mobile = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank);
|
||||||
|
|
||||||
if (mob == null)
|
if (mobile == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
mob.setLoc(mob.getLoc());
|
// Configure AI and write new mobile to disk
|
||||||
|
|
||||||
|
mobile.behaviourType = Enum.MobBehaviourType.GuardCaptain;
|
||||||
|
mobile = DbManager.MobQueries.PERSIST(mobile);
|
||||||
|
|
||||||
|
// Spawn new mobile
|
||||||
|
|
||||||
|
mobile.setLoc(mobile.getLoc());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (contract.getContractID() == 910) {
|
if (contract.getContractID() == 910) {
|
||||||
|
|
||||||
//guard dog
|
//guard dog
|
||||||
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank);
|
mobile = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank);
|
||||||
|
|
||||||
if (mob == null)
|
if (mobile == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
mob.setLoc(mob.getLoc());
|
// Configure AI and write new mobile to disk
|
||||||
|
|
||||||
|
mobile.behaviourType = Enum.MobBehaviourType.GuardCaptain;
|
||||||
|
mobile = DbManager.MobQueries.PERSIST(mobile);
|
||||||
|
|
||||||
|
// Spawn new mobile
|
||||||
|
|
||||||
|
mobile.setLoc(mobile.getLoc());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -528,7 +528,7 @@ public enum CombatManager {
|
|||||||
float atr;
|
float atr;
|
||||||
int minDamage, maxDamage;
|
int minDamage, maxDamage;
|
||||||
int errorTrack = 0;
|
int errorTrack = 0;
|
||||||
int subTrack = 0;
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
if (ac == null)
|
if (ac == null)
|
||||||
@@ -645,24 +645,22 @@ public enum CombatManager {
|
|||||||
errorTrack = 4;
|
errorTrack = 4;
|
||||||
|
|
||||||
//Get hit chance
|
//Get hit chance
|
||||||
float constant = (atr+defense)*0.315f;
|
|
||||||
float atrChance = atr - constant;
|
int chance;
|
||||||
float defChance = defense - constant + atrChance;
|
float dif = atr - defense;
|
||||||
float smallChance = atrChance/defChance;
|
|
||||||
int chance = (int)(smallChance * 100);
|
if (dif > 100)
|
||||||
|
chance = 94;
|
||||||
|
else if (dif < -100)
|
||||||
|
chance = 4;
|
||||||
|
else
|
||||||
|
chance = (int) ((0.45 * dif) + 49);
|
||||||
|
|
||||||
errorTrack = 5;
|
errorTrack = 5;
|
||||||
|
|
||||||
if(chance < 5){
|
|
||||||
chance = 5;
|
|
||||||
}
|
|
||||||
if(chance > 95){
|
|
||||||
chance = 95;
|
|
||||||
}
|
|
||||||
|
|
||||||
//calculate hit/miss
|
//calculate hit/miss
|
||||||
|
|
||||||
int roll = ThreadLocalRandom.current().nextInt(1,101);
|
int roll = ThreadLocalRandom.current().nextInt(100);
|
||||||
DeferredPowerJob dpj = null;
|
DeferredPowerJob dpj = null;
|
||||||
|
|
||||||
if (roll < chance) {
|
if (roll < chance) {
|
||||||
@@ -811,7 +809,11 @@ public enum CombatManager {
|
|||||||
|
|
||||||
float damage;
|
float damage;
|
||||||
|
|
||||||
damage = calculateDamage(ac, tarAc, minDamage, maxDamage, damageType, resists);
|
if (wb != null)
|
||||||
|
damage = calculateDamage(ac, tarAc, minDamage, maxDamage, damageType, resists);
|
||||||
|
else
|
||||||
|
damage = calculateDamage(ac, tarAc, minDamage, maxDamage, damageType, resists);
|
||||||
|
|
||||||
float d = 0f;
|
float d = 0f;
|
||||||
|
|
||||||
errorTrack = 12;
|
errorTrack = 12;
|
||||||
@@ -819,41 +821,28 @@ public enum CombatManager {
|
|||||||
//Subtract Damage from target's health
|
//Subtract Damage from target's health
|
||||||
|
|
||||||
if (tarAc != null) {
|
if (tarAc != null) {
|
||||||
if (tarAc.isSit())
|
|
||||||
damage *= 2.5f; //increase damage if sitting
|
|
||||||
|
|
||||||
|
if (tarAc.isSit())
|
||||||
|
damage *= 2.5f; //increase damage if sitting
|
||||||
|
|
||||||
subTrack = 1;
|
if (tarAc.getObjectType() == GameObjectType.Mob) {
|
||||||
|
if(ac.getObjectType().equals(GameObjectType.PlayerCharacter))
|
||||||
|
((Mob)tarAc).playerAgroMap.put(ac.getObjectUUID(), ((Mob) tarAc).playerAgroMap.get(ac.getObjectUUID()) + damage);
|
||||||
|
((Mob) tarAc).handleDirectAggro(ac);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tarAc.getHealth() > 0)
|
||||||
|
d = tarAc.modifyHealth(-damage, ac, false);
|
||||||
|
|
||||||
if (tarAc.getObjectType() == GameObjectType.Mob) {
|
|
||||||
Mob mobTarget = (Mob) tarAc;
|
|
||||||
if (ac.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
|
||||||
subTrack = 2;
|
|
||||||
if (mobTarget.playerAgroMap.containsKey(ac.getObjectUUID())) {
|
|
||||||
subTrack = 3;
|
|
||||||
float hateValue = damage + mobTarget.playerAgroMap.get(ac.getObjectUUID());
|
|
||||||
mobTarget.playerAgroMap.put(ac.getObjectUUID(), hateValue);
|
|
||||||
} else {
|
|
||||||
mobTarget.playerAgroMap.put(ac.getObjectUUID(), damage);
|
|
||||||
}
|
|
||||||
subTrack = 4;
|
|
||||||
}
|
|
||||||
mobTarget.handleDirectAggro(ac);
|
|
||||||
}
|
|
||||||
if (tarAc.getHealth() > 0)
|
|
||||||
d = tarAc.modifyHealth(-damage, ac, false);
|
|
||||||
subTrack = 5;
|
|
||||||
} else if (target.getObjectType().equals(GameObjectType.Building)) {
|
} else if (target.getObjectType().equals(GameObjectType.Building)) {
|
||||||
subTrack = 6;
|
|
||||||
if (BuildingManager.getBuildingFromCache(target.getObjectUUID()) == null) {
|
if (BuildingManager.getBuildingFromCache(target.getObjectUUID()) == null) {
|
||||||
ac.setCombatTarget(null);
|
ac.setCombatTarget(null);
|
||||||
subTrack = 7;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
subTrack = 8;
|
|
||||||
if (target.getHealth() > 0)
|
if (target.getHealth() > 0)
|
||||||
d = ((Building) target).modifyHealth(-damage, ac);
|
d = ((Building) target).modifyHealth(-damage, ac);
|
||||||
subTrack = 9;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
errorTrack = 13;
|
errorTrack = 13;
|
||||||
@@ -954,8 +943,7 @@ public enum CombatManager {
|
|||||||
ac.cancelOnAttack();
|
ac.cancelOnAttack();
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.error(ac.getName() + ' ' + "ErrorTrack: " + errorTrack + " ErrorSubTrack = " + subTrack + e);
|
Logger.error(ac.getName() + ' ' + errorTrack + ' ' + e);
|
||||||
Logger.error(e.getMessage());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1034,9 +1022,7 @@ public enum CombatManager {
|
|||||||
damage += minDamage;
|
damage += minDamage;
|
||||||
|
|
||||||
//calculate resists in if any
|
//calculate resists in if any
|
||||||
if(source.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
|
||||||
damage *= ((PlayerCharacter)source).ZergMultiplier;
|
|
||||||
}
|
|
||||||
if (resists != null)
|
if (resists != null)
|
||||||
return resists.getResistedDamage(source, target, damageType, damage, 0);
|
return resists.getResistedDamage(source, target, damageType, damage, 0);
|
||||||
else
|
else
|
||||||
@@ -1275,13 +1261,6 @@ public enum CombatManager {
|
|||||||
|
|
||||||
range += (calcHitBox(ac) + calcHitBox(target));
|
range += (calcHitBox(ac) + calcHitBox(target));
|
||||||
|
|
||||||
if(ac.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
|
||||||
range += ((PlayerCharacter)ac).getCharacterHeight() * 0.5f;
|
|
||||||
if(ac.isMoving()){
|
|
||||||
range += ((PlayerCharacter) ac).getCharacterHeight();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
float magnitudeSquared = tl.distanceSquared(sl);
|
float magnitudeSquared = tl.distanceSquared(sl);
|
||||||
|
|
||||||
return magnitudeSquared > range * range;
|
return magnitudeSquared > range * range;
|
||||||
|
|||||||
@@ -11,8 +11,6 @@ package engine.gameManager;
|
|||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.devcmd.AbstractDevCmd;
|
import engine.devcmd.AbstractDevCmd;
|
||||||
import engine.devcmd.cmds.*;
|
import engine.devcmd.cmds.*;
|
||||||
import engine.net.DispatchMessage;
|
|
||||||
import engine.net.client.msg.chat.ChatSystemMsg;
|
|
||||||
import engine.objects.AbstractGameObject;
|
import engine.objects.AbstractGameObject;
|
||||||
import engine.objects.Account;
|
import engine.objects.Account;
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
@@ -121,7 +119,6 @@ public enum DevCmdManager {
|
|||||||
DevCmdManager.registerDevCmd(new PurgeObjectsCmd());
|
DevCmdManager.registerDevCmd(new PurgeObjectsCmd());
|
||||||
DevCmdManager.registerDevCmd(new SplatMobCmd());
|
DevCmdManager.registerDevCmd(new SplatMobCmd());
|
||||||
DevCmdManager.registerDevCmd(new SlotNpcCmd());
|
DevCmdManager.registerDevCmd(new SlotNpcCmd());
|
||||||
DevCmdManager.registerDevCmd(new setProfit());
|
|
||||||
DevCmdManager.registerDevCmd(new GateInfoCmd());
|
DevCmdManager.registerDevCmd(new GateInfoCmd());
|
||||||
DevCmdManager.registerDevCmd(new ShowOffsetCmd());
|
DevCmdManager.registerDevCmd(new ShowOffsetCmd());
|
||||||
DevCmdManager.registerDevCmd(new RealmInfoCmd());
|
DevCmdManager.registerDevCmd(new RealmInfoCmd());
|
||||||
@@ -182,17 +179,8 @@ public enum DevCmdManager {
|
|||||||
|
|
||||||
//kill any commands not available to everyone on production server
|
//kill any commands not available to everyone on production server
|
||||||
//only admin level can run dev commands on production
|
//only admin level can run dev commands on production
|
||||||
if((cmd.toLowerCase().equals("printstats") || cmd.toLowerCase().equals("printresists")) && target.equals(pcSender)){
|
|
||||||
// execute command;
|
|
||||||
try {
|
|
||||||
adc.doCmd(pcSender, argString, target);
|
|
||||||
} catch (Exception e) {
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
if (a.status.equals(Enum.AccountStatus.ADMIN) == false) {
|
||||||
}
|
|
||||||
|
|
||||||
if (a.status.equals(Enum.AccountStatus.ADMIN) == false && a.getUname().toLowerCase().equals("fatboy") == false) {
|
|
||||||
Logger.info("Account " + a.getUname() + "attempted to use dev command " + cmd);
|
Logger.info("Account " + a.getUname() + "attempted to use dev command " + cmd);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -216,11 +204,6 @@ public enum DevCmdManager {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, pcName + " from account: " + accName + " has used Dev Command: " + cmd);
|
|
||||||
chatMsg.setMessageType(10);
|
|
||||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
|
||||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,11 +14,9 @@ import engine.net.DispatchMessage;
|
|||||||
import engine.net.client.msg.ErrorPopupMsg;
|
import engine.net.client.msg.ErrorPopupMsg;
|
||||||
import engine.net.client.msg.chat.ChatSystemMsg;
|
import engine.net.client.msg.chat.ChatSystemMsg;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import engine.server.MBServerStatics;
|
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
@@ -36,11 +34,6 @@ public enum LootManager {
|
|||||||
public static HashMap<Integer, ArrayList<ModTableEntry>> _modTables = new HashMap<>();
|
public static HashMap<Integer, ArrayList<ModTableEntry>> _modTables = new HashMap<>();
|
||||||
public static HashMap<Integer, ArrayList<ModTypeTableEntry>> _modTypeTables = new HashMap<>();
|
public static HashMap<Integer, ArrayList<ModTypeTableEntry>> _modTypeTables = new HashMap<>();
|
||||||
|
|
||||||
public static ArrayList<Integer> vorg_ha_uuids = new ArrayList<>(Arrays.asList(new Integer[]{27580, 27590, 188500, 188510, 188520, 188530, 188540, 188550, 189510}));
|
|
||||||
public static ArrayList<Integer> vorg_ma_uuids = new ArrayList<>(Arrays.asList(new Integer[]{27570,188900,188910,188920,188930,188940,188950,189500}));
|
|
||||||
public static ArrayList<Integer> vorg_la_uuids = new ArrayList<>(Arrays.asList(new Integer[]{27550,27560,189100,189110,189120,189130,189140,189150}));
|
|
||||||
public static ArrayList<Integer> vorg_cloth_uuids = new ArrayList<>(Arrays.asList(new Integer[]{27600,188700,188720,189550,189560}));
|
|
||||||
|
|
||||||
// Drop Rates
|
// Drop Rates
|
||||||
|
|
||||||
public static float NORMAL_DROP_RATE;
|
public static float NORMAL_DROP_RATE;
|
||||||
@@ -75,13 +68,16 @@ public enum LootManager {
|
|||||||
|
|
||||||
public static void GenerateMobLoot(Mob mob) {
|
public static void GenerateMobLoot(Mob mob) {
|
||||||
|
|
||||||
|
//determine if mob is in hotzone
|
||||||
|
boolean inHotzone = ZoneManager.inHotZone(mob.getLoc());
|
||||||
|
|
||||||
//iterate the booty sets
|
//iterate the booty sets
|
||||||
|
|
||||||
if (mob.getMobBase().bootySet != 0 && _bootySetMap.containsKey(mob.getMobBase().bootySet) == true)
|
if (mob.getMobBase().bootySet != 0 && _bootySetMap.containsKey(mob.getMobBase().bootySet) == true)
|
||||||
RunBootySet(_bootySetMap.get(mob.getMobBase().bootySet), mob);
|
RunBootySet(_bootySetMap.get(mob.getMobBase().bootySet), mob, inHotzone);
|
||||||
|
|
||||||
if (mob.bootySet != 0 && _bootySetMap.containsKey(mob.bootySet) == true)
|
if (mob.bootySet != 0 && _bootySetMap.containsKey(mob.bootySet) == true)
|
||||||
RunBootySet(_bootySetMap.get(mob.bootySet), mob);
|
RunBootySet(_bootySetMap.get(mob.bootySet), mob, inHotzone);
|
||||||
|
|
||||||
//lastly, check mobs inventory for godly or disc runes to send a server announcement
|
//lastly, check mobs inventory for godly or disc runes to send a server announcement
|
||||||
for (Item it : mob.getInventory()) {
|
for (Item it : mob.getInventory()) {
|
||||||
@@ -89,7 +85,7 @@ public enum LootManager {
|
|||||||
ItemBase ib = it.getItemBase();
|
ItemBase ib = it.getItemBase();
|
||||||
if(ib == null)
|
if(ib == null)
|
||||||
break;
|
break;
|
||||||
if (ib.getName().toLowerCase().contains("of the gods")) {
|
if (ib.isDiscRune() || ib.getName().toLowerCase().contains("of the gods")) {
|
||||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + ib.getName() + ". Are you tough enough to take it?");
|
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + ib.getName() + ". Are you tough enough to take it?");
|
||||||
chatMsg.setMessageType(10);
|
chatMsg.setMessageType(10);
|
||||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
||||||
@@ -99,105 +95,54 @@ public enum LootManager {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void RunBootySet(ArrayList<BootySetEntry> entries, Mob mob) {
|
private static void RunBootySet(ArrayList<BootySetEntry> entries, Mob mob, boolean inHotzone) {
|
||||||
mob.runeCounter++;
|
|
||||||
mob.contractCounter++;
|
boolean hotzoneWasRan = false;
|
||||||
float dropRate = NORMAL_DROP_RATE;
|
float dropRate = 1.0f;
|
||||||
//roll the geenric world drop table
|
|
||||||
if(mob.parentZone.getSafeZone() == 0) {
|
|
||||||
GenerateLootDrop(mob, 1300);
|
|
||||||
if(ThreadLocalRandom.current().nextInt(1, 10000) == 5000) {
|
|
||||||
MobLoot extraLoot = rollForGlass(mob);
|
|
||||||
if (extraLoot != null) {
|
|
||||||
mob.getCharItemManager().addItemToInventory(extraLoot);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Iterate all entries in this bootySet and process accordingly
|
// Iterate all entries in this bootySet and process accordingly
|
||||||
|
|
||||||
for (BootySetEntry bse : entries) {
|
for (BootySetEntry bse : entries) {
|
||||||
switch (bse.bootyType) {
|
switch (bse.bootyType) {
|
||||||
case "GOLD":
|
case "GOLD":
|
||||||
GenerateGoldDrop(mob, bse);
|
GenerateGoldDrop(mob, bse, inHotzone);
|
||||||
break;
|
break;
|
||||||
case "LOOT":
|
case "LOOT":
|
||||||
if (ThreadLocalRandom.current().nextInt(1, 100 + 1) < (bse.dropChance * dropRate))
|
|
||||||
GenerateLootDrop(mob, bse.genTable); //generate normal loot drop
|
if (mob.getSafeZone() == false)
|
||||||
if(ThreadLocalRandom.current().nextInt(1,100) == 50){
|
dropRate = LootManager.NORMAL_DROP_RATE;
|
||||||
MobLoot extraLoot = rollForContract(bse.genTable, mob);
|
|
||||||
if (extraLoot != null) {
|
if (inHotzone == true)
|
||||||
mob.getCharItemManager().addItemToInventory(extraLoot);
|
dropRate = LootManager.HOTZONE_DROP_RATE;
|
||||||
|
|
||||||
|
if (ThreadLocalRandom.current().nextInt(1, 100 + 1) < (bse.dropChance * dropRate))
|
||||||
|
GenerateLootDrop(mob, bse.genTable, false); //generate normal loot drop
|
||||||
|
|
||||||
|
// Generate hotzone loot if in hotzone
|
||||||
|
// Only one bite at the hotzone apple per bootyset.
|
||||||
|
|
||||||
|
if (inHotzone == true && hotzoneWasRan == false)
|
||||||
|
if (_genTables.containsKey(bse.genTable + 1) && ThreadLocalRandom.current().nextInt(1, 100 + 1) < (bse.dropChance * dropRate)) {
|
||||||
|
GenerateLootDrop(mob, bse.genTable + 1, true); //generate loot drop from hotzone table
|
||||||
|
hotzoneWasRan = true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if(ThreadLocalRandom.current().nextInt(1,100) == 50){
|
|
||||||
MobLoot extraLoot = rollForRune(bse.genTable, mob);
|
|
||||||
if (extraLoot != null) {
|
|
||||||
mob.getCharItemManager().addItemToInventory(extraLoot);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case "ITEM":
|
case "ITEM":
|
||||||
GenerateInventoryDrop(mob, bse);
|
GenerateInventoryDrop(mob, bse);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MobLoot specialDrop = null;
|
|
||||||
switch(mob.getObjectUUID()) {
|
|
||||||
case 22595://elf 1
|
|
||||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252134),true);
|
|
||||||
mob.setFirstName("Melandrach The Blood-Mage");
|
|
||||||
break;
|
|
||||||
case 22432: //elf 2
|
|
||||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252135),true);
|
|
||||||
mob.setFirstName("Kyrtaar The Blood-Mage");
|
|
||||||
break;
|
|
||||||
case 22537: //elf 3
|
|
||||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252136),true);
|
|
||||||
mob.setFirstName("Vamir The Blood-Mage");
|
|
||||||
break;
|
|
||||||
case 16387: //human 4 DONE
|
|
||||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252129),true);
|
|
||||||
mob.setFirstName("Alatar The Blood-Mage");
|
|
||||||
break;
|
|
||||||
case 32724:// human 5 GOOD
|
|
||||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252130),true);
|
|
||||||
mob.setFirstName("Elphaba The Blood-Mage");
|
|
||||||
break;
|
|
||||||
case 23379: //human 1 GOOD
|
|
||||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252131),true);
|
|
||||||
mob.setFirstName("Bavmorda The Blood-Mage");
|
|
||||||
break;
|
|
||||||
case 10826: //human 2 REDO
|
|
||||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252132),true);
|
|
||||||
mob.setFirstName("Draco The Blood-Mage");
|
|
||||||
break;
|
|
||||||
case 15929: //human 3 GOOD
|
|
||||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252133),true);
|
|
||||||
mob.setFirstName("Atlantes The Blood-Mage");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(specialDrop != null) {
|
|
||||||
mob.setLevel((short) 65);
|
|
||||||
mob.setSpawnTime(10800);
|
|
||||||
mob.healthMax = (7500);
|
|
||||||
mob.setHealth(7500);
|
|
||||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + specialDrop.getName() + ". Are you tough enough to take it?");
|
|
||||||
chatMsg.setMessageType(10);
|
|
||||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
|
||||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
|
||||||
mob.getCharItemManager().addItemToInventory(specialDrop);
|
|
||||||
mob.setResists(new Resists("Dropper"));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MobLoot getGenTableItem(int genTableID, AbstractCharacter mob) {
|
public static MobLoot getGenTableItem(int genTableID, AbstractCharacter mob, Boolean inHotzone) {
|
||||||
|
|
||||||
if (mob == null || _genTables.containsKey(genTableID) == false)
|
if (mob == null || _genTables.containsKey(genTableID) == false)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
MobLoot outItem;
|
MobLoot outItem;
|
||||||
|
|
||||||
int genRoll = ThreadLocalRandom.current().nextInt(1,94 + 1);
|
int genRoll = ThreadLocalRandom.current().nextInt(1,100 + 1);
|
||||||
|
|
||||||
GenTableEntry selectedRow = GenTableEntry.rollTable(genTableID, genRoll, 1.0f);
|
GenTableEntry selectedRow = GenTableEntry.rollTable(genTableID, genRoll, 1.0f);
|
||||||
|
|
||||||
@@ -215,7 +160,7 @@ public enum LootManager {
|
|||||||
if(mob.getObjectType().ordinal() == 52) { //52 = player character
|
if(mob.getObjectType().ordinal() == 52) { //52 = player character
|
||||||
itemTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
|
itemTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
|
||||||
} else{
|
} else{
|
||||||
itemTableRoll = TableRoll(mob.level);
|
itemTableRoll = TableRoll(mob.level, inHotzone);
|
||||||
}
|
}
|
||||||
ItemTableEntry tableRow = ItemTableEntry.rollTable(itemTableId, itemTableRoll);
|
ItemTableEntry tableRow = ItemTableEntry.rollTable(itemTableId, itemTableRoll);
|
||||||
if (tableRow == null)
|
if (tableRow == null)
|
||||||
@@ -227,10 +172,7 @@ public enum LootManager {
|
|||||||
return null;
|
return null;
|
||||||
|
|
||||||
if (ItemBase.getItemBase(itemUUID).getType().ordinal() == Enum.ItemType.RESOURCE.ordinal()) {
|
if (ItemBase.getItemBase(itemUUID).getType().ordinal() == Enum.ItemType.RESOURCE.ordinal()) {
|
||||||
int chance = ThreadLocalRandom.current().nextInt(1,101);
|
int amount = ThreadLocalRandom.current().nextInt(tableRow.minSpawn, tableRow.maxSpawn + 1);
|
||||||
if(chance > 10)
|
|
||||||
return null;
|
|
||||||
int amount = ThreadLocalRandom.current().nextInt((int)(tableRow.minSpawn * 0.5f), (int)((tableRow.maxSpawn + 1) * 0.5f));
|
|
||||||
return new MobLoot(mob, ItemBase.getItemBase(itemUUID), amount, false);
|
return new MobLoot(mob, ItemBase.getItemBase(itemUUID), amount, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -240,7 +182,7 @@ public enum LootManager {
|
|||||||
|
|
||||||
if(selectedRow.pModTable != 0){
|
if(selectedRow.pModTable != 0){
|
||||||
try {
|
try {
|
||||||
outItem = GeneratePrefix(mob, outItem, genTableID, genRoll);
|
outItem = GeneratePrefix(mob, outItem, genTableID, genRoll, inHotzone);
|
||||||
outItem.setIsID(false);
|
outItem.setIsID(false);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.error("Failed to GeneratePrefix for item: " + outItem.getName());
|
Logger.error("Failed to GeneratePrefix for item: " + outItem.getName());
|
||||||
@@ -248,7 +190,7 @@ public enum LootManager {
|
|||||||
}
|
}
|
||||||
if(selectedRow.sModTable != 0){
|
if(selectedRow.sModTable != 0){
|
||||||
try {
|
try {
|
||||||
outItem = GenerateSuffix(mob, outItem, genTableID, genRoll);
|
outItem = GenerateSuffix(mob, outItem, genTableID, genRoll, inHotzone);
|
||||||
outItem.setIsID(false);
|
outItem.setIsID(false);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.error("Failed to GenerateSuffix for item: " + outItem.getName());
|
Logger.error("Failed to GenerateSuffix for item: " + outItem.getName());
|
||||||
@@ -257,7 +199,7 @@ public enum LootManager {
|
|||||||
return outItem;
|
return outItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static MobLoot GeneratePrefix(AbstractCharacter mob, MobLoot inItem, int genTableID, int genRoll) {
|
private static MobLoot GeneratePrefix(AbstractCharacter mob, MobLoot inItem, int genTableID, int genRoll, Boolean inHotzone) {
|
||||||
|
|
||||||
GenTableEntry selectedRow = GenTableEntry.rollTable(genTableID, genRoll, 1.0f);
|
GenTableEntry selectedRow = GenTableEntry.rollTable(genTableID, genRoll, 1.0f);
|
||||||
|
|
||||||
@@ -274,7 +216,7 @@ public enum LootManager {
|
|||||||
if(mob.getObjectType().ordinal() == 52) {
|
if(mob.getObjectType().ordinal() == 52) {
|
||||||
prefixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
|
prefixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
|
||||||
} else{
|
} else{
|
||||||
prefixTableRoll = TableRoll(mob.level);
|
prefixTableRoll = TableRoll(mob.level, inHotzone);
|
||||||
}
|
}
|
||||||
ModTableEntry prefixMod = ModTableEntry.rollTable(prefixTable.modTableID, prefixTableRoll);
|
ModTableEntry prefixMod = ModTableEntry.rollTable(prefixTable.modTableID, prefixTableRoll);
|
||||||
|
|
||||||
@@ -289,7 +231,7 @@ public enum LootManager {
|
|||||||
return inItem;
|
return inItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static MobLoot GenerateSuffix(AbstractCharacter mob, MobLoot inItem, int genTableID, int genRoll) {
|
private static MobLoot GenerateSuffix(AbstractCharacter mob, MobLoot inItem, int genTableID, int genRoll, Boolean inHotzone) {
|
||||||
|
|
||||||
GenTableEntry selectedRow = GenTableEntry.rollTable(genTableID, genRoll, 1.0f);
|
GenTableEntry selectedRow = GenTableEntry.rollTable(genTableID, genRoll, 1.0f);
|
||||||
|
|
||||||
@@ -306,7 +248,7 @@ public enum LootManager {
|
|||||||
if(mob.getObjectType().ordinal() == 52) {
|
if(mob.getObjectType().ordinal() == 52) {
|
||||||
suffixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
|
suffixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
|
||||||
} else{
|
} else{
|
||||||
suffixTableRoll = TableRoll(mob.level);
|
suffixTableRoll = TableRoll(mob.level, inHotzone);
|
||||||
}
|
}
|
||||||
ModTableEntry suffixMod = ModTableEntry.rollTable(suffixTable.modTableID, suffixTableRoll);
|
ModTableEntry suffixMod = ModTableEntry.rollTable(suffixTable.modTableID, suffixTableRoll);
|
||||||
|
|
||||||
@@ -321,7 +263,7 @@ public enum LootManager {
|
|||||||
return inItem;
|
return inItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int TableRoll(int mobLevel) {
|
public static int TableRoll(int mobLevel, Boolean inHotzone) {
|
||||||
|
|
||||||
if (mobLevel > 65)
|
if (mobLevel > 65)
|
||||||
mobLevel = 65;
|
mobLevel = 65;
|
||||||
@@ -336,12 +278,15 @@ public enum LootManager {
|
|||||||
if (min < 70)
|
if (min < 70)
|
||||||
min = 70;
|
min = 70;
|
||||||
|
|
||||||
|
if (inHotzone)
|
||||||
|
min += mobLevel;
|
||||||
|
|
||||||
int roll = ThreadLocalRandom.current().nextInt(min, max + 1);
|
int roll = ThreadLocalRandom.current().nextInt(min, max + 1);
|
||||||
|
|
||||||
return roll;
|
return roll;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void GenerateGoldDrop(Mob mob, BootySetEntry bse) {
|
public static void GenerateGoldDrop(Mob mob, BootySetEntry bse, Boolean inHotzone) {
|
||||||
|
|
||||||
int chanceRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
|
int chanceRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
|
||||||
|
|
||||||
@@ -352,9 +297,14 @@ public enum LootManager {
|
|||||||
|
|
||||||
//determine and add gold to mob inventory
|
//determine and add gold to mob inventory
|
||||||
|
|
||||||
int high = (int)(bse.highGold * NORMAL_GOLD_RATE);
|
int high = bse.highGold;
|
||||||
int low = (int)(bse.lowGold * NORMAL_GOLD_RATE);
|
int low = bse.lowGold;
|
||||||
int gold = ThreadLocalRandom.current().nextInt(low, high);
|
int gold = ThreadLocalRandom.current().nextInt(low, high + 1);
|
||||||
|
|
||||||
|
if (inHotzone == true)
|
||||||
|
gold = (int) (gold * HOTZONE_GOLD_RATE);
|
||||||
|
else
|
||||||
|
gold = (int) (gold * NORMAL_GOLD_RATE);
|
||||||
|
|
||||||
if (gold > 0) {
|
if (gold > 0) {
|
||||||
MobLoot goldAmount = new MobLoot(mob, gold);
|
MobLoot goldAmount = new MobLoot(mob, gold);
|
||||||
@@ -363,31 +313,23 @@ public enum LootManager {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void GenerateLootDrop(Mob mob, int tableID) {
|
public static void GenerateLootDrop(Mob mob, int tableID, Boolean inHotzone) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if(mob.parentZone.getSafeZone() == 1) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
MobLoot toAdd = getGenTableItem(tableID, mob);
|
|
||||||
if(toAdd.getItemBase().getType().equals(Enum.ItemType.CONTRACT) || toAdd.getItemBase().getType().equals(Enum.ItemType.RUNE))
|
|
||||||
return;//block all contracts and runes that drop outside the confines of the new system
|
|
||||||
|
|
||||||
if (toAdd != null) {
|
MobLoot toAdd = getGenTableItem(tableID, mob, inHotzone);
|
||||||
toAdd.setIsID(true);
|
|
||||||
|
if (toAdd != null)
|
||||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
mob.getCharItemManager().addItemToInventory(toAdd);
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
//TODO chase down loot generation error, affects roughly 2% of drops
|
//TODO chase down loot generation error, affects roughly 2% of drops
|
||||||
|
int i = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void GenerateEquipmentDrop(Mob mob) {
|
public static void GenerateEquipmentDrop(Mob mob) {
|
||||||
|
|
||||||
if(mob.parentZone.getSafeZone() == 1) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//do equipment here
|
//do equipment here
|
||||||
int dropCount = 0;
|
int dropCount = 0;
|
||||||
if (mob.getEquip() != null)
|
if (mob.getEquip() != null)
|
||||||
@@ -398,64 +340,25 @@ public enum LootManager {
|
|||||||
|
|
||||||
float equipmentRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
|
float equipmentRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
|
||||||
float dropChance = me.getDropChance() * 100;
|
float dropChance = me.getDropChance() * 100;
|
||||||
|
|
||||||
if (equipmentRoll > dropChance)
|
if (equipmentRoll > dropChance)
|
||||||
continue;
|
continue;
|
||||||
ItemBase genericIB = me.getItemBase();
|
|
||||||
if(genericIB.isVorg()){
|
|
||||||
if(genericIB.isClothArmor()){
|
|
||||||
//get random cloth piece
|
|
||||||
genericIB = getRandomVorgCloth();//ItemBase.getItemBase(vorg_cloth_uuids.get(ThreadLocalRandom.current().nextInt(0,vorg_cloth_uuids.size() - 1)));
|
|
||||||
} else if(genericIB.isHeavyArmor()){
|
|
||||||
//get random heavy armor piece
|
|
||||||
genericIB = getRandomVorgHA();//ItemBase.getItemBase(vorg_ha_uuids.get(ThreadLocalRandom.current().nextInt(0,vorg_ha_uuids.size() - 1)));
|
|
||||||
} else if(genericIB.isMediumArmor()){
|
|
||||||
//get random medium armor piece
|
|
||||||
genericIB = getRandomVorgMA();//ItemBase.getItemBase(vorg_ma_uuids.get(ThreadLocalRandom.current().nextInt(0,vorg_ma_uuids.size() - 1)));
|
|
||||||
} else if(genericIB.isLightArmor()){
|
|
||||||
//get random light armor piece
|
|
||||||
genericIB = getRandomVorgLA();//ItemBase.getItemBase(vorg_la_uuids.get(ThreadLocalRandom.current().nextInt(0,vorg_la_uuids.size() - 1)));
|
|
||||||
}
|
|
||||||
mob.spawnTime = ThreadLocalRandom.current().nextInt(300,2700);
|
|
||||||
}
|
|
||||||
MobLoot ml = new MobLoot(mob, genericIB, false);
|
|
||||||
|
|
||||||
if (ml != null && dropCount < 1 && genericIB.isVorg() == false) {
|
MobLoot ml = new MobLoot(mob, me.getItemBase(), false);
|
||||||
|
|
||||||
|
if (ml != null && dropCount < 1) {
|
||||||
ml.setIsID(true);
|
ml.setIsID(true);
|
||||||
ml.setDurabilityCurrent((short) (ml.getDurabilityCurrent() - ThreadLocalRandom.current().nextInt(5) + 1));
|
ml.setDurabilityCurrent((short) (ml.getDurabilityCurrent() - ThreadLocalRandom.current().nextInt(5) + 1));
|
||||||
mob.getCharItemManager().addItemToInventory(ml);
|
mob.getCharItemManager().addItemToInventory(ml);
|
||||||
dropCount = 1;
|
dropCount = 1;
|
||||||
//break; // Exit on first successful roll.
|
//break; // Exit on first successful roll.
|
||||||
}
|
}
|
||||||
if(ml != null && genericIB.isVorg() && mob.getMobBaseID() != 14062){
|
|
||||||
ml.setIsID(true);
|
|
||||||
ml.setDurabilityCurrent(ml.getDurabilityMax());
|
|
||||||
mob.getCharItemManager().addItemToInventory(ml);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void GenerateInventoryDrop(Mob mob, BootySetEntry bse) {
|
public static void GenerateInventoryDrop(Mob mob, BootySetEntry bse) {
|
||||||
|
|
||||||
if(ItemBase.getItemBase(bse.itemBase).isDiscRune()) {
|
int chanceRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
|
||||||
if(!Mob.disciplineDroppers.contains(mob))
|
|
||||||
Mob.disciplineDroppers.add(mob);
|
|
||||||
|
|
||||||
mob.setResists(new Resists("Dropper"));
|
|
||||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + ItemBase.getItemBase(bse.itemBase).getName() + ". Are you tough enough to take it?");
|
|
||||||
chatMsg.setMessageType(10);
|
|
||||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
|
||||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
|
||||||
}
|
|
||||||
|
|
||||||
//if((bse.itemBase == 3040 || bse.itemBase == 3021) && mob.level < 80){
|
|
||||||
// chance = 100;
|
|
||||||
//}
|
|
||||||
|
|
||||||
if(mob.parentZone.getSafeZone() == 1) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int chanceRoll = ThreadLocalRandom.current().nextInt(1, 99);
|
|
||||||
|
|
||||||
//early exit, failed to hit minimum chance roll
|
//early exit, failed to hit minimum chance roll
|
||||||
|
|
||||||
@@ -551,164 +454,4 @@ public enum LootManager {
|
|||||||
itemMan.addItemToInventory(playerWinnings);
|
itemMan.addItemToInventory(playerWinnings);
|
||||||
itemMan.updateInventory();
|
itemMan.updateInventory();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MobLoot rollForContract(int table, Mob mob){
|
|
||||||
|
|
||||||
int roll = 99;
|
|
||||||
if (table == 1900 || table == 1500)
|
|
||||||
roll = 73;
|
|
||||||
GenTableEntry selectedRow = GenTableEntry.rollTable(table, roll, 1.0f);
|
|
||||||
if (selectedRow == null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
int itemTableId = selectedRow.itemTableID;
|
|
||||||
|
|
||||||
if (_itemTables.containsKey(itemTableId) == false)
|
|
||||||
return null;
|
|
||||||
ItemTableEntry tableRow = ItemTableEntry.rollTable(itemTableId, ThreadLocalRandom.current().nextInt(75,321));
|
|
||||||
if (tableRow == null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
int itemUUID = tableRow.cacheID;
|
|
||||||
|
|
||||||
if (itemUUID == 0)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
MobLoot outItem = new MobLoot(mob, ItemBase.getItemBase(itemUUID), false);
|
|
||||||
if(outItem != null) {
|
|
||||||
mob.contractCounter = ThreadLocalRandom.current().nextInt(200);
|
|
||||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " looks like he found something special");
|
|
||||||
chatMsg.setMessageType(10);
|
|
||||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
|
||||||
DispatchMessage.dispatchMsgToInterestArea(mob,chatMsg, Enum.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE,false,false);
|
|
||||||
return outItem;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
public static MobLoot rollForRune(int table, Mob mob){
|
|
||||||
int roll = 97;
|
|
||||||
if(table == 1900 || table == 1500){
|
|
||||||
roll = 77;
|
|
||||||
}
|
|
||||||
GenTableEntry selectedRow = GenTableEntry.rollTable(table, roll, 1.0f);
|
|
||||||
if (selectedRow == null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
int itemTableId = selectedRow.itemTableID;
|
|
||||||
|
|
||||||
if (_itemTables.containsKey(itemTableId) == false)
|
|
||||||
return null;
|
|
||||||
ItemTableEntry tableRow = ItemTableEntry.rollTable(itemTableId, ThreadLocalRandom.current().nextInt(75,321));
|
|
||||||
if (tableRow == null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
int itemUUID = tableRow.cacheID;
|
|
||||||
|
|
||||||
if (itemUUID == 0)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
MobLoot outItem = new MobLoot(mob, ItemBase.getItemBase(itemUUID), false);
|
|
||||||
if(outItem != null) {
|
|
||||||
mob.runeCounter = ThreadLocalRandom.current().nextInt(200);
|
|
||||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " looks like he found something special");
|
|
||||||
chatMsg.setMessageType(10);
|
|
||||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
|
||||||
DispatchMessage.dispatchMsgToInterestArea(mob,chatMsg, Enum.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE,false,false);
|
|
||||||
return outItem;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
public static MobLoot rollForGlass( Mob mob){
|
|
||||||
ItemTableEntry tableRow = ItemTableEntry.rollTable(126, ThreadLocalRandom.current().nextInt(220,321));
|
|
||||||
if (tableRow == null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
int itemUUID = tableRow.cacheID;
|
|
||||||
|
|
||||||
if (itemUUID == 0)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
MobLoot outItem = new MobLoot(mob, ItemBase.getItemBase(itemUUID), false);
|
|
||||||
if(outItem != null)
|
|
||||||
return outItem;
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ItemBase getRandomVorgCloth(){
|
|
||||||
int random = ThreadLocalRandom.current().nextInt(100);
|
|
||||||
if(random < 20)
|
|
||||||
return ItemBase.getItemBase(27600);
|
|
||||||
if(random > 20 && random < 40)
|
|
||||||
return ItemBase.getItemBase(188700);
|
|
||||||
if(random > 40 && random < 60)
|
|
||||||
return ItemBase.getItemBase(188720);
|
|
||||||
if(random > 60 && random < 80)
|
|
||||||
return ItemBase.getItemBase(189550);
|
|
||||||
if(random > 80)
|
|
||||||
return ItemBase.getItemBase(189560);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ItemBase getRandomVorgLA(){
|
|
||||||
int random = ThreadLocalRandom.current().nextInt(160);
|
|
||||||
if(random < 20)
|
|
||||||
return ItemBase.getItemBase(27550);
|
|
||||||
if(random > 20 && random < 40)
|
|
||||||
return ItemBase.getItemBase(27560);
|
|
||||||
if(random > 40 && random < 60)
|
|
||||||
return ItemBase.getItemBase(189100);
|
|
||||||
if(random > 60 && random < 80)
|
|
||||||
return ItemBase.getItemBase(189110);
|
|
||||||
if(random > 80 && random < 100)
|
|
||||||
return ItemBase.getItemBase(189120);
|
|
||||||
if(random > 100 && random < 120)
|
|
||||||
return ItemBase.getItemBase(189130);
|
|
||||||
if(random > 120 && random < 140)
|
|
||||||
return ItemBase.getItemBase(189140);
|
|
||||||
if(random > 140)
|
|
||||||
return ItemBase.getItemBase(189150);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
public static ItemBase getRandomVorgMA(){
|
|
||||||
int random = ThreadLocalRandom.current().nextInt(160);
|
|
||||||
if(random < 20)
|
|
||||||
return ItemBase.getItemBase(27570);
|
|
||||||
if(random > 20 && random < 40)
|
|
||||||
return ItemBase.getItemBase(188900);
|
|
||||||
if(random > 40 && random < 60)
|
|
||||||
return ItemBase.getItemBase(188910);
|
|
||||||
if(random > 60 && random < 80)
|
|
||||||
return ItemBase.getItemBase(188920);
|
|
||||||
if(random > 80 && random < 100)
|
|
||||||
return ItemBase.getItemBase(188930);
|
|
||||||
if(random > 100 && random < 120)
|
|
||||||
return ItemBase.getItemBase(188940);
|
|
||||||
if(random > 120 && random < 140)
|
|
||||||
return ItemBase.getItemBase(188950);
|
|
||||||
if(random > 140)
|
|
||||||
return ItemBase.getItemBase(189500);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
public static ItemBase getRandomVorgHA(){
|
|
||||||
int random = ThreadLocalRandom.current().nextInt(180);
|
|
||||||
if(random < 20)
|
|
||||||
return ItemBase.getItemBase(27580);
|
|
||||||
if(random > 20 && random < 40)
|
|
||||||
return ItemBase.getItemBase(27590);
|
|
||||||
if(random > 40 && random < 60)
|
|
||||||
return ItemBase.getItemBase(188500);
|
|
||||||
if(random > 60 && random < 80)
|
|
||||||
return ItemBase.getItemBase(188510);
|
|
||||||
if(random > 80 && random < 100)
|
|
||||||
return ItemBase.getItemBase(188520);
|
|
||||||
if(random > 100 && random < 120)
|
|
||||||
return ItemBase.getItemBase(188530);
|
|
||||||
if(random > 120 && random < 140)
|
|
||||||
return ItemBase.getItemBase(188540);
|
|
||||||
if(random > 140 && random < 160)
|
|
||||||
return ItemBase.getItemBase(188550);
|
|
||||||
if(random > 160)
|
|
||||||
return ItemBase.getItemBase(189510);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,206 +5,320 @@
|
|||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
// Magicbane Emulator Project © 2013 - 2022
|
||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
package engine.gameManager;
|
package engine.gameManager;
|
||||||
|
|
||||||
// Defines static methods which comprise the magicbane
|
// Defines static methods which comprise the magicbane
|
||||||
// building maintenance system.
|
// building maintenance system.
|
||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
public enum MaintenanceManager {
|
public enum MaintenanceManager {
|
||||||
|
|
||||||
MAINTENANCEMANAGER;
|
MAINTENANCEMANAGER;
|
||||||
|
|
||||||
public static void setMaintDateTime(Building building, LocalDateTime maintDate) {
|
public static void setMaintDateTime(Building building, LocalDateTime maintDate) {
|
||||||
|
|
||||||
building.maintDateTime = maintDate;
|
building.maintDateTime = maintDate;
|
||||||
DbManager.BuildingQueries.updateMaintDate(building);
|
DbManager.BuildingQueries.updateMaintDate(building);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void processBuildingMaintenance() {
|
||||||
|
|
||||||
|
ArrayList<AbstractGameObject> buildingList;
|
||||||
|
ArrayList<Building> maintList;
|
||||||
|
ArrayList<Building> derankList = new ArrayList<>();
|
||||||
|
|
||||||
|
Logger.info("Starting Maintenance on Player Buildings");
|
||||||
|
|
||||||
|
// Build list of buildings to apply maintenance on.
|
||||||
|
|
||||||
|
buildingList = new ArrayList(DbManager.getList(Enum.GameObjectType.Building));
|
||||||
|
maintList = buildMaintList(buildingList);
|
||||||
|
|
||||||
|
// Deduct upkeep and build list of buildings
|
||||||
|
// which did not have funds available
|
||||||
|
|
||||||
|
for (Building building : maintList) {
|
||||||
|
|
||||||
|
if (chargeUpkeep(building) == false)
|
||||||
|
derankList.add(building);
|
||||||
|
}
|
||||||
|
// Reset maintenance dates for these buildings
|
||||||
|
|
||||||
|
for (Building building : maintList) {
|
||||||
|
setMaintDateTime(building, LocalDateTime.now().plusDays(7));
|
||||||
|
|
||||||
|
}
|
||||||
|
// Derak or destroy buildings that did not
|
||||||
|
// have funds available.
|
||||||
|
|
||||||
|
for (Building building : derankList)
|
||||||
|
building.destroyOrDerank(null);
|
||||||
|
|
||||||
|
Logger.info("Structures: " + buildingList.size() + " Maint: " + maintList.size() + " Derank: " + derankList.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterate over all buildings in game and apply exclusion rules
|
||||||
|
// returning a list of building for which maintenance is due.
|
||||||
|
|
||||||
|
private static ArrayList<Building> buildMaintList(ArrayList<AbstractGameObject> buildingList) {
|
||||||
|
|
||||||
|
ArrayList<Building> maintList = new ArrayList<>();
|
||||||
|
|
||||||
|
for (AbstractGameObject gameObject : buildingList) {
|
||||||
|
|
||||||
|
Building building = (Building) gameObject;
|
||||||
|
|
||||||
|
// No maintenance on NPC owned buildings (Cache loaded)
|
||||||
|
|
||||||
|
if (building.getProtectionState() == Enum.ProtectionState.NPC)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// No maintenance on constructing meshes
|
||||||
|
|
||||||
|
if (building.getRank() < 1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// No Maintenance on furniture
|
||||||
|
|
||||||
|
if (building.parentBuildingID != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// No Blueprint?
|
||||||
|
|
||||||
|
if (building.getBlueprint() == null) {
|
||||||
|
Logger.error("Blueprint missing for uuid: " + building.getObjectUUID());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// No maintenance on banestones omfg
|
||||||
|
|
||||||
|
if (building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.BANESTONE))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// no maintenance on Mines omfg
|
||||||
|
|
||||||
|
if (building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.MINE))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Null Maintenance date?
|
||||||
|
|
||||||
|
if (building.maintDateTime == null) {
|
||||||
|
Logger.error("Null maint date for building UUID: " + building.getObjectUUID());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Maintenance date is in the future
|
||||||
|
|
||||||
|
if (building.maintDateTime.isAfter(LocalDateTime.now()))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
|
||||||
|
//no maintenance if day of week doesnt match
|
||||||
|
if (LocalDateTime.now().getDayOfWeek().ordinal() != building.maintDateTime.getDayOfWeek().ordinal()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Add building to maintenance queue
|
||||||
|
|
||||||
|
maintList.add(building);
|
||||||
|
}
|
||||||
|
|
||||||
|
return maintList;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method removes the appropriate amount of gold/resources from
|
||||||
|
// a building according to it's maintenance schedule. True/False
|
||||||
|
// is returned indicating if the building had enough funds to cover.
|
||||||
|
|
||||||
|
public static boolean chargeUpkeep(Building building) {
|
||||||
|
|
||||||
|
City city = null;
|
||||||
|
Warehouse warehouse = null;
|
||||||
|
int maintCost = 0;
|
||||||
|
int overDraft = 0;
|
||||||
|
boolean hasFunds = false;
|
||||||
|
boolean hasResources = false;
|
||||||
|
int resourceValue = 0;
|
||||||
|
|
||||||
|
city = building.getCity();
|
||||||
|
|
||||||
|
if (city != null)
|
||||||
|
warehouse = city.getWarehouse();
|
||||||
|
|
||||||
|
// Cache maintenance cost value
|
||||||
|
|
||||||
|
maintCost = building.getMaintCost();
|
||||||
|
|
||||||
|
// Something went wrong. Missing buildinggroup from switch?
|
||||||
|
|
||||||
|
if (maintCost == 0) {
|
||||||
|
Logger.error("chargeUpkeep", "Error retrieving rankcost for " + building.getName() + " uuid:" + building.getObjectUUID() + "buildinggroup:" + building.getBlueprint().getBuildingGroup().name());
|
||||||
|
// check if there is enough gold on the building
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (building.getStrongboxValue() >= maintCost)
|
||||||
|
hasFunds = true;
|
||||||
|
|
||||||
|
// If we cannot cover with just the strongbox
|
||||||
|
// see if there is a warehouse that will cover
|
||||||
|
// the overdraft for us.
|
||||||
|
|
||||||
|
|
||||||
|
if (hasFunds == false && (building.assetIsProtected() || building.getBlueprint().getBuildingGroup() == Enum.BuildingGroup.WAREHOUSE)) {
|
||||||
|
overDraft = maintCost - building.getStrongboxValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((overDraft > 0))
|
||||||
|
if ((building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.SHRINE) == false) &&
|
||||||
|
(warehouse != null) && building.assetIsProtected() == true &&
|
||||||
|
(warehouse.getResources().get(ItemBase.GOLD_ITEM_BASE)) >= overDraft) {
|
||||||
|
hasFunds = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this is an R8 tree, validate that we can
|
||||||
|
// cover the resources required
|
||||||
|
|
||||||
|
if (building.getRank() == 8) {
|
||||||
|
|
||||||
|
hasResources = true;
|
||||||
|
|
||||||
|
if (warehouse == null)
|
||||||
|
hasResources = false;
|
||||||
|
else {
|
||||||
|
|
||||||
|
resourceValue = warehouse.getResources().get(Warehouse.stoneIB);
|
||||||
|
|
||||||
|
if (resourceValue < 1500)
|
||||||
|
hasResources = false;
|
||||||
|
|
||||||
|
resourceValue = warehouse.getResources().get(Warehouse.lumberIB);
|
||||||
|
|
||||||
|
if (resourceValue < 1500)
|
||||||
|
hasResources = false;
|
||||||
|
|
||||||
|
resourceValue = warehouse.getResources().get(Warehouse.galvorIB);
|
||||||
|
|
||||||
|
if (resourceValue < 5)
|
||||||
|
hasResources = false;
|
||||||
|
|
||||||
|
resourceValue = warehouse.getResources().get(Warehouse.wormwoodIB);
|
||||||
|
|
||||||
|
if (resourceValue < 5)
|
||||||
|
hasResources = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Validation completed but has failed. We can derank
|
||||||
|
// the target building and early exit
|
||||||
|
|
||||||
|
if ((hasFunds == false) ||
|
||||||
|
((building.getRank() == 8) && !hasResources)) {
|
||||||
|
|
||||||
|
// Add cash back to strongbox for lost rank if the building isn't being destroyed
|
||||||
|
// and it's not an R8 deranking
|
||||||
|
|
||||||
|
if ((building.getRank() > 1) && (building.getRank() < 8)) {
|
||||||
|
building.setStrongboxValue(building.getStrongboxValue() + building.getBlueprint().getRankCost(Math.min(building.getRank(), 7)));
|
||||||
|
}
|
||||||
|
|
||||||
|
return false; // Early exit for having failed to meet maintenance
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove cash and resources
|
||||||
|
|
||||||
|
// withdraw what we can from the building
|
||||||
|
|
||||||
|
building.setStrongboxValue(building.getStrongboxValue() - (maintCost - overDraft));
|
||||||
|
|
||||||
|
// withdraw overdraft from the whorehouse
|
||||||
|
|
||||||
|
if (overDraft > 0) {
|
||||||
|
|
||||||
|
resourceValue = warehouse.getResources().get(Warehouse.goldIB);
|
||||||
|
|
||||||
|
if (DbManager.WarehouseQueries.updateGold(warehouse, resourceValue - overDraft) == true) {
|
||||||
|
warehouse.getResources().put(Warehouse.goldIB, resourceValue - overDraft);
|
||||||
|
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.GOLD, overDraft);
|
||||||
|
} else {
|
||||||
|
Logger.error("gold update failed for warehouse of UUID:" + warehouse.getObjectUUID());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Early exit as we're done if we're not an R8 tree
|
||||||
|
|
||||||
|
if (building.getRank() < 8)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Now for the resources if it's an R8 tree
|
||||||
|
|
||||||
|
// Withdraw Stone
|
||||||
|
|
||||||
|
resourceValue = warehouse.getResources().get(Warehouse.stoneIB);
|
||||||
|
|
||||||
|
if (DbManager.WarehouseQueries.updateStone(warehouse, resourceValue - 1500) == true) {
|
||||||
|
warehouse.getResources().put(Warehouse.stoneIB, resourceValue - 1500);
|
||||||
|
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.STONE, 1500);
|
||||||
|
} else {
|
||||||
|
Logger.error("stone update failed for warehouse of UUID:" + warehouse.getObjectUUID());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Withdraw Lumber
|
||||||
|
|
||||||
|
resourceValue = warehouse.getResources().get(Warehouse.lumberIB);
|
||||||
|
|
||||||
|
if (DbManager.WarehouseQueries.updateLumber(warehouse, resourceValue - 1500) == true) {
|
||||||
|
warehouse.getResources().put(Warehouse.lumberIB, resourceValue - 1500);
|
||||||
|
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.LUMBER, 1500);
|
||||||
|
} else {
|
||||||
|
Logger.error("lumber update failed for warehouse of UUID:" + warehouse.getObjectUUID());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Withdraw Galvor
|
||||||
|
|
||||||
|
resourceValue = warehouse.getResources().get(Warehouse.galvorIB);
|
||||||
|
|
||||||
|
if (DbManager.WarehouseQueries.updateGalvor(warehouse, resourceValue - 5) == true) {
|
||||||
|
warehouse.getResources().put(Warehouse.galvorIB, resourceValue - 5);
|
||||||
|
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.GALVOR, 5);
|
||||||
|
} else {
|
||||||
|
Logger.error("galvor update failed for warehouse of UUID:" + warehouse.getObjectUUID());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
resourceValue = warehouse.getResources().get(Warehouse.wormwoodIB);
|
||||||
|
|
||||||
|
if (DbManager.WarehouseQueries.updateWormwood(warehouse, resourceValue - 5) == true) {
|
||||||
|
warehouse.getResources().put(Warehouse.wormwoodIB, resourceValue - 5);
|
||||||
|
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.WORMWOOD, 5);
|
||||||
|
} else {
|
||||||
|
Logger.error("wyrmwood update failed for warehouse of UUID:" + warehouse.getObjectUUID());
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public static void dailyMaintenance() {
|
public static void dailyMaintenance() {
|
||||||
|
|
||||||
Logger.info("Maintenance has started");
|
Logger.info("Maintenance has started");
|
||||||
|
|
||||||
// Run maintenance on player buildings
|
// Run maintenance on player buildings
|
||||||
|
|
||||||
if (ConfigManager.MB_WORLD_MAINTENANCE.getValue().equalsIgnoreCase("true"))
|
if (ConfigManager.MB_WORLD_MAINTENANCE.getValue().equalsIgnoreCase("true"))
|
||||||
processMaintenance();
|
processBuildingMaintenance();
|
||||||
else
|
else
|
||||||
Logger.info("Maintenance Costings: DISABLED");
|
Logger.info("Maintenance Costings: DISABLED");
|
||||||
|
|
||||||
Logger.info("Maintenance has completed!");
|
Logger.info("Maintenance has completed!");
|
||||||
}
|
}
|
||||||
public static void processMaintenance() {
|
}
|
||||||
//create list of all cities
|
|
||||||
ConcurrentHashMap<Integer, AbstractGameObject> worldCities = DbManager.getMap(Enum.GameObjectType.City);
|
|
||||||
//loop all cities
|
|
||||||
for (AbstractGameObject ago : worldCities.values()) {
|
|
||||||
if (ago.getObjectType().equals(Enum.GameObjectType.City)) {
|
|
||||||
City city = (City) ago;
|
|
||||||
if(city == null || !city.getParent().isPlayerCity())
|
|
||||||
continue;
|
|
||||||
Building tol = city.getTOL();
|
|
||||||
if(tol == null)
|
|
||||||
continue;
|
|
||||||
LocalDateTime maintenanceDueDate = tol.maintDateTime.withHour(1).withMinute(0).withSecond(0);
|
|
||||||
LocalDateTime now = LocalDateTime.now();
|
|
||||||
if(now.isAfter(maintenanceDueDate))
|
|
||||||
processTolMaintenance(tol, city.getWarehouse());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static void processTolMaintenance(Building tol, Warehouse warehouse){
|
|
||||||
if(tol == null)
|
|
||||||
return;
|
|
||||||
if(tol.getRank() == 8)
|
|
||||||
handleR8(tol,warehouse);
|
|
||||||
else
|
|
||||||
handleNormal(tol,warehouse);
|
|
||||||
}
|
|
||||||
public static void handleNormal(Building tol, Warehouse warehouse){
|
|
||||||
//handle r7 and lower ToL maintenance
|
|
||||||
int goldDue = 3000000;
|
|
||||||
//enough on strongbox alone to pay
|
|
||||||
if (tol.getStrongboxValue() >= goldDue) {
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(7);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
tol.setStrongboxValue(tol.getStrongboxValue() - goldDue);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int newStrongboxValue = tol.getStrongboxValue();
|
|
||||||
int newWarehouseGold = 0;
|
|
||||||
if(warehouse != null && warehouse.getResources().get(ItemBase.getItemBase(7)) != null) {
|
|
||||||
newWarehouseGold = warehouse.getResources().get(ItemBase.getItemBase(7));
|
|
||||||
} else{
|
|
||||||
//wasnt enough on strongbox and gold in warehouse is empty
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
tol.destroyOrDerank(null);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//some on strongbox to pay
|
|
||||||
if (tol.getStrongboxValue() > 0) {
|
|
||||||
newStrongboxValue = 0;
|
|
||||||
goldDue -= tol.getStrongboxValue();
|
|
||||||
}
|
|
||||||
if(newWarehouseGold < goldDue){
|
|
||||||
//not enough gold to pay, you miss maintenance
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
tol.destroyOrDerank(null);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
newWarehouseGold -= goldDue;
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(7);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol) && DbManager.WarehouseQueries.updateGold(warehouse,newWarehouseGold)) {
|
|
||||||
warehouse.getResources().put(ItemBase.getItemBase(7), newWarehouseGold);
|
|
||||||
tol.setStrongboxValue(newStrongboxValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static void handleR8(Building tol, Warehouse warehouse){
|
|
||||||
//handle r8 ToL maintenance
|
|
||||||
//cannot pay r8 maintenance without a warehouse
|
|
||||||
if(warehouse == null && DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
tol.destroyOrDerank(null);
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//handle resource processing
|
|
||||||
int goldDue = 3000000;
|
|
||||||
int galvorDue = 5;
|
|
||||||
int wormwoodDue = 5;
|
|
||||||
int stoneDue = 5000;
|
|
||||||
int lumberDue = 5000;
|
|
||||||
int goldStrongBox = tol.getStrongboxValue();
|
|
||||||
int goldWarehouse = 0;
|
|
||||||
int galvorWarehouse;
|
|
||||||
int wormwoodWarehouse;
|
|
||||||
int stoneWarehouse;
|
|
||||||
int lumberWarehouse;
|
|
||||||
if(warehouse.getResources().get(Warehouse.galvorIB) != null) {
|
|
||||||
galvorWarehouse = warehouse.getResources().get(Warehouse.galvorIB);
|
|
||||||
}else {
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
tol.destroyOrDerank(null);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(warehouse.getResources().get(Warehouse.stoneIB) != null) {
|
|
||||||
stoneWarehouse = warehouse.getResources().get(Warehouse.stoneIB);
|
|
||||||
}else {
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
tol.destroyOrDerank(null);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(warehouse.getResources().get(Warehouse.wormwoodIB) != null) {
|
|
||||||
wormwoodWarehouse = warehouse.getResources().get(Warehouse.wormwoodIB);
|
|
||||||
}else {
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
tol.destroyOrDerank(null);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(warehouse.getResources().get(Warehouse.lumberIB) != null) {
|
|
||||||
lumberWarehouse = warehouse.getResources().get(Warehouse.lumberIB);
|
|
||||||
}else {
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
tol.destroyOrDerank(null);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
boolean canPay = true;
|
|
||||||
if(goldStrongBox >= goldDue){
|
|
||||||
goldStrongBox -= goldDue;
|
|
||||||
goldDue = 0;
|
|
||||||
}
|
|
||||||
if (tol.getStrongboxValue() > 0) {
|
|
||||||
goldStrongBox = 0;
|
|
||||||
goldDue -= tol.getStrongboxValue();
|
|
||||||
}
|
|
||||||
if(warehouse.getResources().get(Warehouse.goldIB) != null) {
|
|
||||||
goldWarehouse = warehouse.getResources().get(Warehouse.goldIB);
|
|
||||||
}else if(goldDue > 0){
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
tol.destroyOrDerank(null);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(wormwoodDue > wormwoodWarehouse)
|
|
||||||
canPay = false;
|
|
||||||
if(galvorDue > galvorWarehouse)
|
|
||||||
canPay = false;
|
|
||||||
if(lumberDue > lumberWarehouse)
|
|
||||||
canPay = false;
|
|
||||||
if(stoneDue > stoneWarehouse)
|
|
||||||
canPay = false;
|
|
||||||
if(goldDue > goldWarehouse)
|
|
||||||
canPay = false;
|
|
||||||
if(!canPay){
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
tol.destroyOrDerank(null);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
tol.setStrongboxValue(goldStrongBox);
|
|
||||||
if(DbManager.WarehouseQueries.updateGold(warehouse,goldWarehouse - goldDue)){
|
|
||||||
if(DbManager.WarehouseQueries.updateStone(warehouse,stoneWarehouse - stoneDue)){
|
|
||||||
if(DbManager.WarehouseQueries.updateLumber(warehouse,lumberWarehouse - lumberDue)){
|
|
||||||
if(DbManager.WarehouseQueries.updateGalvor(warehouse,galvorWarehouse - galvorDue)){
|
|
||||||
if(DbManager.WarehouseQueries.updateWormwood(warehouse,wormwoodWarehouse - wormwoodDue)){
|
|
||||||
tol.maintDateTime = LocalDateTime.now().plusDays(1);
|
|
||||||
if(DbManager.BuildingQueries.updateMaintDate(tol)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -69,10 +69,9 @@ public enum MovementManager {
|
|||||||
if (toMove.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
if (toMove.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
||||||
if (((PlayerCharacter) toMove).isCasting())
|
if (((PlayerCharacter) toMove).isCasting())
|
||||||
((PlayerCharacter) toMove).update();
|
((PlayerCharacter) toMove).update();
|
||||||
if(((PlayerCharacter) toMove).isFlying() && toMove.getEffects().containsKey("MoveBuff"))
|
|
||||||
PlayerCharacter.GroundPlayer(((PlayerCharacter) toMove));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
toMove.setIsCasting(false);
|
toMove.setIsCasting(false);
|
||||||
toMove.setItemCasting(false);
|
toMove.setItemCasting(false);
|
||||||
|
|
||||||
|
|||||||
@@ -30,18 +30,11 @@ public enum NPCManager {
|
|||||||
if (mob.runeSet == 0)
|
if (mob.runeSet == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//Apply all rune effects.
|
|
||||||
|
|
||||||
if (NPCManager._runeSetMap.get(mob.runeSet).contains(252623)) {
|
|
||||||
mob.isPlayerGuard = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only captains have contracts
|
// Only captains have contracts
|
||||||
|
|
||||||
if (mob.contract != null || mob.isPlayerGuard)
|
if (mob.contract != null || mob.isPlayerGuard())
|
||||||
applyEffectsForRune(mob, 252621);
|
applyEffectsForRune(mob, 252621);
|
||||||
|
|
||||||
|
|
||||||
// Apply effects from RuneSet
|
// Apply effects from RuneSet
|
||||||
|
|
||||||
if (mob.runeSet != 0)
|
if (mob.runeSet != 0)
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ import engine.net.client.ClientConnection;
|
|||||||
import engine.net.client.msg.*;
|
import engine.net.client.msg.*;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import engine.powers.*;
|
import engine.powers.*;
|
||||||
import engine.powers.effectmodifiers.SeeInvisibleEffectModifier;
|
|
||||||
import engine.powers.poweractions.AbstractPowerAction;
|
import engine.powers.poweractions.AbstractPowerAction;
|
||||||
import engine.powers.poweractions.TrackPowerAction;
|
import engine.powers.poweractions.TrackPowerAction;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
@@ -54,25 +53,9 @@ public enum PowersManager {
|
|||||||
public static HashMap<Integer, AbstractPowerAction> powerActionsByID = new HashMap<>();
|
public static HashMap<Integer, AbstractPowerAction> powerActionsByID = new HashMap<>();
|
||||||
public static HashMap<String, Integer> ActionTokenByIDString = new HashMap<>();
|
public static HashMap<String, Integer> ActionTokenByIDString = new HashMap<>();
|
||||||
public static HashMap<String, Integer> AnimationOverrides = new HashMap<>();
|
public static HashMap<String, Integer> AnimationOverrides = new HashMap<>();
|
||||||
public static HashMap<Integer, ArrayList<MobPowerEntry>> AllMobPowers;
|
public static HashMap<Integer, ArrayList<MobPowerEntry>> _allMobPowers;
|
||||||
private static JobScheduler js;
|
private static JobScheduler js;
|
||||||
|
|
||||||
public static String[] siegeBuffs = new String[]{"ART-004A","ARM-112A"};
|
|
||||||
public static String[] siegeDeBuffs = new String[]{"ACM-003A","WRT-003A"};
|
|
||||||
|
|
||||||
public static ArrayList<PowerQueObject> static_power_que = new ArrayList<>();
|
|
||||||
|
|
||||||
public static class PowerQueObject{
|
|
||||||
public PowerQueObject(PerformActionMsg inmsg,ClientConnection inorigin,boolean insendCastToSelf){
|
|
||||||
this.msg = inmsg;
|
|
||||||
this.origin = inorigin;
|
|
||||||
this.sendCastToSelf = insendCastToSelf;
|
|
||||||
}
|
|
||||||
public PerformActionMsg msg;
|
|
||||||
public ClientConnection origin;
|
|
||||||
public boolean sendCastToSelf;
|
|
||||||
}
|
|
||||||
|
|
||||||
private PowersManager() {
|
private PowersManager() {
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -120,6 +103,30 @@ public enum PowersManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static ArrayList<MobPowerEntry> getPowersForMobile(Mob mobile) {
|
||||||
|
|
||||||
|
ArrayList<MobPowerEntry> mobPowers = new ArrayList<>();
|
||||||
|
ArrayList<MobPowerEntry> powerEntries;
|
||||||
|
|
||||||
|
if (mobile.agentType.equals(AIAgentType.GUARDMINION))
|
||||||
|
powerEntries = PowersManager._allMobPowers.get(mobile.guardCaptain.contractUUID);
|
||||||
|
else
|
||||||
|
powerEntries = PowersManager._allMobPowers.get(mobile.contractUUID);
|
||||||
|
|
||||||
|
if (powerEntries != null)
|
||||||
|
mobPowers.addAll(powerEntries);
|
||||||
|
|
||||||
|
if (mobile.agentType.equals(AIAgentType.GUARDMINION))
|
||||||
|
powerEntries = PowersManager._allMobPowers.get(((Mob) mobile.guardCaptain).loadID);
|
||||||
|
else
|
||||||
|
powerEntries = PowersManager._allMobPowers.get(mobile.loadID);
|
||||||
|
|
||||||
|
if (powerEntries != null)
|
||||||
|
mobPowers.addAll(powerEntries);
|
||||||
|
|
||||||
|
return mobPowers;
|
||||||
|
}
|
||||||
|
|
||||||
// This pre-loads all powers and effects
|
// This pre-loads all powers and effects
|
||||||
public static void InitializePowers() {
|
public static void InitializePowers() {
|
||||||
|
|
||||||
@@ -182,9 +189,11 @@ public enum PowersManager {
|
|||||||
|
|
||||||
if (usePowerA(msg, origin, sendCastToSelf)) {
|
if (usePowerA(msg, origin, sendCastToSelf)) {
|
||||||
// Cast failed for some reason, reset timer
|
// Cast failed for some reason, reset timer
|
||||||
|
|
||||||
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
|
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
|
||||||
Dispatch dispatch = Dispatch.borrow(origin.getPlayerCharacter(), recyclePowerMsg);
|
Dispatch dispatch = Dispatch.borrow(origin.getPlayerCharacter(), recyclePowerMsg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
||||||
|
|
||||||
// Send Fail to cast message
|
// Send Fail to cast message
|
||||||
PlayerCharacter pc = SessionManager
|
PlayerCharacter pc = SessionManager
|
||||||
.getPlayerCharacter(origin);
|
.getPlayerCharacter(origin);
|
||||||
@@ -218,8 +227,6 @@ public enum PowersManager {
|
|||||||
if (playerCharacter == null)
|
if (playerCharacter == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
boolean skipCheck = false;
|
|
||||||
|
|
||||||
boolean CSRCast = false;
|
boolean CSRCast = false;
|
||||||
|
|
||||||
|
|
||||||
@@ -232,67 +239,10 @@ public enum PowersManager {
|
|||||||
+ Integer.toHexString(msg.getPowerUsedID()) + " ("
|
+ Integer.toHexString(msg.getPowerUsedID()) + " ("
|
||||||
+ msg.getPowerUsedID() + ')');
|
+ msg.getPowerUsedID() + ')');
|
||||||
}
|
}
|
||||||
Boolean earlyExit = false;
|
|
||||||
//Sending recycle message to player if died while casting.
|
//Sending recycle message to player if died while casting.
|
||||||
if (!playerCharacter.isAlive() && msg.getPowerUsedID() != 428589216) { //succor
|
if (!playerCharacter.isAlive() && msg.getPowerUsedID() != 428589216) { //succor
|
||||||
|
|
||||||
earlyExit = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(msg.getPowerUsedID() == 430628895){ // group teleport
|
|
||||||
|
|
||||||
Boolean activeBane = false;
|
|
||||||
|
|
||||||
if(ZoneManager.getCityAtLocation(playerCharacter.loc) != null && ZoneManager.getCityAtLocation(playerCharacter.loc).getBane() != null)
|
|
||||||
activeBane = ZoneManager.getCityAtLocation(playerCharacter.loc).getBane().getSiegePhase().equals(SiegePhase.WAR);
|
|
||||||
|
|
||||||
Zone currentZone = ZoneManager.findSmallestZone(playerCharacter.loc);
|
|
||||||
if(currentZone == null)
|
|
||||||
earlyExit = true;
|
|
||||||
|
|
||||||
if(currentZone.isPlayerCity() && !activeBane)
|
|
||||||
earlyExit = true;
|
|
||||||
|
|
||||||
if(currentZone.getName().contains("Mine") == true && currentZone.isPlayerCity() == false) {
|
|
||||||
for (Building building : currentZone.zoneBuildingSet) {
|
|
||||||
if (Mine.getMineFromTower(building.getObjectUUID()) != null) {
|
|
||||||
Mine currentMine = Mine.getMineFromTower(building.getObjectUUID());
|
|
||||||
if (currentMine.isActive == false) {
|
|
||||||
earlyExit = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Vector3fImmutable endLoc = new Vector3fImmutable(msg.getTargetX(),msg.getTargetY(),msg.getTargetZ());
|
|
||||||
currentZone = ZoneManager.findSmallestZone(endLoc);
|
|
||||||
|
|
||||||
if(currentZone == null)
|
|
||||||
earlyExit = true;
|
|
||||||
|
|
||||||
if(currentZone.isPlayerCity() && !activeBane)
|
|
||||||
earlyExit = true;
|
|
||||||
|
|
||||||
if(currentZone.getName().contains("Mine") == true && currentZone.isPlayerCity() == false) {
|
|
||||||
for (Building building : currentZone.zoneBuildingSet) {
|
|
||||||
if (Mine.getMineFromTower(building.getObjectUUID()) != null) {
|
|
||||||
Mine currentMine = Mine.getMineFromTower(building.getObjectUUID());
|
|
||||||
if (currentMine.isActive == false) {
|
|
||||||
earlyExit = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// get power
|
|
||||||
PowersBase pb = PowersManager.powersBaseByToken.get(msg.getPowerUsedID());
|
|
||||||
|
|
||||||
if(pb.description.equals("Personal Movement Buff") && playerCharacter.isFlying()) {
|
|
||||||
ChatManager.chatSystemInfo(playerCharacter, "You cannot use movement speed buffs while flying");
|
|
||||||
earlyExit = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (earlyExit) {
|
|
||||||
|
|
||||||
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
|
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
|
||||||
Dispatch dispatch = Dispatch.borrow(playerCharacter, recyclePowerMsg);
|
Dispatch dispatch = Dispatch.borrow(playerCharacter, recyclePowerMsg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
||||||
@@ -300,6 +250,7 @@ public enum PowersManager {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// if (!pc.getPowers().contains(msg.getPowerUsedID())) {
|
// if (!pc.getPowers().contains(msg.getPowerUsedID())) {
|
||||||
// sendPowerMsg(pc, 10, msg);
|
// sendPowerMsg(pc, 10, msg);
|
||||||
// return false;
|
// return false;
|
||||||
@@ -312,6 +263,8 @@ public enum PowersManager {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get power
|
||||||
|
PowersBase pb = PowersManager.powersBaseByToken.get(msg.getPowerUsedID());
|
||||||
if (pb == null) {
|
if (pb == null) {
|
||||||
ChatManager.chatSayInfo(playerCharacter,
|
ChatManager.chatSayInfo(playerCharacter,
|
||||||
"This power is not implemented yet.");
|
"This power is not implemented yet.");
|
||||||
@@ -322,18 +275,15 @@ public enum PowersManager {
|
|||||||
return true;
|
return true;
|
||||||
// return false;
|
// return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (playerCharacter.getLastPower() != null)
|
if (playerCharacter.getLastPower() != null)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
//Check if Power Target is allowed to cast.
|
//Check if Power Target is allowed to cast.
|
||||||
|
|
||||||
|
|
||||||
// Check powers for normal users
|
// Check powers for normal users
|
||||||
|
if (playerCharacter.getPowers() == null || !playerCharacter.getPowers().containsKey(msg.getPowerUsedID()))
|
||||||
if(msg.getPowerUsedID() == 429399948)
|
|
||||||
for(CharacterRune cr : playerCharacter.getRunes())
|
|
||||||
if(cr.getRuneBaseID() == 3029)
|
|
||||||
skipCheck = true;
|
|
||||||
if (!skipCheck && (playerCharacter.getPowers() == null || !playerCharacter.getPowers().containsKey(msg.getPowerUsedID())))
|
|
||||||
if (!playerCharacter.isCSR()) {
|
if (!playerCharacter.isCSR()) {
|
||||||
if (!MBServerStatics.POWERS_DEBUG) {
|
if (!MBServerStatics.POWERS_DEBUG) {
|
||||||
// ChatManager.chatSayInfo(pc, "You may not cast that spell!");
|
// ChatManager.chatSayInfo(pc, "You may not cast that spell!");
|
||||||
@@ -346,31 +296,18 @@ public enum PowersManager {
|
|||||||
|
|
||||||
// get numTrains for power
|
// get numTrains for power
|
||||||
int trains = msg.getNumTrains();
|
int trains = msg.getNumTrains();
|
||||||
int token = pb.token;
|
|
||||||
int overrideTrains = 0;
|
|
||||||
int overrideRecycle = 0;
|
|
||||||
if(token == 429420458){
|
|
||||||
overrideTrains = 40;
|
|
||||||
overrideRecycle = 300000;
|
|
||||||
}
|
|
||||||
// can't go over the max trains for the power, unless CSR
|
// can't go over the max trains for the power, unless CSR
|
||||||
if (trains > pb.getMaxTrains() && !playerCharacter.isCSR()) {
|
if (trains > pb.getMaxTrains() && !playerCharacter.isCSR()) {
|
||||||
trains = pb.getMaxTrains();
|
trains = pb.getMaxTrains();
|
||||||
msg.setNumTrains(trains);
|
msg.setNumTrains(trains);
|
||||||
}
|
}
|
||||||
|
|
||||||
// can't go over total trains by player
|
// can't go over total trains by player
|
||||||
if (playerCharacter.getPowers() != null && playerCharacter.getPowers().containsKey(msg.getPowerUsedID())) {
|
if (playerCharacter.getPowers() != null && playerCharacter.getPowers().containsKey(msg.getPowerUsedID())) {
|
||||||
CharacterPower cp = playerCharacter.getPowers().get(msg.getPowerUsedID());
|
CharacterPower cp = playerCharacter.getPowers().get(msg.getPowerUsedID());
|
||||||
if (cp != null) {
|
if (cp != null) {
|
||||||
int tot = cp.getTotalTrains();
|
int tot = cp.getTotalTrains();
|
||||||
switch(token){
|
|
||||||
case 430596127:
|
|
||||||
if(playerCharacter.getPromotionClass().getName().equals("Wizard"))
|
|
||||||
tot = 40; //single teleport granted at 40 for wizard
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tot == 0 && !playerCharacter.isCSR())
|
if (tot == 0 && !playerCharacter.isCSR())
|
||||||
return false;
|
return false;
|
||||||
if (trains != tot && !playerCharacter.isCSR()) {
|
if (trains != tot && !playerCharacter.isCSR()) {
|
||||||
@@ -379,19 +316,27 @@ public enum PowersManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(overrideTrains > 0)
|
|
||||||
msg.setNumTrains(overrideTrains);
|
|
||||||
// get recycle time in ms
|
// get recycle time in ms
|
||||||
int time = pb.getRecycleTime(trains);
|
int time = pb.getRecycleTime(trains);
|
||||||
|
|
||||||
if(overrideRecycle > 0)
|
// verify player is in correct mode (combat/nonCombat)
|
||||||
time = overrideRecycle;
|
if (playerCharacter.isCombat()) {
|
||||||
|
if (!pb.allowedInCombat())
|
||||||
|
// ChatManager.chatPowerError(pc,
|
||||||
|
// "This power is not allowed in combat mode.");
|
||||||
|
return true;
|
||||||
|
} else if (!pb.allowedOutOfCombat())
|
||||||
|
// ChatManager.chatPowerError(pc,
|
||||||
|
// "You must be in combat mode to use this power.");
|
||||||
|
return true;
|
||||||
|
|
||||||
// verify player is not stunned or prohibited from casting
|
// verify player is not stunned or prohibited from casting
|
||||||
PlayerBonuses bonus = playerCharacter.getBonuses();
|
PlayerBonuses bonus = playerCharacter.getBonuses();
|
||||||
SourceType sourceType = SourceType.GetSourceType(pb.getCategory());
|
SourceType sourceType = SourceType.GetSourceType(pb.getCategory());
|
||||||
if (bonus != null && (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotCast, SourceType.None) || bonus.getBool(ModType.BlockedPowerType, sourceType)))
|
if (bonus != null && (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotCast, SourceType.None) || bonus.getBool(ModType.BlockedPowerType, sourceType)))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// if moving make sure spell valid for movement
|
// if moving make sure spell valid for movement
|
||||||
Vector3fImmutable endLoc = playerCharacter.getEndLoc();
|
Vector3fImmutable endLoc = playerCharacter.getEndLoc();
|
||||||
|
|
||||||
@@ -417,43 +362,35 @@ public enum PowersManager {
|
|||||||
if (pb.targetFromLastTarget() || pb.targetPet()) // use msg's target
|
if (pb.targetFromLastTarget() || pb.targetPet()) // use msg's target
|
||||||
if (pb.isAOE()) {
|
if (pb.isAOE()) {
|
||||||
if (!pb.usePointBlank()) {
|
if (!pb.usePointBlank()) {
|
||||||
AbstractWorldObject target;
|
AbstractWorldObject target = getTarget(msg);
|
||||||
if(msg.getTargetType() == 37 && Mob.dynamic_pets.get(msg.getTargetID()) != null){
|
|
||||||
Mob pet = Mob.dynamic_pets.get(msg.getTargetID());
|
|
||||||
target = pet;
|
|
||||||
}else{
|
|
||||||
target = getTarget(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target != null && target.getObjectType() == GameObjectType.Building && !pb.targetBuilding()) {
|
if (target != null && target.getObjectType() == GameObjectType.Building && !pb.targetBuilding()) {
|
||||||
PowersManager.sendPowerMsg(playerCharacter, 9, new PerformActionMsg(msg));
|
PowersManager.sendPowerMsg(playerCharacter, 9, new PerformActionMsg(msg));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target == null) {
|
if (target == null) {
|
||||||
if (playerCharacter.getLoc().distanceSquared2D(msg.getTargetLoc()) > sqr(pb
|
if (playerCharacter.getLoc().distanceSquared2D(msg.getTargetLoc()) > sqr(pb
|
||||||
.getRange()))
|
.getRange()))
|
||||||
return true;
|
return true;
|
||||||
} else if (verifyInvalidRange(playerCharacter, target, pb.getRange())) {
|
} else if (verifyInvalidRange(playerCharacter, target, pb.getRange()))
|
||||||
// pc.getLoc().distance(target.getLoc()) >
|
// pc.getLoc().distance(target.getLoc()) >
|
||||||
// pb.getRange())
|
// pb.getRange())
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// get target
|
// get target
|
||||||
AbstractWorldObject target;
|
AbstractWorldObject target = getTarget(msg);
|
||||||
if(msg.getTargetType() == 37 && Mob.dynamic_pets.get(msg.getTargetID()) != null){
|
|
||||||
Mob pet = Mob.dynamic_pets.get(msg.getTargetID());
|
if (target == null)
|
||||||
target = pet;
|
|
||||||
}else{
|
|
||||||
target = getTarget(msg);
|
|
||||||
}
|
|
||||||
if (target == null) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
if (!target.isAlive() && target.getObjectType().equals(GameObjectType.Building) == false && msg.getPowerUsedID() != 428589216)
|
if (!target.isAlive() && target.getObjectType().equals(GameObjectType.Building) == false && msg.getPowerUsedID() != 428589216)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
float range = pb.getRange();
|
float range = pb.getRange();
|
||||||
// verify target is in range
|
// verify target is in range
|
||||||
|
|
||||||
@@ -462,13 +399,16 @@ public enum PowersManager {
|
|||||||
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
|
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
|
||||||
// TODO send message that target is out of range
|
// TODO send message that target is out of range
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// verify target is valid type
|
// verify target is valid type
|
||||||
if (!validateTarget(target, playerCharacter, pb))
|
if (!validateTarget(target, playerCharacter, pb))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
||||||
if (AbstractWorldObject.IsAbstractCharacter(target))
|
if (AbstractWorldObject.IsAbstractCharacter(target))
|
||||||
targetLiveCounter = ((AbstractCharacter) target).getLiveCounter();
|
targetLiveCounter = ((AbstractCharacter) target).getLiveCounter();
|
||||||
}
|
}
|
||||||
|
|
||||||
// verify regular player can cast spell, otherwise authenticate
|
// verify regular player can cast spell, otherwise authenticate
|
||||||
if (!pb.regularPlayerCanCast()) {
|
if (!pb.regularPlayerCanCast()) {
|
||||||
Account a = SessionManager.getAccount(playerCharacter);
|
Account a = SessionManager.getAccount(playerCharacter);
|
||||||
@@ -478,6 +418,7 @@ public enum PowersManager {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// verify player has proper effects applied to use power
|
// verify player has proper effects applied to use power
|
||||||
if (pb.getEffectPrereqs().size() > 0 && playerCharacter.getEffects() != null) {
|
if (pb.getEffectPrereqs().size() > 0 && playerCharacter.getEffects() != null) {
|
||||||
|
|
||||||
@@ -491,9 +432,11 @@ public enum PowersManager {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!passed)
|
if (!passed)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//verify player has proper equipment to use power
|
//verify player has proper equipment to use power
|
||||||
if (pb.getEquipPrereqs().size() > 0) {
|
if (pb.getEquipPrereqs().size() > 0) {
|
||||||
|
|
||||||
@@ -612,13 +555,6 @@ public enum PowersManager {
|
|||||||
// get cast time in ms.
|
// get cast time in ms.
|
||||||
time = pb.getCastTime(trains);
|
time = pb.getCastTime(trains);
|
||||||
|
|
||||||
|
|
||||||
if(pb.token == 430596127)
|
|
||||||
time = 5000;
|
|
||||||
|
|
||||||
if(pb.name.equals("Summon") && playerCharacter.getRace().getName().contains("Vampire"))
|
|
||||||
time = 60000;
|
|
||||||
|
|
||||||
// set player is casting for regens
|
// set player is casting for regens
|
||||||
|
|
||||||
|
|
||||||
@@ -630,10 +566,6 @@ public enum PowersManager {
|
|||||||
|
|
||||||
playerCharacter.setLastMovementState(playerCharacter.getMovementState());
|
playerCharacter.setLastMovementState(playerCharacter.getMovementState());
|
||||||
|
|
||||||
if(msg.getPowerUsedID() == 429495514 && playerCharacter.getRace().getName().contains("Shade")){
|
|
||||||
copyMsg.setPowerUsedID(429397210);//intercept shade using hide and cast sneak instead
|
|
||||||
}
|
|
||||||
|
|
||||||
// run timer job to end cast
|
// run timer job to end cast
|
||||||
if (time < 1) // run immediately
|
if (time < 1) // run immediately
|
||||||
finishUsePower(copyMsg, playerCharacter, casterLiveCounter, targetLiveCounter);
|
finishUsePower(copyMsg, playerCharacter, casterLiveCounter, targetLiveCounter);
|
||||||
@@ -699,13 +631,7 @@ public enum PowersManager {
|
|||||||
if (pb.targetFromLastTarget() || pb.targetPet()) // use msg's target
|
if (pb.targetFromLastTarget() || pb.targetPet()) // use msg's target
|
||||||
if (pb.isAOE()) {
|
if (pb.isAOE()) {
|
||||||
if (!pb.usePointBlank()) {
|
if (!pb.usePointBlank()) {
|
||||||
AbstractWorldObject target;
|
AbstractWorldObject target = getTarget(msg);
|
||||||
if(msg.getTargetType() == 37 && Mob.dynamic_pets.get(msg.getTargetID()) != null){
|
|
||||||
Mob pet = Mob.dynamic_pets.get(msg.getTargetID());
|
|
||||||
target = pet;
|
|
||||||
}else{
|
|
||||||
target = getTarget(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (target == null) {
|
if (target == null) {
|
||||||
@@ -720,13 +646,7 @@ public enum PowersManager {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// get target
|
// get target
|
||||||
AbstractWorldObject target;
|
AbstractWorldObject target = getTarget(msg);
|
||||||
if(msg.getTargetType() == 37 && Mob.dynamic_pets.get(msg.getTargetID()) != null){
|
|
||||||
Mob pet = Mob.dynamic_pets.get(msg.getTargetID());
|
|
||||||
target = pet;
|
|
||||||
}else{
|
|
||||||
target = getTarget(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target == null)
|
if (target == null)
|
||||||
return true;
|
return true;
|
||||||
@@ -1331,8 +1251,9 @@ public enum PowersManager {
|
|||||||
if (pc == null)
|
if (pc == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
PlayerCharacter target = SessionManager.getPlayerCharacterByLowerCaseName(msg.getTargetName());
|
PlayerCharacter target = SessionManager
|
||||||
if (target == null || target.equals(pc) || target.isCombat() || target.getGuild().getNation().equals(pc.getGuild().getNation()) == false) {
|
.getPlayerCharacterByLowerCaseName(msg.getTargetName());
|
||||||
|
if (target == null || target.equals(pc) || target.isCombat()) {
|
||||||
|
|
||||||
if (target == null) // Player not found. Send not found message
|
if (target == null) // Player not found. Send not found message
|
||||||
ChatManager.chatInfoError(pc,
|
ChatManager.chatInfoError(pc,
|
||||||
@@ -1341,10 +1262,7 @@ public enum PowersManager {
|
|||||||
ChatManager.chatInfoError(pc,
|
ChatManager.chatInfoError(pc,
|
||||||
"Cannot summon player in combat.");
|
"Cannot summon player in combat.");
|
||||||
// else trying to summon self, just fail
|
// else trying to summon self, just fail
|
||||||
if(target != null && target.getGuild().getNation().equals(pc.getGuild().getNation()) == false){
|
|
||||||
ChatManager.chatInfoError(pc,
|
|
||||||
"Cannot summon outside of nation.");
|
|
||||||
}
|
|
||||||
// recycle summon
|
// recycle summon
|
||||||
sendRecyclePower(msg.getPowerToken(), origin);
|
sendRecyclePower(msg.getPowerToken(), origin);
|
||||||
|
|
||||||
@@ -1376,7 +1294,7 @@ public enum PowersManager {
|
|||||||
if (source == null)
|
if (source == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
long tooLate = pc.getSummoner(source.getObjectUUID()) + 45000;
|
long tooLate = pc.getSummoner(source.getObjectUUID());
|
||||||
if (tooLate < System.currentTimeMillis()) {
|
if (tooLate < System.currentTimeMillis()) {
|
||||||
ChatManager.chatInfoError(pc, "You waited too long to " + (msg.accepted() ? "accept" : "decline") + " the summons.");
|
ChatManager.chatInfoError(pc, "You waited too long to " + (msg.accepted() ? "accept" : "decline") + " the summons.");
|
||||||
pc.removeSummoner(source.getObjectUUID());
|
pc.removeSummoner(source.getObjectUUID());
|
||||||
@@ -1438,15 +1356,7 @@ public enum PowersManager {
|
|||||||
duration = 15000; // Healer Summons, 15 seconds
|
duration = 15000; // Healer Summons, 15 seconds
|
||||||
else
|
else
|
||||||
duration = 45000; // Belgosh Summons, 45 seconds
|
duration = 45000; // Belgosh Summons, 45 seconds
|
||||||
if(pc.inSafeZone() == false) {
|
|
||||||
for (AbstractWorldObject absChar : WorldGrid.getObjectsInRangePartial(pc.loc, MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER)) {
|
|
||||||
PlayerCharacter player = (PlayerCharacter) absChar;
|
|
||||||
if (player.guild.getNation().equals(pc.guild.getNation()) == false) {
|
|
||||||
duration += 60000;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Teleport to summoners location
|
// Teleport to summoners location
|
||||||
FinishSummonsJob fsj = new FinishSummonsJob(source, pc);
|
FinishSummonsJob fsj = new FinishSummonsJob(source, pc);
|
||||||
@@ -1575,41 +1485,6 @@ public enum PowersManager {
|
|||||||
HashSet<AbstractCharacter> trackChars = RangeBasedAwo.getTrackList(
|
HashSet<AbstractCharacter> trackChars = RangeBasedAwo.getTrackList(
|
||||||
allTargets, playerCharacter, maxTargets);
|
allTargets, playerCharacter, maxTargets);
|
||||||
|
|
||||||
trackChars = new HashSet<>();
|
|
||||||
HashSet<AbstractWorldObject> allInRange = WorldGrid.getObjectsInRangePartial(playerCharacter.loc,MBServerStatics.CHARACTER_LOAD_RANGE,MBServerStatics.MASK_PLAYER);
|
|
||||||
//ArrayList<Guild> nationsInRange = new ArrayList<>();
|
|
||||||
ArrayList<AbstractWorldObject> purgeList = new ArrayList<>();
|
|
||||||
for(AbstractWorldObject trackChar : allInRange) {
|
|
||||||
if(trackChar.equals(playerCharacter) || !trackChar.isAlive() || !((PlayerCharacter)trackChar).isActive())
|
|
||||||
purgeList.add(trackChar);
|
|
||||||
}
|
|
||||||
|
|
||||||
allInRange.removeAll(purgeList);
|
|
||||||
|
|
||||||
//first round to add players in range
|
|
||||||
for(AbstractWorldObject trackChar : allInRange){
|
|
||||||
if(trackChar.equals(playerCharacter) || !trackChar.isAlive() || !((PlayerCharacter)trackChar).isActive())
|
|
||||||
continue;
|
|
||||||
if(allInRange.contains(trackChar)) {
|
|
||||||
trackChars.add((AbstractCharacter)trackChar);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//track full range for chaining nation members
|
|
||||||
ArrayList<Guild> nationsInRange = new ArrayList<>();
|
|
||||||
for(AbstractCharacter pc : trackChars){
|
|
||||||
if(nationsInRange.contains(pc.guild.getNation()) == false)
|
|
||||||
nationsInRange.add(pc.guild.getNation());
|
|
||||||
}
|
|
||||||
HashSet<AbstractWorldObject> fullRange = WorldGrid.getObjectsInRangePartial(playerCharacter.loc,1024,MBServerStatics.MASK_PLAYER);
|
|
||||||
for(AbstractWorldObject trackChar : fullRange) {
|
|
||||||
if(trackChar.equals(playerCharacter) || !trackChar.isAlive() || !((PlayerCharacter)trackChar).isActive())
|
|
||||||
continue;
|
|
||||||
if(nationsInRange.contains(((PlayerCharacter) trackChar).guild.getNation()) && trackChars.contains(trackChar) == false)
|
|
||||||
trackChars.add((AbstractCharacter)trackChar);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
TrackWindowMsg trackWindowMsg = new TrackWindowMsg(msg);
|
TrackWindowMsg trackWindowMsg = new TrackWindowMsg(msg);
|
||||||
|
|
||||||
// send track window
|
// send track window
|
||||||
@@ -1785,8 +1660,7 @@ public enum PowersManager {
|
|||||||
ac.setItemCasting(false);
|
ac.setItemCasting(false);
|
||||||
if (ac == null || target == null || pb == null)
|
if (ac == null || target == null || pb == null)
|
||||||
return;
|
return;
|
||||||
if(pb.targetSelf)
|
|
||||||
target = ac;
|
|
||||||
ac.clearTimer(Integer.toString(pb.getToken()));
|
ac.clearTimer(Integer.toString(pb.getToken()));
|
||||||
if (liveCounter == ac.getLiveCounter())
|
if (liveCounter == ac.getLiveCounter())
|
||||||
finishApplyPowerA(ac, target, targetLoc, pb, trains, false);
|
finishApplyPowerA(ac, target, targetLoc, pb, trains, false);
|
||||||
@@ -2367,9 +2241,9 @@ public enum PowersManager {
|
|||||||
|
|
||||||
int type = msg.getTargetType();
|
int type = msg.getTargetType();
|
||||||
int UUID = msg.getTargetID();
|
int UUID = msg.getTargetID();
|
||||||
if (type == -1 || type == 0 || UUID == -1 || UUID == 0) {
|
|
||||||
|
if (type == -1 || type == 0 || UUID == -1 || UUID == 0)
|
||||||
return null;
|
return null;
|
||||||
}
|
|
||||||
|
|
||||||
return (AbstractWorldObject) DbManager.getObject(GameObjectType.values()[type], UUID);
|
return (AbstractWorldObject) DbManager.getObject(GameObjectType.values()[type], UUID);
|
||||||
}
|
}
|
||||||
@@ -2392,11 +2266,17 @@ public enum PowersManager {
|
|||||||
ChatManager.chatSystemInfo(pc, smsg);
|
ChatManager.chatSystemInfo(pc, smsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
float constant = (atr+defense)*0.315f;
|
int chance;
|
||||||
float atrChance = atr - constant;
|
|
||||||
float defChance = defense - constant + atrChance;
|
if (atr > defense || defense == 0)
|
||||||
float smallChance = atrChance/defChance;
|
chance = 94;
|
||||||
int chance = (int)(smallChance * 100);
|
else {
|
||||||
|
float dif = atr / defense;
|
||||||
|
if (dif <= 0.8f)
|
||||||
|
chance = 4;
|
||||||
|
else
|
||||||
|
chance = ((int) (450 * (dif - 0.8f)) + 4);
|
||||||
|
}
|
||||||
|
|
||||||
// calculate hit/miss
|
// calculate hit/miss
|
||||||
int roll = ThreadLocalRandom.current().nextInt(100);
|
int roll = ThreadLocalRandom.current().nextInt(100);
|
||||||
@@ -2604,11 +2484,11 @@ public enum PowersManager {
|
|||||||
ChatManager.chatSystemInfo(pc, outmsg);
|
ChatManager.chatSystemInfo(pc, outmsg);
|
||||||
return false; // can't target player, stop here
|
return false; // can't target player, stop here
|
||||||
} // target is mob
|
} // target is mob
|
||||||
else if ((target.getObjectTypeMask() & MBServerStatics.MASK_MOB) != 0 && ((Mob)target).isPet() == false)
|
else if ((target.getObjectTypeMask() & MBServerStatics.MASK_MOB) != 0)
|
||||||
return pb.targetMob();
|
return pb.targetMob();
|
||||||
|
|
||||||
// target is pet
|
// target is pet
|
||||||
else if ((target.getObjectTypeMask() & MBServerStatics.MASK_MOB) != 0 && ((Mob)target).isPet() == true)
|
else if ((target.getObjectTypeMask() & MBServerStatics.MASK_PET) != 0)
|
||||||
return pb.targetPet();
|
return pb.targetPet();
|
||||||
|
|
||||||
// target is Building
|
// target is Building
|
||||||
@@ -2687,7 +2567,7 @@ public enum PowersManager {
|
|||||||
|
|
||||||
PowersBase power = getLastPower(ac);
|
PowersBase power = getLastPower(ac);
|
||||||
|
|
||||||
if (power != null && power.cancelOnTakeDamage() && power.getName().equals("Translocate") == false)
|
if (power != null && power.cancelOnTakeDamage())
|
||||||
cancelPower(ac, true);
|
cancelPower(ac, true);
|
||||||
cancelItems(ac, false, true);
|
cancelItems(ac, false, true);
|
||||||
ac.cancelTimer("Stuck");
|
ac.cancelTimer("Stuck");
|
||||||
@@ -2847,12 +2727,7 @@ public enum PowersManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static void applyZergBuff(AbstractGameObject obj){
|
|
||||||
|
|
||||||
}
|
|
||||||
public static void removeZergBuff(HashSet<Integer> playersIDs){
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -10,12 +10,10 @@ package engine.gameManager;
|
|||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
import engine.InterestManagement.WorldGrid;
|
import engine.objects.AbstractGameObject;
|
||||||
import engine.db.archive.DataWarehouse;
|
import engine.objects.City;
|
||||||
import engine.db.archive.MineRecord;
|
import engine.objects.PlayerCharacter;
|
||||||
import engine.net.DispatchMessage;
|
import engine.objects.Runegate;
|
||||||
import engine.net.client.msg.chat.ChatSystemMsg;
|
|
||||||
import engine.objects.*;
|
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
@@ -24,7 +22,6 @@ import java.sql.ResultSet;
|
|||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -36,14 +33,13 @@ public enum SimulationManager {
|
|||||||
SERVERHEARTBEAT;
|
SERVERHEARTBEAT;
|
||||||
|
|
||||||
private static final long CITY_PULSE = 2000;
|
private static final long CITY_PULSE = 2000;
|
||||||
private static final long RUNEGATE_PULSE = 500;
|
private static final long RUNEGATE_PULSE = 3000;
|
||||||
private static final long UPDATE_PULSE = 1000;
|
private static final long UPDATE_PULSE = 1000;
|
||||||
private static final long FlIGHT_PULSE = 100;
|
private static final long FlIGHT_PULSE = 100;
|
||||||
public static Duration executionTime = Duration.ofNanos(1);
|
public static Duration executionTime = Duration.ofNanos(1);
|
||||||
public static Duration executionMax = Duration.ofNanos(1);
|
public static Duration executionMax = Duration.ofNanos(1);
|
||||||
private static SimulationManager instance = null;
|
private static SimulationManager instance = null;
|
||||||
private long _cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
|
private long _cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
|
||||||
private long _minePulseTime = System.currentTimeMillis() + CITY_PULSE;
|
|
||||||
private long _runegatePulseTime = System.currentTimeMillis()
|
private long _runegatePulseTime = System.currentTimeMillis()
|
||||||
+ RUNEGATE_PULSE;
|
+ RUNEGATE_PULSE;
|
||||||
private long _updatePulseTime = System.currentTimeMillis() + UPDATE_PULSE;
|
private long _updatePulseTime = System.currentTimeMillis() + UPDATE_PULSE;
|
||||||
@@ -73,8 +69,6 @@ public enum SimulationManager {
|
|||||||
return popString;
|
return popString;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Update the simulation. *** Important: Whatever you do in here, do it damn
|
* Update the simulation. *** Important: Whatever you do in here, do it damn
|
||||||
* quick!
|
* quick!
|
||||||
@@ -132,17 +126,7 @@ public enum SimulationManager {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
||||||
}
|
}
|
||||||
//try {
|
|
||||||
// if ((_minePulseTime != 0)
|
|
||||||
// && (System.currentTimeMillis() > _minePulseTime))
|
|
||||||
// pulseMines();
|
|
||||||
//} catch (Exception e) {
|
|
||||||
// Logger.error(
|
|
||||||
// "Fatal error in Mine Pulse: DISABLED. Error Message : "
|
|
||||||
// + e.getMessage());
|
|
||||||
// e.printStackTrace();
|
|
||||||
|
|
||||||
//}
|
|
||||||
SimulationManager.executionTime = Duration.between(startTime, Instant.now());
|
SimulationManager.executionTime = Duration.between(startTime, Instant.now());
|
||||||
|
|
||||||
if (executionTime.compareTo(executionMax) > 0)
|
if (executionTime.compareTo(executionMax) > 0)
|
||||||
@@ -219,6 +203,7 @@ public enum SimulationManager {
|
|||||||
city = (City) cityObject;
|
city = (City) cityObject;
|
||||||
city.onEnter();
|
city.onEnter();
|
||||||
}
|
}
|
||||||
|
|
||||||
_cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
|
_cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,58 +0,0 @@
|
|||||||
package engine.gameManager;
|
|
||||||
|
|
||||||
import engine.objects.Guild;
|
|
||||||
|
|
||||||
public class ZergManager {
|
|
||||||
|
|
||||||
public static int getBaneCap(Guild guild) {
|
|
||||||
|
|
||||||
if(guild.getOwnedCity() == null || guild.getOwnedCity().getTOL() == null)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
int cityRank = guild.getOwnedCity().getTOL().getRank();
|
|
||||||
return (cityRank == 8) ? 20 : ((guild.getNation().getSubGuildList().size() + 1 <= 4) ? 10 : 20);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float getCurrentMultiplier(int count, int maxCount){
|
|
||||||
switch(maxCount) {
|
|
||||||
case 3:
|
|
||||||
return getMultiplier3Man(count);
|
|
||||||
case 5:
|
|
||||||
return getMultiplier5Man(count);
|
|
||||||
case 10:
|
|
||||||
return getMultiplier10Man(count);
|
|
||||||
case 20:
|
|
||||||
return getMultiplier20Man(count);
|
|
||||||
default:
|
|
||||||
return getMultiplier40Man(count);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static float getMultiplier(int count, int maxCount, float[] thresholds) {
|
|
||||||
if (count <= maxCount) return 1.0f;
|
|
||||||
if (count > thresholds.length) return 0.0f;
|
|
||||||
return 1.0f - thresholds[count - maxCount - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float getMultiplier3Man(int count) {
|
|
||||||
float[] thresholds = {0.37f, 0.60f, 0.75f};
|
|
||||||
return getMultiplier(count, 3, thresholds);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float getMultiplier5Man(int count) {
|
|
||||||
float[] thresholds = {0.25f, 0.43f, 0.56f, 0.67f, 0.75f};
|
|
||||||
return getMultiplier(count, 5, thresholds);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float getMultiplier10Man(int count) {
|
|
||||||
float[] thresholds = {0.14f, 0.25f, 0.35f, 0.43f, 0.50f, 0.56f, 0.62f, 0.67f, 0.71f, 0.75f};
|
|
||||||
return getMultiplier(count, 10, thresholds);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float getMultiplier20Man(int count) {
|
|
||||||
return getMultiplier10Man(count * 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float getMultiplier40Man(int count) {
|
|
||||||
return getMultiplier10Man(count * 4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -15,13 +15,9 @@ import engine.gameManager.DbManager;
|
|||||||
import engine.job.AbstractScheduleJob;
|
import engine.job.AbstractScheduleJob;
|
||||||
import engine.net.DispatchMessage;
|
import engine.net.DispatchMessage;
|
||||||
import engine.net.client.msg.chat.ChatSystemMsg;
|
import engine.net.client.msg.chat.ChatSystemMsg;
|
||||||
import engine.objects.Bane;
|
|
||||||
import engine.objects.City;
|
import engine.objects.City;
|
||||||
import engine.workthreads.ZergMechanicThread;
|
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import static engine.workthreads.ZergMechanicThread.startZergThreadBane;
|
|
||||||
|
|
||||||
public class ActivateBaneJob extends AbstractScheduleJob {
|
public class ActivateBaneJob extends AbstractScheduleJob {
|
||||||
|
|
||||||
private final int cityUUID;
|
private final int cityUUID;
|
||||||
@@ -71,10 +67,6 @@ public class ActivateBaneJob extends AbstractScheduleJob {
|
|||||||
msg.setChannel(ChatChannelType.SYSTEM.getChannelID());
|
msg.setChannel(ChatChannelType.SYSTEM.getChannelID());
|
||||||
|
|
||||||
DispatchMessage.dispatchMsgToAll(msg);
|
DispatchMessage.dispatchMsgToAll(msg);
|
||||||
|
|
||||||
if(city.getBane() != null) {
|
|
||||||
startZergThreadBane(city.getBane());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -9,11 +9,9 @@
|
|||||||
|
|
||||||
package engine.jobs;
|
package engine.jobs;
|
||||||
|
|
||||||
import engine.Enum;
|
|
||||||
import engine.gameManager.CombatManager;
|
import engine.gameManager.CombatManager;
|
||||||
import engine.job.AbstractJob;
|
import engine.job.AbstractJob;
|
||||||
import engine.objects.AbstractCharacter;
|
import engine.objects.AbstractCharacter;
|
||||||
import engine.objects.PlayerCharacter;
|
|
||||||
|
|
||||||
public class AttackJob extends AbstractJob {
|
public class AttackJob extends AbstractJob {
|
||||||
|
|
||||||
@@ -31,9 +29,6 @@ public class AttackJob extends AbstractJob {
|
|||||||
@Override
|
@Override
|
||||||
protected void doJob() {
|
protected void doJob() {
|
||||||
CombatManager.doCombat(this.source, slot);
|
CombatManager.doCombat(this.source, slot);
|
||||||
if(this.source.getObjectType().equals(Enum.GameObjectType.PlayerCharacter))
|
|
||||||
if(((PlayerCharacter)this.source).getHidden() > 0)
|
|
||||||
this.source.removeEffectBySource(Enum.EffectSourceType.Invisibility,41,true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean success() {
|
public boolean success() {
|
||||||
|
|||||||
@@ -34,15 +34,10 @@ public class ModTableEntry {
|
|||||||
|
|
||||||
itemTableEntryList = LootManager._modTables.get(modTablwe);
|
itemTableEntryList = LootManager._modTables.get(modTablwe);
|
||||||
|
|
||||||
if(itemTableEntryList == null)
|
for (ModTableEntry iteration : itemTableEntryList)
|
||||||
return null;
|
|
||||||
|
|
||||||
for (ModTableEntry iteration : itemTableEntryList) {
|
|
||||||
if (iteration == null)
|
|
||||||
continue;
|
|
||||||
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
|
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
|
||||||
modTableEntry = iteration;
|
modTableEntry = iteration;
|
||||||
}
|
|
||||||
return modTableEntry;
|
return modTableEntry;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -220,7 +220,7 @@ public class Bounds {
|
|||||||
//player is inside building region, skip collision check. we only do collision from the outside.
|
//player is inside building region, skip collision check. we only do collision from the outside.
|
||||||
if (player.region != null && player.region.parentBuildingID == building.getObjectUUID())
|
if (player.region != null && player.region.parentBuildingID == building.getObjectUUID())
|
||||||
continue;
|
continue;
|
||||||
if (building.getBounds() == null || building.getBounds().colliders == null)
|
if (building.getBounds().colliders == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (Colliders collider : building.getBounds().colliders) {
|
for (Colliders collider : building.getBounds().colliders) {
|
||||||
|
|||||||
+444
-153
@@ -18,16 +18,18 @@ import engine.mobileAI.Threads.MobAIThread;
|
|||||||
import engine.mobileAI.utilities.CombatUtilities;
|
import engine.mobileAI.utilities.CombatUtilities;
|
||||||
import engine.mobileAI.utilities.MovementUtilities;
|
import engine.mobileAI.utilities.MovementUtilities;
|
||||||
import engine.net.DispatchMessage;
|
import engine.net.DispatchMessage;
|
||||||
|
import engine.net.client.msg.PerformActionMsg;
|
||||||
import engine.net.client.msg.PowerProjectileMsg;
|
import engine.net.client.msg.PowerProjectileMsg;
|
||||||
import engine.net.client.msg.UpdateStateMsg;
|
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
|
import engine.powers.ActionsBase;
|
||||||
|
import engine.powers.MobPowerEntry;
|
||||||
import engine.powers.PowersBase;
|
import engine.powers.PowersBase;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
@@ -47,9 +49,16 @@ public class MobAI {
|
|||||||
mob.setCombatTarget(null);
|
mob.setCombatTarget(null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (target.getObjectType() == Enum.GameObjectType.PlayerCharacter){
|
|
||||||
if(((PlayerCharacter)target).getHidden() > 0){
|
if (target.getObjectType() == Enum.GameObjectType.PlayerCharacter && canCast(mob)) {
|
||||||
mob.setCombatTarget(null);
|
|
||||||
|
if (mob.isPlayerGuard() == false && MobCast(mob)) {
|
||||||
|
mob.updateLocation();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mob.isPlayerGuard() == true && GuardCast(mob)) {
|
||||||
|
mob.updateLocation();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -72,6 +81,8 @@ public class MobAI {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mob.updateLocation();
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackTarget" + " " + e.getMessage());
|
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackTarget" + " " + e.getMessage());
|
||||||
}
|
}
|
||||||
@@ -133,7 +144,7 @@ public class MobAI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (target.getPet() != null)
|
if (target.getPet() != null)
|
||||||
if (target.getPet().getCombatTarget() == null && target.getPet().assist)
|
if (target.getPet().getCombatTarget() == null && target.getPet().assist == true)
|
||||||
target.getPet().setCombatTarget(mob);
|
target.getPet().setCombatTarget(mob);
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -145,9 +156,7 @@ public class MobAI {
|
|||||||
public static void AttackBuilding(Mob mob, Building target) {
|
public static void AttackBuilding(Mob mob, Building target) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if(target == null){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (target.getRank() == -1 || !target.isVulnerable() || BuildingManager.getBuildingFromCache(target.getObjectUUID()) == null) {
|
if (target.getRank() == -1 || !target.isVulnerable() || BuildingManager.getBuildingFromCache(target.getObjectUUID()) == null) {
|
||||||
mob.setCombatTarget(null);
|
mob.setCombatTarget(null);
|
||||||
return;
|
return;
|
||||||
@@ -194,7 +203,6 @@ public class MobAI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
mob.setCombatTarget(null);
|
|
||||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackBuilding" + " " + e.getMessage());
|
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackBuilding" + " " + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -233,15 +241,6 @@ public class MobAI {
|
|||||||
target.setCombatTarget(mob);
|
target.setCombatTarget(mob);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(target.isAlive())
|
|
||||||
target.setCombatTarget(mob);
|
|
||||||
|
|
||||||
if(target.isPet() && !target.isAlive() && target.guardCaptain.isAlive()){
|
|
||||||
mob.setCombatTarget(target.guardCaptain);
|
|
||||||
}
|
|
||||||
if(mob.isPet()){
|
|
||||||
AttackMob(target,mob);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackMob" + " " + e.getMessage());
|
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackMob" + " " + e.getMessage());
|
||||||
}
|
}
|
||||||
@@ -257,7 +256,7 @@ public class MobAI {
|
|||||||
|
|
||||||
//early exit while waiting to patrol again
|
//early exit while waiting to patrol again
|
||||||
|
|
||||||
if (mob.stopPatrolTime + (patrolDelay * 1000L) > System.currentTimeMillis())
|
if (mob.stopPatrolTime + (patrolDelay * 1000) > System.currentTimeMillis())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//guard captains inherit barracks patrol points dynamically
|
//guard captains inherit barracks patrol points dynamically
|
||||||
@@ -287,7 +286,7 @@ public class MobAI {
|
|||||||
|
|
||||||
//make sure mob is out of combat stance
|
//make sure mob is out of combat stance
|
||||||
|
|
||||||
if (!minion.getKey().despawned) {
|
if (minion.getKey().despawned == false) {
|
||||||
if (MovementUtilities.canMove(minion.getKey())) {
|
if (MovementUtilities.canMove(minion.getKey())) {
|
||||||
Vector3f minionOffset = Formation.getOffset(2, minion.getValue() + 3);
|
Vector3f minionOffset = Formation.getOffset(2, minion.getValue() + 3);
|
||||||
minion.getKey().updateLocation();
|
minion.getKey().updateLocation();
|
||||||
@@ -300,6 +299,259 @@ public class MobAI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean canCast(Mob mob) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
// Performs validation to determine if a
|
||||||
|
// mobile in the proper state to cast.
|
||||||
|
|
||||||
|
if (mob == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (mob.isPlayerGuard() == true) {
|
||||||
|
|
||||||
|
int contractID;
|
||||||
|
|
||||||
|
if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardMinion))
|
||||||
|
contractID = mob.guardCaptain.contract.getContractID();
|
||||||
|
else
|
||||||
|
contractID = mob.contract.getContractID();
|
||||||
|
|
||||||
|
if (Enum.MinionType.ContractToMinionMap.get(contractID).isMage() == false)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PowersManager.getPowersForMobile(mob).isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!mob.canSee((PlayerCharacter) mob.getCombatTarget())) {
|
||||||
|
mob.setCombatTarget(null);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (mob.nextCastTime == 0)
|
||||||
|
mob.nextCastTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
return mob.nextCastTime <= System.currentTimeMillis();
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: canCast" + " " + e.getMessage());
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean MobCast(Mob mob) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Method picks a random spell from a mobile's list of powers
|
||||||
|
// and casts it on the current target (or itself). Validation
|
||||||
|
// (including empty lists) is done previously within canCast();
|
||||||
|
|
||||||
|
ArrayList<MobPowerEntry> powerEntries;
|
||||||
|
ArrayList<MobPowerEntry> purgeEntries;
|
||||||
|
AbstractCharacter target = (AbstractCharacter) mob.getCombatTarget();
|
||||||
|
|
||||||
|
if (mob.behaviourType.callsForHelp)
|
||||||
|
MobCallForHelp(mob);
|
||||||
|
|
||||||
|
// Generate a list of tokens from the mob powers for this mobile.
|
||||||
|
|
||||||
|
powerEntries = new ArrayList<>(PowersManager.getPowersForMobile(mob));
|
||||||
|
purgeEntries = new ArrayList<>();
|
||||||
|
|
||||||
|
// If player has this effect on them currently then remove
|
||||||
|
// this token from our list.
|
||||||
|
|
||||||
|
for (MobPowerEntry mobPowerEntry : powerEntries) {
|
||||||
|
|
||||||
|
PowersBase powerBase = PowersManager.getPowerByToken(mobPowerEntry.token);
|
||||||
|
|
||||||
|
for (ActionsBase actionBase : powerBase.getActions()) {
|
||||||
|
|
||||||
|
String stackType = actionBase.stackType;
|
||||||
|
|
||||||
|
if (target.getEffects() != null && target.getEffects().containsKey(stackType))
|
||||||
|
purgeEntries.add(mobPowerEntry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
powerEntries.removeAll(purgeEntries);
|
||||||
|
|
||||||
|
// Sanity check
|
||||||
|
|
||||||
|
if (powerEntries.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Pick random spell from our list of powers
|
||||||
|
|
||||||
|
int powerToken = powerEntries.get(ThreadLocalRandom.current().nextInt(powerEntries.size())).token;
|
||||||
|
int powerRank = powerEntries.get(ThreadLocalRandom.current().nextInt(powerEntries.size())).rank;
|
||||||
|
|
||||||
|
PowersBase mobPower = PowersManager.getPowerByToken(powerToken);
|
||||||
|
|
||||||
|
//check for hit-roll
|
||||||
|
|
||||||
|
if (mobPower.requiresHitRoll)
|
||||||
|
if (CombatUtilities.triggerDefense(mob, mob.getCombatTarget()))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Cast the spell
|
||||||
|
|
||||||
|
if (CombatUtilities.inRange2D(mob, mob.getCombatTarget(), mobPower.getRange())) {
|
||||||
|
|
||||||
|
PerformActionMsg msg;
|
||||||
|
|
||||||
|
if (!mobPower.isHarmful() || mobPower.targetSelf) {
|
||||||
|
PowersManager.useMobPower(mob, mob, mobPower, powerRank);
|
||||||
|
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, mob);
|
||||||
|
} else {
|
||||||
|
PowersManager.useMobPower(mob, target, mobPower, powerRank);
|
||||||
|
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, target);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg.setUnknown04(2);
|
||||||
|
|
||||||
|
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) {
|
||||||
|
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: MobCast" + " " + e.getMessage());
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean GuardCast(Mob mob) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Method picks a random spell from a mobile's list of powers
|
||||||
|
// and casts it on the current target (or itself). Validation
|
||||||
|
// (including empty lists) is done previously within canCast();
|
||||||
|
|
||||||
|
ArrayList<MobPowerEntry> powerEntries;
|
||||||
|
ArrayList<MobPowerEntry> purgeEntries;
|
||||||
|
AbstractCharacter target = (AbstractCharacter) mob.getCombatTarget();
|
||||||
|
|
||||||
|
if (mob.behaviourType.callsForHelp)
|
||||||
|
MobCallForHelp(mob);
|
||||||
|
|
||||||
|
// Generate a list of tokens from the mob powers for this mobile.
|
||||||
|
|
||||||
|
powerEntries = PowersManager.getPowersForMobile(mob);
|
||||||
|
purgeEntries = new ArrayList<>();
|
||||||
|
|
||||||
|
// If player has this effect on them currently then remove
|
||||||
|
// this token from our list.
|
||||||
|
|
||||||
|
powerEntries = new ArrayList<>(PowersManager.getPowersForMobile(mob));
|
||||||
|
purgeEntries = new ArrayList<>();
|
||||||
|
|
||||||
|
// If player has this effect on them currently then remove
|
||||||
|
// this token from our list.
|
||||||
|
|
||||||
|
for (MobPowerEntry mobPowerEntry : powerEntries) {
|
||||||
|
|
||||||
|
PowersBase powerBase = PowersManager.getPowerByToken(mobPowerEntry.token);
|
||||||
|
|
||||||
|
for (ActionsBase actionBase : powerBase.getActions()) {
|
||||||
|
|
||||||
|
String stackType = actionBase.stackType;
|
||||||
|
|
||||||
|
if (target.getEffects() != null && target.getEffects().containsKey(stackType))
|
||||||
|
purgeEntries.add(mobPowerEntry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
powerEntries.removeAll(purgeEntries);
|
||||||
|
|
||||||
|
// Sanity check
|
||||||
|
|
||||||
|
if (powerEntries.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
int powerToken = 0;
|
||||||
|
int nukeRoll = ThreadLocalRandom.current().nextInt(1,100);
|
||||||
|
|
||||||
|
if (nukeRoll < 55) {
|
||||||
|
|
||||||
|
//use direct damage spell
|
||||||
|
powerToken = powerEntries.get(powerEntries.size() - 1).token;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
//use random spell
|
||||||
|
powerToken = powerEntries.get(ThreadLocalRandom.current().nextInt(powerEntries.size())).token;
|
||||||
|
}
|
||||||
|
|
||||||
|
int powerRank = 1;
|
||||||
|
|
||||||
|
switch(mob.getRank()){
|
||||||
|
case 1:
|
||||||
|
powerRank = 10;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
powerRank = 15;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
powerRank = 20;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
powerRank = 25;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
powerRank = 30;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
powerRank = 35;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
powerRank = 40;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
PowersBase mobPower = PowersManager.getPowerByToken(powerToken);
|
||||||
|
|
||||||
|
//check for hit-roll
|
||||||
|
|
||||||
|
if (mobPower.requiresHitRoll)
|
||||||
|
if (CombatUtilities.triggerDefense(mob, mob.getCombatTarget()))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Cast the spell
|
||||||
|
|
||||||
|
if (CombatUtilities.inRange2D(mob, mob.getCombatTarget(), mobPower.getRange())) {
|
||||||
|
|
||||||
|
PerformActionMsg msg;
|
||||||
|
|
||||||
|
if (!mobPower.isHarmful() || mobPower.targetSelf) {
|
||||||
|
|
||||||
|
if (mobPower.category.equals("DISPEL")) {
|
||||||
|
PowersManager.useMobPower(mob, target, mobPower, powerRank);
|
||||||
|
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, target);
|
||||||
|
} else {
|
||||||
|
PowersManager.useMobPower(mob, mob, mobPower, powerRank);
|
||||||
|
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, mob);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
PowersManager.useMobPower(mob, target, mobPower, powerRank);
|
||||||
|
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, target);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg.setUnknown04(2);
|
||||||
|
|
||||||
|
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) {
|
||||||
|
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: MobCast" + " " + e.getMessage());
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public static void MobCallForHelp(Mob mob) {
|
public static void MobCallForHelp(Mob mob) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -344,7 +596,7 @@ public class MobAI {
|
|||||||
if (mob == null)
|
if (mob == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!mob.getTimestamps().containsKey("lastExecution"))
|
if (mob.getTimestamps().containsKey("lastExecution") == false)
|
||||||
mob.getTimestamps().put("lastExecution", System.currentTimeMillis());
|
mob.getTimestamps().put("lastExecution", System.currentTimeMillis());
|
||||||
|
|
||||||
if (System.currentTimeMillis() < mob.getTimeStamp("lastExecution"))
|
if (System.currentTimeMillis() < mob.getTimeStamp("lastExecution"))
|
||||||
@@ -361,14 +613,14 @@ public class MobAI {
|
|||||||
|
|
||||||
//override for guards
|
//override for guards
|
||||||
|
|
||||||
if (mob.despawned && mob.isPlayerGuard) {
|
if (mob.despawned && mob.isPlayerGuard()) {
|
||||||
|
|
||||||
if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardMinion)) {
|
if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardMinion)) {
|
||||||
if (!mob.guardCaptain.isAlive() || ((Mob) mob.guardCaptain).despawned) {
|
if (mob.guardCaptain.isAlive() == false || ((Mob) mob.guardCaptain).despawned == true) {
|
||||||
|
|
||||||
//minions don't respawn while guard captain is dead
|
//minions don't respawn while guard captain is dead
|
||||||
|
|
||||||
if (!mob.isAlive()) {
|
if (mob.isAlive() == false) {
|
||||||
mob.deathTime = System.currentTimeMillis();
|
mob.deathTime = System.currentTimeMillis();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -380,7 +632,7 @@ public class MobAI {
|
|||||||
|
|
||||||
//check to send mob home for player guards to prevent exploit of dragging guards away and then teleporting
|
//check to send mob home for player guards to prevent exploit of dragging guards away and then teleporting
|
||||||
|
|
||||||
if (!mob.behaviourType.equals(Enum.MobBehaviourType.Pet1))
|
if (mob.behaviourType.equals(Enum.MobBehaviourType.Pet1) == false)
|
||||||
CheckToSendMobHome(mob);
|
CheckToSendMobHome(mob);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -394,16 +646,19 @@ public class MobAI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//no players loaded, no need to proceed
|
//no players loaded, no need to proceed
|
||||||
|
|
||||||
if (mob.playerAgroMap.isEmpty()) {
|
if (mob.playerAgroMap.isEmpty()) {
|
||||||
|
if(mob.getCombatTarget() != null)
|
||||||
|
mob.setCombatTarget(null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mob.behaviourType.equals(Enum.MobBehaviourType.Pet1))
|
if (mob.behaviourType.equals(Enum.MobBehaviourType.Pet1) == false)
|
||||||
CheckToSendMobHome(mob);
|
CheckToSendMobHome(mob);
|
||||||
|
|
||||||
if (mob.getCombatTarget() != null) {
|
if (mob.getCombatTarget() != null) {
|
||||||
|
|
||||||
if (!mob.getCombatTarget().isAlive()) {
|
if (mob.getCombatTarget().isAlive() == false) {
|
||||||
mob.setCombatTarget(null);
|
mob.setCombatTarget(null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -412,46 +667,19 @@ public class MobAI {
|
|||||||
|
|
||||||
PlayerCharacter target = (PlayerCharacter) mob.getCombatTarget();
|
PlayerCharacter target = (PlayerCharacter) mob.getCombatTarget();
|
||||||
|
|
||||||
if (!mob.playerAgroMap.containsKey(target.getObjectUUID())) {
|
if (mob.playerAgroMap.containsKey(target.getObjectUUID()) == false) {
|
||||||
mob.setCombatTarget(null);
|
mob.setCombatTarget(null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mob.canSee((PlayerCharacter) mob.getCombatTarget())) {
|
if (mob.canSee((PlayerCharacter) mob.getCombatTarget()) == false) {
|
||||||
mob.setCombatTarget(null);
|
mob.setCombatTarget(null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mob.isMoving()) {
|
|
||||||
mob.updateLocation();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!mob.isPet()) {
|
|
||||||
boolean combatState = mob.isCombat();
|
|
||||||
mob.setCombat(mob.combatTarget != null);
|
|
||||||
if (combatState != mob.isCombat()) {
|
|
||||||
//send message to update combat state
|
|
||||||
UpdateStateMsg rwss = new UpdateStateMsg();
|
|
||||||
rwss.setPlayer(mob);
|
|
||||||
DispatchMessage.sendToAllInRange(mob, rwss);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean walking = mob.isWalk();
|
|
||||||
mob.setWalkMode(mob.combatTarget == null);
|
|
||||||
if (walking != mob.isWalk()) {
|
|
||||||
//send message to update run/walk state
|
|
||||||
MovementManager.sendRWSSMsg(mob);
|
|
||||||
}
|
|
||||||
}else {
|
|
||||||
boolean walking = mob.isWalk();
|
|
||||||
mob.setWalkMode(mob.guardCaptain.isWalk());
|
|
||||||
if (walking != mob.isWalk()) {
|
|
||||||
//send message to update run/walk state
|
|
||||||
MovementManager.sendRWSSMsg(mob);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch (mob.behaviourType) {
|
switch (mob.behaviourType) {
|
||||||
case GuardCaptain:
|
case GuardCaptain:
|
||||||
GuardCaptainLogic(mob);
|
GuardCaptainLogic(mob);
|
||||||
@@ -478,7 +706,7 @@ public class MobAI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void CheckForAggro(Mob aiAgent, boolean pets) {
|
private static void CheckForAggro(Mob aiAgent) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
@@ -487,46 +715,54 @@ public class MobAI {
|
|||||||
if (!aiAgent.isAlive())
|
if (!aiAgent.isAlive())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(!pets) {
|
ConcurrentHashMap<Integer, Float> loadedPlayers = aiAgent.playerAgroMap;
|
||||||
ConcurrentHashMap<Integer, Float> loadedPlayers = aiAgent.playerAgroMap;
|
|
||||||
for (Integer playerEntry : loadedPlayers.keySet()) {
|
|
||||||
|
|
||||||
PlayerCharacter loadedPlayer = PlayerCharacter.getFromCache(playerEntry);
|
for (Entry playerEntry : loadedPlayers.entrySet()) {
|
||||||
//Player is null, let's remove them from the list.
|
|
||||||
if (loadedPlayer == null) {
|
|
||||||
loadedPlayers.remove(playerEntry);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
//Player is Dead, Mob no longer needs to attempt to aggro. Remove them from aggro map.
|
|
||||||
if (!loadedPlayer.isAlive() || loadedPlayer.getHidden() > 0) {
|
|
||||||
loadedPlayers.remove(playerEntry);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Can't see target, skip aggro.
|
int playerID = (int) playerEntry.getKey();
|
||||||
if (!aiAgent.canSee(loadedPlayer))
|
PlayerCharacter loadedPlayer = PlayerCharacter.getFromCache(playerID);
|
||||||
continue;
|
|
||||||
|
|
||||||
// No aggro for this race type
|
//Player is null, let's remove them from the list.
|
||||||
if (aiAgent.notEnemy.size() > 0 && aiAgent.notEnemy.contains(loadedPlayer.getRace().getRaceType().getMonsterType()))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
//mob has enemies and this player race is not it
|
|
||||||
|
|
||||||
if (aiAgent.enemy.size() > 0 && !aiAgent.enemy.contains(loadedPlayer.getRace().getRaceType().getMonsterType()))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (MovementUtilities.inRangeToAggro(aiAgent, loadedPlayer)) {
|
|
||||||
aiAgent.setCombatTarget(loadedPlayer);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (loadedPlayer == null) {
|
||||||
|
loadedPlayers.remove(playerID);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
} else{
|
|
||||||
|
//Player is Dead, Mob no longer needs to attempt to aggro. Remove them from aggro map.
|
||||||
|
|
||||||
|
if (!loadedPlayer.isAlive()) {
|
||||||
|
loadedPlayers.remove(playerID);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Can't see target, skip aggro.
|
||||||
|
|
||||||
|
if (!aiAgent.canSee(loadedPlayer))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// No aggro for this race type
|
||||||
|
|
||||||
|
if (aiAgent.notEnemy.size() > 0 && aiAgent.notEnemy.contains(loadedPlayer.getRace().getRaceType().getMonsterType()) == true)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//mob has enemies and this player race is not it
|
||||||
|
|
||||||
|
if (aiAgent.enemy.size() > 0 && aiAgent.enemy.contains(loadedPlayer.getRace().getRaceType().getMonsterType()) == false)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (MovementUtilities.inRangeToAggro(aiAgent, loadedPlayer)) {
|
||||||
|
aiAgent.setCombatTarget(loadedPlayer);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aiAgent.getCombatTarget() == null) {
|
||||||
|
|
||||||
//look for pets to aggro if no players found to aggro
|
//look for pets to aggro if no players found to aggro
|
||||||
|
|
||||||
HashSet<AbstractWorldObject> awoList = WorldGrid.getObjectsInRangePartial(aiAgent, MobAIThread.AI_BASE_AGGRO_RANGE, MBServerStatics.MASK_MOB);
|
HashSet<AbstractWorldObject> awoList = WorldGrid.getObjectsInRangePartial(aiAgent, MobAIThread.AI_BASE_AGGRO_RANGE, MBServerStatics.MASK_PET);
|
||||||
|
|
||||||
for (AbstractWorldObject awoMob : awoList) {
|
for (AbstractWorldObject awoMob : awoList) {
|
||||||
|
|
||||||
@@ -535,9 +771,6 @@ public class MobAI {
|
|||||||
if (aiAgent.equals(awoMob))
|
if (aiAgent.equals(awoMob))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(!((Mob)awoMob).isPet())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
Mob aggroMob = (Mob) awoMob;
|
Mob aggroMob = (Mob) awoMob;
|
||||||
aiAgent.setCombatTarget(aggroMob);
|
aiAgent.setCombatTarget(aggroMob);
|
||||||
return;
|
return;
|
||||||
@@ -549,31 +782,29 @@ public class MobAI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void CheckMobMovement(Mob mob) {
|
private static void CheckMobMovement(Mob mob) {
|
||||||
if(mob != null && (mob.getMobBaseID() == 14220 || mob.getMobBaseID() == 14221))
|
|
||||||
return;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if(mob == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!MovementUtilities.canMove(mob))
|
if (!MovementUtilities.canMove(mob))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
mob.updateLocation();
|
||||||
|
|
||||||
switch (mob.behaviourType) {
|
switch (mob.behaviourType) {
|
||||||
|
|
||||||
case Pet1:
|
case Pet1:
|
||||||
|
|
||||||
|
|
||||||
if (mob.guardCaptain == null)
|
if ((PlayerCharacter) mob.guardCaptain == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
if (!mob.playerAgroMap.containsKey(mob.guardCaptain.getObjectUUID())) {
|
if (!mob.playerAgroMap.containsKey(((PlayerCharacter) mob.guardCaptain).getObjectUUID())) {
|
||||||
|
|
||||||
//mob no longer has its owner loaded, translocate pet to owner
|
//mob no longer has its owner loaded, translocate pet to owner
|
||||||
|
|
||||||
|
|
||||||
MovementManager.translocate(mob, mob.guardCaptain.getLoc(), null);
|
MovementManager.translocate(mob, ((PlayerCharacter) mob.guardCaptain).getLoc(), null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (mob.getCombatTarget() == null) {
|
if (mob.getCombatTarget() == null) {
|
||||||
@@ -581,11 +812,11 @@ public class MobAI {
|
|||||||
//move back to owner
|
//move back to owner
|
||||||
|
|
||||||
|
|
||||||
if (CombatUtilities.inRange2D(mob, mob.guardCaptain, 6))
|
if (CombatUtilities.inRange2D(mob, (PlayerCharacter) mob.guardCaptain, 6))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
mob.destination = mob.guardCaptain.getLoc();
|
mob.destination = ((PlayerCharacter) mob.guardCaptain).getLoc();
|
||||||
MovementUtilities.moveToLocation(mob, mob.destination, 5);
|
MovementUtilities.moveToLocation(mob, mob.destination, 5);
|
||||||
} else
|
} else
|
||||||
chaseTarget(mob);
|
chaseTarget(mob);
|
||||||
@@ -619,6 +850,7 @@ public class MobAI {
|
|||||||
private static void CheckForRespawn(Mob aiAgent) {
|
private static void CheckForRespawn(Mob aiAgent) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
if (aiAgent.deathTime == 0) {
|
if (aiAgent.deathTime == 0) {
|
||||||
aiAgent.setDeathTime(System.currentTimeMillis());
|
aiAgent.setDeathTime(System.currentTimeMillis());
|
||||||
return;
|
return;
|
||||||
@@ -633,6 +865,7 @@ public class MobAI {
|
|||||||
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER_WITH_LOOT) {
|
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER_WITH_LOOT) {
|
||||||
aiAgent.despawn();
|
aiAgent.despawn();
|
||||||
aiAgent.deathTime = System.currentTimeMillis();
|
aiAgent.deathTime = System.currentTimeMillis();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
//No items in inventory.
|
//No items in inventory.
|
||||||
} else {
|
} else {
|
||||||
@@ -641,18 +874,20 @@ public class MobAI {
|
|||||||
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER_ONCE_LOOTED) {
|
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER_ONCE_LOOTED) {
|
||||||
aiAgent.despawn();
|
aiAgent.despawn();
|
||||||
aiAgent.deathTime = System.currentTimeMillis();
|
aiAgent.deathTime = System.currentTimeMillis();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
//Mob never had Loot.
|
//Mob never had Loot.
|
||||||
} else {
|
} else {
|
||||||
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER) {
|
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER) {
|
||||||
aiAgent.despawn();
|
aiAgent.despawn();
|
||||||
aiAgent.deathTime = System.currentTimeMillis();
|
aiAgent.deathTime = System.currentTimeMillis();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (System.currentTimeMillis() > (aiAgent.deathTime + (aiAgent.spawnTime * 1000L))) {
|
} else if (System.currentTimeMillis() > (aiAgent.deathTime + (aiAgent.spawnTime * 1000))) {
|
||||||
|
|
||||||
if (!Zone.respawnQue.contains(aiAgent) && !Mob.disciplineDroppers.contains(aiAgent)){
|
if (Zone.respawnQue.contains(aiAgent) == false) {
|
||||||
Zone.respawnQue.add(aiAgent);
|
Zone.respawnQue.add(aiAgent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -666,14 +901,14 @@ public class MobAI {
|
|||||||
|
|
||||||
//checks if mob can attack based on attack timer and range
|
//checks if mob can attack based on attack timer and range
|
||||||
|
|
||||||
if (!mob.isAlive())
|
if (mob.isAlive() == false)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (mob.getCombatTarget() == null)
|
if (mob.getCombatTarget() == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (mob.getCombatTarget().getObjectType().equals(Enum.GameObjectType.PlayerCharacter) && !MovementUtilities.inRangeDropAggro(mob, (PlayerCharacter) mob.getCombatTarget()) &&
|
if (mob.getCombatTarget().getObjectType().equals(Enum.GameObjectType.PlayerCharacter) && MovementUtilities.inRangeDropAggro(mob, (PlayerCharacter) mob.getCombatTarget()) == false &&
|
||||||
!mob.behaviourType.equals(Enum.MobBehaviourType.Pet1)) {
|
mob.behaviourType.equals(Enum.MobBehaviourType.Pet1) == false) {
|
||||||
|
|
||||||
mob.setCombatTarget(null);
|
mob.setCombatTarget(null);
|
||||||
return;
|
return;
|
||||||
@@ -695,15 +930,18 @@ public class MobAI {
|
|||||||
if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardCaptain))
|
if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardCaptain))
|
||||||
CheckForPlayerGuardAggro(mob);
|
CheckForPlayerGuardAggro(mob);
|
||||||
} else {
|
} else {
|
||||||
CheckForAggro(mob,false);
|
CheckForAggro(mob);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mob.getCombatTarget() != null && CombatUtilities.inRange2D(mob, mob.getCombatTarget(), MobAIThread.AI_BASE_AGGRO_RANGE * 0.5f))
|
||||||
|
return;
|
||||||
|
|
||||||
if (mob.isPlayerGuard() && !mob.despawned) {
|
if (mob.isPlayerGuard() && !mob.despawned) {
|
||||||
|
|
||||||
City current = ZoneManager.getCityAtLocation(mob.getLoc());
|
City current = ZoneManager.getCityAtLocation(mob.getLoc());
|
||||||
|
|
||||||
if (current == null || !current.equals(mob.getGuild().getOwnedCity())) {
|
if (current == null || current.equals(mob.getGuild().getOwnedCity()) == false) {
|
||||||
|
|
||||||
PowersBase recall = PowersManager.getPowerByToken(-1994153779);
|
PowersBase recall = PowersManager.getPowerByToken(-1994153779);
|
||||||
PowersManager.useMobPower(mob, mob, recall, 40);
|
PowersManager.useMobPower(mob, mob, recall, 40);
|
||||||
@@ -719,13 +957,14 @@ public class MobAI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (!MovementUtilities.inRangeOfBindLocation(mob)) {
|
} else if (MovementUtilities.inRangeOfBindLocation(mob) == false) {
|
||||||
|
|
||||||
PowersBase recall = PowersManager.getPowerByToken(-1994153779);
|
PowersBase recall = PowersManager.getPowerByToken(-1994153779);
|
||||||
PowersManager.useMobPower(mob, mob, recall, 40);
|
PowersManager.useMobPower(mob, mob, recall, 40);
|
||||||
mob.setCombatTarget(null);
|
mob.setCombatTarget(null);
|
||||||
|
|
||||||
mob.playerAgroMap.replaceAll((e, v) -> 0f);
|
for (Integer playerEntry : mob.playerAgroMap.keySet())
|
||||||
|
mob.playerAgroMap.put(playerEntry,0f);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckToSendMobHome" + " " + e.getMessage());
|
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckToSendMobHome" + " " + e.getMessage());
|
||||||
@@ -735,22 +974,14 @@ public class MobAI {
|
|||||||
private static void chaseTarget(Mob mob) {
|
private static void chaseTarget(Mob mob) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (mob.combatTarget.getObjectType() == Enum.GameObjectType.PlayerCharacter){
|
|
||||||
if(((PlayerCharacter)mob.combatTarget).getHidden() > 0){
|
float rangeSquared = mob.getRange() * mob.getRange();
|
||||||
mob.setCombatTarget(null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
float range = mob.getRange();
|
|
||||||
if(range < 6)
|
|
||||||
range = 6;
|
|
||||||
float rangeSquared = range * range;
|
|
||||||
float distanceSquared = mob.getLoc().distanceSquared2D(mob.getCombatTarget().getLoc());
|
float distanceSquared = mob.getLoc().distanceSquared2D(mob.getCombatTarget().getLoc());
|
||||||
|
|
||||||
if(mob.isMoving() && distanceSquared < rangeSquared - 50) {
|
if(mob.isMoving() == true && distanceSquared < rangeSquared - 50) {
|
||||||
mob.destination = mob.getLoc();
|
mob.destination = mob.getLoc();
|
||||||
MovementUtilities.moveToLocation(mob, mob.destination, 0);
|
MovementUtilities.moveToLocation(mob, mob.destination, 0);
|
||||||
} else if (!CombatUtilities.inRange2D(mob, mob.getCombatTarget(), mob.getRange())) {
|
} else if (CombatUtilities.inRange2D(mob, mob.getCombatTarget(), mob.getRange()) == false) {
|
||||||
if (mob.getRange() > 15) {
|
if (mob.getRange() > 15) {
|
||||||
mob.destination = mob.getCombatTarget().getLoc();
|
mob.destination = mob.getCombatTarget().getLoc();
|
||||||
MovementUtilities.moveToLocation(mob, mob.destination, 0);
|
MovementUtilities.moveToLocation(mob, mob.destination, 0);
|
||||||
@@ -772,6 +1003,7 @@ public class MobAI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
mob.updateMovementState();
|
mob.updateMovementState();
|
||||||
|
mob.updateLocation();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: chaseTarget" + " " + e.getMessage());
|
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: chaseTarget" + " " + e.getMessage());
|
||||||
}
|
}
|
||||||
@@ -786,14 +1018,14 @@ public class MobAI {
|
|||||||
|
|
||||||
//dont scan self.
|
//dont scan self.
|
||||||
|
|
||||||
if (mob.equals(awoMob) || (mob.agentType.equals(Enum.AIAgentType.GUARD)) || awoMob.getObjectType().equals(Enum.GameObjectType.PlayerCharacter))
|
if (mob.equals(awoMob) || (mob.agentType.equals(Enum.AIAgentType.GUARDCAPTAIN)) == true)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Mob aggroMob = (Mob) awoMob;
|
Mob aggroMob = (Mob) awoMob;
|
||||||
|
|
||||||
//don't attack other guards
|
//don't attack other guards
|
||||||
|
|
||||||
if ((aggroMob.agentType.equals(Enum.AIAgentType.GUARD)))
|
if ((aggroMob.agentType.equals(Enum.AIAgentType.GUARDCAPTAIN)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (aggroMob.behaviourType.equals(Enum.MobBehaviourType.Pet1))
|
if (aggroMob.behaviourType.equals(Enum.MobBehaviourType.Pet1))
|
||||||
@@ -815,6 +1047,18 @@ public class MobAI {
|
|||||||
if (mob.getCombatTarget() == null)
|
if (mob.getCombatTarget() == null)
|
||||||
CheckForPlayerGuardAggro(mob);
|
CheckForPlayerGuardAggro(mob);
|
||||||
|
|
||||||
|
AbstractWorldObject newTarget = ChangeTargetFromHateValue(mob);
|
||||||
|
|
||||||
|
if (newTarget != null) {
|
||||||
|
|
||||||
|
if (newTarget.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) {
|
||||||
|
if (GuardCanAggro(mob, (PlayerCharacter) newTarget))
|
||||||
|
mob.setCombatTarget(newTarget);
|
||||||
|
} else
|
||||||
|
mob.setCombatTarget(newTarget);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
CheckMobMovement(mob);
|
CheckMobMovement(mob);
|
||||||
CheckForAttack(mob);
|
CheckForAttack(mob);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -829,6 +1073,19 @@ public class MobAI {
|
|||||||
|
|
||||||
if (mob.getCombatTarget() == null) {
|
if (mob.getCombatTarget() == null) {
|
||||||
CheckForPlayerGuardAggro(mob);
|
CheckForPlayerGuardAggro(mob);
|
||||||
|
} else {
|
||||||
|
|
||||||
|
AbstractWorldObject newTarget = ChangeTargetFromHateValue(mob);
|
||||||
|
|
||||||
|
if (newTarget != null) {
|
||||||
|
|
||||||
|
if (newTarget.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) {
|
||||||
|
if (GuardCanAggro(mob, (PlayerCharacter) newTarget))
|
||||||
|
mob.setCombatTarget(newTarget);
|
||||||
|
} else
|
||||||
|
mob.setCombatTarget(newTarget);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}else {
|
}else {
|
||||||
if (mob.guardCaptain.getCombatTarget() != null)
|
if (mob.guardCaptain.getCombatTarget() != null)
|
||||||
@@ -860,7 +1117,7 @@ public class MobAI {
|
|||||||
try {
|
try {
|
||||||
|
|
||||||
|
|
||||||
if (mob.guardCaptain == null && !mob.isNecroPet() && !mob.isSiege())
|
if (mob.guardCaptain == null && mob.isNecroPet() == false && mob.isSiege() == false)
|
||||||
if (ZoneManager.getSeaFloor().zoneMobSet.contains(mob))
|
if (ZoneManager.getSeaFloor().zoneMobSet.contains(mob))
|
||||||
mob.killCharacter("no owner");
|
mob.killCharacter("no owner");
|
||||||
|
|
||||||
@@ -871,7 +1128,7 @@ public class MobAI {
|
|||||||
|
|
||||||
//recover health
|
//recover health
|
||||||
|
|
||||||
if (!mob.getTimestamps().containsKey("HEALTHRECOVERED"))
|
if (mob.getTimestamps().containsKey("HEALTHRECOVERED") == false)
|
||||||
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
|
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
|
||||||
|
|
||||||
if (mob.isSit() && mob.getTimeStamp("HEALTHRECOVERED") < System.currentTimeMillis() + 3000)
|
if (mob.isSit() && mob.getTimeStamp("HEALTHRECOVERED") < System.currentTimeMillis() + 3000)
|
||||||
@@ -896,7 +1153,7 @@ public class MobAI {
|
|||||||
|
|
||||||
if (mob.getCombatTarget() == null)
|
if (mob.getCombatTarget() == null)
|
||||||
SafeGuardAggro(mob);
|
SafeGuardAggro(mob);
|
||||||
else if (!mob.getCombatTarget().isAlive())
|
else if (mob.getCombatTarget().isAlive() == false)
|
||||||
SafeGuardAggro(mob);
|
SafeGuardAggro(mob);
|
||||||
|
|
||||||
CheckForAttack(mob);
|
CheckForAttack(mob);
|
||||||
@@ -909,21 +1166,23 @@ public class MobAI {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
if(mob.combatTarget != null && mob.combatTarget.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)){
|
//check for players that can be aggroed if mob is agressive and has no target
|
||||||
PlayerCharacter tar = (PlayerCharacter)mob.combatTarget;
|
|
||||||
if (!mob.canSee(tar)) {
|
if (mob.getCombatTarget() != null && mob.playerAgroMap.containsKey(mob.getCombatTarget().getObjectUUID()) == false)
|
||||||
mob.setCombatTarget(null);
|
mob.setCombatTarget(null);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mob.behaviourType.isAgressive) {
|
if (mob.behaviourType.isAgressive) {
|
||||||
if (mob.getCombatTarget() == null) {
|
|
||||||
if (mob.behaviourType == Enum.MobBehaviourType.HamletGuard) {
|
AbstractWorldObject newTarget = ChangeTargetFromHateValue(mob);
|
||||||
SafeGuardAggro(mob); //safehold guard
|
|
||||||
} else {
|
if (newTarget != null)
|
||||||
CheckForAggro(mob, false); //normal aggro
|
mob.setCombatTarget(newTarget);
|
||||||
if (mob.combatTarget == null)
|
else {
|
||||||
CheckForAggro(mob, true); // look for pets if no players to aggro
|
if (mob.getCombatTarget() == null) {
|
||||||
|
if (mob.behaviourType == Enum.MobBehaviourType.HamletGuard)
|
||||||
|
SafeGuardAggro(mob); //safehold guard
|
||||||
|
else
|
||||||
|
CheckForAggro(mob); //normal aggro
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -954,21 +1213,22 @@ public class MobAI {
|
|||||||
|
|
||||||
ConcurrentHashMap<Integer, Float> loadedPlayers = mob.playerAgroMap;
|
ConcurrentHashMap<Integer, Float> loadedPlayers = mob.playerAgroMap;
|
||||||
|
|
||||||
for (Integer playerEntry : loadedPlayers.keySet()) {
|
for (Entry playerEntry : loadedPlayers.entrySet()) {
|
||||||
|
|
||||||
PlayerCharacter loadedPlayer = PlayerCharacter.getFromCache(playerEntry);
|
int playerID = (int) playerEntry.getKey();
|
||||||
|
PlayerCharacter loadedPlayer = PlayerCharacter.getFromCache(playerID);
|
||||||
|
|
||||||
//Player is null, let's remove them from the list.
|
//Player is null, let's remove them from the list.
|
||||||
|
|
||||||
if (loadedPlayer == null) {
|
if (loadedPlayer == null) {
|
||||||
loadedPlayers.remove(playerEntry);
|
loadedPlayers.remove(playerID);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Player is Dead, Mob no longer needs to attempt to aggro. Remove them from aggro map.
|
//Player is Dead, Mob no longer needs to attempt to aggro. Remove them from aggro map.
|
||||||
|
|
||||||
if (!loadedPlayer.isAlive()) {
|
if (!loadedPlayer.isAlive()) {
|
||||||
loadedPlayers.remove(playerEntry);
|
loadedPlayers.remove(playerID);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -979,7 +1239,7 @@ public class MobAI {
|
|||||||
|
|
||||||
// No aggro for this player
|
// No aggro for this player
|
||||||
|
|
||||||
if (!GuardCanAggro(mob, loadedPlayer))
|
if (GuardCanAggro(mob, loadedPlayer) == false)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (MovementUtilities.inRangeToAggro(mob, loadedPlayer) && mob.getCombatTarget() == null) {
|
if (MovementUtilities.inRangeToAggro(mob, loadedPlayer) && mob.getCombatTarget() == null) {
|
||||||
@@ -1000,17 +1260,17 @@ public class MobAI {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardMinion)) {
|
if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardMinion)) {
|
||||||
if (Objects.requireNonNull(mob.guardCaptain.building.getCity()).cityOutlaws.contains(target.getObjectUUID())) {
|
if (((Mob) mob.guardCaptain).building.getCity().cityOutlaws.contains(target.getObjectUUID()) == true) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else if (Objects.requireNonNull(mob.building.getCity()).cityOutlaws.contains(target.getObjectUUID())) {
|
} else if (mob.building.getCity().cityOutlaws.contains(target.getObjectUUID()) == true) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//first check condemn list for aggro allowed (allies button is checked)
|
//first check condemn list for aggro allowed (allies button is checked)
|
||||||
|
|
||||||
if (Objects.requireNonNull(ZoneManager.getCityAtLocation(mob.getLoc())).getTOL().reverseKOS) {
|
if (ZoneManager.getCityAtLocation(mob.getLoc()).getTOL().reverseKOS) {
|
||||||
for (Entry<Integer, Condemned> entry : Objects.requireNonNull(ZoneManager.getCityAtLocation(mob.getLoc())).getTOL().getCondemned().entrySet()) {
|
for (Entry<Integer, Condemned> entry : ZoneManager.getCityAtLocation(mob.getLoc()).getTOL().getCondemned().entrySet()) {
|
||||||
|
|
||||||
//target is listed individually
|
//target is listed individually
|
||||||
|
|
||||||
@@ -1032,7 +1292,7 @@ public class MobAI {
|
|||||||
|
|
||||||
//allies button is not checked
|
//allies button is not checked
|
||||||
|
|
||||||
for (Entry<Integer, Condemned> entry : Objects.requireNonNull(ZoneManager.getCityAtLocation(mob.getLoc())).getTOL().getCondemned().entrySet()) {
|
for (Entry<Integer, Condemned> entry : ZoneManager.getCityAtLocation(mob.getLoc()).getTOL().getCondemned().entrySet()) {
|
||||||
|
|
||||||
//target is listed individually
|
//target is listed individually
|
||||||
|
|
||||||
@@ -1063,7 +1323,7 @@ public class MobAI {
|
|||||||
//early exit for a mob who is already moving to a patrol point
|
//early exit for a mob who is already moving to a patrol point
|
||||||
//while mob moving, update lastPatrolTime so that when they stop moving the 10 second timer can begin
|
//while mob moving, update lastPatrolTime so that when they stop moving the 10 second timer can begin
|
||||||
|
|
||||||
if (mob.isMoving()) {
|
if (mob.isMoving() == true) {
|
||||||
mob.stopPatrolTime = System.currentTimeMillis();
|
mob.stopPatrolTime = System.currentTimeMillis();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1089,7 +1349,7 @@ public class MobAI {
|
|||||||
|
|
||||||
//make sure mob is out of combat stance
|
//make sure mob is out of combat stance
|
||||||
|
|
||||||
if (!minion.getKey().despawned) {
|
if (minion.getKey().despawned == false) {
|
||||||
if (MovementUtilities.canMove(minion.getKey())) {
|
if (MovementUtilities.canMove(minion.getKey())) {
|
||||||
Vector3f minionOffset = Formation.getOffset(2, minion.getValue() + 3);
|
Vector3f minionOffset = Formation.getOffset(2, minion.getValue() + 3);
|
||||||
minion.getKey().updateLocation();
|
minion.getKey().updateLocation();
|
||||||
@@ -1103,4 +1363,35 @@ public class MobAI {
|
|||||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: randomGuardPatrolPoints" + " " + e.getMessage());
|
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: randomGuardPatrolPoints" + " " + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static AbstractWorldObject ChangeTargetFromHateValue(Mob mob) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
float CurrentHateValue = 0;
|
||||||
|
|
||||||
|
if (mob.getCombatTarget() != null && mob.getCombatTarget().getObjectType().equals(Enum.GameObjectType.PlayerCharacter))
|
||||||
|
CurrentHateValue = mob.playerAgroMap.get(mob.combatTarget.getObjectUUID()).floatValue();
|
||||||
|
|
||||||
|
AbstractWorldObject mostHatedTarget = null;
|
||||||
|
|
||||||
|
for (Entry playerEntry : mob.playerAgroMap.entrySet()) {
|
||||||
|
|
||||||
|
PlayerCharacter potentialTarget = PlayerCharacter.getFromCache((int) playerEntry.getKey());
|
||||||
|
|
||||||
|
if (potentialTarget.equals(mob.getCombatTarget()))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (potentialTarget != null && mob.playerAgroMap.get(potentialTarget.getObjectUUID()).floatValue() > CurrentHateValue && MovementUtilities.inRangeToAggro(mob, potentialTarget)) {
|
||||||
|
CurrentHateValue = mob.playerAgroMap.get(potentialTarget.getObjectUUID()).floatValue();
|
||||||
|
mostHatedTarget = potentialTarget;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return mostHatedTarget;
|
||||||
|
} catch (Exception e) {
|
||||||
|
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: ChangeTargetFromMostHated" + " " + e.getMessage());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -13,7 +13,7 @@ public class MobAIThread implements Runnable{
|
|||||||
public static int AI_DROP_AGGRO_RANGE = 60;
|
public static int AI_DROP_AGGRO_RANGE = 60;
|
||||||
public static int AI_PULSE_MOB_THRESHOLD = 200;
|
public static int AI_PULSE_MOB_THRESHOLD = 200;
|
||||||
public static int AI_PATROL_DIVISOR = 15;
|
public static int AI_PATROL_DIVISOR = 15;
|
||||||
public static float AI_CAST_FREQUENCY = 1.0f;
|
public static float AI_CAST_FREQUENCY;
|
||||||
// Thread constructor
|
// Thread constructor
|
||||||
|
|
||||||
public MobAIThread() {
|
public MobAIThread() {
|
||||||
|
|||||||
@@ -12,20 +12,13 @@ package engine.mobileAI.utilities;
|
|||||||
import engine.Enum.*;
|
import engine.Enum.*;
|
||||||
import engine.gameManager.ChatManager;
|
import engine.gameManager.ChatManager;
|
||||||
import engine.gameManager.CombatManager;
|
import engine.gameManager.CombatManager;
|
||||||
import engine.gameManager.PowersManager;
|
|
||||||
import engine.math.Vector3fImmutable;
|
import engine.math.Vector3fImmutable;
|
||||||
import engine.mobileAI.MobAI;
|
|
||||||
import engine.mobileAI.Threads.MobAIThread;
|
|
||||||
import engine.net.DispatchMessage;
|
import engine.net.DispatchMessage;
|
||||||
import engine.net.client.msg.PerformActionMsg;
|
|
||||||
import engine.net.client.msg.TargetedActionMsg;
|
import engine.net.client.msg.TargetedActionMsg;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import engine.powers.ActionsBase;
|
|
||||||
import engine.powers.PowersBase;
|
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
import static engine.math.FastMath.sqr;
|
import static engine.math.FastMath.sqr;
|
||||||
@@ -311,6 +304,7 @@ public class CombatUtilities {
|
|||||||
if (targetMob.isSiege())
|
if (targetMob.isSiege())
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static float determineDamage(Mob agent) {
|
public static float determineDamage(Mob agent) {
|
||||||
@@ -486,9 +480,8 @@ public class CombatUtilities {
|
|||||||
masteryLevel = (int) agent.getSkills().get(weapon.getMastery()).getModifiedAmount();
|
masteryLevel = (int) agent.getSkills().get(weapon.getMastery()).getModifiedAmount();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return min * (pow(0.0048 * primary + .049 * (primary - 0.75), 0.5) + pow(0.0066 * secondary + 0.064 * (secondary - 0.75), 0.5) + +0.01 * (focusLevel + masteryLevel));
|
|
||||||
}
|
}
|
||||||
return agent.getMinDamageHandOne();
|
return min * (pow(0.0048 * primary + .049 * (primary - 0.75), 0.5) + pow(0.0066 * secondary + 0.064 * (secondary - 0.75), 0.5) + +0.01 * (focusLevel + masteryLevel));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static double getMaxDmg(double max, Mob agent, ItemBase weapon) {
|
public static double getMaxDmg(double max, Mob agent, ItemBase weapon) {
|
||||||
@@ -514,214 +507,8 @@ public class CombatUtilities {
|
|||||||
if (agent.getSkills().containsKey(weapon.getSkillRequired()))
|
if (agent.getSkills().containsKey(weapon.getSkillRequired()))
|
||||||
masteryLevel = (int) agent.getSkills().get(weapon.getMastery()).getModifiedAmount();
|
masteryLevel = (int) agent.getSkills().get(weapon.getMastery()).getModifiedAmount();
|
||||||
|
|
||||||
return max * (pow(0.0124 * primary + 0.118 * (primary - 0.75), 0.5) + pow(0.0022 * secondary + 0.028 * (secondary - 0.75), 0.5) + 0.0075 * (focusLevel + masteryLevel));
|
|
||||||
}
|
}
|
||||||
return agent.getMaxDamageHandOne();
|
return max * (pow(0.0124 * primary + 0.118 * (primary - 0.75), 0.5) + pow(0.0022 * secondary + 0.028 * (secondary - 0.75), 0.5) + 0.0075 * (focusLevel + masteryLevel));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean MobCast(Mob mob) {
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Method picks a random spell from a mobile's list of powers
|
|
||||||
// and casts it on the current target (or itself). Validation
|
|
||||||
// (including empty lists) is done previously within canCast();
|
|
||||||
|
|
||||||
ArrayList<Integer> powerTokens;
|
|
||||||
ArrayList<Integer> purgeTokens;
|
|
||||||
AbstractCharacter target = (AbstractCharacter) mob.getCombatTarget();
|
|
||||||
|
|
||||||
if (mob.behaviourType.callsForHelp)
|
|
||||||
MobAI.MobCallForHelp(mob);
|
|
||||||
|
|
||||||
// Generate a list of tokens from the mob powers for this mobile.
|
|
||||||
|
|
||||||
powerTokens = new ArrayList<>(mob.mobPowers.keySet());
|
|
||||||
purgeTokens = new ArrayList<>();
|
|
||||||
|
|
||||||
// If player has this effect on them currently then remove
|
|
||||||
// this token from our list.
|
|
||||||
|
|
||||||
for (int powerToken : powerTokens) {
|
|
||||||
|
|
||||||
PowersBase powerBase = PowersManager.getPowerByToken(powerToken);
|
|
||||||
|
|
||||||
for (ActionsBase actionBase : powerBase.getActions()) {
|
|
||||||
|
|
||||||
String stackType = actionBase.stackType;
|
|
||||||
|
|
||||||
if (target.getEffects() != null && target.getEffects().containsKey(stackType))
|
|
||||||
purgeTokens.add(powerToken);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
powerTokens.removeAll(purgeTokens);
|
|
||||||
|
|
||||||
// Sanity check
|
|
||||||
|
|
||||||
if (powerTokens.isEmpty())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Pick random spell from our list of powers
|
|
||||||
|
|
||||||
int powerToken = powerTokens.get(ThreadLocalRandom.current().nextInt(powerTokens.size()));
|
|
||||||
int powerRank = mob.mobPowers.get(powerToken);
|
|
||||||
|
|
||||||
PowersBase mobPower = PowersManager.getPowerByToken(powerToken);
|
|
||||||
|
|
||||||
//check for hit-roll
|
|
||||||
|
|
||||||
if (mobPower.requiresHitRoll)
|
|
||||||
if (triggerDefense(mob, mob.getCombatTarget()))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Cast the spell
|
|
||||||
|
|
||||||
if (inRange2D(mob, mob.getCombatTarget(), mobPower.getRange())) {
|
|
||||||
|
|
||||||
PerformActionMsg msg;
|
|
||||||
|
|
||||||
if (!mobPower.isHarmful() || mobPower.targetSelf) {
|
|
||||||
PowersManager.useMobPower(mob, mob, mobPower, powerRank);
|
|
||||||
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, mob);
|
|
||||||
} else {
|
|
||||||
PowersManager.useMobPower(mob, target, mobPower, powerRank);
|
|
||||||
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.setUnknown04(2);
|
|
||||||
|
|
||||||
PowersManager.finishUseMobPower(msg, mob, 0, 0);
|
|
||||||
long randomCooldown = (long)((ThreadLocalRandom.current().nextInt(10,15) * 1000L) * MobAIThread.AI_CAST_FREQUENCY);
|
|
||||||
|
|
||||||
mob.nextCastTime = System.currentTimeMillis() + randomCooldown;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: MobCast" + " " + e.getMessage());
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean GuardCast(Mob mob) {
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Method picks a random spell from a mobile's list of powers
|
|
||||||
// and casts it on the current target (or itself). Validation
|
|
||||||
// (including empty lists) is done previously within canCast();
|
|
||||||
|
|
||||||
ArrayList<Integer> powerTokens;
|
|
||||||
ArrayList<Integer> purgeTokens;
|
|
||||||
AbstractCharacter target = (AbstractCharacter) mob.getCombatTarget();
|
|
||||||
|
|
||||||
if (mob.behaviourType.callsForHelp)
|
|
||||||
MobAI.MobCallForHelp(mob);
|
|
||||||
|
|
||||||
// Generate a list of tokens from the mob powers for this mobile.
|
|
||||||
|
|
||||||
powerTokens = new ArrayList<>(mob.mobPowers.keySet());
|
|
||||||
purgeTokens = new ArrayList<>();
|
|
||||||
|
|
||||||
// If player has this effect on them currently then remove
|
|
||||||
// this token from our list.
|
|
||||||
|
|
||||||
for (int powerToken : powerTokens) {
|
|
||||||
|
|
||||||
PowersBase powerBase = PowersManager.getPowerByToken(powerToken);
|
|
||||||
|
|
||||||
for (ActionsBase actionBase : powerBase.getActions()) {
|
|
||||||
|
|
||||||
String stackType = actionBase.stackType;
|
|
||||||
|
|
||||||
if (target.getEffects() != null && target.getEffects().containsKey(stackType))
|
|
||||||
purgeTokens.add(powerToken);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
powerTokens.removeAll(purgeTokens);
|
|
||||||
|
|
||||||
// Sanity check
|
|
||||||
|
|
||||||
if (powerTokens.isEmpty())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
int powerToken;
|
|
||||||
int nukeRoll = ThreadLocalRandom.current().nextInt(1,100);
|
|
||||||
|
|
||||||
if (nukeRoll < 55) {
|
|
||||||
|
|
||||||
//use direct damage spell
|
|
||||||
powerToken = powerTokens.get(powerTokens.size() - 1);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
//use random spell
|
|
||||||
powerToken = powerTokens.get(ThreadLocalRandom.current().nextInt(powerTokens.size()));
|
|
||||||
}
|
|
||||||
|
|
||||||
int powerRank = 1;
|
|
||||||
|
|
||||||
switch(mob.getRank()){
|
|
||||||
case 1:
|
|
||||||
powerRank = 10;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
powerRank = 15;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
powerRank = 20;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
powerRank = 25;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
powerRank = 30;
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
powerRank = 35;
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
powerRank = 40;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
PowersBase mobPower = PowersManager.getPowerByToken(powerToken);
|
|
||||||
|
|
||||||
//check for hit-roll
|
|
||||||
|
|
||||||
if (mobPower.requiresHitRoll)
|
|
||||||
if (triggerDefense(mob, mob.getCombatTarget()))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Cast the spell
|
|
||||||
|
|
||||||
if (inRange2D(mob, mob.getCombatTarget(), mobPower.getRange())) {
|
|
||||||
|
|
||||||
PerformActionMsg msg;
|
|
||||||
|
|
||||||
if (!mobPower.isHarmful() || mobPower.targetSelf) {
|
|
||||||
|
|
||||||
if (mobPower.category.equals("DISPEL")) {
|
|
||||||
PowersManager.useMobPower(mob, target, mobPower, powerRank);
|
|
||||||
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, target);
|
|
||||||
} else {
|
|
||||||
PowersManager.useMobPower(mob, mob, mobPower, powerRank);
|
|
||||||
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, mob);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
PowersManager.useMobPower(mob, target, mobPower, powerRank);
|
|
||||||
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.setUnknown04(2);
|
|
||||||
|
|
||||||
PowersManager.finishUseMobPower(msg, mob, 0, 0);
|
|
||||||
|
|
||||||
long randomCooldown = (long)((ThreadLocalRandom.current().nextInt(10,15) * 1000L) * MobAIThread.AI_CAST_FREQUENCY);
|
|
||||||
mob.nextCastTime = System.currentTimeMillis() + randomCooldown;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: MobCast" + " " + e.getMessage());
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -115,8 +115,39 @@ public class MovementUtilities {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Vector3fImmutable GetMoveLocation(Mob aiAgent, AbstractCharacter aggroTarget) {
|
||||||
|
|
||||||
|
// Player isnt moving and neither is mob. Just return
|
||||||
|
// the mobile's current location. Ain't goin nowhere!
|
||||||
|
// *** Refactor: Check to ensure methods calling us
|
||||||
|
// all don't sent move messages when not moving.
|
||||||
|
|
||||||
|
if ((aggroTarget.isMoving() == false))
|
||||||
|
return aggroTarget.getLoc();
|
||||||
|
|
||||||
|
if (aggroTarget.getEndLoc().x != 0) {
|
||||||
|
|
||||||
|
float aggroTargetDistanceSquared = aggroTarget.getLoc().distanceSquared2D(aggroTarget.getEndLoc());
|
||||||
|
float aiAgentDistanceSquared = aiAgent.getLoc().distanceSquared2D(aggroTarget.getEndLoc());
|
||||||
|
|
||||||
|
if (aiAgentDistanceSquared >= aggroTargetDistanceSquared)
|
||||||
|
return aggroTarget.getEndLoc();
|
||||||
|
else {
|
||||||
|
float distanceToMove = sqrt(aggroTargetDistanceSquared + aiAgentDistanceSquared) * .5f;
|
||||||
|
|
||||||
|
return aggroTarget.getFaceDir().scaleAdd(distanceToMove, aggroTarget.getLoc());
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// One of us is moving so let's calculate our destination loc for this
|
||||||
|
// simulation frame. We will simply project our position onto the
|
||||||
|
// character's movement vector and return the closest point.
|
||||||
|
|
||||||
|
return aiAgent.getLoc().ClosestPointOnLine(aggroTarget.getLoc(), aggroTarget.getEndLoc());
|
||||||
|
}
|
||||||
|
|
||||||
public static void moveToLocation(Mob agent, Vector3fImmutable newLocation, float offset) {
|
public static void moveToLocation(Mob agent, Vector3fImmutable newLocation, float offset) {
|
||||||
agent.resetLastSetLocUpdate();
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
//don't move farther than 30 units from player.
|
//don't move farther than 30 units from player.
|
||||||
@@ -141,8 +172,32 @@ public class MovementUtilities {
|
|||||||
return (agent.isAlive() && !agent.getBonuses().getBool(ModType.Stunned, SourceType.None) && !agent.getBonuses().getBool(ModType.CannotMove, SourceType.None));
|
return (agent.isAlive() && !agent.getBonuses().getBool(ModType.Stunned, SourceType.None) && !agent.getBonuses().getBool(ModType.CannotMove, SourceType.None));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Vector3fImmutable randomPatrolLocation(Mob agent, Vector3fImmutable center, float radius) {
|
||||||
|
|
||||||
|
//Determing where I want to move.
|
||||||
|
return new Vector3fImmutable((center.x - radius) + ((ThreadLocalRandom.current().nextFloat() + .1f * 2) * radius),
|
||||||
|
center.y,
|
||||||
|
(center.z - radius) + ((ThreadLocalRandom.current().nextFloat() + .1f * 2) * radius));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Long estimateMovementTime(Mob agent) {
|
||||||
|
if (agent.getEndLoc().x == 0 && agent.getEndLoc().y == 0)
|
||||||
|
return 0L;
|
||||||
|
|
||||||
|
return (long) ((agent.getLoc().distance2D(agent.getEndLoc()) * 1000) / agent.getSpeed());
|
||||||
|
}
|
||||||
|
|
||||||
public static void aiMove(Mob agent, Vector3fImmutable vect, boolean isWalking) {
|
public static void aiMove(Mob agent, Vector3fImmutable vect, boolean isWalking) {
|
||||||
|
|
||||||
|
//update our walk/run state.
|
||||||
|
if (isWalking && !agent.isWalk()) {
|
||||||
|
agent.setWalkMode(true);
|
||||||
|
MovementManager.sendRWSSMsg(agent);
|
||||||
|
} else if (!isWalking && agent.isWalk()) {
|
||||||
|
agent.setWalkMode(false);
|
||||||
|
MovementManager.sendRWSSMsg(agent);
|
||||||
|
}
|
||||||
|
|
||||||
MoveToPointMsg msg = new MoveToPointMsg();
|
MoveToPointMsg msg = new MoveToPointMsg();
|
||||||
|
|
||||||
|
|
||||||
@@ -218,4 +273,23 @@ public class MovementUtilities {
|
|||||||
return character.getLoc();
|
return character.getLoc();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean updateMovementToCharacter(Mob aiAgent, AbstractCharacter aggroTarget) {
|
||||||
|
|
||||||
|
if (aiAgent.destination.equals(Vector3fImmutable.ZERO))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (!aiAgent.isMoving())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
|
||||||
|
if (aggroTarget.isMoving()) {
|
||||||
|
return !aiAgent.destination.equals(aggroTarget.getEndLoc()) && !aiAgent.destination.equals(aggroTarget.getLoc());
|
||||||
|
} else {
|
||||||
|
if (aiAgent.destination.equals(aggroTarget.getLoc()))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ public class NetMsgFactory {
|
|||||||
// if (MBServerStatics.worldServerName.equals("Grief"))
|
// if (MBServerStatics.worldServerName.equals("Grief"))
|
||||||
Logger.error("Invalid protocol msg for player " + player.getFirstName() + " : " + opcode + " lastopcode: " + origin.lastProtocol.name() + " Error Code : " + errorCode);
|
Logger.error("Invalid protocol msg for player " + player.getFirstName() + " : " + opcode + " lastopcode: " + origin.lastProtocol.name() + " Error Code : " + errorCode);
|
||||||
} else
|
} else
|
||||||
Logger.error("PROTOCOL ERROR: Player: " + ((ClientConnection) origin).getPlayerCharacter().getName() + " Account: " + ((ClientConnection) origin).getPlayerCharacter().getAccount().getUname() + "Invalid protocol msg : " + opcode + " lastopcode: " + origin.lastProtocol.name() + " Error Code : " + errorCode);
|
Logger.error("Invalid protocol msg : " + opcode + " lastopcode: " + origin.lastProtocol.name() + " Error Code : " + errorCode);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
package engine.net.client;
|
package engine.net.client;
|
||||||
|
|
||||||
import engine.Enum;
|
|
||||||
import engine.Enum.*;
|
import engine.Enum.*;
|
||||||
import engine.InterestManagement.WorldGrid;
|
import engine.InterestManagement.WorldGrid;
|
||||||
import engine.exception.MsgSendException;
|
import engine.exception.MsgSendException;
|
||||||
@@ -123,7 +122,6 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
if (pc.isSit()) {
|
if (pc.isSit()) {
|
||||||
pc.setCombat(false);
|
pc.setCombat(false);
|
||||||
pc.cancelOnSit();
|
pc.cancelOnSit();
|
||||||
pc.stopMovement(pc.loc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateStateMsg rwss = new UpdateStateMsg();
|
UpdateStateMsg rwss = new UpdateStateMsg();
|
||||||
@@ -224,11 +222,6 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(msg.getSlotNumber() == 11 && pc.getRaceID() == 1999){
|
|
||||||
forceTransferFromEquipToInventory(msg, origin, "Saetor cannot wear shoes.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int uuid = msg.getUUID();
|
int uuid = msg.getUUID();
|
||||||
int slot = msg.getSlotNumber();
|
int slot = msg.getSlotNumber();
|
||||||
//System.out.println("loading to slot: " + slot);
|
//System.out.println("loading to slot: " + slot);
|
||||||
@@ -561,32 +554,18 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
if (i == null)
|
if (i == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(i.getItemBaseID() == 7)
|
|
||||||
return; //cant delete gold
|
|
||||||
|
|
||||||
if (!itemManager.doesCharOwnThisItem(i.getObjectUUID()))
|
if (!itemManager.doesCharOwnThisItem(i.getObjectUUID()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!itemManager.inventoryContains(i))
|
if (!itemManager.inventoryContains(i))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(i.getItemBaseID() == 980066)
|
if (i.isCanDestroy())
|
||||||
return;
|
|
||||||
|
|
||||||
if (i.canDestroy) {
|
|
||||||
int value = i.getItemBase().value;
|
|
||||||
if(i.getItemBase().isRune())
|
|
||||||
value = 500000;
|
|
||||||
if(sourcePlayer.getCharItemManager().getGoldInventory().getNumOfItems() + value > 10000000){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (itemManager.delete(i) == true) {
|
if (itemManager.delete(i) == true) {
|
||||||
sourcePlayer.getCharItemManager().addGoldToInventory(value,false);
|
|
||||||
sourcePlayer.getCharItemManager().updateInventory();
|
|
||||||
Dispatch dispatch = Dispatch.borrow(sourcePlayer, msg);
|
Dispatch dispatch = Dispatch.borrow(sourcePlayer, msg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ackBankWindowOpened(AckBankWindowOpenedMsg msg, ClientConnection origin) {
|
private static void ackBankWindowOpened(AckBankWindowOpenedMsg msg, ClientConnection origin) {
|
||||||
@@ -1379,171 +1358,219 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void buyFromNPC(BuyFromNPCMsg msg, ClientConnection origin) {
|
private static void buyFromNPC(BuyFromNPCMsg msg, ClientConnection origin) {
|
||||||
|
|
||||||
PlayerCharacter sourcePlayer = SessionManager.getPlayerCharacter(origin);
|
PlayerCharacter sourcePlayer = SessionManager.getPlayerCharacter(origin);
|
||||||
|
|
||||||
if (sourcePlayer == null)
|
if (sourcePlayer == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (origin.buyLock.tryLock()) {
|
if (origin.buyLock.tryLock()) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
CharacterItemManager itemMan = sourcePlayer.getCharItemManager();
|
CharacterItemManager itemMan = sourcePlayer.getCharItemManager();
|
||||||
if (itemMan == null) {
|
|
||||||
|
if (itemMan == null)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
NPC npc = NPC.getFromCache(msg.getNPCID());
|
NPC npc = NPC.getFromCache(msg.getNPCID());
|
||||||
if (npc == null) {
|
|
||||||
|
if (npc == null)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
Item gold = itemMan.getGoldInventory();
|
Item gold = itemMan.getGoldInventory();
|
||||||
if (gold == null) {
|
|
||||||
|
if (gold == null)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
Item buy = null;
|
Item buy = null;
|
||||||
|
|
||||||
if (msg.getItemType() == GameObjectType.MobEquipment.ordinal()) {
|
if (msg.getItemType() == GameObjectType.MobEquipment.ordinal()) {
|
||||||
ArrayList<MobEquipment> sellInventory = npc.getContract().getSellInventory();
|
ArrayList<MobEquipment> sellInventory = npc.getContract().getSellInventory();
|
||||||
if (sellInventory == null) {
|
if (sellInventory == null)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
for (MobEquipment me : sellInventory) {
|
for (MobEquipment me : sellInventory) {
|
||||||
if (me.getObjectUUID() == msg.getItemID()) {
|
if (me.getObjectUUID() == msg.getItemID()) {
|
||||||
ItemBase ib = me.getItemBase();
|
ItemBase ib = me.getItemBase();
|
||||||
if (ib == null) {
|
if (ib == null)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
//test room available for item
|
//test room available for item
|
||||||
if (!itemMan.hasRoomInventory(ib.getWeight())) {
|
if (!itemMan.hasRoomInventory(ib.getWeight()))
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
int cost = me.magicValue;
|
int cost = me.getMagicValue();
|
||||||
if(npc.getContractID() == 1201 && me.getItemBase().getName().equals("Prospector"))
|
|
||||||
cost = 50;
|
|
||||||
float bargain = sourcePlayer.getBargain();
|
float bargain = sourcePlayer.getBargain();
|
||||||
|
|
||||||
float profit = npc.getSellPercent(sourcePlayer) - bargain;
|
float profit = npc.getSellPercent(sourcePlayer) - bargain;
|
||||||
if(me.getItemBase().getType().equals(ItemType.POTION))
|
|
||||||
profit -= 1.0f;
|
|
||||||
if (profit < 1)
|
if (profit < 1)
|
||||||
profit = 1;
|
profit = 1;
|
||||||
if(npc.getContractID() == 900){
|
|
||||||
cost = Warehouse.getCostForResource(ib.getUUID()) * Warehouse.getSellStackSize(ib.getUUID());
|
|
||||||
}
|
|
||||||
cost *= profit;
|
cost *= profit;
|
||||||
|
|
||||||
|
|
||||||
if (gold.getNumOfItems() - cost < 0) {
|
if (gold.getNumOfItems() - cost < 0) {
|
||||||
//dont' have enough goldItem exit!
|
//dont' have enough goldItem exit!
|
||||||
// chatMan.chatSystemInfo(pc, "" + "You dont have enough gold.");
|
// chatMan.chatSystemInfo(pc, "" + "You dont have enough gold.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
||||||
|
|
||||||
if (b != null && b.getProtectionState().equals(ProtectionState.NPC))
|
if (b != null && b.getProtectionState().equals(ProtectionState.NPC))
|
||||||
b = null;
|
b = null;
|
||||||
int buildingDeposit = cost - me.getMagicValue();
|
int buildingDeposit = cost - me.getMagicValue();
|
||||||
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold() && !b.isOwnerIsNPC()) {
|
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold()) {
|
||||||
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
|
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
|
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
|
||||||
// chatMan.chatSystemInfo(pc, "" + "You Failed to buy the item.");
|
// chatMan.chatSystemInfo(pc, "" + "You Failed to buy the item.");
|
||||||
ChatManager.chatSystemError(sourcePlayer, "Failed To Buy Item");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(me.getItemBase().getType().equals(ItemType.RESOURCE) && npc.getContractID() == 900){
|
|
||||||
handleResourcePurchase(me,itemMan,npc,buy,sourcePlayer,ib);
|
buy = Item.createItemForPlayer(sourcePlayer, ib);
|
||||||
}else {
|
|
||||||
buy = Item.createItemForPlayer(sourcePlayer, ib);
|
if (buy != null) {
|
||||||
if (buy != null) {
|
me.transferEnchants(buy);
|
||||||
me.transferEnchants(buy);
|
itemMan.addItemToInventory(buy);
|
||||||
itemMan.addItemToInventory(buy);
|
//itemMan.updateInventory();
|
||||||
if(npc.contractUUID == 900 && buy.getItemBaseID() == 1705032){
|
|
||||||
buy.setNumOfItems(10);
|
|
||||||
DbManager.ItemQueries.UPDATE_NUM_ITEMS(buy,buy.getNumOfItems());
|
|
||||||
}
|
|
||||||
//itemMan.updateInventory();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (msg.getItemType() == GameObjectType.Item.ordinal()) {
|
} else if (msg.getItemType() == GameObjectType.Item.ordinal()) {
|
||||||
|
|
||||||
CharacterItemManager npcCim = npc.getCharItemManager();
|
CharacterItemManager npcCim = npc.getCharItemManager();
|
||||||
|
|
||||||
if (npcCim == null)
|
if (npcCim == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
buy = Item.getFromCache(msg.getItemID());
|
buy = Item.getFromCache(msg.getItemID());
|
||||||
|
|
||||||
if (buy == null)
|
if (buy == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ItemBase ib = buy.getItemBase();
|
ItemBase ib = buy.getItemBase();
|
||||||
|
|
||||||
if (ib == null)
|
if (ib == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!npcCim.inventoryContains(buy))
|
if (!npcCim.inventoryContains(buy))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//test room available for item
|
//test room available for item
|
||||||
if (!itemMan.hasRoomInventory(ib.getWeight()))
|
if (!itemMan.hasRoomInventory(ib.getWeight()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//TODO test cost and subtract goldItem
|
//TODO test cost and subtract goldItem
|
||||||
|
|
||||||
//TODO CHnage this if we ever put NPc city npcs in buildings.
|
//TODO CHnage this if we ever put NPc city npcs in buildings.
|
||||||
int cost = buy.getBaseValue();
|
int cost = buy.getBaseValue();
|
||||||
|
|
||||||
if (buy.isID() || buy.isCustomValue())
|
if (buy.isID() || buy.isCustomValue())
|
||||||
cost = buy.getMagicValue();
|
cost = buy.getMagicValue();
|
||||||
|
|
||||||
float bargain = sourcePlayer.getBargain();
|
float bargain = sourcePlayer.getBargain();
|
||||||
|
|
||||||
float profit = npc.getSellPercent(sourcePlayer) - bargain;
|
float profit = npc.getSellPercent(sourcePlayer) - bargain;
|
||||||
|
|
||||||
if (profit < 1)
|
if (profit < 1)
|
||||||
profit = 1;
|
profit = 1;
|
||||||
|
|
||||||
if (!buy.isCustomValue())
|
if (!buy.isCustomValue())
|
||||||
cost *= profit;
|
cost *= profit;
|
||||||
else
|
else
|
||||||
cost = buy.getValue();
|
cost = buy.getValue();
|
||||||
|
|
||||||
|
|
||||||
if (gold.getNumOfItems() - cost < 0) {
|
if (gold.getNumOfItems() - cost < 0) {
|
||||||
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 128); // Insufficient Gold
|
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 128); // Insufficient Gold
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
||||||
|
|
||||||
if (b != null)
|
if (b != null)
|
||||||
if (b.getProtectionState().equals(ProtectionState.NPC))
|
if (b.getProtectionState().equals(ProtectionState.NPC))
|
||||||
b = null;
|
b = null;
|
||||||
|
|
||||||
int buildingDeposit = cost;
|
int buildingDeposit = cost;
|
||||||
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold() && !b.isOwnerIsNPC()) {
|
|
||||||
|
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold()) {
|
||||||
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
|
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
|
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
|
||||||
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 110);
|
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 110);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buy != null)
|
if (buy != null)
|
||||||
itemMan.buyFromNPC(buy, npc);
|
itemMan.buyFromNPC(buy, npc);
|
||||||
|
|
||||||
} else if (msg.getItemType() == GameObjectType.MobLoot.ordinal()) {
|
} else if (msg.getItemType() == GameObjectType.MobLoot.ordinal()) {
|
||||||
|
|
||||||
CharacterItemManager npcCim = npc.getCharItemManager();
|
CharacterItemManager npcCim = npc.getCharItemManager();
|
||||||
|
|
||||||
if (npcCim == null)
|
if (npcCim == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
buy = MobLoot.getFromCache(msg.getItemID());
|
buy = MobLoot.getFromCache(msg.getItemID());
|
||||||
|
|
||||||
if (buy == null)
|
if (buy == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ItemBase ib = buy.getItemBase();
|
ItemBase ib = buy.getItemBase();
|
||||||
|
|
||||||
if (ib == null)
|
if (ib == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!npcCim.inventoryContains(buy))
|
if (!npcCim.inventoryContains(buy))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//test room available for item
|
//test room available for item
|
||||||
if (!itemMan.hasRoomInventory(ib.getWeight()))
|
if (!itemMan.hasRoomInventory(ib.getWeight()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//TODO test cost and subtract goldItem
|
//TODO test cost and subtract goldItem
|
||||||
|
|
||||||
//TODO CHnage this if we ever put NPc city npcs in buildings.
|
//TODO CHnage this if we ever put NPc city npcs in buildings.
|
||||||
|
|
||||||
int cost = buy.getMagicValue();
|
int cost = buy.getMagicValue();
|
||||||
cost *= npc.getSellPercent(sourcePlayer);
|
cost *= npc.getSellPercent(sourcePlayer);
|
||||||
|
|
||||||
|
|
||||||
if (gold.getNumOfItems() - cost < 0) {
|
if (gold.getNumOfItems() - cost < 0) {
|
||||||
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 128); // Insufficient Gold
|
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 128); // Insufficient Gold
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
||||||
|
|
||||||
if (b != null && b.getProtectionState().equals(ProtectionState.NPC))
|
if (b != null && b.getProtectionState().equals(ProtectionState.NPC))
|
||||||
b = null;
|
b = null;
|
||||||
int buildingDeposit = cost;
|
int buildingDeposit = cost;
|
||||||
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold() && !b.isOwnerIsNPC()) {
|
|
||||||
|
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold()) {
|
||||||
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
|
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!itemMan.buyFromNPC(b, cost, buildingDeposit))
|
if (!itemMan.buyFromNPC(b, cost, buildingDeposit))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (buy != null)
|
if (buy != null)
|
||||||
itemMan.buyFromNPC(buy, npc);
|
itemMan.buyFromNPC(buy, npc);
|
||||||
|
|
||||||
} else
|
} else
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (buy != null) {
|
if (buy != null) {
|
||||||
|
|
||||||
msg.setItem(buy);
|
msg.setItem(buy);
|
||||||
//send the buy message back to update player
|
//send the buy message back to update player
|
||||||
// msg.setItemType(buy.getObjectType().ordinal());
|
// msg.setItemType(buy.getObjectType().ordinal());
|
||||||
@@ -1552,44 +1579,16 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
itemMan.updateInventory();
|
itemMan.updateInventory();
|
||||||
}
|
}
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
origin.buyLock.unlock();
|
origin.buyLock.unlock();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ErrorPopupMsg.sendErrorPopup(origin.getPlayerCharacter(), 12); // All production slots taken
|
ErrorPopupMsg.sendErrorPopup(origin.getPlayerCharacter(), 12); // All production slots taken
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void handleResourcePurchase(MobEquipment me, CharacterItemManager itemMan, NPC npc, Item buy, PlayerCharacter sourcePlayer, ItemBase ib){
|
|
||||||
boolean stacked = false;
|
|
||||||
int buystack = Warehouse.getSellStackSize(me.getItemBase().getUUID());
|
|
||||||
for(Item item : itemMan.getInventory()){
|
|
||||||
int itemID = item.getItemBaseID();
|
|
||||||
int meID = me.getItemBase().getUUID();
|
|
||||||
if(itemID == meID){
|
|
||||||
if(Warehouse.maxResources.isEmpty())
|
|
||||||
Warehouse.getMaxResources();
|
|
||||||
int maxStack = Warehouse.maxResources.get(itemID);
|
|
||||||
if(maxStack > item.getNumOfItems() + buystack){
|
|
||||||
item.setNumOfItems(item.getNumOfItems() + buystack);
|
|
||||||
stacked = true;
|
|
||||||
itemMan.updateInventory();
|
|
||||||
DbManager.ItemQueries.UPDATE_NUM_ITEMS(item,item.getNumOfItems());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!stacked){
|
|
||||||
buy = Item.createItemForPlayer(sourcePlayer, ib);
|
|
||||||
if (buy != null) {
|
|
||||||
me.transferEnchants(buy);
|
|
||||||
itemMan.addItemToInventory(buy);
|
|
||||||
buy.setNumOfItems(buystack);
|
|
||||||
DbManager.ItemQueries.UPDATE_NUM_ITEMS(buy,buy.getNumOfItems());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
itemMan.updateInventory();
|
|
||||||
}
|
|
||||||
private static void Repair(RepairMsg msg, ClientConnection origin) {
|
private static void Repair(RepairMsg msg, ClientConnection origin) {
|
||||||
|
|
||||||
PlayerCharacter player = SessionManager.getPlayerCharacter(origin);
|
PlayerCharacter player = SessionManager.getPlayerCharacter(origin);
|
||||||
@@ -1632,8 +1631,8 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
if (toRepair == null)
|
if (toRepair == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//if (toRepair.getItemBase().isGlass())
|
if (toRepair.getItemBase().isGlass())
|
||||||
// return;
|
return;
|
||||||
|
|
||||||
//make sure item is in player's inventory or equipment
|
//make sure item is in player's inventory or equipment
|
||||||
if (!itemMan.inventoryContains(toRepair) && !itemMan.equippedContains(toRepair))
|
if (!itemMan.inventoryContains(toRepair) && !itemMan.equippedContains(toRepair))
|
||||||
@@ -1655,12 +1654,6 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
}
|
}
|
||||||
//TODO get cost to repair
|
//TODO get cost to repair
|
||||||
int cost = (int) ((max - dur) * 80.1);
|
int cost = (int) ((max - dur) * 80.1);
|
||||||
|
|
||||||
//glass costs 3x as much to repair
|
|
||||||
if (toRepair.getItemBase().isGlass()){
|
|
||||||
cost *= 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
||||||
|
|
||||||
if (b != null)
|
if (b != null)
|
||||||
@@ -1895,22 +1888,9 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
break;
|
break;
|
||||||
case LEAVEREQUEST:
|
case LEAVEREQUEST:
|
||||||
origin.disconnect();
|
origin.disconnect();
|
||||||
ArrayList<PlayerCharacter> sameMachine = new ArrayList<>();
|
|
||||||
for (PlayerCharacter pc : SessionManager.getAllActivePlayers()) {
|
|
||||||
if(origin.machineID.equals(pc.getClientConnection().machineID))
|
|
||||||
sameMachine.add(pc);
|
|
||||||
}
|
|
||||||
if(sameMachine.isEmpty() == false){
|
|
||||||
if(sameMachine.get(0) != null) {
|
|
||||||
sameMachine.get(0).isBoxed = false;
|
|
||||||
sameMachine.get(0).removeEffectBySource(EffectSourceType.DeathShroud,41,true);
|
|
||||||
ChatManager.chatSystemInfo(sameMachine.get(0), "You Are No Longer Flagged 'Boxed'");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case POWER:
|
case POWER:
|
||||||
PowersManager.usePower((PerformActionMsg) msg, origin, false);
|
PowersManager.usePower((PerformActionMsg) msg, origin, false);
|
||||||
//PowersManager.static_power_que.add(new PowersManager.PowerQueObject((PerformActionMsg) msg, origin, false));
|
|
||||||
break;
|
break;
|
||||||
case REQUESTMELEEATTACK:
|
case REQUESTMELEEATTACK:
|
||||||
CombatManager.setAttackTarget((AttackCmdMsg) msg, origin);
|
CombatManager.setAttackTarget((AttackCmdMsg) msg, origin);
|
||||||
|
|||||||
@@ -57,21 +57,6 @@ public class ActivateNPCMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
if (contract.canSlotinBuilding(building))
|
if (contract.canSlotinBuilding(building))
|
||||||
ItemLists.add(hirelings);
|
ItemLists.add(hirelings);
|
||||||
|
|
||||||
if(building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.TOL)){
|
|
||||||
if(contract.getContractID() == 899)//alchemist
|
|
||||||
ItemLists.add(hirelings);
|
|
||||||
|
|
||||||
if(contract.getContractID() == 866)//banker
|
|
||||||
ItemLists.add(hirelings);
|
|
||||||
|
|
||||||
if(contract.getContractID() == 865)//siege engineer
|
|
||||||
ItemLists.add(hirelings);
|
|
||||||
}
|
|
||||||
if(building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.SIEGETENT)){
|
|
||||||
if(contract.getContractID() == 865)//siege engineer
|
|
||||||
ItemLists.add(hirelings);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,20 +78,13 @@ public class ActivateNPCMsgHandler extends AbstractClientMsgHandler {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (building.getBlueprint().getSlotsForRank(building.getRank()) == building.getHirelings().size())
|
if (building.getBlueprint().getMaxSlots() == building.getHirelings().size())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Item contractItem = Item.getFromCache(msg.getContractItem());
|
Item contractItem = Item.getFromCache(msg.getContractItem());
|
||||||
|
|
||||||
if (contractItem == null)
|
if (contractItem == null)
|
||||||
return false;
|
return false;
|
||||||
if (msg.getContractItem() == 850) {//runemaster
|
|
||||||
for (AbstractCharacter abs : building.getHirelings().keySet()) {
|
|
||||||
NPC npc = (NPC) abs;
|
|
||||||
if (npc.contract.getContractID() == 850)
|
|
||||||
return false; //can only have 1 runemaster
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!player.getCharItemManager().doesCharOwnThisItem(contractItem.getObjectUUID())) {
|
if (!player.getCharItemManager().doesCharOwnThisItem(contractItem.getObjectUUID())) {
|
||||||
Logger.error(player.getName() + "has attempted to place Hireling : " + contractItem.getName() + "without a valid contract!");
|
Logger.error(player.getName() + "has attempted to place Hireling : " + contractItem.getName() + "without a valid contract!");
|
||||||
@@ -126,33 +104,10 @@ public class ActivateNPCMsgHandler extends AbstractClientMsgHandler {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Check if contract can be slotted in this building
|
// Check if contract can be slotted in this building
|
||||||
//Logger.error("inserting contract: " + contract.getContractID());
|
|
||||||
if (contract.canSlotinBuilding(building) == false) {
|
|
||||||
boolean override = false;
|
|
||||||
if (building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.TOL)) {
|
|
||||||
if (contract.getContractID() == 899)//alchemist
|
|
||||||
override = true;
|
|
||||||
|
|
||||||
if (contract.getContractID() == 866)//banker
|
if (contract.canSlotinBuilding(building) == false)
|
||||||
override = true;
|
return false;
|
||||||
|
|
||||||
if (contract.getContractID() == 865)//siege engineer
|
|
||||||
override = true;
|
|
||||||
}
|
|
||||||
if (building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.SIEGETENT)) {
|
|
||||||
if (contract.getContractID() == 865)//siege engineer
|
|
||||||
override = true;
|
|
||||||
}
|
|
||||||
if(building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.SIEGETENT)){
|
|
||||||
if(contract.getContractID() == 865)//siege engineer
|
|
||||||
override = true;
|
|
||||||
}
|
|
||||||
if(override == false) {
|
|
||||||
Logger.error("failed at override with contract: " + contract.getContractID());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//Logger.error("override successful: " + contract.getContractID());
|
|
||||||
if (!BuildingManager.addHireling(building, player, zone, contract, contractItem))
|
if (!BuildingManager.addHireling(building, player, zone, contract, contractItem))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ public class ArcLoginNotifyMsgHandler extends AbstractClientMsgHandler {
|
|||||||
GroupManager.RefreshOthersGroupList(player);
|
GroupManager.RefreshOthersGroupList(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
player.enteredWorld = true;
|
player.setEnteredWorld(true);
|
||||||
// Set player active
|
// Set player active
|
||||||
player.resetRegenUpdateTime();
|
player.resetRegenUpdateTime();
|
||||||
player.setActive(true);
|
player.setActive(true);
|
||||||
@@ -66,9 +66,6 @@ public class ArcLoginNotifyMsgHandler extends AbstractClientMsgHandler {
|
|||||||
// Send Guild, Nation and IC MOTD
|
// Send Guild, Nation and IC MOTD
|
||||||
GuildManager.enterWorldMOTD(player);
|
GuildManager.enterWorldMOTD(player);
|
||||||
ChatManager.sendSystemMessage(player, ConfigManager.MB_WORLD_GREETING.getValue());
|
ChatManager.sendSystemMessage(player, ConfigManager.MB_WORLD_GREETING.getValue());
|
||||||
ChatManager.sendSystemMessage(player, "Gold Drop Rate: " + ConfigManager.MB_NORMAL_GOLD_RATE.getValue());
|
|
||||||
ChatManager.sendSystemMessage(player, "Loot Drop Rate: " + ConfigManager.MB_NORMAL_DROP_RATE.getValue());
|
|
||||||
ChatManager.sendSystemMessage(player, "Experience Rate: " + ConfigManager.MB_NORMAL_EXP_RATE.getValue());
|
|
||||||
|
|
||||||
// Send branch string if available from ConfigManager.
|
// Send branch string if available from ConfigManager.
|
||||||
|
|
||||||
|
|||||||
@@ -14,17 +14,18 @@ import engine.Enum.GuildHistoryType;
|
|||||||
import engine.exception.MsgSendException;
|
import engine.exception.MsgSendException;
|
||||||
import engine.gameManager.ChatManager;
|
import engine.gameManager.ChatManager;
|
||||||
import engine.gameManager.DbManager;
|
import engine.gameManager.DbManager;
|
||||||
import engine.gameManager.GroupManager;
|
|
||||||
import engine.gameManager.SessionManager;
|
import engine.gameManager.SessionManager;
|
||||||
import engine.net.Dispatch;
|
import engine.net.Dispatch;
|
||||||
import engine.net.DispatchMessage;
|
import engine.net.DispatchMessage;
|
||||||
import engine.net.client.ClientConnection;
|
import engine.net.client.ClientConnection;
|
||||||
import engine.net.client.msg.ClientNetMsg;
|
import engine.net.client.msg.ClientNetMsg;
|
||||||
import engine.net.client.msg.ErrorPopupMsg;
|
import engine.net.client.msg.ErrorPopupMsg;
|
||||||
import engine.net.client.msg.group.GroupUpdateMsg;
|
|
||||||
import engine.net.client.msg.guild.BanishUnbanishMsg;
|
import engine.net.client.msg.guild.BanishUnbanishMsg;
|
||||||
import engine.net.client.msg.guild.GuildListMsg;
|
import engine.net.client.msg.guild.GuildListMsg;
|
||||||
import engine.objects.*;
|
import engine.objects.Guild;
|
||||||
|
import engine.objects.GuildHistory;
|
||||||
|
import engine.objects.GuildStatusController;
|
||||||
|
import engine.objects.PlayerCharacter;
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
|
|
||||||
public class BanishUnbanishHandler extends AbstractClientMsgHandler {
|
public class BanishUnbanishHandler extends AbstractClientMsgHandler {
|
||||||
@@ -115,20 +116,6 @@ public class BanishUnbanishHandler extends AbstractClientMsgHandler {
|
|||||||
GuildListMsg guildListMsg = new GuildListMsg(guild);
|
GuildListMsg guildListMsg = new GuildListMsg(guild);
|
||||||
dispatch = Dispatch.borrow(source, guildListMsg);
|
dispatch = Dispatch.borrow(source, guildListMsg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
||||||
if(GroupManager.getGroup(target) != null) {
|
|
||||||
Group group = GroupManager.getGroup(target);
|
|
||||||
group.removeGroupMember(PlayerCharacter.getPlayerCharacter(target));
|
|
||||||
GroupManager.removeFromGroups(PlayerCharacter.getPlayerCharacter(target));
|
|
||||||
GroupUpdateMsg gim;
|
|
||||||
gim = new GroupUpdateMsg();
|
|
||||||
gim.setGroup(group);
|
|
||||||
gim.setMessageType(3);
|
|
||||||
gim.setPlayer(PlayerCharacter.getPlayerCharacter(target));
|
|
||||||
group.sendUpdate(gim);
|
|
||||||
|
|
||||||
String text = PlayerCharacter.getPlayerCharacter(target).getFirstName() + " has left your group.";
|
|
||||||
ChatManager.chatGroupInfo(source, text);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
ErrorPopupMsg.sendErrorPopup(source, 103); // You may not banish this char
|
ErrorPopupMsg.sendErrorPopup(source, 103); // You may not banish this char
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,6 +61,15 @@ public class CityDataHandler extends AbstractClientMsgHandler {
|
|||||||
dispatch = Dispatch.borrow(playerCharacter, cityDataMsg);
|
dispatch = Dispatch.borrow(playerCharacter, cityDataMsg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
|
||||||
|
// If the hotZone has changed then update the client's map accordingly.
|
||||||
|
|
||||||
|
if (playerCharacter.getTimeStamp("hotzoneupdate") <= ZoneManager.hotZoneLastUpdate.toEpochMilli() && ZoneManager.hotZone != null) {
|
||||||
|
HotzoneChangeMsg hotzoneChangeMsg = new HotzoneChangeMsg(Enum.GameObjectType.Zone.ordinal(), ZoneManager.hotZone.getObjectUUID());
|
||||||
|
dispatch = Dispatch.borrow(playerCharacter, hotzoneChangeMsg);
|
||||||
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
playerCharacter.setTimeStamp("hotzoneupdate", System.currentTimeMillis() - 100);
|
||||||
|
}
|
||||||
|
|
||||||
// Serialize the realms for this map
|
// Serialize the realms for this map
|
||||||
|
|
||||||
WorldRealmMsg worldRealmMsg = new WorldRealmMsg();
|
WorldRealmMsg worldRealmMsg = new WorldRealmMsg();
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ public class DestroyBuildingHandler extends AbstractClientMsgHandler {
|
|||||||
if (city != null)
|
if (city != null)
|
||||||
bane = city.getBane();
|
bane = city.getBane();
|
||||||
|
|
||||||
if (bane != null) {
|
if (bane != null && bane.getSiegePhase() == Enum.SiegePhase.WAR) {
|
||||||
ErrorPopupMsg.sendErrorPopup(pc, 171);
|
ErrorPopupMsg.sendErrorPopup(pc, 171);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -71,12 +71,9 @@ public class DestroyBuildingHandler extends AbstractClientMsgHandler {
|
|||||||
if (blueprint.getBuildingGroup() == BuildingGroup.TOL)
|
if (blueprint.getBuildingGroup() == BuildingGroup.TOL)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// destorying a shrine will yield a rubble pile for looting
|
// Can't destroy a shrine
|
||||||
if (blueprint.getBuildingGroup() == BuildingGroup.SHRINE) {
|
if (blueprint.getBuildingGroup() == BuildingGroup.SHRINE)
|
||||||
building.modifyHealth(-building.getHealth(), origin.getPlayerCharacter());
|
|
||||||
building.destroyOrDerank(origin.getPlayerCharacter());
|
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
|
|
||||||
// Cannot destroy mines outside of normal mine mechanics
|
// Cannot destroy mines outside of normal mine mechanics
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import engine.net.client.msg.ClientNetMsg;
|
|||||||
import engine.net.client.msg.group.GroupInviteMsg;
|
import engine.net.client.msg.group.GroupInviteMsg;
|
||||||
import engine.net.client.msg.group.GroupUpdateMsg;
|
import engine.net.client.msg.group.GroupUpdateMsg;
|
||||||
import engine.objects.Group;
|
import engine.objects.Group;
|
||||||
import engine.objects.Guild;
|
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
|
|
||||||
public class GroupInviteHandler extends AbstractClientMsgHandler {
|
public class GroupInviteHandler extends AbstractClientMsgHandler {
|
||||||
@@ -104,12 +103,6 @@ public class GroupInviteHandler extends AbstractClientMsgHandler {
|
|||||||
if (target.isIgnoringPlayer(source))
|
if (target.isIgnoringPlayer(source))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if(source.getGuild().getNation().equals(target.getGuild().getNation()) == false)
|
|
||||||
return false; // cannot group outside of nation
|
|
||||||
|
|
||||||
if(source.getGuild().getNation().equals(target.getGuild().getNation()) && source.getGuild().getNation().equals(Guild.getErrantGuild()))
|
|
||||||
if(source.getGuild().equals(target.getGuild()) == false)
|
|
||||||
return false; // cannot group as an errant guild with other errant guilds
|
|
||||||
|
|
||||||
// dont block invites to people already in a group and
|
// dont block invites to people already in a group and
|
||||||
// dont check for pending invites, the client does it
|
// dont check for pending invites, the client does it
|
||||||
|
|||||||
@@ -25,8 +25,6 @@ import engine.objects.Guild;
|
|||||||
import engine.objects.GuildStatusController;
|
import engine.objects.GuildStatusController;
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
|
|
||||||
import static engine.objects.Bane.getBaneByAttackerGuild;
|
|
||||||
|
|
||||||
public class InviteToSubHandler extends AbstractClientMsgHandler {
|
public class InviteToSubHandler extends AbstractClientMsgHandler {
|
||||||
|
|
||||||
public InviteToSubHandler() {
|
public InviteToSubHandler() {
|
||||||
@@ -97,25 +95,6 @@ public class InviteToSubHandler extends AbstractClientMsgHandler {
|
|||||||
if (sourceGuild.equals(targetGuild))
|
if (sourceGuild.equals(targetGuild))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if(sourceGuild.getNation().getOwnedCity().getBane() != null)
|
|
||||||
return true; // cannot invite guilds to sub if you are baned
|
|
||||||
|
|
||||||
if(sourceGuild.getNation().getSubGuildList() != null){
|
|
||||||
for(Guild subGuild : sourceGuild.getNation().getSubGuildList()){
|
|
||||||
if(subGuild.getOwnedCity() != null)
|
|
||||||
if(subGuild.getOwnedCity().getBane() != null)
|
|
||||||
return true;//cannot invite guilds to sub if any tree in your nation has a bane on it
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(targetGuild.getOwnedCity() != null)
|
|
||||||
if(targetGuild.getOwnedCity().getBane() != null)
|
|
||||||
return true; // cannot be subbed if you have a bane placed on you
|
|
||||||
|
|
||||||
|
|
||||||
if(getBaneByAttackerGuild(targetGuild) != null)
|
|
||||||
return true; // cannot sub to a nation if they have a bane placed
|
|
||||||
|
|
||||||
//target must be GL or IC
|
//target must be GL or IC
|
||||||
|
|
||||||
if (GuildStatusController.isInnerCouncil(target.getGuildStatus()) == false && GuildStatusController.isGuildLeader(target.getGuildStatus()) == false) {
|
if (GuildStatusController.isInnerCouncil(target.getGuildStatus()) == false && GuildStatusController.isGuildLeader(target.getGuildStatus()) == false) {
|
||||||
|
|||||||
@@ -12,15 +12,16 @@ package engine.net.client.handlers;
|
|||||||
import engine.Enum.GuildHistoryType;
|
import engine.Enum.GuildHistoryType;
|
||||||
import engine.exception.MsgSendException;
|
import engine.exception.MsgSendException;
|
||||||
import engine.gameManager.ChatManager;
|
import engine.gameManager.ChatManager;
|
||||||
import engine.gameManager.GroupManager;
|
|
||||||
import engine.gameManager.SessionManager;
|
import engine.gameManager.SessionManager;
|
||||||
import engine.net.Dispatch;
|
import engine.net.Dispatch;
|
||||||
import engine.net.DispatchMessage;
|
import engine.net.DispatchMessage;
|
||||||
import engine.net.client.ClientConnection;
|
import engine.net.client.ClientConnection;
|
||||||
import engine.net.client.msg.ClientNetMsg;
|
import engine.net.client.msg.ClientNetMsg;
|
||||||
import engine.net.client.msg.group.GroupUpdateMsg;
|
|
||||||
import engine.net.client.msg.guild.LeaveGuildMsg;
|
import engine.net.client.msg.guild.LeaveGuildMsg;
|
||||||
import engine.objects.*;
|
import engine.objects.Guild;
|
||||||
|
import engine.objects.GuildStatusController;
|
||||||
|
import engine.objects.Mine;
|
||||||
|
import engine.objects.PlayerCharacter;
|
||||||
|
|
||||||
public class LeaveGuildHandler extends AbstractClientMsgHandler {
|
public class LeaveGuildHandler extends AbstractClientMsgHandler {
|
||||||
|
|
||||||
@@ -60,21 +61,6 @@ public class LeaveGuildHandler extends AbstractClientMsgHandler {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(GroupManager.getGroup(playerCharacter) != null) {
|
|
||||||
Group group = GroupManager.getGroup(playerCharacter);
|
|
||||||
group.removeGroupMember(playerCharacter);
|
|
||||||
GroupManager.removeFromGroups(playerCharacter);
|
|
||||||
GroupUpdateMsg gim;
|
|
||||||
gim = new GroupUpdateMsg();
|
|
||||||
gim.setGroup(group);
|
|
||||||
gim.setMessageType(3);
|
|
||||||
gim.setPlayer(playerCharacter);
|
|
||||||
group.sendUpdate(gim);
|
|
||||||
|
|
||||||
String text = playerCharacter.getFirstName() + " has left your group.";
|
|
||||||
ChatManager.chatGroupInfo(playerCharacter, text);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send left guild message to rest of guild
|
// Send left guild message to rest of guild
|
||||||
ChatManager.chatGuildInfo(oldGuild, playerCharacter.getFirstName() + " has left the guild.");
|
ChatManager.chatGuildInfo(oldGuild, playerCharacter.getFirstName() + " has left the guild.");
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import engine.Enum.DispatchChannel;
|
|||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
import engine.exception.MsgSendException;
|
import engine.exception.MsgSendException;
|
||||||
import engine.gameManager.BuildingManager;
|
import engine.gameManager.BuildingManager;
|
||||||
import engine.gameManager.DbManager;
|
|
||||||
import engine.gameManager.SessionManager;
|
import engine.gameManager.SessionManager;
|
||||||
import engine.gameManager.ZoneManager;
|
import engine.gameManager.ZoneManager;
|
||||||
import engine.math.Bounds;
|
import engine.math.Bounds;
|
||||||
@@ -63,6 +62,7 @@ public class ManageCityAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
Building building;
|
Building building;
|
||||||
|
|
||||||
msg = (ManageCityAssetsMsg) baseMsg;
|
msg = (ManageCityAssetsMsg) baseMsg;
|
||||||
|
|
||||||
player = SessionManager.getPlayerCharacter(origin);
|
player = SessionManager.getPlayerCharacter(origin);
|
||||||
|
|
||||||
if (player == null)
|
if (player == null)
|
||||||
@@ -72,21 +72,34 @@ public class ManageCityAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
if (building == null) {
|
if (building == null) {
|
||||||
if (msg.actionType == 14) {
|
if (msg.actionType == 14) {
|
||||||
|
|
||||||
Zone zone = ZoneManager.findSmallestZone(player.getLoc());
|
Zone zone = ZoneManager.findSmallestZone(player.getLoc());
|
||||||
|
|
||||||
if (!zone.isPlayerCity()) {
|
if (!zone.isPlayerCity()) {
|
||||||
ErrorPopupMsg.sendErrorMsg(player, "Unable to find city to command.");
|
ErrorPopupMsg.sendErrorMsg(player, "Unable to find city to command.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
City city = City.GetCityFromCache(zone.getPlayerCityUUID());
|
City city = City.GetCityFromCache(zone.getPlayerCityUUID());
|
||||||
if (city == null || !city.getGuild().equals(player.getGuild()) ||
|
|
||||||
(!GuildStatusController.isInnerCouncil(player.getGuildStatus()) &&
|
if (city == null) {
|
||||||
!GuildStatusController.isGuildLeader(player.getGuildStatus()))) {
|
ErrorPopupMsg.sendErrorMsg(player, "Unable to find city to command.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!city.getGuild().equals(player.getGuild())) {
|
||||||
ErrorPopupMsg.sendErrorMsg(player, "You are not in the correct guild to command this city.");
|
ErrorPopupMsg.sendErrorMsg(player, "You are not in the correct guild to command this city.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!GuildStatusController.isInnerCouncil(player.getGuildStatus()) && !GuildStatusController.isGuildLeader(player.getGuildStatus())) {
|
||||||
|
ErrorPopupMsg.sendErrorMsg(player, "You must be an Inner Council or Guild leader to access city commands.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
ManageCityAssetsMsg mca = new ManageCityAssetsMsg(player, building);
|
ManageCityAssetsMsg mca = new ManageCityAssetsMsg(player, building);
|
||||||
mca.actionType = 15;
|
mca.actionType = 15;
|
||||||
DispatchMessage.dispatchMsgDispatch(Dispatch.borrow(player, mca), DispatchChannel.SECONDARY);
|
Dispatch dispatch = Dispatch.borrow(player, mca);
|
||||||
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -98,126 +111,181 @@ public class ManageCityAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
outMsg.setTargetType(building.getObjectType().ordinal());
|
outMsg.setTargetType(building.getObjectType().ordinal());
|
||||||
outMsg.setTargetID(building.getObjectUUID());
|
outMsg.setTargetID(building.getObjectUUID());
|
||||||
outMsg.setAssetName(building.getName());
|
outMsg.setAssetName(building.getName());
|
||||||
DispatchMessage.dispatchMsgDispatch(Dispatch.borrow(player, outMsg), DispatchChannel.SECONDARY);
|
Dispatch dispatch = Dispatch.borrow(player, outMsg);
|
||||||
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (msg.actionType) {
|
if (msg.actionType == 2 || msg.actionType == 22) {
|
||||||
case 2:
|
|
||||||
case 22:
|
if (building.getBlueprint() != null && building.getBlueprint().getBuildingGroup() == engine.Enum.BuildingGroup.BANESTONE) {
|
||||||
if (building.getBlueprint() != null && building.getBlueprint().getBuildingGroup() == engine.Enum.BuildingGroup.BANESTONE) {
|
|
||||||
outMsg.actionType = 18;
|
outMsg.actionType = 18;
|
||||||
outMsg.setTargetType(building.getObjectType().ordinal());
|
outMsg.setTargetType(building.getObjectType().ordinal());
|
||||||
outMsg.setTargetID(building.getObjectUUID());
|
outMsg.setTargetID(building.getObjectUUID());
|
||||||
} else if (BuildingManager.playerCanManage(player, building)) {
|
|
||||||
configWindowState(player, building, outMsg);
|
} else if (BuildingManager.playerCanManage(player, building)) { //TODO allow Friends list.
|
||||||
outMsg.actionType = 3;
|
|
||||||
outMsg.setTargetType(building.getObjectType().ordinal());
|
|
||||||
outMsg.setTargetID(building.getObjectUUID());
|
|
||||||
outMsg.setTargetType3(building.getObjectType().ordinal());
|
|
||||||
outMsg.setTargetID3(building.getObjectUUID());
|
|
||||||
outMsg.setUnknown54(1);
|
|
||||||
} else {
|
|
||||||
// Handle other cases
|
|
||||||
if (building.getRank() == -1) {
|
|
||||||
if (!Bounds.collide(player.getLoc(), building)) {
|
|
||||||
ErrorPopupMsg.sendErrorPopup(player, 64);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
switch (building.getBlueprint().getBuildingGroup()) {
|
|
||||||
case SHRINE:
|
|
||||||
Shrine shrine = Shrine.shrinesByBuildingUUID.get(building.getObjectUUID());
|
|
||||||
if (shrine == null || shrine.getFavors() == 0) {
|
|
||||||
ErrorPopupMsg.sendErrorPopup(player, 166); // There is no more favor in this shrine to loot
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
//loot elan stones
|
|
||||||
MobLoot elanStones = new MobLoot(player,ItemBase.getItemBase(1705032),1,false);
|
|
||||||
Item promotedItem = elanStones.promoteToItem(player);
|
|
||||||
promotedItem.setNumOfItems(shrine.getFavors());
|
|
||||||
player.getCharItemManager().addItemToInventory(promotedItem);
|
|
||||||
DbManager.ItemQueries.UPDATE_NUM_ITEMS(promotedItem,promotedItem.getNumOfItems());
|
|
||||||
player.getCharItemManager().updateInventory();
|
|
||||||
shrine.setFavors(0);
|
|
||||||
break;
|
|
||||||
case WAREHOUSE:
|
|
||||||
Warehouse warehouse = Warehouse.warehouseByBuildingUUID.get(building.getObjectUUID());
|
|
||||||
if (warehouse == null || warehouse.isEmpty()) {
|
|
||||||
ErrorPopupMsg.sendErrorPopup(player, 167); // no more resources.
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
AbstractCharacter owner = building.getOwner();
|
|
||||||
if (owner == null) {
|
|
||||||
msg.actionType = 4;
|
|
||||||
DispatchMessage.dispatchMsgDispatch(Dispatch.borrow(player, msg), DispatchChannel.SECONDARY);
|
|
||||||
} else {
|
|
||||||
outMsg.actionType = 4;
|
|
||||||
outMsg.setTargetType(building.getObjectType().ordinal());
|
|
||||||
outMsg.setTargetID(building.getObjectUUID());
|
|
||||||
outMsg.setAssetName(building.getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DispatchMessage.dispatchMsgDispatch(Dispatch.borrow(player, outMsg), DispatchChannel.SECONDARY);
|
|
||||||
return true;
|
|
||||||
case 13:
|
|
||||||
outMsg.actionType = 13;
|
|
||||||
DispatchMessage.dispatchMsgDispatch(Dispatch.borrow(player, outMsg), DispatchChannel.SECONDARY);
|
|
||||||
return true;
|
|
||||||
case 5:
|
|
||||||
building.setName(msg.getAssetName());
|
|
||||||
configWindowState(player, building, outMsg);
|
configWindowState(player, building, outMsg);
|
||||||
outMsg.actionType = 3;
|
outMsg.actionType = 3;
|
||||||
outMsg.setTargetType(building.getObjectType().ordinal());
|
outMsg.setTargetType(building.getObjectType().ordinal());
|
||||||
outMsg.setTargetID(building.getObjectUUID());
|
outMsg.setTargetID(building.getObjectUUID());
|
||||||
outMsg.setTargetType3(GameObjectType.Building.ordinal());
|
outMsg.setTargetType3(building.getObjectType().ordinal());
|
||||||
outMsg.setTargetID3(building.getObjectUUID());
|
outMsg.setTargetID3(building.getObjectUUID());
|
||||||
outMsg.setAssetName1(building.getName());
|
|
||||||
outMsg.setUnknown54(1);
|
outMsg.setUnknown54(1);
|
||||||
DispatchMessage.dispatchMsgDispatch(Dispatch.borrow(player, outMsg), DispatchChannel.SECONDARY);
|
|
||||||
return true;
|
|
||||||
case 14:
|
|
||||||
ManageCityAssetsMsg mca = new ManageCityAssetsMsg(player, building);
|
|
||||||
mca.actionType = 15;
|
|
||||||
DispatchMessage.dispatchMsgDispatch(Dispatch.borrow(player, mca), DispatchChannel.SECONDARY);
|
|
||||||
return true;
|
|
||||||
case 20:
|
|
||||||
// Handle case 20
|
|
||||||
return handleCase20(player, outMsg, building, msg, origin);
|
|
||||||
default:
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean handleCase20(PlayerCharacter player, ManageCityAssetsMsg outMsg, Building building, ManageCityAssetsMsg msg, ClientConnection origin) throws MsgSendException {
|
} else {
|
||||||
Zone baneZone = building.getParentZone();
|
|
||||||
if (baneZone == null)
|
if (building.getBlueprintUUID() != 0)
|
||||||
return true;
|
switch (building.getBlueprint().getBuildingGroup()) {
|
||||||
City banedCity = City.getCity(baneZone.getPlayerCityUUID());
|
case SHRINE:
|
||||||
if (banedCity == null)
|
if (building.getRank() == -1) {
|
||||||
return true;
|
if (!Bounds.collide(player.getLoc(), building)) {
|
||||||
Bane bane = banedCity.getBane();
|
ErrorPopupMsg.sendErrorPopup(player, 64);
|
||||||
if (bane == null || bane.getLiveDate() != null || player.getGuild() != banedCity.getGuild() || !GuildStatusController.isInnerCouncil(player.getGuildStatus()))
|
return true;
|
||||||
return true;
|
}
|
||||||
int baneHour = msg.getBaneHour();
|
|
||||||
if (baneHour < 16 || baneHour > 24) {
|
Shrine shrine = Shrine.shrinesByBuildingUUID.get(building.getObjectUUID());
|
||||||
PlaceAssetMsg.sendPlaceAssetError(origin, 1, "A Serious error has occurred. Please post details for to ensure transaction integrity");
|
|
||||||
|
if (shrine == null)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (shrine.getFavors() == 0) {
|
||||||
|
ErrorPopupMsg.sendErrorPopup(player, 166); // There is no more favor in this shrine to loot
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
BuildingManager.lootBuilding(player, building);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WAREHOUSE:
|
||||||
|
//TODO check
|
||||||
|
if (building.getRank() == -1) {
|
||||||
|
if (!Bounds.collide(player.getLoc(), building)) {
|
||||||
|
ErrorPopupMsg.sendErrorPopup(player, 64);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Warehouse warehouse = Warehouse.warehouseByBuildingUUID.get(building.getObjectUUID());
|
||||||
|
|
||||||
|
if (warehouse == null)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (warehouse.isEmpty()) {
|
||||||
|
ErrorPopupMsg.sendErrorPopup(player, 167); // no more resources.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
BuildingManager.lootBuilding(player, building);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (building.getRank() == -1)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
AbstractCharacter owner = building.getOwner();
|
||||||
|
|
||||||
|
//no owner, send building info
|
||||||
|
if (owner == null) {
|
||||||
|
msg.actionType = 4;
|
||||||
|
|
||||||
|
Dispatch dispatch = Dispatch.borrow(player, msg);
|
||||||
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
outMsg.actionType = 4;
|
||||||
|
outMsg.setTargetType(building.getObjectType().ordinal());
|
||||||
|
outMsg.setTargetID(building.getObjectUUID());
|
||||||
|
outMsg.setAssetName(building.getName());
|
||||||
|
|
||||||
|
}
|
||||||
|
Dispatch dispatch = Dispatch.borrow(player, outMsg);
|
||||||
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg.actionType == 13) {
|
||||||
|
outMsg.actionType = 13;
|
||||||
|
Dispatch dispatch = Dispatch.borrow(player, outMsg);
|
||||||
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Rename Building.
|
||||||
|
|
||||||
|
if (msg.actionType == 5) {
|
||||||
|
|
||||||
|
//TODO we need to check names before allowing
|
||||||
|
building.setName(msg.getAssetName());
|
||||||
|
configWindowState(player, building, outMsg);
|
||||||
|
|
||||||
|
outMsg.actionType = 3;
|
||||||
|
outMsg.setTargetType(building.getObjectType().ordinal());
|
||||||
|
outMsg.setTargetID(building.getObjectUUID());
|
||||||
|
outMsg.setTargetType3(GameObjectType.Building.ordinal());
|
||||||
|
outMsg.setTargetID3(building.getObjectUUID());
|
||||||
|
outMsg.setAssetName1(building.getName());
|
||||||
|
outMsg.setUnknown54(1);
|
||||||
|
|
||||||
|
Dispatch dispatch = Dispatch.borrow(player, outMsg);
|
||||||
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
//TOL, update city name also
|
||||||
|
//TODO update city and zone in database
|
||||||
|
//TODO update city map data in game server
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg.actionType == 14) {
|
||||||
|
ManageCityAssetsMsg mca = new ManageCityAssetsMsg(player, building);
|
||||||
|
mca.actionType = 15;
|
||||||
|
Dispatch dispatch = Dispatch.borrow(player, mca);
|
||||||
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg.actionType == 20) {
|
||||||
|
|
||||||
|
Zone baneZone = building.getParentZone();
|
||||||
|
|
||||||
|
if (baneZone == null)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
City banedCity = City.getCity(baneZone.getPlayerCityUUID());
|
||||||
|
|
||||||
|
if (banedCity == null)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
Bane bane = banedCity.getBane();
|
||||||
|
|
||||||
|
if (bane == null || bane.getLiveDate() != null || player.getGuild() != banedCity.getGuild() || GuildStatusController.isInnerCouncil(player.getGuildStatus()) == false)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
int baneHour = msg.getBaneHour();
|
||||||
|
|
||||||
|
if (baneHour < 16 || baneHour > 24) {
|
||||||
|
PlaceAssetMsg.sendPlaceAssetError(origin, 1, "A Serious error has occurred. Please post details for to ensure transaction integrity");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
DateTime baneLive = new DateTime(bane.getPlacementDate());
|
||||||
|
baneLive = baneHour == 24 ? baneLive.plusDays(3) : baneLive.plusDays(2);
|
||||||
|
baneLive = baneHour == 24 ? baneLive.hourOfDay().setCopy(0) : baneLive.hourOfDay().setCopy(baneHour);
|
||||||
|
baneLive = baneLive.minuteOfHour().setCopy(0);
|
||||||
|
baneLive = baneLive.secondOfMinute().setCopy(1);
|
||||||
|
bane.setLiveDate(baneLive);
|
||||||
|
outMsg.actionType = 18;
|
||||||
|
|
||||||
|
Dispatch dispatch = Dispatch.borrow(player, outMsg);
|
||||||
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
DateTime baneLive = new DateTime(bane.getPlacementDate());
|
|
||||||
baneLive = baneHour == 24 ? baneLive.plusDays(3) : baneLive.plusDays(2);
|
|
||||||
baneLive = baneHour == 24 ? baneLive.hourOfDay().setCopy(0) : baneLive.hourOfDay().setCopy(baneHour);
|
|
||||||
baneLive = baneLive.minuteOfHour().setCopy(0);
|
|
||||||
baneLive = baneLive.secondOfMinute().setCopy(1);
|
|
||||||
bane.setLiveDate(baneLive);
|
|
||||||
outMsg.actionType = 18;
|
|
||||||
DispatchMessage.dispatchMsgDispatch(Dispatch.borrow(player, outMsg), DispatchChannel.SECONDARY);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void configWindowState(PlayerCharacter player, Building building, ManageCityAssetsMsg manageCityAssetsMsg) {
|
public void configWindowState(PlayerCharacter player, Building building, ManageCityAssetsMsg manageCityAssetsMsg) {
|
||||||
|
|
||||||
// Tests to turn on upgrade button if a building is not
|
// Tests to turn on upgrade button if a building is not
|
||||||
@@ -226,7 +294,7 @@ public class ManageCityAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
// Owner is obviously allowed to upgrade his own buildings
|
// Owner is obviously allowed to upgrade his own buildings
|
||||||
|
|
||||||
if (building.getOwner() != null && building.getOwner().equals(player)) {
|
if (building.getOwner().equals(player)) {
|
||||||
|
|
||||||
// Players cannot destroy or transfer a TOL.
|
// Players cannot destroy or transfer a TOL.
|
||||||
|
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
Building shrineBuilding;
|
Building shrineBuilding;
|
||||||
Shrine shrine;
|
Shrine shrine;
|
||||||
|
|
||||||
if (npc.getGuild().getNation() != player.getGuild().getNation())
|
if (npc.getGuild() != player.getGuild())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
shrineBuilding = npc.getBuilding();
|
shrineBuilding = npc.getBuilding();
|
||||||
@@ -173,10 +173,10 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
//already haz boon.
|
//already haz boon.
|
||||||
|
|
||||||
//if (player.containsEffect(shrine.getShrineType().getPowerToken())) {
|
if (player.containsEffect(shrine.getShrineType().getPowerToken())) {
|
||||||
// ErrorPopupMsg.sendErrorPopup(player, 199);
|
ErrorPopupMsg.sendErrorPopup(player, 199);
|
||||||
// return;
|
return;
|
||||||
//}
|
}
|
||||||
|
|
||||||
if (!Shrine.canTakeFavor(player, shrine))
|
if (!Shrine.canTakeFavor(player, shrine))
|
||||||
return;
|
return;
|
||||||
@@ -191,10 +191,12 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(shrinePower.getName().equals("Boon: Nephilim"))
|
int rank = shrine.getRank();
|
||||||
shrinePower.name = "Boon: Chaos";
|
//R8 trees always get atleast rank 2 boons. rank uses index, where 0 is first place, 1 is second, etc...
|
||||||
|
if (shrineBuilding.getCity() != null && shrineBuilding.getCity().getTOL() != null && shrineBuilding.getCity().getTOL().getRank() == 8)
|
||||||
int trains = 5 * npc.getRank() + 5;//40 - (rank * 10);
|
if (rank != 0)
|
||||||
|
rank = 1;
|
||||||
|
int trains = 40 - (rank * 10);
|
||||||
if (trains < 0)
|
if (trains < 0)
|
||||||
trains = 0;
|
trains = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -15,9 +15,6 @@ import engine.net.client.msg.*;
|
|||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @Author:
|
* @Author:
|
||||||
* @Summary: Processes application protocol message which
|
* @Summary: Processes application protocol message which
|
||||||
@@ -26,8 +23,6 @@ import java.util.HashMap;
|
|||||||
|
|
||||||
public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
||||||
|
|
||||||
public static HashMap<Integer, ArrayList<Integer>> _minionsByCaptain = null;
|
|
||||||
|
|
||||||
public MinionTrainingMsgHandler() {
|
public MinionTrainingMsgHandler() {
|
||||||
super(MinionTrainingMessage.class);
|
super(MinionTrainingMessage.class);
|
||||||
}
|
}
|
||||||
@@ -37,10 +32,11 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
MinionTrainingMessage minionMsg = (MinionTrainingMessage) baseMsg;
|
MinionTrainingMessage minionMsg = (MinionTrainingMessage) baseMsg;
|
||||||
|
|
||||||
PlayerCharacter player = SessionManager.getPlayerCharacter(origin);
|
PlayerCharacter playerCharacter = SessionManager.getPlayerCharacter(origin);
|
||||||
|
|
||||||
if (player == null)
|
if (playerCharacter == null)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (minionMsg.getNpcType() == Enum.GameObjectType.NPC.ordinal()) {
|
if (minionMsg.getNpcType() == Enum.GameObjectType.NPC.ordinal()) {
|
||||||
|
|
||||||
NPC npc = NPC.getFromCache(minionMsg.getNpcID());
|
NPC npc = NPC.getFromCache(minionMsg.getNpcID());
|
||||||
@@ -48,14 +44,15 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
if (npc == null)
|
if (npc == null)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
Building b = BuildingManager.getBuildingFromCache(minionMsg.getBuildingID());
|
Building building = BuildingManager.getBuildingFromCache(minionMsg.getBuildingID());
|
||||||
|
|
||||||
if (b == null)
|
if (building == null)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
//clear minion
|
//clear minion
|
||||||
|
|
||||||
if (npc.minionLock.writeLock().tryLock()) {
|
if (npc.minionLock.writeLock().tryLock()) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (minionMsg.getType() == 2) {
|
if (minionMsg.getType() == 2) {
|
||||||
|
|
||||||
@@ -86,23 +83,21 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// we Found the move to remove, lets break the for loop so it doesnt look for more.
|
ManageCityAssetsMsg mca1 = new ManageCityAssetsMsg(playerCharacter, building);
|
||||||
|
|
||||||
ManageCityAssetsMsg mca1 = new ManageCityAssetsMsg(player, b);
|
|
||||||
mca1.actionType = 3;
|
mca1.actionType = 3;
|
||||||
mca1.setTargetType(b.getObjectType().ordinal());
|
mca1.setTargetType(building.getObjectType().ordinal());
|
||||||
mca1.setTargetID(b.getObjectUUID());
|
mca1.setTargetID(building.getObjectUUID());
|
||||||
|
|
||||||
mca1.setTargetType3(npc.getObjectType().ordinal());
|
mca1.setTargetType3(npc.getObjectType().ordinal());
|
||||||
mca1.setTargetID3(npc.getObjectUUID());
|
mca1.setTargetID3(npc.getObjectUUID());
|
||||||
mca1.setAssetName1(b.getName());
|
mca1.setAssetName1(building.getName());
|
||||||
mca1.setUnknown54(1);
|
mca1.setUnknown54(1);
|
||||||
|
|
||||||
Dispatch dispatch = Dispatch.borrow(player, mca1);
|
Dispatch dispatch = Dispatch.borrow(playerCharacter, mca1);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
|
||||||
ManageNPCMsg mnm = new ManageNPCMsg(npc);
|
ManageNPCMsg mnm = new ManageNPCMsg(npc);
|
||||||
dispatch = Dispatch.borrow(player, mnm);
|
dispatch = Dispatch.borrow(playerCharacter, mnm);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
|
||||||
//Add Minion
|
//Add Minion
|
||||||
@@ -156,7 +151,7 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
ManageNPCMsg mnm = new ManageNPCMsg(npc);
|
ManageNPCMsg mnm = new ManageNPCMsg(npc);
|
||||||
mnm.setMessageType(1);
|
mnm.setMessageType(1);
|
||||||
Dispatch dispatch = Dispatch.borrow(player, mnm);
|
Dispatch dispatch = Dispatch.borrow(playerCharacter, mnm);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
@@ -199,19 +194,21 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
DbManager.removeFromCache(toRemove);
|
DbManager.removeFromCache(toRemove);
|
||||||
|
|
||||||
|
if (toRemove.agentType.equals(Enum.AIAgentType.SIEGEENGINE)) {
|
||||||
|
|
||||||
PlayerCharacter petOwner = (PlayerCharacter) toRemove.guardCaptain;
|
PlayerCharacter trebOwner = (PlayerCharacter) toRemove.guardCaptain;
|
||||||
|
|
||||||
if (petOwner != null) {
|
if (trebOwner != null) {
|
||||||
petOwner.setPet(null);
|
trebOwner.setPet(null);
|
||||||
|
|
||||||
toRemove.guardCaptain = null;
|
toRemove.guardCaptain = null;
|
||||||
PetMsg petMsg = new PetMsg(5, null);
|
PetMsg petMsg = new PetMsg(5, null);
|
||||||
Dispatch dispatch = Dispatch.borrow(petOwner, petMsg);
|
Dispatch dispatch = Dispatch.borrow(trebOwner, petMsg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ManageCityAssetsMsg mca1 = new ManageCityAssetsMsg(player, building);
|
ManageCityAssetsMsg mca1 = new ManageCityAssetsMsg(playerCharacter, building);
|
||||||
mca1.actionType = 3;
|
mca1.actionType = 3;
|
||||||
mca1.setTargetType(building.getObjectType().ordinal());
|
mca1.setTargetType(building.getObjectType().ordinal());
|
||||||
mca1.setTargetID(building.getObjectUUID());
|
mca1.setTargetID(building.getObjectUUID());
|
||||||
@@ -221,11 +218,11 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
mca1.setAssetName1(building.getName());
|
mca1.setAssetName1(building.getName());
|
||||||
mca1.setUnknown54(1);
|
mca1.setUnknown54(1);
|
||||||
|
|
||||||
Dispatch dispatch = Dispatch.borrow(player, mca1);
|
Dispatch dispatch = Dispatch.borrow(playerCharacter, mca1);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
|
||||||
ManageNPCMsg mnm = new ManageNPCMsg(npc);
|
ManageNPCMsg mnm = new ManageNPCMsg(npc);
|
||||||
dispatch = Dispatch.borrow(player, mnm);
|
dispatch = Dispatch.borrow(playerCharacter, mnm);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
|
||||||
//Add Minion
|
//Add Minion
|
||||||
@@ -287,7 +284,7 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
ManageNPCMsg mnm = new ManageNPCMsg(npc);
|
ManageNPCMsg mnm = new ManageNPCMsg(npc);
|
||||||
mnm.setMessageType(1);
|
mnm.setMessageType(1);
|
||||||
Dispatch dispatch = Dispatch.borrow(player, mnm);
|
Dispatch dispatch = Dispatch.borrow(playerCharacter, mnm);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|||||||
@@ -195,9 +195,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
hPMod = (building.getMaxHitPoints() * Realm.getRealmHealthMod(city));
|
hPMod = (building.getMaxHitPoints() * Realm.getRealmHealthMod(city));
|
||||||
float percentOfHealth = building.getCurrentHitpoints() / building.getHealthMax();
|
|
||||||
building.setMaxHitPoints(building.getMaxHitPoints() + hPMod);
|
building.setMaxHitPoints(building.getMaxHitPoints() + hPMod);
|
||||||
building.setCurrentHitPoints(building.getMaxHitPoints() * percentOfHealth);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -441,10 +439,8 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
|
|||||||
// }
|
// }
|
||||||
// break;
|
// break;
|
||||||
//}
|
//}
|
||||||
int i = 0;
|
|
||||||
if(i != 0) {
|
LootManager.peddleFate(player,item);
|
||||||
LootManager.peddleFate(player, item);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 30: //water bucket
|
case 30: //water bucket
|
||||||
@@ -542,11 +538,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
|
|||||||
PowersManager.applyPower(player, target, Vector3fImmutable.ZERO, ib.getUseID(), ib.getUseAmount(), true);
|
PowersManager.applyPower(player, target, Vector3fImmutable.ZERO, ib.getUseID(), ib.getUseAmount(), true);
|
||||||
|
|
||||||
itemMan.consume(item);
|
itemMan.consume(item);
|
||||||
} else if(ib.getUUID() > 252128 && ib.getUUID() < 252568){
|
} else //just remove the item at this point
|
||||||
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
|
|
||||||
itemMan.consume(item);
|
|
||||||
}
|
|
||||||
}else //just remove the item at this point
|
|
||||||
itemMan.consume(item);
|
itemMan.consume(item);
|
||||||
|
|
||||||
dispatch = Dispatch.borrow(player, msg);
|
dispatch = Dispatch.borrow(player, msg);
|
||||||
|
|||||||
@@ -44,13 +44,6 @@ public class OpenFriendsCondemnListMsgHandler extends AbstractClientMsgHandler {
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
msg = (OpenFriendsCondemnListMsg) baseMsg;
|
msg = (OpenFriendsCondemnListMsg) baseMsg;
|
||||||
|
|
||||||
sourceBuilding = BuildingManager.getBuildingFromCache(msg.getBuildingID());
|
|
||||||
|
|
||||||
if(sourceBuilding != null && sourceBuilding.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.TOL)){
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
openFriendsCondemnListMsg = new OpenFriendsCondemnListMsg(msg);
|
openFriendsCondemnListMsg = new OpenFriendsCondemnListMsg(msg);
|
||||||
friendListType = Enum.FriendListType.getListTypeByID(msg.getMessageType());
|
friendListType = Enum.FriendListType.getListTypeByID(msg.getMessageType());
|
||||||
|
|
||||||
|
|||||||
@@ -412,9 +412,6 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
break;
|
break;
|
||||||
if (!playerCharacter.getCharItemManager().doesCharOwnThisItem(contract.getObjectUUID()))
|
if (!playerCharacter.getCharItemManager().doesCharOwnThisItem(contract.getObjectUUID()))
|
||||||
break;
|
break;
|
||||||
if(contract.getItemBaseID() == 1035){//saetor shrine override
|
|
||||||
msg.getFirstPlacementInfo().setBlueprintUUID(1720000);
|
|
||||||
}
|
|
||||||
buildingCreated = placeShrine(playerCharacter, origin, msg);
|
buildingCreated = placeShrine(playerCharacter, origin, msg);
|
||||||
break;
|
break;
|
||||||
case BARRACK:
|
case BARRACK:
|
||||||
@@ -803,7 +800,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
treeObject.setObjectTypeMask(MBServerStatics.MASK_BUILDING);
|
treeObject.setObjectTypeMask(MBServerStatics.MASK_BUILDING);
|
||||||
treeObject.setParentZone(zoneObject);
|
treeObject.setParentZone(zoneObject);
|
||||||
MaintenanceManager.setMaintDateTime(treeObject, LocalDateTime.now().plusDays(14));
|
MaintenanceManager.setMaintDateTime(treeObject, LocalDateTime.now().plusDays(7));
|
||||||
|
|
||||||
// Update guild binds and tags
|
// Update guild binds and tags
|
||||||
//load the new city on the clients
|
//load the new city on the clients
|
||||||
@@ -970,7 +967,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create the shrine
|
// Create the shrine
|
||||||
|
|
||||||
return createShrine((PlayerCharacter) cityObject.getTOL().getOwner(), msg.getFirstPlacementInfo(), serverZone);
|
return createShrine((PlayerCharacter) cityObject.getTOL().getOwner(), msg.getFirstPlacementInfo(), serverZone);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1213,7 +1210,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
private boolean createShrine(PlayerCharacter player, PlacementInfo buildingInfo, Zone currentZone) {
|
private boolean createShrine(PlayerCharacter player, PlacementInfo buildingInfo, Zone currentZone) {
|
||||||
|
|
||||||
Blueprint blueprint;
|
Blueprint blueprint;
|
||||||
Building newMesh = null;
|
Building newMesh;
|
||||||
Shrine newShrine;
|
Shrine newShrine;
|
||||||
City city;
|
City city;
|
||||||
ShrineType shrineType;
|
ShrineType shrineType;
|
||||||
@@ -1274,10 +1271,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(blueprint.getName().equals("Nephilim Shrine ") && newMesh != null){
|
|
||||||
newMesh.setName("Chaos Shrine");
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ public class RequestEnterWorldHandler extends AbstractClientMsgHandler {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
player.enteredWorld = false;
|
player.setEnteredWorld(false);
|
||||||
|
|
||||||
Account acc = SessionManager.getAccount(origin);
|
Account acc = SessionManager.getAccount(origin);
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import engine.Enum;
|
|||||||
import engine.InterestManagement.RealmMap;
|
import engine.InterestManagement.RealmMap;
|
||||||
import engine.exception.MsgSendException;
|
import engine.exception.MsgSendException;
|
||||||
import engine.gameManager.BuildingManager;
|
import engine.gameManager.BuildingManager;
|
||||||
import engine.gameManager.ChatManager;
|
|
||||||
import engine.net.Dispatch;
|
import engine.net.Dispatch;
|
||||||
import engine.net.DispatchMessage;
|
import engine.net.DispatchMessage;
|
||||||
import engine.net.client.ClientConnection;
|
import engine.net.client.ClientConnection;
|
||||||
@@ -132,15 +131,14 @@ public class TaxCityMsgHandler extends AbstractClientMsgHandler {
|
|||||||
TaxCityMsg msg;
|
TaxCityMsg msg;
|
||||||
|
|
||||||
player = origin.getPlayerCharacter();
|
player = origin.getPlayerCharacter();
|
||||||
ChatManager.chatSystemInfo(player,"Taxing has been disabled");
|
|
||||||
return false;
|
|
||||||
|
|
||||||
//msg = (TaxCityMsg) baseMsg;
|
|
||||||
|
|
||||||
//ViewTaxes(msg, player);
|
|
||||||
|
|
||||||
|
|
||||||
//return true;
|
msg = (TaxCityMsg) baseMsg;
|
||||||
|
|
||||||
|
ViewTaxes(msg, player);
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -66,8 +66,6 @@ public class UpgradeAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
Logger.error("Attempt to upgrade null building by " + player.getName());
|
Logger.error("Attempt to upgrade null building by " + player.getName());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if(buildingToRank.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.WAREHOUSE))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// Early exit for building that is already ranking
|
// Early exit for building that is already ranking
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
package engine.net.client.msg;
|
package engine.net.client.msg;
|
||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.gameManager.ChatManager;
|
|
||||||
import engine.gameManager.DbManager;
|
import engine.gameManager.DbManager;
|
||||||
import engine.net.*;
|
import engine.net.*;
|
||||||
import engine.net.client.ClientConnection;
|
import engine.net.client.ClientConnection;
|
||||||
@@ -78,98 +77,55 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
if (playerCharacter == null || origin == null || rb == null) {
|
if (playerCharacter == null || origin == null || rb == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
int raceID = playerCharacter.getRaceID();
|
|
||||||
//Check race is met
|
//Check race is met
|
||||||
ConcurrentHashMap<Integer, Boolean> races = rb.getRace();
|
ConcurrentHashMap<Integer, Boolean> races = rb.getRace();
|
||||||
if(runeID != 3007 && runeID != 3014) {//bounty hunter and huntsman
|
if (races.size() > 0) {
|
||||||
if (races.size() > 0) {
|
int raceID = playerCharacter.getRaceID();
|
||||||
|
boolean valid = false;
|
||||||
boolean valid = false;
|
for (int validID : races.keySet()) {
|
||||||
for (int validID : races.keySet()) {
|
if (validID == raceID) {
|
||||||
if (validID == raceID) {
|
|
||||||
valid = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(runeID == 3040)
|
|
||||||
valid = true;
|
valid = true;
|
||||||
|
break;
|
||||||
if(runeID == 2514 && raceID == 1999)
|
|
||||||
valid = true;
|
|
||||||
|
|
||||||
if(runeID == 3036 && raceID == 1999)
|
|
||||||
valid = true;
|
|
||||||
|
|
||||||
if(runeID == 3033 && raceID == 1999)
|
|
||||||
valid = true;
|
|
||||||
|
|
||||||
if (!valid) {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!valid) {
|
||||||
//Check base class is met
|
|
||||||
ConcurrentHashMap<Integer, Boolean> baseClasses = rb.getBaseClass();
|
|
||||||
if (baseClasses.size() > 0) {
|
|
||||||
int baseClassID = playerCharacter.getBaseClassID();
|
|
||||||
boolean valid = false;
|
|
||||||
for (int validID : baseClasses.keySet()) {
|
|
||||||
if (validID == baseClassID) {
|
|
||||||
valid = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(runeID == 3040)
|
|
||||||
valid = true;
|
|
||||||
|
|
||||||
if(runeID == 3036 && raceID == 1999)
|
|
||||||
valid = true;
|
|
||||||
|
|
||||||
if(runeID == 3033 && raceID == 1999)
|
|
||||||
valid = true;
|
|
||||||
|
|
||||||
if(runeID == 3035 && baseClassID == 2501)
|
|
||||||
valid = true;
|
|
||||||
|
|
||||||
if (!valid) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Check promotion class is met
|
|
||||||
ConcurrentHashMap<Integer, Boolean> promotionClasses = rb.getPromotionClass();
|
|
||||||
if (promotionClasses.size() > 0) {
|
|
||||||
int promotionClassID = playerCharacter.getPromotionClassID();
|
|
||||||
boolean valid = false;
|
|
||||||
for (int validID : promotionClasses.keySet()) {
|
|
||||||
if (validID == promotionClassID) {
|
|
||||||
valid = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(runeID == 3040)
|
|
||||||
valid = true;
|
|
||||||
|
|
||||||
if(runeID == 3004 && (playerCharacter.getPromotionClassID() == 2505 || playerCharacter.getPromotionClassID() == 2510))
|
|
||||||
valid = true;
|
|
||||||
|
|
||||||
if(runeID == 3036 && raceID == 1999)
|
|
||||||
valid = true;
|
|
||||||
|
|
||||||
if(runeID == 3033 && raceID == 1999)
|
|
||||||
valid = true;
|
|
||||||
|
|
||||||
if (!valid) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else{
|
|
||||||
if(playerCharacter.getPromotionClassID() == 2519){//priest
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Check base class is met
|
||||||
|
ConcurrentHashMap<Integer, Boolean> baseClasses = rb.getBaseClass();
|
||||||
|
if (baseClasses.size() > 0) {
|
||||||
|
int baseClassID = playerCharacter.getBaseClassID();
|
||||||
|
boolean valid = false;
|
||||||
|
for (int validID : baseClasses.keySet()) {
|
||||||
|
if (validID == baseClassID) {
|
||||||
|
valid = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!valid) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Check promotion class is met
|
||||||
|
ConcurrentHashMap<Integer, Boolean> promotionClasses = rb.getPromotionClass();
|
||||||
|
if (promotionClasses.size() > 0) {
|
||||||
|
int promotionClassID = playerCharacter.getPromotionClassID();
|
||||||
|
boolean valid = false;
|
||||||
|
for (int validID : promotionClasses.keySet()) {
|
||||||
|
if (validID == promotionClassID) {
|
||||||
|
valid = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!valid) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//Check disciplines are met
|
//Check disciplines are met
|
||||||
ArrayList<CharacterRune> runes = playerCharacter.getRunes();
|
ArrayList<CharacterRune> runes = playerCharacter.getRunes();
|
||||||
ConcurrentHashMap<Integer, Boolean> disciplines = rb.getDiscipline();
|
ConcurrentHashMap<Integer, Boolean> disciplines = rb.getDiscipline();
|
||||||
@@ -218,16 +174,7 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
int mod = rba.getModValue();
|
int mod = rba.getModValue();
|
||||||
switch (attrID) {
|
switch (attrID) {
|
||||||
case MBServerStatics.RUNE_COST_ATTRIBUTE_ID:
|
case MBServerStatics.RUNE_COST_ATTRIBUTE_ID:
|
||||||
switch (rb.getName()) {
|
|
||||||
case "Born of the Ethyri":
|
|
||||||
case "Born of the Taripontor":
|
|
||||||
case "Born of the Gwendannen":
|
|
||||||
case "Born of the Invorri":
|
|
||||||
case "Born of the Irydnu":
|
|
||||||
mod = 0;
|
|
||||||
}
|
|
||||||
if (mod > playerCharacter.getUnusedStatPoints()) {
|
if (mod > playerCharacter.getUnusedStatPoints()) {
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
cost = mod;
|
cost = mod;
|
||||||
@@ -285,29 +232,8 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (rb.getName()) {
|
|
||||||
case "Born of the Ethyri":
|
|
||||||
case "Born of the Taripontor":
|
|
||||||
case "Born of the Gwendannen":
|
|
||||||
case "Born of the Invorri":
|
|
||||||
case "Born of the Irydnu":
|
|
||||||
for (CharacterRune charRune : playerCharacter.getRunes()) {
|
|
||||||
RuneBase rb2 = charRune.getRuneBase();
|
|
||||||
switch (rb2.getName()) {
|
|
||||||
case "Born of the Ethyri":
|
|
||||||
case "Born of the Taripontor":
|
|
||||||
case "Born of the Gwendannen":
|
|
||||||
case "Born of the Invorri":
|
|
||||||
case "Born of the Irydnu":
|
|
||||||
ChatManager.chatSystemError(playerCharacter, "You Have Already Applied A Blood Rune");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//if discipline, check number applied
|
//if discipline, check number applied
|
||||||
if (isDiscipline(runeID)) {
|
if (isDiscipline(runeID)) {
|
||||||
//if(playerCharacter.getLevel() == 80)
|
|
||||||
discCount -= 1; // level 80 characters get an extra disc rune
|
|
||||||
if (playerCharacter.getLevel() < 70) {
|
if (playerCharacter.getLevel() < 70) {
|
||||||
if (discCount > 2) {
|
if (discCount > 2) {
|
||||||
return false;
|
return false;
|
||||||
@@ -378,15 +304,7 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
playerCharacter.recalculate();
|
playerCharacter.recalculate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch (rb.getName()) {
|
|
||||||
case "Born of the Ethyri":
|
|
||||||
case "Born of the Taripontor":
|
|
||||||
case "Born of the Gwendannen":
|
|
||||||
case "Born of the Invorri":
|
|
||||||
case "Born of the Irydnu":
|
|
||||||
cost = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (cost > 0) {
|
if (cost > 0) {
|
||||||
ModifyStatMsg msm = new ModifyStatMsg((0 - cost), 0, 3);
|
ModifyStatMsg msm = new ModifyStatMsg((0 - cost), 0, 3);
|
||||||
dispatch = Dispatch.borrow(playerCharacter, msm);
|
dispatch = Dispatch.borrow(playerCharacter, msm);
|
||||||
|
|||||||
@@ -87,11 +87,7 @@ public class CityDataMsg extends ClientNetMsg {
|
|||||||
temp.putInt(cityList.size());
|
temp.putInt(cityList.size());
|
||||||
|
|
||||||
for (City city : cityList)
|
for (City city : cityList)
|
||||||
try {
|
City.serializeForClientMsg(city, temp);
|
||||||
City.serializeForClientMsg(city, temp);
|
|
||||||
}catch(Exception e){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
temp.put((byte) 0); // PAD
|
temp.put((byte) 0); // PAD
|
||||||
|
|
||||||
// Serialize runegates
|
// Serialize runegates
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
package engine.net.client.msg;
|
package engine.net.client.msg;
|
||||||
|
|
||||||
import engine.Enum;
|
|
||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
import engine.net.AbstractConnection;
|
import engine.net.AbstractConnection;
|
||||||
import engine.net.ByteBufferReader;
|
import engine.net.ByteBufferReader;
|
||||||
@@ -43,8 +42,8 @@ public class CityZoneMsg extends ClientNetMsg {
|
|||||||
this.locY = locY;
|
this.locY = locY;
|
||||||
this.locZ = locZ;
|
this.locZ = locZ;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.radiusX = Enum.CityBoundsType.ZONE.extents;
|
this.radiusX = radiusX;
|
||||||
this.radiusZ = Enum.CityBoundsType.ZONE.extents;
|
this.radiusZ = radiusZ;
|
||||||
this.unknown01 = 0;
|
this.unknown01 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
package engine.net.client.msg;
|
package engine.net.client.msg;
|
||||||
|
|
||||||
import engine.Enum;
|
|
||||||
import engine.Enum.*;
|
import engine.Enum.*;
|
||||||
import engine.gameManager.BuildingManager;
|
import engine.gameManager.BuildingManager;
|
||||||
import engine.gameManager.ZoneManager;
|
import engine.gameManager.ZoneManager;
|
||||||
@@ -532,10 +531,7 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
|
|||||||
else if (building.getRank() == building.getBlueprint().getMaxRank())
|
else if (building.getRank() == building.getBlueprint().getMaxRank())
|
||||||
this.upgradeCost = Integer.MAX_VALUE;
|
this.upgradeCost = Integer.MAX_VALUE;
|
||||||
else
|
else
|
||||||
if(building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.WAREHOUSE))
|
this.upgradeCost = building.getBlueprint().getRankCost(Math.min(building.getRank() + 1, 7));
|
||||||
this.upgradeCost = Integer.MAX_VALUE;
|
|
||||||
else
|
|
||||||
this.upgradeCost = building.getBlueprint().getRankCost(Math.min(building.getRank() + 1, 7));
|
|
||||||
|
|
||||||
writer.putInt(this.upgradeCost);
|
writer.putInt(this.upgradeCost);
|
||||||
} else
|
} else
|
||||||
|
|||||||
@@ -601,9 +601,6 @@ public class PlaceAssetMsg extends ClientNetMsg {
|
|||||||
public int getBlueprintUUID() {
|
public int getBlueprintUUID() {
|
||||||
return this.blueprintUUID;
|
return this.blueprintUUID;
|
||||||
}
|
}
|
||||||
public void setBlueprintUUID(int id) {
|
|
||||||
this.blueprintUUID = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vector3fImmutable getLoc() {
|
public Vector3fImmutable getLoc() {
|
||||||
return this.loc;
|
return this.loc;
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ public class RefinerScreenMsg extends ClientNetMsg {
|
|||||||
return this.unknown02;
|
return this.unknown02;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setUnknown02(float value) {
|
public void setUnknown02(int value) {
|
||||||
this.unknown02 = value;
|
this.unknown02 = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ public class TrainMsg extends ClientNetMsg {
|
|||||||
|
|
||||||
if (sk == null)
|
if (sk == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (sk.getSkillsBase().getToken() == 40661438) {
|
if (sk.getSkillsBase().getToken() == 40661438) {
|
||||||
int maxValue = 15;
|
int maxValue = 15;
|
||||||
|
|
||||||
|
|||||||
@@ -9,19 +9,19 @@
|
|||||||
|
|
||||||
package engine.net.client.msg;
|
package engine.net.client.msg;
|
||||||
|
|
||||||
import engine.Enum;
|
|
||||||
import engine.Enum.DispatchChannel;
|
import engine.Enum.DispatchChannel;
|
||||||
import engine.Enum.GuildHistoryType;
|
import engine.Enum.GuildHistoryType;
|
||||||
import engine.InterestManagement.InterestManager;
|
|
||||||
import engine.exception.MsgSendException;
|
import engine.exception.MsgSendException;
|
||||||
import engine.gameManager.*;
|
import engine.gameManager.BuildingManager;
|
||||||
|
import engine.gameManager.DbManager;
|
||||||
|
import engine.gameManager.GuildManager;
|
||||||
|
import engine.gameManager.SessionManager;
|
||||||
import engine.math.Vector3fImmutable;
|
import engine.math.Vector3fImmutable;
|
||||||
import engine.net.*;
|
import engine.net.*;
|
||||||
import engine.net.client.ClientConnection;
|
import engine.net.client.ClientConnection;
|
||||||
import engine.net.client.Protocol;
|
import engine.net.client.Protocol;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import engine.util.BoxTracker;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
@@ -137,29 +137,6 @@ public class VendorDialogMsg extends ClientNetMsg {
|
|||||||
msg.updateMessage(3, vd);
|
msg.updateMessage(3, vd);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(contract.getObjectUUID() == 1502040){
|
|
||||||
if(!playerCharacter.getTimestamps().containsKey("lastBoxChange"))
|
|
||||||
playerCharacter.getTimestamps().put("lastBoxChange",System.currentTimeMillis() - 1000);
|
|
||||||
|
|
||||||
if(playerCharacter.getTimeStamp("lastBoxChange") + 30000L > System.currentTimeMillis()) {
|
|
||||||
ChatManager.chatSystemInfo(playerCharacter, "You Must Wait To Promote Again.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(playerCharacter.isBoxed == false) {
|
|
||||||
ChatManager.chatSystemInfo(playerCharacter, "You Are Already The Active Character.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
playerCharacter.getTimestamps().put("lastBoxChange",System.currentTimeMillis());
|
|
||||||
|
|
||||||
for(PlayerCharacter newlyBoxed : BoxTracker.getPlayers(playerCharacter.getClientConnection().machineID)){
|
|
||||||
newlyBoxed.isBoxed = true;
|
|
||||||
}
|
|
||||||
playerCharacter.isBoxed = false;
|
|
||||||
InterestManager.setObjectDirty(playerCharacter);
|
|
||||||
playerCharacter.removeEffectBySource(Enum.EffectSourceType.DeathShroud,50,true);
|
|
||||||
}
|
|
||||||
Dispatch dispatch = Dispatch.borrow(playerCharacter, msg);
|
Dispatch dispatch = Dispatch.borrow(playerCharacter, msg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
|
||||||
@@ -571,36 +548,23 @@ public class VendorDialogMsg extends ClientNetMsg {
|
|||||||
|
|
||||||
// verify race valid for profession
|
// verify race valid for profession
|
||||||
Race race = pc.getRace();
|
Race race = pc.getRace();
|
||||||
if(race.getRaceRuneID() == 1999 && (promoID == 2512 || promoID == 2511)) {
|
if (race == null || !promo.isAllowedRune(race.getToken())) {
|
||||||
|
// TODO send client promotion error
|
||||||
} else if(promo.getName().equals("Ranger")&& race.getName().equals("Saetor"))
|
return;
|
||||||
{
|
|
||||||
|
|
||||||
}else {
|
|
||||||
if (race == null || !promo.isAllowedRune(race.getToken())) {
|
|
||||||
// TODO send client promotion error
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// verify baseclass valid for profession
|
// verify baseclass valid for profession
|
||||||
BaseClass bc = pc.getBaseClass();
|
BaseClass bc = pc.getBaseClass();
|
||||||
if(promo.getName().equals("Druid") && (bc.getName().equals("Rogue") || bc.getName().equals("Mage"))) { //allow rogue and mage druids
|
if (bc == null || !promo.isAllowedRune(bc.getToken())) {
|
||||||
|
// TODO send client promotion error
|
||||||
}
|
return;
|
||||||
else {
|
|
||||||
if (bc == null || !promo.isAllowedRune(bc.getToken())) {
|
|
||||||
// TODO send client promotion error
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// verify gender
|
// verify gender
|
||||||
if(race.getName().equals("Saetor") == false) { //saetors can promote to huntress and fury
|
if (promoID == 2511 && pc.isMale()) // Fury
|
||||||
if (promoID == 2511 && pc.isMale()) // Fury
|
return;
|
||||||
return;
|
if (promoID == 2512 && pc.isMale()) // Huntress
|
||||||
if (promoID == 2512 && pc.isMale()) // Huntress
|
return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (promoID == 2517 && !pc.isMale()) // Warlock
|
if (promoID == 2517 && !pc.isMale()) // Warlock
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ import engine.net.ByteBufferReader;
|
|||||||
import engine.net.ByteBufferWriter;
|
import engine.net.ByteBufferWriter;
|
||||||
import engine.net.client.Protocol;
|
import engine.net.client.Protocol;
|
||||||
import engine.net.client.msg.ClientNetMsg;
|
import engine.net.client.msg.ClientNetMsg;
|
||||||
import engine.objects.Race;
|
|
||||||
|
|
||||||
public class CommitNewCharacterMsg extends ClientNetMsg {
|
public class CommitNewCharacterMsg extends ClientNetMsg {
|
||||||
|
|
||||||
@@ -176,7 +175,7 @@ public class CommitNewCharacterMsg extends ClientNetMsg {
|
|||||||
|
|
||||||
public int getRace() {
|
public int getRace() {
|
||||||
for (int i = 0; i < 23; i++)
|
for (int i = 0; i < 23; i++)
|
||||||
if(Race.getRace(this.runes[i]) != null)
|
if (this.runes[i] > 1999 && this.runes[i] < 2030)
|
||||||
return this.runes[i];
|
return this.runes[i];
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
|||||||
protected AtomicFloat mana = new AtomicFloat();
|
protected AtomicFloat mana = new AtomicFloat();
|
||||||
protected float manaMax; // Health/Mana/Stamina
|
protected float manaMax; // Health/Mana/Stamina
|
||||||
protected AtomicBoolean isAlive = new AtomicBoolean(true);
|
protected AtomicBoolean isAlive = new AtomicBoolean(true);
|
||||||
protected Resists resists = null;
|
protected Resists resists = new Resists("Genric");
|
||||||
protected ConcurrentHashMap<String, JobContainer> timers;
|
protected ConcurrentHashMap<String, JobContainer> timers;
|
||||||
protected ConcurrentHashMap<String, Long> timestamps;
|
protected ConcurrentHashMap<String, Long> timestamps;
|
||||||
protected int atrHandOne;
|
protected int atrHandOne;
|
||||||
@@ -678,22 +678,12 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public final Resists getResists() {
|
public final Resists getResists() {
|
||||||
|
if (this.resists == null)
|
||||||
if(this.getObjectType().equals(GameObjectType.Mob)){
|
return Resists.getResists(0);
|
||||||
return ((Mob)this).mobResists;
|
return this.resists;
|
||||||
}else {
|
|
||||||
|
|
||||||
if (this.resists == null)
|
|
||||||
return Resists.getResists(0);
|
|
||||||
|
|
||||||
return this.resists;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void setResists(final Resists value) {
|
public final void setResists(final Resists value) {
|
||||||
if(this.getObjectType().equals(GameObjectType.Mob))
|
|
||||||
return;
|
|
||||||
|
|
||||||
this.resists = value;
|
this.resists = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1004,7 +994,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
|||||||
if (this.takeOffTime != 0)
|
if (this.takeOffTime != 0)
|
||||||
return super.getLoc();
|
return super.getLoc();
|
||||||
|
|
||||||
return super.getLoc().moveTowards(this.endLoc, this.getSpeed() * ((System.currentTimeMillis() - this.lastSetLocUpdate) * .001f));
|
return super.getLoc().moveTowards(this.endLoc, this.getSpeed() * ((System.currentTimeMillis() - lastSetLocUpdate) * .001f));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1114,6 +1104,23 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public final void setCombatTarget(final AbstractWorldObject value) {
|
public final void setCombatTarget(final AbstractWorldObject value) {
|
||||||
|
if(this.getObjectTypeMask() == 2050) {//MOB?
|
||||||
|
if (value == null) {
|
||||||
|
if (this.isCombat()) {
|
||||||
|
this.setCombat(false);
|
||||||
|
UpdateStateMsg rwss = new UpdateStateMsg();
|
||||||
|
rwss.setPlayer(this);
|
||||||
|
DispatchMessage.sendToAllInRange(this, rwss);
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
if (!this.isCombat()) {
|
||||||
|
this.setCombat(true);
|
||||||
|
UpdateStateMsg rwss = new UpdateStateMsg();
|
||||||
|
rwss.setPlayer(this);
|
||||||
|
DispatchMessage.sendToAllInRange(this, rwss);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
this.combatTarget = value;
|
this.combatTarget = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1188,9 +1195,11 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public final float modifyHealth(float value,final AbstractCharacter attacker,final boolean fromCost) {
|
public final float modifyHealth(
|
||||||
if(attacker.getObjectType().equals(GameObjectType.PlayerCharacter))
|
final float value,
|
||||||
value *= ((PlayerCharacter)attacker).ZergMultiplier;
|
final AbstractCharacter attacker,
|
||||||
|
final boolean fromCost) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -1246,11 +1255,9 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public final float modifyMana(
|
public final float modifyMana(
|
||||||
float value,
|
final float value,
|
||||||
final AbstractCharacter attacker
|
final AbstractCharacter attacker
|
||||||
) {
|
) {
|
||||||
if(attacker.getObjectType().equals(GameObjectType.PlayerCharacter))
|
|
||||||
value *= ((PlayerCharacter)attacker).ZergMultiplier;
|
|
||||||
return this.modifyMana(value, attacker, false);
|
return this.modifyMana(value, attacker, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1287,11 +1294,9 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
public final float modifyStamina(
|
public final float modifyStamina(
|
||||||
float value,
|
final float value,
|
||||||
final AbstractCharacter attacker
|
final AbstractCharacter attacker
|
||||||
) {
|
) {
|
||||||
if(attacker.getObjectType().equals(GameObjectType.PlayerCharacter))
|
|
||||||
value *= ((PlayerCharacter)attacker).ZergMultiplier;
|
|
||||||
return this.modifyStamina(value, attacker, false);
|
return this.modifyStamina(value, attacker, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ import engine.Enum.GameObjectType;
|
|||||||
import engine.Enum.ModType;
|
import engine.Enum.ModType;
|
||||||
import engine.Enum.SourceType;
|
import engine.Enum.SourceType;
|
||||||
import engine.InterestManagement.WorldGrid;
|
import engine.InterestManagement.WorldGrid;
|
||||||
import engine.gameManager.DbManager;
|
|
||||||
import engine.gameManager.ZoneManager;
|
import engine.gameManager.ZoneManager;
|
||||||
import engine.math.Vector3fImmutable;
|
import engine.math.Vector3fImmutable;
|
||||||
import engine.mobileAI.Threads.MobAIThread;
|
import engine.mobileAI.Threads.MobAIThread;
|
||||||
@@ -33,7 +32,7 @@ public abstract class AbstractIntelligenceAgent extends AbstractCharacter {
|
|||||||
protected Vector3fImmutable lastBindLoc;
|
protected Vector3fImmutable lastBindLoc;
|
||||||
public boolean assist = false;
|
public boolean assist = false;
|
||||||
public Enum.AIAgentType agentType = Enum.AIAgentType.MOBILE;
|
public Enum.AIAgentType agentType = Enum.AIAgentType.MOBILE;
|
||||||
public boolean isPlayerGuard = false;
|
|
||||||
public AbstractCharacter guardCaptain;
|
public AbstractCharacter guardCaptain;
|
||||||
public EnumBitSet<Enum.MonsterType> notEnemy = EnumBitSet.noneOf(Enum.MonsterType.class);
|
public EnumBitSet<Enum.MonsterType> notEnemy = EnumBitSet.noneOf(Enum.MonsterType.class);
|
||||||
public EnumBitSet<Enum.MonsterType> enemy = EnumBitSet.noneOf(Enum.MonsterType.class);
|
public EnumBitSet<Enum.MonsterType> enemy = EnumBitSet.noneOf(Enum.MonsterType.class);
|
||||||
@@ -154,7 +153,6 @@ public abstract class AbstractIntelligenceAgent extends AbstractCharacter {
|
|||||||
if ((this.agentType.equals(Enum.AIAgentType.PET))) { //delete summoned pet
|
if ((this.agentType.equals(Enum.AIAgentType.PET))) { //delete summoned pet
|
||||||
|
|
||||||
WorldGrid.RemoveWorldObject(this);
|
WorldGrid.RemoveWorldObject(this);
|
||||||
DbManager.removeFromCache(this);
|
|
||||||
|
|
||||||
if (this.getObjectType() == GameObjectType.Mob)
|
if (this.getObjectType() == GameObjectType.Mob)
|
||||||
if (((Mob) this).getParentZone() != null)
|
if (((Mob) this).getParentZone() != null)
|
||||||
|
|||||||
@@ -245,7 +245,7 @@ public abstract class AbstractWorldObject extends AbstractGameObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
JobContainer jc = new JobContainer(ntj);
|
JobContainer jc = new JobContainer(ntj);
|
||||||
Effect eff = new Effect(jc, eb, trains,true);
|
Effect eff = new Effect(jc, eb, trains);
|
||||||
if (isStatic)
|
if (isStatic)
|
||||||
eff.setIsStatic(isStatic);
|
eff.setIsStatic(isStatic);
|
||||||
this.effects.put(name, eff);
|
this.effects.put(name, eff);
|
||||||
|
|||||||
@@ -17,7 +17,10 @@ import engine.InterestManagement.HeightMap;
|
|||||||
import engine.InterestManagement.WorldGrid;
|
import engine.InterestManagement.WorldGrid;
|
||||||
import engine.db.archive.BaneRecord;
|
import engine.db.archive.BaneRecord;
|
||||||
import engine.db.archive.DataWarehouse;
|
import engine.db.archive.DataWarehouse;
|
||||||
import engine.gameManager.*;
|
import engine.gameManager.BuildingManager;
|
||||||
|
import engine.gameManager.ChatManager;
|
||||||
|
import engine.gameManager.DbManager;
|
||||||
|
import engine.gameManager.ZoneManager;
|
||||||
import engine.job.JobScheduler;
|
import engine.job.JobScheduler;
|
||||||
import engine.jobs.ActivateBaneJob;
|
import engine.jobs.ActivateBaneJob;
|
||||||
import engine.jobs.BaneDefaultTimeJob;
|
import engine.jobs.BaneDefaultTimeJob;
|
||||||
@@ -32,8 +35,6 @@ import org.pmw.tinylog.Logger;
|
|||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.time.DayOfWeek;
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
@@ -51,8 +52,6 @@ public final class Bane {
|
|||||||
// Internal cache for banes
|
// Internal cache for banes
|
||||||
private ActivateBaneJob activateBaneJob;
|
private ActivateBaneJob activateBaneJob;
|
||||||
|
|
||||||
public int capSize;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ResultSet Constructor
|
* ResultSet Constructor
|
||||||
*/
|
*/
|
||||||
@@ -107,17 +106,10 @@ public final class Bane {
|
|||||||
|
|
||||||
if (this.liveDate == null)
|
if (this.liveDate == null)
|
||||||
setDefaultTime();
|
setDefaultTime();
|
||||||
|
|
||||||
this.capSize = ZergManager.getBaneCap(this.getCity().getGuild());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean summonBanestone(PlayerCharacter player, ClientConnection origin, int rank) {
|
public static boolean summonBanestone(PlayerCharacter player, ClientConnection origin, int rank) {
|
||||||
|
|
||||||
//if(LocalDateTime.now().getDayOfWeek().equals(DayOfWeek.WEDNESDAY) == false && LocalDateTime.now().getDayOfWeek().equals(DayOfWeek.THURSDAY) == false){
|
|
||||||
// ChatManager.chatSystemError(player, "You can only place banes on Wednesdays and Thursdays.");
|
|
||||||
// return false;
|
|
||||||
//}
|
|
||||||
|
|
||||||
Guild baningGuild;
|
Guild baningGuild;
|
||||||
Zone cityZone;
|
Zone cityZone;
|
||||||
City targetCity;
|
City targetCity;
|
||||||
@@ -211,28 +203,18 @@ public final class Bane {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(Guild subGuild : baningGuild.getNation().getSubGuildList()) {
|
|
||||||
if (getBaneByAttackerGuild(subGuild) != null) {
|
|
||||||
PlaceAssetMsg.sendPlaceAssetError(player.getClientConnection(), 1, "Your Nation Already Has a Bane Placed");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(targetCity.getGuild().getNation().getSubGuildList() != null) {
|
|
||||||
|
|
||||||
for (Guild subGuild : targetCity.getGuild().getNation().getSubGuildList()) {
|
|
||||||
if (getBaneByAttackerGuild(subGuild) != null) {
|
|
||||||
PlaceAssetMsg.sendPlaceAssetError(player.getClientConnection(), 1, "This Nation Already Has a Bane Placed On It");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Blueprint blueprint = Blueprint.getBlueprint(24300); // Banestone
|
Blueprint blueprint = Blueprint.getBlueprint(24300); // Banestone
|
||||||
|
|
||||||
//Let's drop a banestone!
|
//Let's drop a banestone!
|
||||||
|
|
||||||
Vector3fImmutable localLocation = ZoneManager.worldToLocal(player.getLoc(), cityZone);
|
Vector3fImmutable localLocation = ZoneManager.worldToLocal(player.getLoc(), cityZone);
|
||||||
|
|
||||||
|
if (localLocation == null) {
|
||||||
|
PlaceAssetMsg.sendPlaceAssetError(player.getClientConnection(), 1, "A Serious error has occurred. Please post details for to ensure transaction integrity");
|
||||||
|
Logger.info("Failed to Convert World coordinates to local zone coordinates");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Building stone = DbManager.BuildingQueries.CREATE_BUILDING(
|
Building stone = DbManager.BuildingQueries.CREATE_BUILDING(
|
||||||
cityZone.getObjectUUID(), player.getObjectUUID(), blueprint.getName(), blueprint.getBlueprintUUID(),
|
cityZone.getObjectUUID(), player.getObjectUUID(), blueprint.getName(), blueprint.getBlueprintUUID(),
|
||||||
localLocation, 1.0f, blueprint.getMaxHealth(rank), ProtectionState.PROTECTED, 0, rank,
|
localLocation, 1.0f, blueprint.getMaxHealth(rank), ProtectionState.PROTECTED, 0, rank,
|
||||||
@@ -243,7 +225,6 @@ public final class Bane {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
stone.addEffectBit((1 << 19));
|
stone.addEffectBit((1 << 19));
|
||||||
stone.setMaxHitPoints(stone.getBlueprint().getMaxHealth(stone.getRank()));
|
stone.setMaxHitPoints(stone.getBlueprint().getMaxHealth(stone.getRank()));
|
||||||
stone.setCurrentHitPoints(stone.getMaxHitPoints());
|
stone.setCurrentHitPoints(stone.getMaxHitPoints());
|
||||||
@@ -285,12 +266,6 @@ public final class Bane {
|
|||||||
BaneRecord baneRecord = BaneRecord.borrow(bane, Enum.RecordEventType.PENDING);
|
BaneRecord baneRecord = BaneRecord.borrow(bane, Enum.RecordEventType.PENDING);
|
||||||
DataWarehouse.pushToWarehouse(baneRecord);
|
DataWarehouse.pushToWarehouse(baneRecord);
|
||||||
|
|
||||||
if(bane.getCity().getTOL().getRank() == 8)
|
|
||||||
bane.capSize = 40;
|
|
||||||
else
|
|
||||||
bane.capSize = 20;
|
|
||||||
|
|
||||||
bane.getCity().setSiegesWithstood(bane.capSize);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -367,12 +342,6 @@ public final class Bane {
|
|||||||
|
|
||||||
newBane = DbManager.BaneQueries.LOAD_BANE(city.getObjectUUID());
|
newBane = DbManager.BaneQueries.LOAD_BANE(city.getObjectUUID());
|
||||||
|
|
||||||
if(newBane.getCity().getTOL().getRank() == 8)
|
|
||||||
newBane.capSize = 40;
|
|
||||||
else
|
|
||||||
newBane.capSize = 20;
|
|
||||||
|
|
||||||
newBane.getCity().setSiegesWithstood(newBane.capSize);
|
|
||||||
return newBane;
|
return newBane;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -607,10 +576,6 @@ public final class Bane {
|
|||||||
|
|
||||||
DispatchMessage.dispatchMsgToAll(msg);
|
DispatchMessage.dispatchMsgToAll(msg);
|
||||||
}
|
}
|
||||||
for(AbstractWorldObject awo : WorldGrid.getObjectsInRangePartial(this.getCity().loc,1500,MBServerStatics.MASK_BUILDING)){
|
|
||||||
Building building = (Building)awo;
|
|
||||||
if(building.setOwner(this.getOwner()));
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case DESTROY:
|
case DESTROY:
|
||||||
|
|
||||||
|
|||||||
@@ -30,15 +30,15 @@ public class Blueprint {
|
|||||||
public static HashMap<Integer, Blueprint> _meshLookup = new HashMap<>();
|
public static HashMap<Integer, Blueprint> _meshLookup = new HashMap<>();
|
||||||
private static HashMap<Integer, Blueprint> _blueprints = new HashMap<>();
|
private static HashMap<Integer, Blueprint> _blueprints = new HashMap<>();
|
||||||
private static HashMap<Integer, Integer> _doorNumbers = new HashMap<>();
|
private static HashMap<Integer, Integer> _doorNumbers = new HashMap<>();
|
||||||
private int blueprintUUID;
|
private final int blueprintUUID;
|
||||||
private final String name;
|
private final String name;
|
||||||
private final BuildingGroup buildingGroup;
|
private final BuildingGroup buildingGroup;
|
||||||
private final int icon;
|
private final int icon;
|
||||||
private final int maxRank;
|
private final int maxRank;
|
||||||
private final int maxSlots;
|
private final int maxSlots;
|
||||||
public int rank1UUID;
|
private final int rank1UUID;
|
||||||
public int rank3UUID;
|
private final int rank3UUID;
|
||||||
public int rank7UUID;
|
private final int rank7UUID;
|
||||||
private final int destroyedUUID;
|
private final int destroyedUUID;
|
||||||
|
|
||||||
private Blueprint() {
|
private Blueprint() {
|
||||||
@@ -167,7 +167,10 @@ public class Blueprint {
|
|||||||
// based upon the building's current rank
|
// based upon the building's current rank
|
||||||
|
|
||||||
public static int getNpcMaintCost(int rank) {
|
public static int getNpcMaintCost(int rank) {
|
||||||
int maintCost = 0;
|
int maintCost = Integer.MAX_VALUE;
|
||||||
|
|
||||||
|
maintCost = (9730 * rank) + 1890;
|
||||||
|
|
||||||
return maintCost;
|
return maintCost;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -310,14 +313,10 @@ public class Blueprint {
|
|||||||
|
|
||||||
// Early exit for buildings with single or no slots
|
// Early exit for buildings with single or no slots
|
||||||
|
|
||||||
if(this.buildingGroup.isTrainerBuilding() && currentRank > 0){
|
if (this.maxSlots <= 1)
|
||||||
return 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.maxSlots <= 1 && this.buildingGroup.equals(BuildingGroup.TOL) == false)
|
|
||||||
return maxSlots;
|
return maxSlots;
|
||||||
|
|
||||||
if (this.maxRank == 1 && currentRank == 1&& this.buildingGroup.equals(BuildingGroup.TOL) == false)
|
if (this.maxRank == 1 && currentRank == 1)
|
||||||
return getMaxSlots();
|
return getMaxSlots();
|
||||||
|
|
||||||
switch (currentRank) {
|
switch (currentRank) {
|
||||||
@@ -329,22 +328,20 @@ public class Blueprint {
|
|||||||
case 3:
|
case 3:
|
||||||
case 4:
|
case 4:
|
||||||
case 5:
|
case 5:
|
||||||
|
case 6:
|
||||||
availableSlots = 2;
|
availableSlots = 2;
|
||||||
break;
|
break;
|
||||||
case 6:
|
|
||||||
case 7:
|
case 7:
|
||||||
availableSlots = 3;
|
availableSlots = 3;
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
availableSlots = 3;
|
availableSlots = 1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
availableSlots = 0;
|
availableSlots = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(this.buildingGroup.equals(BuildingGroup.TOL)){
|
|
||||||
availableSlots += 1;
|
|
||||||
}
|
|
||||||
return availableSlots;
|
return availableSlots;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -587,9 +584,7 @@ public class Blueprint {
|
|||||||
public int getBlueprintUUID() {
|
public int getBlueprintUUID() {
|
||||||
return blueprintUUID;
|
return blueprintUUID;
|
||||||
}
|
}
|
||||||
public void setBlueprintUUID(int id) {
|
|
||||||
this.blueprintUUID = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object object) {
|
public boolean equals(Object object) {
|
||||||
@@ -614,10 +609,17 @@ public class Blueprint {
|
|||||||
|
|
||||||
switch (this.buildingGroup) {
|
switch (this.buildingGroup) {
|
||||||
case TOL:
|
case TOL:
|
||||||
maintCost = 3000000;
|
case BARRACK:
|
||||||
|
maintCost = (61500 * rank) + 19500;
|
||||||
|
break;
|
||||||
|
case SPIRE:
|
||||||
|
maintCost = (4800 * rank) + 1200;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
maintCost = 0;
|
if (maxRank == 1)
|
||||||
|
maintCost = 22500;
|
||||||
|
else
|
||||||
|
maintCost = (15900 * rank) + 3300;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ package engine.objects;
|
|||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.Enum.*;
|
import engine.Enum.*;
|
||||||
import engine.InterestManagement.HeightMap;
|
import engine.InterestManagement.HeightMap;
|
||||||
import engine.InterestManagement.InterestManager;
|
|
||||||
import engine.InterestManagement.RealmMap;
|
import engine.InterestManagement.RealmMap;
|
||||||
import engine.InterestManagement.WorldGrid;
|
import engine.InterestManagement.WorldGrid;
|
||||||
import engine.db.archive.CityRecord;
|
import engine.db.archive.CityRecord;
|
||||||
@@ -395,7 +394,7 @@ public class Building extends AbstractWorldObject {
|
|||||||
this.rank = newRank;
|
this.rank = newRank;
|
||||||
|
|
||||||
// New rank means new mesh
|
// New rank means new mesh
|
||||||
int oldMeshID = this.meshUUID;
|
|
||||||
newMeshUUID = this.getBlueprint().getMeshForRank(this.rank);
|
newMeshUUID = this.getBlueprint().getMeshForRank(this.rank);
|
||||||
this.meshUUID = newMeshUUID;
|
this.meshUUID = newMeshUUID;
|
||||||
|
|
||||||
@@ -429,15 +428,6 @@ public class Building extends AbstractWorldObject {
|
|||||||
BuildingManager.cleanupHirelings(this);
|
BuildingManager.cleanupHirelings(this);
|
||||||
|
|
||||||
this.isDeranking.compareAndSet(true, false);
|
this.isDeranking.compareAndSet(true, false);
|
||||||
|
|
||||||
if(oldMeshID != this.meshUUID) {
|
|
||||||
//move NPCs to new slot locations if the mesh was changed and force reload them
|
|
||||||
int index = 0;
|
|
||||||
for (AbstractCharacter hireling : this.hirelings.keySet()) {
|
|
||||||
hireling.setLoc(BuildingManager._slotLocations.get(newMeshUUID).get(index).getLocation());
|
|
||||||
InterestManager.reloadCharacter(hireling,false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final int getOwnerUUID() {
|
public final int getOwnerUUID() {
|
||||||
@@ -1010,10 +1000,7 @@ public class Building extends AbstractWorldObject {
|
|||||||
public final boolean setStrongboxValue(int newValue) {
|
public final boolean setStrongboxValue(int newValue) {
|
||||||
|
|
||||||
boolean success = true;
|
boolean success = true;
|
||||||
if(this.isOwnerIsNPC()) {
|
|
||||||
newValue = 0;
|
|
||||||
this.setStrongboxValue(0);
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
DbManager.BuildingQueries.SET_PROPERTY(this, "currentGold", newValue);
|
DbManager.BuildingQueries.SET_PROPERTY(this, "currentGold", newValue);
|
||||||
this._strongboxValue = newValue;
|
this._strongboxValue = newValue;
|
||||||
@@ -1048,14 +1035,13 @@ public class Building extends AbstractWorldObject {
|
|||||||
|
|
||||||
// *** Refactor: Can't we just use setRank() for this?
|
// *** Refactor: Can't we just use setRank() for this?
|
||||||
|
|
||||||
public final void rebuildMine(int maxHP) {
|
public final void rebuildMine() {
|
||||||
this.setRank(1);
|
this.setRank(1);
|
||||||
this.meshUUID = this.getBlueprint().getMeshForRank(this.rank);
|
this.meshUUID = this.getBlueprint().getMeshForRank(this.rank);
|
||||||
|
|
||||||
// New rank mean new max hitpoints.
|
// New rank mean new max hitpoints.
|
||||||
|
|
||||||
//this.healthMax = this.getBlueprint().getMaxHealth(this.rank);
|
this.healthMax = this.getBlueprint().getMaxHealth(this.rank);
|
||||||
this.healthMax = maxHP;
|
|
||||||
this.setCurrentHitPoints(this.healthMax);
|
this.setCurrentHitPoints(this.healthMax);
|
||||||
this.getBounds().setBounds(this);
|
this.getBounds().setBounds(this);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,14 +12,16 @@ package engine.objects;
|
|||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
import engine.Enum.ItemType;
|
import engine.Enum.ItemType;
|
||||||
import engine.gameManager.*;
|
import engine.gameManager.BuildingManager;
|
||||||
|
import engine.gameManager.ChatManager;
|
||||||
|
import engine.gameManager.ConfigManager;
|
||||||
|
import engine.gameManager.DbManager;
|
||||||
import engine.math.Vector3fImmutable;
|
import engine.math.Vector3fImmutable;
|
||||||
import engine.net.Dispatch;
|
import engine.net.Dispatch;
|
||||||
import engine.net.DispatchMessage;
|
import engine.net.DispatchMessage;
|
||||||
import engine.net.client.ClientConnection;
|
import engine.net.client.ClientConnection;
|
||||||
import engine.net.client.ClientMessagePump;
|
import engine.net.client.ClientMessagePump;
|
||||||
import engine.net.client.msg.*;
|
import engine.net.client.msg.*;
|
||||||
import engine.powers.poweractions.AbstractPowerAction;
|
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
@@ -70,8 +72,6 @@ public class CharacterItemManager {
|
|||||||
*/
|
*/
|
||||||
private byte equipVer = (byte) 0;
|
private byte equipVer = (byte) 0;
|
||||||
|
|
||||||
public boolean updateLock = false;
|
|
||||||
|
|
||||||
public CharacterItemManager(AbstractCharacter ac) {
|
public CharacterItemManager(AbstractCharacter ac) {
|
||||||
super();
|
super();
|
||||||
this.absCharacter = ac;
|
this.absCharacter = ac;
|
||||||
@@ -641,7 +641,6 @@ public class CharacterItemManager {
|
|||||||
|
|
||||||
dispatch = Dispatch.borrow(other, utwm);
|
dispatch = Dispatch.borrow(other, utwm);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.PRIMARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.PRIMARY);
|
||||||
stripTempEnchants(i);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1057,7 +1056,7 @@ public class CharacterItemManager {
|
|||||||
i.addToCache();
|
i.addToCache();
|
||||||
|
|
||||||
calculateWeights();
|
calculateWeights();
|
||||||
stripTempEnchants(i);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1202,17 +1201,8 @@ public class CharacterItemManager {
|
|||||||
i.addToCache();
|
i.addToCache();
|
||||||
|
|
||||||
calculateWeights();
|
calculateWeights();
|
||||||
stripTempEnchants(i);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void stripTempEnchants(Item i) {
|
return true;
|
||||||
//i.clearEffects();
|
|
||||||
for (String name : i.getEffects().keySet()) {
|
|
||||||
Effect eff = i.getEffects().get(name);
|
|
||||||
if (!eff.isStatic())
|
|
||||||
i.endEffect(name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Used for buying MobEquipment from NPC
|
//Used for buying MobEquipment from NPC
|
||||||
@@ -1243,7 +1233,7 @@ public class CharacterItemManager {
|
|||||||
|
|
||||||
// This adds item to inventory for loot. Validity checks already handled
|
// This adds item to inventory for loot. Validity checks already handled
|
||||||
public synchronized boolean addItemToInventory(Item i) {
|
public synchronized boolean addItemToInventory(Item i) {
|
||||||
if (i.getItemBase().getType().equals(ItemType.GOLD)) {
|
if (i.getItemBase().getType().equals(ItemType.GOLD))
|
||||||
if (this.absCharacter.getObjectType() == GameObjectType.Mob) {
|
if (this.absCharacter.getObjectType() == GameObjectType.Mob) {
|
||||||
if (this.goldInventory == null)
|
if (this.goldInventory == null)
|
||||||
loadGoldItems();
|
loadGoldItems();
|
||||||
@@ -1254,39 +1244,19 @@ public class CharacterItemManager {
|
|||||||
updateInventory();
|
updateInventory();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} //else if (i.getItemBase().getType().equals(ItemType.RESOURCE)) {
|
|
||||||
// if(this.inventoryContainsResource(i)){
|
|
||||||
// Item resource = getResource(i);
|
|
||||||
// if(resource != null){
|
|
||||||
// resource.setNumOfItems(resource.getNumOfItems() + i.getNumOfItems());
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
// }
|
|
||||||
|
|
||||||
this.inventory.add(i);
|
this.inventory.add(i);
|
||||||
this.itemIDtoType.put(i.getObjectUUID(), i.getObjectType().ordinal());
|
this.itemIDtoType.put(i.getObjectUUID(), i.getObjectType().ordinal());
|
||||||
|
|
||||||
|
ItemBase ib = i.getItemBase();
|
||||||
|
if (ib != null)
|
||||||
|
this.inventoryWeight += ib.getWeight();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean inventoryContainsResource(Item resource) {
|
|
||||||
for(Item i : this.inventory){
|
|
||||||
if(i.getItemBaseID() == resource.getItemBaseID())
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Item getResource(Item resource) {
|
|
||||||
for(Item i : this.inventory){
|
|
||||||
if(i.getItemBaseID() == resource.getItemBaseID())
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
//called for adding gold of a specified amount
|
//called for adding gold of a specified amount
|
||||||
public synchronized boolean addItemToInventory(Item i, int amount) {
|
public synchronized boolean addItemToInventory(Item i, int amount) {
|
||||||
if (i.getItemBase().getType().equals(ItemType.GOLD))
|
if (i.getItemBase().getType().equals(ItemType.GOLD))
|
||||||
@@ -1360,10 +1330,8 @@ public class CharacterItemManager {
|
|||||||
|
|
||||||
Item gold = this.getGoldInventory();
|
Item gold = this.getGoldInventory();
|
||||||
|
|
||||||
if (cost <= 0 || (gold.getNumOfItems() - cost) < 0){
|
if (cost <= 0 || (gold.getNumOfItems() - cost) < 0)
|
||||||
ChatManager.chatSystemError((PlayerCharacter)this.getOwner(),"Not Enough Gold: " + "COST: " + cost);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (this.getOwner() != null && this.getOwner().getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
if (this.getOwner() != null && this.getOwner().getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
||||||
@@ -1377,6 +1345,7 @@ public class CharacterItemManager {
|
|||||||
// if the NPC is not slotted.
|
// if the NPC is not slotted.
|
||||||
|
|
||||||
if (vendorBuilding == null) {
|
if (vendorBuilding == null) {
|
||||||
|
|
||||||
return this.modifyInventoryGold(-cost);
|
return this.modifyInventoryGold(-cost);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1388,31 +1357,31 @@ public class CharacterItemManager {
|
|||||||
if (pc.getClientConnection() != null)
|
if (pc.getClientConnection() != null)
|
||||||
ErrorPopupMsg.sendErrorPopup(pc, 206);
|
ErrorPopupMsg.sendErrorPopup(pc, 206);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Update strongbox and inventory gold
|
// Update strongbox and inventory gold
|
||||||
if (!this.modifyInventoryGold(-cost)) {
|
if (!this.modifyInventoryGold(-cost))
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
City buildingCity = vendorBuilding.getCity();
|
City buildingCity = vendorBuilding.getCity();
|
||||||
|
|
||||||
if (buildingCity != null) {
|
if (buildingCity != null) {
|
||||||
buildingCity.transactionLock.writeLock().lock();
|
buildingCity.transactionLock.writeLock().lock();
|
||||||
try {
|
try {
|
||||||
if (!vendorBuilding.isOwnerIsNPC() && !vendorBuilding.transferGold(buildingDeposit, true)) {
|
if (!vendorBuilding.transferGold(buildingDeposit, true))
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.error(e);
|
Logger.error(e);
|
||||||
return false;
|
return false;
|
||||||
} finally {
|
} finally {
|
||||||
buildingCity.transactionLock.writeLock().unlock();
|
buildingCity.transactionLock.writeLock().unlock();
|
||||||
}
|
}
|
||||||
} else if (!vendorBuilding.isOwnerIsNPC() && !vendorBuilding.transferGold(buildingDeposit, true)) {
|
} else if (!vendorBuilding.transferGold(buildingDeposit, true))
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2288,8 +2257,6 @@ public class CharacterItemManager {
|
|||||||
if (this.absCharacter.getObjectType().equals(GameObjectType.PlayerCharacter) == false)
|
if (this.absCharacter.getObjectType().equals(GameObjectType.PlayerCharacter) == false)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(this.updateLock)
|
|
||||||
return;
|
|
||||||
PlayerCharacter pc = (PlayerCharacter) this.absCharacter;
|
PlayerCharacter pc = (PlayerCharacter) this.absCharacter;
|
||||||
|
|
||||||
UpdateInventoryMsg updateInventoryMsg = new UpdateInventoryMsg(inventory, this.getBank(), this.getGoldInventory(), add);
|
UpdateInventoryMsg updateInventoryMsg = new UpdateInventoryMsg(inventory, this.getBank(), this.getGoldInventory(), add);
|
||||||
@@ -2459,7 +2426,7 @@ public class CharacterItemManager {
|
|||||||
i.setOwnerID(0);
|
i.setOwnerID(0);
|
||||||
|
|
||||||
calculateWeights();
|
calculateWeights();
|
||||||
stripTempEnchants(i);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2468,10 +2435,6 @@ public class CharacterItemManager {
|
|||||||
if (item == null || amount < 1 || amount > 5)
|
if (item == null || amount < 1 || amount > 5)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(ZoneManager.findSmallestZone(this.getOwner().loc).getSafeZone() == 1){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//verify the item is equipped by this player
|
//verify the item is equipped by this player
|
||||||
int slot = item.getEquipSlot();
|
int slot = item.getEquipSlot();
|
||||||
if (!this.equipped.containsKey(slot))
|
if (!this.equipped.containsKey(slot))
|
||||||
|
|||||||
@@ -489,6 +489,7 @@ public class CharacterSkill extends AbstractGameObject {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
ConcurrentHashMap<String, CharacterSkill> skills = pc.getSkills();
|
ConcurrentHashMap<String, CharacterSkill> skills = pc.getSkills();
|
||||||
|
|
||||||
//First add skills that don't exist
|
//First add skills that don't exist
|
||||||
Race race = pc.getRace();
|
Race race = pc.getRace();
|
||||||
if (race != null) {
|
if (race != null) {
|
||||||
@@ -537,10 +538,6 @@ public class CharacterSkill extends AbstractGameObject {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (pc.getRace().getName().equals("Saetor")) {
|
|
||||||
if (cs.getSkillsBase().getName().equals("Parry") || cs.getSkillsBase().getName().equals("Staff") || cs.getSkillsBase().getName().equals("Staff Mastery"))
|
|
||||||
valid = true;
|
|
||||||
}
|
|
||||||
//if skill doesn't belong to any runes, then remove it
|
//if skill doesn't belong to any runes, then remove it
|
||||||
if (!valid) {
|
if (!valid) {
|
||||||
DbManager.CharacterSkillQueries.DELETE_SKILL(cs.getObjectUUID());
|
DbManager.CharacterSkillQueries.DELETE_SKILL(cs.getObjectUUID());
|
||||||
@@ -560,15 +557,6 @@ public class CharacterSkill extends AbstractGameObject {
|
|||||||
if (skills == null)
|
if (skills == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//if (pc.getRace().getName().equals("Saetor")) {
|
|
||||||
// SkillReq parry = new SkillReq(95961104, (short) 1);
|
|
||||||
// SkillReq staff = new SkillReq(71438003, (short) 15);
|
|
||||||
// SkillReq staffMastery = new SkillReq(-61022283, (short) 1);
|
|
||||||
// skillsGranted.add(parry);
|
|
||||||
// skillsGranted.add(staff);
|
|
||||||
// skillsGranted.add(staffMastery);
|
|
||||||
//}
|
|
||||||
|
|
||||||
for (SkillReq skillreq : skillsGranted) {
|
for (SkillReq skillreq : skillsGranted) {
|
||||||
SkillsBase skillsBase = skillreq.getSkillsBase();
|
SkillsBase skillsBase = skillreq.getSkillsBase();
|
||||||
|
|
||||||
|
|||||||
@@ -21,8 +21,7 @@ public enum CharacterTitle {
|
|||||||
CSR_3(255, 0, 0, "CCR"),
|
CSR_3(255, 0, 0, "CCR"),
|
||||||
CSR_4(251, 181, 13, "CCR"),
|
CSR_4(251, 181, 13, "CCR"),
|
||||||
DEVELOPER(166, 153, 114, "Programmer"),
|
DEVELOPER(166, 153, 114, "Programmer"),
|
||||||
QA(88, 250, 244, "GIRLFRIEND"),
|
QA(88, 250, 244, "GIRLFRIEND");
|
||||||
BOX(255, 0, 0, "");
|
|
||||||
|
|
||||||
int headerLength, footerLength;
|
int headerLength, footerLength;
|
||||||
private ByteBuffer header;
|
private ByteBuffer header;
|
||||||
@@ -33,7 +32,7 @@ public enum CharacterTitle {
|
|||||||
(((_r < 100) ? ((_r < 10) ? "00" : "0") : "") + ((byte) _r & 0xFF)) +
|
(((_r < 100) ? ((_r < 10) ? "00" : "0") : "") + ((byte) _r & 0xFF)) +
|
||||||
(((_g < 100) ? ((_g < 10) ? "00" : "0") : "") + ((byte) _g & 0xFF)) +
|
(((_g < 100) ? ((_g < 10) ? "00" : "0") : "") + ((byte) _g & 0xFF)) +
|
||||||
(((_b < 100) ? ((_b < 10) ? "00" : "0") : "") + ((byte) _b & 0xFF)) +
|
(((_b < 100) ? ((_b < 10) ? "00" : "0") : "") + ((byte) _b & 0xFF)) +
|
||||||
_prefix).toCharArray();
|
'<' + _prefix + "> ").toCharArray();
|
||||||
|
|
||||||
char[] str_footer = ("^\\c255255255").toCharArray();
|
char[] str_footer = ("^\\c255255255").toCharArray();
|
||||||
|
|
||||||
|
|||||||
+180
-121
@@ -32,7 +32,6 @@ import engine.server.MBServerStatics;
|
|||||||
import engine.server.world.WorldServer;
|
import engine.server.world.WorldServer;
|
||||||
import engine.workthreads.DestroyCityThread;
|
import engine.workthreads.DestroyCityThread;
|
||||||
import engine.workthreads.TransferCityThread;
|
import engine.workthreads.TransferCityThread;
|
||||||
import org.joda.time.DateTime;
|
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
@@ -40,7 +39,6 @@ import java.sql.SQLException;
|
|||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
@@ -90,9 +88,6 @@ public class City extends AbstractWorldObject {
|
|||||||
private boolean reverseKOS = false;
|
private boolean reverseKOS = false;
|
||||||
private String hash;
|
private String hash;
|
||||||
|
|
||||||
public final HashMap<Integer,Long> _recentMemory = new HashMap<>();
|
|
||||||
HashMap<Guild,ArrayList<Integer>> dividedPlayers;
|
|
||||||
public Integer totalPlayers;
|
|
||||||
/**
|
/**
|
||||||
* ResultSet Constructor
|
* ResultSet Constructor
|
||||||
*/
|
*/
|
||||||
@@ -199,132 +194,137 @@ public class City extends AbstractWorldObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void serializeForClientMsg(City city, ByteBufferWriter writer) {
|
public static void serializeForClientMsg(City city, ByteBufferWriter writer) {
|
||||||
AbstractCharacter guildRuler;
|
AbstractCharacter guildRuler;
|
||||||
Guild rulingGuild;
|
Guild rulingGuild;
|
||||||
Guild rulingNation;
|
Guild rulingNation;
|
||||||
java.time.LocalDateTime dateTime1900;
|
java.time.LocalDateTime dateTime1900;
|
||||||
|
|
||||||
// Cities aren't a city without a TOL. Time to early exit.
|
// Cities aren't a city without a TOL. Time to early exit.
|
||||||
// No need to spam the log here as non-existant TOL's are indicated
|
// No need to spam the log here as non-existant TOL's are indicated
|
||||||
// during bootstrap routines.
|
// during bootstrap routines.
|
||||||
|
|
||||||
if (city.getTOL() == null) {
|
if (city.getTOL() == null) {
|
||||||
|
|
||||||
Logger.error("NULL TOL FOR " + city.cityName);
|
Logger.error("NULL TOL FOR " + city.cityName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Assign city owner
|
// Assign city owner
|
||||||
|
|
||||||
if (city.getTOL() != null)
|
if (city.getTOL() != null)
|
||||||
guildRuler = city.getTOL().getOwner();
|
guildRuler = city.getTOL().getOwner();
|
||||||
else
|
else
|
||||||
guildRuler = null;
|
guildRuler = null;
|
||||||
|
|
||||||
// If is an errant tree, use errant guild for serialization.
|
// If is an errant tree, use errant guild for serialization.
|
||||||
// otherwise we serialize the soverign guild
|
// otherwise we serialize the soverign guild
|
||||||
|
|
||||||
if (guildRuler == null)
|
if (guildRuler == null)
|
||||||
rulingGuild = Guild.getErrantGuild();
|
rulingGuild = Guild.getErrantGuild();
|
||||||
else
|
else
|
||||||
rulingGuild = guildRuler.getGuild();
|
rulingGuild = guildRuler.getGuild();
|
||||||
|
|
||||||
rulingNation = rulingGuild.getNation();
|
rulingNation = rulingGuild.getNation();
|
||||||
|
|
||||||
// Begin Serialzing soverign guild data
|
// Begin Serialzing soverign guild data
|
||||||
writer.putInt(city.getObjectType().ordinal());
|
writer.putInt(city.getObjectType().ordinal());
|
||||||
writer.putInt(city.getObjectUUID());
|
writer.putInt(city.getObjectUUID());
|
||||||
writer.putString(city.cityName);
|
writer.putString(city.cityName);
|
||||||
|
writer.putInt(rulingGuild.getObjectType().ordinal());
|
||||||
|
writer.putInt(rulingGuild.getObjectUUID());
|
||||||
|
|
||||||
|
writer.putString(rulingGuild.getName());
|
||||||
|
writer.putString(city.motto);
|
||||||
|
writer.putString(rulingGuild.getLeadershipType());
|
||||||
|
|
||||||
|
// Serialize guild ruler's name
|
||||||
|
// If tree is abandoned blank out the name
|
||||||
|
// to allow them a rename.
|
||||||
|
|
||||||
|
if (guildRuler == null)
|
||||||
|
writer.putString("");
|
||||||
|
else
|
||||||
|
writer.putString(guildRuler.getFirstName() + ' ' + guildRuler.getLastName());
|
||||||
|
|
||||||
|
writer.putInt(rulingGuild.getCharter());
|
||||||
|
writer.putInt(0); // always 00000000
|
||||||
|
|
||||||
|
writer.put(city.isSafeHold);
|
||||||
|
|
||||||
|
writer.put((byte) 1);
|
||||||
|
writer.put((byte) 1); // *** Refactor: What are these flags?
|
||||||
|
writer.put((byte) 1);
|
||||||
|
writer.put((byte) 1);
|
||||||
|
writer.put((byte) 1);
|
||||||
|
|
||||||
|
GuildTag._serializeForDisplay(rulingGuild.getGuildTag(), writer);
|
||||||
|
GuildTag._serializeForDisplay(rulingNation.getGuildTag(), writer);
|
||||||
|
|
||||||
|
writer.putInt(0);// TODO Implement description text
|
||||||
|
|
||||||
|
writer.put((byte) 1);
|
||||||
|
|
||||||
|
if (city.isCapital > 0)
|
||||||
|
writer.put((byte) 1);
|
||||||
|
else
|
||||||
|
writer.put((byte) 0);
|
||||||
|
|
||||||
|
writer.put((byte) 1);
|
||||||
|
|
||||||
|
// Begin serializing nation guild info
|
||||||
|
|
||||||
|
if (rulingNation.isEmptyGuild()) {
|
||||||
writer.putInt(rulingGuild.getObjectType().ordinal());
|
writer.putInt(rulingGuild.getObjectType().ordinal());
|
||||||
writer.putInt(rulingGuild.getObjectUUID());
|
writer.putInt(rulingGuild.getObjectUUID());
|
||||||
|
} else {
|
||||||
writer.putString(rulingGuild.getName());
|
writer.putInt(rulingNation.getObjectType().ordinal());
|
||||||
writer.putString(city.motto);
|
writer.putInt(rulingNation.getObjectUUID());
|
||||||
writer.putString(rulingGuild.getLeadershipType());
|
}
|
||||||
|
|
||||||
// Serialize guild ruler's name
|
|
||||||
// If tree is abandoned blank out the name
|
|
||||||
// to allow them a rename.
|
|
||||||
|
|
||||||
if (guildRuler == null)
|
|
||||||
writer.putString("");
|
|
||||||
else
|
|
||||||
writer.putString(guildRuler.getFirstName() + ' ' + guildRuler.getLastName());
|
|
||||||
|
|
||||||
writer.putInt(rulingGuild.getCharter());
|
|
||||||
writer.putInt(0); // always 00000000
|
|
||||||
|
|
||||||
writer.put(city.isSafeHold);
|
|
||||||
|
|
||||||
writer.put((byte) 1);
|
|
||||||
writer.put((byte) 1); // *** Refactor: What are these flags?
|
|
||||||
writer.put((byte) 1);
|
|
||||||
writer.put((byte) 1);
|
|
||||||
writer.put((byte) 1);
|
|
||||||
|
|
||||||
GuildTag._serializeForDisplay(rulingGuild.getGuildTag(), writer);
|
|
||||||
GuildTag._serializeForDisplay(rulingNation.getGuildTag(), writer);
|
|
||||||
|
|
||||||
writer.putInt(0);// TODO Implement description text
|
|
||||||
|
|
||||||
writer.put((byte) 1);
|
|
||||||
|
|
||||||
if (city.isCapital > 0)
|
|
||||||
writer.put((byte) 1);
|
|
||||||
else
|
|
||||||
writer.put((byte) 0);
|
|
||||||
|
|
||||||
writer.put((byte) 1);
|
|
||||||
|
|
||||||
// Begin serializing nation guild info
|
|
||||||
|
|
||||||
if (rulingNation.isEmptyGuild()) {
|
|
||||||
writer.putInt(rulingGuild.getObjectType().ordinal());
|
|
||||||
writer.putInt(rulingGuild.getObjectUUID());
|
|
||||||
} else {
|
|
||||||
writer.putInt(rulingNation.getObjectType().ordinal());
|
|
||||||
writer.putInt(rulingNation.getObjectUUID());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Serialize nation name
|
// Serialize nation name
|
||||||
|
|
||||||
if (rulingNation.isEmptyGuild())
|
if (rulingNation.isEmptyGuild())
|
||||||
writer.putString("None");
|
writer.putString("None");
|
||||||
else
|
else
|
||||||
writer.putString(rulingNation.getName());
|
writer.putString(rulingNation.getName());
|
||||||
|
|
||||||
if(city.getTOL() != null) {
|
writer.putInt(city.getTOL().getRank());
|
||||||
writer.putInt(city.getTOL().getRank());
|
|
||||||
}else{
|
|
||||||
writer.putInt(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (city.isNoobIsle > 0)
|
if (city.isNoobIsle > 0)
|
||||||
writer.putInt(1);
|
writer.putInt(1);
|
||||||
else
|
else
|
||||||
writer.putInt(0xFFFFFFFF);
|
writer.putInt(0xFFFFFFFF);
|
||||||
|
|
||||||
writer.putInt(city.population);
|
writer.putInt(city.population);
|
||||||
|
|
||||||
if (rulingNation.isEmptyGuild())
|
if (rulingNation.isEmptyGuild())
|
||||||
writer.putString(" ");
|
writer.putString(" ");
|
||||||
else
|
else
|
||||||
writer.putString(Guild.GetGL(rulingNation).getFirstName() + ' ' + Guild.GetGL(rulingNation).getLastName());
|
writer.putString(Guild.GetGL(rulingNation).getFirstName() + ' ' + Guild.GetGL(rulingNation).getLastName());
|
||||||
|
|
||||||
|
|
||||||
writer.putLocalDateTime(city.established);
|
writer.putLocalDateTime(city.established);
|
||||||
|
|
||||||
writer.putFloat(city.location.x);
|
// writer.put((byte) city.established.getDayOfMonth());
|
||||||
writer.putFloat(city.location.y);
|
// writer.put((byte) city.established.minusMonths(1).getMonth().getValue());
|
||||||
writer.putFloat(city.location.z);
|
// writer.putInt((int) years);
|
||||||
writer.putInt(ZergManager.getBaneCap(city.getGuild()));
|
// writer.put((byte) hours);
|
||||||
writer.put((byte) 1);
|
// writer.put((byte) minutes);
|
||||||
writer.put((byte) 0);
|
// writer.put((byte) seconds);
|
||||||
writer.putInt(0x64);
|
|
||||||
writer.put((byte) 0);
|
writer.putFloat(city.location.x);
|
||||||
writer.put((byte) 0);
|
writer.putFloat(city.location.y);
|
||||||
writer.put((byte) 0);
|
writer.putFloat(city.location.z);
|
||||||
|
|
||||||
|
writer.putInt(city.siegesWithstood);
|
||||||
|
|
||||||
|
writer.put((byte) 1);
|
||||||
|
writer.put((byte) 0);
|
||||||
|
writer.putInt(0x64);
|
||||||
|
writer.put((byte) 0);
|
||||||
|
writer.put((byte) 0);
|
||||||
|
writer.put((byte) 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Vector3fImmutable getBindLoc(int cityID) {
|
public static Vector3fImmutable getBindLoc(int cityID) {
|
||||||
@@ -980,12 +980,23 @@ public class City extends AbstractWorldObject {
|
|||||||
|
|
||||||
public void onEnter() {
|
public void onEnter() {
|
||||||
|
|
||||||
for (Integer id : this._playerMemory) {
|
HashSet<AbstractWorldObject> currentPlayers;
|
||||||
|
HashSet<Integer> currentMemory;
|
||||||
|
PlayerCharacter player;
|
||||||
|
|
||||||
PlayerCharacter player = PlayerCharacter.getFromCache(id);
|
// Gather current list of players within the zone bounds
|
||||||
if (player == null)
|
|
||||||
|
currentPlayers = WorldGrid.getObjectsInRangePartial(this.location, CityBoundsType.ZONE.extents, MBServerStatics.MASK_PLAYER);
|
||||||
|
currentMemory = new HashSet<>();
|
||||||
|
|
||||||
|
for (AbstractWorldObject playerObject : currentPlayers) {
|
||||||
|
|
||||||
|
if (playerObject == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
player = (PlayerCharacter) playerObject;
|
||||||
|
currentMemory.add(player.getObjectUUID());
|
||||||
|
|
||||||
// Player is already in our memory
|
// Player is already in our memory
|
||||||
|
|
||||||
if (_playerMemory.contains(player.getObjectUUID()))
|
if (_playerMemory.contains(player.getObjectUUID()))
|
||||||
@@ -1001,6 +1012,62 @@ public class City extends AbstractWorldObject {
|
|||||||
//add spire effects.
|
//add spire effects.
|
||||||
if (this.getEffects().size() > 0)
|
if (this.getEffects().size() > 0)
|
||||||
this.applyAllCityEffects(player);
|
this.applyAllCityEffects(player);
|
||||||
|
|
||||||
|
// Add player to our city's memory
|
||||||
|
|
||||||
|
_playerMemory.add(player.getObjectUUID());
|
||||||
|
|
||||||
|
// ***For debugging
|
||||||
|
// Logger.info("PlayerMemory for ", this.getCityName() + ": " + _playerMemory.size());
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
onExit(currentMemory);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Logger.error(e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onExit(HashSet<Integer> currentMemory) {
|
||||||
|
|
||||||
|
PlayerCharacter player;
|
||||||
|
int playerUUID = 0;
|
||||||
|
HashSet<Integer> toRemove = new HashSet<>();
|
||||||
|
Iterator<Integer> iter = _playerMemory.iterator();
|
||||||
|
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
|
||||||
|
playerUUID = iter.next();
|
||||||
|
|
||||||
|
|
||||||
|
player = PlayerCharacter.getFromCache(playerUUID);
|
||||||
|
|
||||||
|
if (this.isLocationWithinSiegeBounds(player.getLoc()))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Remove players safezone status if warranted
|
||||||
|
// they can assumed to be not on the citygrid at
|
||||||
|
// this point.
|
||||||
|
|
||||||
|
|
||||||
|
player.setSafeZone(false);
|
||||||
|
|
||||||
|
this.removeAllCityEffects(player, false);
|
||||||
|
|
||||||
|
// We will remove this player after iteration is complete
|
||||||
|
// so store it in a temporary collection
|
||||||
|
|
||||||
|
toRemove.add(playerUUID);
|
||||||
|
// ***For debugging
|
||||||
|
// Logger.info("PlayerMemory for ", this.getCityName() + ": " + _playerMemory.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove players from city memory
|
||||||
|
|
||||||
|
_playerMemory.removeAll(toRemove);
|
||||||
|
for (Integer removalUUID : toRemove) {
|
||||||
|
if (this.cityOutlaws.contains(removalUUID))
|
||||||
|
this.cityOutlaws.remove(removalUUID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1019,15 +1086,7 @@ public class City extends AbstractWorldObject {
|
|||||||
destroyCityThread.setName("deestroyCity:" + this.getName());
|
destroyCityThread.setName("deestroyCity:" + this.getName());
|
||||||
destroyCityThread.start();
|
destroyCityThread.start();
|
||||||
}
|
}
|
||||||
public static void destroyAllCityAssets(City city){
|
|
||||||
if(city == null)
|
|
||||||
Logger.error("Maintenance Failed To Find City To Destroy");
|
|
||||||
for(Building building : city.getParent().zoneBuildingSet){
|
|
||||||
building.setRank(-1);
|
|
||||||
DbManager.removeFromCache(building);
|
|
||||||
}
|
|
||||||
city.getParent().zoneBuildingSet.clear();
|
|
||||||
}
|
|
||||||
public final void transfer(AbstractCharacter newOwner) {
|
public final void transfer(AbstractCharacter newOwner) {
|
||||||
|
|
||||||
Thread transferCityThread = new Thread(new TransferCityThread(this, newOwner));
|
Thread transferCityThread = new Thread(new TransferCityThread(this, newOwner));
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ public class Contract extends AbstractGameObject {
|
|||||||
public int inventorySet = 0;
|
public int inventorySet = 0;
|
||||||
private int vendorID;
|
private int vendorID;
|
||||||
private boolean isTrainer;
|
private boolean isTrainer;
|
||||||
public VendorDialog vendorDialog;
|
private VendorDialog vendorDialog;
|
||||||
private ArrayList<Integer> npcMenuOptions = new ArrayList<>();
|
private ArrayList<Integer> npcMenuOptions = new ArrayList<>();
|
||||||
private ArrayList<Integer> npcModTypeTable = new ArrayList<>();
|
private ArrayList<Integer> npcModTypeTable = new ArrayList<>();
|
||||||
private ArrayList<Integer> npcModSuffixTable = new ArrayList<>();
|
private ArrayList<Integer> npcModSuffixTable = new ArrayList<>();
|
||||||
@@ -198,15 +198,6 @@ public class Contract extends AbstractGameObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<MobEquipment> getSellInventory() {
|
public ArrayList<MobEquipment> getSellInventory() {
|
||||||
if(this.getObjectUUID() == 900){
|
|
||||||
for (MobEquipment me : this.sellInventory) {
|
|
||||||
if(me.getItemBase().getUUID() == 1705032) {
|
|
||||||
me.magicValue = 1000000; //elan stones
|
|
||||||
}else{
|
|
||||||
me.magicValue = (Warehouse.getSellStackSize(me.getItemBase().getUUID()) * Warehouse.getCostForResource(me.getItemBase().getUUID()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return this.sellInventory;
|
return this.sellInventory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -63,8 +63,7 @@ public class Corpse extends AbstractWorldObject {
|
|||||||
this.inBuilding = belongsTo.getInBuilding();
|
this.inBuilding = belongsTo.getInBuilding();
|
||||||
this.inFloorID = belongsTo.getInFloorID();
|
this.inFloorID = belongsTo.getInFloorID();
|
||||||
this.inBuildingID = belongsTo.getInBuildingID();
|
this.inBuildingID = belongsTo.getInBuildingID();
|
||||||
belongsTo.stopMovement(belongsTo.getMovementLoc());
|
this.setLoc(belongsTo.getLoc());
|
||||||
this.setLoc(belongsTo.getMovementLoc());
|
|
||||||
} else {
|
} else {
|
||||||
Logger.error("No player passed in for corpse");
|
Logger.error("No player passed in for corpse");
|
||||||
this.firstName = "";
|
this.firstName = "";
|
||||||
|
|||||||
@@ -9,9 +9,7 @@
|
|||||||
|
|
||||||
package engine.objects;
|
package engine.objects;
|
||||||
|
|
||||||
import engine.Enum;
|
|
||||||
import engine.Enum.TargetColor;
|
import engine.Enum.TargetColor;
|
||||||
import engine.gameManager.LootManager;
|
|
||||||
import engine.gameManager.ZoneManager;
|
import engine.gameManager.ZoneManager;
|
||||||
import engine.math.Vector3fImmutable;
|
import engine.math.Vector3fImmutable;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
@@ -119,11 +117,6 @@ public class Experience {
|
|||||||
159932666, // Level 74
|
159932666, // Level 74
|
||||||
169707808, // Level 75
|
169707808, // Level 75
|
||||||
179921247, // Level 76
|
179921247, // Level 76
|
||||||
190548651, // Level 77
|
|
||||||
201590020, // Level 78
|
|
||||||
213045354, // Level 79
|
|
||||||
224914653, // Level 80
|
|
||||||
237197917 // Level 81
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -221,21 +214,9 @@ public class Experience {
|
|||||||
235166.21f, // Level 72
|
235166.21f, // Level 72
|
||||||
246039.34f, // Level 73
|
246039.34f, // Level 73
|
||||||
257240.58f, // Level 74
|
257240.58f, // Level 74
|
||||||
268765.03f, // Level 75
|
1 // 268774.71 //Level 75
|
||||||
280612.69f, // Level 76
|
|
||||||
292783.56f, // Level 77
|
|
||||||
305277.64f, // Level 78
|
|
||||||
318094.93f, // Level 79
|
|
||||||
1, // Level 80
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
// Used to calcuate the amount of experience a monster grants in the
|
// Used to calcuate the amount of experience a monster grants in the
|
||||||
// following formula
|
// following formula
|
||||||
// expGranted = a(moblevel)^2 + b(moblevel) + c
|
// expGranted = a(moblevel)^2 + b(moblevel) + c
|
||||||
@@ -287,8 +268,8 @@ public class Experience {
|
|||||||
if (level < 1)
|
if (level < 1)
|
||||||
level = 1;
|
level = 1;
|
||||||
|
|
||||||
if (level > MBServerStatics.LEVELCAP)
|
if (level > 75)
|
||||||
level = MBServerStatics.LEVELCAP;
|
level = 75;
|
||||||
|
|
||||||
return MaxExpPerLevel[level];
|
return MaxExpPerLevel[level];
|
||||||
}
|
}
|
||||||
@@ -373,8 +354,8 @@ public class Experience {
|
|||||||
|
|
||||||
if (leaderskill != null)
|
if (leaderskill != null)
|
||||||
leadership = leaderskill.getNumTrains();
|
leadership = leaderskill.getNumTrains();
|
||||||
//if (leadership > 90)
|
if (leadership > 90)
|
||||||
// leadership = 90; // leadership caps at 90%
|
leadership = 90; // leadership caps at 90%
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check every group member for distance to see if they get xp
|
// Check every group member for distance to see if they get xp
|
||||||
@@ -412,8 +393,6 @@ public class Experience {
|
|||||||
|
|
||||||
// Process XP for this member
|
// Process XP for this member
|
||||||
|
|
||||||
grantedExperience *= (1/giveEXPTo.size()+0.9);
|
|
||||||
|
|
||||||
penalty = getGroupMemberPenalty(leadership, playerCharacter, giveEXPTo,
|
penalty = getGroupMemberPenalty(leadership, playerCharacter, giveEXPTo,
|
||||||
highestLevel);
|
highestLevel);
|
||||||
|
|
||||||
@@ -444,14 +423,8 @@ public class Experience {
|
|||||||
if (grantedExperience == 0)
|
if (grantedExperience == 0)
|
||||||
grantedExperience = 1;
|
grantedExperience = 1;
|
||||||
|
|
||||||
grantedExperience *= LootManager.NORMAL_EXP_RATE;
|
|
||||||
// Grant the player the EXP
|
// Grant the player the EXP
|
||||||
if(mob.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) {
|
playerCharacter.grantXP((int) Math.floor(grantedExperience));
|
||||||
if (((PlayerCharacter) mob).pvpDeaths.contains(killer.getObjectUUID()) == false)
|
|
||||||
playerCharacter.grantXP((int) Math.floor(grantedExperience), true);
|
|
||||||
}else {
|
|
||||||
playerCharacter.grantXP((int) Math.floor(grantedExperience), false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else { // Give EXP to a single character
|
} else { // Give EXP to a single character
|
||||||
@@ -462,8 +435,7 @@ public class Experience {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// Get XP and adjust for Mob Level with world xp modifier taken into account
|
// Get XP and adjust for Mob Level with world xp modifier taken into account
|
||||||
float mdofier = LOOTMANAGER.NORMAL_EXP_RATE;
|
grantedExperience = (double) LOOTMANAGER.NORMAL_EXP_RATE * maxXPPerKill(killer.getLevel());
|
||||||
grantedExperience = maxXPPerKill(killer.getLevel());
|
|
||||||
grantedExperience *= getConMod(killer, mob);
|
grantedExperience *= getConMod(killer, mob);
|
||||||
|
|
||||||
// Modify for hotzone
|
// Modify for hotzone
|
||||||
@@ -476,12 +448,7 @@ public class Experience {
|
|||||||
grantedExperience *= .6;
|
grantedExperience *= .6;
|
||||||
|
|
||||||
// Grant XP
|
// Grant XP
|
||||||
if(mob.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) {
|
killer.grantXP((int) Math.floor(grantedExperience));
|
||||||
if (((PlayerCharacter) mob).pvpDeaths.contains(killer.getObjectUUID()) == false)
|
|
||||||
killer.grantXP((int) Math.floor(grantedExperience), true);
|
|
||||||
}else {
|
|
||||||
killer.grantXP((int) Math.floor(grantedExperience), false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -667,9 +667,6 @@ public class Guild extends AbstractWorldObject {
|
|||||||
pc.incVer();
|
pc.incVer();
|
||||||
DispatchMessage.sendToAllInRange(pc, new GuildInfoMsg(pc, Guild.getErrantGuild(), 2));
|
DispatchMessage.sendToAllInRange(pc, new GuildInfoMsg(pc, Guild.getErrantGuild(), 2));
|
||||||
|
|
||||||
if(GroupManager.getGroup(pc) != null)
|
|
||||||
GroupManager.getGroup(pc).removeGroupMember(pc);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void upgradeGuildState(boolean nation) {
|
public void upgradeGuildState(boolean nation) {
|
||||||
@@ -733,29 +730,32 @@ public class Guild extends AbstractWorldObject {
|
|||||||
|
|
||||||
public boolean canSubAGuild(Guild toSub) {
|
public boolean canSubAGuild(Guild toSub) {
|
||||||
|
|
||||||
boolean canSubToNation;
|
boolean canSub;
|
||||||
boolean canAcceptSub;
|
|
||||||
if (this.equals(toSub))
|
if (this.equals(toSub))
|
||||||
return false;
|
return false;
|
||||||
switch (this.guildState) {
|
switch (this.guildState) {
|
||||||
case Nation:
|
case Nation:
|
||||||
case Sovereign:
|
case Sovereign:
|
||||||
canAcceptSub = true;
|
canSub = true;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
canAcceptSub = false;
|
canSub = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (toSub.guildState) {
|
switch (toSub.guildState) {
|
||||||
case Errant:
|
case Errant:
|
||||||
case Sovereign:
|
case Sovereign:
|
||||||
canSubToNation = true;
|
canSub = true;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
canSubToNation = false;
|
canSub = false;
|
||||||
}
|
}
|
||||||
|
City nationCap = City.getCity(nation.cityUUID);
|
||||||
return canAcceptSub && canSubToNation;
|
if (nation.getSubGuildList().size() >= nationCap.getRank()) {
|
||||||
|
canSub = false;
|
||||||
|
}
|
||||||
|
return canSub;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getRealmsOwnedFlag() {
|
public int getRealmsOwnedFlag() {
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ public class Item extends AbstractWorldObject {
|
|||||||
private short durabilityCurrent;
|
private short durabilityCurrent;
|
||||||
private byte chargesRemaining;
|
private byte chargesRemaining;
|
||||||
private byte equipSlot;
|
private byte equipSlot;
|
||||||
public boolean canDestroy;
|
private boolean canDestroy;
|
||||||
private boolean rentable;
|
private boolean rentable;
|
||||||
private boolean isRandom = false;
|
private boolean isRandom = false;
|
||||||
private int value;
|
private int value;
|
||||||
@@ -61,7 +61,7 @@ public class Item extends AbstractWorldObject {
|
|||||||
private ArrayList<EnchantmentBase> enchants = new ArrayList<>();
|
private ArrayList<EnchantmentBase> enchants = new ArrayList<>();
|
||||||
private long dateToUpgrade;
|
private long dateToUpgrade;
|
||||||
private String customName = "";
|
private String customName = "";
|
||||||
public int magicValue;
|
private int magicValue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* No Id Constructor
|
* No Id Constructor
|
||||||
@@ -233,6 +233,7 @@ public class Item extends AbstractWorldObject {
|
|||||||
this.value = rs.getInt("item_value");
|
this.value = rs.getInt("item_value");
|
||||||
this.customName = rs.getString("item_name");
|
this.customName = rs.getString("item_name");
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void _serializeForClientMsg(Item item, ByteBufferWriter writer)
|
public static void _serializeForClientMsg(Item item, ByteBufferWriter writer)
|
||||||
@@ -665,6 +666,7 @@ public class Item extends AbstractWorldObject {
|
|||||||
}
|
}
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Item getFromCache(int id) {
|
public static Item getFromCache(int id) {
|
||||||
return (Item) DbManager.getFromCache(GameObjectType.Item, id);
|
return (Item) DbManager.getFromCache(GameObjectType.Item, id);
|
||||||
}
|
}
|
||||||
@@ -887,8 +889,6 @@ public class Item extends AbstractWorldObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isCanDestroy() {
|
public boolean isCanDestroy() {
|
||||||
if(this.getItemBaseID() == 7)//gold
|
|
||||||
return false;
|
|
||||||
return canDestroy;
|
return canDestroy;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1230,18 +1230,18 @@ public class Item extends AbstractWorldObject {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (this.getItemBase() != null)
|
if (this.getItemBase() != null)
|
||||||
for (Integer token : this.getItemBase().getBakedInStats().keySet()) {
|
|
||||||
|
|
||||||
effect = PowersManager.getEffectByToken(token);
|
for (Integer token : this.getItemBase().getBakedInStats().keySet()) {
|
||||||
|
|
||||||
if (effect == null) {
|
effect = PowersManager.getEffectByToken(token);
|
||||||
Logger.error("missing effect of token " + token);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
AbstractPowerAction apa = PowersManager.getPowerActionByIDString(effect.getIDString());
|
|
||||||
apa.applyBakedInStatsForItem(this, this.getItemBase().getBakedInStats().get(token));
|
|
||||||
|
|
||||||
|
if (effect == null) {
|
||||||
|
Logger.error("missing effect of token " + token);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
AbstractPowerAction apa = PowersManager.getPowerActionByIDString(effect.getIDString());
|
||||||
|
apa.applyBakedInStatsForItem(this, this.getItemBase().getBakedInStats().get(token));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void loadEnchantments() {
|
public final void loadEnchantments() {
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import engine.Enum.DamageType;
|
|||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
import engine.Enum.ItemType;
|
import engine.Enum.ItemType;
|
||||||
import engine.gameManager.DbManager;
|
import engine.gameManager.DbManager;
|
||||||
import engine.gameManager.LootManager;
|
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
@@ -24,7 +23,7 @@ import java.util.HashMap;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
public class ItemBase{
|
public class ItemBase {
|
||||||
|
|
||||||
public static final byte GOLD_BASE_TYPE = 4;
|
public static final byte GOLD_BASE_TYPE = 4;
|
||||||
public static ItemBase GOLD_ITEM_BASE = null;
|
public static ItemBase GOLD_ITEM_BASE = null;
|
||||||
@@ -36,10 +35,10 @@ public class ItemBase{
|
|||||||
private static HashMap<Integer, Integer> itemHashIDMap = new HashMap<>();
|
private static HashMap<Integer, Integer> itemHashIDMap = new HashMap<>();
|
||||||
private static HashMap<String, Integer> _IDsByNames = new HashMap<>();
|
private static HashMap<String, Integer> _IDsByNames = new HashMap<>();
|
||||||
private static ArrayList<ItemBase> _resourceList = new ArrayList<>();
|
private static ArrayList<ItemBase> _resourceList = new ArrayList<>();
|
||||||
private int uuid;
|
private final int uuid;
|
||||||
private String name;
|
private final String name;
|
||||||
private float durability;
|
private float durability;
|
||||||
public int value;
|
private int value;
|
||||||
private short weight;
|
private short weight;
|
||||||
private short color;
|
private short color;
|
||||||
private ItemType type;
|
private ItemType type;
|
||||||
@@ -723,12 +722,7 @@ public class ItemBase{
|
|||||||
public final int getUUID() {
|
public final int getUUID() {
|
||||||
return uuid;
|
return uuid;
|
||||||
}
|
}
|
||||||
public void setUUID(int id) {
|
|
||||||
this.uuid = id;
|
|
||||||
}
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
public boolean isRing() {
|
public boolean isRing() {
|
||||||
return ((this.equipFlag & (64 | 128 | 192)) != 0);
|
return ((this.equipFlag & (64 | 128 | 192)) != 0);
|
||||||
}
|
}
|
||||||
@@ -920,70 +914,4 @@ public class ItemBase{
|
|||||||
public void setAutoID(boolean autoID) {
|
public void setAutoID(boolean autoID) {
|
||||||
this.autoID = autoID;
|
this.autoID = autoID;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isVorg(){
|
|
||||||
return LootManager.vorg_ha_uuids.contains(this.uuid) || LootManager.vorg_ma_uuids.contains(this.uuid) || LootManager.vorg_la_uuids.contains(this.uuid) || LootManager.vorg_cloth_uuids.contains(this.uuid);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String[] getVorgStats() {
|
|
||||||
|
|
||||||
return new String[]{};
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getPriceCeilingForRune(int runeID){
|
|
||||||
switch(runeID){
|
|
||||||
case 250001: //5 stats
|
|
||||||
case 250010:
|
|
||||||
case 250019:
|
|
||||||
case 250028:
|
|
||||||
case 250037:
|
|
||||||
return 3000000;
|
|
||||||
case 250002: //10 stats
|
|
||||||
case 250011:
|
|
||||||
case 250020:
|
|
||||||
case 250029:
|
|
||||||
case 250038:
|
|
||||||
return 4000000;
|
|
||||||
case 250003: //15 stats
|
|
||||||
case 250012:
|
|
||||||
case 250021:
|
|
||||||
case 250030:
|
|
||||||
case 250039:
|
|
||||||
return 5000000;
|
|
||||||
case 250004: //20 stats
|
|
||||||
case 250013:
|
|
||||||
case 250022:
|
|
||||||
case 250031:
|
|
||||||
case 250040:
|
|
||||||
return 6000000;
|
|
||||||
case 250005: //25 stats
|
|
||||||
case 250014:
|
|
||||||
case 250023:
|
|
||||||
case 250032:
|
|
||||||
case 250041:
|
|
||||||
return 7000000;
|
|
||||||
case 250006: //30 stats
|
|
||||||
case 250015:
|
|
||||||
case 250024:
|
|
||||||
case 250033:
|
|
||||||
case 250042:
|
|
||||||
return 8000000;
|
|
||||||
case 250007: //35 stats
|
|
||||||
case 250016:
|
|
||||||
case 250025:
|
|
||||||
case 250034:
|
|
||||||
case 250043:
|
|
||||||
return 9000000;
|
|
||||||
case 250008: //40 stats
|
|
||||||
case 250017:
|
|
||||||
case 250026:
|
|
||||||
case 250035:
|
|
||||||
case 250044:
|
|
||||||
return 10000000;
|
|
||||||
case 3040: //prospector
|
|
||||||
case 3021: //traveller
|
|
||||||
return 500000;
|
|
||||||
}
|
|
||||||
return 10000000;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -707,7 +707,7 @@ public class ItemFactory {
|
|||||||
|
|
||||||
if (rollPrefix < 80) {
|
if (rollPrefix < 80) {
|
||||||
|
|
||||||
int randomPrefix = LootManager.TableRoll(vendor.getLevel());
|
int randomPrefix = LootManager.TableRoll(vendor.getLevel(), false);
|
||||||
prefixEntry = ModTableEntry.rollTable(prefixTypeTable.modTableID, randomPrefix);
|
prefixEntry = ModTableEntry.rollTable(prefixTypeTable.modTableID, randomPrefix);
|
||||||
|
|
||||||
if (prefixEntry != null)
|
if (prefixEntry != null)
|
||||||
@@ -722,7 +722,7 @@ public class ItemFactory {
|
|||||||
|
|
||||||
if (rollSuffix < 80 || prefixEntry == null) {
|
if (rollSuffix < 80 || prefixEntry == null) {
|
||||||
|
|
||||||
int randomSuffix = LootManager.TableRoll(vendor.getLevel());
|
int randomSuffix = LootManager.TableRoll(vendor.getLevel(), false);
|
||||||
suffixEntry = ModTableEntry.rollTable(suffixTypeTable.modTableID, randomSuffix);
|
suffixEntry = ModTableEntry.rollTable(suffixTypeTable.modTableID, randomSuffix);
|
||||||
|
|
||||||
if (suffixEntry != null)
|
if (suffixEntry != null)
|
||||||
|
|||||||
@@ -373,28 +373,7 @@ public class Kit extends AbstractGameObject {
|
|||||||
case 2503:
|
case 2503:
|
||||||
return 69;
|
return 69;
|
||||||
}
|
}
|
||||||
case 1999:
|
|
||||||
switch (classID) {
|
|
||||||
case 2500:
|
|
||||||
return 53;
|
|
||||||
case 2501:
|
|
||||||
return 54;
|
|
||||||
case 2502:
|
|
||||||
return 37;
|
|
||||||
case 2503:
|
|
||||||
return 38;
|
|
||||||
}
|
|
||||||
case 1998:
|
|
||||||
switch (classID) {
|
|
||||||
case 2500:
|
|
||||||
return 53;
|
|
||||||
case 2501:
|
|
||||||
return 54;
|
|
||||||
case 2502:
|
|
||||||
return 37;
|
|
||||||
case 2503:
|
|
||||||
return 38;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
|
|||||||
+107
-244
@@ -11,26 +11,21 @@ package engine.objects;
|
|||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.InterestManagement.WorldGrid;
|
import engine.InterestManagement.WorldGrid;
|
||||||
import engine.db.archive.DataWarehouse;
|
import engine.gameManager.BuildingManager;
|
||||||
import engine.db.archive.MineRecord;
|
import engine.gameManager.ChatManager;
|
||||||
import engine.gameManager.*;
|
import engine.gameManager.DbManager;
|
||||||
|
import engine.gameManager.ZoneManager;
|
||||||
import engine.net.ByteBufferWriter;
|
import engine.net.ByteBufferWriter;
|
||||||
import engine.net.DispatchMessage;
|
|
||||||
import engine.net.client.msg.ErrorPopupMsg;
|
import engine.net.client.msg.ErrorPopupMsg;
|
||||||
import engine.net.client.msg.chat.ChatSystemMsg;
|
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import engine.workthreads.ZergMechanicThread;
|
|
||||||
import org.joda.time.DateTime;
|
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Time;
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
|
||||||
|
|
||||||
import static engine.gameManager.DbManager.MineQueries;
|
import static engine.gameManager.DbManager.MineQueries;
|
||||||
import static engine.gameManager.DbManager.getObject;
|
import static engine.gameManager.DbManager.getObject;
|
||||||
@@ -40,8 +35,8 @@ public class Mine extends AbstractGameObject {
|
|||||||
|
|
||||||
public static ConcurrentHashMap<Mine, Integer> mineMap = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
|
public static ConcurrentHashMap<Mine, Integer> mineMap = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
|
||||||
public static ConcurrentHashMap<Integer, Mine> towerMap = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
|
public static ConcurrentHashMap<Integer, Mine> towerMap = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
|
||||||
private String zoneName;
|
private final String zoneName;
|
||||||
private Zone parentZone;
|
private final Zone parentZone;
|
||||||
public boolean isActive = false;
|
public boolean isActive = false;
|
||||||
public PlayerCharacter lastClaimer;
|
public PlayerCharacter lastClaimer;
|
||||||
public boolean wasClaimed = false;
|
public boolean wasClaimed = false;
|
||||||
@@ -56,21 +51,6 @@ public class Mine extends AbstractGameObject {
|
|||||||
private int buildingID;
|
private int buildingID;
|
||||||
private MineProduction mineType;
|
private MineProduction mineType;
|
||||||
|
|
||||||
public int capSize;
|
|
||||||
|
|
||||||
public final HashSet<Integer> _playerMemory = new HashSet<>();
|
|
||||||
public final HashMap<Integer,Long> _recentMemory = new HashMap<>();
|
|
||||||
public HashMap<Guild,ArrayList<Integer>> dividedPlayers;
|
|
||||||
|
|
||||||
public boolean hasProduced = false;
|
|
||||||
public static ArrayList<Mine> ChinaMines = new ArrayList<>();
|
|
||||||
public static ArrayList<Mine> EuroMines = new ArrayList<>();
|
|
||||||
public static ArrayList<Mine> AmericaMines = new ArrayList<>();
|
|
||||||
|
|
||||||
public boolean wasOpened = false;
|
|
||||||
|
|
||||||
public int liveHour;
|
|
||||||
public int liveMinute;
|
|
||||||
/**
|
/**
|
||||||
* ResultSet Constructor
|
* ResultSet Constructor
|
||||||
*/
|
*/
|
||||||
@@ -78,51 +58,41 @@ public class Mine extends AbstractGameObject {
|
|||||||
super(rs);
|
super(rs);
|
||||||
|
|
||||||
this.mineType = MineProduction.getByName(rs.getString("mine_type"));
|
this.mineType = MineProduction.getByName(rs.getString("mine_type"));
|
||||||
//this.mineType = MineProduction.LUMBER;
|
|
||||||
|
|
||||||
int ownerUID = rs.getInt("mine_ownerUID");
|
int ownerUID = rs.getInt("mine_ownerUID");
|
||||||
this.buildingID = rs.getInt("mine_buildingUID");
|
this.buildingID = rs.getInt("mine_buildingUID");
|
||||||
this.flags = rs.getInt("flags");
|
this.flags = rs.getInt("flags");
|
||||||
//int parent = rs.getInt("parent");
|
int parent = rs.getInt("parent");
|
||||||
if(BuildingManager.getBuildingFromCache(rs.getInt("mine_buildingUID")) != null) {
|
this.parentZone = ZoneManager.getZoneByUUID(parent);
|
||||||
Building tower = BuildingManager.getBuildingFromCache(rs.getInt("mine_buildingUID"));
|
this.zoneName = this.parentZone.getParent().getName();
|
||||||
|
|
||||||
for (Zone zone : ZoneManager.getAllZonesIn(tower.loc)) {
|
this.owningGuild = Guild.getGuild(ownerUID);
|
||||||
if (zone.isMacroZone()) {
|
Guild nation = null;
|
||||||
this.parentZone = zone;
|
|
||||||
this.zoneName = this.parentZone.getName();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.owningGuild = Guild.getGuild(ownerUID);
|
if (this.owningGuild.isEmptyGuild()) {
|
||||||
Guild nation = null;
|
this.guildName = "";
|
||||||
|
this.guildTag = GuildTag.ERRANT;
|
||||||
if (this.owningGuild.isEmptyGuild()) {
|
nation = Guild.getErrantGuild();
|
||||||
this.guildName = "";
|
this.owningGuild = Guild.getErrantGuild();
|
||||||
this.guildTag = GuildTag.ERRANT;
|
} else {
|
||||||
nation = Guild.getErrantGuild();
|
this.guildName = this.owningGuild.getName();
|
||||||
this.owningGuild = Guild.getErrantGuild();
|
this.guildTag = this.owningGuild.getGuildTag();
|
||||||
} else {
|
nation = this.owningGuild.getNation();
|
||||||
this.guildName = this.owningGuild.getName();
|
|
||||||
this.guildTag = this.owningGuild.getGuildTag();
|
|
||||||
nation = this.owningGuild.getNation();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!nation.isEmptyGuild()) {
|
|
||||||
this.nationName = nation.getName();
|
|
||||||
this.nationTag = nation.getGuildTag();
|
|
||||||
} else {
|
|
||||||
this.nationName = "";
|
|
||||||
this.nationTag = GuildTag.ERRANT;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.production = Resource.valueOf(rs.getString("mine_resource"));
|
|
||||||
this.lastClaimer = null;
|
|
||||||
this.liveHour = rs.getInt("mineLiveHour");
|
|
||||||
this.liveMinute = rs.getInt("mineLiveMinute");
|
|
||||||
this.capSize = rs.getInt("capSize");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!nation.isEmptyGuild()) {
|
||||||
|
this.nationName = nation.getName();
|
||||||
|
this.nationTag = nation.getGuildTag();
|
||||||
|
} else {
|
||||||
|
this.nationName = "";
|
||||||
|
this.nationTag = GuildTag.ERRANT;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.production = Resource.valueOf(rs.getString("mine_resource"));
|
||||||
|
this.lastClaimer = null;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void releaseMineClaims(PlayerCharacter playerCharacter) {
|
public static void releaseMineClaims(PlayerCharacter playerCharacter) {
|
||||||
|
|
||||||
if (playerCharacter == null)
|
if (playerCharacter == null)
|
||||||
@@ -164,6 +134,8 @@ public class Mine extends AbstractGameObject {
|
|||||||
|
|
||||||
public static void loadAllMines() {
|
public static void loadAllMines() {
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
//Load mine resources
|
//Load mine resources
|
||||||
MineProduction.addResources();
|
MineProduction.addResources();
|
||||||
|
|
||||||
@@ -174,6 +146,10 @@ public class Mine extends AbstractGameObject {
|
|||||||
Mine.mineMap.put(mine, mine.buildingID);
|
Mine.mineMap.put(mine, mine.buildingID);
|
||||||
Mine.towerMap.put(mine.buildingID, mine);
|
Mine.towerMap.put(mine.buildingID, mine);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -189,23 +165,39 @@ public class Mine extends AbstractGameObject {
|
|||||||
writer.putInt(mine.getObjectUUID());
|
writer.putInt(mine.getObjectUUID());
|
||||||
writer.putInt(mine.getObjectUUID()); //actually a hash of mine
|
writer.putInt(mine.getObjectUUID()); //actually a hash of mine
|
||||||
writer.putString(mine.mineType.name);
|
writer.putString(mine.mineType.name);
|
||||||
writer.putString(mine.capSize + " Man ");
|
writer.putString(mine.zoneName);
|
||||||
writer.putInt(mine.production.hash);
|
writer.putInt(mine.production.hash);
|
||||||
writer.putInt(mine.getModifiedProductionAmount());
|
writer.putInt(mine.production.baseProduction);
|
||||||
writer.putInt(mine.getModifiedProductionAmount()); //TODO calculate range penalty here
|
writer.putInt(mine.getModifiedProductionAmount()); //TODO calculate range penalty here
|
||||||
writer.putInt(3600); //window in seconds //production per hour in seconds?
|
writer.putInt(3600); //window in seconds
|
||||||
|
|
||||||
// Errant mines are currently open. Set time to now.
|
// Errant mines are currently open. Set time to now.
|
||||||
|
|
||||||
LocalDateTime mineOpenTime = LocalDateTime.now().withHour(mine.liveHour).withMinute(mine.liveMinute).withSecond(0).withNano(0);
|
LocalDateTime mineOpenTime = LocalDateTime.now().withMinute(0).withSecond(0).withNano(0);
|
||||||
|
|
||||||
|
// Mine times are those of the nation not individual guild.
|
||||||
|
|
||||||
|
Guild mineNatonGuild = mine.getOwningGuild().getNation();
|
||||||
|
|
||||||
|
// Adjust the serialized mine time based upon whether
|
||||||
|
// the Guild's mine window has passed or not and if it was claimed.
|
||||||
|
// If a mine is active serialize current datetime irrespective
|
||||||
|
// of any claim.
|
||||||
|
|
||||||
|
if (mineNatonGuild.isEmptyGuild() == false && mine.isActive == false) {
|
||||||
|
|
||||||
|
int guildWOO = mineNatonGuild.getNation().getMineTime();
|
||||||
|
LocalDateTime guildMineTime = mineOpenTime.withHour(guildWOO);
|
||||||
|
|
||||||
|
if (mineOpenTime.isAfter(guildMineTime) || mine.wasClaimed == true)
|
||||||
|
mineOpenTime = guildMineTime.plusDays(1);
|
||||||
|
else
|
||||||
|
mineOpenTime = guildMineTime;
|
||||||
|
|
||||||
LocalDateTime mineCloseTime = mineOpenTime.plusMinutes(30);
|
|
||||||
if(LocalDateTime.now().isAfter(mineCloseTime)){
|
|
||||||
mineOpenTime = mineOpenTime.plusDays(1);
|
|
||||||
mineCloseTime = mineCloseTime.plusDays(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
writer.putLocalDateTime(mineOpenTime);
|
writer.putLocalDateTime(mineOpenTime);
|
||||||
writer.putLocalDateTime(mineCloseTime);
|
writer.putLocalDateTime(mineOpenTime.plusHours(1));
|
||||||
writer.put(mine.isActive ? (byte) 0x01 : (byte) 0x00);
|
writer.put(mine.isActive ? (byte) 0x01 : (byte) 0x00);
|
||||||
|
|
||||||
Building mineTower = BuildingManager.getBuilding(mine.buildingID);
|
Building mineTower = BuildingManager.getBuilding(mine.buildingID);
|
||||||
@@ -293,15 +285,15 @@ public class Mine extends AbstractGameObject {
|
|||||||
if (nationCapitolTOL == null)
|
if (nationCapitolTOL == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
//int treeRank = nationCapitolTOL.getRank();
|
int treeRank = nationCapitolTOL.getRank();
|
||||||
|
|
||||||
//if (treeRank < 1)
|
if (treeRank < 1)
|
||||||
// return false;
|
return false;
|
||||||
|
|
||||||
//if (guildUnderMineLimit(playerGuild.getNation(), treeRank) == false) {
|
if (guildUnderMineLimit(playerGuild.getNation(), treeRank) == false) {
|
||||||
// ErrorPopupMsg.sendErrorMsg(playerCharacter, "Your nation cannot support another mine.");
|
ErrorPopupMsg.sendErrorMsg(playerCharacter, "Your nation cannot support another mine.");
|
||||||
// return false;
|
return false;
|
||||||
//}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -319,20 +311,14 @@ public class Mine extends AbstractGameObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean changeProductionType(Resource resource) {
|
public boolean changeProductionType(Resource resource) {
|
||||||
//if (!this.validForMine(resource))
|
if (!this.validForMine(resource))
|
||||||
// return false;
|
return false;
|
||||||
//update resource in database;
|
//update resource in database;
|
||||||
if (!MineQueries.CHANGE_RESOURCE(this, resource))
|
if (!MineQueries.CHANGE_RESOURCE(this, resource))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if(this.isActive || this.hasProduced)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
this.production = resource;
|
this.production = resource;
|
||||||
this.hasProduced = true;
|
return true;
|
||||||
ItemBase resourceIB = ItemBase.getItemBase(this.production.UUID);
|
|
||||||
|
|
||||||
return this.owningGuild.getOwnedCity().getWarehouse().depositFromMine(this, resourceIB, this.getModifiedProductionAmount());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public MineProduction getMineType() {
|
public MineProduction getMineType() {
|
||||||
@@ -392,12 +378,6 @@ public class Mine extends AbstractGameObject {
|
|||||||
Building building = BuildingManager.getBuildingFromCache(this.buildingID);
|
Building building = BuildingManager.getBuildingFromCache(this.buildingID);
|
||||||
if (building != null && !this.isActive)
|
if (building != null && !this.isActive)
|
||||||
building.isDeranking.compareAndSet(true, false);
|
building.isDeranking.compareAndSet(true, false);
|
||||||
|
|
||||||
if(isAc) {
|
|
||||||
ZergMechanicThread.startZergThreadMine(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.wasOpened = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean validForMine(Resource r) {
|
public boolean validForMine(Resource r) {
|
||||||
@@ -445,7 +425,7 @@ public class Mine extends AbstractGameObject {
|
|||||||
this.owningGuild = Guild.getErrantGuild();
|
this.owningGuild = Guild.getErrantGuild();
|
||||||
this.lastClaimer = null;
|
this.lastClaimer = null;
|
||||||
this.wasClaimed = false;
|
this.wasClaimed = false;
|
||||||
this.hasProduced = false;
|
|
||||||
// Update database
|
// Update database
|
||||||
|
|
||||||
DbManager.MineQueries.CHANGE_OWNER(this, 0);
|
DbManager.MineQueries.CHANGE_OWNER(this, 0);
|
||||||
@@ -554,162 +534,45 @@ public class Mine extends AbstractGameObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isExpansion() {
|
public boolean isExpansion() {
|
||||||
return true;
|
return (this.flags & 2) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getModifiedProductionAmount() {
|
public int getModifiedProductionAmount() {
|
||||||
int value = Warehouse.getCostForResource(this.production.UUID);
|
//TODO Calculate Distance modifications.
|
||||||
int amount = 0;
|
|
||||||
switch(this.capSize){
|
//calculate base values.
|
||||||
case 3:
|
int baseProduction = this.production.baseProduction;
|
||||||
amount = 1800000;
|
float baseModValue = this.production.baseProduction * .1f;
|
||||||
break;
|
float rankModValue = this.production.baseProduction * .0143f;
|
||||||
case 5:
|
float totalModded = 0;
|
||||||
amount = 3000000;
|
|
||||||
break;
|
//get Mine Building.
|
||||||
case 10:
|
Building mineBuilding = BuildingManager.getBuilding(this.buildingID);
|
||||||
amount = 6000000;
|
if (mineBuilding == null)
|
||||||
break;
|
return this.production.baseProduction;
|
||||||
case 20:
|
for (AbstractCharacter harvester : mineBuilding.getHirelings().keySet()) {
|
||||||
amount = 12000000;
|
totalModded += baseModValue;
|
||||||
break;
|
totalModded += rankModValue * harvester.getRank();
|
||||||
}
|
}
|
||||||
|
//add base production on top;
|
||||||
|
totalModded += baseProduction;
|
||||||
|
//skip distance check for expansion.
|
||||||
|
if (this.isExpansion())
|
||||||
|
return (int) totalModded;
|
||||||
|
|
||||||
if(this.production.UUID != 7)
|
if (this.owningGuild.isEmptyGuild() == false) {
|
||||||
amount = amount / value;
|
if (this.owningGuild.getOwnedCity() != null) {
|
||||||
|
float distanceSquared = this.owningGuild.getOwnedCity().getLoc().distanceSquared2D(mineBuilding.getLoc());
|
||||||
|
|
||||||
Guild owner = this.owningGuild;
|
if (distanceSquared > sqr(10000 * 3))
|
||||||
|
totalModded *= .25f;
|
||||||
City city;
|
else if (distanceSquared > sqr(10000 * 2))
|
||||||
if(owner != null) {
|
totalModded *= .50f;
|
||||||
city = owner.getOwnedCity();
|
else if (distanceSquared > sqr(10000))
|
||||||
|
totalModded *= .75f;
|
||||||
Building tol = null;
|
|
||||||
if (city != null)
|
|
||||||
tol = city.getTOL();
|
|
||||||
|
|
||||||
if (tol != null && tol.getRank() == 8)
|
|
||||||
return (int) (amount * 1.25f);
|
|
||||||
}
|
|
||||||
return amount;
|
|
||||||
}
|
|
||||||
public Boolean onExit(HashSet<AbstractWorldObject> currentPlayers){
|
|
||||||
ArrayList<Integer> purge = new ArrayList<>();
|
|
||||||
for(int id : this._playerMemory){
|
|
||||||
PlayerCharacter player = PlayerCharacter.getPlayerCharacter(id);
|
|
||||||
if(!currentPlayers.contains(player)){
|
|
||||||
purge.add(id);
|
|
||||||
player.ZergMultiplier = 1.0f;
|
|
||||||
//ChatManager.chatSystemInfo(player,"Left Mine, Multiplier: " + player.ZergMultiplier);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return (int) totalModded;
|
||||||
if(purge.size() > 0) {
|
|
||||||
//this._playerMemory.removeAll(purge);
|
|
||||||
for(int id : purge){
|
|
||||||
if(!this._recentMemory.containsKey(id)) {
|
|
||||||
this._recentMemory.put(id, System.currentTimeMillis() + 60000);
|
|
||||||
} else if(this._recentMemory.get(id) > System.currentTimeMillis()){
|
|
||||||
this._playerMemory.remove(id);
|
|
||||||
//ChatManager.chatSystemInfo(PlayerCharacter.getPlayerCharacter(id),"Left Have Been Removed from The Mine List");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void mineWindowOpen(Mine mine) {
|
|
||||||
mine.setActive(true);
|
|
||||||
Logger.info(mine.getParentZone().getName() + "'s Mine is now Active!");
|
|
||||||
}
|
|
||||||
public static boolean mineWindowClose(Mine mine) {
|
|
||||||
// No need to end the window of a mine which never opened.
|
|
||||||
if (mine.isActive == false)
|
|
||||||
return false;
|
|
||||||
Building mineBuilding = BuildingManager.getBuildingFromCache(mine.getBuildingID());
|
|
||||||
if (mineBuilding == null) {
|
|
||||||
Logger.debug("Null mine building for Mine " + mine.getObjectUUID() + " Building " + mine.getBuildingID());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
for(Integer id : mine._playerMemory ){
|
|
||||||
PlayerCharacter.getPlayerCharacter(id).ZergMultiplier = 1.0f;
|
|
||||||
}
|
|
||||||
for(Integer id : mine._recentMemory.keySet()){
|
|
||||||
PlayerCharacter.getPlayerCharacter(id).ZergMultiplier = 1.0f;
|
|
||||||
}
|
|
||||||
// Mine building still stands; nothing to do.
|
|
||||||
// We can early exit here.
|
|
||||||
if (mineBuilding.getRank() > 0) {
|
|
||||||
mine.setActive(false);
|
|
||||||
mine.lastClaimer = null;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
// This mine does not have a valid claimer
|
|
||||||
// we will therefore set it to errant
|
|
||||||
// and keep the window open.
|
|
||||||
//if (!Mine.validateClaimer(mine.lastClaimer)) {
|
|
||||||
// mine.lastClaimer = null;
|
|
||||||
// mine.updateGuildOwner(null);
|
|
||||||
// mine.setActive(true);
|
|
||||||
// return false;
|
|
||||||
//}
|
|
||||||
//Update ownership to map
|
|
||||||
mine.guildName = mine.getOwningGuild().getName();
|
|
||||||
mine.guildTag = mine.getOwningGuild().getGuildTag();
|
|
||||||
Guild nation = mine.getOwningGuild().getNation();
|
|
||||||
mine.nationName = nation.getName();
|
|
||||||
mine.nationTag = nation.getGuildTag();
|
|
||||||
mineBuilding.rebuildMine(mine.capSize * 5000);
|
|
||||||
WorldGrid.updateObject(mineBuilding);
|
|
||||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mine.lastClaimer.getName() + " has claimed the mine in " + mine.getParentZone().getName() + " for " + mine.getOwningGuild().getName() + ". The mine is no longer active.");
|
|
||||||
chatMsg.setMessageType(10);
|
|
||||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
|
||||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
|
||||||
// Warehouse this claim event
|
|
||||||
MineRecord mineRecord = MineRecord.borrow(mine, mine.lastClaimer, Enum.RecordEventType.CAPTURE);
|
|
||||||
DataWarehouse.pushToWarehouse(mineRecord);
|
|
||||||
mineBuilding.setRank(mineBuilding.getRank());
|
|
||||||
mine.lastClaimer = null;
|
|
||||||
mine.setActive(false);
|
|
||||||
mine.wasClaimed = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
public static void processMineWindows() {
|
|
||||||
LocalDateTime currentTime = LocalDateTime.now();
|
|
||||||
for (Mine mine : Mine.getMines()) {
|
|
||||||
try {
|
|
||||||
Building tower = BuildingManager.getBuildingFromCache(mine.getBuildingID());
|
|
||||||
//if the tower comes back null, skip this mine
|
|
||||||
if (tower == null)
|
|
||||||
continue;
|
|
||||||
//check if this mine needs to open
|
|
||||||
LocalDateTime openTime = LocalDateTime.now().withHour(mine.liveHour).withMinute(mine.liveMinute).withSecond(0).withNano(0);
|
|
||||||
if (currentTime.isAfter(openTime) && currentTime.isBefore(openTime.plusMinutes(30)) && !mine.wasOpened) {
|
|
||||||
mineWindowOpen(mine); //hour and minute match, time to open the window
|
|
||||||
ChatManager.chatSystemChannel(mine.getParentZone().getName() + " " + mine.getMineType() + "MINE is now vulnerable to attack!");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
//check to see if the window shoul dbe closing now
|
|
||||||
if (currentTime.isAfter(openTime.plusMinutes(29)) && mine.isActive) {
|
|
||||||
//check to see if the tower was destoryed
|
|
||||||
boolean towerDestroyed = tower.getRank() < 1;
|
|
||||||
if (towerDestroyed) {
|
|
||||||
//check if a valid claimer exists to close the window and claim the mine since the tower was destroyed
|
|
||||||
if (mine.lastClaimer != null) {
|
|
||||||
mineWindowClose(mine);
|
|
||||||
ChatManager.chatSystemChannel("The fight for " + mine.getParentZone().getName() + " " + mine.getMineType() + " MINE has concluded. " + mine.lastClaimer.getName() + " has seized it in the name of " + mine.lastClaimer.getGuild().getNation());
|
|
||||||
} else {
|
|
||||||
ChatManager.chatSystemChannel("The " + mine.getParentZone().getName() + " " + mine.getMineType() + " MINE is still unclaimed. The battle continues.");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//tower was not destroyed, mine window closes
|
|
||||||
mineWindowClose(mine);
|
|
||||||
ChatManager.chatSystemChannel(tower.getGuild().getNation().getName() + " has successfully defended the " + mine.getParentZone().getName() + " " + mine.getMineType() + " MINE, and retains their claim.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception ex) {
|
|
||||||
Logger.error("Mine Failed: " + mine.getObjectUUID() + " " + ex.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import java.util.HashMap;
|
|||||||
|
|
||||||
public enum MineProduction {
|
public enum MineProduction {
|
||||||
|
|
||||||
LUMBER("Lumber Mine", new HashMap<>(), Resource.WORMWOOD, 1618637196, 1663491950),
|
LUMBER("Lumber Camp", new HashMap<>(), Resource.WORMWOOD, 1618637196, 1663491950),
|
||||||
ORE("Ore Mine", new HashMap<>(), Resource.OBSIDIAN, 518103023, -788976428),
|
ORE("Ore Mine", new HashMap<>(), Resource.OBSIDIAN, 518103023, -788976428),
|
||||||
GOLD("Gold Mine", new HashMap<>(), Resource.GALVOR, -662193002, -1227205358),
|
GOLD("Gold Mine", new HashMap<>(), Resource.GALVOR, -662193002, -1227205358),
|
||||||
MAGIC("Magic Mine", new HashMap<>(), Resource.BLOODSTONE, 504746863, -1753567069);
|
MAGIC("Magic Mine", new HashMap<>(), Resource.BLOODSTONE, 504746863, -1753567069);
|
||||||
@@ -33,7 +33,6 @@ public enum MineProduction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void addResources() {
|
public static void addResources() {
|
||||||
|
|
||||||
if (MineProduction.LUMBER.resources.size() == 0) {
|
if (MineProduction.LUMBER.resources.size() == 0) {
|
||||||
MineProduction.LUMBER.resources.put(7, Resource.GOLD);
|
MineProduction.LUMBER.resources.put(7, Resource.GOLD);
|
||||||
MineProduction.LUMBER.resources.put(1580004, Resource.LUMBER);
|
MineProduction.LUMBER.resources.put(1580004, Resource.LUMBER);
|
||||||
@@ -47,7 +46,6 @@ public enum MineProduction {
|
|||||||
MineProduction.ORE.resources.put(1580001, Resource.TRUESTEEL);
|
MineProduction.ORE.resources.put(1580001, Resource.TRUESTEEL);
|
||||||
MineProduction.ORE.resources.put(1580002, Resource.IRON);
|
MineProduction.ORE.resources.put(1580002, Resource.IRON);
|
||||||
MineProduction.ORE.resources.put(1580003, Resource.ADAMANT);
|
MineProduction.ORE.resources.put(1580003, Resource.ADAMANT);
|
||||||
|
|
||||||
}
|
}
|
||||||
if (MineProduction.GOLD.resources.size() == 0) {
|
if (MineProduction.GOLD.resources.size() == 0) {
|
||||||
MineProduction.GOLD.resources.put(7, Resource.GOLD);
|
MineProduction.GOLD.resources.put(7, Resource.GOLD);
|
||||||
|
|||||||
+73
-305
@@ -25,29 +25,22 @@ import engine.net.Dispatch;
|
|||||||
import engine.net.DispatchMessage;
|
import engine.net.DispatchMessage;
|
||||||
import engine.net.client.msg.PetMsg;
|
import engine.net.client.msg.PetMsg;
|
||||||
import engine.net.client.msg.PlaceAssetMsg;
|
import engine.net.client.msg.PlaceAssetMsg;
|
||||||
import engine.powers.MobPowerEntry;
|
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.EnumSet;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
|
||||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||||
|
|
||||||
import static engine.gameManager.NPCManager._runeSetMap;
|
|
||||||
import static engine.net.client.msg.ErrorPopupMsg.sendErrorPopup;
|
import static engine.net.client.msg.ErrorPopupMsg.sendErrorPopup;
|
||||||
|
|
||||||
public class Mob extends AbstractIntelligenceAgent {
|
public class Mob extends AbstractIntelligenceAgent {
|
||||||
|
|
||||||
public Resists mobResists = new Resists("Generic");
|
|
||||||
private static int staticID = 0;
|
private static int staticID = 0;
|
||||||
public static ArrayList<Mob> disciplineDroppers = new ArrayList<>();
|
|
||||||
public static HashMap<Integer,Mob> dynamic_pets = new HashMap<>();
|
|
||||||
//mob specific
|
//mob specific
|
||||||
public final ConcurrentHashMap<Integer, Float> playerAgroMap = new ConcurrentHashMap<>(); //key = Player value = hate value
|
public final ConcurrentHashMap<Integer, Float> playerAgroMap = new ConcurrentHashMap<>(); //key = Player value = hate value
|
||||||
|
|
||||||
@@ -57,7 +50,6 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
public ReentrantReadWriteLock minionLock = new ReentrantReadWriteLock();
|
public ReentrantReadWriteLock minionLock = new ReentrantReadWriteLock();
|
||||||
public boolean despawned = false;
|
public boolean despawned = false;
|
||||||
public Vector3fImmutable destination = Vector3fImmutable.ZERO;
|
public Vector3fImmutable destination = Vector3fImmutable.ZERO;
|
||||||
public LinkedHashMap<Integer, Integer> mobPowers = new LinkedHashMap<>();
|
|
||||||
public MobBase mobBase;
|
public MobBase mobBase;
|
||||||
public int spawnTime;
|
public int spawnTime;
|
||||||
public Zone parentZone;
|
public Zone parentZone;
|
||||||
@@ -71,12 +63,10 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
public float spawnRadius;
|
public float spawnRadius;
|
||||||
//used by static mobs
|
//used by static mobs
|
||||||
public int parentZoneUUID;
|
public int parentZoneUUID;
|
||||||
protected int dbID; //the database ID
|
|
||||||
|
|
||||||
private int currentID;
|
|
||||||
|
|
||||||
//TODO implement feared object system
|
//TODO implement feared object system
|
||||||
public AbstractWorldObject fearedObject = null;
|
public AbstractWorldObject fearedObject = null;
|
||||||
|
protected int dbID; //the database ID
|
||||||
|
private int currentID;
|
||||||
private long lastAttackTime = 0;
|
private long lastAttackTime = 0;
|
||||||
private int lastMobPowerToken = 0;
|
private int lastMobPowerToken = 0;
|
||||||
private HashMap<Integer, MobEquipment> equip = null;
|
private HashMap<Integer, MobEquipment> equip = null;
|
||||||
@@ -84,11 +74,6 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
private DateTime upgradeDateTime = null;
|
private DateTime upgradeDateTime = null;
|
||||||
private boolean lootSync = false;
|
private boolean lootSync = false;
|
||||||
|
|
||||||
public boolean dropper = false;
|
|
||||||
|
|
||||||
public int contractCounter = 0;
|
|
||||||
public int runeCounter = 0;
|
|
||||||
|
|
||||||
// New Mobile constructor. Fill in the blanks and then call
|
// New Mobile constructor. Fill in the blanks and then call
|
||||||
// PERSIST.
|
// PERSIST.
|
||||||
public Mob() {
|
public Mob() {
|
||||||
@@ -98,7 +83,6 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
this.bindLoc = Vector3fImmutable.ZERO;
|
this.bindLoc = Vector3fImmutable.ZERO;
|
||||||
this.gridObjectType = GridObjectType.DYNAMIC;
|
this.gridObjectType = GridObjectType.DYNAMIC;
|
||||||
this.agentType = AIAgentType.MOBILE;
|
this.agentType = AIAgentType.MOBILE;
|
||||||
setResistsForMob(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -117,6 +101,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
this.dbID = rs.getInt(1);
|
this.dbID = rs.getInt(1);
|
||||||
this.loadID = rs.getInt("mob_mobbaseID");
|
this.loadID = rs.getInt("mob_mobbaseID");
|
||||||
this.gridObjectType = GridObjectType.DYNAMIC;
|
this.gridObjectType = GridObjectType.DYNAMIC;
|
||||||
|
this.agentType = AIAgentType.MOBILE;
|
||||||
|
|
||||||
this.spawnRadius = rs.getFloat("mob_spawnRadius");
|
this.spawnRadius = rs.getFloat("mob_spawnRadius");
|
||||||
this.spawnTime = rs.getInt("mob_spawnTime");
|
this.spawnTime = rs.getInt("mob_spawnTime");
|
||||||
@@ -159,159 +144,18 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
this.notEnemy = EnumBitSet.asEnumBitSet(rs.getLong("notEnemy"), Enum.MonsterType.class);
|
this.notEnemy = EnumBitSet.asEnumBitSet(rs.getLong("notEnemy"), Enum.MonsterType.class);
|
||||||
this.enemy = EnumBitSet.asEnumBitSet(rs.getLong("enemy"), Enum.MonsterType.class);
|
this.enemy = EnumBitSet.asEnumBitSet(rs.getLong("enemy"), Enum.MonsterType.class);
|
||||||
this.firstName = rs.getString("mob_name");
|
this.firstName = rs.getString("mob_name");
|
||||||
if (this.getMobBaseID() == 14104) {//guards
|
|
||||||
this.behaviourType = MobBehaviourType.Aggro;
|
if (rs.getString("fsm").length() > 1)
|
||||||
} else if (rs.getString("fsm").length() > 1){
|
|
||||||
this.behaviourType = MobBehaviourType.valueOf(rs.getString("fsm"));
|
this.behaviourType = MobBehaviourType.valueOf(rs.getString("fsm"));
|
||||||
}
|
|
||||||
this.currentID = this.dbID;
|
this.currentID = this.dbID;
|
||||||
|
|
||||||
this.agentType = AIAgentType.MOBILE;
|
|
||||||
|
|
||||||
//this.setResists(Resists.getResists(rs.getInt("mob_spawnType")));
|
|
||||||
|
|
||||||
setResistsForMob(this);
|
|
||||||
|
|
||||||
this.contractCounter = ThreadLocalRandom.current().nextInt(250);
|
|
||||||
this.runeCounter = ThreadLocalRandom.current().nextInt(250);
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.error(e + " " + this.dbID);
|
Logger.error(e + " " + this.dbID);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setResistsForMob(Mob mob){
|
|
||||||
Resists resists = new Resists("Generic");
|
|
||||||
Zone parentMacro = null;
|
|
||||||
for(Zone zone : ZoneManager.getAllZonesIn(mob.loc)){
|
|
||||||
if(zone.isMacroZone() == false)
|
|
||||||
continue;
|
|
||||||
parentMacro = zone;
|
|
||||||
}
|
|
||||||
if(parentMacro != null) {
|
|
||||||
switch (parentMacro.getName()) {
|
|
||||||
//ice generics
|
|
||||||
case "Ymur's Crown":
|
|
||||||
case "Kralgaar Holm":
|
|
||||||
case "Ecklund Wilds":
|
|
||||||
case "Aurrochs Skrae":
|
|
||||||
resists.addResists(Resists.getResists(28));
|
|
||||||
break;
|
|
||||||
//Desert Generics
|
|
||||||
case "Leth'khalivar Desert":
|
|
||||||
case "Kharsoom":
|
|
||||||
case "Vale of Nar Addad":
|
|
||||||
case "The Blood Sands":
|
|
||||||
resists.addResists(Resists.getResists(2));
|
|
||||||
break;
|
|
||||||
//Swamp Generics
|
|
||||||
case "Thollok Marsh":
|
|
||||||
case "The Black Bog":
|
|
||||||
case "Sevaath Mere":
|
|
||||||
resists.addResists(Resists.getResists(8));
|
|
||||||
break;
|
|
||||||
//Oblivion Generics
|
|
||||||
case "Plain of Ashes":
|
|
||||||
case "Bone Marches":
|
|
||||||
case "The Doomplain":
|
|
||||||
case "Greensward Pyre":
|
|
||||||
resists.addResists(Resists.getResists(4));
|
|
||||||
break;
|
|
||||||
//Maelstrom Generics
|
|
||||||
case "Pandemonium":
|
|
||||||
case "Western Battleground":
|
|
||||||
resists.addResists(Resists.getResists(32));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(MobBase.mobbase_race_types.size() == 0){
|
|
||||||
DbManager.MobBaseQueries.LOAD_ALL_MOBBASE_RACES();
|
|
||||||
}
|
|
||||||
int mobbaseID = mob.getMobBaseID();
|
|
||||||
if(mobbaseID != 0) {
|
|
||||||
switch (MobBase.mobbase_race_types.get(mobbaseID)) {
|
|
||||||
case "Aelfborn":
|
|
||||||
case "NPC":
|
|
||||||
case "Rat":
|
|
||||||
case "Reptile":
|
|
||||||
case "Grave":
|
|
||||||
case "Human":
|
|
||||||
case "Goblin":
|
|
||||||
case "CSR":
|
|
||||||
case "Construct":
|
|
||||||
case "Celestial":
|
|
||||||
case "Animal":
|
|
||||||
case "All":
|
|
||||||
case "SiegeEngineer":
|
|
||||||
resists.addResists(new Resists("Generic"));
|
|
||||||
break;
|
|
||||||
case "Aracoix":
|
|
||||||
resists.addResists(Resists.getResists(22));
|
|
||||||
break;
|
|
||||||
case "Centaur":
|
|
||||||
resists.addResists(Resists.getResists(24));
|
|
||||||
break;
|
|
||||||
case "Dragon":
|
|
||||||
resists.addResists(Resists.getResists(10));
|
|
||||||
break;
|
|
||||||
case "Dwarf":
|
|
||||||
resists.addResists(Resists.getResists(25));
|
|
||||||
break;
|
|
||||||
case "Elf":
|
|
||||||
resists.addResists(Resists.getResists(5));
|
|
||||||
break;
|
|
||||||
case "Giant":
|
|
||||||
resists.addResists(Resists.getResists(34));
|
|
||||||
break;
|
|
||||||
case "HalfGiant":
|
|
||||||
resists.addResists(Resists.getResists(6));
|
|
||||||
break;
|
|
||||||
case "Infernal":
|
|
||||||
resists.addResists(Resists.getResists(18));
|
|
||||||
break;
|
|
||||||
case "Insect":
|
|
||||||
case "Pet":
|
|
||||||
case "Summoned":
|
|
||||||
resists.addResists(Resists.getResists(19));
|
|
||||||
break;
|
|
||||||
case "Irekei":
|
|
||||||
resists.addResists(Resists.getResists(12));
|
|
||||||
break;
|
|
||||||
case "Minotaur":
|
|
||||||
resists.addResists(Resists.getResists(13));
|
|
||||||
break;
|
|
||||||
case "Monster":
|
|
||||||
resists.addResists(Resists.getResists(35));
|
|
||||||
break;
|
|
||||||
case "NecroPet":
|
|
||||||
resists.addResists(Resists.getResists(23));
|
|
||||||
break;
|
|
||||||
case "Plant":
|
|
||||||
resists.addResists(Resists.getResists(36));
|
|
||||||
break;
|
|
||||||
case "Shade":
|
|
||||||
resists.addResists(Resists.getResists(26));
|
|
||||||
break;
|
|
||||||
case "Siege":
|
|
||||||
resists.addResists(Resists.getResists(38));
|
|
||||||
break;
|
|
||||||
case "Troll":
|
|
||||||
resists.addResists(Resists.getResists(33));
|
|
||||||
break;
|
|
||||||
case "Undead":
|
|
||||||
resists.addResists(Resists.getResists(27));
|
|
||||||
break;
|
|
||||||
case "Nephilim":
|
|
||||||
resists.addResists(Resists.getResists(7));
|
|
||||||
break;
|
|
||||||
case "Vampire":
|
|
||||||
resists.addResists(Resists.getResists(11));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mob.mobResists = resists;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void serializeMobForClientMsgOtherPlayer(Mob mob, ByteBufferWriter writer) throws SerializationException {
|
public static void serializeMobForClientMsgOtherPlayer(Mob mob, ByteBufferWriter writer) throws SerializationException {
|
||||||
Mob.serializeForClientMsgOtherPlayer(mob, writer);
|
Mob.serializeForClientMsgOtherPlayer(mob, writer);
|
||||||
}
|
}
|
||||||
@@ -335,7 +179,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
} else if (tid == 100962 || tid == 100965) { //Spydraxxx the Mighty, Denigo Tantric
|
} else if (tid == 100962 || tid == 100965) { //Spydraxxx the Mighty, Denigo Tantric
|
||||||
writer.putInt(2);
|
writer.putInt(2);
|
||||||
serializeRune(mob, writer, 5, GameObjectType.NPCClassRuneTwo.ordinal(), 252621); //guard rune
|
serializeRune(mob, writer, 5, GameObjectType.NPCClassRuneTwo.ordinal(), 252621); //guard rune
|
||||||
} else if (mob.contract != null || mob.isPlayerGuard) {
|
} else if (mob.contract != null || mob.isPlayerGuard()) {
|
||||||
writer.putInt(3);
|
writer.putInt(3);
|
||||||
serializeRune(mob, writer, 3, GameObjectType.NPCClassRuneTwo.ordinal(), MobBase.GetClassType(mob.getMobBaseID())); //warrior class
|
serializeRune(mob, writer, 3, GameObjectType.NPCClassRuneTwo.ordinal(), MobBase.GetClassType(mob.getMobBaseID())); //warrior class
|
||||||
serializeRune(mob, writer, 5, GameObjectType.NPCClassRuneThree.ordinal(), 252621); //guard rune
|
serializeRune(mob, writer, 5, GameObjectType.NPCClassRuneThree.ordinal(), 252621); //guard rune
|
||||||
@@ -468,13 +312,13 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
writer.put((byte) 1);
|
writer.put((byte) 1);
|
||||||
|
|
||||||
|
|
||||||
if ((PlayerCharacter) mob.guardCaptain != null) {
|
if (mob.guardCaptain != null) {
|
||||||
|
|
||||||
|
|
||||||
writer.putInt(((PlayerCharacter) mob.guardCaptain).getObjectType().ordinal());
|
writer.putInt(mob.guardCaptain.getObjectType().ordinal());
|
||||||
|
|
||||||
|
|
||||||
writer.putInt(((PlayerCharacter) mob.guardCaptain).getObjectUUID());
|
writer.putInt(mob.guardCaptain.getObjectUUID());
|
||||||
} else {
|
} else {
|
||||||
writer.putInt(0); //ownerType
|
writer.putInt(0); //ownerType
|
||||||
writer.putInt(0); //ownerID
|
writer.putInt(0); //ownerID
|
||||||
@@ -492,7 +336,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
writer.putInt(0);
|
writer.putInt(0);
|
||||||
writer.putInt(0);
|
writer.putInt(0);
|
||||||
|
|
||||||
if (!mob.isAlive() && !mob.isPet() && !mob.isNecroPet() && !mob.behaviourType.equals(MobBehaviourType.SiegeEngine) && !mob.isPlayerGuard) {
|
if (!mob.isAlive() && !mob.isPet() && !mob.isNecroPet() && !mob.behaviourType.equals(MobBehaviourType.SiegeEngine) && !mob.isPlayerGuard()) {
|
||||||
writer.putInt(0);
|
writer.putInt(0);
|
||||||
writer.putInt(0);
|
writer.putInt(0);
|
||||||
}
|
}
|
||||||
@@ -557,6 +401,8 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
|
|
||||||
Mob mobile = new Mob();
|
Mob mobile = new Mob();
|
||||||
mobile.dbID = MBServerStatics.NO_DB_ROW_ASSIGNED_YET;
|
mobile.dbID = MBServerStatics.NO_DB_ROW_ASSIGNED_YET;
|
||||||
|
mobile.agentType = AIAgentType.MOBILE;
|
||||||
|
mobile.behaviourType = MobBehaviourType.None;
|
||||||
mobile.loadID = loadID;
|
mobile.loadID = loadID;
|
||||||
mobile.level = (short) level;
|
mobile.level = (short) level;
|
||||||
|
|
||||||
@@ -580,18 +426,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
else
|
else
|
||||||
mobile.contractUUID = contract.getContractID();
|
mobile.contractUUID = contract.getContractID();
|
||||||
|
|
||||||
Mob mob;
|
return mobile;
|
||||||
|
|
||||||
mobile.agentType = AIAgentType.GUARD;
|
|
||||||
try {
|
|
||||||
mob = DbManager.MobQueries.PERSIST(mobile);
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
Logger.error("SQLException:" + e.getMessage());
|
|
||||||
mob = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return mob;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static synchronized Mob createGuardMinion(Mob guardCaptain, short level, String minionName) {
|
public static synchronized Mob createGuardMinion(Mob guardCaptain, short level, String minionName) {
|
||||||
@@ -615,8 +450,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
minionMobile.guardCaptain = guardCaptain;
|
minionMobile.guardCaptain = guardCaptain;
|
||||||
minionMobile.spawnTime = (int) (-2.500 * guardCaptain.building.getRank() + 22.5) * 60;
|
minionMobile.spawnTime = (int) (-2.500 * guardCaptain.building.getRank() + 22.5) * 60;
|
||||||
minionMobile.behaviourType = Enum.MobBehaviourType.GuardMinion;
|
minionMobile.behaviourType = Enum.MobBehaviourType.GuardMinion;
|
||||||
minionMobile.agentType = AIAgentType.GUARD;
|
minionMobile.agentType = AIAgentType.GUARDMINION;
|
||||||
minionMobile.isPlayerGuard = true;
|
|
||||||
minionMobile.guardedCity = guardCaptain.guardedCity;
|
minionMobile.guardedCity = guardCaptain.guardedCity;
|
||||||
minionMobile.patrolPoints = guardCaptain.building.patrolPoints;
|
minionMobile.patrolPoints = guardCaptain.building.patrolPoints;
|
||||||
|
|
||||||
@@ -713,13 +547,12 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
|
|
||||||
petMinion.despawned = false;
|
petMinion.despawned = false;
|
||||||
petMinion.runAfterLoad();
|
petMinion.runAfterLoad();
|
||||||
//DbManager.addToCache(petMinion);
|
DbManager.addToCache(petMinion);
|
||||||
Mob.dynamic_pets.put(petMinion.getObjectUUID(),petMinion);
|
|
||||||
Logger.info("Added Pet To dynamic_pets with UUID: " + petMinion.getObjectUUID());
|
|
||||||
petMinion.setLoc(petMinion.bindLoc);
|
petMinion.setLoc(petMinion.bindLoc);
|
||||||
|
|
||||||
return petMinion;
|
return petMinion;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Mob getMob(int id) {
|
public static Mob getMob(int id) {
|
||||||
|
|
||||||
if (id == 0)
|
if (id == 0)
|
||||||
@@ -862,7 +695,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
public Vector3fImmutable getBindLoc() {
|
public Vector3fImmutable getBindLoc() {
|
||||||
|
|
||||||
if (this.isPet() && !this.behaviourType.equals(MobBehaviourType.SiegeEngine))
|
if (this.isPet() && !this.behaviourType.equals(MobBehaviourType.SiegeEngine))
|
||||||
return (PlayerCharacter) this.guardCaptain != null ? ((PlayerCharacter) this.guardCaptain).getLoc() : this.getLoc();
|
return this.guardCaptain != null ? this.guardCaptain.getLoc() : this.getLoc();
|
||||||
else
|
else
|
||||||
return this.bindLoc;
|
return this.bindLoc;
|
||||||
}
|
}
|
||||||
@@ -911,7 +744,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
// get rune and effect bonuses
|
// get rune and effect bonuses
|
||||||
bonus *= (1 + this.bonuses.getFloatPercentAll(ModType.Speed, SourceType.None));
|
bonus *= (1 + this.bonuses.getFloatPercentAll(ModType.Speed, SourceType.None));
|
||||||
|
|
||||||
if (this.isPlayerGuard)
|
if (this.isPlayerGuard())
|
||||||
switch (this.mobBase.getLoadID()) {
|
switch (this.mobBase.getLoadID()) {
|
||||||
case 2111:
|
case 2111:
|
||||||
if (this.isWalk())
|
if (this.isWalk())
|
||||||
@@ -979,7 +812,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
Group g = GroupManager.getGroup((PlayerCharacter) attacker);
|
Group g = GroupManager.getGroup((PlayerCharacter) attacker);
|
||||||
|
|
||||||
// Give XP, now handled inside the Experience Object
|
// Give XP, now handled inside the Experience Object
|
||||||
if (!this.isPet() && !this.isNecroPet() && !(this.agentType.equals(AIAgentType.PET)) && !this.isPlayerGuard)
|
if (!this.isPet() && !this.isNecroPet() && !(this.agentType.equals(AIAgentType.PET)) && !this.isPlayerGuard())
|
||||||
Experience.doExperience((PlayerCharacter) attacker, this, g);
|
Experience.doExperience((PlayerCharacter) attacker, this, g);
|
||||||
} else if (attacker.getObjectType().equals(GameObjectType.Mob)) {
|
} else if (attacker.getObjectType().equals(GameObjectType.Mob)) {
|
||||||
Mob mobAttacker = (Mob) attacker;
|
Mob mobAttacker = (Mob) attacker;
|
||||||
@@ -990,7 +823,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
PlayerCharacter owner = (PlayerCharacter) mobAttacker.guardCaptain;
|
PlayerCharacter owner = (PlayerCharacter) mobAttacker.guardCaptain;
|
||||||
|
|
||||||
if (owner != null)
|
if (owner != null)
|
||||||
if (!this.isPet() && !this.isNecroPet() && !(this.agentType.equals(AIAgentType.PET)) && !this.isPlayerGuard) {
|
if (!this.isPet() && !this.isNecroPet() && !(this.agentType.equals(AIAgentType.PET)) && !this.isPlayerGuard()) {
|
||||||
Group g = GroupManager.getGroup(owner);
|
Group g = GroupManager.getGroup(owner);
|
||||||
|
|
||||||
// Give XP, now handled inside the Experience Object
|
// Give XP, now handled inside the Experience Object
|
||||||
@@ -1016,8 +849,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
|
|
||||||
Vector3fImmutable newLoc = this.getMovementLoc();
|
Vector3fImmutable newLoc = this.getMovementLoc();
|
||||||
|
|
||||||
//if (newLoc.equals(this.getEndLoc())) {
|
if (newLoc.equals(this.getEndLoc())) {
|
||||||
if(newLoc.distanceSquared(this.getEndLoc()) < 4){
|
|
||||||
this.stopMovement(newLoc);
|
this.stopMovement(newLoc);
|
||||||
this.region = AbstractWorldObject.GetRegionByWorldObject(this);
|
this.region = AbstractWorldObject.GetRegionByWorldObject(this);
|
||||||
return;
|
return;
|
||||||
@@ -1088,11 +920,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
this.playerAgroMap.clear();
|
this.playerAgroMap.clear();
|
||||||
WorldGrid.RemoveWorldObject(this);
|
WorldGrid.RemoveWorldObject(this);
|
||||||
|
|
||||||
//DbManager.removeFromCache(this);
|
DbManager.removeFromCache(this);
|
||||||
if(Mob.dynamic_pets.containsKey(this.getObjectUUID())) {
|
|
||||||
Mob.dynamic_pets.remove(this.getObjectUUID());
|
|
||||||
Logger.info("Removed Pet From dynamic_pets with UUID: " + this.getObjectUUID());
|
|
||||||
}
|
|
||||||
PlayerCharacter petOwner = (PlayerCharacter) this.guardCaptain;
|
PlayerCharacter petOwner = (PlayerCharacter) this.guardCaptain;
|
||||||
|
|
||||||
if (petOwner != null) {
|
if (petOwner != null) {
|
||||||
@@ -1109,7 +937,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
|
|
||||||
playerAgroMap.clear();
|
playerAgroMap.clear();
|
||||||
|
|
||||||
if (!this.isPlayerGuard && this.equip != null)
|
if (!this.isPlayerGuard() && this.equip != null)
|
||||||
LootManager.GenerateEquipmentDrop(this);
|
LootManager.GenerateEquipmentDrop(this);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1156,8 +984,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
else if (this.building != null)
|
else if (this.building != null)
|
||||||
this.region = BuildingManager.GetRegion(this.building, bindLoc.x, bindLoc.y, bindLoc.z);
|
this.region = BuildingManager.GetRegion(this.building, bindLoc.x, bindLoc.y, bindLoc.z);
|
||||||
|
|
||||||
if (!this.behaviourType.equals(MobBehaviourType.SiegeEngine) && !this.isPlayerGuard && contract == null)
|
this.loadInventory();
|
||||||
loadInventory();
|
|
||||||
|
|
||||||
this.updateLocation();
|
this.updateLocation();
|
||||||
}
|
}
|
||||||
@@ -1195,7 +1022,9 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
this.charItemManager.clearInventory();
|
this.charItemManager.clearInventory();
|
||||||
this.charItemManager.clearEquip();
|
this.charItemManager.clearEquip();
|
||||||
|
|
||||||
if (isPlayerGuard)
|
// Only generate loot for mobiles
|
||||||
|
|
||||||
|
if (!this.agentType.equals(AIAgentType.MOBILE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
LootManager.GenerateMobLoot(this);
|
LootManager.GenerateMobLoot(this);
|
||||||
@@ -1228,6 +1057,8 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.error(e.getMessage());
|
Logger.error(e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Resists.calculateResists(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void calculateMaxHealthManaStamina() {
|
public void calculateMaxHealthManaStamina() {
|
||||||
@@ -1289,7 +1120,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
public void calculateAtrDefenseDamage() {
|
public void calculateAtrDefenseDamage() {
|
||||||
|
|
||||||
if (this.charItemManager == null || this.equip == null) {
|
if (this.charItemManager == null || this.equip == null) {
|
||||||
//Logger.error("Player " + currentID + " missing skills or equipment");
|
Logger.error("Player " + currentID + " missing skills or equipment");
|
||||||
defaultAtrAndDamage(true);
|
defaultAtrAndDamage(true);
|
||||||
defaultAtrAndDamage(false);
|
defaultAtrAndDamage(false);
|
||||||
this.defenseRating = 0;
|
this.defenseRating = 0;
|
||||||
@@ -1686,49 +1517,33 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
@Override
|
@Override
|
||||||
public void runAfterLoad() {
|
public void runAfterLoad() {
|
||||||
|
|
||||||
this.charItemManager = new CharacterItemManager(this);
|
this.setObjectTypeMask(MBServerStatics.MASK_MOB | this.getTypeMasks());
|
||||||
|
|
||||||
if (ConfigManager.serverType.equals(ServerType.LOGINSERVER))
|
if (ConfigManager.serverType.equals(ServerType.LOGINSERVER))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this.mobBase = MobBase.getMobBase(loadID);
|
this.charItemManager = new CharacterItemManager(this);
|
||||||
|
|
||||||
this.setObjectTypeMask(MBServerStatics.MASK_MOB | this.getTypeMasks());
|
this.mobBase = MobBase.getMobBase(loadID);
|
||||||
|
|
||||||
this.building = BuildingManager.getBuilding(this.buildingUUID);
|
this.building = BuildingManager.getBuilding(this.buildingUUID);
|
||||||
|
|
||||||
if (this.contractUUID == 0)
|
// Configure AI related values
|
||||||
this.contract = null;
|
|
||||||
else
|
|
||||||
this.contract = DbManager.ContractQueries.GET_CONTRACT(this.contractUUID);
|
|
||||||
|
|
||||||
// Setup mobile AI and equipset for contract
|
switch (this.behaviourType) {
|
||||||
|
case GuardCaptain:
|
||||||
if (this.contract != null) {
|
this.agentType = AIAgentType.GUARDCAPTAIN;
|
||||||
|
this.spawnTime = 600;
|
||||||
this.equipmentSetID = this.contract.getEquipmentSet();
|
|
||||||
|
|
||||||
// Load AI for guard captains
|
|
||||||
|
|
||||||
if (NPC.ISGuardCaptain(contract.getContractID()) || this.contract.getContractID() == 910) { // Guard Dog
|
|
||||||
this.behaviourType = MobBehaviourType.GuardCaptain;
|
|
||||||
this.spawnTime = 60 * 15;
|
|
||||||
this.isPlayerGuard = true;
|
|
||||||
this.guardedCity = ZoneManager.getCityAtLocation(this.building.getLoc());
|
this.guardedCity = ZoneManager.getCityAtLocation(this.building.getLoc());
|
||||||
}
|
break;
|
||||||
|
case GuardWallArcher:
|
||||||
// Load AI for wall archers
|
this.agentType = AIAgentType.GUARDWALLARCHER;
|
||||||
|
|
||||||
if (NPC.ISWallArcher(this.contract)) {
|
|
||||||
this.gridObjectType = GridObjectType.DYNAMIC;
|
|
||||||
this.behaviourType = MobBehaviourType.GuardWallArcher;
|
|
||||||
this.isPlayerGuard = true;
|
|
||||||
this.spawnTime = 450;
|
this.spawnTime = 450;
|
||||||
this.guardedCity = ZoneManager.getCityAtLocation(this.building.getLoc());
|
this.guardedCity = ZoneManager.getCityAtLocation(this.building.getLoc());
|
||||||
}
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Default to the mobbase for AI if nothing is hte mob field to override.
|
// Default to the mobbase for AI if nothing is in mob field to override.
|
||||||
|
|
||||||
if (this.behaviourType == null || this.behaviourType.equals(MobBehaviourType.None))
|
if (this.behaviourType == null || this.behaviourType.equals(MobBehaviourType.None))
|
||||||
this.behaviourType = this.getMobBase().fsm;
|
this.behaviourType = this.getMobBase().fsm;
|
||||||
@@ -1736,6 +1551,18 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
if (this.behaviourType == null)
|
if (this.behaviourType == null)
|
||||||
this.behaviourType = MobBehaviourType.None;
|
this.behaviourType = MobBehaviourType.None;
|
||||||
|
|
||||||
|
if (this.contractUUID == 0)
|
||||||
|
this.contract = null;
|
||||||
|
else
|
||||||
|
this.contract = DbManager.ContractQueries.GET_CONTRACT(this.contractUUID);
|
||||||
|
|
||||||
|
// Setup equipset for contract
|
||||||
|
|
||||||
|
if (this.contract != null)
|
||||||
|
this.equipmentSetID = this.contract.getEquipmentSet();
|
||||||
|
|
||||||
|
// Mobiles default to the building guild.
|
||||||
|
|
||||||
if (this.building != null)
|
if (this.building != null)
|
||||||
this.guild = this.building.getGuild();
|
this.guild = this.building.getGuild();
|
||||||
else
|
else
|
||||||
@@ -1761,7 +1588,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
// Don't override level for guard minions or pets
|
// Don't override level for guard minions or pets
|
||||||
|
|
||||||
if (this.contract == null)
|
if (this.contract == null)
|
||||||
if (!this.agentType.equals(AIAgentType.GUARD) && !this.agentType.equals(AIAgentType.PET))
|
if (!this.agentType.equals(AIAgentType.GUARDMINION) && !this.agentType.equals(AIAgentType.PET))
|
||||||
this.level = (short) this.mobBase.getLevel();
|
this.level = (short) this.mobBase.getLevel();
|
||||||
|
|
||||||
//set bonuses
|
//set bonuses
|
||||||
@@ -1771,8 +1598,8 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
//TODO set these correctly later
|
//TODO set these correctly later
|
||||||
this.rangeHandOne = this.mobBase.getAttackRange();
|
this.rangeHandOne = this.mobBase.getAttackRange();
|
||||||
this.rangeHandTwo = -1;
|
this.rangeHandTwo = -1;
|
||||||
this.minDamageHandOne = (int)this.mobBase.getMinDmg();
|
this.minDamageHandOne = (int) this.mobBase.getMinDmg();
|
||||||
this.maxDamageHandOne = (int)this.mobBase.getMaxDmg();
|
this.maxDamageHandOne = (int) this.mobBase.getMaxDmg();
|
||||||
this.minDamageHandTwo = 0;
|
this.minDamageHandTwo = 0;
|
||||||
this.maxDamageHandTwo = 0;
|
this.maxDamageHandTwo = 0;
|
||||||
this.atrHandOne = this.mobBase.getAtr();
|
this.atrHandOne = this.mobBase.getAtr();
|
||||||
@@ -1821,18 +1648,6 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
else
|
else
|
||||||
this.equip = new HashMap<>();
|
this.equip = new HashMap<>();
|
||||||
|
|
||||||
// Powers from mobbase
|
|
||||||
|
|
||||||
if (PowersManager.AllMobPowers.containsKey(this.getMobBaseID()))
|
|
||||||
for (MobPowerEntry mobPowerEntry : PowersManager.AllMobPowers.get(this.getMobBaseID()))
|
|
||||||
mobPowers.put(mobPowerEntry.token, mobPowerEntry.rank);
|
|
||||||
|
|
||||||
// Powers from contract
|
|
||||||
|
|
||||||
if (this.contract != null && PowersManager.AllMobPowers.containsKey(this.contract.getContractID()))
|
|
||||||
for (MobPowerEntry mobPowerEntry : PowersManager.AllMobPowers.get(this.contract.getContractID()))
|
|
||||||
mobPowers.put(mobPowerEntry.token, mobPowerEntry.rank);
|
|
||||||
|
|
||||||
if (this.equip == null) {
|
if (this.equip == null) {
|
||||||
Logger.error("Null equipset returned for uuid " + currentID);
|
Logger.error("Null equipset returned for uuid " + currentID);
|
||||||
this.equip = new HashMap<>(0);
|
this.equip = new HashMap<>(0);
|
||||||
@@ -1849,71 +1664,23 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
this.enemy.addAll(this.getMobBase().enemy);
|
this.enemy.addAll(this.getMobBase().enemy);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
NPCManager.applyRuneSetEffects(this);
|
||||||
NPCManager.applyRuneSetEffects(this);
|
recalculateStats();
|
||||||
recalculateStats();
|
this.setHealth(this.healthMax);
|
||||||
if(this.mobBase.getLevel() > 80){
|
|
||||||
if(this.getMobBaseID() == 14319){//ithriana
|
|
||||||
this.healthMax = 5400000;
|
|
||||||
} else{
|
|
||||||
this.healthMax = 1500000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.setHealth(this.healthMax);
|
|
||||||
|
|
||||||
// Set bounds for this mobile
|
// Set bounds for this mobile
|
||||||
|
|
||||||
Bounds mobBounds = Bounds.borrow();
|
Bounds mobBounds = Bounds.borrow();
|
||||||
mobBounds.setBounds(this.getLoc());
|
mobBounds.setBounds(this.getLoc());
|
||||||
this.setBounds(mobBounds);
|
this.setBounds(mobBounds);
|
||||||
|
|
||||||
//assign 5 random patrol points for regular mobs
|
//assign 5 random patrol points for regular mobs
|
||||||
|
|
||||||
if (this.agentType.equals(AIAgentType.MOBILE)) {
|
if (this.agentType.equals(AIAgentType.MOBILE))
|
||||||
|
NPCManager.AssignPatrolPoints(this);
|
||||||
|
|
||||||
NPCManager.AssignPatrolPoints(this);
|
this.deathTime = 0;
|
||||||
}
|
|
||||||
|
|
||||||
this.deathTime = 0;
|
|
||||||
} catch (Exception e) {
|
|
||||||
Logger.error(e.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
if(this.behaviourType.equals(MobBehaviourType.HamletGuard) && this.getMobBaseID() == 14104) {//guards
|
|
||||||
this.behaviourType = MobBehaviourType.Aggro;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(MobEquipment equipped: this.equip.values()){
|
|
||||||
if(equipped.getItemBase().isVorg() && this.getMobBaseID() != 14062 && this.getMobBaseID() != 14163){
|
|
||||||
this.dropper = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for(Item item : this.charItemManager.getInventory()){
|
|
||||||
if(item.getItemBase().isDiscRune() && this.level < 75){
|
|
||||||
this.dropper = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(this.dropper){
|
|
||||||
this.level = 65;
|
|
||||||
this.atrHandOne *= 2;
|
|
||||||
this.atrHandTwo *= 2;
|
|
||||||
this.defenseRating *= 2;
|
|
||||||
this.maxDamageHandOne *= 2;
|
|
||||||
this.maxDamageHandTwo *= 2;
|
|
||||||
this.minDamageHandOne *= 2;
|
|
||||||
this.minDamageHandTwo *= 2;
|
|
||||||
}
|
|
||||||
//for(Item loot : this.charItemManager.getInventory()){
|
|
||||||
// if(loot.getItemBase().isDiscRune() && this.level < 80){
|
|
||||||
// if(this.firstSpawn) {
|
|
||||||
// this.killCharacter("first spawn");
|
|
||||||
// this.firstSpawn = false;
|
|
||||||
// if(this.despawned == false)
|
|
||||||
// this.despawn();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -2022,7 +1789,8 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPlayerGuard() {
|
public boolean isPlayerGuard() {
|
||||||
return isPlayerGuard;
|
|
||||||
|
return EnumSet.of(AIAgentType.GUARDCAPTAIN, AIAgentType.GUARDMINION, AIAgentType.GUARDWALLARCHER).contains(this.agentType);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getLastMobPowerToken() {
|
public int getLastMobPowerToken() {
|
||||||
|
|||||||
@@ -54,8 +54,6 @@ public class MobBase extends AbstractGameObject {
|
|||||||
private float walkCombat = 0;
|
private float walkCombat = 0;
|
||||||
private float runCombat = 0;
|
private float runCombat = 0;
|
||||||
|
|
||||||
public static HashMap<Integer,String> mobbase_race_types;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ResultSet Constructor
|
* ResultSet Constructor
|
||||||
*/
|
*/
|
||||||
@@ -65,37 +63,22 @@ public class MobBase extends AbstractGameObject {
|
|||||||
this.loadID = rs.getInt("loadID");
|
this.loadID = rs.getInt("loadID");
|
||||||
|
|
||||||
this.firstName = rs.getString("name");
|
this.firstName = rs.getString("name");
|
||||||
if(this.loadID == 14104){
|
this.level = rs.getByte("level");
|
||||||
this.level = 75;
|
|
||||||
}else {
|
|
||||||
this.level = rs.getByte("level");
|
|
||||||
}
|
|
||||||
|
|
||||||
this.goldMod = rs.getInt("goldMod");
|
this.goldMod = rs.getInt("goldMod");
|
||||||
this.spawnTime = rs.getInt("spawnTime");
|
this.spawnTime = rs.getInt("spawnTime");
|
||||||
if(this.loadID == 14104){
|
|
||||||
this.healthMax = 15000;
|
this.healthMax = rs.getInt("health");
|
||||||
this.damageMin = 250;
|
this.damageMin = rs.getFloat("minDmg");
|
||||||
this.damageMax = 500;
|
this.damageMax = rs.getFloat("maxDmg");
|
||||||
}else {
|
|
||||||
this.healthMax = rs.getInt("health");
|
|
||||||
this.damageMin = rs.getFloat("minDmg");
|
|
||||||
this.damageMax = rs.getFloat("maxDmg");
|
|
||||||
}
|
|
||||||
|
|
||||||
this.attackRating = rs.getInt("atr");
|
this.attackRating = rs.getInt("atr");
|
||||||
this.defenseRating = rs.getInt("defense");
|
this.defenseRating = rs.getInt("defense");
|
||||||
this.attackRange = rs.getFloat("attackRange");
|
this.attackRange = rs.getFloat("attackRange");
|
||||||
if(this.loadID == 14104){
|
this.bootySet = rs.getInt("bootySet");
|
||||||
this.bootySet = 0;
|
|
||||||
}else {
|
this.fsm = Enum.MobBehaviourType.valueOf(rs.getString("fsm"));
|
||||||
this.bootySet = rs.getInt("bootySet");
|
|
||||||
}
|
|
||||||
if(this.loadID == 14104){
|
|
||||||
this.fsm = Enum.MobBehaviourType.Aggro;
|
|
||||||
}else {
|
|
||||||
this.fsm = Enum.MobBehaviourType.valueOf(rs.getString("fsm"));
|
|
||||||
}
|
|
||||||
this.flags = EnumBitSet.asEnumBitSet(rs.getLong("flags"), Enum.MobFlagType.class);
|
this.flags = EnumBitSet.asEnumBitSet(rs.getLong("flags"), Enum.MobFlagType.class);
|
||||||
this.notEnemy = EnumBitSet.asEnumBitSet(rs.getLong("notEnemy"), Enum.MonsterType.class);
|
this.notEnemy = EnumBitSet.asEnumBitSet(rs.getLong("notEnemy"), Enum.MonsterType.class);
|
||||||
this.enemy = EnumBitSet.asEnumBitSet(rs.getLong("enemy"), Enum.MonsterType.class);
|
this.enemy = EnumBitSet.asEnumBitSet(rs.getLong("enemy"), Enum.MonsterType.class);
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
package engine.objects;
|
package engine.objects;
|
||||||
|
|
||||||
import engine.Enum;
|
|
||||||
import engine.exception.SerializationException;
|
import engine.exception.SerializationException;
|
||||||
import engine.gameManager.PowersManager;
|
import engine.gameManager.PowersManager;
|
||||||
import engine.net.ByteBufferWriter;
|
import engine.net.ByteBufferWriter;
|
||||||
@@ -35,7 +34,7 @@ public class MobEquipment extends AbstractGameObject {
|
|||||||
private AbstractPowerAction suffix;
|
private AbstractPowerAction suffix;
|
||||||
private int pValue;
|
private int pValue;
|
||||||
private int sValue;
|
private int sValue;
|
||||||
public int magicValue;
|
private int magicValue;
|
||||||
|
|
||||||
private float dropChance = 0;
|
private float dropChance = 0;
|
||||||
|
|
||||||
@@ -108,18 +107,8 @@ public class MobEquipment extends AbstractGameObject {
|
|||||||
public static void serializeForVendor(MobEquipment mobEquipment, ByteBufferWriter writer, float percent) throws SerializationException {
|
public static void serializeForVendor(MobEquipment mobEquipment, ByteBufferWriter writer, float percent) throws SerializationException {
|
||||||
_serializeForClientMsg(mobEquipment, writer, false);
|
_serializeForClientMsg(mobEquipment, writer, false);
|
||||||
int baseValue = mobEquipment.itemBase.getBaseValue() + mobEquipment.itemBase.getMagicValue();
|
int baseValue = mobEquipment.itemBase.getBaseValue() + mobEquipment.itemBase.getMagicValue();
|
||||||
if(mobEquipment.itemBase.getType().equals(Enum.ItemType.POTION)){
|
writer.putInt(mobEquipment.magicValue);
|
||||||
writer.putInt((int)(mobEquipment.itemBase.getBaseValue() * 0.5f));
|
writer.putInt(mobEquipment.magicValue);
|
||||||
writer.putInt((int)(mobEquipment.itemBase.getBaseValue() * 0.5f));
|
|
||||||
}else {
|
|
||||||
if(mobEquipment.itemBase.getName().equals("Prospector")){
|
|
||||||
writer.putInt(50);
|
|
||||||
writer.putInt(50);
|
|
||||||
}else {
|
|
||||||
writer.putInt(mobEquipment.magicValue);
|
|
||||||
writer.putInt(mobEquipment.magicValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void serializeForClientMsg(MobEquipment mobEquipment, ByteBufferWriter writer) throws SerializationException {
|
public static void serializeForClientMsg(MobEquipment mobEquipment, ByteBufferWriter writer) throws SerializationException {
|
||||||
@@ -281,23 +270,20 @@ public class MobEquipment extends AbstractGameObject {
|
|||||||
if (itemBase != null)
|
if (itemBase != null)
|
||||||
|
|
||||||
for (Integer token : itemBase.getBakedInStats().keySet()) {
|
for (Integer token : itemBase.getBakedInStats().keySet()) {
|
||||||
try {
|
|
||||||
EffectsBase effect = PowersManager.getEffectByToken(token);
|
|
||||||
|
|
||||||
AbstractPowerAction apa = PowersManager.getPowerActionByIDString(effect.getIDString());
|
EffectsBase effect = PowersManager.getEffectByToken(token);
|
||||||
if (apa.getEffectsBase() != null)
|
|
||||||
if (apa.getEffectsBase().getValue() > 0) {
|
AbstractPowerAction apa = PowersManager.getPowerActionByIDString(effect.getIDString());
|
||||||
//System.out.println(apa.getEffectsBase().getValue());
|
if (apa.getEffectsBase() != null)
|
||||||
value += apa.getEffectsBase().getValue();
|
if (apa.getEffectsBase().getValue() > 0) {
|
||||||
}
|
//System.out.println(apa.getEffectsBase().getValue());
|
||||||
|
value += apa.getEffectsBase().getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (apa.getEffectsBase2() != null)
|
if (apa.getEffectsBase2() != null)
|
||||||
value += apa.getEffectsBase2().getValue();
|
value += apa.getEffectsBase2().getValue();
|
||||||
|
}
|
||||||
}catch(Exception e){
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.magicValue = (int) value;
|
this.magicValue = (int) value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -121,8 +121,8 @@ public class NPC extends AbstractCharacter {
|
|||||||
|
|
||||||
// this.buyPercent = rs.getFloat("npc_buyPercent");
|
// this.buyPercent = rs.getFloat("npc_buyPercent");
|
||||||
|
|
||||||
this.buyPercent = rs.getFloat("npc_buyPercent");
|
this.buyPercent = .33f;
|
||||||
this.sellPercent = rs.getFloat("npc_sellPercent");
|
this.sellPercent = 1;
|
||||||
|
|
||||||
this.setRot(new Vector3f(0, rs.getFloat("npc_rotation"), 0));
|
this.setRot(new Vector3f(0, rs.getFloat("npc_rotation"), 0));
|
||||||
|
|
||||||
@@ -470,11 +470,8 @@ public class NPC extends AbstractCharacter {
|
|||||||
newNPC.bindLoc = Vector3fImmutable.ZERO;
|
newNPC.bindLoc = Vector3fImmutable.ZERO;
|
||||||
|
|
||||||
newNPC.parentZoneUUID = parent.getObjectUUID();
|
newNPC.parentZoneUUID = parent.getObjectUUID();
|
||||||
if(guild == null){
|
newNPC.guildUUID = guild.getObjectUUID();
|
||||||
newNPC.guildUUID = Guild.getErrantGuild().getObjectUUID();
|
|
||||||
}else {
|
|
||||||
newNPC.guildUUID = guild.getObjectUUID();
|
|
||||||
}
|
|
||||||
if (building == null)
|
if (building == null)
|
||||||
newNPC.buildingUUID = 0;
|
newNPC.buildingUUID = 0;
|
||||||
else
|
else
|
||||||
@@ -1100,7 +1097,7 @@ public class NPC extends AbstractCharacter {
|
|||||||
return 600;
|
return 600;
|
||||||
|
|
||||||
float rank = this.building.getRank() - 1;
|
float rank = this.building.getRank() - 1;
|
||||||
float rate = (float) (Float.parseFloat(ConfigManager.MB_PRODUCTION_RATE.getValue()) * rank);
|
float rate = (float) (2.5 * rank);
|
||||||
time = (20 - rate);
|
time = (20 - rate);
|
||||||
time *= 60;
|
time *= 60;
|
||||||
return (int) time;
|
return (int) time;
|
||||||
@@ -1139,12 +1136,8 @@ public class NPC extends AbstractCharacter {
|
|||||||
|
|
||||||
upgradeCost = Integer.MAX_VALUE;
|
upgradeCost = Integer.MAX_VALUE;
|
||||||
|
|
||||||
if (this.getRank() < 7) {
|
if (this.getRank() < 7)
|
||||||
if(this.contract.isTrainer()){
|
|
||||||
return (this.getRank() * 25162) + 5362;
|
|
||||||
}
|
|
||||||
return (this.getRank() * 100650) + 21450;
|
return (this.getRank() * 100650) + 21450;
|
||||||
}
|
|
||||||
|
|
||||||
return upgradeCost;
|
return upgradeCost;
|
||||||
}
|
}
|
||||||
@@ -1333,6 +1326,7 @@ public class NPC extends AbstractCharacter {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
dateToUpgrade = DateTime.now().plusHours(this.getUpgradeTime());
|
dateToUpgrade = DateTime.now().plusHours(this.getUpgradeTime());
|
||||||
|
|
||||||
this.setUpgradeDateTime(dateToUpgrade);
|
this.setUpgradeDateTime(dateToUpgrade);
|
||||||
|
|
||||||
// Schedule upgrade job
|
// Schedule upgrade job
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user