Compare commits
117 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6641651f3c | |||
| dbf164bfb2 | |||
| 8a617c3008 | |||
| a50a2430ba | |||
| 5c3c552288 | |||
| 69fdddfc71 | |||
| db5b988275 | |||
| 4284757035 | |||
| b93a47acc0 | |||
| d59f9857ce | |||
| 8ce212b74b | |||
| e78aea5735 | |||
| 9a3c5c3f40 | |||
| 60ca3f9c34 | |||
| e7e740dff1 | |||
| 8343a98d77 | |||
| 5862039a00 | |||
| 8af989b75f | |||
| 08d0e5ff75 | |||
| 5196d10e5c | |||
| 3392ec463d | |||
| 33529404cf | |||
| 00e7a36013 | |||
| 3060b394ab | |||
| a43d9022fe | |||
| 6abdc68ca5 | |||
| 61c66b0e96 | |||
| 36cc23457a | |||
| d573b238de | |||
| 8afe25fe85 | |||
| f80647ff0d | |||
| 7e64cbabf8 | |||
| 14a06410ae | |||
| 85c2a4f4f0 | |||
| da9e211ec7 | |||
| a81070c471 | |||
| e3ad7efa4f | |||
| a4dafd7155 | |||
| 645aec853e | |||
| d8d5e4a3c4 | |||
| 7a48c04057 | |||
| 64aaaa707e | |||
| 445d40dc5f | |||
| ebdcb531f2 | |||
| c9cdb891d6 | |||
| f5c6c002a8 | |||
| d171c6bb9a | |||
| 1c81a4faed | |||
| e7d1d5cb71 | |||
| 060d831d50 | |||
| 316bd6dd01 | |||
| 34081e5903 | |||
| e2d843b65e | |||
| a796f5fe4b | |||
| 51ee41c773 | |||
| 7e5ed3efe5 | |||
| 8dd25ac315 | |||
| 1cdaa58e7a | |||
| fa3aa24a3d | |||
| 091431d95b | |||
| 1ecf0122ab | |||
| 79980a1725 | |||
| 8badcc3f6e | |||
| 4d6e57257c | |||
| a7a93b8500 | |||
| 85cc34fb4c | |||
| 772a996b6e | |||
| e67eff822d | |||
| c39ed6120f | |||
| c38f4e6543 | |||
| 098433b697 | |||
| c8e20c905b | |||
| bd2446ba0a | |||
| c179e4aaf3 | |||
| 2f8de2a919 | |||
| 338110973d | |||
| 3c9c4495bc | |||
| 93476f782c | |||
| 3aec6ee578 | |||
| 3bca76d4c8 | |||
| b9d6f35aac | |||
| 9b6959414a | |||
| 400dd6aa5e | |||
| 14af2f6efd | |||
| 0a2de9e0d5 | |||
| 89bfad78a6 | |||
| 52486fa278 | |||
| dc0e14eb21 | |||
| 70278374e7 | |||
| ac3588c76a | |||
| ab335aef2a | |||
| 719c855bdb | |||
| f283e50018 | |||
| 99b952ee28 | |||
| 24639b62c0 | |||
| 573cc531bf | |||
| 29e24bae93 | |||
| 22e4cc07c0 | |||
| 9264347698 | |||
| 579c26ac59 | |||
| ef577dd313 | |||
| 62c7e52487 | |||
| 3534ac6477 | |||
| 1738f7b311 | |||
| eb25caec81 | |||
| a6c60e2c04 | |||
| adafbdf6d3 | |||
| 7eab14938d | |||
| 039e55673b | |||
| ec3a9b6cb4 | |||
| 17a6494b2b | |||
| 0b05c7074f | |||
| 876ccc7cbf | |||
| bdf14b8f24 | |||
| 43375a6f5b | |||
| e00328ae13 | |||
| 07c553294b |
+16
-41
@@ -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),
|
||||||
@@ -172,8 +172,6 @@ public class Enum {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static RaceType getRaceTypebyRuneID(int runeID) {
|
public static RaceType getRaceTypebyRuneID(int runeID) {
|
||||||
if(runeID == 1999)
|
|
||||||
return _raceTypeByID.get(2017);
|
|
||||||
return _raceTypeByID.get(runeID);
|
return _raceTypeByID.get(runeID);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,8 +208,8 @@ 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),
|
||||||
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);
|
||||||
IREKEI(6.499500105f, 14.6685f, 4.2199998f, 14.6685f, 6.3299999f, 18.379999f, 6.5f);
|
|
||||||
private float walkStandard;
|
private float walkStandard;
|
||||||
private float walkCombat;
|
private float walkCombat;
|
||||||
private float runStandard;
|
private float runStandard;
|
||||||
@@ -778,7 +776,6 @@ public class Enum {
|
|||||||
Combat,
|
Combat,
|
||||||
Spires,
|
Spires,
|
||||||
Snare,
|
Snare,
|
||||||
Snared,
|
|
||||||
Stun,
|
Stun,
|
||||||
Blind,
|
Blind,
|
||||||
Root,
|
Root,
|
||||||
@@ -881,7 +878,6 @@ public class Enum {
|
|||||||
Siege,
|
Siege,
|
||||||
Slash,
|
Slash,
|
||||||
Snare,
|
Snare,
|
||||||
Snared,
|
|
||||||
Sorcery,
|
Sorcery,
|
||||||
Spear,
|
Spear,
|
||||||
SpearMastery,
|
SpearMastery,
|
||||||
@@ -961,17 +957,6 @@ public class Enum {
|
|||||||
Wizardry;
|
Wizardry;
|
||||||
|
|
||||||
public static SourceType GetSourceType(String modName) {
|
public static SourceType GetSourceType(String modName) {
|
||||||
switch(modName){
|
|
||||||
case "Slashing":
|
|
||||||
modName = "Slash";
|
|
||||||
break;
|
|
||||||
case "Crushing":
|
|
||||||
modName = "Crush";
|
|
||||||
break;
|
|
||||||
case "Piercing":
|
|
||||||
modName = "Pierce";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
SourceType returnMod;
|
SourceType returnMod;
|
||||||
if (modName.isEmpty())
|
if (modName.isEmpty())
|
||||||
return SourceType.None;
|
return SourceType.None;
|
||||||
@@ -1031,7 +1016,6 @@ public class Enum {
|
|||||||
Silence,
|
Silence,
|
||||||
Slash,
|
Slash,
|
||||||
Snare,
|
Snare,
|
||||||
Snared,
|
|
||||||
Stance,
|
Stance,
|
||||||
Stun,
|
Stun,
|
||||||
Summon,
|
Summon,
|
||||||
@@ -1090,15 +1074,6 @@ public class Enum {
|
|||||||
DamageShield,
|
DamageShield,
|
||||||
DeathShroud,
|
DeathShroud,
|
||||||
DefenseBuff,
|
DefenseBuff,
|
||||||
DefenseBuffAss,
|
|
||||||
DefenseBuffChn,
|
|
||||||
DefenseBuffDsr,
|
|
||||||
DefenseBuffFur,
|
|
||||||
DefenseBuffNec,
|
|
||||||
DefenseBuffNsr,
|
|
||||||
DefenseBuffPrl,
|
|
||||||
DefenseBuffRng,
|
|
||||||
DefenseBuffWiz,
|
|
||||||
DefenseBuffGroup,
|
DefenseBuffGroup,
|
||||||
DefenseDebuff,
|
DefenseDebuff,
|
||||||
DetectInvis,
|
DetectInvis,
|
||||||
@@ -1165,7 +1140,6 @@ public class Enum {
|
|||||||
SkillDebuff,
|
SkillDebuff,
|
||||||
SlashResistanceDebuff,
|
SlashResistanceDebuff,
|
||||||
Snare,
|
Snare,
|
||||||
Snared,
|
|
||||||
StackableAttrCONBuff,
|
StackableAttrCONBuff,
|
||||||
StackableAttrDEXBuff,
|
StackableAttrDEXBuff,
|
||||||
StackableAttrSTRBuff,
|
StackableAttrSTRBuff,
|
||||||
@@ -2332,9 +2306,9 @@ public class Enum {
|
|||||||
|
|
||||||
public enum CityBoundsType {
|
public enum CityBoundsType {
|
||||||
|
|
||||||
GRID(544),
|
GRID(640),
|
||||||
ZONE(672),
|
ZONE(875),
|
||||||
PLACEMENT(673);
|
PLACEMENT(876);
|
||||||
|
|
||||||
public final float extents;
|
public final float extents;
|
||||||
|
|
||||||
@@ -2848,7 +2822,6 @@ public class Enum {
|
|||||||
|
|
||||||
public enum MobBehaviourType {
|
public enum MobBehaviourType {
|
||||||
None(null, false, false, false, false, false),
|
None(null, false, false, false, false, false),
|
||||||
//Power
|
|
||||||
Power(null, false, true, true, true, false),
|
Power(null, false, true, true, true, false),
|
||||||
PowerHelpee(Power, false, true, true, false, true),
|
PowerHelpee(Power, false, true, true, false, true),
|
||||||
PowerHelpeeWimpy(Power, true, false, true, false, false),
|
PowerHelpeeWimpy(Power, true, false, true, false, false),
|
||||||
@@ -2873,6 +2846,7 @@ public class Enum {
|
|||||||
//Independent Types
|
//Independent Types
|
||||||
SimpleStandingGuard(null, false, false, false, false, false),
|
SimpleStandingGuard(null, false, false, false, false, false),
|
||||||
Pet1(null, false, false, true, false, false),
|
Pet1(null, false, false, true, false, false),
|
||||||
|
SiegeEngine(null, false, false, false, false, false),
|
||||||
Simple(null, false, false, true, false, false),
|
Simple(null, false, false, true, false, false),
|
||||||
Helpee(null, false, true, true, false, true),
|
Helpee(null, false, true, true, false, true),
|
||||||
HelpeeWimpy(null, true, false, true, false, false),
|
HelpeeWimpy(null, true, false, true, false, false),
|
||||||
@@ -2883,13 +2857,12 @@ public class Enum {
|
|||||||
HamletGuard(null, false, true, false, false, false),
|
HamletGuard(null, false, true, false, false, false),
|
||||||
AggroWanderer(null, false, false, true, false, false);
|
AggroWanderer(null, false, false, true, false, false);
|
||||||
|
|
||||||
private static HashMap<Integer, MobBehaviourType> _behaviourTypes = new HashMap<>();
|
public final MobBehaviourType BehaviourHelperType;
|
||||||
public MobBehaviourType BehaviourHelperType;
|
public final boolean isWimpy;
|
||||||
public boolean isWimpy;
|
public final boolean isAgressive;
|
||||||
public boolean isAgressive;
|
public final boolean canRoam;
|
||||||
public boolean canRoam;
|
public final boolean callsForHelp;
|
||||||
public boolean callsForHelp;
|
public final boolean respondsToCallForHelp;
|
||||||
public boolean respondsToCallForHelp;
|
|
||||||
|
|
||||||
MobBehaviourType(MobBehaviourType helpeebehaviourType, boolean wimpy, boolean agressive, boolean canroam, boolean callsforhelp, boolean respondstocallforhelp) {
|
MobBehaviourType(MobBehaviourType helpeebehaviourType, boolean wimpy, boolean agressive, boolean canroam, boolean callsforhelp, boolean respondstocallforhelp) {
|
||||||
this.BehaviourHelperType = helpeebehaviourType;
|
this.BehaviourHelperType = helpeebehaviourType;
|
||||||
@@ -2906,6 +2879,8 @@ public class Enum {
|
|||||||
MOBILE,
|
MOBILE,
|
||||||
PET,
|
PET,
|
||||||
CHARMED,
|
CHARMED,
|
||||||
|
|
||||||
|
SIEGEENGINE,
|
||||||
GUARD;
|
GUARD;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,10 @@ import engine.net.AbstractNetMsg;
|
|||||||
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.*;
|
import engine.net.client.msg.LoadCharacterMsg;
|
||||||
|
import engine.net.client.msg.LoadStructureMsg;
|
||||||
|
import engine.net.client.msg.MoveToPointMsg;
|
||||||
|
import engine.net.client.msg.UnloadObjectsMsg;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
@@ -464,7 +467,7 @@ public enum InterestManager implements Runnable {
|
|||||||
if (awonpc.despawned == true)
|
if (awonpc.despawned == true)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
awonpc.playerAgroMap.put(player.getObjectUUID(), false);
|
awonpc.playerAgroMap.put(player.getObjectUUID(), 0f);
|
||||||
((Mob) awonpc).setCombatTarget(null);
|
((Mob) awonpc).setCombatTarget(null);
|
||||||
lcm = new LoadCharacterMsg(awonpc, PlayerCharacter.hideNonAscii());
|
lcm = new LoadCharacterMsg(awonpc, PlayerCharacter.hideNonAscii());
|
||||||
|
|
||||||
@@ -477,7 +480,7 @@ public enum InterestManager implements Runnable {
|
|||||||
if (!awonpc.isAlive())
|
if (!awonpc.isAlive())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
awonpc.playerAgroMap.put(player.getObjectUUID(), false);
|
awonpc.playerAgroMap.put(player.getObjectUUID(), 0f);
|
||||||
|
|
||||||
if ((awonpc.agentType.equals(Enum.AIAgentType.MOBILE)))
|
if ((awonpc.agentType.equals(Enum.AIAgentType.MOBILE)))
|
||||||
((Mob) awonpc).setCombatTarget(null);
|
((Mob) awonpc).setCombatTarget(null);
|
||||||
@@ -518,10 +521,10 @@ public enum InterestManager implements Runnable {
|
|||||||
|
|
||||||
// Update loaded upbjects lists
|
// Update loaded upbjects lists
|
||||||
|
|
||||||
player.isBoxed = PlayerCharacter.checkIfBoxed(player);
|
|
||||||
player.setDirtyLoad(true);
|
player.setDirtyLoad(true);
|
||||||
updateStaticList(player, origin);
|
updateStaticList(player, origin);
|
||||||
updateMobileList(player, origin);
|
updateMobileList(player, origin);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void HandleLoadForTeleport(PlayerCharacter playerCharacter) {
|
public synchronized void HandleLoadForTeleport(PlayerCharacter playerCharacter) {
|
||||||
|
|||||||
@@ -10,13 +10,17 @@
|
|||||||
package engine.db.handlers;
|
package engine.db.handlers;
|
||||||
|
|
||||||
import engine.gameManager.DbManager;
|
import engine.gameManager.DbManager;
|
||||||
import engine.gameManager.ZoneManager;
|
import engine.objects.Bane;
|
||||||
import engine.math.Vector3fImmutable;
|
import engine.objects.Building;
|
||||||
import engine.objects.*;
|
import engine.objects.City;
|
||||||
|
import engine.objects.PlayerCharacter;
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.Connection;
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
public class dbBaneHandler extends dbHandlerBase {
|
public class dbBaneHandler extends dbHandlerBase {
|
||||||
|
|
||||||
@@ -85,139 +89,6 @@ public class dbBaneHandler extends dbHandlerBase {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean SET_BANE_TIME_NEW(int hour, int cityUUID) {
|
|
||||||
hour += 12; // Adjust hour
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
|
||||||
PreparedStatement getStatement = connection.prepareStatement("SELECT `placementDate`, `liveDate` FROM `dyn_banes` WHERE `cityUUID`=?");
|
|
||||||
PreparedStatement updateStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `liveDate`=?, `time_set`=? WHERE `cityUUID`=?")) {
|
|
||||||
|
|
||||||
// Retrieve placementDate and liveDate
|
|
||||||
getStatement.setInt(1, cityUUID);
|
|
||||||
try (ResultSet rs = getStatement.executeQuery()) {
|
|
||||||
if (rs.next()) {
|
|
||||||
DateTime placementDate = new DateTime(rs.getTimestamp("placementDate").getTime());
|
|
||||||
Timestamp liveDateTimestamp = rs.getTimestamp("liveDate");
|
|
||||||
|
|
||||||
// Explicitly check if liveDate is null
|
|
||||||
DateTime toSet;
|
|
||||||
if (liveDateTimestamp == null) {
|
|
||||||
// If liveDate is null, default to placementDate
|
|
||||||
toSet = placementDate;
|
|
||||||
} else {
|
|
||||||
// If liveDate is not null, use it
|
|
||||||
DateTime liveDate = new DateTime(liveDateTimestamp.getTime());
|
|
||||||
toSet = liveDate;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Adjust the time
|
|
||||||
toSet = toSet.withHourOfDay(hour).withMinuteOfHour(0).withSecondOfMinute(0).withMillisOfSecond(0);
|
|
||||||
|
|
||||||
// Update liveDate and time_set flag
|
|
||||||
updateStatement.setTimestamp(1, new java.sql.Timestamp(toSet.getMillis()));
|
|
||||||
updateStatement.setInt(2, 1); // time_set flag
|
|
||||||
updateStatement.setInt(3, cityUUID);
|
|
||||||
|
|
||||||
updateStatement.execute();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
|
||||||
Logger.error(e);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean SET_BANE_DAY_NEW(int dayOffset, int cityUUID) {
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
|
||||||
PreparedStatement getStatement = connection.prepareStatement("SELECT `placementDate`, `liveDate` FROM `dyn_banes` WHERE `cityUUID`=?");
|
|
||||||
PreparedStatement updateStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `liveDate`=?, `day_set`=? WHERE `cityUUID`=?")) {
|
|
||||||
|
|
||||||
// Retrieve placementDate and liveDate
|
|
||||||
getStatement.setInt(1, cityUUID);
|
|
||||||
try (ResultSet rs = getStatement.executeQuery()) {
|
|
||||||
if (rs.next()) {
|
|
||||||
DateTime placementDate = new DateTime(rs.getTimestamp("placementDate").getTime());
|
|
||||||
Timestamp liveDateTimestamp = rs.getTimestamp("liveDate");
|
|
||||||
|
|
||||||
// Explicitly check if liveDate is null
|
|
||||||
DateTime liveDate;
|
|
||||||
if (liveDateTimestamp == null) {
|
|
||||||
// If liveDate is null, default to placementDate
|
|
||||||
liveDate = placementDate;
|
|
||||||
} else {
|
|
||||||
// If liveDate is not null, use it
|
|
||||||
liveDate = new DateTime(liveDateTimestamp.getTime());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calculate the new liveDate while preserving the time component
|
|
||||||
DateTime updatedDate = placementDate.plusDays(dayOffset)
|
|
||||||
.withHourOfDay(liveDate.getHourOfDay())
|
|
||||||
.withMinuteOfHour(liveDate.getMinuteOfHour())
|
|
||||||
.withSecondOfMinute(liveDate.getSecondOfMinute())
|
|
||||||
.withMillisOfSecond(liveDate.getMillisOfSecond());
|
|
||||||
|
|
||||||
// Update liveDate and day_set flag
|
|
||||||
updateStatement.setTimestamp(1, new java.sql.Timestamp(updatedDate.getMillis()));
|
|
||||||
updateStatement.setInt(2, 1); // day_set flag
|
|
||||||
updateStatement.setInt(3, cityUUID);
|
|
||||||
|
|
||||||
updateStatement.execute();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
|
||||||
Logger.error(e);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public boolean SET_BANE_CAP_NEW(int count, int cityUUID) {
|
|
||||||
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `cap_size`=? WHERE `cityUUID`=?")) {
|
|
||||||
|
|
||||||
preparedStatement.setInt(1, count);
|
|
||||||
preparedStatement.setLong(2, cityUUID);
|
|
||||||
|
|
||||||
preparedStatement.execute();
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
|
||||||
Logger.error(e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `cap_set`=? WHERE `cityUUID`=?")) {
|
|
||||||
|
|
||||||
preparedStatement.setInt(1, 1);
|
|
||||||
preparedStatement.setLong(2, cityUUID);
|
|
||||||
|
|
||||||
preparedStatement.execute();
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
|
||||||
Logger.error(e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `cap_size`=? WHERE `cityUUID`=?")) {
|
|
||||||
|
|
||||||
preparedStatement.setInt(1, count);
|
|
||||||
preparedStatement.setLong(2, cityUUID);
|
|
||||||
|
|
||||||
preparedStatement.execute();
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
|
||||||
Logger.error(e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean REMOVE_BANE(Bane bane) {
|
public boolean REMOVE_BANE(Bane bane) {
|
||||||
|
|
||||||
if (bane == null)
|
if (bane == null)
|
||||||
@@ -236,25 +107,4 @@ public class dbBaneHandler extends dbHandlerBase {
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DateTime getLiveDate(int cityUUID) {
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
|
||||||
PreparedStatement statement = connection.prepareStatement("SELECT `liveDate` FROM `dyn_banes` WHERE `cityUUID`=?")) {
|
|
||||||
|
|
||||||
statement.setInt(1, cityUUID);
|
|
||||||
|
|
||||||
try (ResultSet rs = statement.executeQuery()) {
|
|
||||||
if (rs.next()) {
|
|
||||||
Timestamp liveDateTimestamp = rs.getTimestamp("liveDate");
|
|
||||||
if (liveDateTimestamp != null) {
|
|
||||||
return new DateTime(liveDateTimestamp.getTime());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
|
||||||
Logger.error(e);
|
|
||||||
}
|
|
||||||
return null; // Return null if liveDate is not found or an error occurs
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,10 @@ package engine.db.handlers;
|
|||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.gameManager.DbManager;
|
import engine.gameManager.DbManager;
|
||||||
import engine.objects.*;
|
import engine.objects.AbstractGameObject;
|
||||||
|
import engine.objects.Building;
|
||||||
|
import engine.objects.City;
|
||||||
|
import engine.objects.Zone;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
@@ -92,16 +95,7 @@ public class dbCityHandler extends dbHandlerBase {
|
|||||||
|
|
||||||
return objectList;
|
return objectList;
|
||||||
}
|
}
|
||||||
public Integer GET_CAPITAL_CITY_COUNT() {
|
|
||||||
|
|
||||||
int cityCount = 0;
|
|
||||||
for(Realm realm : Realm._realms.values()){
|
|
||||||
if(realm.isRuled())
|
|
||||||
cityCount ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return cityCount;
|
|
||||||
}
|
|
||||||
public ArrayList<City> GET_CITIES_BY_ZONE(final int objectUUID) {
|
public ArrayList<City> GET_CITIES_BY_ZONE(final int objectUUID) {
|
||||||
|
|
||||||
ArrayList<City> cityList = new ArrayList<>();
|
ArrayList<City> cityList = new ArrayList<>();
|
||||||
|
|||||||
@@ -98,7 +98,6 @@ public class dbContractHandler extends dbHandlerBase {
|
|||||||
|
|
||||||
public void LOAD_SELL_LIST_FOR_CONTRACT(final Contract contract) {
|
public void LOAD_SELL_LIST_FOR_CONTRACT(final Contract contract) {
|
||||||
|
|
||||||
if(!contract.getName().contains("Sage")) {
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
try (Connection connection = DbManager.getConnection();
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_contract_selltype` WHERE `contractID` = ?;")) {
|
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_contract_selltype` WHERE `contractID` = ?;")) {
|
||||||
|
|
||||||
@@ -126,27 +125,6 @@ public class dbContractHandler extends dbHandlerBase {
|
|||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
Logger.error(e);
|
Logger.error(e);
|
||||||
}
|
}
|
||||||
}else{
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_contract_selltype`;")) {
|
|
||||||
|
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
|
||||||
|
|
||||||
while (rs.next()) {
|
|
||||||
int value = rs.getInt("value");
|
|
||||||
if(!contract.getBuySkillToken().contains(value))
|
|
||||||
contract.getBuySkillToken().add(value);
|
|
||||||
|
|
||||||
if(!contract.getBuyItemType().contains(value))
|
|
||||||
contract.getBuyItemType().add(value);
|
|
||||||
|
|
||||||
if(!contract.getBuyUnknownToken().contains(value))
|
|
||||||
contract.getBuyUnknownToken().add(value);
|
|
||||||
}
|
|
||||||
} catch (SQLException e) {
|
|
||||||
Logger.error(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean updateAllowedBuildings(final Contract con, final long slotbitvalue) {
|
public boolean updateAllowedBuildings(final Contract con, final long slotbitvalue) {
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ public abstract class dbHandlerBase {
|
|||||||
try {
|
try {
|
||||||
if (rs.next()) {
|
if (rs.next()) {
|
||||||
abstractGameObject = localClass.getConstructor(ResultSet.class).newInstance(rs);
|
abstractGameObject = localClass.getConstructor(ResultSet.class).newInstance(rs);
|
||||||
|
|
||||||
DbManager.addToCache(abstractGameObject);
|
DbManager.addToCache(abstractGameObject);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -56,28 +57,12 @@ public abstract class dbHandlerBase {
|
|||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
|
|
||||||
int id = rs.getInt(1);
|
int id = rs.getInt(1);
|
||||||
try {
|
|
||||||
if (rs.getInt("capSize") == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}catch(Exception e){
|
|
||||||
//not a mine
|
|
||||||
}
|
|
||||||
|
|
||||||
if (DbManager.inCache(localObjectType, id)) {
|
if (DbManager.inCache(localObjectType, id)) {
|
||||||
objectList.add((T) DbManager.getFromCache(localObjectType, id));
|
objectList.add((T) DbManager.getFromCache(localObjectType, id));
|
||||||
} else {
|
} else {
|
||||||
try{
|
|
||||||
if(rs.getInt("mineLiveHour") == 1)
|
|
||||||
continue;
|
|
||||||
}catch(Exception e){
|
|
||||||
//not a mine
|
|
||||||
}
|
|
||||||
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)
|
||||||
|
|||||||
@@ -496,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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,31 +28,26 @@ public class dbMobHandler extends dbHandlerBase {
|
|||||||
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
|
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
|
||||||
}
|
}
|
||||||
|
|
||||||
public Mob ADD_MOB(Mob toAdd) {
|
public Mob PERSIST(Mob toAdd) {
|
||||||
|
|
||||||
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.getParentZoneID());
|
preparedStatement.setLong(1, toAdd.parentZoneUUID);
|
||||||
preparedStatement.setInt(2, toAdd.getMobBaseID());
|
preparedStatement.setInt(2, toAdd.loadID);
|
||||||
preparedStatement.setInt(3, toAdd.getGuildUUID());
|
preparedStatement.setInt(3, toAdd.guildUUID);
|
||||||
preparedStatement.setFloat(4, toAdd.getSpawnX());
|
preparedStatement.setFloat(4, toAdd.bindLoc.x);
|
||||||
preparedStatement.setFloat(5, toAdd.getSpawnY());
|
preparedStatement.setFloat(5, toAdd.bindLoc.y);
|
||||||
preparedStatement.setFloat(6, toAdd.getSpawnZ());
|
preparedStatement.setFloat(6, toAdd.bindLoc.z);
|
||||||
preparedStatement.setInt(7, 0);
|
preparedStatement.setInt(7, 0);
|
||||||
preparedStatement.setFloat(8, toAdd.getSpawnRadius());
|
preparedStatement.setFloat(8, toAdd.spawnRadius);
|
||||||
preparedStatement.setInt(9, toAdd.getTrueSpawnTime());
|
preparedStatement.setInt(9, toAdd.spawnTime);
|
||||||
|
preparedStatement.setInt(10, toAdd.contractUUID);
|
||||||
if (toAdd.getContract() != null)
|
preparedStatement.setInt(11, toAdd.buildingUUID);
|
||||||
preparedStatement.setInt(10, toAdd.getContract().getContractID());
|
preparedStatement.setInt(12, toAdd.level);
|
||||||
else
|
preparedStatement.setString(13, toAdd.firstName);
|
||||||
preparedStatement.setInt(10, 0);
|
|
||||||
|
|
||||||
preparedStatement.setInt(11, toAdd.getBuildingID());
|
|
||||||
preparedStatement.setInt(12, toAdd.getLevel());
|
|
||||||
preparedStatement.setString(13, toAdd.getFirstName());
|
|
||||||
|
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
|
||||||
@@ -106,17 +101,17 @@ public class dbMobHandler extends dbHandlerBase {
|
|||||||
return row_count;
|
return row_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LOAD_PATROL_POINTS(Mob captain) {
|
public void LOAD_GUARD_MINIONS(Mob guardCaptain) {
|
||||||
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
try (Connection connection = DbManager.getConnection();
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_guards` WHERE `captainUID` = ?")) {
|
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_guards` WHERE `captainUID` = ?")) {
|
||||||
|
|
||||||
preparedStatement.setInt(1, captain.getObjectUUID());
|
preparedStatement.setInt(1, guardCaptain.getObjectUUID());
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
ResultSet rs = preparedStatement.executeQuery();
|
||||||
|
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
String name = rs.getString("name");
|
String minionName = rs.getString("name");
|
||||||
Mob toCreate = Mob.createGuardMob(captain, captain.getGuild(), captain.getParentZone(), captain.building.getLoc(), captain.getLevel(), name);
|
Mob toCreate = Mob.createGuardMinion(guardCaptain, guardCaptain.getLevel(), minionName);
|
||||||
|
|
||||||
if (toCreate == null)
|
if (toCreate == null)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -131,32 +131,6 @@ public class dbNPCHandler extends dbHandlerBase {
|
|||||||
return npc;
|
return npc;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int BANE_COMMANDER_EXISTS(final int objectUUID) {
|
|
||||||
|
|
||||||
int uid = 0;
|
|
||||||
|
|
||||||
String query = "SELECT `UID` FROM `obj_npc` WHERE `npc_buildingID` = ? LIMIT 1;";
|
|
||||||
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement(query)) {
|
|
||||||
|
|
||||||
preparedStatement.setInt(1, objectUUID);
|
|
||||||
|
|
||||||
try (ResultSet rs = preparedStatement.executeQuery()) {
|
|
||||||
if (rs.next()) {
|
|
||||||
// Retrieve the UID column value
|
|
||||||
uid = rs.getInt("UID");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
|
||||||
Logger.error(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
return uid;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public int MOVE_NPC(long npcID, long parentID, float locX, float locY, float locZ) {
|
public int MOVE_NPC(long npcID, long parentID, float locX, float locY, float locZ) {
|
||||||
|
|
||||||
int rowCount;
|
int rowCount;
|
||||||
@@ -202,18 +176,6 @@ public class dbNPCHandler extends dbHandlerBase {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void updateSpecialPricing(final NPC npc){
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE obj_npc SET specialPrice=? WHERE UID = ?")) {
|
|
||||||
preparedStatement.setInt(1, npc.getSpecialPrice());
|
|
||||||
preparedStatement.setInt(2, npc.getDBID());
|
|
||||||
|
|
||||||
preparedStatement.executeUpdate();
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
|
||||||
Logger.error(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public void updateDatabase(final NPC npc) {
|
public void updateDatabase(final NPC npc) {
|
||||||
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
try (Connection connection = DbManager.getConnection();
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public class AddMobCmd extends AbstractDevCmd {
|
|||||||
MobBase mb = (MobBase) mobbaseAGO;
|
MobBase mb = (MobBase) mobbaseAGO;
|
||||||
int loadID = mb.getObjectUUID();
|
int loadID = mb.getObjectUUID();
|
||||||
Mob mob = Mob.createMob(loadID, Vector3fImmutable.getRandomPointInCircle(pc.getLoc(), 100),
|
Mob mob = Mob.createMob(loadID, Vector3fImmutable.getRandomPointInCircle(pc.getLoc(), 100),
|
||||||
null, true, zone, null, 0, "", 1);
|
null, zone, null, null, "", 1);
|
||||||
if (mob != null) {
|
if (mob != null) {
|
||||||
mob.updateDatabase();
|
mob.updateDatabase();
|
||||||
this.setResult(String.valueOf(mob.getDBID()));
|
this.setResult(String.valueOf(mob.getDBID()));
|
||||||
@@ -84,7 +84,7 @@ public class AddMobCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
|
|
||||||
Mob mob = Mob.createMob(loadID, pc.getLoc(),
|
Mob mob = Mob.createMob(loadID, pc.getLoc(),
|
||||||
null, true, zone, null, 0, "", 1);
|
null, zone, null, null, "", 1);
|
||||||
if (mob != null) {
|
if (mob != null) {
|
||||||
mob.updateDatabase();
|
mob.updateDatabase();
|
||||||
ChatManager.chatSayInfo(pc,
|
ChatManager.chatSayInfo(pc,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
@@ -32,6 +31,7 @@ public class AddNPCCmd extends AbstractDevCmd {
|
|||||||
int contractID;
|
int contractID;
|
||||||
String name = "";
|
String name = "";
|
||||||
int level = 0;
|
int level = 0;
|
||||||
|
|
||||||
if (words.length < 2) {
|
if (words.length < 2) {
|
||||||
this.sendUsage(pc);
|
this.sendUsage(pc);
|
||||||
return;
|
return;
|
||||||
@@ -39,54 +39,59 @@ public class AddNPCCmd extends AbstractDevCmd {
|
|||||||
try {
|
try {
|
||||||
contractID = Integer.parseInt(words[0]);
|
contractID = Integer.parseInt(words[0]);
|
||||||
level = Integer.parseInt(words[1]);
|
level = Integer.parseInt(words[1]);
|
||||||
|
|
||||||
for (int i = 2; i < words.length; i++) {
|
for (int i = 2; i < words.length; i++) {
|
||||||
name += words[i];
|
name += words[i];
|
||||||
if (i + 1 < words.length)
|
if (i + 1 < words.length)
|
||||||
name += "";
|
name += "";
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (NumberFormatException e) {
|
} catch (NumberFormatException e) {
|
||||||
throwbackError(pc,
|
throwbackError(pc,
|
||||||
"Failed to parse supplied contractID or level to an Integer.");
|
"Failed to parse supplied contractID or level to an Integer.");
|
||||||
return; // NaN
|
return; // NaN
|
||||||
}
|
}
|
||||||
|
|
||||||
Contract contract = DbManager.ContractQueries.GET_CONTRACT(contractID);
|
Contract contract = DbManager.ContractQueries.GET_CONTRACT(contractID);
|
||||||
|
|
||||||
if (contract == null || level < 1 || level > 75) {
|
if (contract == null || level < 1 || level > 75) {
|
||||||
throwbackError(pc,
|
throwbackError(pc,
|
||||||
"Invalid addNPC Command. Need contract ID, and level");
|
"Invalid addNPC Command. Need contract ID, and level");
|
||||||
return; // NaN
|
return; // NaN
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pick a random name
|
// Pick a random name
|
||||||
if (name.isEmpty())
|
if (name.isEmpty())
|
||||||
name = NPCManager.getPirateName(contract.getMobbaseID());
|
name = NPCManager.getPirateName(contract.getMobbaseID());
|
||||||
|
|
||||||
Zone zone = ZoneManager.findSmallestZone(pc.getLoc());
|
Zone zone = ZoneManager.findSmallestZone(pc.getLoc());
|
||||||
|
|
||||||
if (zone == null) {
|
if (zone == null) {
|
||||||
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
|
||||||
|
|||||||
@@ -1,63 +0,0 @@
|
|||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.devcmd.cmds;
|
|
||||||
|
|
||||||
import engine.Enum.ItemContainerType;
|
|
||||||
import engine.Enum.ItemType;
|
|
||||||
import engine.Enum.OwnerType;
|
|
||||||
import engine.devcmd.AbstractDevCmd;
|
|
||||||
import engine.gameManager.ChatManager;
|
|
||||||
import engine.gameManager.DbManager;
|
|
||||||
import engine.objects.*;
|
|
||||||
import engine.powers.EffectsBase;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Eighty
|
|
||||||
*/
|
|
||||||
public class GimmeCmd extends AbstractDevCmd {
|
|
||||||
|
|
||||||
public GimmeCmd() {
|
|
||||||
super("gimme");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void _doCmd(PlayerCharacter pc, String[] words,
|
|
||||||
AbstractGameObject target) {
|
|
||||||
int amt = 0;
|
|
||||||
int currentGold = pc.getCharItemManager().getGoldInventory().getNumOfItems();
|
|
||||||
amt = 10000000 - currentGold;
|
|
||||||
if (!pc.getCharItemManager().addGoldToInventory(amt, true)) {
|
|
||||||
throwbackError(pc, "Failed to add gold to inventory");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ChatManager.chatSayInfo(pc, amt + " gold added to inventory");
|
|
||||||
|
|
||||||
if(pc.level < 75) {
|
|
||||||
pc.setLevel((short) 75);
|
|
||||||
ChatManager.chatSayInfo(pc, "Level set to 75");
|
|
||||||
}
|
|
||||||
pc.getCharItemManager().updateInventory();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String _getHelpString() {
|
|
||||||
return "Round up current gold in inventory to 10,000,000";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String _getUsageString() {
|
|
||||||
return "'./gimme";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||||
|
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||||
|
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||||
|
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||||
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||||
|
// Magicbane Emulator Project © 2013 - 2022
|
||||||
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
|
package engine.devcmd.cmds;
|
||||||
|
|
||||||
|
import engine.devcmd.AbstractDevCmd;
|
||||||
|
import engine.gameManager.ZoneManager;
|
||||||
|
import engine.objects.AbstractGameObject;
|
||||||
|
import engine.objects.PlayerCharacter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ./hotzone <- display the current hotzone & time remaining
|
||||||
|
* ./hotzone random <- change hotzone to random new zone
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class HotzoneCmd extends AbstractDevCmd {
|
||||||
|
|
||||||
|
public HotzoneCmd() {
|
||||||
|
super("hotzone");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void _doCmd(PlayerCharacter playerCharacter, String[] words,
|
||||||
|
AbstractGameObject target) {
|
||||||
|
|
||||||
|
StringBuilder data = new StringBuilder();
|
||||||
|
String outString;
|
||||||
|
|
||||||
|
for (String s : words) {
|
||||||
|
data.append(s);
|
||||||
|
data.append(' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
String input = data.toString().trim();
|
||||||
|
|
||||||
|
if (input.length() == 0) {
|
||||||
|
outString = "Current hotZone: " + ZoneManager.hotZone.getName() + "\r\n";
|
||||||
|
outString += "Available hotZones: " + ZoneManager.availableHotZones();
|
||||||
|
throwbackInfo(playerCharacter, outString);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (input.equalsIgnoreCase("random")) {
|
||||||
|
ZoneManager.generateAndSetRandomHotzone();
|
||||||
|
outString = "New hotZone: " + ZoneManager.hotZone.getName() + "\r\n";
|
||||||
|
outString += "Available hotZones: " + ZoneManager.availableHotZones();
|
||||||
|
throwbackInfo(playerCharacter, outString);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (input.equalsIgnoreCase("reset")) {
|
||||||
|
ZoneManager.resetHotZones();
|
||||||
|
throwbackInfo(playerCharacter, "Available hotZones: " + ZoneManager.availableHotZones());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String _getHelpString() {
|
||||||
|
return "Use no arguments to see the current hotzone or \"random\" to change it randomly.";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String _getUsageString() {
|
||||||
|
return "'./hotzone [random]";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -337,8 +337,7 @@ public class InfoCmd extends AbstractDevCmd {
|
|||||||
output += "Swimming : " + targetPC.isSwimming();
|
output += "Swimming : " + targetPC.isSwimming();
|
||||||
output += newline;
|
output += newline;
|
||||||
output += "isMoving : " + targetPC.isMoving();
|
output += "isMoving : " + targetPC.isMoving();
|
||||||
output += newline;
|
|
||||||
output += "Zerg Multiplier : " + targetPC.ZergMultiplier;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NPC:
|
case NPC:
|
||||||
@@ -441,7 +440,9 @@ public class InfoCmd extends AbstractDevCmd {
|
|||||||
output += "isSummonedPet: true";
|
output += "isSummonedPet: true";
|
||||||
else
|
else
|
||||||
output += "isSummonedPet: false";
|
output += "isSummonedPet: false";
|
||||||
PlayerCharacter owner = targetMob.getOwner();
|
|
||||||
|
|
||||||
|
PlayerCharacter owner = (PlayerCharacter) targetMob.guardCaptain;
|
||||||
if (owner != null)
|
if (owner != null)
|
||||||
output += " owner: " + owner.getObjectUUID();
|
output += " owner: " + owner.getObjectUUID();
|
||||||
output += newline;
|
output += newline;
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ 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.HalfHourlyJobThread;
|
|
||||||
import engine.workthreads.HourlyJobThread;
|
import engine.workthreads.HourlyJobThread;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -42,10 +41,10 @@ public class MineActiveCmd extends AbstractDevCmd {
|
|||||||
String trigger = args[0];
|
String trigger = args[0];
|
||||||
switch (trigger) {
|
switch (trigger) {
|
||||||
case "true":
|
case "true":
|
||||||
HalfHourlyJobThread.mineWindowOpen(mine);
|
HourlyJobThread.mineWindowOpen(mine);
|
||||||
break;
|
break;
|
||||||
case "false":
|
case "false":
|
||||||
HalfHourlyJobThread.mineWindowClose(mine);
|
HourlyJobThread.mineWindowClose(mine);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
this.sendUsage(pcSender);
|
this.sendUsage(pcSender);
|
||||||
|
|||||||
@@ -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.*;
|
||||||
|
|
||||||
@@ -73,10 +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 += "Move Speed: " + tar.getSpeed() + newline;
|
|
||||||
out += "Health Regen: " + tar.getRegenModifier(Enum.ModType.HealthRecoverRate) + newline;
|
|
||||||
out += "Mana Regen: " + tar.getRegenModifier(Enum.ModType.ManaRecoverRate) + newline;
|
|
||||||
out += "Stamina Regen: " + tar.getRegenModifier(Enum.ModType.StaminaRecoverRate) + newline;
|
|
||||||
throwbackInfo(pc, out);
|
throwbackInfo(pc, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ public class PurgeObjectsCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
|
|
||||||
if (npc != null) {
|
if (npc != null) {
|
||||||
for (Mob mob : npc.getSiegeMinionMap().keySet()) {
|
for (Mob mob : npc.siegeMinionMap.keySet()) {
|
||||||
WorldGrid.RemoveWorldObject(mob);
|
WorldGrid.RemoveWorldObject(mob);
|
||||||
WorldGrid.removeObject(mob, pc);
|
WorldGrid.removeObject(mob, pc);
|
||||||
//Mob.getRespawnMap().remove(mob);
|
//Mob.getRespawnMap().remove(mob);
|
||||||
@@ -151,7 +151,7 @@ public class PurgeObjectsCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
|
|
||||||
if (npc != null) {
|
if (npc != null) {
|
||||||
for (Mob mob : npc.getSiegeMinionMap().keySet()) {
|
for (Mob mob : npc.siegeMinionMap.keySet()) {
|
||||||
WorldGrid.RemoveWorldObject(mob);
|
WorldGrid.RemoveWorldObject(mob);
|
||||||
WorldGrid.removeObject(mob, pc);
|
WorldGrid.removeObject(mob, pc);
|
||||||
//Mob.getRespawnMap().remove(mob);
|
//Mob.getRespawnMap().remove(mob);
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ public class RemoveObjectCmd extends AbstractDevCmd {
|
|||||||
mobA = (Mob) ac;
|
mobA = (Mob) ac;
|
||||||
|
|
||||||
if (npc != null) {
|
if (npc != null) {
|
||||||
for (Mob mob : npc.getSiegeMinionMap().keySet()) {
|
for (Mob mob : npc.siegeMinionMap.keySet()) {
|
||||||
WorldGrid.RemoveWorldObject(mob);
|
WorldGrid.RemoveWorldObject(mob);
|
||||||
WorldGrid.removeObject(mob, pc);
|
WorldGrid.removeObject(mob, pc);
|
||||||
//Mob.getRespawnMap().remove(mob);
|
//Mob.getRespawnMap().remove(mob);
|
||||||
@@ -209,7 +209,7 @@ public class RemoveObjectCmd extends AbstractDevCmd {
|
|||||||
if (npc.building != null)
|
if (npc.building != null)
|
||||||
npc.building.getHirelings().remove(npc);
|
npc.building.getHirelings().remove(npc);
|
||||||
|
|
||||||
for (Mob mob : npc.getSiegeMinionMap().keySet()) {
|
for (Mob mob : npc.siegeMinionMap.keySet()) {
|
||||||
WorldGrid.RemoveWorldObject(mob);
|
WorldGrid.RemoveWorldObject(mob);
|
||||||
WorldGrid.removeObject(mob, pc);
|
WorldGrid.removeObject(mob, pc);
|
||||||
if (mob.getParentZone() != null)
|
if (mob.getParentZone() != null)
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ public class SetLevelCmd extends AbstractDevCmd {
|
|||||||
this.sendUsage(pc);
|
this.sendUsage(pc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (level < 1 || level > 80) {
|
if (level < 1 || level > 75) {
|
||||||
this.sendHelp(pc);
|
this.sendHelp(pc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -62,7 +62,7 @@ public class SetLevelCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String _getHelpString() {
|
protected String _getHelpString() {
|
||||||
return "Sets your character's level to 'amount'. 'amount' must be between 1-80";
|
return "Sets your character's level to 'amount'. 'amount' must be between 1-75";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ import java.util.ArrayList;
|
|||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
public class SimulateBootyCmd extends AbstractDevCmd {
|
public class SimulateBootyCmd extends AbstractDevCmd {
|
||||||
|
|
||||||
public int simCount = 250;
|
|
||||||
public SimulateBootyCmd() {
|
public SimulateBootyCmd() {
|
||||||
super("bootysim");
|
super("bootysim");
|
||||||
}
|
}
|
||||||
@@ -27,15 +25,7 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
String output;
|
String output;
|
||||||
|
|
||||||
try
|
output = "Booty Simulation:" + newline;
|
||||||
{
|
|
||||||
simCount = Integer.parseInt(words[0]);
|
|
||||||
}catch(Exception e)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
output = "Booty Simulation: Rolls:" + simCount + newline;
|
|
||||||
|
|
||||||
Mob mob = (Mob) target;
|
Mob mob = (Mob) target;
|
||||||
output += "Name: " + mob.getName() + newline;
|
output += "Name: " + mob.getName() + newline;
|
||||||
@@ -54,7 +44,6 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
|||||||
ArrayList<Item> Resources = new ArrayList<Item>();
|
ArrayList<Item> Resources = new ArrayList<Item>();
|
||||||
ArrayList<Item> Runes = new ArrayList<Item>();
|
ArrayList<Item> Runes = new ArrayList<Item>();
|
||||||
ArrayList<Item> Contracts = new ArrayList<Item>();
|
ArrayList<Item> Contracts = new ArrayList<Item>();
|
||||||
ArrayList<Item> GuardContracts = new ArrayList<Item>();
|
|
||||||
ArrayList<Item> Offerings = new ArrayList<Item>();
|
ArrayList<Item> Offerings = new ArrayList<Item>();
|
||||||
ArrayList<Item> OtherDrops = new ArrayList<Item>();
|
ArrayList<Item> OtherDrops = new ArrayList<Item>();
|
||||||
ArrayList<Item> EquipmentDrops = new ArrayList<Item>();
|
ArrayList<Item> EquipmentDrops = new ArrayList<Item>();
|
||||||
@@ -62,16 +51,13 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
|||||||
int failures = 0;
|
int failures = 0;
|
||||||
int goldAmount = 0;
|
int goldAmount = 0;
|
||||||
|
|
||||||
for (int i = 0; i < simCount; ++i) {
|
for (int i = 0; i < 100; ++i) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
mob.loadInventory();
|
mob.loadInventory();
|
||||||
for (Item lootItem : mob.getCharItemManager().getInventory()) {
|
for (Item lootItem : mob.getCharItemManager().getInventory()) {
|
||||||
switch (lootItem.getItemBase().getType()) {
|
switch (lootItem.getItemBase().getType()) {
|
||||||
case CONTRACT: //CONTRACT
|
case CONTRACT: //CONTRACT
|
||||||
if(lootItem.getName().contains("Captain"))
|
|
||||||
GuardContracts.add(lootItem);
|
|
||||||
else
|
|
||||||
Contracts.add(lootItem);
|
Contracts.add(lootItem);
|
||||||
break;
|
break;
|
||||||
case OFFERING: //OFFERING
|
case OFFERING: //OFFERING
|
||||||
@@ -144,17 +130,9 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int baseBound = 100000;
|
|
||||||
int levelPenalty = (int) (Math.max(0, Math.abs(50 - mob.level)) * 0.01 * 100000);
|
|
||||||
int totalRange = baseBound + levelPenalty;
|
|
||||||
if(mob.level >= 50){
|
|
||||||
totalRange = baseBound;
|
|
||||||
}
|
|
||||||
output += "TOTAL ROLL POTENTIAL: " + totalRange + newline;
|
|
||||||
output += "GLASS DROPS: " + GlassItems.size() + newline;
|
output += "GLASS DROPS: " + GlassItems.size() + newline;
|
||||||
output += "RUNE DROPS: " + Runes.size() + newline;
|
output += "RUNE DROPS: " + Runes.size() + newline;
|
||||||
output += "CONTRACTS DROPS: " + Contracts.size() + newline;
|
output += "CONTRACTS DROPS: " + Contracts.size() + newline;
|
||||||
output += "GUARD CONTRACTS DROPS: " + GuardContracts.size() + 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;
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ public class SplatMobCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
mobile = Mob.createMob(_mobileUUID,
|
mobile = Mob.createMob(_mobileUUID,
|
||||||
Vector3fImmutable.getRandomPointInCircle(_currentLocation, _targetRange),
|
Vector3fImmutable.getRandomPointInCircle(_currentLocation, _targetRange),
|
||||||
null, true, serverZone, null, 0, "", 1);
|
null, serverZone, null, null, "", 1);
|
||||||
|
|
||||||
if (mobile != null) {
|
if (mobile != null) {
|
||||||
mobile.updateDatabase();
|
mobile.updateDatabase();
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ package engine.devcmd.cmds;
|
|||||||
|
|
||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
import engine.devcmd.AbstractDevCmd;
|
import engine.devcmd.AbstractDevCmd;
|
||||||
|
import engine.gameManager.PowersManager;
|
||||||
import engine.objects.AbstractGameObject;
|
import engine.objects.AbstractGameObject;
|
||||||
import engine.objects.Mob;
|
import engine.objects.Mob;
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
@@ -56,18 +57,18 @@ public class aiInfoCmd extends AbstractDevCmd {
|
|||||||
Mob mob = (Mob) target;
|
Mob mob = (Mob) target;
|
||||||
output = "Mob AI Information:" + newline;
|
output = "Mob AI Information:" + newline;
|
||||||
output += mob.getName() + newline;
|
output += mob.getName() + newline;
|
||||||
if (mob.BehaviourType != null) {
|
if (mob.behaviourType != null) {
|
||||||
output += "BehaviourType: " + mob.BehaviourType.toString() + newline;
|
output += "BehaviourType: " + mob.behaviourType.toString() + newline;
|
||||||
if (mob.BehaviourType.BehaviourHelperType != null) {
|
if (mob.behaviourType.BehaviourHelperType != null) {
|
||||||
output += "Behaviour Helper Type: " + mob.BehaviourType.BehaviourHelperType.toString() + newline;
|
output += "Behaviour Helper Type: " + mob.behaviourType.BehaviourHelperType.toString() + newline;
|
||||||
} else {
|
} else {
|
||||||
output += "Behaviour Helper Type: NULL" + newline;
|
output += "Behaviour Helper Type: NULL" + newline;
|
||||||
}
|
}
|
||||||
output += "Wimpy: " + mob.BehaviourType.isWimpy + newline;
|
output += "Wimpy: " + mob.behaviourType.isWimpy + newline;
|
||||||
output += "Agressive: " + mob.BehaviourType.isAgressive + newline;
|
output += "Agressive: " + mob.behaviourType.isAgressive + newline;
|
||||||
output += "Can Roam: " + mob.BehaviourType.canRoam + newline;
|
output += "Can Roam: " + mob.behaviourType.canRoam + newline;
|
||||||
output += "Calls For Help: " + mob.BehaviourType.callsForHelp + newline;
|
output += "Calls For Help: " + mob.behaviourType.callsForHelp + newline;
|
||||||
output += "Responds To Call For Help: " + mob.BehaviourType.respondsToCallForHelp + newline;
|
output += "Responds To Call For Help: " + mob.behaviourType.respondsToCallForHelp + newline;
|
||||||
} else {
|
} else {
|
||||||
output += "BehaviourType: NULL" + newline;
|
output += "BehaviourType: NULL" + newline;
|
||||||
}
|
}
|
||||||
@@ -76,16 +77,21 @@ public class aiInfoCmd extends AbstractDevCmd {
|
|||||||
if (mob.playerAgroMap.size() > 0) {
|
if (mob.playerAgroMap.size() > 0) {
|
||||||
output += "Players Loaded:" + newline;
|
output += "Players Loaded:" + newline;
|
||||||
}
|
}
|
||||||
for (Map.Entry<Integer, Boolean> entry : mob.playerAgroMap.entrySet()) {
|
for (Map.Entry<Integer, Float> entry : mob.playerAgroMap.entrySet()) {
|
||||||
output += "Player ID: " + entry.getKey() + " Hate Value: " + (PlayerCharacter.getPlayerCharacter(entry.getKey())).getHateValue() + newline;
|
output += "Player ID: " + entry.getKey() + " Hate Value: " + entry.getValue() + newline;
|
||||||
}
|
}
|
||||||
if (mob.getCombatTarget() != null)
|
if (mob.getCombatTarget() != null)
|
||||||
output += "Current Target: " + mob.getCombatTarget().getName() + newline;
|
output += "Current Target: " + mob.getCombatTarget().getName() + newline;
|
||||||
else
|
else
|
||||||
output += "Current Target: NULL" + newline;
|
output += "Current Target: NULL" + newline;
|
||||||
|
|
||||||
|
if (mob.guardedCity != null)
|
||||||
|
output += "Patrolling: " + mob.guardedCity.getCityName() + newline;
|
||||||
|
|
||||||
|
output += "Powers:" + newline;
|
||||||
|
|
||||||
for (int token : mob.mobPowers.keySet())
|
for (int token : mob.mobPowers.keySet())
|
||||||
output += token + newline;
|
output += PowersManager.getPowerByToken(token).getName() + newline;
|
||||||
|
|
||||||
throwbackInfo(playerCharacter, output);
|
throwbackInfo(playerCharacter, output);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,158 +0,0 @@
|
|||||||
package engine.gameManager;
|
|
||||||
|
|
||||||
import engine.Enum;
|
|
||||||
import engine.InterestManagement.WorldGrid;
|
|
||||||
import engine.exception.MsgSendException;
|
|
||||||
import engine.math.Vector3f;
|
|
||||||
import engine.math.Vector3fImmutable;
|
|
||||||
import engine.objects.*;
|
|
||||||
import engine.server.MBServerStatics;
|
|
||||||
import org.pmw.tinylog.Logger;
|
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
|
||||||
|
|
||||||
public class ArenaManager {
|
|
||||||
private static final List<Arena> activeArenas = new ArrayList<>();
|
|
||||||
public static final List<PlayerCharacter> playerQueue = new ArrayList<>();
|
|
||||||
public static Long pulseDelay = 180000L;
|
|
||||||
public static Long lastExecution = 0L;
|
|
||||||
|
|
||||||
public static void pulseArenas() {
|
|
||||||
if(lastExecution == 0L){
|
|
||||||
lastExecution = System.currentTimeMillis();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(activeArenas.isEmpty() && playerQueue.isEmpty())
|
|
||||||
return;
|
|
||||||
|
|
||||||
Iterator<Arena> iterator = activeArenas.iterator();
|
|
||||||
|
|
||||||
while (iterator.hasNext()) {
|
|
||||||
Arena arena = iterator.next();
|
|
||||||
if (arena.checkToComplete()) {
|
|
||||||
iterator.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(lastExecution + pulseDelay > System.currentTimeMillis())
|
|
||||||
return;
|
|
||||||
|
|
||||||
lastExecution = System.currentTimeMillis();
|
|
||||||
|
|
||||||
while (playerQueue.size() > 1) {
|
|
||||||
createArena();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void joinQueue(PlayerCharacter player) {
|
|
||||||
if (!playerQueue.contains(player)) {
|
|
||||||
playerQueue.add(player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void leaveQueue(PlayerCharacter player) {
|
|
||||||
playerQueue.remove(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void createArena() {
|
|
||||||
if (playerQueue.size() > 1) {
|
|
||||||
|
|
||||||
Collections.shuffle(playerQueue);
|
|
||||||
Arena newArena = new Arena();
|
|
||||||
|
|
||||||
//set starting time
|
|
||||||
newArena.startTime = System.currentTimeMillis();
|
|
||||||
|
|
||||||
//decide an arena location
|
|
||||||
newArena.loc = selectRandomArenaLocation();
|
|
||||||
|
|
||||||
// Assign players to the arena
|
|
||||||
newArena.player1 = playerQueue.remove(0);
|
|
||||||
newArena.player2 = playerQueue.remove(0);
|
|
||||||
|
|
||||||
// Teleport players to the arena location
|
|
||||||
Zone sdr = ZoneManager.getZoneByUUID(656);
|
|
||||||
MovementManager.translocate(newArena.player1, Vector3fImmutable.getRandomPointOnCircle(newArena.loc,75f), null);
|
|
||||||
MovementManager.translocate(newArena.player2, Vector3fImmutable.getRandomPointOnCircle(newArena.loc,75f), null);
|
|
||||||
|
|
||||||
// Add the new arena to the active arenas list
|
|
||||||
activeArenas.add(newArena);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void endArena(Arena arena, PlayerCharacter winner, PlayerCharacter loser, String condition){
|
|
||||||
if (winner != null && loser != null) {
|
|
||||||
Logger.info("[ARENA] The fight between {} and {} is concluded. Victor: {}",
|
|
||||||
arena.player1.getName(), arena.player2.getName(), winner.getName());
|
|
||||||
} else {
|
|
||||||
Logger.info("[ARENA] The fight between {} and {} is concluded. No Winner Declared.",
|
|
||||||
arena.player1.getName(), arena.player2.getName());
|
|
||||||
}
|
|
||||||
// Teleport players to the arena location
|
|
||||||
Zone sdr = ZoneManager.getZoneByUUID(656);
|
|
||||||
MovementManager.translocate(arena.player1, Vector3fImmutable.getRandomPointOnCircle(sdr.getLoc(),50f), null);
|
|
||||||
MovementManager.translocate(arena.player2, Vector3fImmutable.getRandomPointOnCircle(sdr.getLoc(),50f), null);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
activeArenas.remove(arena);
|
|
||||||
|
|
||||||
if(winner != null){
|
|
||||||
ChatManager.chatPVP("[ARENA] " + winner.getName() + " has slain " + loser.getName() + " in the arena!");
|
|
||||||
//handle prize distribution
|
|
||||||
//ItemBase specialLoot = ItemBase.getItemBase(866);
|
|
||||||
//Item promoted = new MobLoot(winner, specialLoot, 1, false).promoteToItem(winner);
|
|
||||||
//promoted.setNumOfItems(21235);
|
|
||||||
//promoted.setName("Special Banker(21235)");
|
|
||||||
//DbManager.ItemQueries.UPDATE_NUM_ITEMS(promoted,21235);
|
|
||||||
//winner.getCharItemManager().addItemToInventory(promoted);
|
|
||||||
//winner.getCharItemManager().updateInventory();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Vector3fImmutable selectRandomArenaLocation() {
|
|
||||||
boolean locSet = false;
|
|
||||||
Vector3fImmutable loc = Vector3fImmutable.ZERO;
|
|
||||||
|
|
||||||
while (!locSet) {
|
|
||||||
try {
|
|
||||||
float x = ThreadLocalRandom.current().nextInt(114300, 123600);
|
|
||||||
float z = ThreadLocalRandom.current().nextInt(82675, 91700);
|
|
||||||
float y = 0; // Y coordinate is always 0
|
|
||||||
|
|
||||||
loc = new Vector3fImmutable(x, y, z * -1);
|
|
||||||
HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(loc,500f, MBServerStatics.MASK_PLAYER);
|
|
||||||
if(inRange.isEmpty() && !isUnderWater(loc))
|
|
||||||
locSet = true;
|
|
||||||
//}
|
|
||||||
}catch(Exception e){
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return loc;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isUnderWater(Vector3fImmutable loc) {
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
Zone zone = ZoneManager.findSmallestZone(loc);
|
|
||||||
|
|
||||||
if (zone.getSeaLevel() != 0) {
|
|
||||||
|
|
||||||
float localAltitude = loc.y;
|
|
||||||
if (localAltitude < zone.getSeaLevel())
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
if (loc.y < 0)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -438,18 +438,6 @@ public enum BuildingManager {
|
|||||||
|
|
||||||
public static boolean IsPlayerHostile(Building building, PlayerCharacter player) {
|
public static boolean IsPlayerHostile(Building building, PlayerCharacter player) {
|
||||||
|
|
||||||
if(building.getBlueprint() != null && building.getBlueprint().getBuildingGroup() != null && building.getBlueprint().getBuildingGroup().equals(BuildingGroup.BANESTONE))
|
|
||||||
{
|
|
||||||
Guild playerNation = player.guild.getNation();
|
|
||||||
City banedCity = ZoneManager.getCityAtLocation(building.loc);
|
|
||||||
if(banedCity != null){
|
|
||||||
if(banedCity.getGuild().getNation().equals(playerNation)){
|
|
||||||
return false;
|
|
||||||
}else{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//Nation Members and Guild members are not hostile.
|
//Nation Members and Guild members are not hostile.
|
||||||
// if (building.getGuild() != null){
|
// if (building.getGuild() != null){
|
||||||
// if (pc.getGuild() != null)
|
// if (pc.getGuild() != null)
|
||||||
@@ -532,30 +520,7 @@ public enum BuildingManager {
|
|||||||
if (building.getBlueprintUUID() == 0)
|
if (building.getBlueprintUUID() == 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if(building.getBlueprint().getBuildingGroup().equals(BuildingGroup.TOL)){
|
if (building.getBlueprint().getMaxSlots() == building.getHirelings().size())
|
||||||
if(contract.getContractID() == 850) {
|
|
||||||
boolean hasRunemaster = false;
|
|
||||||
for (AbstractCharacter npc : building.getHirelings().keySet()) {
|
|
||||||
|
|
||||||
if (npc.getObjectType() != GameObjectType.NPC)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if(npc.contractUUID == 850)
|
|
||||||
hasRunemaster = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(hasRunemaster)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int maxSlots = building.getBlueprint().getMaxSlots();
|
|
||||||
if(building.getBlueprint().getBuildingGroup() != null) {
|
|
||||||
maxSlots = building.getBlueprint().getSlotsForRank(building.getRank());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (maxSlots == building.getHirelings().size())
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
String pirateName = NPCManager.getPirateName(contract.getMobbaseID());
|
String pirateName = NPCManager.getPirateName(contract.getMobbaseID());
|
||||||
@@ -570,7 +535,7 @@ public enum BuildingManager {
|
|||||||
|
|
||||||
if (NPC.ISWallArcher(contract)) {
|
if (NPC.ISWallArcher(contract)) {
|
||||||
|
|
||||||
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank);
|
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank);
|
||||||
|
|
||||||
if (mob == null)
|
if (mob == null)
|
||||||
return false;
|
return false;
|
||||||
@@ -582,7 +547,7 @@ public enum BuildingManager {
|
|||||||
|
|
||||||
if (NPC.ISGuardCaptain(contract.getContractID())) {
|
if (NPC.ISGuardCaptain(contract.getContractID())) {
|
||||||
|
|
||||||
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank);
|
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank);
|
||||||
|
|
||||||
if (mob == null)
|
if (mob == null)
|
||||||
return false;
|
return false;
|
||||||
@@ -594,7 +559,7 @@ public enum BuildingManager {
|
|||||||
if (contract.getContractID() == 910) {
|
if (contract.getContractID() == 910) {
|
||||||
|
|
||||||
//guard dog
|
//guard dog
|
||||||
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank);
|
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, building, contract, pirateName, rank);
|
||||||
|
|
||||||
if (mob == null)
|
if (mob == null)
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -646,25 +646,24 @@ public enum CombatManager {
|
|||||||
|
|
||||||
//Get hit chance
|
//Get hit chance
|
||||||
|
|
||||||
//int chance;
|
int chance;
|
||||||
float dif = atr - defense;
|
float dif = atr - defense;
|
||||||
|
|
||||||
//if (dif > 100)
|
if (dif > 100)
|
||||||
// chance = 94;
|
chance = 94;
|
||||||
//else if (dif < -100)
|
else if (dif < -100)
|
||||||
// chance = 4;
|
chance = 4;
|
||||||
//else
|
else
|
||||||
// chance = (int) ((0.45 * dif) + 49);
|
chance = (int) ((0.45 * dif) + 49);
|
||||||
|
|
||||||
errorTrack = 5;
|
errorTrack = 5;
|
||||||
|
|
||||||
//calculate hit/miss
|
//calculate hit/miss
|
||||||
|
|
||||||
|
int roll = ThreadLocalRandom.current().nextInt(100);
|
||||||
DeferredPowerJob dpj = null;
|
DeferredPowerJob dpj = null;
|
||||||
|
|
||||||
|
if (roll < chance) {
|
||||||
|
|
||||||
if (LandHit((int)atr,(int)defense)) {
|
|
||||||
|
|
||||||
if (ac.getObjectType().equals(GameObjectType.PlayerCharacter))
|
if (ac.getObjectType().equals(GameObjectType.PlayerCharacter))
|
||||||
updateAttackTimers((PlayerCharacter) ac, target, true);
|
updateAttackTimers((PlayerCharacter) ac, target, true);
|
||||||
@@ -827,7 +826,8 @@ public enum CombatManager {
|
|||||||
damage *= 2.5f; //increase damage if sitting
|
damage *= 2.5f; //increase damage if sitting
|
||||||
|
|
||||||
if (tarAc.getObjectType() == GameObjectType.Mob) {
|
if (tarAc.getObjectType() == GameObjectType.Mob) {
|
||||||
ac.setHateValue(damage * MBServerStatics.PLAYER_COMBAT_HATE_MODIFIER);
|
if(ac.getObjectType().equals(GameObjectType.PlayerCharacter))
|
||||||
|
((Mob)tarAc).playerAgroMap.put(ac.getObjectUUID(), ((Mob) tarAc).playerAgroMap.get(ac.getObjectUUID()) + damage);
|
||||||
((Mob) tarAc).handleDirectAggro(ac);
|
((Mob) tarAc).handleDirectAggro(ac);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1055,10 +1055,6 @@ public enum CombatManager {
|
|||||||
if (eff.getPower() != null && (eff.getPower().getToken() == 429506943 || eff.getPower().getToken() == 429408639 || eff.getPower().getToken() == 429513599 || eff.getPower().getToken() == 429415295))
|
if (eff.getPower() != null && (eff.getPower().getToken() == 429506943 || eff.getPower().getToken() == 429408639 || eff.getPower().getToken() == 429513599 || eff.getPower().getToken() == 429415295))
|
||||||
swingAnimation = 0;
|
swingAnimation = 0;
|
||||||
|
|
||||||
if(source != null && source.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
|
||||||
damage *= ((PlayerCharacter)source).ZergMultiplier;
|
|
||||||
} // Health modifications are modified by the ZergMechanic
|
|
||||||
|
|
||||||
TargetedActionMsg cmm = new TargetedActionMsg(source, target, damage, swingAnimation);
|
TargetedActionMsg cmm = new TargetedActionMsg(source, target, damage, swingAnimation);
|
||||||
DispatchMessage.sendToAllInRange(target, cmm);
|
DispatchMessage.sendToAllInRange(target, cmm);
|
||||||
}
|
}
|
||||||
@@ -1242,16 +1238,13 @@ public enum CombatManager {
|
|||||||
DispatchMessage.dispatchMsgToInterestArea(pc, rwss, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);
|
DispatchMessage.dispatchMsgToInterestArea(pc, rwss, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void toggleSit(boolean toggle, ClientConnection origin) {
|
private static void toggleSit(boolean toggle, ClientConnection origin) {
|
||||||
|
|
||||||
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
|
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
|
||||||
|
|
||||||
if (pc == null)
|
if (pc == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(pc.isFlying())
|
|
||||||
pc.setSit(false);
|
|
||||||
else
|
|
||||||
pc.setSit(toggle);
|
pc.setSit(toggle);
|
||||||
|
|
||||||
UpdateStateMsg rwss = new UpdateStateMsg();
|
UpdateStateMsg rwss = new UpdateStateMsg();
|
||||||
@@ -1330,13 +1323,6 @@ public enum CombatManager {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
retaliater.setCombatTarget(ac);
|
retaliater.setCombatTarget(ac);
|
||||||
if(retaliater.isPlayerGuard && (retaliater.BehaviourType.equals(MobBehaviourType.GuardMinion) || retaliater.BehaviourType.equals(MobBehaviourType.GuardCaptain))){
|
|
||||||
for(Mob guard : retaliater.guardedCity.getParent().zoneMobSet){
|
|
||||||
if(guard.isPlayerGuard && guard.combatTarget == null){
|
|
||||||
guard.setCombatTarget(ac);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1453,19 +1439,4 @@ public enum CombatManager {
|
|||||||
((AbstractCharacter) awo).getCharItemManager().damageRandomArmor(1);
|
((AbstractCharacter) awo).getCharItemManager().damageRandomArmor(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean LandHit(int atr, int defense){
|
|
||||||
|
|
||||||
int roll = ThreadLocalRandom.current().nextInt(101);
|
|
||||||
float chance = (float)((atr-((atr+defense)*0.315))/((defense-((atr+defense)*0.315))+(atr-((atr+defense)*0.315))));
|
|
||||||
|
|
||||||
int connvertedChance = (int)(chance * 100);
|
|
||||||
|
|
||||||
if(connvertedChance < 5)
|
|
||||||
connvertedChance = 5;
|
|
||||||
|
|
||||||
if(connvertedChance > 95)
|
|
||||||
connvertedChance = 95;
|
|
||||||
|
|
||||||
return connvertedChance > roll;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,7 +65,6 @@ public enum ConfigManager {
|
|||||||
MB_WORLD_MAINTENANCE,
|
MB_WORLD_MAINTENANCE,
|
||||||
MB_WORLD_GREETING,
|
MB_WORLD_GREETING,
|
||||||
MB_WORLD_KEYCLONE_MAX,
|
MB_WORLD_KEYCLONE_MAX,
|
||||||
MB_WORLD_TESTMODE,
|
|
||||||
MB_USE_RUINS,
|
MB_USE_RUINS,
|
||||||
|
|
||||||
// Mobile AI modifiers
|
// Mobile AI modifiers
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ public enum DevCmdManager {
|
|||||||
DevCmdManager.registerDevCmd(new AddGoldCmd());
|
DevCmdManager.registerDevCmd(new AddGoldCmd());
|
||||||
DevCmdManager.registerDevCmd(new ZoneInfoCmd());
|
DevCmdManager.registerDevCmd(new ZoneInfoCmd());
|
||||||
DevCmdManager.registerDevCmd(new DebugMeleeSyncCmd());
|
DevCmdManager.registerDevCmd(new DebugMeleeSyncCmd());
|
||||||
|
DevCmdManager.registerDevCmd(new HotzoneCmd());
|
||||||
DevCmdManager.registerDevCmd(new MineActiveCmd());
|
DevCmdManager.registerDevCmd(new MineActiveCmd());
|
||||||
// Dev
|
// Dev
|
||||||
DevCmdManager.registerDevCmd(new ApplyStatModCmd());
|
DevCmdManager.registerDevCmd(new ApplyStatModCmd());
|
||||||
@@ -102,7 +103,6 @@ public enum DevCmdManager {
|
|||||||
DevCmdManager.registerDevCmd(new SetAdminRuneCmd());
|
DevCmdManager.registerDevCmd(new SetAdminRuneCmd());
|
||||||
DevCmdManager.registerDevCmd(new SetInvulCmd());
|
DevCmdManager.registerDevCmd(new SetInvulCmd());
|
||||||
DevCmdManager.registerDevCmd(new MakeItemCmd());
|
DevCmdManager.registerDevCmd(new MakeItemCmd());
|
||||||
DevCmdManager.registerDevCmd(new GimmeCmd());
|
|
||||||
DevCmdManager.registerDevCmd(new EnchantCmd());
|
DevCmdManager.registerDevCmd(new EnchantCmd());
|
||||||
DevCmdManager.registerDevCmd(new SetSubRaceCmd());
|
DevCmdManager.registerDevCmd(new SetSubRaceCmd());
|
||||||
// Admin
|
// Admin
|
||||||
@@ -179,23 +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
|
||||||
boolean playerAllowed = false;
|
|
||||||
if(ConfigManager.MB_WORLD_TESTMODE.getValue().equals("true")) {
|
if (a.status.equals(Enum.AccountStatus.ADMIN) == false) {
|
||||||
switch (adc.getMainCmdString()) {
|
|
||||||
case "printresists":
|
|
||||||
case "printstats":
|
|
||||||
case "printskills":
|
|
||||||
case "printpowers":
|
|
||||||
case "gimme":
|
|
||||||
case "goto":
|
|
||||||
case "teleportmode":
|
|
||||||
playerAllowed = true;
|
|
||||||
if (!a.status.equals(Enum.AccountStatus.ADMIN))
|
|
||||||
target = pcSender;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!playerAllowed && !a.status.equals(Enum.AccountStatus.ADMIN)) {
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,9 +17,7 @@ import engine.objects.*;
|
|||||||
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.List;
|
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -36,12 +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 final ArrayList<Integer> vorg_ha_uuids = new ArrayList<>(Arrays.asList(27580, 27590, 188500, 188510, 188520, 188530, 188540, 188550, 189510));
|
|
||||||
public static final ArrayList<Integer> vorg_ma_uuids = new ArrayList<>(Arrays.asList(27570,188900,188910,188920,188930,188940,188950,189500));
|
|
||||||
public static final ArrayList<Integer> vorg_la_uuids = new ArrayList<>(Arrays.asList(27550,27560,189100,189110,189120,189130,189140,189150));
|
|
||||||
public static final ArrayList<Integer> vorg_cloth_uuids = new ArrayList<>(Arrays.asList(27600,188700,188720,189550,189560));
|
|
||||||
public static final ArrayList<Integer> racial_guard_uuids = new ArrayList<>(Arrays.asList(841,951,952,1050,1052,1180,1182,1250,1252,1350,1352,1450,1452,1500,1502,1525,1527,1550,1552,1575,1577,1600,1602,1650,1652,1700,980100,980102));
|
|
||||||
|
|
||||||
// Drop Rates
|
// Drop Rates
|
||||||
|
|
||||||
public static float NORMAL_DROP_RATE;
|
public static float NORMAL_DROP_RATE;
|
||||||
@@ -75,41 +67,23 @@ public enum LootManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void GenerateMobLoot(Mob mob) {
|
public static void GenerateMobLoot(Mob mob) {
|
||||||
|
|
||||||
//determine if mob is in hotzone
|
//determine if mob is in hotzone
|
||||||
boolean inHotzone = false;
|
boolean inHotzone = ZoneManager.inHotZone(mob.getLoc());
|
||||||
|
|
||||||
//iterate the booty sets
|
//iterate the booty sets
|
||||||
|
|
||||||
if(mob.mobBase == null || mob.getMobBaseID() == 253003){
|
if (mob.getMobBase().bootySet != 0 && _bootySetMap.containsKey(mob.getMobBase().bootySet) == true)
|
||||||
int i = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mob.getMobBase().bootySet != 0 && _bootySetMap.containsKey(mob.getMobBase().bootySet))
|
|
||||||
RunBootySet(_bootySetMap.get(mob.getMobBase().bootySet), mob, inHotzone);
|
RunBootySet(_bootySetMap.get(mob.getMobBase().bootySet), mob, inHotzone);
|
||||||
|
|
||||||
if (mob.bootySet != 0 && _bootySetMap.containsKey(mob.bootySet)) {
|
if (mob.bootySet != 0 && _bootySetMap.containsKey(mob.bootySet) == true)
|
||||||
RunBootySet(_bootySetMap.get(mob.bootySet), mob, inHotzone);
|
RunBootySet(_bootySetMap.get(mob.bootySet), mob, inHotzone);
|
||||||
}else if(mob.bootySet != 0 && ItemBase.getItemBase(mob.bootySet) != null){
|
|
||||||
MobLoot specialDrop = null;
|
|
||||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(mob.bootySet),true);
|
|
||||||
if(specialDrop != null) {
|
|
||||||
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"));
|
|
||||||
if(!Mob.discDroppers.contains(mob))
|
|
||||||
Mob.AddDiscDropper(mob);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//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()) {
|
||||||
|
|
||||||
ItemBase ib = it.getItemBase();
|
ItemBase ib = it.getItemBase();
|
||||||
if (ib == null)
|
if(ib == null)
|
||||||
break;
|
break;
|
||||||
if (ib.isDiscRune() || 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?");
|
||||||
@@ -124,62 +98,10 @@ public enum LootManager {
|
|||||||
private static void RunBootySet(ArrayList<BootySetEntry> entries, Mob mob, boolean inHotzone) {
|
private static void RunBootySet(ArrayList<BootySetEntry> entries, Mob mob, boolean inHotzone) {
|
||||||
|
|
||||||
boolean hotzoneWasRan = false;
|
boolean hotzoneWasRan = false;
|
||||||
float dropRate;
|
float dropRate = 1.0f;
|
||||||
|
|
||||||
if (!mob.getSafeZone()) {
|
|
||||||
int contractLow = 1, contractHigh = 400;
|
|
||||||
int runeLow = 401, runeHigh = 800;
|
|
||||||
int resourceLow = 801, resourceHigh = 900;
|
|
||||||
int glassLow = 901, glassHigh = 910;
|
|
||||||
int guardLow = 911, guardHigh = 920;
|
|
||||||
|
|
||||||
// Pre-compute adjusted high values
|
|
||||||
int contractAdjust = 0, runeAdjust = 0, resourceAdjust = 0, glassAdjust = 0, guardAdjust = 0;
|
|
||||||
if (mob.level < 50) {
|
|
||||||
int dif = 50 - mob.level;
|
|
||||||
contractAdjust = (int)(400 * (dif * 0.02f));
|
|
||||||
runeAdjust = (int)(400 * (dif * 0.02f));
|
|
||||||
resourceAdjust = (int)(100 * (dif * 0.02f));
|
|
||||||
glassAdjust = (int)(10 * (dif * 0.02f));
|
|
||||||
guardAdjust = (int)(10 * (dif * 0.02f));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate a single random roll
|
|
||||||
int specialCaseRoll = ThreadLocalRandom.current().nextInt(1, 100001);
|
|
||||||
|
|
||||||
// Calculate adjusted high values once
|
|
||||||
int contractHighAdjusted = contractHigh - contractAdjust;
|
|
||||||
int runeHighAdjusted = runeHigh - runeAdjust;
|
|
||||||
int resourceHighAdjusted = resourceHigh - resourceAdjust;
|
|
||||||
int glassHighAdjusted = glassHigh - glassAdjust;
|
|
||||||
int guardHighAdjusted = guardHigh - guardAdjust;
|
|
||||||
|
|
||||||
// Check the roll range and handle accordingly
|
|
||||||
if (specialCaseRoll >= contractLow && specialCaseRoll <= contractHighAdjusted) {
|
|
||||||
SpecialCaseContractDrop(mob, entries);
|
|
||||||
} else if (specialCaseRoll >= runeLow && specialCaseRoll <= runeHighAdjusted) {
|
|
||||||
SpecialCaseRuneDrop(mob, entries);
|
|
||||||
} else if (specialCaseRoll >= resourceLow && specialCaseRoll <= resourceHighAdjusted) {
|
|
||||||
SpecialCaseResourceDrop(mob, entries);
|
|
||||||
} else if (specialCaseRoll >= glassLow && specialCaseRoll <= glassHighAdjusted) {
|
|
||||||
int glassID = rollRandomItem(126);
|
|
||||||
ItemBase glassItem = ItemBase.getItemBase(glassID);
|
|
||||||
if (glassItem != null) {
|
|
||||||
MobLoot toAddGlass = new MobLoot(mob, glassItem, false);
|
|
||||||
mob.getCharItemManager().addItemToInventory(toAddGlass);
|
|
||||||
}
|
|
||||||
} else if (specialCaseRoll >= guardLow && specialCaseRoll <= guardHighAdjusted) {
|
|
||||||
int guardContractID = racial_guard_uuids.get(new java.util.Random().nextInt(racial_guard_uuids.size()));
|
|
||||||
ItemBase guardContract = ItemBase.getItemBase(guardContractID);
|
|
||||||
if (guardContract != null) {
|
|
||||||
MobLoot toAddContract = new MobLoot(mob, guardContract, false);
|
|
||||||
mob.getCharItemManager().addItemToInventory(toAddContract);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 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":
|
||||||
@@ -187,9 +109,7 @@ public enum LootManager {
|
|||||||
break;
|
break;
|
||||||
case "LOOT":
|
case "LOOT":
|
||||||
|
|
||||||
if (mob.getSafeZone())
|
if (mob.getSafeZone() == false)
|
||||||
return; // no loot to drop in safezones
|
|
||||||
|
|
||||||
dropRate = LootManager.NORMAL_DROP_RATE;
|
dropRate = LootManager.NORMAL_DROP_RATE;
|
||||||
|
|
||||||
if (inHotzone == true)
|
if (inHotzone == true)
|
||||||
@@ -215,109 +135,6 @@ public enum LootManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SpecialCaseContractDrop(Mob mob,ArrayList<BootySetEntry> entries){
|
|
||||||
|
|
||||||
int lootTableID = 0;
|
|
||||||
for(BootySetEntry entry : entries){
|
|
||||||
if(entry.bootyType.equals("LOOT")){
|
|
||||||
lootTableID = entry.genTable;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(lootTableID == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
int ContractTableID = 0;
|
|
||||||
for(GenTableEntry entry : _genTables.get(lootTableID)){
|
|
||||||
try {
|
|
||||||
if (ItemBase.getItemBase(_itemTables.get(entry.itemTableID).get(0).cacheID).getType().equals(Enum.ItemType.CONTRACT)) {
|
|
||||||
ContractTableID = entry.itemTableID;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}catch(Exception e){
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ContractTableID == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ItemBase ib = ItemBase.getItemBase(rollRandomItem(ContractTableID));
|
|
||||||
if(ib != null){
|
|
||||||
MobLoot toAdd = new MobLoot(mob,ib,false);
|
|
||||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void SpecialCaseRuneDrop(Mob mob,ArrayList<BootySetEntry> entries){
|
|
||||||
int lootTableID = 0;
|
|
||||||
for(BootySetEntry entry : entries){
|
|
||||||
if(entry.bootyType.equals("LOOT")){
|
|
||||||
lootTableID = entry.genTable;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(lootTableID == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
int RuneTableID = 0;
|
|
||||||
for(GenTableEntry entry : _genTables.get(lootTableID)){
|
|
||||||
try {
|
|
||||||
if (ItemBase.getItemBase(_itemTables.get(entry.itemTableID).get(0).cacheID).getType().equals(Enum.ItemType.RUNE)) {
|
|
||||||
RuneTableID = entry.itemTableID;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}catch(Exception e){
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(RuneTableID == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ItemBase ib = ItemBase.getItemBase(rollRandomItem(RuneTableID));
|
|
||||||
if(ib != null){
|
|
||||||
MobLoot toAdd = new MobLoot(mob,ib,false);
|
|
||||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void SpecialCaseResourceDrop(Mob mob,ArrayList<BootySetEntry> entries){
|
|
||||||
int lootTableID = 0;
|
|
||||||
for(BootySetEntry entry : entries){
|
|
||||||
if(entry.bootyType.equals("LOOT")){
|
|
||||||
lootTableID = entry.genTable;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(lootTableID == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
int ResourceTableID = 0;
|
|
||||||
for(GenTableEntry entry : _genTables.get(lootTableID)){
|
|
||||||
try {
|
|
||||||
if (ItemBase.getItemBase(_itemTables.get(entry.itemTableID).get(0).cacheID).getType().equals(Enum.ItemType.RESOURCE)) {
|
|
||||||
ResourceTableID = entry.itemTableID;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}catch(Exception e){
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ResourceTableID == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ItemBase ib = ItemBase.getItemBase(rollRandomItem(ResourceTableID));
|
|
||||||
if(ib != null){
|
|
||||||
MobLoot toAdd = new MobLoot(mob,ib,false);
|
|
||||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static MobLoot getGenTableItem(int genTableID, AbstractCharacter mob, Boolean inHotzone) {
|
public static MobLoot getGenTableItem(int genTableID, AbstractCharacter mob, Boolean inHotzone) {
|
||||||
|
|
||||||
if (mob == null || _genTables.containsKey(genTableID) == false)
|
if (mob == null || _genTables.containsKey(genTableID) == false)
|
||||||
@@ -339,10 +156,11 @@ public enum LootManager {
|
|||||||
|
|
||||||
//gets the 1-320 roll for this mob
|
//gets the 1-320 roll for this mob
|
||||||
int itemTableRoll = 0;
|
int itemTableRoll = 0;
|
||||||
|
int objectType = mob.getObjectType().ordinal();
|
||||||
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)
|
||||||
@@ -354,23 +172,13 @@ 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()) {
|
||||||
if(ThreadLocalRandom.current().nextInt(1,101) < 91)
|
|
||||||
return null; // cut down world drops rates of resources by 90%
|
|
||||||
int amount = ThreadLocalRandom.current().nextInt(tableRow.minSpawn, tableRow.maxSpawn + 1);
|
int amount = ThreadLocalRandom.current().nextInt(tableRow.minSpawn, tableRow.maxSpawn + 1);
|
||||||
return new MobLoot(mob, ItemBase.getItemBase(itemUUID), amount, false);
|
return new MobLoot(mob, ItemBase.getItemBase(itemUUID), amount, false);
|
||||||
}
|
}
|
||||||
if(ItemBase.getItemBase(itemUUID).getType().equals(Enum.ItemType.RUNE)){
|
|
||||||
int randomRune = rollRandomItem(itemTableId);
|
|
||||||
if(randomRune != 0) {
|
|
||||||
itemUUID = randomRune;
|
|
||||||
}
|
|
||||||
} else if(ItemBase.getItemBase(itemUUID).getType().equals(Enum.ItemType.CONTRACT)){
|
|
||||||
int randomContract = rollRandomItem(itemTableId);
|
|
||||||
if(randomContract != 0) {
|
|
||||||
itemUUID = randomContract;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
outItem = new MobLoot(mob, ItemBase.getItemBase(itemUUID), false);
|
outItem = new MobLoot(mob, ItemBase.getItemBase(itemUUID), false);
|
||||||
|
Enum.ItemType outType = outItem.getItemBase().getType();
|
||||||
|
|
||||||
|
|
||||||
if(selectedRow.pModTable != 0){
|
if(selectedRow.pModTable != 0){
|
||||||
try {
|
try {
|
||||||
@@ -388,12 +196,6 @@ public enum LootManager {
|
|||||||
Logger.error("Failed to GenerateSuffix for item: " + outItem.getName());
|
Logger.error("Failed to GenerateSuffix for item: " + outItem.getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(outItem.getItemBase().getType().equals(Enum.ItemType.CONTRACT) || outItem.getItemBase().getType().equals(Enum.ItemType.RUNE)){
|
|
||||||
if(ThreadLocalRandom.current().nextInt(1,101) < 66)
|
|
||||||
return null; // cut down world drops rates of resources by 65%
|
|
||||||
}
|
|
||||||
|
|
||||||
return outItem;
|
return outItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -414,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);
|
||||||
|
|
||||||
@@ -446,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);
|
||||||
|
|
||||||
@@ -461,36 +263,23 @@ public enum LootManager {
|
|||||||
return inItem;
|
return inItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int TableRoll(int mobLevel) {
|
public static int TableRoll(int mobLevel, Boolean inHotzone) {
|
||||||
|
|
||||||
int rank = (int)(mobLevel * 0.1f);
|
if (mobLevel > 65)
|
||||||
int min = 50;
|
mobLevel = 65;
|
||||||
int max = 100;
|
|
||||||
switch(rank){
|
int max = (int) (4.882 * mobLevel + 127.0);
|
||||||
case 1:
|
|
||||||
min = 200;
|
if (max > 319)
|
||||||
max = 250;
|
max = 319;
|
||||||
break;
|
|
||||||
case 2:
|
int min = (int) (4.469 * mobLevel - 3.469);
|
||||||
min = 210;
|
|
||||||
max = 275;
|
if (min < 70)
|
||||||
break;
|
min = 70;
|
||||||
case 3:
|
|
||||||
min = 220;
|
if (inHotzone)
|
||||||
max = 300;
|
min += mobLevel;
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
min = 230;
|
|
||||||
max = 320;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
case 6:
|
|
||||||
case 7:
|
|
||||||
case 8:
|
|
||||||
min = 240;
|
|
||||||
max = 320;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
int roll = ThreadLocalRandom.current().nextInt(min, max + 1);
|
int roll = ThreadLocalRandom.current().nextInt(min, max + 1);
|
||||||
|
|
||||||
@@ -510,7 +299,12 @@ public enum LootManager {
|
|||||||
|
|
||||||
int high = bse.highGold;
|
int high = bse.highGold;
|
||||||
int low = bse.lowGold;
|
int low = bse.lowGold;
|
||||||
int gold = (int) (ThreadLocalRandom.current().nextInt(low, high + 1) * NORMAL_GOLD_RATE);
|
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);
|
||||||
@@ -521,61 +315,43 @@ public enum LootManager {
|
|||||||
|
|
||||||
public static void GenerateLootDrop(Mob mob, int tableID, Boolean inHotzone) {
|
public static void GenerateLootDrop(Mob mob, int tableID, Boolean inHotzone) {
|
||||||
|
|
||||||
MobLoot toAdd = getGenTableItem(tableID, mob, inHotzone);
|
try {
|
||||||
if(toAdd != null){
|
|
||||||
ItemBase ib = toAdd.getItemBase();
|
|
||||||
switch(ib.getType()){
|
|
||||||
case CONTRACT:
|
|
||||||
case RUNE:
|
|
||||||
case RESOURCE:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
toAdd.setIsID(true);
|
|
||||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
MobLoot toAdd = getGenTableItem(tableID, mob, inHotzone);
|
||||||
|
|
||||||
|
if (toAdd != null)
|
||||||
|
mob.getCharItemManager().addItemToInventory(toAdd);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
//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 == null || mob.getSafeZone())
|
|
||||||
return; // no equipment to drop in safezones
|
|
||||||
|
|
||||||
if(mob.StrongholdGuardian || mob.StrongholdCommander || mob.StrongholdEpic)
|
|
||||||
return; // stronghold mobs don't drop equipment
|
|
||||||
|
|
||||||
//do equipment here
|
//do equipment here
|
||||||
if (mob.getEquip() != null) {
|
int dropCount = 0;
|
||||||
boolean isVorg = false;
|
if (mob.getEquip() != null)
|
||||||
for (MobEquipment me : mob.getEquip().values()) {
|
for (MobEquipment me : mob.getEquip().values()) {
|
||||||
|
|
||||||
if (me.getDropChance() == 0)
|
if (me.getDropChance() == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
String name = me.getItemBase().getName().toLowerCase();
|
|
||||||
if (name.contains("vorgrim legionnaire's") || name.contains("vorgrim auxiliary's") ||name.contains("bellugh nuathal") || name.contains("crimson circle"))
|
|
||||||
isVorg = true;
|
|
||||||
|
|
||||||
if(isVorg && !mob.isDropper){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
||||||
ItemBase itemBase = me.getItemBase();
|
|
||||||
if(isVorg) {
|
|
||||||
mob.spawnTime = ThreadLocalRandom.current().nextInt(300, 2700);
|
|
||||||
dropChance = 10;
|
|
||||||
itemBase = getRandomVorg(itemBase);
|
|
||||||
}
|
|
||||||
if (equipmentRoll > dropChance)
|
if (equipmentRoll > dropChance)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
MobLoot ml = new MobLoot(mob, itemBase, 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;
|
||||||
|
//break; // Exit on first successful roll.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -591,11 +367,8 @@ public enum LootManager {
|
|||||||
|
|
||||||
MobLoot lootItem = new MobLoot(mob, ItemBase.getItemBase(bse.itemBase), true);
|
MobLoot lootItem = new MobLoot(mob, ItemBase.getItemBase(bse.itemBase), true);
|
||||||
|
|
||||||
if (lootItem != null) {
|
if (lootItem != null)
|
||||||
mob.getCharItemManager().addItemToInventory(lootItem);
|
mob.getCharItemManager().addItemToInventory(lootItem);
|
||||||
if(lootItem.getItemBase().isDiscRune() && !Mob.discDroppers.contains(mob))
|
|
||||||
Mob.AddDiscDropper(mob);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void peddleFate(PlayerCharacter playerCharacter, Item gift) {
|
public static void peddleFate(PlayerCharacter playerCharacter, Item gift) {
|
||||||
@@ -619,12 +392,12 @@ public enum LootManager {
|
|||||||
|
|
||||||
//check if player owns the gift he is trying to open
|
//check if player owns the gift he is trying to open
|
||||||
|
|
||||||
if (!itemMan.doesCharOwnThisItem(gift.getObjectUUID()))
|
if (itemMan.doesCharOwnThisItem(gift.getObjectUUID()) == false)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//roll 1-100 for the gen table selection
|
//roll 1-100 for the gen table selection
|
||||||
|
|
||||||
int genRoll = ThreadLocalRandom.current().nextInt(94, 100) + 1;
|
int genRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
|
||||||
GenTableEntry selectedRow = GenTableEntry.rollTable(tableID, genRoll, LootManager.NORMAL_DROP_RATE);
|
GenTableEntry selectedRow = GenTableEntry.rollTable(tableID, genRoll, LootManager.NORMAL_DROP_RATE);
|
||||||
|
|
||||||
if(selectedRow == null)
|
if(selectedRow == null)
|
||||||
@@ -640,22 +413,12 @@ public enum LootManager {
|
|||||||
|
|
||||||
//create the item from the table, quantity is always 1
|
//create the item from the table, quantity is always 1
|
||||||
|
|
||||||
ItemBase ib = ItemBase.getItemBase(selectedItem.cacheID);
|
MobLoot winnings = new MobLoot(playerCharacter, ItemBase.getItemBase(selectedItem.cacheID), 1, false);
|
||||||
if(ib.getUUID() == Warehouse.coalIB.getUUID()){
|
|
||||||
//no more coal, give gold instead
|
|
||||||
if (itemMan.getGoldInventory().getNumOfItems() + 250000 > 10000000) {
|
|
||||||
ErrorPopupMsg.sendErrorPopup(playerCharacter, 21);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
itemMan.addGoldToInventory(250000,false);
|
|
||||||
itemMan.updateInventory();
|
|
||||||
}else {
|
|
||||||
MobLoot winnings = new MobLoot(playerCharacter, ib, 1, false);
|
|
||||||
|
|
||||||
if (winnings == null)
|
if (winnings == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//early exit if the inventory of the player will not hold the item
|
//early exit if the inventory of the player will not old the item
|
||||||
|
|
||||||
if (itemMan.hasRoomInventory(winnings.getItemBase().getWeight()) == false) {
|
if (itemMan.hasRoomInventory(winnings.getItemBase().getWeight()) == false) {
|
||||||
ErrorPopupMsg.sendErrorPopup(playerCharacter, 21);
|
ErrorPopupMsg.sendErrorPopup(playerCharacter, 21);
|
||||||
@@ -664,17 +427,17 @@ public enum LootManager {
|
|||||||
|
|
||||||
//determine if the winning item needs a prefix
|
//determine if the winning item needs a prefix
|
||||||
|
|
||||||
if (selectedRow.pModTable != 0) {
|
if(selectedRow.pModTable != 0){
|
||||||
int prefixRoll = ThreadLocalRandom.current().nextInt(220, 320 + 1);
|
int prefixRoll = ThreadLocalRandom.current().nextInt(220,320 + 1);
|
||||||
ModTableEntry prefix = ModTableEntry.rollTable(selectedRow.pModTable, prefixRoll);
|
ModTableEntry prefix = ModTableEntry.rollTable(selectedRow.pModTable, prefixRoll);
|
||||||
if (prefix != null)
|
if(prefix != null)
|
||||||
winnings.addPermanentEnchantment(prefix.action, 0, prefix.level, true);
|
winnings.addPermanentEnchantment(prefix.action, 0, prefix.level, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
//determine if the winning item needs a suffix
|
//determine if the winning item needs a suffix
|
||||||
|
|
||||||
if (selectedRow.sModTable != 0) {
|
if(selectedRow.sModTable != 0){
|
||||||
int suffixRoll = ThreadLocalRandom.current().nextInt(220, 320 + 1);
|
int suffixRoll = ThreadLocalRandom.current().nextInt(220,320 + 1);
|
||||||
ModTableEntry suffix = ModTableEntry.rollTable(selectedRow.sModTable, suffixRoll);
|
ModTableEntry suffix = ModTableEntry.rollTable(selectedRow.sModTable, suffixRoll);
|
||||||
if (suffix != null)
|
if (suffix != null)
|
||||||
winnings.addPermanentEnchantment(suffix.action, 0, suffix.level, true);
|
winnings.addPermanentEnchantment(suffix.action, 0, suffix.level, true);
|
||||||
@@ -691,225 +454,4 @@ public enum LootManager {
|
|||||||
itemMan.addItemToInventory(playerWinnings);
|
itemMan.addItemToInventory(playerWinnings);
|
||||||
itemMan.updateInventory();
|
itemMan.updateInventory();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public static int rollRandomItem(int itemTable){
|
|
||||||
int returnedID = ItemTableEntry.getRandomItem(itemTable);
|
|
||||||
return returnedID;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ItemBase getRandomVorg(ItemBase itemBase){
|
|
||||||
int roll = 0;
|
|
||||||
if(vorg_ha_uuids.contains(itemBase.getUUID())) {
|
|
||||||
roll = ThreadLocalRandom.current().nextInt(0, 10);
|
|
||||||
switch (roll) {
|
|
||||||
case 1:
|
|
||||||
return ItemBase.getItemBase(vorg_ha_uuids.get(0));
|
|
||||||
case 2:
|
|
||||||
return ItemBase.getItemBase(vorg_ha_uuids.get(1));
|
|
||||||
case 3:
|
|
||||||
return ItemBase.getItemBase(vorg_ha_uuids.get(2));
|
|
||||||
case 4:
|
|
||||||
return ItemBase.getItemBase(vorg_ha_uuids.get(3));
|
|
||||||
case 5:
|
|
||||||
return ItemBase.getItemBase(vorg_ha_uuids.get(4));
|
|
||||||
case 6:
|
|
||||||
return ItemBase.getItemBase(vorg_ha_uuids.get(5));
|
|
||||||
case 7:
|
|
||||||
return ItemBase.getItemBase(vorg_ha_uuids.get(6));
|
|
||||||
case 8:
|
|
||||||
return ItemBase.getItemBase(vorg_ha_uuids.get(7));
|
|
||||||
default:
|
|
||||||
return ItemBase.getItemBase(vorg_ha_uuids.get(8));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(vorg_ma_uuids.contains(itemBase.getUUID())) {
|
|
||||||
roll = ThreadLocalRandom.current().nextInt(0, 10);
|
|
||||||
switch (roll) {
|
|
||||||
case 1:
|
|
||||||
return ItemBase.getItemBase(vorg_ma_uuids.get(0));
|
|
||||||
case 2:
|
|
||||||
return ItemBase.getItemBase(vorg_ma_uuids.get(1));
|
|
||||||
case 3:
|
|
||||||
return ItemBase.getItemBase(vorg_ma_uuids.get(2));
|
|
||||||
case 4:
|
|
||||||
return ItemBase.getItemBase(vorg_ma_uuids.get(3));
|
|
||||||
case 5:
|
|
||||||
return ItemBase.getItemBase(vorg_ma_uuids.get(4));
|
|
||||||
case 6:
|
|
||||||
return ItemBase.getItemBase(vorg_ma_uuids.get(5));
|
|
||||||
case 7:
|
|
||||||
return ItemBase.getItemBase(vorg_ma_uuids.get(6));
|
|
||||||
default:
|
|
||||||
return ItemBase.getItemBase(vorg_ma_uuids.get(7));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(vorg_la_uuids.contains(itemBase.getUUID())) {
|
|
||||||
roll = ThreadLocalRandom.current().nextInt(0, 10);
|
|
||||||
switch (roll) {
|
|
||||||
case 1:
|
|
||||||
return ItemBase.getItemBase(vorg_la_uuids.get(0));
|
|
||||||
case 2:
|
|
||||||
return ItemBase.getItemBase(vorg_la_uuids.get(1));
|
|
||||||
case 3:
|
|
||||||
return ItemBase.getItemBase(vorg_la_uuids.get(2));
|
|
||||||
case 4:
|
|
||||||
return ItemBase.getItemBase(vorg_la_uuids.get(3));
|
|
||||||
case 5:
|
|
||||||
return ItemBase.getItemBase(vorg_la_uuids.get(4));
|
|
||||||
case 6:
|
|
||||||
return ItemBase.getItemBase(vorg_la_uuids.get(5));
|
|
||||||
case 7:
|
|
||||||
return ItemBase.getItemBase(vorg_la_uuids.get(6));
|
|
||||||
default:
|
|
||||||
return ItemBase.getItemBase(vorg_la_uuids.get(7));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(vorg_cloth_uuids.contains(itemBase.getUUID())) {
|
|
||||||
roll = ThreadLocalRandom.current().nextInt(0, 10);
|
|
||||||
switch (roll) {
|
|
||||||
case 1:
|
|
||||||
return ItemBase.getItemBase(vorg_cloth_uuids.get(0));
|
|
||||||
case 2:
|
|
||||||
return ItemBase.getItemBase(vorg_cloth_uuids.get(1));
|
|
||||||
case 3:
|
|
||||||
return ItemBase.getItemBase(vorg_cloth_uuids.get(2));
|
|
||||||
case 4:
|
|
||||||
return ItemBase.getItemBase(vorg_cloth_uuids.get(3));
|
|
||||||
default:
|
|
||||||
return ItemBase.getItemBase(vorg_cloth_uuids.get(4));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void DropPresent(Mob mob){
|
|
||||||
int random = 971049 + ThreadLocalRandom.current().nextInt(24);
|
|
||||||
if (random > 971071)
|
|
||||||
random = 971071;
|
|
||||||
|
|
||||||
ItemBase present = ItemBase.getItemBase(random);
|
|
||||||
if (present != null) {
|
|
||||||
MobLoot toAdd = new MobLoot(mob, present, true);
|
|
||||||
|
|
||||||
if (toAdd != null)
|
|
||||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void GenerateStrongholdLoot(Mob mob, boolean commander, boolean epic) {
|
|
||||||
|
|
||||||
mob.getCharItemManager().clearInventory();
|
|
||||||
|
|
||||||
int multiplier = 1;
|
|
||||||
if (commander)
|
|
||||||
multiplier = 2;
|
|
||||||
if(epic)
|
|
||||||
multiplier = 10;
|
|
||||||
|
|
||||||
int high = 125000;
|
|
||||||
int low = 50000;
|
|
||||||
int gold = ThreadLocalRandom.current().nextInt(low, high + 1) * multiplier;
|
|
||||||
|
|
||||||
if (gold > 0) {
|
|
||||||
MobLoot goldAmount = new MobLoot(mob, gold);
|
|
||||||
mob.getCharItemManager().addItemToInventory(goldAmount);
|
|
||||||
}
|
|
||||||
|
|
||||||
//present drop chance for all
|
|
||||||
if (ThreadLocalRandom.current().nextInt(100) < 35)
|
|
||||||
DropPresent(mob);
|
|
||||||
|
|
||||||
//random contract drop chance for all
|
|
||||||
if (ThreadLocalRandom.current().nextInt(100) < 40) {
|
|
||||||
int contractTableID = 250;
|
|
||||||
contractTableID += ThreadLocalRandom.current().nextInt(0, 11);
|
|
||||||
if (contractTableID > 259)
|
|
||||||
contractTableID = 659;
|
|
||||||
|
|
||||||
int id = rollRandomItem(contractTableID);
|
|
||||||
ItemBase ib = ItemBase.getItemBase(id);
|
|
||||||
if (ib != null) {
|
|
||||||
MobLoot contract = new MobLoot(mob, ib, true);
|
|
||||||
|
|
||||||
if (contract != null)
|
|
||||||
mob.getCharItemManager().addItemToInventory(contract);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//special commander drop chances
|
|
||||||
if (commander)
|
|
||||||
GenerateCommanderLoot(mob,false);
|
|
||||||
|
|
||||||
//special epic drop chances
|
|
||||||
if (epic) {
|
|
||||||
GenerateCommanderLoot(mob, true);
|
|
||||||
GenerateCommanderLoot(mob,false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void GenerateCommanderLoot(Mob mob, boolean epic){
|
|
||||||
//present chance
|
|
||||||
if (ThreadLocalRandom.current().nextInt(100) < 25)
|
|
||||||
DropPresent(mob);
|
|
||||||
|
|
||||||
//present chance
|
|
||||||
if (ThreadLocalRandom.current().nextInt(100) < 25)
|
|
||||||
DropPresent(mob);
|
|
||||||
|
|
||||||
//chance for glass
|
|
||||||
if (ThreadLocalRandom.current().nextInt(100) < 75) {
|
|
||||||
int glassID = rollRandomItem(126);
|
|
||||||
ItemBase glassItem = ItemBase.getItemBase(glassID);
|
|
||||||
if (glassItem != null) {
|
|
||||||
MobLoot toAdd2 = new MobLoot(mob, glassItem, true);
|
|
||||||
|
|
||||||
if (toAdd2 != null)
|
|
||||||
mob.getCharItemManager().addItemToInventory(toAdd2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//chance for disc
|
|
||||||
if (ThreadLocalRandom.current().nextInt(100) < 75) {
|
|
||||||
int discID = rollRandomItem(3202);
|
|
||||||
ItemBase discItem = ItemBase.getItemBase(discID);
|
|
||||||
if (discItem != null) {
|
|
||||||
MobLoot toAdd3 = new MobLoot(mob, discItem, true);
|
|
||||||
|
|
||||||
if (toAdd3 != null)
|
|
||||||
mob.getCharItemManager().addItemToInventory(toAdd3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//chance for stat rune
|
|
||||||
if (ThreadLocalRandom.current().nextInt(100) < 75) {
|
|
||||||
int runeID = rollRandomItem(3201);
|
|
||||||
ItemBase runeItem = ItemBase.getItemBase(runeID);
|
|
||||||
if (runeItem != null) {
|
|
||||||
MobLoot toAdd4 = new MobLoot(mob, runeItem, true);
|
|
||||||
|
|
||||||
if (toAdd4 != null)
|
|
||||||
mob.getCharItemManager().addItemToInventory(toAdd4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(epic){
|
|
||||||
int contractTableID = 250;
|
|
||||||
contractTableID += ThreadLocalRandom.current().nextInt(0, 11);
|
|
||||||
if (contractTableID > 259)
|
|
||||||
contractTableID = 659;
|
|
||||||
|
|
||||||
int id = rollRandomItem(contractTableID);
|
|
||||||
ItemBase ib = ItemBase.getItemBase(id);
|
|
||||||
if (ib != null) {
|
|
||||||
MobLoot contract = new MobLoot(mob, ib, true);
|
|
||||||
|
|
||||||
if (contract != null)
|
|
||||||
mob.getCharItemManager().addItemToInventory(contract);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ public enum MaintenanceManager {
|
|||||||
|
|
||||||
public static void setMaintDateTime(Building building, LocalDateTime maintDate) {
|
public static void setMaintDateTime(Building building, LocalDateTime maintDate) {
|
||||||
|
|
||||||
building.maintDateTime = maintDate.withHour(1).withMinute(0).withSecond(0);
|
building.maintDateTime = maintDate;
|
||||||
DbManager.BuildingQueries.updateMaintDate(building);
|
DbManager.BuildingQueries.updateMaintDate(building);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -49,15 +49,19 @@ public enum MaintenanceManager {
|
|||||||
|
|
||||||
if (chargeUpkeep(building) == false)
|
if (chargeUpkeep(building) == false)
|
||||||
derankList.add(building);
|
derankList.add(building);
|
||||||
else
|
|
||||||
setMaintDateTime(building, LocalDateTime.now().plusDays(7));
|
|
||||||
}
|
}
|
||||||
|
// Reset maintenance dates for these buildings
|
||||||
|
|
||||||
|
for (Building building : maintList) {
|
||||||
|
setMaintDateTime(building, LocalDateTime.now().plusDays(7));
|
||||||
|
|
||||||
for (Building building : derankList) {
|
|
||||||
building.destroyOrDerank(null);
|
|
||||||
if(building.getRank() > 0)
|
|
||||||
setMaintDateTime(building, LocalDateTime.now().plusDays(1));
|
|
||||||
}
|
}
|
||||||
|
// 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());
|
Logger.info("Structures: " + buildingList.size() + " Maint: " + maintList.size() + " Derank: " + derankList.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,10 +98,6 @@ public enum MaintenanceManager {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
//only ToL pays maintenance
|
|
||||||
if(building.getBlueprint().getBuildingGroup() != null && !building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.TOL))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// No maintenance on banestones omfg
|
// No maintenance on banestones omfg
|
||||||
|
|
||||||
if (building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.BANESTONE))
|
if (building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.BANESTONE))
|
||||||
@@ -122,9 +122,9 @@ public enum MaintenanceManager {
|
|||||||
|
|
||||||
|
|
||||||
//no maintenance if day of week doesnt match
|
//no maintenance if day of week doesnt match
|
||||||
//if (LocalDateTime.now().getDayOfWeek().ordinal() != building.maintDateTime.getDayOfWeek().ordinal()) {
|
if (LocalDateTime.now().getDayOfWeek().ordinal() != building.maintDateTime.getDayOfWeek().ordinal()) {
|
||||||
// continue;
|
continue;
|
||||||
//}
|
}
|
||||||
// Add building to maintenance queue
|
// Add building to maintenance queue
|
||||||
|
|
||||||
maintList.add(building);
|
maintList.add(building);
|
||||||
@@ -186,8 +186,49 @@ public enum MaintenanceManager {
|
|||||||
// If this is an R8 tree, validate that we can
|
// If this is an R8 tree, validate that we can
|
||||||
// cover the resources required
|
// 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)));
|
||||||
|
}
|
||||||
|
|
||||||
if (hasFunds == false) {
|
|
||||||
return false; // Early exit for having failed to meet maintenance
|
return false; // Early exit for having failed to meet maintenance
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -212,6 +253,58 @@ public enum MaintenanceManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ 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(false);
|
((PlayerCharacter) toMove).update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -96,7 +96,7 @@ public enum MovementManager {
|
|||||||
if (!toMove.isMoving())
|
if (!toMove.isMoving())
|
||||||
toMove.resetLastSetLocUpdate();
|
toMove.resetLastSetLocUpdate();
|
||||||
else
|
else
|
||||||
toMove.update(false);
|
toMove.update();
|
||||||
|
|
||||||
// Update movement for the player
|
// Update movement for the player
|
||||||
|
|
||||||
@@ -351,7 +351,7 @@ public enum MovementManager {
|
|||||||
ChatManager.chatSystemInfo((PlayerCharacter) ac, "Finished Alt change, setting the end location to " + ac.getEndLoc().getX() + ' ' + ac.getEndLoc().getZ() + " moving=" + ac.isMoving() + " and current location is " + curLoc.getX() + ' ' + curLoc.getZ());
|
ChatManager.chatSystemInfo((PlayerCharacter) ac, "Finished Alt change, setting the end location to " + ac.getEndLoc().getX() + ' ' + ac.getEndLoc().getZ() + " moving=" + ac.isMoving() + " and current location is " + curLoc.getX() + ' ' + curLoc.getZ());
|
||||||
|
|
||||||
//Send run/walk/sit/stand to tell the client we are flying / landing etc
|
//Send run/walk/sit/stand to tell the client we are flying / landing etc
|
||||||
ac.update(false);
|
ac.update();
|
||||||
ac.stopMovement(ac.getLoc());
|
ac.stopMovement(ac.getLoc());
|
||||||
if (ac.isAlive())
|
if (ac.isAlive())
|
||||||
MovementManager.sendRWSSMsg(ac);
|
MovementManager.sendRWSSMsg(ac);
|
||||||
@@ -408,7 +408,7 @@ public enum MovementManager {
|
|||||||
if (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotMove, SourceType.None))
|
if (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotMove, SourceType.None))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
member.update(false);
|
member.update();
|
||||||
|
|
||||||
|
|
||||||
// All checks passed, let's move the player
|
// All checks passed, let's move the player
|
||||||
|
|||||||
@@ -23,14 +23,6 @@ public enum NPCManager {
|
|||||||
NPC_MANAGER;
|
NPC_MANAGER;
|
||||||
public static HashMap<Integer, ArrayList<Integer>> _runeSetMap = new HashMap<>();
|
public static HashMap<Integer, ArrayList<Integer>> _runeSetMap = new HashMap<>();
|
||||||
|
|
||||||
public static void LoadAllRuneSets() {
|
|
||||||
_runeSetMap = DbManager.ItemBaseQueries.LOAD_RUNES_FOR_NPC_AND_MOBS();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void LoadAllBootySets() {
|
|
||||||
LootManager._bootySetMap = DbManager.LootQueries.LOAD_BOOTY_TABLES();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void applyRuneSetEffects(Mob mob) {
|
public static void applyRuneSetEffects(Mob mob) {
|
||||||
|
|
||||||
// Early exit
|
// Early exit
|
||||||
@@ -127,10 +119,12 @@ public enum NPCManager {
|
|||||||
|
|
||||||
DbManager.removeFromCache(necroPet);
|
DbManager.removeFromCache(necroPet);
|
||||||
|
|
||||||
PlayerCharacter petOwner = necroPet.getOwner();
|
|
||||||
|
PlayerCharacter petOwner = (PlayerCharacter) necroPet.guardCaptain;
|
||||||
|
|
||||||
if (petOwner != null) {
|
if (petOwner != null) {
|
||||||
necroPet.setOwner(null);
|
|
||||||
|
necroPet.guardCaptain = null;
|
||||||
petOwner.setPet(null);
|
petOwner.setPet(null);
|
||||||
|
|
||||||
if (updateOwner == false)
|
if (updateOwner == false)
|
||||||
@@ -228,12 +222,14 @@ public enum NPCManager {
|
|||||||
WorldGrid.removeObject(toRemove);
|
WorldGrid.removeObject(toRemove);
|
||||||
DbManager.removeFromCache(toRemove);
|
DbManager.removeFromCache(toRemove);
|
||||||
|
|
||||||
PlayerCharacter petOwner = toRemove.getOwner();
|
|
||||||
|
PlayerCharacter petOwner = (PlayerCharacter) toRemove.guardCaptain;
|
||||||
|
|
||||||
if (petOwner != null) {
|
if (petOwner != null) {
|
||||||
|
|
||||||
petOwner.setPet(null);
|
petOwner.setPet(null);
|
||||||
toRemove.setOwner(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(petOwner, petMsg);
|
||||||
@@ -340,9 +336,18 @@ public enum NPCManager {
|
|||||||
else
|
else
|
||||||
buildingSlot = BuildingManager.getAvailableSlot(abstractCharacter.building);
|
buildingSlot = BuildingManager.getAvailableSlot(abstractCharacter.building);
|
||||||
|
|
||||||
//if (buildingSlot == -1)
|
// Override slot for siege engines
|
||||||
//Logger.error("No available slot for NPC: " + abstractCharacter.getObjectUUID());
|
|
||||||
|
|
||||||
|
if (abstractCharacter.getObjectType().equals(Enum.GameObjectType.Mob) && ((Mob) abstractCharacter).behaviourType.equals(Enum.MobBehaviourType.SiegeEngine)) {
|
||||||
|
Mob siegeMobile = (Mob) abstractCharacter;
|
||||||
|
buildingSlot = siegeMobile.guardCaptain.siegeMinionMap.size() + 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buildingSlot == -1)
|
||||||
|
Logger.error("No available slot for NPC: " + abstractCharacter.getObjectUUID());
|
||||||
|
|
||||||
|
// Pets are regular mobiles not hirelings (Siege engines)
|
||||||
|
if (abstractCharacter.contract != null)
|
||||||
abstractCharacter.building.getHirelings().put(abstractCharacter, buildingSlot);
|
abstractCharacter.building.getHirelings().put(abstractCharacter, buildingSlot);
|
||||||
|
|
||||||
// Override bind and location for this npc derived
|
// Override bind and location for this npc derived
|
||||||
@@ -370,4 +375,53 @@ public enum NPCManager {
|
|||||||
|
|
||||||
return buildingSlot;
|
return buildingSlot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int getMaxMinions(Mob guardCaptain) {
|
||||||
|
|
||||||
|
int maxSlots;
|
||||||
|
|
||||||
|
switch (guardCaptain.getRank()) {
|
||||||
|
case 3:
|
||||||
|
maxSlots = 2;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
case 5:
|
||||||
|
maxSlots = 3;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
maxSlots = 4;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
maxSlots = 5;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
default:
|
||||||
|
maxSlots = 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
return maxSlots;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void AssignPatrolPoints(Mob mob) {
|
||||||
|
mob.patrolPoints = new ArrayList<>();
|
||||||
|
|
||||||
|
for (int i = 0; i < 5; ++i) {
|
||||||
|
float patrolRadius = mob.getSpawnRadius();
|
||||||
|
|
||||||
|
if (patrolRadius > 256)
|
||||||
|
patrolRadius = 256;
|
||||||
|
|
||||||
|
if (patrolRadius < 60)
|
||||||
|
patrolRadius = 60;
|
||||||
|
|
||||||
|
Vector3fImmutable newPatrolPoint = Vector3fImmutable.getRandomPointInCircle(mob.getBindLoc(), patrolRadius);
|
||||||
|
mob.patrolPoints.add(newPatrolPoint);
|
||||||
|
|
||||||
|
if (i == 1) {
|
||||||
|
mob.loc = newPatrolPoint;
|
||||||
|
mob.endLoc = newPatrolPoint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -163,14 +163,6 @@ public enum PowersManager {
|
|||||||
public static void usePower(final PerformActionMsg msg, ClientConnection origin,
|
public static void usePower(final PerformActionMsg msg, ClientConnection origin,
|
||||||
boolean sendCastToSelf) {
|
boolean sendCastToSelf) {
|
||||||
|
|
||||||
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
|
|
||||||
|
|
||||||
if(!pc.isFlying()) //cant be sitting if flying
|
|
||||||
CombatManager.toggleSit(false,origin);
|
|
||||||
|
|
||||||
if(pc.isMoving())
|
|
||||||
pc.stopMovement(pc.getMovementLoc());
|
|
||||||
|
|
||||||
if (usePowerA(msg, origin, sendCastToSelf)) {
|
if (usePowerA(msg, origin, sendCastToSelf)) {
|
||||||
// Cast failed for some reason, reset timer
|
// Cast failed for some reason, reset timer
|
||||||
|
|
||||||
@@ -179,10 +171,13 @@ public enum PowersManager {
|
|||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
||||||
|
|
||||||
// Send Fail to cast message
|
// Send Fail to cast message
|
||||||
|
PlayerCharacter pc = SessionManager
|
||||||
|
.getPlayerCharacter(origin);
|
||||||
|
|
||||||
if (pc != null) {
|
if (pc != null) {
|
||||||
sendPowerMsg(pc, 2, msg);
|
sendPowerMsg(pc, 2, msg);
|
||||||
if (pc.isCasting()) {
|
if (pc.isCasting()) {
|
||||||
pc.update(false);
|
pc.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
pc.setIsCasting(false);
|
pc.setIsCasting(false);
|
||||||
@@ -210,41 +205,6 @@ public enum PowersManager {
|
|||||||
|
|
||||||
boolean CSRCast = false;
|
boolean CSRCast = false;
|
||||||
|
|
||||||
if(msg.getPowerUsedID() == 430628895) {
|
|
||||||
|
|
||||||
boolean failed = false;// group teleport
|
|
||||||
City city = ZoneManager.getCityAtLocation(playerCharacter.loc);
|
|
||||||
if (city == null) {
|
|
||||||
failed = true;
|
|
||||||
}else{
|
|
||||||
Bane bane = city.getBane();
|
|
||||||
if (bane == null) {
|
|
||||||
failed = true;
|
|
||||||
}else{
|
|
||||||
if(!bane.getSiegePhase().equals(SiegePhase.WAR)){
|
|
||||||
failed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(failed){
|
|
||||||
//check to see if we are at an active mine
|
|
||||||
Zone zone = ZoneManager.findSmallestZone(playerCharacter.loc);
|
|
||||||
if(zone != null){
|
|
||||||
Mine mine = null;
|
|
||||||
for(Building building : zone.zoneBuildingSet){
|
|
||||||
if(building.getBlueprint().getBuildingGroup().equals(BuildingGroup.MINE)){
|
|
||||||
mine = Mine.getMineFromTower(building.getObjectUUID());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(mine != null){
|
|
||||||
failed = !mine.isActive;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(failed)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (MBServerStatics.POWERS_DEBUG) {
|
if (MBServerStatics.POWERS_DEBUG) {
|
||||||
ChatManager.chatSayInfo(
|
ChatManager.chatSayInfo(
|
||||||
@@ -281,7 +241,6 @@ public enum PowersManager {
|
|||||||
|
|
||||||
// get power
|
// get power
|
||||||
PowersBase pb = PowersManager.powersBaseByToken.get(msg.getPowerUsedID());
|
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.");
|
||||||
@@ -293,35 +252,6 @@ public enum PowersManager {
|
|||||||
// return false;
|
// return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//check for movement buffs while flying
|
|
||||||
if(playerCharacter.isFlying()) {
|
|
||||||
switch(pb.token){
|
|
||||||
case 429005674:
|
|
||||||
case 429505739:
|
|
||||||
case 431054700:
|
|
||||||
case 428005600:
|
|
||||||
case 431610080:
|
|
||||||
case 427935608:
|
|
||||||
case 427857146:
|
|
||||||
case 427988218:
|
|
||||||
case 431854842:
|
|
||||||
case 421074170:
|
|
||||||
case 429611355:
|
|
||||||
case 428955899:
|
|
||||||
case 1794395699:
|
|
||||||
case 429428796:
|
|
||||||
case 1514898036:
|
|
||||||
ChatManager.chatSystemInfo(playerCharacter, "You Cannot Fly While Having A MovementBuff");
|
|
||||||
//resync stamina
|
|
||||||
playerCharacter.setStamina(playerCharacter.getStamina(), playerCharacter);
|
|
||||||
|
|
||||||
// Update all surrounding clients.
|
|
||||||
TargetedActionMsg cmm = new TargetedActionMsg(playerCharacter);
|
|
||||||
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, cmm, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (playerCharacter.getLastPower() != null)
|
if (playerCharacter.getLastPower() != null)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
@@ -349,12 +279,6 @@ public enum PowersManager {
|
|||||||
msg.setNumTrains(trains);
|
msg.setNumTrains(trains);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(pb.token){
|
|
||||||
case 429420458: // BH eyes
|
|
||||||
msg.setNumTrains(msg.getNumTrains() * 2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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());
|
||||||
@@ -446,20 +370,15 @@ public enum PowersManager {
|
|||||||
float range = pb.getRange();
|
float range = pb.getRange();
|
||||||
// verify target is in range
|
// verify target is in range
|
||||||
|
|
||||||
if(pb.token != 429396028) {
|
|
||||||
|
|
||||||
if (verifyInvalidRange(playerCharacter, target, range))
|
if (verifyInvalidRange(playerCharacter, target, range))
|
||||||
// (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;
|
||||||
}else{
|
|
||||||
pb.isSpell = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (AbstractWorldObject.IsAbstractCharacter(target))
|
if (AbstractWorldObject.IsAbstractCharacter(target))
|
||||||
@@ -568,6 +487,7 @@ public enum PowersManager {
|
|||||||
// Validity checks passed, move on to casting spell
|
// Validity checks passed, move on to casting spell
|
||||||
//get caster's live counter
|
//get caster's live counter
|
||||||
int casterLiveCounter = playerCharacter.getLiveCounter();
|
int casterLiveCounter = playerCharacter.getLiveCounter();
|
||||||
|
|
||||||
// run recycle job for when cast is available again, don't bother adding the timer for CSRs
|
// run recycle job for when cast is available again, don't bother adding the timer for CSRs
|
||||||
if (time > 0) {
|
if (time > 0) {
|
||||||
FinishRecycleTimeJob frtj = new FinishRecycleTimeJob(playerCharacter, msg);
|
FinishRecycleTimeJob frtj = new FinishRecycleTimeJob(playerCharacter, msg);
|
||||||
@@ -594,7 +514,7 @@ public enum PowersManager {
|
|||||||
|
|
||||||
// make person casting stand up if spell (unless they're casting a chant which does not make them stand up)
|
// make person casting stand up if spell (unless they're casting a chant which does not make them stand up)
|
||||||
if (pb.isSpell() && !pb.isChant() && playerCharacter.isSit()) {
|
if (pb.isSpell() && !pb.isChant() && playerCharacter.isSit()) {
|
||||||
playerCharacter.update(false);
|
playerCharacter.update();
|
||||||
playerCharacter.setSit(false);
|
playerCharacter.setSit(false);
|
||||||
UpdateStateMsg updateStateMsg = new UpdateStateMsg(playerCharacter);
|
UpdateStateMsg updateStateMsg = new UpdateStateMsg(playerCharacter);
|
||||||
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, updateStateMsg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
|
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, updateStateMsg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
|
||||||
@@ -602,9 +522,7 @@ public enum PowersManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// update cast (use skill) fail condition
|
// update cast (use skill) fail condition
|
||||||
if(pb.token != 429396028) {
|
|
||||||
playerCharacter.cancelOnCast();
|
playerCharacter.cancelOnCast();
|
||||||
}
|
|
||||||
|
|
||||||
// update castSpell (use spell) fail condition if spell
|
// update castSpell (use spell) fail condition if spell
|
||||||
if (pb.isSpell())
|
if (pb.isSpell())
|
||||||
@@ -617,12 +535,13 @@ public enum PowersManager {
|
|||||||
|
|
||||||
|
|
||||||
if (time > 100) {
|
if (time > 100) {
|
||||||
playerCharacter.update(false);
|
playerCharacter.update();
|
||||||
playerCharacter.setIsCasting(true);
|
playerCharacter.setIsCasting(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
playerCharacter.setLastMovementState(playerCharacter.getMovementState());
|
playerCharacter.setLastMovementState(playerCharacter.getMovementState());
|
||||||
|
|
||||||
// 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);
|
||||||
@@ -787,16 +706,8 @@ public enum PowersManager {
|
|||||||
if (playerCharacter == null || msg == null)
|
if (playerCharacter == null || msg == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if((msg.getPowerUsedID() == 429495514 || msg.getPowerUsedID() == 429407306) && playerCharacter.getRace().getName().toLowerCase().contains("shade")){
|
|
||||||
//msg.setPowerUsedID(407015607);
|
|
||||||
applyPower(playerCharacter,playerCharacter,playerCharacter.loc,429397210,msg.getNumTrains(),false);
|
|
||||||
}
|
|
||||||
if(msg.getPowerUsedID() == 429494441) {//wildkins chase
|
|
||||||
playerCharacter.removeEffectBySource(EffectSourceType.Root,40,true);
|
|
||||||
playerCharacter.removeEffectBySource(EffectSourceType.Snare,40,true);
|
|
||||||
}
|
|
||||||
if (playerCharacter.isCasting()) {
|
if (playerCharacter.isCasting()) {
|
||||||
playerCharacter.update(false);
|
playerCharacter.update();
|
||||||
playerCharacter.updateStamRegen(-100);
|
playerCharacter.updateStamRegen(-100);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -898,7 +809,6 @@ public enum PowersManager {
|
|||||||
}
|
}
|
||||||
float range = pb.getRange() + speedRange;
|
float range = pb.getRange() + speedRange;
|
||||||
|
|
||||||
if(pb.token != 429396028) {
|
|
||||||
|
|
||||||
if (verifyInvalidRange(playerCharacter, mainTarget, range)) {
|
if (verifyInvalidRange(playerCharacter, mainTarget, range)) {
|
||||||
|
|
||||||
@@ -907,7 +817,7 @@ 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
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -929,8 +839,6 @@ public enum PowersManager {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
playerCharacter.setHateValue(pb.getHateValue(trains));
|
|
||||||
|
|
||||||
//Send Cast Message.
|
//Send Cast Message.
|
||||||
// PerformActionMsg castMsg = new PerformActionMsg(msg);
|
// PerformActionMsg castMsg = new PerformActionMsg(msg);
|
||||||
// castMsg.setNumTrains(9999);
|
// castMsg.setNumTrains(9999);
|
||||||
@@ -981,8 +889,6 @@ public enum PowersManager {
|
|||||||
//Power is aiding a target, handle aggro if combat target is a Mob.
|
//Power is aiding a target, handle aggro if combat target is a Mob.
|
||||||
if (!pb.isHarmful() && target.getObjectType() == GameObjectType.PlayerCharacter) {
|
if (!pb.isHarmful() && target.getObjectType() == GameObjectType.PlayerCharacter) {
|
||||||
PlayerCharacter pcTarget = (PlayerCharacter) target;
|
PlayerCharacter pcTarget = (PlayerCharacter) target;
|
||||||
if (!pb.isHarmful())
|
|
||||||
Mob.HandleAssistedAggro(playerCharacter, pcTarget);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// update target of used power timer
|
// update target of used power timer
|
||||||
@@ -1323,7 +1229,7 @@ public enum PowersManager {
|
|||||||
|
|
||||||
PlayerCharacter target = SessionManager
|
PlayerCharacter target = SessionManager
|
||||||
.getPlayerCharacterByLowerCaseName(msg.getTargetName());
|
.getPlayerCharacterByLowerCaseName(msg.getTargetName());
|
||||||
if (target == null || target.equals(pc)) {
|
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,
|
||||||
@@ -1427,16 +1333,6 @@ public enum PowersManager {
|
|||||||
else
|
else
|
||||||
duration = 45000; // Belgosh Summons, 45 seconds
|
duration = 45000; // Belgosh Summons, 45 seconds
|
||||||
|
|
||||||
boolean enemiesNear = false;
|
|
||||||
for(AbstractWorldObject awo : WorldGrid.getObjectsInRangePartial(pc.loc,MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER)){
|
|
||||||
PlayerCharacter playerCharacter = (PlayerCharacter)awo;
|
|
||||||
if(!playerCharacter.guild.getNation().equals(pc.guild.getNation())){
|
|
||||||
enemiesNear = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(enemiesNear && !pc.isInSafeZone())
|
|
||||||
duration += 60000;
|
|
||||||
|
|
||||||
// Teleport to summoners location
|
// Teleport to summoners location
|
||||||
FinishSummonsJob fsj = new FinishSummonsJob(source, pc);
|
FinishSummonsJob fsj = new FinishSummonsJob(source, pc);
|
||||||
@@ -1562,17 +1458,8 @@ public enum PowersManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// create list of characters
|
// create list of characters
|
||||||
HashSet<AbstractCharacter> trackChars;
|
HashSet<AbstractCharacter> trackChars = RangeBasedAwo.getTrackList(
|
||||||
switch(msg.getPowerToken()){
|
allTargets, playerCharacter, maxTargets);
|
||||||
case 431511776:
|
|
||||||
case 429578587:
|
|
||||||
case 429503360:
|
|
||||||
trackChars = getTrackList(playerCharacter);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
trackChars = RangeBasedAwo.getTrackList(allTargets, playerCharacter, maxTargets);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
TrackWindowMsg trackWindowMsg = new TrackWindowMsg(msg);
|
TrackWindowMsg trackWindowMsg = new TrackWindowMsg(msg);
|
||||||
|
|
||||||
@@ -1585,30 +1472,6 @@ public enum PowersManager {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HashSet<AbstractCharacter> getTrackList(PlayerCharacter tracker){
|
|
||||||
HashSet<AbstractCharacter> list = new HashSet<AbstractCharacter>();
|
|
||||||
HashSet<AbstractWorldObject> shortList = WorldGrid.getObjectsInRangePartial(tracker.loc,MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER);
|
|
||||||
HashSet<AbstractWorldObject> fullList = WorldGrid.getObjectsInRangePartial(tracker.loc,1408, MBServerStatics.MASK_PLAYER);
|
|
||||||
ArrayList<Guild> guildsPresent = new ArrayList<>();
|
|
||||||
for(AbstractWorldObject awo : shortList){
|
|
||||||
PlayerCharacter pc = (PlayerCharacter)awo;
|
|
||||||
if(!guildsPresent.contains(pc.guild.getNation())){
|
|
||||||
guildsPresent.add(pc.guild.getNation());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for(AbstractWorldObject awo : fullList){
|
|
||||||
if(awo.equals(tracker))
|
|
||||||
continue;
|
|
||||||
PlayerCharacter pc = (PlayerCharacter)awo;
|
|
||||||
if(!pc.isAlive())
|
|
||||||
continue;
|
|
||||||
if(guildsPresent.contains(pc.guild.getNation()))
|
|
||||||
list.add(pc);
|
|
||||||
}
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void sendRecyclePower(int token, ClientConnection origin) {
|
private static void sendRecyclePower(int token, ClientConnection origin) {
|
||||||
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(token);
|
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(token);
|
||||||
|
|
||||||
@@ -2322,7 +2185,7 @@ public enum PowersManager {
|
|||||||
|
|
||||||
// set player is not casting for regens
|
// set player is not casting for regens
|
||||||
if (pc.isCasting()) {
|
if (pc.isCasting()) {
|
||||||
pc.update(false);
|
pc.update();
|
||||||
}
|
}
|
||||||
pc.setIsCasting(false);
|
pc.setIsCasting(false);
|
||||||
|
|
||||||
@@ -2374,26 +2237,28 @@ public enum PowersManager {
|
|||||||
defense = 0f;
|
defense = 0f;
|
||||||
// Get hit chance
|
// Get hit chance
|
||||||
|
|
||||||
//if (pc.getDebug(16)) {
|
if (pc.getDebug(16)) {
|
||||||
// String smsg = "ATR: " + atr + ", Defense: " + defense;
|
String smsg = "ATR: " + atr + ", Defense: " + defense;
|
||||||
// ChatManager.chatSystemInfo(pc, smsg);
|
ChatManager.chatSystemInfo(pc, smsg);
|
||||||
//}
|
}
|
||||||
|
|
||||||
//int chance;
|
int chance;
|
||||||
|
|
||||||
//if (atr > defense || defense == 0)
|
if (atr > defense || defense == 0)
|
||||||
// chance = 94;
|
chance = 94;
|
||||||
//else {
|
else {
|
||||||
// float dif = atr / defense;
|
float dif = atr / defense;
|
||||||
// if (dif <= 0.8f)
|
if (dif <= 0.8f)
|
||||||
// chance = 4;
|
chance = 4;
|
||||||
// else
|
else
|
||||||
// chance = ((int) (450 * (dif - 0.8f)) + 4);
|
chance = ((int) (450 * (dif - 0.8f)) + 4);
|
||||||
//}
|
}
|
||||||
|
|
||||||
// calculate hit/miss
|
// calculate hit/miss
|
||||||
|
int roll = ThreadLocalRandom.current().nextInt(100);
|
||||||
|
|
||||||
if (CombatManager.LandHit((int)atr,(int)defense)) {
|
boolean disable = true;
|
||||||
|
if (roll < chance) {
|
||||||
// Hit, check if dodge kicked in
|
// Hit, check if dodge kicked in
|
||||||
if (awo instanceof AbstractCharacter) {
|
if (awo instanceof AbstractCharacter) {
|
||||||
AbstractCharacter tarAc = (AbstractCharacter) awo;
|
AbstractCharacter tarAc = (AbstractCharacter) awo;
|
||||||
@@ -2693,9 +2558,7 @@ public enum PowersManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void cancelOnStun(AbstractCharacter ac) {
|
public static void cancelOnStun(AbstractCharacter ac) {
|
||||||
if(ac.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
|
||||||
//PlayerCharacter.GroundPlayer((PlayerCharacter)ac);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static PowersBase getLastPower(AbstractCharacter ac) {
|
private static PowersBase getLastPower(AbstractCharacter ac) {
|
||||||
|
|||||||
@@ -10,7 +10,10 @@ package engine.gameManager;
|
|||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
import engine.objects.*;
|
import engine.objects.AbstractGameObject;
|
||||||
|
import engine.objects.City;
|
||||||
|
import engine.objects.PlayerCharacter;
|
||||||
|
import engine.objects.Runegate;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
@@ -30,7 +33,7 @@ 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 = 1000;
|
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);
|
||||||
@@ -113,18 +116,9 @@ public enum SimulationManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if ((_cityPulseTime != 0) && (System.currentTimeMillis() > _cityPulseTime)) {
|
if ((_cityPulseTime != 0)
|
||||||
try {
|
&& (System.currentTimeMillis() > _cityPulseTime))
|
||||||
pulseCities();
|
pulseCities();
|
||||||
}catch(Exception e){
|
|
||||||
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
ArenaManager.pulseArenas();
|
|
||||||
}catch(Exception e){
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.error(
|
Logger.error(
|
||||||
"Fatal error in City Pulse: DISABLED. Error Message : "
|
"Fatal error in City Pulse: DISABLED. Error Message : "
|
||||||
@@ -160,7 +154,7 @@ public enum SimulationManager {
|
|||||||
|
|
||||||
if (player == null)
|
if (player == null)
|
||||||
continue;
|
continue;
|
||||||
player.update(false);
|
player.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
_updatePulseTime = System.currentTimeMillis() + 500;
|
_updatePulseTime = System.currentTimeMillis() + 500;
|
||||||
@@ -209,12 +203,8 @@ public enum SimulationManager {
|
|||||||
city = (City) cityObject;
|
city = (City) cityObject;
|
||||||
city.onEnter();
|
city.onEnter();
|
||||||
}
|
}
|
||||||
for(Mine mine : Mine.getMines()){
|
|
||||||
if(mine != null && mine.isActive)
|
|
||||||
mine.onEnter();
|
|
||||||
}
|
|
||||||
_cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
|
|
||||||
|
|
||||||
|
_cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -224,10 +214,6 @@ public enum SimulationManager {
|
|||||||
private void pulseRunegates() {
|
private void pulseRunegates() {
|
||||||
|
|
||||||
for (Runegate runegate : Runegate._runegates.values()) {
|
for (Runegate runegate : Runegate._runegates.values()) {
|
||||||
for(Portal portal : runegate._portals)
|
|
||||||
if(!portal.isActive())
|
|
||||||
portal.activate(false);
|
|
||||||
|
|
||||||
runegate.collidePortals();
|
runegate.collidePortals();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,383 +0,0 @@
|
|||||||
package engine.gameManager;
|
|
||||||
|
|
||||||
import engine.Enum;
|
|
||||||
import engine.InterestManagement.InterestManager;
|
|
||||||
import engine.InterestManagement.WorldGrid;
|
|
||||||
import engine.math.Vector2f;
|
|
||||||
import engine.math.Vector3f;
|
|
||||||
import engine.math.Vector3fImmutable;
|
|
||||||
import engine.objects.*;
|
|
||||||
import engine.server.MBServerStatics;
|
|
||||||
import org.pmw.tinylog.Logger;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
|
||||||
|
|
||||||
public class StrongholdManager {
|
|
||||||
|
|
||||||
public static void processStrongholds() {
|
|
||||||
ArrayList<Mine> mines = Mine.getMines();
|
|
||||||
|
|
||||||
|
|
||||||
//process strongholds selecting 3 randomly to become active
|
|
||||||
int count = 0;
|
|
||||||
while (count < 3) {
|
|
||||||
int random = ThreadLocalRandom.current().nextInt(1, mines.size()) - 1;
|
|
||||||
Mine mine = mines.get(random);
|
|
||||||
if (mine != null) {
|
|
||||||
if (!mine.isActive && !mine.isStronghold) {
|
|
||||||
StartStronghold(mine);
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void StartStronghold(Mine mine){
|
|
||||||
|
|
||||||
//remove buildings
|
|
||||||
Building tower = BuildingManager.getBuilding(mine.getBuildingID());
|
|
||||||
if(tower == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
mine.isStronghold = true;
|
|
||||||
mine.strongholdMobs = new ArrayList<>();
|
|
||||||
mine.oldBuildings = new HashMap<>();
|
|
||||||
|
|
||||||
Zone mineZone = ZoneManager.findSmallestZone(tower.loc);
|
|
||||||
for(Building building : mineZone.zoneBuildingSet){
|
|
||||||
mine.oldBuildings.put(building.getObjectUUID(),building.meshUUID);
|
|
||||||
building.setMeshUUID(407650);
|
|
||||||
building.setMeshScale(new Vector3f(0,0,0));
|
|
||||||
InterestManager.setObjectDirty(building);
|
|
||||||
WorldGrid.updateObject(building);
|
|
||||||
}
|
|
||||||
|
|
||||||
//update tower to become stronghold mesh
|
|
||||||
tower.setMeshUUID(getStrongholdMeshID(mine.getParentZone()));
|
|
||||||
tower.setMeshScale(new Vector3f(1,1,1));
|
|
||||||
InterestManager.setObjectDirty(tower);
|
|
||||||
WorldGrid.updateObject(tower);
|
|
||||||
|
|
||||||
//create elite mobs
|
|
||||||
for(int i = 0; i < mine.capSize * 2; i++){
|
|
||||||
Vector3fImmutable loc = Vector3fImmutable.getRandomPointOnCircle(tower.loc,30);
|
|
||||||
MobBase guardBase = MobBase.getMobBase(getStrongholdGuardianID(tower.meshUUID));
|
|
||||||
Mob guard = Mob.createStrongholdMob(guardBase.getLoadID(), loc, Guild.getErrantGuild(),true,mineZone,null,0, guardBase.getFirstName(),65);
|
|
||||||
if(guard != null){
|
|
||||||
guard.parentZone = mine.getParentZone();
|
|
||||||
guard.bindLoc = loc;
|
|
||||||
guard.setLoc(loc);
|
|
||||||
guard.StrongholdGuardian = true;
|
|
||||||
guard.equipmentSetID = getStrongholdMobEquipSetID(guard);
|
|
||||||
guard.runAfterLoad();
|
|
||||||
guard.setLevel((short)65);
|
|
||||||
guard.setResists(new Resists("Elite"));
|
|
||||||
guard.spawnTime = 1000000000;
|
|
||||||
guard.BehaviourType = Enum.MobBehaviourType.Aggro;
|
|
||||||
mine.strongholdMobs.add(guard);
|
|
||||||
LootManager.GenerateStrongholdLoot(guard,false,false);
|
|
||||||
guard.healthMax = 12500;
|
|
||||||
guard.setHealth(guard.healthMax);
|
|
||||||
guard.maxDamageHandOne = 1550;
|
|
||||||
guard.minDamageHandOne = 750;
|
|
||||||
guard.atrHandOne = 1800;
|
|
||||||
guard.defenseRating = 2200;
|
|
||||||
guard.setFirstName("Elite Guardian");
|
|
||||||
InterestManager.setObjectDirty(guard);
|
|
||||||
WorldGrid.addObject(guard,loc.x,loc.z);
|
|
||||||
WorldGrid.updateObject(guard);
|
|
||||||
guard.stronghold = mine;
|
|
||||||
guard.mobPowers.clear();
|
|
||||||
guard.mobPowers.put(429399948,20); // find weakness
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//create stronghold commander
|
|
||||||
Vector3fImmutable loc = tower.loc;
|
|
||||||
MobBase commanderBase = MobBase.getMobBase(getStrongholdCommanderID(tower.meshUUID));
|
|
||||||
Mob commander = Mob.createStrongholdMob(commanderBase.getLoadID(), loc,Guild.getErrantGuild(),true,mineZone,null,0, commanderBase.getFirstName(),75);
|
|
||||||
if(commander != null){
|
|
||||||
commander.parentZone = mine.getParentZone();
|
|
||||||
commander.bindLoc = loc;
|
|
||||||
commander.setLoc(loc);
|
|
||||||
commander.StrongholdCommander = true;
|
|
||||||
commander.equipmentSetID = getStrongholdMobEquipSetID(commander);
|
|
||||||
commander.runAfterLoad();
|
|
||||||
commander.setLevel((short)75);
|
|
||||||
commander.setResists(new Resists("Elite"));
|
|
||||||
commander.spawnTime = 1000000000;
|
|
||||||
commander.BehaviourType = Enum.MobBehaviourType.Aggro;
|
|
||||||
commander.mobPowers.clear();
|
|
||||||
commander.mobPowers.put(429032838, 40); // gravechill
|
|
||||||
commander.mobPowers.put(429757701,20); // magebolt
|
|
||||||
commander.mobPowers.put(429121388,20); // blight
|
|
||||||
commander.mobPowers.put(431566891,20); // lightning bolt
|
|
||||||
commander.mobPowers.put(428716075,20); // fire bolt
|
|
||||||
commander.mobPowers.put(429010987,20); // ice bolt
|
|
||||||
mine.strongholdMobs.add(commander);
|
|
||||||
LootManager.GenerateStrongholdLoot(commander,true, false);
|
|
||||||
commander.healthMax = 50000;
|
|
||||||
commander.setHealth(commander.healthMax);
|
|
||||||
commander.maxDamageHandOne = 3500;
|
|
||||||
commander.minDamageHandOne = 1500;
|
|
||||||
commander.atrHandOne = 3500;
|
|
||||||
commander.defenseRating = 3500;
|
|
||||||
commander.setFirstName("Guardian Commander");
|
|
||||||
InterestManager.setObjectDirty(commander);
|
|
||||||
WorldGrid.addObject(commander,loc.x,loc.z);
|
|
||||||
WorldGrid.updateObject(commander);
|
|
||||||
commander.stronghold = mine;
|
|
||||||
}
|
|
||||||
|
|
||||||
mine.isActive = true;
|
|
||||||
tower.setProtectionState(Enum.ProtectionState.PROTECTED);
|
|
||||||
tower.getBounds().setRegions(tower);
|
|
||||||
InterestManager.setObjectDirty(tower);
|
|
||||||
WorldGrid.updateObject(tower);
|
|
||||||
ChatManager.chatSystemChannel(mine.getZoneName() + "'s Stronghold Has Begun!");
|
|
||||||
Logger.info(mine.getZoneName() + "'s Stronghold Has Begun!");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void EndStronghold(Mine mine){
|
|
||||||
|
|
||||||
//restore the buildings
|
|
||||||
Building tower = BuildingManager.getBuilding(mine.getBuildingID());
|
|
||||||
if(tower == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
mine.isStronghold = false;
|
|
||||||
|
|
||||||
//get rid of the mobs
|
|
||||||
for(Mob mob : mine.strongholdMobs) {
|
|
||||||
mob.despawn();
|
|
||||||
mob.removeFromCache();
|
|
||||||
DbManager.MobQueries.DELETE_MOB(mob);
|
|
||||||
}
|
|
||||||
|
|
||||||
//restore the buildings
|
|
||||||
Zone mineZone = ZoneManager.findSmallestZone(tower.loc);
|
|
||||||
for(Building building : mineZone.zoneBuildingSet){
|
|
||||||
if(mine.oldBuildings.containsKey(building.getObjectUUID())) {
|
|
||||||
building.setMeshUUID(mine.oldBuildings.get(building.getObjectUUID()));
|
|
||||||
building.setMeshScale(new Vector3f(1, 1, 1));
|
|
||||||
InterestManager.setObjectDirty(building);
|
|
||||||
WorldGrid.updateObject(building);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//update tower to become Mine Tower again
|
|
||||||
tower.setMeshUUID(1500100);
|
|
||||||
|
|
||||||
mine.isActive = false;
|
|
||||||
tower.setProtectionState(Enum.ProtectionState.NPC);
|
|
||||||
tower.getBounds().setRegions(tower);
|
|
||||||
InterestManager.setObjectDirty(tower);
|
|
||||||
WorldGrid.updateObject(tower);
|
|
||||||
ChatManager.chatSystemChannel(mine.getZoneName() + "'s Stronghold Has Concluded!");
|
|
||||||
Logger.info(mine.getZoneName() + "'s Stronghold Has Concluded!");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getStrongholdMeshID(Zone parent){
|
|
||||||
while(!parent.isMacroZone()){
|
|
||||||
parent = parent.getParent();
|
|
||||||
if(parent.getName().equalsIgnoreCase("seafloor")){
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch(parent.getObjectUUID()){
|
|
||||||
case 197:
|
|
||||||
case 234:
|
|
||||||
case 178:
|
|
||||||
case 122:
|
|
||||||
return 814000; //Frost Giant Hall (ICE)
|
|
||||||
case 968:
|
|
||||||
case 951:
|
|
||||||
case 313:
|
|
||||||
case 331:
|
|
||||||
return 5001500; // Lich Queens Keep (UNDEAD)
|
|
||||||
case 785:
|
|
||||||
case 761:
|
|
||||||
case 717:
|
|
||||||
case 737:
|
|
||||||
return 1306600; // Temple of the Dragon (DESERT)
|
|
||||||
case 353:
|
|
||||||
case 371:
|
|
||||||
case 388:
|
|
||||||
case 532:
|
|
||||||
return 564600; // Undead Lord's Keep (SWAMP)
|
|
||||||
case 550:
|
|
||||||
case 508:
|
|
||||||
case 475:
|
|
||||||
case 418:
|
|
||||||
return 1326600; // elven hall
|
|
||||||
case 437:
|
|
||||||
case 491:
|
|
||||||
case 590:
|
|
||||||
case 569:
|
|
||||||
return 602400;
|
|
||||||
case 824:
|
|
||||||
case 842:
|
|
||||||
case 632:
|
|
||||||
return 1600000; // chaos temple
|
|
||||||
}
|
|
||||||
return 456100; // small stockade
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getStrongholdGuardianID(int ID){
|
|
||||||
switch(ID){
|
|
||||||
case 814000:
|
|
||||||
return 253004; // Mountain Giant Raider Axe
|
|
||||||
case 5001500:
|
|
||||||
return 253008; // Vampire Spear Warrior
|
|
||||||
case 1306600:
|
|
||||||
return 253007; // Desert Orc Warrior
|
|
||||||
case 564600:
|
|
||||||
return 253010; // Kolthoss Warrior
|
|
||||||
case 1326600:
|
|
||||||
return 253005; //elven warrior
|
|
||||||
case 602400:
|
|
||||||
return 253009; // templar missionary
|
|
||||||
case 1600000:
|
|
||||||
return 253006; // scourger
|
|
||||||
}
|
|
||||||
return 13434; // human sword and board warrior
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getStrongholdEpicID(int ID){
|
|
||||||
switch(ID){
|
|
||||||
case 814000:
|
|
||||||
return 253023; // Mountain Giant Raider Axe
|
|
||||||
case 5001500:
|
|
||||||
return 253022; // Vampire Spear Warrior
|
|
||||||
case 1306600:
|
|
||||||
return 253021; // Desert Orc Warrior
|
|
||||||
case 564600:
|
|
||||||
return 253018; // Kolthoss Warrior
|
|
||||||
case 1326600:
|
|
||||||
return 253019; //elven warrior
|
|
||||||
case 602400:
|
|
||||||
return 253024; // templar missionary
|
|
||||||
case 1600000:
|
|
||||||
return 253020; // scourger
|
|
||||||
}
|
|
||||||
return 13434; // human sword and board warrior
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getStrongholdCommanderID(int ID){
|
|
||||||
switch(ID){
|
|
||||||
case 814000:
|
|
||||||
return 253017;
|
|
||||||
case 5001500:
|
|
||||||
return 253012;
|
|
||||||
case 1306600:
|
|
||||||
return 253016; // Desert Orc Xbow
|
|
||||||
case 564600:
|
|
||||||
return 253011; // xbow kolthoss
|
|
||||||
case 1326600:
|
|
||||||
return 253013; //elven bow warrior
|
|
||||||
case 602400:
|
|
||||||
return 253015; // dune giant with xbow
|
|
||||||
case 1600000:
|
|
||||||
return 253014; // barbator
|
|
||||||
}
|
|
||||||
return 13433;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getStrongholdMobEquipSetID(Mob mob) {
|
|
||||||
if(mob.StrongholdGuardian){
|
|
||||||
return 6327;
|
|
||||||
}else{
|
|
||||||
return 10790;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void CheckToEndStronghold(Mine mine) {
|
|
||||||
|
|
||||||
boolean stillAlive = false;
|
|
||||||
for (Mob mob : mine.strongholdMobs)
|
|
||||||
if (mob.isAlive())
|
|
||||||
stillAlive = true;
|
|
||||||
|
|
||||||
if (!stillAlive) {
|
|
||||||
// Epic encounter
|
|
||||||
|
|
||||||
Building tower = BuildingManager.getBuilding(mine.getBuildingID());
|
|
||||||
if (tower == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Zone mineZone = ZoneManager.findSmallestZone(tower.loc);
|
|
||||||
|
|
||||||
Vector3fImmutable loc = tower.loc;
|
|
||||||
MobBase commanderBase = MobBase.getMobBase(getStrongholdEpicID(tower.meshUUID));
|
|
||||||
Mob commander = Mob.createStrongholdMob(commanderBase.getLoadID(), loc, Guild.getErrantGuild(), true, mineZone, null, 0, commanderBase.getFirstName(), 75);
|
|
||||||
if (commander != null) {
|
|
||||||
commander.parentZone = mine.getParentZone();
|
|
||||||
commander.bindLoc = loc;
|
|
||||||
commander.setLoc(loc);
|
|
||||||
commander.StrongholdEpic = true;
|
|
||||||
commander.equipmentSetID = getStrongholdMobEquipSetID(commander);
|
|
||||||
commander.runAfterLoad();
|
|
||||||
commander.setLevel((short) 85);
|
|
||||||
commander.setResists(new Resists("Elite"));
|
|
||||||
commander.spawnTime = 1000000000;
|
|
||||||
commander.BehaviourType = Enum.MobBehaviourType.Aggro;
|
|
||||||
commander.mobPowers.clear();
|
|
||||||
commander.mobPowers.put(429032838, 40); // gravechill
|
|
||||||
commander.mobPowers.put(429757701,40); // magebolt
|
|
||||||
commander.mobPowers.put(429121388,40); // blight
|
|
||||||
commander.mobPowers.put(431566891,40); // lightning bolt
|
|
||||||
commander.mobPowers.put(428716075,40); // fire bolt
|
|
||||||
commander.mobPowers.put(429010987,40); // ice bolt
|
|
||||||
mine.strongholdMobs.add(commander);
|
|
||||||
LootManager.GenerateStrongholdLoot(commander, true, true);
|
|
||||||
commander.healthMax = 250000;
|
|
||||||
commander.setHealth(commander.healthMax);
|
|
||||||
commander.maxDamageHandOne = 5000;
|
|
||||||
commander.minDamageHandOne = 2500;
|
|
||||||
commander.atrHandOne = 5000;
|
|
||||||
commander.defenseRating = 3500;
|
|
||||||
commander.setFirstName("Defender of " + mine.getParentZone().getParent().getName());
|
|
||||||
InterestManager.setObjectDirty(commander);
|
|
||||||
WorldGrid.addObject(commander,loc.x,loc.z);
|
|
||||||
WorldGrid.updateObject(commander);
|
|
||||||
commander.stronghold = mine;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//=====================================NEW STUFF
|
|
||||||
|
|
||||||
public static void generateMaze(){
|
|
||||||
Zone stronghold = ZoneManager.getZoneByUUID(995);
|
|
||||||
ArrayList<Vector3fImmutable> gridLocs = new ArrayList<>();
|
|
||||||
for(int x = -7; x < 8; x++){
|
|
||||||
for(int z = -7; z < 8; z++) {
|
|
||||||
if((x >= -1 || x <= 1) && (z >= -1 || z <= 1))
|
|
||||||
continue;
|
|
||||||
float offsetX = x * 128;
|
|
||||||
float offsetZ = z * 128;
|
|
||||||
Vector3fImmutable sLoc = stronghold.getLoc();
|
|
||||||
Vector3fImmutable loc = new Vector3fImmutable(offsetX,sLoc.y,offsetZ);
|
|
||||||
gridLocs.add(loc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for(Vector3fImmutable loc : gridLocs){
|
|
||||||
createBuilding(stronghold,405600,loc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void createBuilding(Zone zone, int blueprint, Vector3fImmutable offset){
|
|
||||||
|
|
||||||
Vector3fImmutable localLoc = ZoneManager.worldToLocal(offset, zone);
|
|
||||||
|
|
||||||
Building building = DbManager.BuildingQueries.
|
|
||||||
CREATE_BUILDING(
|
|
||||||
zone.getObjectUUID(), 0, "", 1,
|
|
||||||
localLoc, 1.0f, 0, Enum.ProtectionState.PROTECTED, 0, 1,
|
|
||||||
null, blueprint, 0, 0);
|
|
||||||
building.setObjectTypeMask(MBServerStatics.MASK_BUILDING);
|
|
||||||
WorldGrid.addObject(building,zone.getLoc().x + offset.x,zone.getLoc().z + offset.z);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,195 +0,0 @@
|
|||||||
package engine.gameManager;
|
|
||||||
import engine.objects.Guild;
|
|
||||||
public class ZergManager {
|
|
||||||
|
|
||||||
public static float getCurrentMultiplier(int count, int maxCount){
|
|
||||||
switch(maxCount) {
|
|
||||||
case 3: return getMultiplier3Man(count);
|
|
||||||
case 5: return getMultiplier5Man(count);
|
|
||||||
case 10: return getMultiplier10Man(count);
|
|
||||||
case 20: return getMultiplier20Man(count);
|
|
||||||
case 30: return getMultiplier30Man(count);
|
|
||||||
case 40: return getMultiplier40Man(count);
|
|
||||||
default: return 1.0f; //unlimited
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static float getMultiplier3Man(int count) {
|
|
||||||
if(count < 4)
|
|
||||||
return 1.0f;
|
|
||||||
|
|
||||||
if(count > 6)
|
|
||||||
return 0.0f;
|
|
||||||
|
|
||||||
switch(count){
|
|
||||||
case 4: return 0.63f;
|
|
||||||
case 5: return 0.40f;
|
|
||||||
case 6: return 0.25f;
|
|
||||||
default: return 1.0f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static float getMultiplier5Man(int count) {
|
|
||||||
if(count < 6)
|
|
||||||
return 1.0f;
|
|
||||||
|
|
||||||
if(count > 10)
|
|
||||||
return 0.0f;
|
|
||||||
|
|
||||||
switch(count){
|
|
||||||
case 6: return 0.75f;
|
|
||||||
case 7: return 0.57f;
|
|
||||||
case 8: return 0.44f;
|
|
||||||
case 9: return 0.33f;
|
|
||||||
case 10: return 0.25f;
|
|
||||||
default: return 1.0f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static float getMultiplier10Man(int count) {
|
|
||||||
if(count < 11)
|
|
||||||
return 1.0f;
|
|
||||||
|
|
||||||
if(count > 20)
|
|
||||||
return 0.0f;
|
|
||||||
|
|
||||||
switch(count){
|
|
||||||
case 11: return 0.86f;
|
|
||||||
case 12: return 0.75f;
|
|
||||||
case 13: return 0.65f;
|
|
||||||
case 14: return 0.57f;
|
|
||||||
case 15: return 0.50f;
|
|
||||||
case 16: return 0.44f;
|
|
||||||
case 17: return 0.38f;
|
|
||||||
case 18: return 0.33f;
|
|
||||||
case 19: return 0.29f;
|
|
||||||
case 20: return 0.25f;
|
|
||||||
default: return 1.0f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static float getMultiplier20Man(int count) {
|
|
||||||
if(count < 21)
|
|
||||||
return 1.0f;
|
|
||||||
|
|
||||||
if(count > 40)
|
|
||||||
return 0.0f;
|
|
||||||
|
|
||||||
switch (count)
|
|
||||||
{
|
|
||||||
case 21: return 0.93f;
|
|
||||||
case 22: return 0.86f;
|
|
||||||
case 23: return 0.80f;
|
|
||||||
case 24: return 0.75f;
|
|
||||||
case 25: return 0.70f;
|
|
||||||
case 26: return 0.65f;
|
|
||||||
case 27: return 0.61f;
|
|
||||||
case 28: return 0.57f;
|
|
||||||
case 29: return 0.53f;
|
|
||||||
case 30: return 0.50f;
|
|
||||||
case 31: return 0.47f;
|
|
||||||
case 32: return 0.44f;
|
|
||||||
case 33: return 0.41f;
|
|
||||||
case 34: return 0.38f;
|
|
||||||
case 35: return 0.36f;
|
|
||||||
case 36: return 0.33f;
|
|
||||||
case 37: return 0.31f;
|
|
||||||
case 38: return 0.29f;
|
|
||||||
case 39: return 0.27f;
|
|
||||||
case 40: return 0.25f;
|
|
||||||
default: return 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
public static float getMultiplier30Man(int count) {
|
|
||||||
if(count < 31)
|
|
||||||
return 1.0f;
|
|
||||||
|
|
||||||
if(count > 60)
|
|
||||||
return 0.0f;
|
|
||||||
|
|
||||||
switch (count)
|
|
||||||
{
|
|
||||||
case 31: return 0.95f;
|
|
||||||
case 32: return 0.91f;
|
|
||||||
case 33: return 0.86f;
|
|
||||||
case 34: return 0.82f;
|
|
||||||
case 35: return 0.79f;
|
|
||||||
case 36: return 0.75f;
|
|
||||||
case 37: return 0.72f;
|
|
||||||
case 38: return 0.68f;
|
|
||||||
case 39: return 0.65f;
|
|
||||||
case 40: return 0.63f;
|
|
||||||
case 41: return 0.60f;
|
|
||||||
case 42: return 0.57f;
|
|
||||||
case 43: return 0.55f;
|
|
||||||
case 44: return 0.52f;
|
|
||||||
case 45: return 0.50f;
|
|
||||||
case 46: return 0.48f;
|
|
||||||
case 47: return 0.46f;
|
|
||||||
case 48: return 0.44f;
|
|
||||||
case 49: return 0.42f;
|
|
||||||
case 50: return 0.40f;
|
|
||||||
case 51: return 0.38f;
|
|
||||||
case 52: return 0.37f;
|
|
||||||
case 53: return 0.35f;
|
|
||||||
case 54: return 0.33f;
|
|
||||||
case 55: return 0.32f;
|
|
||||||
case 56: return 0.30f;
|
|
||||||
case 57: return 0.29f;
|
|
||||||
case 58: return 0.28f;
|
|
||||||
case 59: return 0.26f;
|
|
||||||
case 60: return 0.25f;
|
|
||||||
default: return 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
public static float getMultiplier40Man(int count) {
|
|
||||||
if(count < 41)
|
|
||||||
return 1.0f;
|
|
||||||
|
|
||||||
if(count > 80)
|
|
||||||
return 0.0f;
|
|
||||||
|
|
||||||
switch (count)
|
|
||||||
{
|
|
||||||
case 41: return 0.96f;
|
|
||||||
case 42: return 0.93f;
|
|
||||||
case 43: return 0.90f;
|
|
||||||
case 44: return 0.86f;
|
|
||||||
case 45: return 0.83f;
|
|
||||||
case 46: return 0.80f;
|
|
||||||
case 47: return 0.78f;
|
|
||||||
case 48: return 0.75f;
|
|
||||||
case 49: return 0.72f;
|
|
||||||
case 50: return 0.70f;
|
|
||||||
case 51: return 0.68f;
|
|
||||||
case 52: return 0.65f;
|
|
||||||
case 53: return 0.63f;
|
|
||||||
case 54: return 0.61f;
|
|
||||||
case 55: return 0.59f;
|
|
||||||
case 56: return 0.57f;
|
|
||||||
case 57: return 0.55f;
|
|
||||||
case 58: return 0.53f;
|
|
||||||
case 59: return 0.52f;
|
|
||||||
case 60: return 0.50f;
|
|
||||||
case 61: return 0.48f;
|
|
||||||
case 62: return 0.47f;
|
|
||||||
case 63: return 0.45f;
|
|
||||||
case 64: return 0.44f;
|
|
||||||
case 65: return 0.42f;
|
|
||||||
case 66: return 0.41f;
|
|
||||||
case 67: return 0.40f;
|
|
||||||
case 68: return 0.38f;
|
|
||||||
case 69: return 0.37f;
|
|
||||||
case 70: return 0.36f;
|
|
||||||
case 71: return 0.35f;
|
|
||||||
case 72: return 0.33f;
|
|
||||||
case 73: return 0.32f;
|
|
||||||
case 74: return 0.31f;
|
|
||||||
case 75: return 0.30f;
|
|
||||||
case 76: return 0.29f;
|
|
||||||
case 77: return 0.28f;
|
|
||||||
case 78: return 0.27f;
|
|
||||||
case 79: return 0.26f;
|
|
||||||
case 80: return 0.25f;
|
|
||||||
default: return 1.0f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -19,12 +19,14 @@ import engine.objects.Building;
|
|||||||
import engine.objects.City;
|
import engine.objects.City;
|
||||||
import engine.objects.Zone;
|
import engine.objects.Zone;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Class contains methods and structures which
|
* Class contains methods and structures which
|
||||||
@@ -107,6 +109,20 @@ public enum ZoneManager {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns the number of available hotZones
|
||||||
|
// remaining in this cycle (1am)
|
||||||
|
|
||||||
|
public static int availableHotZones() {
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
for (Zone zone : ZoneManager.macroZones)
|
||||||
|
if (ZoneManager.validHotZone(zone))
|
||||||
|
count = count + 1;
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
// Resets the availability of hotZones
|
// Resets the availability of hotZones
|
||||||
// for this cycle
|
// for this cycle
|
||||||
|
|
||||||
@@ -201,6 +217,63 @@ public enum ZoneManager {
|
|||||||
ZoneManager.playerCityZones.add(zone);
|
ZoneManager.playerCityZones.add(zone);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final void generateAndSetRandomHotzone() {
|
||||||
|
|
||||||
|
Zone hotZone;
|
||||||
|
ArrayList<Integer> zoneArray = new ArrayList<>();
|
||||||
|
|
||||||
|
if (ZoneManager.macroZones.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Reset hotZone availability if none are left.
|
||||||
|
|
||||||
|
if (ZoneManager.availableHotZones() == 0)
|
||||||
|
ZoneManager.resetHotZones();
|
||||||
|
|
||||||
|
for (Zone zone : ZoneManager.macroZones)
|
||||||
|
if (validHotZone(zone))
|
||||||
|
zoneArray.add(zone.getObjectUUID());
|
||||||
|
|
||||||
|
int entryIndex = ThreadLocalRandom.current().nextInt(zoneArray.size());
|
||||||
|
|
||||||
|
hotZone = ZoneManager.getZoneByUUID(zoneArray.get(entryIndex));
|
||||||
|
|
||||||
|
if (hotZone == null) {
|
||||||
|
Logger.error("Hotzone is null");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ZoneManager.setHotZone(hotZone);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final boolean validHotZone(Zone zone) {
|
||||||
|
|
||||||
|
if (zone.getSafeZone() == (byte) 1)
|
||||||
|
return false; // no safe zone hotzones// if (this.hotzone == null)
|
||||||
|
|
||||||
|
if (zone.getNodes().isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (zone.equals(ZoneManager.seaFloor))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
//no duplicate hotZones
|
||||||
|
|
||||||
|
if (zone.hasBeenHotzone == true)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Enforce min level
|
||||||
|
|
||||||
|
if (zone.minLvl < Integer.parseInt(ConfigManager.MB_HOTZONE_MIN_LEVEL.getValue()))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (ZoneManager.hotZone != null)
|
||||||
|
return ZoneManager.hotZone.getObjectUUID() != zone.getObjectUUID();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Converts world coordinates to coordinates local to a given zone.
|
// Converts world coordinates to coordinates local to a given zone.
|
||||||
|
|
||||||
public static Vector3fImmutable worldToLocal(Vector3fImmutable worldVector,
|
public static Vector3fImmutable worldToLocal(Vector3fImmutable worldVector,
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ public class EndFearJob extends AbstractEffectJob {
|
|||||||
if (this.target == null || (!(this.target instanceof Mob)))
|
if (this.target == null || (!(this.target instanceof Mob)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
((Mob) this.target).setFearedObject(null);
|
((Mob) this.target).fearedObject = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -40,6 +40,6 @@ public class EndFearJob extends AbstractEffectJob {
|
|||||||
if (this.target == null || (!(this.target instanceof Mob)))
|
if (this.target == null || (!(this.target instanceof Mob)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
((Mob) this.target).setFearedObject(null);
|
((Mob) this.target).fearedObject = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,13 +47,13 @@ public class FinishSummonsJob extends AbstractScheduleJob {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// cannot summon a player in combat
|
// cannot summon a player in combat
|
||||||
//if (this.target.isCombat()) {
|
if (this.target.isCombat()) {
|
||||||
|
|
||||||
// ErrorPopupMsg.sendErrorMsg(this.source, "Cannot summon player in combat.");
|
ErrorPopupMsg.sendErrorMsg(this.source, "Cannot summon player in combat.");
|
||||||
|
|
||||||
// PowersManager.finishRecycleTime(428523680, this.source, false);
|
PowersManager.finishRecycleTime(428523680, this.source, false);
|
||||||
// return;
|
return;
|
||||||
//}
|
}
|
||||||
|
|
||||||
if (this.target.getBonuses() != null && this.target.getBonuses().getBool(ModType.BlockedPowerType, SourceType.SUMMON)) {
|
if (this.target.getBonuses() != null && this.target.getBonuses().getBool(ModType.BlockedPowerType, SourceType.SUMMON)) {
|
||||||
ErrorPopupMsg.sendErrorMsg(this.target, "You have been blocked from receiving summons!");
|
ErrorPopupMsg.sendErrorMsg(this.target, "You have been blocked from receiving summons!");
|
||||||
|
|||||||
@@ -9,12 +9,10 @@
|
|||||||
package engine.loot;
|
package engine.loot;
|
||||||
|
|
||||||
import engine.gameManager.LootManager;
|
import engine.gameManager.LootManager;
|
||||||
import org.pmw.tinylog.Logger;
|
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
|
||||||
|
|
||||||
public class ItemTableEntry {
|
public class ItemTableEntry {
|
||||||
public int minRoll;
|
public int minRoll;
|
||||||
@@ -37,23 +35,11 @@ public class ItemTableEntry {
|
|||||||
List<ItemTableEntry> itemTableEntryList;
|
List<ItemTableEntry> itemTableEntryList;
|
||||||
|
|
||||||
itemTableEntryList = LootManager._itemTables.get(itemTable);
|
itemTableEntryList = LootManager._itemTables.get(itemTable);
|
||||||
if(itemTableEntryList != null) {
|
|
||||||
for (ItemTableEntry iteration : itemTableEntryList)
|
for (ItemTableEntry iteration : itemTableEntryList)
|
||||||
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
|
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
|
||||||
itemTableEntry = iteration;
|
itemTableEntry = iteration;
|
||||||
}
|
|
||||||
return itemTableEntry;
|
return itemTableEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Integer getRandomItem(int itemTable) {
|
|
||||||
int id = 0;
|
|
||||||
List<ItemTableEntry> itemTableEntryList;
|
|
||||||
|
|
||||||
itemTableEntryList = LootManager._itemTables.get(itemTable);
|
|
||||||
|
|
||||||
if(itemTableEntryList != null && itemTableEntryList.size() > 1){
|
|
||||||
id = itemTableEntryList.get(ThreadLocalRandom.current().nextInt(0, itemTableEntryList.size())).cacheID;
|
|
||||||
}
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,11 +33,11 @@ public class ModTableEntry {
|
|||||||
List<ModTableEntry> itemTableEntryList;
|
List<ModTableEntry> itemTableEntryList;
|
||||||
|
|
||||||
itemTableEntryList = LootManager._modTables.get(modTablwe);
|
itemTableEntryList = LootManager._modTables.get(modTablwe);
|
||||||
if(itemTableEntryList != null) {
|
|
||||||
for (ModTableEntry iteration : itemTableEntryList)
|
for (ModTableEntry iteration : itemTableEntryList)
|
||||||
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) {
|
||||||
|
|||||||
+107
-137
@@ -82,16 +82,6 @@ public class MobAI {
|
|||||||
|
|
||||||
mob.updateLocation();
|
mob.updateLocation();
|
||||||
|
|
||||||
if(mob.StrongholdGuardian || mob.StrongholdEpic){
|
|
||||||
// attempt to ground all players in attack range
|
|
||||||
for(int i : mob.playerAgroMap.keySet()){
|
|
||||||
PlayerCharacter tar = PlayerCharacter.getFromCache(i);
|
|
||||||
if(tar != null && tar.loc.distanceSquared(mob.loc) < 80){
|
|
||||||
PowersManager.applyPower(mob,tar,tar.loc, 111111,40,false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} 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());
|
||||||
}
|
}
|
||||||
@@ -106,7 +96,7 @@ public class MobAI {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mob.BehaviourType.callsForHelp)
|
if (mob.behaviourType.callsForHelp)
|
||||||
MobCallForHelp(mob);
|
MobCallForHelp(mob);
|
||||||
|
|
||||||
if (!MovementUtilities.inRangeDropAggro(mob, target)) {
|
if (!MovementUtilities.inRangeDropAggro(mob, target)) {
|
||||||
@@ -166,9 +156,6 @@ public class MobAI {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
if(mob == null || 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;
|
||||||
@@ -178,8 +165,8 @@ public class MobAI {
|
|||||||
|
|
||||||
if (playercity != null)
|
if (playercity != null)
|
||||||
for (Mob guard : playercity.getParent().zoneMobSet)
|
for (Mob guard : playercity.getParent().zoneMobSet)
|
||||||
if (guard.BehaviourType != null && guard.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal())
|
if (guard.behaviourType != null && guard.behaviourType.equals(Enum.MobBehaviourType.GuardCaptain))
|
||||||
if (guard.getCombatTarget() == null && guard.getGuild() != null && mob.getGuild() != null && !guard.getGuild().equals(mob.getGuild()))
|
if (guard.getCombatTarget() == null && !guard.getGuild().equals(mob.getGuild()))
|
||||||
guard.setCombatTarget(mob);
|
guard.setCombatTarget(mob);
|
||||||
|
|
||||||
if (mob.isSiege())
|
if (mob.isSiege())
|
||||||
@@ -208,11 +195,11 @@ public class MobAI {
|
|||||||
mob.setLastAttackTime(System.currentTimeMillis() + attackDelay);
|
mob.setLastAttackTime(System.currentTimeMillis() + attackDelay);
|
||||||
}
|
}
|
||||||
|
|
||||||
//if (mob.isSiege()) {
|
if (mob.isSiege()) {
|
||||||
// PowerProjectileMsg ppm = new PowerProjectileMsg(mob, target);
|
PowerProjectileMsg ppm = new PowerProjectileMsg(mob, target);
|
||||||
// ppm.setRange(50);
|
ppm.setRange(50);
|
||||||
// DispatchMessage.dispatchMsgToInterestArea(mob, ppm, DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);
|
DispatchMessage.dispatchMsgToInterestArea(mob, ppm, DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);
|
||||||
//}
|
}
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackBuilding" + " " + e.getMessage());
|
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackBuilding" + " " + e.getMessage());
|
||||||
@@ -273,7 +260,7 @@ public class MobAI {
|
|||||||
|
|
||||||
//guard captains inherit barracks patrol points dynamically
|
//guard captains inherit barracks patrol points dynamically
|
||||||
|
|
||||||
if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal()) {
|
if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardCaptain)) {
|
||||||
|
|
||||||
Building barracks = mob.building;
|
Building barracks = mob.building;
|
||||||
|
|
||||||
@@ -293,7 +280,7 @@ public class MobAI {
|
|||||||
|
|
||||||
MovementUtilities.aiMove(mob, mob.destination, true);
|
MovementUtilities.aiMove(mob, mob.destination, true);
|
||||||
|
|
||||||
if (mob.BehaviourType.equals(Enum.MobBehaviourType.GuardCaptain))
|
if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardCaptain))
|
||||||
for (Entry<Mob, Integer> minion : mob.siegeMinionMap.entrySet())
|
for (Entry<Mob, Integer> minion : mob.siegeMinionMap.entrySet())
|
||||||
|
|
||||||
//make sure mob is out of combat stance
|
//make sure mob is out of combat stance
|
||||||
@@ -325,8 +312,8 @@ public class MobAI {
|
|||||||
|
|
||||||
int contractID;
|
int contractID;
|
||||||
|
|
||||||
if(mob.BehaviourType.equals(Enum.MobBehaviourType.GuardMinion))
|
if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardMinion))
|
||||||
contractID = mob.npcOwner.contract.getContractID();
|
contractID = mob.guardCaptain.contract.getContractID();
|
||||||
else
|
else
|
||||||
contractID = mob.contract.getContractID();
|
contractID = mob.contract.getContractID();
|
||||||
|
|
||||||
@@ -363,7 +350,7 @@ public class MobAI {
|
|||||||
ArrayList<Integer> purgeTokens;
|
ArrayList<Integer> purgeTokens;
|
||||||
AbstractCharacter target = (AbstractCharacter) mob.getCombatTarget();
|
AbstractCharacter target = (AbstractCharacter) mob.getCombatTarget();
|
||||||
|
|
||||||
if (mob.BehaviourType.callsForHelp)
|
if (mob.behaviourType.callsForHelp)
|
||||||
MobCallForHelp(mob);
|
MobCallForHelp(mob);
|
||||||
|
|
||||||
// Generate a list of tokens from the mob powers for this mobile.
|
// Generate a list of tokens from the mob powers for this mobile.
|
||||||
@@ -413,7 +400,7 @@ public class MobAI {
|
|||||||
|
|
||||||
PerformActionMsg msg;
|
PerformActionMsg msg;
|
||||||
|
|
||||||
if (!mob.StrongholdCommander && !mob.StrongholdEpic && (!mobPower.isHarmful() || mobPower.targetSelf)) {
|
if (!mobPower.isHarmful() || mobPower.targetSelf) {
|
||||||
PowersManager.useMobPower(mob, mob, mobPower, powerRank);
|
PowersManager.useMobPower(mob, mob, mobPower, powerRank);
|
||||||
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, mob);
|
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, mob);
|
||||||
} else {
|
} else {
|
||||||
@@ -446,7 +433,7 @@ public class MobAI {
|
|||||||
ArrayList<Integer> purgeTokens;
|
ArrayList<Integer> purgeTokens;
|
||||||
AbstractCharacter target = (AbstractCharacter) mob.getCombatTarget();
|
AbstractCharacter target = (AbstractCharacter) mob.getCombatTarget();
|
||||||
|
|
||||||
if (mob.BehaviourType.callsForHelp)
|
if (mob.behaviourType.callsForHelp)
|
||||||
MobCallForHelp(mob);
|
MobCallForHelp(mob);
|
||||||
|
|
||||||
// Generate a list of tokens from the mob powers for this mobile.
|
// Generate a list of tokens from the mob powers for this mobile.
|
||||||
@@ -577,7 +564,7 @@ public class MobAI {
|
|||||||
Zone mobCamp = mob.getParentZone();
|
Zone mobCamp = mob.getParentZone();
|
||||||
|
|
||||||
for (Mob helper : mobCamp.zoneMobSet) {
|
for (Mob helper : mobCamp.zoneMobSet) {
|
||||||
if (helper.BehaviourType.respondsToCallForHelp && helper.BehaviourType.BehaviourHelperType.equals(mob.BehaviourType)) {
|
if (helper.behaviourType.respondsToCallForHelp && helper.behaviourType.BehaviourHelperType.equals(mob.behaviourType)) {
|
||||||
helper.setCombatTarget(mob.getCombatTarget());
|
helper.setCombatTarget(mob.getCombatTarget());
|
||||||
callGotResponse = true;
|
callGotResponse = true;
|
||||||
}
|
}
|
||||||
@@ -601,9 +588,6 @@ public class MobAI {
|
|||||||
|
|
||||||
if (mob == null)
|
if (mob == null)
|
||||||
return;
|
return;
|
||||||
if(mob.isAlive())
|
|
||||||
if(!mob.getMovementLoc().equals(Vector3fImmutable.ZERO))
|
|
||||||
mob.setLoc(mob.getMovementLoc());
|
|
||||||
|
|
||||||
if (mob.getTimestamps().containsKey("lastExecution") == false)
|
if (mob.getTimestamps().containsKey("lastExecution") == false)
|
||||||
mob.getTimestamps().put("lastExecution", System.currentTimeMillis());
|
mob.getTimestamps().put("lastExecution", System.currentTimeMillis());
|
||||||
@@ -624,8 +608,8 @@ public class MobAI {
|
|||||||
|
|
||||||
if (mob.despawned && mob.isPlayerGuard) {
|
if (mob.despawned && mob.isPlayerGuard) {
|
||||||
|
|
||||||
if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardMinion.ordinal()) {
|
if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardMinion)) {
|
||||||
if (mob.npcOwner.isAlive() == false || ((Mob) mob.npcOwner).despawned == true) {
|
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
|
||||||
|
|
||||||
@@ -641,6 +625,9 @@ 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) == false)
|
||||||
|
CheckToSendMobHome(mob);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -659,7 +646,7 @@ public class MobAI {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(mob.isPet() == false && mob.isPlayerGuard == false)
|
if (mob.behaviourType.equals(Enum.MobBehaviourType.Pet1) == false)
|
||||||
CheckToSendMobHome(mob);
|
CheckToSendMobHome(mob);
|
||||||
|
|
||||||
if (mob.getCombatTarget() != null) {
|
if (mob.getCombatTarget() != null) {
|
||||||
@@ -686,7 +673,7 @@ public class MobAI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (mob.BehaviourType) {
|
switch (mob.behaviourType) {
|
||||||
case GuardCaptain:
|
case GuardCaptain:
|
||||||
GuardCaptainLogic(mob);
|
GuardCaptainLogic(mob);
|
||||||
break;
|
break;
|
||||||
@@ -697,6 +684,7 @@ public class MobAI {
|
|||||||
GuardWallArcherLogic(mob);
|
GuardWallArcherLogic(mob);
|
||||||
break;
|
break;
|
||||||
case Pet1:
|
case Pet1:
|
||||||
|
case SiegeEngine:
|
||||||
PetLogic(mob);
|
PetLogic(mob);
|
||||||
break;
|
break;
|
||||||
case HamletGuard:
|
case HamletGuard:
|
||||||
@@ -706,8 +694,6 @@ public class MobAI {
|
|||||||
DefaultLogic(mob);
|
DefaultLogic(mob);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(mob.isAlive())
|
|
||||||
RecoverHealth(mob);
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: DetermineAction" + " " + e.getMessage());
|
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: DetermineAction" + " " + e.getMessage());
|
||||||
}
|
}
|
||||||
@@ -722,7 +708,7 @@ public class MobAI {
|
|||||||
if (!aiAgent.isAlive())
|
if (!aiAgent.isAlive())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ConcurrentHashMap<Integer, Boolean> loadedPlayers = aiAgent.playerAgroMap;
|
ConcurrentHashMap<Integer, Float> loadedPlayers = aiAgent.playerAgroMap;
|
||||||
|
|
||||||
for (Entry playerEntry : loadedPlayers.entrySet()) {
|
for (Entry playerEntry : loadedPlayers.entrySet()) {
|
||||||
|
|
||||||
@@ -797,33 +783,39 @@ public class MobAI {
|
|||||||
|
|
||||||
mob.updateLocation();
|
mob.updateLocation();
|
||||||
|
|
||||||
switch (mob.BehaviourType) {
|
switch (mob.behaviourType) {
|
||||||
|
|
||||||
case Pet1:
|
case Pet1:
|
||||||
if (mob.getOwner() == null)
|
|
||||||
|
|
||||||
|
if ((PlayerCharacter) mob.guardCaptain == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!mob.playerAgroMap.containsKey(mob.getOwner().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.getOwner().getLoc(), null);
|
|
||||||
|
MovementManager.translocate(mob, ((PlayerCharacter) mob.guardCaptain).getLoc(), null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (mob.getCombatTarget() == null) {
|
if (mob.getCombatTarget() == null) {
|
||||||
|
|
||||||
//move back to owner
|
//move back to owner
|
||||||
|
|
||||||
if (CombatUtilities.inRange2D(mob, mob.getOwner(), 6))
|
|
||||||
|
if (CombatUtilities.inRange2D(mob, (PlayerCharacter) mob.guardCaptain, 6))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mob.destination = mob.getOwner().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);
|
||||||
break;
|
break;
|
||||||
case GuardMinion:
|
case GuardMinion:
|
||||||
if (!mob.npcOwner.isAlive() && mob.getCombatTarget() == null)
|
if (!mob.guardCaptain.isAlive() || ((Mob) mob.guardCaptain).despawned)
|
||||||
randomGuardPatrolPoint(mob);
|
randomGuardPatrolPoint(mob);
|
||||||
else {
|
else {
|
||||||
if (mob.getCombatTarget() != null) {
|
if (mob.getCombatTarget() != null) {
|
||||||
@@ -842,7 +834,6 @@ public class MobAI {
|
|||||||
chaseTarget(mob);
|
chaseTarget(mob);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckMobMovement" + " " + e.getMessage());
|
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckMobMovement" + " " + e.getMessage());
|
||||||
@@ -870,7 +861,9 @@ public class MobAI {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//No items in inventory.
|
//No items in inventory.
|
||||||
} else if (aiAgent.isHasLoot()) {
|
} else {
|
||||||
|
//Mob's Loot has been looted.
|
||||||
|
if (aiAgent.isHasLoot()) {
|
||||||
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();
|
||||||
@@ -885,15 +878,9 @@ public class MobAI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (System.currentTimeMillis() > (aiAgent.deathTime + (aiAgent.spawnTime * 1000))) {
|
||||||
|
|
||||||
if(Mob.discDroppers.contains(aiAgent))
|
if (Zone.respawnQue.contains(aiAgent) == false) {
|
||||||
return;
|
|
||||||
|
|
||||||
if(aiAgent.StrongholdGuardian || aiAgent.StrongholdEpic || aiAgent.StrongholdCommander)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (System.currentTimeMillis() > (aiAgent.deathTime + (aiAgent.spawnTime * 1000L))) {
|
|
||||||
if (!Zone.respawnQue.contains(aiAgent)) {
|
|
||||||
Zone.respawnQue.add(aiAgent);
|
Zone.respawnQue.add(aiAgent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -913,7 +900,8 @@ public class MobAI {
|
|||||||
if (mob.getCombatTarget() == null)
|
if (mob.getCombatTarget() == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (mob.getCombatTarget().getObjectType().equals(Enum.GameObjectType.PlayerCharacter) && MovementUtilities.inRangeDropAggro(mob, (PlayerCharacter) mob.getCombatTarget()) == false && mob.BehaviourType.ordinal() != Enum.MobBehaviourType.Pet1.ordinal()) {
|
if (mob.getCombatTarget().getObjectType().equals(Enum.GameObjectType.PlayerCharacter) && MovementUtilities.inRangeDropAggro(mob, (PlayerCharacter) mob.getCombatTarget()) == false &&
|
||||||
|
mob.behaviourType.equals(Enum.MobBehaviourType.Pet1) == false) {
|
||||||
|
|
||||||
mob.setCombatTarget(null);
|
mob.setCombatTarget(null);
|
||||||
return;
|
return;
|
||||||
@@ -928,31 +916,20 @@ public class MobAI {
|
|||||||
|
|
||||||
private static void CheckToSendMobHome(Mob mob) {
|
private static void CheckToSendMobHome(Mob mob) {
|
||||||
|
|
||||||
if(mob.isNecroPet())
|
|
||||||
return;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
if (mob.behaviourType.isAgressive) {
|
||||||
//trebs dont recall
|
|
||||||
if(mob.isSiege())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(mob.BehaviourType.equals(Enum.MobBehaviourType.Pet1)){
|
|
||||||
if(mob.loc.distanceSquared(mob.getOwner().loc) > 60 * 60)
|
|
||||||
mob.teleport(mob.getOwner().loc);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mob.BehaviourType.isAgressive) {
|
|
||||||
|
|
||||||
if (mob.isPlayerGuard()) {
|
if (mob.isPlayerGuard()) {
|
||||||
if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal())
|
if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardCaptain))
|
||||||
CheckForPlayerGuardAggro(mob);
|
CheckForPlayerGuardAggro(mob);
|
||||||
} else {
|
} else {
|
||||||
CheckForAggro(mob);
|
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());
|
||||||
@@ -963,7 +940,7 @@ public class MobAI {
|
|||||||
PowersManager.useMobPower(mob, mob, recall, 40);
|
PowersManager.useMobPower(mob, mob, recall, 40);
|
||||||
mob.setCombatTarget(null);
|
mob.setCombatTarget(null);
|
||||||
|
|
||||||
if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal() && mob.isAlive()) {
|
if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardCaptain) && mob.isAlive()) {
|
||||||
|
|
||||||
//guard captain pulls his minions home with him
|
//guard captain pulls his minions home with him
|
||||||
|
|
||||||
@@ -973,15 +950,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);
|
||||||
|
|
||||||
for (Entry playerEntry : mob.playerAgroMap.entrySet())
|
for (Integer playerEntry : mob.playerAgroMap.keySet())
|
||||||
PlayerCharacter.getFromCache((int) playerEntry.getKey()).setHateValue(0);
|
mob.playerAgroMap.put(playerEntry,0f);
|
||||||
mob.setCombatTarget(null);
|
|
||||||
}
|
}
|
||||||
} 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());
|
||||||
@@ -1035,7 +1011,7 @@ public class MobAI {
|
|||||||
|
|
||||||
//dont scan self.
|
//dont scan self.
|
||||||
|
|
||||||
if (mob.equals(awoMob) || (mob.agentType.equals(Enum.AIAgentType.GUARD)) || (mob.agentType.equals(Enum.AIAgentType.PET)))
|
if (mob.equals(awoMob) || (mob.agentType.equals(Enum.AIAgentType.GUARD)) == true)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Mob aggroMob = (Mob) awoMob;
|
Mob aggroMob = (Mob) awoMob;
|
||||||
@@ -1045,7 +1021,7 @@ public class MobAI {
|
|||||||
if ((aggroMob.agentType.equals(Enum.AIAgentType.GUARD)))
|
if ((aggroMob.agentType.equals(Enum.AIAgentType.GUARD)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(aggroMob.BehaviourType.equals(Enum.MobBehaviourType.Pet1))
|
if (aggroMob.behaviourType.equals(Enum.MobBehaviourType.Pet1))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (mob.getLoc().distanceSquared2D(aggroMob.getLoc()) > sqr(50))
|
if (mob.getLoc().distanceSquared2D(aggroMob.getLoc()) > sqr(50))
|
||||||
@@ -1058,22 +1034,9 @@ public class MobAI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void checkToDropGuardAggro(Mob mob){
|
|
||||||
City city = mob.guardedCity;
|
|
||||||
|
|
||||||
if(city == null)
|
|
||||||
return;
|
|
||||||
if(mob.combatTarget == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(city._playerMemory.contains(mob.combatTarget.getObjectUUID()) && mob.combatTarget.getObjectType().equals(Enum.GameObjectType.PlayerCharacter))
|
|
||||||
mob.setCombatTarget(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void GuardCaptainLogic(Mob mob) {
|
public static void GuardCaptainLogic(Mob mob) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
checkToDropGuardAggro(mob);
|
|
||||||
if (mob.getCombatTarget() == null)
|
if (mob.getCombatTarget() == null)
|
||||||
CheckForPlayerGuardAggro(mob);
|
CheckForPlayerGuardAggro(mob);
|
||||||
|
|
||||||
@@ -1088,6 +1051,7 @@ public class MobAI {
|
|||||||
mob.setCombatTarget(newTarget);
|
mob.setCombatTarget(newTarget);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckMobMovement(mob);
|
CheckMobMovement(mob);
|
||||||
CheckForAttack(mob);
|
CheckForAttack(mob);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -1098,16 +1062,28 @@ public class MobAI {
|
|||||||
public static void GuardMinionLogic(Mob mob) {
|
public static void GuardMinionLogic(Mob mob) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
checkToDropGuardAggro(mob);
|
if (!mob.guardCaptain.isAlive()) {
|
||||||
|
|
||||||
boolean isComanded = mob.npcOwner.isAlive();
|
if (mob.getCombatTarget() == null) {
|
||||||
if (!isComanded) {
|
CheckForPlayerGuardAggro(mob);
|
||||||
GuardCaptainLogic(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.npcOwner.getCombatTarget() != null)
|
if (mob.guardCaptain.getCombatTarget() != null)
|
||||||
mob.setCombatTarget(mob.npcOwner.getCombatTarget());
|
mob.setCombatTarget(mob.guardCaptain.getCombatTarget());
|
||||||
else
|
else if (mob.getCombatTarget() != null)
|
||||||
if (mob.getCombatTarget() != null)
|
|
||||||
mob.setCombatTarget(null);
|
mob.setCombatTarget(null);
|
||||||
}
|
}
|
||||||
CheckMobMovement(mob);
|
CheckMobMovement(mob);
|
||||||
@@ -1120,8 +1096,6 @@ public class MobAI {
|
|||||||
public static void GuardWallArcherLogic(Mob mob) {
|
public static void GuardWallArcherLogic(Mob mob) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
checkToDropGuardAggro(mob);
|
|
||||||
|
|
||||||
if (mob.getCombatTarget() == null)
|
if (mob.getCombatTarget() == null)
|
||||||
CheckForPlayerGuardAggro(mob);
|
CheckForPlayerGuardAggro(mob);
|
||||||
else
|
else
|
||||||
@@ -1135,14 +1109,31 @@ public class MobAI {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
if (mob.getOwner() == null && mob.isNecroPet() == false && mob.isSiege() == false)
|
|
||||||
|
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");
|
||||||
|
|
||||||
if (MovementUtilities.canMove(mob) && mob.BehaviourType.canRoam)
|
if (MovementUtilities.canMove(mob) && mob.behaviourType.canRoam)
|
||||||
CheckMobMovement(mob);
|
CheckMobMovement(mob);
|
||||||
|
|
||||||
CheckForAttack(mob);
|
CheckForAttack(mob);
|
||||||
|
|
||||||
|
//recover health
|
||||||
|
|
||||||
|
if (mob.getTimestamps().containsKey("HEALTHRECOVERED") == false)
|
||||||
|
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
|
||||||
|
|
||||||
|
if (mob.isSit() && mob.getTimeStamp("HEALTHRECOVERED") < System.currentTimeMillis() + 3000)
|
||||||
|
if (mob.getHealth() < mob.getHealthMax()) {
|
||||||
|
|
||||||
|
float recoveredHealth = mob.getHealthMax() * ((1 + mob.getBonuses().getFloatPercentAll(Enum.ModType.HealthRecoverRate, Enum.SourceType.None)) * 0.01f);
|
||||||
|
mob.setHealth(mob.getHealth() + recoveredHealth);
|
||||||
|
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
|
||||||
|
|
||||||
|
if (mob.getHealth() > mob.getHealthMax())
|
||||||
|
mob.setHealth(mob.getHealthMax());
|
||||||
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: PetLogic" + " " + e.getMessage());
|
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: PetLogic" + " " + e.getMessage());
|
||||||
}
|
}
|
||||||
@@ -1173,7 +1164,7 @@ public class MobAI {
|
|||||||
if (mob.getCombatTarget() != null && mob.playerAgroMap.containsKey(mob.getCombatTarget().getObjectUUID()) == false)
|
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) {
|
||||||
|
|
||||||
AbstractWorldObject newTarget = ChangeTargetFromHateValue(mob);
|
AbstractWorldObject newTarget = ChangeTargetFromHateValue(mob);
|
||||||
|
|
||||||
@@ -1181,7 +1172,7 @@ public class MobAI {
|
|||||||
mob.setCombatTarget(newTarget);
|
mob.setCombatTarget(newTarget);
|
||||||
else {
|
else {
|
||||||
if (mob.getCombatTarget() == null) {
|
if (mob.getCombatTarget() == null) {
|
||||||
if (mob.BehaviourType == Enum.MobBehaviourType.HamletGuard)
|
if (mob.behaviourType == Enum.MobBehaviourType.HamletGuard)
|
||||||
SafeGuardAggro(mob); //safehold guard
|
SafeGuardAggro(mob); //safehold guard
|
||||||
else
|
else
|
||||||
CheckForAggro(mob); //normal aggro
|
CheckForAggro(mob); //normal aggro
|
||||||
@@ -1191,12 +1182,12 @@ public class MobAI {
|
|||||||
|
|
||||||
//check if mob can move for patrol or moving to target
|
//check if mob can move for patrol or moving to target
|
||||||
|
|
||||||
if (mob.BehaviourType.canRoam)
|
if (mob.behaviourType.canRoam)
|
||||||
CheckMobMovement(mob);
|
CheckMobMovement(mob);
|
||||||
|
|
||||||
//check if mob can attack if it isn't wimpy
|
//check if mob can attack if it isn't wimpy
|
||||||
|
|
||||||
if (!mob.BehaviourType.isWimpy && mob.getCombatTarget() != null)
|
if (!mob.behaviourType.isWimpy && mob.getCombatTarget() != null)
|
||||||
CheckForAttack(mob);
|
CheckForAttack(mob);
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -1213,7 +1204,7 @@ public class MobAI {
|
|||||||
if (!mob.isAlive())
|
if (!mob.isAlive())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ConcurrentHashMap<Integer, Boolean> loadedPlayers = mob.playerAgroMap;
|
ConcurrentHashMap<Integer, Float> loadedPlayers = mob.playerAgroMap;
|
||||||
|
|
||||||
for (Entry playerEntry : loadedPlayers.entrySet()) {
|
for (Entry playerEntry : loadedPlayers.entrySet()) {
|
||||||
|
|
||||||
@@ -1261,8 +1252,8 @@ public class MobAI {
|
|||||||
if (mob.getGuild().getNation().equals(target.getGuild().getNation()))
|
if (mob.getGuild().getNation().equals(target.getGuild().getNation()))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardMinion.ordinal()) {
|
if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardMinion)) {
|
||||||
if (((Mob) mob.npcOwner).building.getCity().cityOutlaws.contains(target.getObjectUUID()) == true) {
|
if (((Mob) mob.guardCaptain).building.getCity().cityOutlaws.contains(target.getObjectUUID()) == true) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else if (mob.building.getCity().cityOutlaws.contains(target.getObjectUUID()) == true) {
|
} else if (mob.building.getCity().cityOutlaws.contains(target.getObjectUUID()) == true) {
|
||||||
@@ -1346,7 +1337,7 @@ public class MobAI {
|
|||||||
|
|
||||||
MovementUtilities.aiMove(mob, mob.destination, true);
|
MovementUtilities.aiMove(mob, mob.destination, true);
|
||||||
|
|
||||||
if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal()) {
|
if (mob.behaviourType.equals(Enum.MobBehaviourType.GuardCaptain)) {
|
||||||
for (Entry<Mob, Integer> minion : mob.siegeMinionMap.entrySet()) {
|
for (Entry<Mob, Integer> minion : mob.siegeMinionMap.entrySet()) {
|
||||||
|
|
||||||
//make sure mob is out of combat stance
|
//make sure mob is out of combat stance
|
||||||
@@ -1373,7 +1364,7 @@ public class MobAI {
|
|||||||
float CurrentHateValue = 0;
|
float CurrentHateValue = 0;
|
||||||
|
|
||||||
if (mob.getCombatTarget() != null && mob.getCombatTarget().getObjectType().equals(Enum.GameObjectType.PlayerCharacter))
|
if (mob.getCombatTarget() != null && mob.getCombatTarget().getObjectType().equals(Enum.GameObjectType.PlayerCharacter))
|
||||||
CurrentHateValue = ((PlayerCharacter) mob.getCombatTarget()).getHateValue();
|
CurrentHateValue = mob.playerAgroMap.get(mob.combatTarget.getObjectUUID()).floatValue();
|
||||||
|
|
||||||
AbstractWorldObject mostHatedTarget = null;
|
AbstractWorldObject mostHatedTarget = null;
|
||||||
|
|
||||||
@@ -1384,8 +1375,8 @@ public class MobAI {
|
|||||||
if (potentialTarget.equals(mob.getCombatTarget()))
|
if (potentialTarget.equals(mob.getCombatTarget()))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (potentialTarget != null && potentialTarget.getHateValue() > CurrentHateValue && MovementUtilities.inRangeToAggro(mob, potentialTarget)) {
|
if (potentialTarget != null && mob.playerAgroMap.get(potentialTarget.getObjectUUID()).floatValue() > CurrentHateValue && MovementUtilities.inRangeToAggro(mob, potentialTarget)) {
|
||||||
CurrentHateValue = potentialTarget.getHateValue();
|
CurrentHateValue = mob.playerAgroMap.get(potentialTarget.getObjectUUID()).floatValue();
|
||||||
mostHatedTarget = potentialTarget;
|
mostHatedTarget = potentialTarget;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1396,25 +1387,4 @@ public class MobAI {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void RecoverHealth(Mob mob) {
|
|
||||||
//recover health
|
|
||||||
try {
|
|
||||||
if (mob.getTimestamps().containsKey("HEALTHRECOVERED") == false)
|
|
||||||
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
|
|
||||||
|
|
||||||
if (mob.isSit() && mob.getTimeStamp("HEALTHRECOVERED") < System.currentTimeMillis() + 3000)
|
|
||||||
if (mob.getHealth() < mob.getHealthMax()) {
|
|
||||||
|
|
||||||
float recoveredHealth = mob.getHealthMax() * ((1 + mob.getBonuses().getFloatPercentAll(Enum.ModType.HealthRecoverRate, Enum.SourceType.None)) * 0.01f);
|
|
||||||
mob.setHealth(mob.getHealth() + recoveredHealth);
|
|
||||||
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
|
|
||||||
|
|
||||||
if (mob.getHealth() > mob.getHealthMax())
|
|
||||||
mob.setHealth(mob.getHealthMax());
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: RecoverHealth" + " " + e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -48,7 +48,7 @@ public class CombatUtilities {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean inRange2D(AbstractWorldObject entity1, AbstractWorldObject entity2, double range) {
|
public static boolean inRange2D(AbstractWorldObject entity1, AbstractWorldObject entity2, double range) {
|
||||||
return entity1.getLoc().distance2D(entity2.getLoc()) < range;
|
return entity1.getLoc().distanceSquared2D(entity2.getLoc()) < range * range;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void swingIsBlock(Mob agent, AbstractWorldObject target, int animation) {
|
public static void swingIsBlock(Mob agent, AbstractWorldObject target, int animation) {
|
||||||
@@ -139,22 +139,37 @@ public class CombatUtilities {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean triggerDefense(Mob agent, AbstractWorldObject target) {
|
public static boolean triggerDefense(Mob agent, AbstractWorldObject target) {
|
||||||
int defense = 0;
|
int defenseScore = 0;
|
||||||
int atr = agent.getAtrHandOne();
|
int attackScore = agent.getAtrHandOne();
|
||||||
switch (target.getObjectType()) {
|
switch (target.getObjectType()) {
|
||||||
case PlayerCharacter:
|
case PlayerCharacter:
|
||||||
defense = ((AbstractCharacter) target).getDefenseRating();
|
defenseScore = ((AbstractCharacter) target).getDefenseRating();
|
||||||
break;
|
break;
|
||||||
case Mob:
|
case Mob:
|
||||||
|
|
||||||
Mob mob = (Mob) target;
|
Mob mob = (Mob) target;
|
||||||
if (mob.isSiege())
|
if (mob.isSiege())
|
||||||
defense = atr;
|
defenseScore = attackScore;
|
||||||
break;
|
break;
|
||||||
case Building:
|
case Building:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return CombatManager.LandHit(atr,defense);
|
|
||||||
|
int hitChance;
|
||||||
|
if (attackScore > defenseScore || defenseScore == 0)
|
||||||
|
hitChance = 94;
|
||||||
|
else if (attackScore == defenseScore && target.getObjectType() == GameObjectType.Mob)
|
||||||
|
hitChance = 10;
|
||||||
|
else {
|
||||||
|
float dif = attackScore / defenseScore;
|
||||||
|
if (dif <= 0.8f)
|
||||||
|
hitChance = 4;
|
||||||
|
else
|
||||||
|
hitChance = ((int) (450 * (dif - 0.8f)) + 4);
|
||||||
|
if (target.getObjectType() == GameObjectType.Building)
|
||||||
|
hitChance = 100;
|
||||||
|
}
|
||||||
|
return ThreadLocalRandom.current().nextInt(100) > hitChance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean triggerBlock(Mob agent, AbstractWorldObject ac) {
|
public static boolean triggerBlock(Mob agent, AbstractWorldObject ac) {
|
||||||
|
|||||||
@@ -13,10 +13,10 @@ import engine.Enum;
|
|||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
import engine.Enum.ModType;
|
import engine.Enum.ModType;
|
||||||
import engine.Enum.SourceType;
|
import engine.Enum.SourceType;
|
||||||
import engine.mobileAI.Threads.MobAIThread;
|
|
||||||
import engine.exception.MsgSendException;
|
import engine.exception.MsgSendException;
|
||||||
import engine.gameManager.MovementManager;
|
import engine.gameManager.MovementManager;
|
||||||
import engine.math.Vector3fImmutable;
|
import engine.math.Vector3fImmutable;
|
||||||
|
import engine.mobileAI.Threads.MobAIThread;
|
||||||
import engine.net.client.msg.MoveToPointMsg;
|
import engine.net.client.msg.MoveToPointMsg;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
@@ -38,7 +38,7 @@ public class MovementUtilities {
|
|||||||
if (agent.getContract() != null)
|
if (agent.getContract() != null)
|
||||||
guardCaptain = agent;
|
guardCaptain = agent;
|
||||||
else
|
else
|
||||||
guardCaptain = (Mob) agent.npcOwner;
|
guardCaptain = (Mob) agent.guardCaptain;
|
||||||
|
|
||||||
if (guardCaptain != null) {
|
if (guardCaptain != null) {
|
||||||
Building barracks = guardCaptain.building;
|
Building barracks = guardCaptain.building;
|
||||||
|
|||||||
@@ -13,8 +13,6 @@ import engine.exception.FactoryBuildException;
|
|||||||
import engine.gameManager.ChatManager;
|
import engine.gameManager.ChatManager;
|
||||||
import engine.net.client.ClientConnection;
|
import engine.net.client.ClientConnection;
|
||||||
import engine.net.client.Protocol;
|
import engine.net.client.Protocol;
|
||||||
import engine.net.client.msg.ErrorPopupMsg;
|
|
||||||
import engine.net.client.msg.PlaceAssetMsg;
|
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
@@ -96,9 +94,11 @@ public class NetMsgFactory {
|
|||||||
if (origin instanceof ClientConnection) {
|
if (origin instanceof ClientConnection) {
|
||||||
PlayerCharacter player = ((ClientConnection) origin).getPlayerCharacter();
|
PlayerCharacter player = ((ClientConnection) origin).getPlayerCharacter();
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
|
// 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);
|
||||||
PlaceAssetMsg.sendPlaceAssetError(player.getClientConnection(), 1, "Please Report What You Just Did. Ref Code: " + opcode);
|
} else
|
||||||
}
|
Logger.error("Invalid protocol msg : " + opcode + " lastopcode: " + origin.lastProtocol.name() + " Error Code : " + errorCode);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
if (pc == null)
|
if (pc == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pc.update(false);
|
pc.update();
|
||||||
if (msg.getSpeed() == 2)
|
if (msg.getSpeed() == 2)
|
||||||
pc.setWalkMode(false);
|
pc.setWalkMode(false);
|
||||||
else
|
else
|
||||||
@@ -114,7 +114,7 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
if (pc == null)
|
if (pc == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pc.update(false);
|
pc.update();
|
||||||
|
|
||||||
pc.setSit(msg.toggleSitStand());
|
pc.setSit(msg.toggleSitStand());
|
||||||
|
|
||||||
@@ -560,30 +560,12 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
if (!itemManager.inventoryContains(i))
|
if (!itemManager.inventoryContains(i))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//cannot delete gold
|
if (i.isCanDestroy())
|
||||||
if(i.getItemBaseID() == 7)
|
if (itemManager.delete(i) == true) {
|
||||||
return;
|
|
||||||
|
|
||||||
if (i.isCanDestroy()) {
|
|
||||||
int goldValue = i.getBaseValue();
|
|
||||||
if (i.getItemBase().isRune())
|
|
||||||
goldValue = 500000;
|
|
||||||
|
|
||||||
if (i.getItemBaseID() == 980066)
|
|
||||||
goldValue = 0;
|
|
||||||
|
|
||||||
if(itemManager.getGoldInventory().getNumOfItems() + goldValue > 10000000)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (itemManager.delete(i)) {
|
|
||||||
if (goldValue > 0)
|
|
||||||
itemManager.addGoldToInventory(goldValue, false);
|
|
||||||
|
|
||||||
itemManager.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) {
|
||||||
@@ -672,8 +654,6 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
JobScheduler.getInstance().scheduleJob(new RefreshGroupJob(sourcePlayer), MBServerStatics.LOAD_OBJECT_DELAY);
|
JobScheduler.getInstance().scheduleJob(new RefreshGroupJob(sourcePlayer), MBServerStatics.LOAD_OBJECT_DELAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private static void lootWindowRequest(LootWindowRequestMsg msg, ClientConnection origin) throws MsgSendException {
|
private static void lootWindowRequest(LootWindowRequestMsg msg, ClientConnection origin) throws MsgSendException {
|
||||||
|
|
||||||
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
|
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
|
||||||
@@ -1263,8 +1243,6 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
|
|
||||||
|
|
||||||
cost = sell.getBaseValue();
|
cost = sell.getBaseValue();
|
||||||
if(sell.getItemBaseID() == 980066)
|
|
||||||
cost = 0;
|
|
||||||
|
|
||||||
//apply damaged value reduction
|
//apply damaged value reduction
|
||||||
float durabilityCurrent = sell.getDurabilityCurrent();
|
float durabilityCurrent = sell.getDurabilityCurrent();
|
||||||
@@ -1369,8 +1347,6 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// test within talking range
|
// test within talking range
|
||||||
if(npc.isInSafeZone())
|
|
||||||
npc.sellPercent = 0;
|
|
||||||
|
|
||||||
if (sourcePlayer.getLoc().distanceSquared2D(npc.getLoc()) > MBServerStatics.NPC_TALK_RANGE * MBServerStatics.NPC_TALK_RANGE) {
|
if (sourcePlayer.getLoc().distanceSquared2D(npc.getLoc()) > MBServerStatics.NPC_TALK_RANGE * MBServerStatics.NPC_TALK_RANGE) {
|
||||||
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 14);
|
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 14);
|
||||||
@@ -1382,192 +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(npc.contract.getObjectUUID() == 890){ // default steward
|
if (sellInventory == null)
|
||||||
// sellInventory = npc.getSellInventorySteward();
|
|
||||||
//}
|
|
||||||
//if(npc.contract.getObjectUUID() == 889){ // default builder
|
|
||||||
// sellInventory = npc.getSellInventoryBuilder();
|
|
||||||
//}
|
|
||||||
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.getMagicValue();
|
int cost = me.getMagicValue();
|
||||||
|
|
||||||
float bargain = sourcePlayer.getBargain();
|
float bargain = sourcePlayer.getBargain();
|
||||||
switch(npc.getContractID()){
|
|
||||||
case 1201:
|
|
||||||
cost = ItemBase.getDiscPrice(ib.getUUID());
|
|
||||||
bargain = 0;
|
|
||||||
break;
|
|
||||||
case 1202:
|
|
||||||
cost = ItemBase.getStatPrice(ib.getUUID());
|
|
||||||
bargain = 0;
|
|
||||||
break;
|
|
||||||
case 900:
|
|
||||||
cost = Warehouse.getCostForResource(ib.getUUID()) * Warehouse.getSellStackSize(ib.getUUID());
|
|
||||||
bargain = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
float profit;
|
|
||||||
|
|
||||||
if(npc.isInSafeZone())
|
float profit = npc.getSellPercent(sourcePlayer) - bargain;
|
||||||
profit = 0;
|
|
||||||
else
|
if (profit < 1)
|
||||||
profit = npc.getSellPercent(sourcePlayer) - bargain;
|
profit = 1;
|
||||||
|
|
||||||
|
|
||||||
if(profit > 0)
|
|
||||||
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(npc.getContractID() == 1502041){
|
}
|
||||||
me.fromNoob = true;
|
|
||||||
} else 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,sourcePlayer,ib);
|
buy = Item.createItemForPlayer(sourcePlayer, ib);
|
||||||
}else {
|
|
||||||
buy = Item.createItemForPlayer(sourcePlayer, ib, me.fromNoob);
|
|
||||||
if (buy != null) {
|
if (buy != null) {
|
||||||
me.transferEnchants(buy);
|
me.transferEnchants(buy);
|
||||||
itemMan.addItemToInventory(buy);
|
itemMan.addItemToInventory(buy);
|
||||||
if(npc.contractUUID == 900 && buy.getItemBaseID() == 1705032){
|
|
||||||
buy.setNumOfItems(10);
|
|
||||||
DbManager.ItemQueries.UPDATE_NUM_ITEMS(buy,buy.getNumOfItems());
|
|
||||||
}
|
|
||||||
//itemMan.updateInventory();
|
//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());
|
||||||
@@ -1576,43 +1579,14 @@ 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, 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){
|
|
||||||
Item buy = Item.createItemForPlayer(sourcePlayer, ib, false);
|
|
||||||
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) {
|
||||||
@@ -1672,24 +1646,14 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
max *= (1 + (durMod * 0.01f));
|
max *= (1 + (durMod * 0.01f));
|
||||||
if (dur >= max || dur < 1) {
|
if (dur >= max || dur < 1) {
|
||||||
//redundancy message to clear item from window in client
|
//redundancy message to clear item from window in client
|
||||||
if (!DbManager.ItemQueries.SET_DURABILITY(toRepair, dur))
|
|
||||||
return;
|
|
||||||
toRepair.setDurabilityCurrent(max);
|
toRepair.setDurabilityCurrent(max);
|
||||||
msg.setupRepairAck(max - dur);
|
msg.setupRepairAck(max - dur);
|
||||||
dispatch = Dispatch.borrow(player, msg);
|
dispatch = Dispatch.borrow(player, msg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
//TODO get cost to repair
|
||||||
int cost = ((int)((toRepair.getMagicValue()/max*(max - dur)) + (npc.getSpecialPrice() * npc.buyPercent))) + (int)(npc.getSpecialPrice() * (max - dur));
|
int cost = (int) ((max - dur) * 80.1);
|
||||||
|
|
||||||
//int pointsToRepair = max - dur;
|
|
||||||
//int magicValue = toRepair.getMagicValue();
|
|
||||||
//if(magicValue == 0)
|
|
||||||
// magicValue = 1;
|
|
||||||
//int calculatedValue = toRepair.getDurabilityMax() * magicValue;
|
|
||||||
//float costPerPoint = (magicValue / max) * ( 1 + npc.buyPercent);
|
|
||||||
//cost = (int)(pointsToRepair * costPerPoint) + npc.getSpecialPrice();
|
|
||||||
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
||||||
|
|
||||||
if (b != null)
|
if (b != null)
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import engine.objects.GuildStatusController;
|
|||||||
import engine.objects.Mine;
|
import engine.objects.Mine;
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
import engine.objects.Resource;
|
import engine.objects.Resource;
|
||||||
import org.pmw.tinylog.Logger;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @Author:
|
* @Author:
|
||||||
@@ -36,28 +35,26 @@ public class ArcMineChangeProductionMsgHandler extends AbstractClientMsgHandler
|
|||||||
|
|
||||||
//TODO verify this against the warehouse?
|
//TODO verify this against the warehouse?
|
||||||
|
|
||||||
if (!GuildStatusController.isInnerCouncil(playerCharacter.getGuildStatus())) // is this only GL?
|
if (GuildStatusController.isInnerCouncil(playerCharacter.getGuildStatus()) == false) // is this only GL?
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
Mine mine = Mine.getMine(changeProductionMsg.getMineID());
|
Mine mine = Mine.getMine(changeProductionMsg.getMineID());
|
||||||
|
|
||||||
if (mine == null) {
|
if (mine == null)
|
||||||
Logger.error("Player Character: " + playerCharacter.getName() + " Tried To Change Mine: " + changeProductionMsg.getMineID() + " and Mine was Null");
|
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
//make sure mine belongs to guild
|
//make sure mine belongs to guild
|
||||||
|
|
||||||
if (mine.getOwningGuild().isEmptyGuild() || mine.getOwningGuild().getObjectUUID() != playerCharacter.getGuild().getObjectUUID())
|
if (mine.getOwningGuild().isEmptyGuild() ||
|
||||||
|
mine.getOwningGuild().getObjectUUID() != playerCharacter.getGuild().getObjectUUID())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
//make sure valid resource
|
//make sure valid resource
|
||||||
|
|
||||||
Resource resource = Resource.resourceByHash.get(changeProductionMsg.getResourceHash());
|
Resource resource = Resource.resourceByHash.get(changeProductionMsg.getResourceHash());
|
||||||
|
|
||||||
if (resource == null) {
|
if (resource == null)
|
||||||
Logger.error("Player Character: " + playerCharacter.getName() + " Tried To Change Mine: " + changeProductionMsg.getMineID() + " and Resource was Null");
|
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
|
|
||||||
//update resource
|
//update resource
|
||||||
|
|
||||||
|
|||||||
@@ -47,16 +47,13 @@ public class ChangeAltitudeHandler extends AbstractClientMsgHandler {
|
|||||||
if (pc.region != null && !pc.region.isOutside())
|
if (pc.region != null && !pc.region.isOutside())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
||||||
// Find out if we already have an altitude timer running and if so
|
// Find out if we already have an altitude timer running and if so
|
||||||
// do not process more alt change requests
|
// do not process more alt change requests
|
||||||
|
|
||||||
pc.updateFlight();
|
|
||||||
|
|
||||||
if (pc.getTakeOffTime() != 0)
|
if (pc.getTakeOffTime() != 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
pc.setTakeOffTime(System.currentTimeMillis());
|
|
||||||
|
|
||||||
|
|
||||||
// remove all movement timers and jobs
|
// remove all movement timers and jobs
|
||||||
//TODO: test if they can fly
|
//TODO: test if they can fly
|
||||||
@@ -70,7 +67,7 @@ public class ChangeAltitudeHandler extends AbstractClientMsgHandler {
|
|||||||
if (pc.getAltitude() == 0 && !msg.up())
|
if (pc.getAltitude() == 0 && !msg.up())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
pc.update(false);
|
pc.update();
|
||||||
pc.stopMovement(pc.getLoc());
|
pc.stopMovement(pc.getLoc());
|
||||||
msg.setStartAlt(pc.getAltitude());
|
msg.setStartAlt(pc.getAltitude());
|
||||||
if (msg.up()) {
|
if (msg.up()) {
|
||||||
@@ -135,7 +132,7 @@ public class ChangeAltitudeHandler extends AbstractClientMsgHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (msg.up()) {
|
if (msg.up()) {
|
||||||
pc.update(false);
|
pc.update();
|
||||||
pc.setDesiredAltitude(targetAlt);
|
pc.setDesiredAltitude(targetAlt);
|
||||||
pc.setTakeOffTime(System.currentTimeMillis());
|
pc.setTakeOffTime(System.currentTimeMillis());
|
||||||
} else {
|
} else {
|
||||||
@@ -161,7 +158,7 @@ public class ChangeAltitudeHandler extends AbstractClientMsgHandler {
|
|||||||
} else
|
} else
|
||||||
pc.setDesiredAltitude(targetAlt);
|
pc.setDesiredAltitude(targetAlt);
|
||||||
|
|
||||||
pc.update(false);
|
pc.update();
|
||||||
|
|
||||||
|
|
||||||
pc.setTakeOffTime(System.currentTimeMillis());
|
pc.setTakeOffTime(System.currentTimeMillis());
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ public class CityDataHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
// If the hotZone has changed then update the client's map accordingly.
|
// If the hotZone has changed then update the client's map accordingly.
|
||||||
|
|
||||||
if (playerCharacter.getTimestamps().containsKey("hotzoneupdate") && playerCharacter.getTimeStamp("hotzoneupdate") <= ZoneManager.hotZoneLastUpdate.toEpochMilli() && ZoneManager.hotZone != null) {
|
if (playerCharacter.getTimeStamp("hotzoneupdate") <= ZoneManager.hotZoneLastUpdate.toEpochMilli() && ZoneManager.hotZone != null) {
|
||||||
HotzoneChangeMsg hotzoneChangeMsg = new HotzoneChangeMsg(Enum.GameObjectType.Zone.ordinal(), ZoneManager.hotZone.getObjectUUID());
|
HotzoneChangeMsg hotzoneChangeMsg = new HotzoneChangeMsg(Enum.GameObjectType.Zone.ordinal(), ZoneManager.hotZone.getObjectUUID());
|
||||||
dispatch = Dispatch.borrow(playerCharacter, hotzoneChangeMsg);
|
dispatch = Dispatch.borrow(playerCharacter, hotzoneChangeMsg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ public class DestroyBuildingHandler extends AbstractClientMsgHandler {
|
|||||||
if (city != null)
|
if (city != null)
|
||||||
bane = city.getBane();
|
bane = city.getBane();
|
||||||
|
|
||||||
if (bane != null){// && bane.getSiegePhase() == Enum.SiegePhase.WAR) {
|
if (bane != null && bane.getSiegePhase() == Enum.SiegePhase.WAR) {
|
||||||
ErrorPopupMsg.sendErrorPopup(pc, 171);
|
ErrorPopupMsg.sendErrorPopup(pc, 171);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ public class GroupInviteResponseHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
// Run Keyclone Audit
|
// Run Keyclone Audit
|
||||||
|
|
||||||
//KEYCLONEAUDIT.audit(player, group);
|
KEYCLONEAUDIT.audit(player, group);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ public class HirelingServiceMsgHandler extends AbstractClientMsgHandler {
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
||||||
npc.setSpecialPrice(msg.repairCost);
|
npc.setRepairCost(msg.repairCost);
|
||||||
ManageNPCMsg outMsg = new ManageNPCMsg(npc);
|
ManageNPCMsg outMsg = new ManageNPCMsg(npc);
|
||||||
Dispatch dispatch = Dispatch.borrow(player, msg);
|
Dispatch dispatch = Dispatch.borrow(player, msg);
|
||||||
|
|
||||||
|
|||||||
@@ -360,11 +360,6 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
|
|||||||
targetItem.recycle(vendor);
|
targetItem.recycle(vendor);
|
||||||
vendor.removeItemFromForge(targetItem);
|
vendor.removeItemFromForge(targetItem);
|
||||||
|
|
||||||
//refund the gold for cancelled item
|
|
||||||
if(vendor.building.getStrongboxValue() + targetItem.getItemBase().getBaseValue() < 15000000){
|
|
||||||
vendor.building.setStrongboxValue(vendor.building.getStrongboxValue() + targetItem.getItemBase().getBaseValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Refresh vendor's inventory to client
|
// Refresh vendor's inventory to client
|
||||||
|
|
||||||
outMsg = new ManageNPCMsg(vendor);
|
outMsg = new ManageNPCMsg(vendor);
|
||||||
|
|||||||
@@ -62,23 +62,16 @@ public class MOTDEditHandler extends AbstractClientMsgHandler {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == 1) { // Guild MOTD
|
if (type == 1) // Guild MOTD
|
||||||
msg.setMessage(guild.getMOTD());
|
msg.setMessage(guild.getMOTD());
|
||||||
guild.updateDatabase();
|
else if (type == 3) // IC MOTD
|
||||||
}else if (type == 3) { // IC MOTD
|
|
||||||
msg.setMessage(guild.getICMOTD());
|
msg.setMessage(guild.getICMOTD());
|
||||||
guild.updateDatabase();
|
else if (type == 0) { // Nation MOTD
|
||||||
}else if (type == 0) { // Nation MOTD
|
|
||||||
Guild nation = guild.getNation();
|
Guild nation = guild.getNation();
|
||||||
if (nation == null || !nation.isNation()) {
|
if (nation == null || !nation.isNation()) {
|
||||||
ErrorPopupMsg.sendErrorMsg(playerCharacter, "You do not have such authority!");
|
ErrorPopupMsg.sendErrorMsg(playerCharacter, "You do not have such authority!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
nation.setNMOTD(msg.getMessage());
|
|
||||||
nation.updateDatabase();
|
|
||||||
for(Guild sub : nation.getSubGuildList()){
|
|
||||||
sub.setNMOTD(nation.getNMOTD());
|
|
||||||
}
|
|
||||||
msg.setMessage(nation.getMOTD());
|
msg.setMessage(nation.getMOTD());
|
||||||
}
|
}
|
||||||
dispatch = Dispatch.borrow(playerCharacter, msg);
|
dispatch = Dispatch.borrow(playerCharacter, msg);
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ import engine.powers.PowersBase;
|
|||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @Author:
|
* @Author:
|
||||||
@@ -106,7 +105,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
// Validate player can obtain blessing
|
// Validate player can obtain blessing
|
||||||
|
|
||||||
if (!GuildStatusController.isGuildLeader(player.getGuildStatus())) {
|
if (GuildStatusController.isGuildLeader(player.getGuildStatus()) == false) {
|
||||||
ErrorPopupMsg.sendErrorPopup(player, 173); // You must be the leader of a guild to receive a blessing
|
ErrorPopupMsg.sendErrorPopup(player, 173); // You must be the leader of a guild to receive a blessing
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -127,12 +126,12 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
realm = RealmMap.getRealmForCity(city);
|
realm = RealmMap.getRealmForCity(city);
|
||||||
|
|
||||||
if (!realm.getCanBeClaimed()) {
|
if (realm.getCanBeClaimed() == false) {
|
||||||
ErrorPopupMsg.sendErrorPopup(player, 180); // This territory cannot be ruled by anyone
|
ErrorPopupMsg.sendErrorPopup(player, 180); // This territory cannot be ruled by anyone
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (realm.isRuled()) {
|
if (realm.isRuled() == true) {
|
||||||
ErrorPopupMsg.sendErrorPopup(player, 178); // This territory is already claimed
|
ErrorPopupMsg.sendErrorPopup(player, 178); // This territory is already claimed
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -143,12 +142,12 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void requestBoon(PlayerCharacter player, NPC npc) {
|
private static void requestBoon(MerchantMsg msg, ClientConnection origin, PlayerCharacter player, NPC npc) {
|
||||||
|
|
||||||
Building shrineBuilding;
|
Building shrineBuilding;
|
||||||
Shrine shrine;
|
Shrine shrine;
|
||||||
|
|
||||||
if (!npc.getGuild().getNation().equals(player.getGuild().getNation()))
|
if (npc.getGuild() != player.getGuild())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
shrineBuilding = npc.getBuilding();
|
shrineBuilding = npc.getBuilding();
|
||||||
@@ -156,7 +155,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
if (shrineBuilding == null)
|
if (shrineBuilding == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (shrineBuilding.getBlueprint() != null && !shrineBuilding.getBlueprint().getBuildingGroup().equals(engine.Enum.BuildingGroup.SHRINE))
|
if (shrineBuilding.getBlueprint() != null && shrineBuilding.getBlueprint().getBuildingGroup() != engine.Enum.BuildingGroup.SHRINE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (shrineBuilding.getRank() == -1)
|
if (shrineBuilding.getRank() == -1)
|
||||||
@@ -172,9 +171,11 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//already haz boon.
|
||||||
|
|
||||||
if (player.containsEffect(shrine.getShrineType().getPowerToken())) {
|
if (player.containsEffect(shrine.getShrineType().getPowerToken())) {
|
||||||
//remove old boon to apply new one, allows boon refreshing
|
ErrorPopupMsg.sendErrorPopup(player, 199);
|
||||||
player.effects.remove(PowersManager.getPowerByToken(shrine.getShrineType().getPowerToken()).name);
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Shrine.canTakeFavor(player, shrine))
|
if (!Shrine.canTakeFavor(player, shrine))
|
||||||
@@ -190,31 +191,16 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int trains = 0;
|
int rank = shrine.getRank();
|
||||||
switch(npc.getRank()){
|
//R8 trees always get atleast rank 2 boons. rank uses index, where 0 is first place, 1 is second, etc...
|
||||||
case 1:
|
if (shrineBuilding.getCity() != null && shrineBuilding.getCity().getTOL() != null && shrineBuilding.getCity().getTOL().getRank() == 8)
|
||||||
trains = 10;
|
if (rank != 0)
|
||||||
break;
|
rank = 1;
|
||||||
case 2:
|
int trains = 40 - (rank * 10);
|
||||||
trains = 15;
|
if (trains < 0)
|
||||||
break;
|
trains = 0;
|
||||||
case 3:
|
|
||||||
trains = 20;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
trains = 25;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
trains = 30;
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
trains = 35;
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
trains = 40;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
//System.out.println(trains);
|
||||||
PowersManager.applyPower(player, player, player.getLoc(), shrinePower.getToken(), trains, false);
|
PowersManager.applyPower(player, player, player.getLoc(), shrinePower.getToken(), trains, false);
|
||||||
ChatManager.chatGuildInfo(player.getGuild(), player.getName() + " has recieved a boon costing " + 1 + " point of favor.");
|
ChatManager.chatGuildInfo(player.getGuild(), player.getName() + " has recieved a boon costing " + 1 + " point of favor.");
|
||||||
shrineBuilding.addEffectBit(1000000 << 2);
|
shrineBuilding.addEffectBit(1000000 << 2);
|
||||||
@@ -274,31 +260,9 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (targetCity == null){
|
if (targetCity == null)
|
||||||
Mine mineTele = null;
|
|
||||||
for(Mine mine : Mine.getMinesToTeleportTo(player)){
|
|
||||||
if(mine.getObjectUUID() == msg.getCityID()){
|
|
||||||
mineTele = mine;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(mineTele == null){
|
|
||||||
return;
|
return;
|
||||||
}else {
|
|
||||||
int time = MBServerStatics.TELEPORT_TIME_IN_SECONDS;
|
|
||||||
msg.setTeleportTime(time);
|
|
||||||
Building tower = Mine.getTower(mineTele);
|
|
||||||
if (tower == null)
|
|
||||||
return;
|
|
||||||
Vector3fImmutable teleportLoc = Vector3fImmutable.getRandomPointOnCircle(tower.getLoc(), 10);
|
|
||||||
ChatManager.chatSystemInfo(player, "You Will Teleport To " + mineTele.getParentZone().getParent().getName() + "'s Mine In " + time + " Seconds.");
|
|
||||||
if (time > 0) {
|
|
||||||
//TODO add timer to teleport
|
|
||||||
TeleportJob tj = new TeleportJob(player, npc, teleportLoc, origin, true);
|
|
||||||
JobScheduler.getInstance().scheduleJob(tj, time * 1000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
//finish porting to a city
|
|
||||||
//verify level required to teleport or repledge
|
//verify level required to teleport or repledge
|
||||||
|
|
||||||
Guild toGuild = targetCity.getGuild();
|
Guild toGuild = targetCity.getGuild();
|
||||||
@@ -352,9 +316,6 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private static PowersBase getPowerforHermit(NPC npc) {
|
private static PowersBase getPowerforHermit(NPC npc) {
|
||||||
|
|
||||||
int contractID;
|
int contractID;
|
||||||
@@ -459,7 +420,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
|
|||||||
if (isHermit(npc))
|
if (isHermit(npc))
|
||||||
requestHermitBlessing(msg, origin, player, npc);
|
requestHermitBlessing(msg, origin, player, npc);
|
||||||
else
|
else
|
||||||
requestBoon(player, npc);
|
requestBoon(msg, origin, player, npc);
|
||||||
break;
|
break;
|
||||||
case 15:
|
case 15:
|
||||||
LeaderboardMessage lbm = new LeaderboardMessage();
|
LeaderboardMessage lbm = new LeaderboardMessage();
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import engine.gameManager.BuildingManager;
|
|||||||
import engine.gameManager.DbManager;
|
import engine.gameManager.DbManager;
|
||||||
import engine.gameManager.NPCManager;
|
import engine.gameManager.NPCManager;
|
||||||
import engine.gameManager.SessionManager;
|
import engine.gameManager.SessionManager;
|
||||||
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;
|
||||||
@@ -42,7 +41,6 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
if (player == null)
|
if (player == 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());
|
||||||
@@ -63,10 +61,10 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
Mob toRemove = Mob.getFromCache(minionMsg.getUUID());
|
Mob toRemove = Mob.getFromCache(minionMsg.getUUID());
|
||||||
|
|
||||||
if (!npc.getSiegeMinionMap().containsKey(toRemove))
|
if (!npc.siegeMinionMap.containsKey(toRemove))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
npc.getSiegeMinionMap().remove(toRemove);
|
npc.siegeMinionMap.remove(toRemove);
|
||||||
|
|
||||||
WorldGrid.RemoveWorldObject(toRemove);
|
WorldGrid.RemoveWorldObject(toRemove);
|
||||||
|
|
||||||
@@ -74,15 +72,19 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
toRemove.getParentZone().zoneMobSet.remove(toRemove);
|
toRemove.getParentZone().zoneMobSet.remove(toRemove);
|
||||||
|
|
||||||
DbManager.removeFromCache(toRemove);
|
DbManager.removeFromCache(toRemove);
|
||||||
PlayerCharacter petOwner = toRemove.getOwner();
|
|
||||||
|
if(toRemove.guardCaptain.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) {
|
||||||
|
PlayerCharacter petOwner = (PlayerCharacter) toRemove.guardCaptain;
|
||||||
|
|
||||||
if (petOwner != null) {
|
if (petOwner != null) {
|
||||||
petOwner.setPet(null);
|
petOwner.setPet(null);
|
||||||
toRemove.setOwner(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(petOwner, petMsg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// we Found the move to remove, lets break the for loop so it doesnt look for more.
|
// we Found the move to remove, lets break the for loop so it doesnt look for more.
|
||||||
|
|
||||||
@@ -115,7 +117,7 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
if (npc.getContractID() == 842)
|
if (npc.getContractID() == 842)
|
||||||
maxSlots = 1;
|
maxSlots = 1;
|
||||||
|
|
||||||
if (npc.getSiegeMinionMap().size() == maxSlots)
|
if (npc.siegeMinionMap.size() == maxSlots)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
int mobBase;
|
int mobBase;
|
||||||
@@ -146,42 +148,10 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
if (mobBase == 0)
|
if (mobBase == 0)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
Mob siegeMob = Mob.createSiegeMob(npc, mobBase, npc.getGuild(), zone, b.getLoc(), (short) 1);
|
Mob siegeMob = Mob.createSiegeMinion(npc, mobBase);
|
||||||
|
|
||||||
if (siegeMob == null)
|
if (siegeMob == null)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (siegeMob != null) {
|
|
||||||
|
|
||||||
siegeMob.setSpawnTime(60 * 15);
|
|
||||||
Building building = BuildingManager.getBuilding(((MinionTrainingMessage) baseMsg).getBuildingID());
|
|
||||||
|
|
||||||
siegeMob.building = building;
|
|
||||||
siegeMob.parentZone = zone;
|
|
||||||
|
|
||||||
// Slot siege minion
|
|
||||||
// Can be either corner tower or bulwark.
|
|
||||||
|
|
||||||
int slot;
|
|
||||||
|
|
||||||
if (building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.ARTYTOWER))
|
|
||||||
slot = 2;
|
|
||||||
else
|
|
||||||
slot = ((NPC) siegeMob.npcOwner).getSiegeMinionMap().get(siegeMob) + 1; // First slot is for the captain
|
|
||||||
|
|
||||||
BuildingLocation slotLocation = BuildingManager._slotLocations.get(building.meshUUID).get(slot);
|
|
||||||
siegeMob.bindLoc = building.getLoc().add(slotLocation.getLocation());
|
|
||||||
|
|
||||||
// Rotate slot position by the building rotation
|
|
||||||
|
|
||||||
siegeMob.bindLoc = Vector3fImmutable.rotateAroundPoint(building.getLoc(), siegeMob.bindLoc, building.getBounds().getQuaternion().angleY);
|
|
||||||
|
|
||||||
siegeMob.loc = new Vector3fImmutable(siegeMob.bindLoc);
|
|
||||||
siegeMob.endLoc = new Vector3fImmutable(siegeMob.bindLoc);
|
|
||||||
|
|
||||||
zone.zoneMobSet.add(siegeMob);
|
|
||||||
siegeMob.setLoc(siegeMob.bindLoc);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ManageNPCMsg mnm = new ManageNPCMsg(npc);
|
ManageNPCMsg mnm = new ManageNPCMsg(npc);
|
||||||
@@ -228,11 +198,14 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
toRemove.getParentZone().zoneMobSet.remove(toRemove);
|
toRemove.getParentZone().zoneMobSet.remove(toRemove);
|
||||||
|
|
||||||
DbManager.removeFromCache(toRemove);
|
DbManager.removeFromCache(toRemove);
|
||||||
PlayerCharacter petOwner = toRemove.getOwner();
|
|
||||||
|
|
||||||
|
PlayerCharacter petOwner = (PlayerCharacter) toRemove.guardCaptain;
|
||||||
|
|
||||||
if (petOwner != null) {
|
if (petOwner != null) {
|
||||||
petOwner.setPet(null);
|
petOwner.setPet(null);
|
||||||
toRemove.setOwner(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(petOwner, petMsg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
||||||
@@ -298,14 +271,14 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
String pirateName = NPCManager.getPirateName(mobBase);
|
String pirateName = NPCManager.getPirateName(mobBase);
|
||||||
|
|
||||||
if (!DbManager.MobQueries.ADD_TO_GUARDS(npc.getObjectUUID(), mobBase, pirateName, npc.getSiegeMinionMap().size() + 1))
|
Mob toCreate = Mob.createGuardMinion(npc, npc.getLevel(), pirateName);
|
||||||
return true;
|
|
||||||
|
|
||||||
Mob toCreate = Mob.createGuardMob(npc, npc.getGuild(), zone, building.getLoc(), npc.getLevel(), pirateName);
|
|
||||||
|
|
||||||
if (toCreate == null)
|
if (toCreate == null)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
if (!DbManager.MobQueries.ADD_TO_GUARDS(npc.getObjectUUID(), mobBase, pirateName, npc.getSiegeMinionMap().size() + 1))
|
||||||
|
return true;
|
||||||
|
|
||||||
if (toCreate != null) {
|
if (toCreate != null) {
|
||||||
toCreate.setDeathTime(System.currentTimeMillis());
|
toCreate.setDeathTime(System.currentTimeMillis());
|
||||||
toCreate.parentZone.zoneMobSet.add(toCreate);
|
toCreate.parentZone.zoneMobSet.add(toCreate);
|
||||||
|
|||||||
@@ -421,12 +421,31 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
|
|||||||
itemMan.consume(item);
|
itemMan.consume(item);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
//ANNIVERSERY GIFT
|
||||||
case 31:
|
case 31:
|
||||||
|
// *** Disabled for now: Needs bootyset created
|
||||||
|
|
||||||
|
//if (ib.getUUID() == 971012) {
|
||||||
|
// int random = ThreadLocalRandom.current().nextInt(ItemBase.AnniverseryGifts.size());
|
||||||
|
// int annyID = ItemBase.AnniverseryGifts.get(random);
|
||||||
|
|
||||||
|
// ItemBase annyIB = ItemBase.getItemBase(annyID);
|
||||||
|
// if (annyIB != null) {
|
||||||
|
// Item gift = MobLoot.createItemForPlayer(player, annyIB);
|
||||||
|
// if (gift != null) {
|
||||||
|
// itemMan.addItemToInventory(gift);
|
||||||
|
// itemMan.consume(item);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// break;
|
||||||
|
//}
|
||||||
|
|
||||||
LootManager.peddleFate(player,item);
|
LootManager.peddleFate(player,item);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 30: //water bucket
|
case 30: //water bucket
|
||||||
case 8: //potions, tears of saedron
|
case 8: //potions, tears of saedron
|
||||||
|
|
||||||
case 5: //runes, petition, warrant, scrolls
|
case 5: //runes, petition, warrant, scrolls
|
||||||
if (uuid > 3000 && uuid < 3050) { //Discipline Runes
|
if (uuid > 3000 && uuid < 3050) { //Discipline Runes
|
||||||
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
|
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
|
||||||
@@ -443,12 +462,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
|
|||||||
itemMan.consume(item);
|
itemMan.consume(item);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
} else if (uuid > 252122 && uuid < 252137) { //blood runes
|
} else if (uuid > 252122 && uuid < 252128) { //mastery runes
|
||||||
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
|
|
||||||
itemMan.consume(item);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
} else if (uuid > 252128 && uuid < 252128) { //mastery runes
|
|
||||||
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
|
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
|
||||||
itemMan.consume(item);
|
itemMan.consume(item);
|
||||||
}
|
}
|
||||||
@@ -514,6 +528,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Send piss bucket animation
|
// Send piss bucket animation
|
||||||
|
|
||||||
VisualUpdateMessage vum = new VisualUpdateMessage(player, 16323);
|
VisualUpdateMessage vum = new VisualUpdateMessage(player, 16323);
|
||||||
vum.configure();
|
vum.configure();
|
||||||
DispatchMessage.sendToAllInRange(player, vum);
|
DispatchMessage.sendToAllInRange(player, vum);
|
||||||
@@ -528,9 +543,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
dispatch = Dispatch.borrow(player, msg);
|
dispatch = Dispatch.borrow(player, msg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
||||||
if(!item.getItemBase().getType().equals(ItemType.POTION)) {
|
|
||||||
player.cancelOnSpell();
|
player.cancelOnSpell();
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default: //shouldn't be here, consume item
|
default: //shouldn't be here, consume item
|
||||||
dispatch = Dispatch.borrow(player, msg);
|
dispatch = Dispatch.borrow(player, msg);
|
||||||
|
|||||||
@@ -212,10 +212,6 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (AbstractCharacter guard : building.getHirelings().keySet()) {
|
|
||||||
if (guard.getObjectType() == GameObjectType.Mob)
|
|
||||||
((Mob) guard).setPatrolPointIndex(0);
|
|
||||||
}
|
|
||||||
} else if (building.getPatrolPoints() != null)
|
} else if (building.getPatrolPoints() != null)
|
||||||
ClearPatrolPoints(building.getObjectUUID());
|
ClearPatrolPoints(building.getObjectUUID());
|
||||||
|
|
||||||
@@ -223,10 +219,6 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
|
|||||||
AddSentryPoints(building.getObjectUUID(), orderNpcMsg.getSentryPoints());
|
AddSentryPoints(building.getObjectUUID(), orderNpcMsg.getSentryPoints());
|
||||||
} else if (building.getSentryPoints() != null)
|
} else if (building.getSentryPoints() != null)
|
||||||
ClearSentryPoints(building.getObjectUUID());
|
ClearSentryPoints(building.getObjectUUID());
|
||||||
|
|
||||||
// Dispatch dispatch = Dispatch.borrow(pc, msg);
|
|
||||||
// DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void processUpgradeNPC(PlayerCharacter player, AbstractCharacter abstractCharacter) {
|
private static void processUpgradeNPC(PlayerCharacter player, AbstractCharacter abstractCharacter) {
|
||||||
@@ -541,7 +533,7 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
} else if (orderNPCMsg.getObjectType() == GameObjectType.Mob.ordinal()) {
|
} else if (orderNPCMsg.getObjectType() == GameObjectType.Mob.ordinal()) {
|
||||||
|
|
||||||
mob = Mob.getFromCacheDBID(orderNPCMsg.getNpcUUID());
|
mob = Mob.getMob(orderNPCMsg.getNpcUUID());
|
||||||
|
|
||||||
if (mob == null)
|
if (mob == null)
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -135,8 +135,7 @@ public class TaxCityMsgHandler extends AbstractClientMsgHandler {
|
|||||||
|
|
||||||
msg = (TaxCityMsg) baseMsg;
|
msg = (TaxCityMsg) baseMsg;
|
||||||
|
|
||||||
//realm taxing disabled
|
ViewTaxes(msg, player);
|
||||||
//ViewTaxes(msg, player);
|
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -71,16 +70,18 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean applyRune(int runeID, ClientConnection origin, PlayerCharacter playerCharacter) {
|
public static boolean applyRune(int runeID, ClientConnection origin, PlayerCharacter playerCharacter) {
|
||||||
|
|
||||||
RuneBase rb = RuneBase.getRuneBase(runeID);
|
RuneBase rb = RuneBase.getRuneBase(runeID);
|
||||||
Dispatch dispatch;
|
Dispatch dispatch;
|
||||||
|
|
||||||
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) {
|
||||||
@@ -88,45 +89,11 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(runeID == 3040)
|
|
||||||
valid = true;
|
|
||||||
|
|
||||||
if(runeID == 3049)
|
|
||||||
valid = true;
|
|
||||||
|
|
||||||
if(raceID == 1999){
|
|
||||||
switch(runeID){
|
|
||||||
case 2514:
|
|
||||||
case 3036:
|
|
||||||
case 3033:
|
|
||||||
case 3001:
|
|
||||||
case 3002:
|
|
||||||
case 3003:
|
|
||||||
case 3004:
|
|
||||||
case 3008:
|
|
||||||
case 3009:
|
|
||||||
case 3013:
|
|
||||||
case 3016:
|
|
||||||
case 3017:
|
|
||||||
case 3018:
|
|
||||||
case 3020:
|
|
||||||
case 3021:
|
|
||||||
case 3030:
|
|
||||||
case 3031:
|
|
||||||
case 3037:
|
|
||||||
case 3045:
|
|
||||||
case 3046:
|
|
||||||
case 3047:
|
|
||||||
case 3048:
|
|
||||||
case 3049:
|
|
||||||
valid = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!valid) {
|
if (!valid) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Check base class is met
|
//Check base class is met
|
||||||
ConcurrentHashMap<Integer, Boolean> baseClasses = rb.getBaseClass();
|
ConcurrentHashMap<Integer, Boolean> baseClasses = rb.getBaseClass();
|
||||||
if (baseClasses.size() > 0) {
|
if (baseClasses.size() > 0) {
|
||||||
@@ -138,23 +105,15 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
break;
|
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) {
|
if (!valid) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Check promotion class is met
|
//Check promotion class is met
|
||||||
ConcurrentHashMap<Integer, Boolean> promotionClasses = rb.getPromotionClass();
|
ConcurrentHashMap<Integer, Boolean> promotionClasses = rb.getPromotionClass();
|
||||||
if (promotionClasses.size() > 0) {
|
if (promotionClasses.size() > 0) {
|
||||||
int promotionClassID = playerCharacter.getPromotionClassID();
|
int promotionClassID = playerCharacter.getPromotionClassID();
|
||||||
int baseClassID = playerCharacter.getBaseClassID();
|
|
||||||
boolean valid = false;
|
boolean valid = false;
|
||||||
for (int validID : promotionClasses.keySet()) {
|
for (int validID : promotionClasses.keySet()) {
|
||||||
if (validID == promotionClassID) {
|
if (validID == promotionClassID) {
|
||||||
@@ -162,27 +121,11 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
break;
|
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(runeID == 3028 && (raceID == 2013 || raceID == 2014) && playerCharacter.getBaseClassID() == 2501)
|
|
||||||
valid = true;
|
|
||||||
if(runeID == 3035 && baseClassID == 2501)
|
|
||||||
valid = true;
|
|
||||||
if (!valid) {
|
if (!valid) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else{
|
|
||||||
if(playerCharacter.getPromotionClassID() == 2519){//priest
|
|
||||||
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();
|
||||||
@@ -196,6 +139,7 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int discCount = 0;
|
int discCount = 0;
|
||||||
for (CharacterRune cr : runes) {
|
for (CharacterRune cr : runes) {
|
||||||
int runeBaseID = cr.getRuneBaseID();
|
int runeBaseID = cr.getRuneBaseID();
|
||||||
@@ -208,35 +152,28 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Check level is met
|
//Check level is met
|
||||||
if (playerCharacter.getLevel() < rb.getLevelRequired()) {
|
if (playerCharacter.getLevel() < rb.getLevelRequired()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int strTotal = 0;
|
int strTotal = 0;
|
||||||
int dexTotal = 0;
|
int dexTotal = 0;
|
||||||
int conTotal = 0;
|
int conTotal = 0;
|
||||||
int intTotal = 0;
|
int intTotal = 0;
|
||||||
int spiTotal = 0;
|
int spiTotal = 0;
|
||||||
int cost = 0;
|
int cost = 0;
|
||||||
|
|
||||||
//Check any attributes are met
|
//Check any attributes are met
|
||||||
ArrayList<RuneBaseAttribute> attrs = rb.getAttrs();
|
ArrayList<RuneBaseAttribute> attrs = rb.getAttrs();
|
||||||
|
|
||||||
if (rb.getAttrs() != null)
|
if (rb.getAttrs() != null)
|
||||||
for (RuneBaseAttribute rba : attrs) {
|
for (RuneBaseAttribute rba : attrs) {
|
||||||
int attrID = rba.getAttributeID();
|
int attrID = rba.getAttributeID();
|
||||||
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":
|
|
||||||
case "Scion of the Dar Khelegeur":
|
|
||||||
case "Scion of the Gwaridorn":
|
|
||||||
case "Scion of the Twathedilion":
|
|
||||||
mod = 0;
|
|
||||||
}
|
|
||||||
if (mod > playerCharacter.getUnusedStatPoints()) {
|
if (mod > playerCharacter.getUnusedStatPoints()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -289,64 +226,25 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Check if max number runes already reached
|
//Check if max number runes already reached
|
||||||
if (runes.size() > 12) {
|
if (runes.size() > 12) {
|
||||||
ChatManager.chatSystemInfo(playerCharacter,"You Have Too Many Runes Applied");
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "Scion of the Dar Khelegeur":
|
|
||||||
case "Scion of the Gwaridorn":
|
|
||||||
case "Scion of the Twathedilion":
|
|
||||||
for (CharacterRune charRune : playerCharacter.getRunes()) {
|
|
||||||
RuneBase rb2 = charRune.getRuneBase();
|
|
||||||
switch (rb2.getName()) {
|
|
||||||
case "Scion of the Dar Khelegeur":
|
|
||||||
case "Scion of the Gwaridorn":
|
|
||||||
case "Scion of the Twathedilion":
|
|
||||||
ChatManager.chatSystemError(playerCharacter, "You Have Already Applied A Blood Rune");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
//if discipline, check number applied
|
//if discipline, check number applied
|
||||||
if (isDiscipline(runeID)) {
|
if (isDiscipline(runeID)) {
|
||||||
switch(playerCharacter.getRank()){
|
if (playerCharacter.getLevel() < 70) {
|
||||||
case 1:
|
if (discCount > 2) {
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
case 4:
|
|
||||||
case 5:
|
|
||||||
case 6:
|
|
||||||
if(discCount > 3)
|
|
||||||
return false;
|
return false;
|
||||||
break;
|
}
|
||||||
case 7:
|
} else {
|
||||||
case 8:
|
if (discCount > 3) {
|
||||||
if(discCount > 5)
|
|
||||||
return false;
|
return false;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//Everything succeeded. Let's apply the rune
|
//Everything succeeded. Let's apply the rune
|
||||||
//Attempt add rune to database
|
//Attempt add rune to database
|
||||||
CharacterRune runeWithoutID = new CharacterRune(rb, playerCharacter.getObjectUUID());
|
CharacterRune runeWithoutID = new CharacterRune(rb, playerCharacter.getObjectUUID());
|
||||||
@@ -360,6 +258,7 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
if (cr == null) {
|
if (cr == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//remove any overridden runes from player
|
//remove any overridden runes from player
|
||||||
ArrayList<Integer> overwrite = rb.getOverwrite();
|
ArrayList<Integer> overwrite = rb.getOverwrite();
|
||||||
CharacterRune toRemove = null;
|
CharacterRune toRemove = null;
|
||||||
@@ -368,10 +267,13 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
toRemove = playerCharacter.removeRune(overwriteID);
|
toRemove = playerCharacter.removeRune(overwriteID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//add rune to player
|
//add rune to player
|
||||||
playerCharacter.addRune(cr);
|
playerCharacter.addRune(cr);
|
||||||
|
|
||||||
// recalculate all bonuses/formulas/skills/powers
|
// recalculate all bonuses/formulas/skills/powers
|
||||||
playerCharacter.recalculate();
|
playerCharacter.recalculate();
|
||||||
|
|
||||||
//if overwriting a stat rune, add any amount granted from previous rune.
|
//if overwriting a stat rune, add any amount granted from previous rune.
|
||||||
if (toRemove != null) {
|
if (toRemove != null) {
|
||||||
RuneBase rbs = toRemove.getRuneBase();
|
RuneBase rbs = toRemove.getRuneBase();
|
||||||
@@ -397,35 +299,30 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
if (dif > 0 && spiTotal < (int) playerCharacter.statSpiMax) {
|
if (dif > 0 && spiTotal < (int) playerCharacter.statSpiMax) {
|
||||||
playerCharacter.addSpi(dif);
|
playerCharacter.addSpi(dif);
|
||||||
}
|
}
|
||||||
|
|
||||||
// recalculate all bonuses/formulas/skills/powers
|
// recalculate all bonuses/formulas/skills/powers
|
||||||
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":
|
|
||||||
case "Scion of the Dar Khelegeur":
|
|
||||||
case "Scion of the Gwaridorn":
|
|
||||||
case "Scion of the Twathedilion":
|
|
||||||
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);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
||||||
}
|
}
|
||||||
|
|
||||||
//send apply rune message to client
|
//send apply rune message to client
|
||||||
ApplyRuneMsg arm = new ApplyRuneMsg(playerCharacter.getObjectType().ordinal(), playerCharacter.getObjectUUID(), runeID, cr.getObjectType().ordinal(), cr.getObjectUUID(), false);
|
ApplyRuneMsg arm = new ApplyRuneMsg(playerCharacter.getObjectType().ordinal(), playerCharacter.getObjectUUID(), runeID, cr.getObjectType().ordinal(), cr.getObjectUUID(), false);
|
||||||
dispatch = Dispatch.borrow(playerCharacter, arm);
|
dispatch = Dispatch.borrow(playerCharacter, arm);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
||||||
|
|
||||||
|
|
||||||
//alert them of success
|
//alert them of success
|
||||||
ErrorPopupMsg.sendErrorPopup(playerCharacter, 160);
|
ErrorPopupMsg.sendErrorPopup(playerCharacter, 160);
|
||||||
|
|
||||||
//reapply bonuses
|
//reapply bonuses
|
||||||
playerCharacter.applyBonuses();
|
playerCharacter.applyBonuses();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -112,12 +112,6 @@ public class BuyFromNPCWindowMsg extends ClientNetMsg {
|
|||||||
|
|
||||||
if (contract != null)
|
if (contract != null)
|
||||||
sellInventory = contract.getSellInventory();
|
sellInventory = contract.getSellInventory();
|
||||||
//if(npc.contract.getObjectUUID() == 890){ // default steward
|
|
||||||
// sellInventory = npc.getSellInventorySteward();
|
|
||||||
// }
|
|
||||||
//if(npc.contract.getObjectUUID() == 889){ // default builder
|
|
||||||
// sellInventory = npc.getSellInventoryBuilder();
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (man != null)
|
if (man != null)
|
||||||
|
|||||||
@@ -104,10 +104,8 @@ public class CityDataMsg extends ClientNetMsg {
|
|||||||
}
|
}
|
||||||
|
|
||||||
temp.putInt(mineList.size());
|
temp.putInt(mineList.size());
|
||||||
for (Mine mine : mineList) {
|
for (Mine mine : mineList)
|
||||||
if(mine.getParentZone() != null && !mine.getParentZone().isContinent())
|
|
||||||
Mine.serializeForClientMsg(mine, temp);
|
Mine.serializeForClientMsg(mine, temp);
|
||||||
}
|
|
||||||
temp.put((byte) 0); // PAD
|
temp.put((byte) 0); // PAD
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,10 +178,8 @@ public class CityDataMsg extends ClientNetMsg {
|
|||||||
}
|
}
|
||||||
|
|
||||||
writer.putInt(mineList.size());
|
writer.putInt(mineList.size());
|
||||||
for (Mine mine : mineList) {
|
for (Mine mine : mineList)
|
||||||
if(mine.getParentZone() != null && !mine.getParentZone().isContinent())
|
|
||||||
Mine.serializeForClientMsg(mine, writer);
|
Mine.serializeForClientMsg(mine, writer);
|
||||||
}
|
|
||||||
} else
|
} else
|
||||||
writer.putInt(0);
|
writer.putInt(0);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|||||||
@@ -275,7 +275,7 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
|
|||||||
|
|
||||||
writer.putString(npcHire.getName());
|
writer.putString(npcHire.getName());
|
||||||
writer.putInt(1);
|
writer.putInt(1);
|
||||||
writer.putInt(0);
|
writer.putInt(Blueprint.getNpcMaintCost(npcHire.getRank()));
|
||||||
if (npcHire.getObjectType() == GameObjectType.NPC)
|
if (npcHire.getObjectType() == GameObjectType.NPC)
|
||||||
writer.putInt(((NPC) npcHire).getContract().getIconID()); // Was 60
|
writer.putInt(((NPC) npcHire).getContract().getIconID()); // Was 60
|
||||||
else if (npcHire.getObjectType() == GameObjectType.Mob) {
|
else if (npcHire.getObjectType() == GameObjectType.Mob) {
|
||||||
@@ -392,9 +392,9 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
|
|||||||
writer.putInt(bane.getSiegePhase().ordinal()); //1 challenge //2 standoff //3 war
|
writer.putInt(bane.getSiegePhase().ordinal()); //1 challenge //2 standoff //3 war
|
||||||
writer.put((byte) 0);
|
writer.put((byte) 0);
|
||||||
|
|
||||||
//if (!bane.isAccepted() && this.assetManager.getGuild() == banedCity.getGuild() && GuildStatusController.isInnerCouncil(this.assetManager.getGuildStatus()))
|
if (!bane.isAccepted() && this.assetManager.getGuild() == banedCity.getGuild() && GuildStatusController.isInnerCouncil(this.assetManager.getGuildStatus()))
|
||||||
// writer.put((byte) 1); //canSetTime
|
writer.put((byte) 1); //canSetTime
|
||||||
//else
|
else
|
||||||
writer.put((byte) 0);
|
writer.put((byte) 0);
|
||||||
|
|
||||||
DateTime placedOn = bane.getLiveDate();
|
DateTime placedOn = bane.getLiveDate();
|
||||||
@@ -485,19 +485,36 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
|
|||||||
|
|
||||||
writer.putInt(building.getRank());
|
writer.putInt(building.getRank());
|
||||||
|
|
||||||
|
// Maintenance costs include resource if
|
||||||
|
// this structure is an R8 tree
|
||||||
|
|
||||||
|
if (building.getRank() == 8)
|
||||||
|
writer.putInt(5); // Resources included
|
||||||
|
else
|
||||||
writer.putInt(1); // Gold only
|
writer.putInt(1); // Gold only
|
||||||
|
|
||||||
writer.putInt(2308551); //Gold
|
writer.putInt(2308551); //Gold
|
||||||
if (building.getBlueprint() == null)
|
if (building.getBlueprint() == null)
|
||||||
writer.putInt(0);
|
writer.putInt(0);
|
||||||
else
|
else
|
||||||
writer.putInt(building.getBlueprint().getMaintCost()); // maint cost
|
writer.putInt(building.getBlueprint().getMaintCost(building.getRank())); // maint cost
|
||||||
|
|
||||||
|
if (building.getRank() == 8) {
|
||||||
|
writer.putInt(74856115); // Stone
|
||||||
|
writer.putInt(1500); // maint cost
|
||||||
|
writer.putInt(-1603256692); // Lumber
|
||||||
|
writer.putInt(1500); // maint cost
|
||||||
|
writer.putInt(-1596311545); // Galvor
|
||||||
|
writer.putInt(5); // maint cost
|
||||||
|
writer.putInt(1532478436); // Wormwood
|
||||||
|
writer.putInt(5); // maint cost
|
||||||
|
}
|
||||||
|
|
||||||
LocalDateTime maintDate = building.maintDateTime;
|
LocalDateTime maintDate = building.maintDateTime;
|
||||||
|
|
||||||
if (maintDate == null)
|
if (maintDate == null)
|
||||||
maintDate = LocalDateTime.now();
|
maintDate = LocalDateTime.now();
|
||||||
writer.putLocalDateTime(maintDate); // current time
|
writer.putLocalDateTime(LocalDateTime.now()); // current time
|
||||||
|
|
||||||
// utc offset?
|
// utc offset?
|
||||||
writer.putInt((int) java.time.Duration.between(LocalDateTime.now(), maintDate).getSeconds()); // Seconds to maint date
|
writer.putInt((int) java.time.Duration.between(LocalDateTime.now(), maintDate).getSeconds()); // Seconds to maint date
|
||||||
|
|||||||
@@ -343,7 +343,7 @@ public class ManageNPCMsg extends ClientNetMsg {
|
|||||||
writer.putInt(0); //runemaster list
|
writer.putInt(0); //runemaster list
|
||||||
|
|
||||||
//artillery captain list
|
//artillery captain list
|
||||||
ConcurrentHashMap<Mob, Integer> siegeMinions = npc.getSiegeMinionMap();
|
ConcurrentHashMap<Mob, Integer> siegeMinions = npc.siegeMinionMap;
|
||||||
writer.putInt(1 + siegeMinions.size());
|
writer.putInt(1 + siegeMinions.size());
|
||||||
serializeBulwarkList(writer, 1); //Trebuchet
|
serializeBulwarkList(writer, 1); //Trebuchet
|
||||||
//serializeBulwarkList(writer, 2); //Ballista
|
//serializeBulwarkList(writer, 2); //Ballista
|
||||||
@@ -366,7 +366,7 @@ public class ManageNPCMsg extends ClientNetMsg {
|
|||||||
long timeLife = upgradeTime - curTime;
|
long timeLife = upgradeTime - curTime;
|
||||||
|
|
||||||
if (upgradeTime * 1000 > System.currentTimeMillis()) {
|
if (upgradeTime * 1000 > System.currentTimeMillis()) {
|
||||||
if (mob.npcOwner.isAlive()) {
|
if (mob.guardCaptain.isAlive()) {
|
||||||
writer.put((byte) 0);//shows respawning timer
|
writer.put((byte) 0);//shows respawning timer
|
||||||
writer.putInt(mob.spawnTime);
|
writer.putInt(mob.spawnTime);
|
||||||
writer.putInt(mob.spawnTime);
|
writer.putInt(mob.spawnTime);
|
||||||
@@ -503,7 +503,7 @@ public class ManageNPCMsg extends ClientNetMsg {
|
|||||||
writer.putInt(0);
|
writer.putInt(0);
|
||||||
writer.putString("Repair items");
|
writer.putString("Repair items");
|
||||||
writer.putString("percent");
|
writer.putString("percent");
|
||||||
writer.putInt(npc.getSpecialPrice()); //cost for repair
|
writer.putInt(npc.getRepairCost()); //cost for repair
|
||||||
writer.putInt(0);
|
writer.putInt(0);
|
||||||
|
|
||||||
ArrayList<Integer> modPrefixList = npc.getModTypeTable();
|
ArrayList<Integer> modPrefixList = npc.getModTypeTable();
|
||||||
@@ -557,7 +557,7 @@ public class ManageNPCMsg extends ClientNetMsg {
|
|||||||
|
|
||||||
} else if (this.targetType == GameObjectType.Mob.ordinal()) {
|
} else if (this.targetType == GameObjectType.Mob.ordinal()) {
|
||||||
|
|
||||||
mobA = Mob.getFromCacheDBID(this.targetID);
|
mobA = Mob.getMob(this.targetID);
|
||||||
|
|
||||||
if (mobA == null) {
|
if (mobA == null) {
|
||||||
Logger.error("Missing Mob of ID " + this.targetID);
|
Logger.error("Missing Mob of ID " + this.targetID);
|
||||||
@@ -689,7 +689,7 @@ public class ManageNPCMsg extends ClientNetMsg {
|
|||||||
long timeLife = upgradeTime - curTime;
|
long timeLife = upgradeTime - curTime;
|
||||||
|
|
||||||
if (upgradeTime * 1000 > System.currentTimeMillis()) {
|
if (upgradeTime * 1000 > System.currentTimeMillis()) {
|
||||||
if (mob.npcOwner.isAlive()) {
|
if (mob.guardCaptain.isAlive()) {
|
||||||
writer.put((byte) 0);//shows respawning timer
|
writer.put((byte) 0);//shows respawning timer
|
||||||
writer.putInt(mob.spawnTime);
|
writer.putInt(mob.spawnTime);
|
||||||
writer.putInt(mob.spawnTime);
|
writer.putInt(mob.spawnTime);
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ package engine.net.client.msg;
|
|||||||
|
|
||||||
|
|
||||||
import engine.gameManager.ConfigManager;
|
import engine.gameManager.ConfigManager;
|
||||||
import engine.gameManager.DbManager;
|
|
||||||
import engine.net.AbstractConnection;
|
import engine.net.AbstractConnection;
|
||||||
import engine.net.ByteBufferReader;
|
import engine.net.ByteBufferReader;
|
||||||
import engine.net.ByteBufferWriter;
|
import engine.net.ByteBufferWriter;
|
||||||
@@ -54,45 +53,18 @@ public class ServerInfoMsg extends ClientNetMsg {
|
|||||||
|
|
||||||
writer.putInt(WorldServer.worldMapID);
|
writer.putInt(WorldServer.worldMapID);
|
||||||
writer.putString(ConfigManager.MB_WORLD_NAME.getValue());
|
writer.putString(ConfigManager.MB_WORLD_NAME.getValue());
|
||||||
int TotalTrees = 21;
|
if (LoginServer.population < MBServerStatics.LOW_POPULATION)
|
||||||
int currentR8Trees = DbManager.CityQueries.GET_CAPITAL_CITY_COUNT();
|
|
||||||
|
|
||||||
switch(currentR8Trees){
|
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
case 4:
|
|
||||||
writer.putInt(0); //Land Rush
|
writer.putInt(0); //Land Rush
|
||||||
break;
|
else if (LoginServer.population < MBServerStatics.NORMAL_POPULATION)
|
||||||
case 5:
|
|
||||||
case 6:
|
|
||||||
case 7:
|
|
||||||
case 8:
|
|
||||||
writer.putInt(1); //Low pop
|
writer.putInt(1); //Low pop
|
||||||
break;
|
else if (LoginServer.population < MBServerStatics.HIGH_POPULATION)
|
||||||
case 9:
|
|
||||||
case 10:
|
|
||||||
case 11:
|
|
||||||
case 12:
|
|
||||||
writer.putInt(2); //Normal pop
|
writer.putInt(2); //Normal pop
|
||||||
break;
|
else if (LoginServer.population < MBServerStatics.VERY_OVERPOPULATED_POPULATION)
|
||||||
case 13:
|
|
||||||
case 14:
|
|
||||||
case 15:
|
|
||||||
case 16:
|
|
||||||
writer.putInt(3); //High Pop
|
writer.putInt(3); //High Pop
|
||||||
break;
|
else if (LoginServer.population < MBServerStatics.FULL_POPULATION)
|
||||||
case 17:
|
|
||||||
case 18:
|
|
||||||
case 19:
|
|
||||||
case 20:
|
|
||||||
writer.putInt(4); //Very overpopulated pop
|
writer.putInt(4); //Very overpopulated pop
|
||||||
break;
|
else
|
||||||
default:
|
|
||||||
writer.putInt(5); //Full pop
|
writer.putInt(5); //Full pop
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -16,9 +16,7 @@ import engine.net.ByteBufferReader;
|
|||||||
import engine.net.ByteBufferWriter;
|
import engine.net.ByteBufferWriter;
|
||||||
import engine.net.client.Protocol;
|
import engine.net.client.Protocol;
|
||||||
import engine.objects.City;
|
import engine.objects.City;
|
||||||
import engine.objects.Mine;
|
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
import org.pmw.tinylog.Logger;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
@@ -26,7 +24,6 @@ import java.util.ArrayList;
|
|||||||
public class TeleportRepledgeListMsg extends ClientNetMsg {
|
public class TeleportRepledgeListMsg extends ClientNetMsg {
|
||||||
|
|
||||||
ArrayList<City> cities;
|
ArrayList<City> cities;
|
||||||
ArrayList<Mine> mines;
|
|
||||||
private PlayerCharacter player;
|
private PlayerCharacter player;
|
||||||
private boolean isTeleport;
|
private boolean isTeleport;
|
||||||
|
|
||||||
@@ -80,19 +77,10 @@ public class TeleportRepledgeListMsg extends ClientNetMsg {
|
|||||||
|
|
||||||
public void configure() {
|
public void configure() {
|
||||||
|
|
||||||
if (isTeleport) {
|
if (isTeleport)
|
||||||
cities = City.getCitiesToTeleportTo(player);
|
cities = City.getCitiesToTeleportTo(player);
|
||||||
try {
|
else
|
||||||
mines = Mine.getMinesToTeleportTo(player);
|
|
||||||
if(mines == null)
|
|
||||||
mines = new ArrayList<>();
|
|
||||||
}catch(Exception e){
|
|
||||||
Logger.error("Unable To Load Mines For Teleport: " + e.getMessage());
|
|
||||||
}
|
|
||||||
}else {
|
|
||||||
cities = City.getCitiesToRepledgeTo(player);
|
cities = City.getCitiesToRepledgeTo(player);
|
||||||
mines = new ArrayList<>();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -108,14 +96,10 @@ public class TeleportRepledgeListMsg extends ClientNetMsg {
|
|||||||
for (int i = 0; i < 3; i++)
|
for (int i = 0; i < 3; i++)
|
||||||
writer.putInt(0);
|
writer.putInt(0);
|
||||||
|
|
||||||
writer.putInt(cities.size() + mines.size());
|
writer.putInt(cities.size());
|
||||||
|
|
||||||
for (City city : cities)
|
for (City city : cities)
|
||||||
City.serializeForClientMsg(city, writer);
|
City.serializeForClientMsg(city, writer);
|
||||||
|
|
||||||
for(Mine mine : mines)
|
|
||||||
Mine.serializeForClientMsgTeleport(mine, writer);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public PlayerCharacter getPlayer() {
|
public PlayerCharacter getPlayer() {
|
||||||
|
|||||||
@@ -114,22 +114,11 @@ public class VendorDialogMsg extends ClientNetMsg {
|
|||||||
|
|
||||||
VendorDialog vd = null;
|
VendorDialog vd = null;
|
||||||
Contract contract = npc.getContract();
|
Contract contract = npc.getContract();
|
||||||
if(npc.contractUUID == 1502043){
|
|
||||||
vd = Contract.HandleArenaMaster(msg.unknown03,npc,playerCharacter);
|
|
||||||
msg.updateMessage(3, vd);
|
|
||||||
}else if(npc.contractUUID == 1502040){ //enrollment officer
|
|
||||||
//PlayerCharacter.unboxPlayer(playerCharacter);
|
|
||||||
vd = Contract.HandleEnrollmentOfficer(msg.unknown03,npc,playerCharacter);
|
|
||||||
msg.updateMessage(3, vd);
|
|
||||||
}else if(contract.getContractID() == 1502042){
|
|
||||||
vd = Contract.HandleBaneCommanderOptions(msg.unknown03, npc, playerCharacter);
|
|
||||||
msg.updateMessage(3, vd);
|
|
||||||
}else {
|
|
||||||
|
|
||||||
if (contract == null)
|
if (contract == null)
|
||||||
vd = VendorDialog.getHostileVendorDialog();
|
vd = VendorDialog.getHostileVendorDialog();
|
||||||
else if (npc.getBuilding() != null) {
|
else if (npc.getBuilding() != null) {
|
||||||
if (npc.getBuilding() != null && BuildingManager.IsPlayerHostile(npc.getBuilding(), playerCharacter))
|
if (BuildingManager.IsPlayerHostile(npc.getBuilding(), playerCharacter))
|
||||||
vd = VendorDialog.getHostileVendorDialog();
|
vd = VendorDialog.getHostileVendorDialog();
|
||||||
else
|
else
|
||||||
vd = contract.getVendorDialog();
|
vd = contract.getVendorDialog();
|
||||||
@@ -137,13 +126,14 @@ public class VendorDialogMsg extends ClientNetMsg {
|
|||||||
vd = contract.getVendorDialog();
|
vd = contract.getVendorDialog();
|
||||||
if (vd == null)
|
if (vd == null)
|
||||||
vd = VendorDialog.getHostileVendorDialog();
|
vd = VendorDialog.getHostileVendorDialog();
|
||||||
|
|
||||||
if (msg.messageType == 1 || msg.unknown03 == vd.getObjectUUID()) {
|
if (msg.messageType == 1 || msg.unknown03 == vd.getObjectUUID()) {
|
||||||
msg.updateMessage(3, vd);
|
msg.updateMessage(3, vd);
|
||||||
} else {
|
} else {
|
||||||
if (VendorDialogMsg.handleSpecialCase(msg, npc, playerCharacter, vd, origin))
|
if (VendorDialogMsg.handleSpecialCase(msg, npc, playerCharacter, vd, origin))
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
//vd = VendorDialog.getVendorDialog(msg.unknown03);
|
vd = VendorDialog.getVendorDialog(msg.unknown03);
|
||||||
msg.updateMessage(3, vd);
|
msg.updateMessage(3, vd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -558,51 +548,18 @@ 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) {
|
|
||||||
boolean valid = false;
|
|
||||||
switch(promoID){
|
|
||||||
case 2504:
|
|
||||||
case 2505:
|
|
||||||
case 2506:
|
|
||||||
case 2507:
|
|
||||||
case 2510:
|
|
||||||
case 2511:
|
|
||||||
case 2512:
|
|
||||||
case 2514:
|
|
||||||
case 2515:
|
|
||||||
case 2517:
|
|
||||||
case 2518:
|
|
||||||
case 2519:
|
|
||||||
case 2520:
|
|
||||||
case 2521:
|
|
||||||
case 2523:
|
|
||||||
valid = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!valid)
|
|
||||||
return;
|
|
||||||
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
if (race == null || !promo.isAllowedRune(race.getToken())) {
|
if (race == null || !promo.isAllowedRune(race.getToken())) {
|
||||||
// TODO send client promotion error
|
// TODO send client promotion error
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
// verify baseclass valid for profession
|
// verify baseclass valid for profession
|
||||||
BaseClass bc = pc.getBaseClass();
|
BaseClass bc = pc.getBaseClass();
|
||||||
if (bc == null) {
|
if (bc == null || !promo.isAllowedRune(bc.getToken())) {
|
||||||
// TODO send client promotion error
|
// TODO send client promotion error
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(!promo.isAllowedRune(bc.getToken())){
|
|
||||||
if(!bc.getName().equals("Rogue") && !promo.getName().equals("Druid"))
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(race.getRaceRuneID() != 1999) {
|
|
||||||
// verify gender
|
// verify gender
|
||||||
if (promoID == 2511 && pc.isMale()) // Fury
|
if (promoID == 2511 && pc.isMale()) // Fury
|
||||||
return;
|
return;
|
||||||
@@ -610,7 +567,7 @@ public class VendorDialogMsg extends ClientNetMsg {
|
|||||||
return;
|
return;
|
||||||
if (promoID == 2517 && !pc.isMale()) // Warlock
|
if (promoID == 2517 && !pc.isMale()) // Warlock
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
// Everything valid. Let's promote
|
// Everything valid. Let's promote
|
||||||
pc.setPromotionClass(promo.getObjectUUID());
|
pc.setPromotionClass(promo.getObjectUUID());
|
||||||
|
|
||||||
|
|||||||
@@ -52,8 +52,8 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
|||||||
public int contractUUID;
|
public int contractUUID;
|
||||||
public Contract contract;
|
public Contract contract;
|
||||||
|
|
||||||
protected String firstName;
|
public String firstName;
|
||||||
protected String lastName;
|
public String lastName;
|
||||||
protected short statStrCurrent;
|
protected short statStrCurrent;
|
||||||
protected short statDexCurrent;
|
protected short statDexCurrent;
|
||||||
protected short statConCurrent;
|
protected short statConCurrent;
|
||||||
@@ -91,17 +91,17 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
|||||||
protected Resists resists = new Resists("Genric");
|
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;
|
||||||
public int atrHandOne;
|
protected int atrHandOne;
|
||||||
protected int atrHandTwo;
|
protected int atrHandTwo;
|
||||||
public int minDamageHandOne;
|
protected int minDamageHandOne;
|
||||||
public int maxDamageHandOne;
|
protected int maxDamageHandOne;
|
||||||
protected int minDamageHandTwo;
|
protected int minDamageHandTwo;
|
||||||
protected int maxDamageHandTwo;
|
protected int maxDamageHandTwo;
|
||||||
protected float rangeHandOne;
|
protected float rangeHandOne;
|
||||||
protected float rangeHandTwo;
|
protected float rangeHandTwo;
|
||||||
protected float speedHandOne;
|
protected float speedHandOne;
|
||||||
protected float speedHandTwo;
|
protected float speedHandTwo;
|
||||||
public int defenseRating;
|
protected int defenseRating;
|
||||||
protected boolean isActive; // <-Do not use this for deleting character!
|
protected boolean isActive; // <-Do not use this for deleting character!
|
||||||
protected float altitude = 0; // 0=on terrain, 1=tier 1, 2=tier 2, etc.
|
protected float altitude = 0; // 0=on terrain, 1=tier 1, 2=tier 2, etc.
|
||||||
protected ConcurrentHashMap<Integer, JobContainer> recycleTimers;
|
protected ConcurrentHashMap<Integer, JobContainer> recycleTimers;
|
||||||
@@ -117,16 +117,33 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
|||||||
protected boolean movingUp = false;
|
protected boolean movingUp = false;
|
||||||
private float desiredAltitude = 0;
|
private float desiredAltitude = 0;
|
||||||
private long takeOffTime = 0;
|
private long takeOffTime = 0;
|
||||||
private float hateValue = 0;
|
|
||||||
private long lastHateUpdate = 0;
|
private long lastHateUpdate = 0;
|
||||||
private boolean collided = false;
|
|
||||||
private byte aoecntr = 0;
|
private byte aoecntr = 0;
|
||||||
|
public final ConcurrentHashMap<Mob, Integer> siegeMinionMap = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
|
||||||
|
|
||||||
public AbstractCharacter() {
|
public AbstractCharacter() {
|
||||||
super();
|
super();
|
||||||
|
this.firstName = "";
|
||||||
|
this.lastName = "";
|
||||||
|
|
||||||
this.powers = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
|
this.statStrCurrent = (short) 0;
|
||||||
this.skills = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
|
this.statDexCurrent = (short) 0;
|
||||||
|
this.statConCurrent = (short) 0;
|
||||||
|
this.statIntCurrent = (short) 0;
|
||||||
|
this.statSpiCurrent = (short) 0;
|
||||||
|
|
||||||
|
this.unusedStatPoints = (short) 0;
|
||||||
|
|
||||||
|
this.level = (short) 0; // TODO get this from MobsBase later
|
||||||
|
this.exp = 1;
|
||||||
|
this.walkMode = true;
|
||||||
|
this.bindLoc = Vector3fImmutable.ZERO;
|
||||||
|
this.faceDir = Vector3fImmutable.ZERO;
|
||||||
|
|
||||||
|
this.runningTrains = (byte) 0;
|
||||||
|
|
||||||
|
this.skills = new ConcurrentHashMap<>();
|
||||||
|
this.powers = new ConcurrentHashMap<>();
|
||||||
this.initializeCharacter();
|
this.initializeCharacter();
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -214,8 +231,6 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
|||||||
this.skills = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
|
this.skills = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
|
||||||
this.initializeCharacter();
|
this.initializeCharacter();
|
||||||
|
|
||||||
// Dangerous to use THIS in a constructor!!!
|
|
||||||
this.charItemManager = new CharacterItemManager(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -258,8 +273,6 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
|||||||
this.powers = new ConcurrentHashMap<>();
|
this.powers = new ConcurrentHashMap<>();
|
||||||
this.initializeCharacter();
|
this.initializeCharacter();
|
||||||
|
|
||||||
// Dangerous to use THIS in a constructor!!!
|
|
||||||
this.charItemManager = new CharacterItemManager(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -291,8 +304,6 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
|||||||
this.powers = new ConcurrentHashMap<>();
|
this.powers = new ConcurrentHashMap<>();
|
||||||
initializeCharacter();
|
initializeCharacter();
|
||||||
|
|
||||||
// Dangerous to use THIS in a constructor!!!
|
|
||||||
this.charItemManager = new CharacterItemManager(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -342,9 +353,6 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
|||||||
this.powers = new ConcurrentHashMap<>();
|
this.powers = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
this.initializeCharacter();
|
this.initializeCharacter();
|
||||||
|
|
||||||
// Dangerous to use THIS in a constructor!!!
|
|
||||||
this.charItemManager = new CharacterItemManager(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getBankCapacity() {
|
public static int getBankCapacity() {
|
||||||
@@ -496,13 +504,8 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
|||||||
boolean canFly = false;
|
boolean canFly = false;
|
||||||
PlayerBonuses bonus = flyer.getBonuses();
|
PlayerBonuses bonus = flyer.getBonuses();
|
||||||
|
|
||||||
if (bonus != null && !bonus.getBool(ModType.NoMod, SourceType.Fly) && bonus.getBool(ModType.Fly, SourceType.None) && flyer.isAlive()) {
|
if (bonus != null && !bonus.getBool(ModType.NoMod, SourceType.Fly) && bonus.getBool(ModType.Fly, SourceType.None) && flyer.isAlive())
|
||||||
canFly = true;
|
canFly = true;
|
||||||
}
|
|
||||||
if(flyer.effects.containsKey("MoveBuff")){
|
|
||||||
canFly = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return canFly;
|
return canFly;
|
||||||
|
|
||||||
@@ -1192,15 +1195,10 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public final float modifyHealth(float value, final AbstractCharacter attacker, final boolean fromCost) {
|
public final float modifyHealth(
|
||||||
|
final float value,
|
||||||
if(attacker != null && attacker.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
final AbstractCharacter attacker,
|
||||||
value *= ((PlayerCharacter)attacker).ZergMultiplier;
|
final boolean fromCost) {
|
||||||
} // Health modifications are modified by the ZergMechanic
|
|
||||||
|
|
||||||
if(attacker != null && attacker.getObjectType().equals(GameObjectType.Mob) && ((Mob)attacker).getOwner() != null){
|
|
||||||
value *= ((Mob)attacker).getOwner().ZergMultiplier;
|
|
||||||
}// Health modifications from pets are modified by the owner's ZergMechanic
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
@@ -1264,19 +1262,11 @@ 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,
|
||||||
final boolean fromCost
|
final boolean fromCost
|
||||||
) {
|
) {
|
||||||
|
|
||||||
if(attacker != null && attacker.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
|
||||||
value *= ((PlayerCharacter)attacker).ZergMultiplier;
|
|
||||||
} // Health modifications are modified by the ZergMechanic
|
|
||||||
|
|
||||||
if(attacker != null && attacker.getObjectType().equals(GameObjectType.Mob) && ((Mob)attacker).getOwner() != null){
|
|
||||||
value *= ((Mob)attacker).getOwner().ZergMultiplier;
|
|
||||||
}// Health modifications from pets are modified by the owner's ZergMechanic
|
|
||||||
|
|
||||||
if (!this.isAlive()) {
|
if (!this.isAlive()) {
|
||||||
return 0f;
|
return 0f;
|
||||||
}
|
}
|
||||||
@@ -1311,19 +1301,11 @@ 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,
|
||||||
final boolean fromCost
|
final boolean fromCost
|
||||||
) {
|
) {
|
||||||
|
|
||||||
if(attacker != null && attacker.getObjectType().equals(GameObjectType.PlayerCharacter)){
|
|
||||||
value *= ((PlayerCharacter)attacker).ZergMultiplier;
|
|
||||||
} // Health modifications are modified by the ZergMechanic
|
|
||||||
|
|
||||||
if(attacker != null && attacker.getObjectType().equals(GameObjectType.Mob) && ((Mob)attacker).getOwner() != null){
|
|
||||||
value *= ((Mob)attacker).getOwner().ZergMultiplier;
|
|
||||||
}// Health modifications from pets are modified by the owner's ZergMechanic
|
|
||||||
|
|
||||||
if (!this.isAlive()) {
|
if (!this.isAlive()) {
|
||||||
return 0f;
|
return 0f;
|
||||||
}
|
}
|
||||||
@@ -1784,29 +1766,6 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
|||||||
this.inBuildingID = inBuildingID;
|
this.inBuildingID = inBuildingID;
|
||||||
}
|
}
|
||||||
|
|
||||||
public float getHateValue() {
|
|
||||||
if (this.hateValue <= 0) {
|
|
||||||
this.hateValue = 0;
|
|
||||||
return hateValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.lastHateUpdate == 0) {
|
|
||||||
this.lastHateUpdate = System.currentTimeMillis();
|
|
||||||
return this.hateValue;
|
|
||||||
}
|
|
||||||
long duration = System.currentTimeMillis() - this.lastHateUpdate;
|
|
||||||
//convert duration to seconds and multiply Hate Delimiter.
|
|
||||||
float modAmount = duration / 1000 * MBServerStatics.PLAYER_HATE_DELIMITER;
|
|
||||||
this.hateValue -= modAmount;
|
|
||||||
this.lastHateUpdate = System.currentTimeMillis();
|
|
||||||
return this.hateValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setHateValue(float hateValue) {
|
|
||||||
this.lastHateUpdate = System.currentTimeMillis();
|
|
||||||
this.hateValue = hateValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getInFloorID() {
|
public int getInFloorID() {
|
||||||
return inFloorID;
|
return inFloorID;
|
||||||
}
|
}
|
||||||
@@ -1840,7 +1799,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//updates
|
//updates
|
||||||
public void update(Boolean newSystem) {
|
public void update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateRegen() {
|
public void updateRegen() {
|
||||||
@@ -1860,16 +1819,16 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
|
|||||||
try {
|
try {
|
||||||
switch (updateType) {
|
switch (updateType) {
|
||||||
case ALL:
|
case ALL:
|
||||||
update(false);
|
update();
|
||||||
break;
|
break;
|
||||||
case REGEN:
|
case REGEN:
|
||||||
updateRegen();
|
updateRegen();
|
||||||
break;
|
break;
|
||||||
case LOCATION:
|
case LOCATION:
|
||||||
update(false);
|
update();
|
||||||
break;
|
break;
|
||||||
case MOVEMENTSTATE:
|
case MOVEMENTSTATE:
|
||||||
update(false);
|
update();
|
||||||
break;
|
break;
|
||||||
case FLIGHT:
|
case FLIGHT:
|
||||||
updateFlight();
|
updateFlight();
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
package engine.objects;
|
package engine.objects;
|
||||||
|
|
||||||
|
import ch.claude_martin.enumbitset.EnumBitSet;
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
import engine.Enum.ModType;
|
import engine.Enum.ModType;
|
||||||
@@ -31,7 +32,20 @@ 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 EnumBitSet<Enum.MonsterType> notEnemy = EnumBitSet.noneOf(Enum.MonsterType.class);
|
||||||
|
public EnumBitSet<Enum.MonsterType> enemy = EnumBitSet.noneOf(Enum.MonsterType.class);
|
||||||
|
;
|
||||||
|
public Enum.MobBehaviourType behaviourType;
|
||||||
|
public ArrayList<Vector3fImmutable> patrolPoints;
|
||||||
|
public int lastPatrolPointIndex = 0;
|
||||||
|
public long stopPatrolTime = 0;
|
||||||
|
public City guardedCity;
|
||||||
|
|
||||||
|
public AbstractIntelligenceAgent() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
public AbstractIntelligenceAgent(ResultSet rs) throws SQLException {
|
public AbstractIntelligenceAgent(ResultSet rs) throws SQLException {
|
||||||
super(rs);
|
super(rs);
|
||||||
@@ -87,7 +101,8 @@ public abstract class AbstractIntelligenceAgent extends AbstractCharacter {
|
|||||||
this.agentType = Enum.AIAgentType.CHARMED;
|
this.agentType = Enum.AIAgentType.CHARMED;
|
||||||
|
|
||||||
if (this.getObjectType().equals(GameObjectType.Mob)) {
|
if (this.getObjectType().equals(GameObjectType.Mob)) {
|
||||||
((Mob) this).setOwner(owner);
|
|
||||||
|
((Mob) this).guardCaptain = owner;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,14 +125,6 @@ public abstract class AbstractIntelligenceAgent extends AbstractCharacter {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PlayerCharacter getOwner() {
|
|
||||||
|
|
||||||
if (this.getObjectType().equals(GameObjectType.Mob))
|
|
||||||
return this.getOwner();
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean getSafeZone() {
|
public boolean getSafeZone() {
|
||||||
|
|
||||||
ArrayList<Zone> allIn = ZoneManager.getAllZonesIn(this.getLoc());
|
ArrayList<Zone> allIn = ZoneManager.getAllZonesIn(this.getLoc());
|
||||||
@@ -158,7 +165,7 @@ public abstract class AbstractIntelligenceAgent extends AbstractCharacter {
|
|||||||
|
|
||||||
//clear owner
|
//clear owner
|
||||||
|
|
||||||
PlayerCharacter owner = this.getOwner();
|
PlayerCharacter owner = (PlayerCharacter) this.guardCaptain;
|
||||||
|
|
||||||
//close pet window
|
//close pet window
|
||||||
|
|
||||||
@@ -174,7 +181,7 @@ public abstract class AbstractIntelligenceAgent extends AbstractCharacter {
|
|||||||
owner.setPet(null);
|
owner.setPet(null);
|
||||||
|
|
||||||
if (this.getObjectType().equals(GameObjectType.Mob))
|
if (this.getObjectType().equals(GameObjectType.Mob))
|
||||||
((Mob) this).setOwner(null);
|
((Mob) this).guardCaptain = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ public abstract class AbstractWorldObject extends AbstractGameObject {
|
|||||||
this.effects.remove(name);
|
this.effects.remove(name);
|
||||||
if (this.getObjectType().equals(GameObjectType.PlayerCharacter))
|
if (this.getObjectType().equals(GameObjectType.PlayerCharacter))
|
||||||
if (name.equals("Flight")) {
|
if (name.equals("Flight")) {
|
||||||
((PlayerCharacter) this).update(false);
|
((PlayerCharacter) this).update();
|
||||||
PlayerCharacter.GroundPlayer((PlayerCharacter) this);
|
PlayerCharacter.GroundPlayer((PlayerCharacter) this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -357,7 +357,9 @@ public abstract class AbstractWorldObject extends AbstractGameObject {
|
|||||||
Mob mob = (Mob) this;
|
Mob mob = (Mob) this;
|
||||||
if (mob.isSiege()) {
|
if (mob.isSiege()) {
|
||||||
if (mob.isPet()) {
|
if (mob.isPet()) {
|
||||||
PlayerCharacter petOwner = mob.getOwner();
|
|
||||||
|
|
||||||
|
PlayerCharacter petOwner = (PlayerCharacter) mob.guardCaptain;
|
||||||
if (petOwner != null && source.equals(EffectSourceType.Effect)) {
|
if (petOwner != null && source.equals(EffectSourceType.Effect)) {
|
||||||
petOwner.dismissPet();
|
petOwner.dismissPet();
|
||||||
return;
|
return;
|
||||||
@@ -385,7 +387,7 @@ public abstract class AbstractWorldObject extends AbstractGameObject {
|
|||||||
if (source.equals("Flight")) {
|
if (source.equals("Flight")) {
|
||||||
//ground player
|
//ground player
|
||||||
if (this.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
if (this.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
||||||
((PlayerCharacter) this).update(false);
|
((PlayerCharacter) this).update();
|
||||||
PlayerCharacter.GroundPlayer((PlayerCharacter) this);
|
PlayerCharacter.GroundPlayer((PlayerCharacter) this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -414,7 +416,7 @@ public abstract class AbstractWorldObject extends AbstractGameObject {
|
|||||||
if (source.equals("Flight")) {
|
if (source.equals("Flight")) {
|
||||||
//ground player
|
//ground player
|
||||||
if (this.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
if (this.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
||||||
((PlayerCharacter) this).update(false);
|
((PlayerCharacter) this).update();
|
||||||
PlayerCharacter.GroundPlayer((PlayerCharacter) this);
|
PlayerCharacter.GroundPlayer((PlayerCharacter) this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,82 +0,0 @@
|
|||||||
package engine.objects;
|
|
||||||
|
|
||||||
import engine.InterestManagement.WorldGrid;
|
|
||||||
import engine.gameManager.ArenaManager;
|
|
||||||
import engine.gameManager.ChatManager;
|
|
||||||
import engine.gameManager.MovementManager;
|
|
||||||
import engine.math.Vector3fImmutable;
|
|
||||||
import engine.server.MBServerStatics;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
|
|
||||||
public class Arena {
|
|
||||||
public PlayerCharacter player1;
|
|
||||||
public PlayerCharacter player2;
|
|
||||||
public Long startTime;
|
|
||||||
public Vector3fImmutable loc;
|
|
||||||
|
|
||||||
public Arena(){
|
|
||||||
|
|
||||||
}
|
|
||||||
public Boolean disqualify() {
|
|
||||||
HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(this.loc, 250f, MBServerStatics.MASK_PLAYER);
|
|
||||||
HashSet<AbstractWorldObject> warningRange = WorldGrid.getObjectsInRangePartial(this.loc, 500f, MBServerStatics.MASK_PLAYER);
|
|
||||||
for(AbstractWorldObject obj : warningRange){
|
|
||||||
PlayerCharacter pc = (PlayerCharacter)obj;
|
|
||||||
if(pc.equals(this.player1) || pc.equals(this.player2))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
ChatManager.chatSystemInfo(pc, "WARNING!! You are entering an arena zone!");
|
|
||||||
}
|
|
||||||
//boot out all non competitors
|
|
||||||
for(AbstractWorldObject obj : inRange){
|
|
||||||
if(obj.equals(this.player1))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if(obj.equals(this.player2))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
PlayerCharacter intruder = (PlayerCharacter)obj;
|
|
||||||
MovementManager.translocate(intruder,new Vector3fImmutable(88853,32,45079),Regions.GetRegionForTeleport(new Vector3fImmutable(88853,32,45079)));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!inRange.contains(this.player1) && inRange.contains(this.player2)) {
|
|
||||||
ArenaManager.endArena(this,this.player2,this.player1,"Player Has Left Arena");
|
|
||||||
return true;
|
|
||||||
} else if (!inRange.contains(this.player2) && inRange.contains(this.player1)) {
|
|
||||||
ArenaManager.endArena(this,this.player1,this.player2,"Player Has Left Arena");
|
|
||||||
return true;
|
|
||||||
}else if (!inRange.contains(this.player2) && !inRange.contains(this.player1)) {
|
|
||||||
ArenaManager.endArena(this,null,null,"Both Parties Have Left The Arena");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Boolean checkToComplete(){
|
|
||||||
|
|
||||||
if(this.startTime == null)
|
|
||||||
this.startTime = System.currentTimeMillis();
|
|
||||||
|
|
||||||
if(System.currentTimeMillis() - this.startTime < 10000L)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if(this.disqualify())
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if(!this.player1.isAlive() && this.player2.isAlive()){
|
|
||||||
ArenaManager.endArena(this,this.player2,this.player1,"Player Has Died");
|
|
||||||
return true;
|
|
||||||
} else if(this.player1.isAlive() && !this.player2.isAlive()){
|
|
||||||
ArenaManager.endArena(this,this.player1,this.player2,"Player Has Died");
|
|
||||||
return true;
|
|
||||||
} else if(!this.player1.isAlive() && !this.player2.isAlive()){
|
|
||||||
ArenaManager.endArena(this,null,null,"Both Players Have Died");
|
|
||||||
return true;
|
|
||||||
} else if(this.startTime + 300000L < System.currentTimeMillis()){
|
|
||||||
ArenaManager.endArena(this,null,null,"Time Has Elapsed");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -14,19 +14,19 @@ import engine.Enum.ProtectionState;
|
|||||||
import engine.Enum.SiegePhase;
|
import engine.Enum.SiegePhase;
|
||||||
import engine.Enum.SiegeResult;
|
import engine.Enum.SiegeResult;
|
||||||
import engine.InterestManagement.HeightMap;
|
import engine.InterestManagement.HeightMap;
|
||||||
import engine.InterestManagement.InterestManager;
|
|
||||||
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;
|
||||||
import engine.math.Vector3fImmutable;
|
import engine.math.Vector3fImmutable;
|
||||||
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.CityDataMsg;
|
|
||||||
import engine.net.client.msg.PlaceAssetMsg;
|
import engine.net.client.msg.PlaceAssetMsg;
|
||||||
import engine.net.client.msg.chat.ChatSystemMsg;
|
import engine.net.client.msg.chat.ChatSystemMsg;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
@@ -37,7 +37,6 @@ import java.sql.ResultSet;
|
|||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
public final class Bane {
|
public final class Bane {
|
||||||
@@ -49,10 +48,6 @@ public final class Bane {
|
|||||||
private DateTime placementDate = null;
|
private DateTime placementDate = null;
|
||||||
private DateTime liveDate = null;
|
private DateTime liveDate = null;
|
||||||
private BaneDefaultTimeJob defaultTimeJob;
|
private BaneDefaultTimeJob defaultTimeJob;
|
||||||
public boolean timeSet = false;
|
|
||||||
public boolean daySet = false;
|
|
||||||
public boolean capSet = false;
|
|
||||||
public int capSize = 10;
|
|
||||||
|
|
||||||
// Internal cache for banes
|
// Internal cache for banes
|
||||||
private ActivateBaneJob activateBaneJob;
|
private ActivateBaneJob activateBaneJob;
|
||||||
@@ -69,12 +64,6 @@ public final class Bane {
|
|||||||
this.ownerUUID = rs.getInt("ownerUUID");
|
this.ownerUUID = rs.getInt("ownerUUID");
|
||||||
this.stoneUUID = rs.getInt("stoneUUID");
|
this.stoneUUID = rs.getInt("stoneUUID");
|
||||||
|
|
||||||
this.timeSet = rs.getInt("time_set") == 1;
|
|
||||||
this.daySet = rs.getInt("day_set") == 1;
|
|
||||||
this.capSet = rs.getInt("cap_set") == 1;
|
|
||||||
this.capSize = rs.getInt("cap_size");
|
|
||||||
|
|
||||||
|
|
||||||
sqlDateTime = rs.getTimestamp("placementDate");
|
sqlDateTime = rs.getTimestamp("placementDate");
|
||||||
|
|
||||||
if (sqlDateTime != null)
|
if (sqlDateTime != null)
|
||||||
@@ -111,11 +100,12 @@ public final class Bane {
|
|||||||
abtj = new ActivateBaneJob(cityUUID);
|
abtj = new ActivateBaneJob(cityUUID);
|
||||||
JobScheduler.getInstance().scheduleJob(abtj, this.liveDate.getMillis());
|
JobScheduler.getInstance().scheduleJob(abtj, this.liveDate.getMillis());
|
||||||
this.activateBaneJob = abtj;
|
this.activateBaneJob = abtj;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
//add bane commander NPC
|
if (this.liveDate == null)
|
||||||
//summonBaneCommander(this);
|
setDefaultTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean summonBanestone(PlayerCharacter player, ClientConnection origin, int rank) {
|
public static boolean summonBanestone(PlayerCharacter player, ClientConnection origin, int rank) {
|
||||||
@@ -276,58 +266,9 @@ 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);
|
||||||
|
|
||||||
//add bane commander NPC
|
|
||||||
summonBaneCommander(bane);
|
|
||||||
|
|
||||||
try {
|
|
||||||
//update map for all players online
|
|
||||||
for (PlayerCharacter playerCharacter : SessionManager.getAllActivePlayerCharacters()) {
|
|
||||||
CityDataMsg cityDataMsg = new CityDataMsg(SessionManager.getSession(playerCharacter), false);
|
|
||||||
cityDataMsg.updateMines(true);
|
|
||||||
cityDataMsg.updateCities(true);
|
|
||||||
Dispatch dispatch = Dispatch.borrow(playerCharacter, cityDataMsg);
|
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
|
||||||
}
|
|
||||||
}catch(Exception e){
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void summonBaneCommander(Bane bane){
|
|
||||||
Vector3fImmutable spawnLoc = Vector3fImmutable.getRandomPointOnCircle(bane.getStone().loc,6);
|
|
||||||
NPC baneCommander;
|
|
||||||
int commanderuuid = DbManager.NPCQueries.BANE_COMMANDER_EXISTS(bane.getStone().getObjectUUID());
|
|
||||||
|
|
||||||
if(commanderuuid == 0) {
|
|
||||||
//add bane commander NPC
|
|
||||||
int contractID = 1502042;
|
|
||||||
baneCommander = NPC.createNPC("Bane Commander", contractID, spawnLoc, bane.getCity().getGuild(), ZoneManager.findSmallestZone(bane.getStone().loc), (short) 70, bane.getStone());
|
|
||||||
try {
|
|
||||||
NPCManager.slotCharacterInBuilding(baneCommander);
|
|
||||||
}catch(Exception e){
|
|
||||||
|
|
||||||
}
|
|
||||||
WorldGrid.addObject(baneCommander,spawnLoc.x,spawnLoc.z);
|
|
||||||
WorldGrid.updateObject(baneCommander);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
baneCommander = NPC.getNPC(commanderuuid);
|
|
||||||
}
|
|
||||||
//try {
|
|
||||||
// NPCManager.slotCharacterInBuilding(baneCommander);
|
|
||||||
//}catch (Exception e){
|
|
||||||
//swallow it
|
|
||||||
//}
|
|
||||||
baneCommander.runAfterLoad();
|
|
||||||
//baneCommander.setLoc(spawnLoc);
|
|
||||||
InterestManager.setObjectDirty(baneCommander);
|
|
||||||
|
|
||||||
baneCommander.updateLocation();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Bane getBane(int cityUUID) {
|
public static Bane getBane(int cityUUID) {
|
||||||
|
|
||||||
Bane outBane;
|
Bane outBane;
|
||||||
@@ -440,12 +381,8 @@ public final class Bane {
|
|||||||
defaultTime = defaultTime.minuteOfHour().setCopy(0);
|
defaultTime = defaultTime.minuteOfHour().setCopy(0);
|
||||||
defaultTime = defaultTime.secondOfMinute().setCopy(0);
|
defaultTime = defaultTime.secondOfMinute().setCopy(0);
|
||||||
|
|
||||||
if (currentTime.isAfter(timeToSetDefault)){
|
if (currentTime.isAfter(timeToSetDefault))
|
||||||
DbManager.BaneQueries.SET_BANE_CAP_NEW(20,this.getCityUUID());
|
this.setLiveDate(defaultTime);
|
||||||
DbManager.BaneQueries.SET_BANE_TIME_NEW(9,this.getCityUUID());
|
|
||||||
DbManager.BaneQueries.SET_BANE_DAY_NEW(3,this.getCityUUID());
|
|
||||||
}
|
|
||||||
//this.setLiveDate(defaultTime);
|
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if (this.defaultTimeJob != null)
|
if (this.defaultTimeJob != null)
|
||||||
@@ -511,16 +448,6 @@ public final class Bane {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Remove bane commander NPC
|
|
||||||
if(!baneStone.getHirelings().isEmpty()) {
|
|
||||||
NPC npc = (NPC)baneStone.getHirelings().keySet().stream().findFirst().orElse(null);
|
|
||||||
if(npc != null) {
|
|
||||||
DbManager.NPCQueries.DELETE_NPC(npc);
|
|
||||||
DbManager.removeFromCache(npc);
|
|
||||||
WorldGrid.RemoveWorldObject(npc);
|
|
||||||
WorldGrid.removeObject(npc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Remove object from simulation
|
// Remove object from simulation
|
||||||
|
|
||||||
baneStone.removeFromCache();
|
baneStone.removeFromCache();
|
||||||
@@ -542,9 +469,6 @@ public final class Bane {
|
|||||||
return liveDate;
|
return liveDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLiveDate_NEW(DateTime baneTime) {
|
|
||||||
|
|
||||||
}
|
|
||||||
public void setLiveDate(DateTime baneTime) {
|
public void setLiveDate(DateTime baneTime) {
|
||||||
|
|
||||||
if (DbManager.BaneQueries.SET_BANE_TIME(baneTime, this.getCity().getObjectUUID())) {
|
if (DbManager.BaneQueries.SET_BANE_TIME(baneTime, this.getCity().getObjectUUID())) {
|
||||||
@@ -720,63 +644,4 @@ public final class Bane {
|
|||||||
return cityUUID;
|
return cityUUID;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void applyZergBuffs(){
|
|
||||||
City city = this.getCity();
|
|
||||||
if(city == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
city.onEnter();
|
|
||||||
|
|
||||||
ArrayList<Integer> attackers = new ArrayList<>();
|
|
||||||
ArrayList<Integer> defenders = new ArrayList<>();
|
|
||||||
Guild attackNation = this.getOwner().getGuild().getNation();
|
|
||||||
Guild defendNation = this.getCity().getGuild().getNation();
|
|
||||||
HashSet<AbstractWorldObject> inSiegeRange = WorldGrid.getObjectsInRangePartial(city.getTOL().loc,1750f,1);
|
|
||||||
for(AbstractWorldObject obj : inSiegeRange){
|
|
||||||
int uuid = obj.getObjectUUID();
|
|
||||||
PlayerCharacter player = PlayerCharacter.getPlayerCharacter(uuid);
|
|
||||||
if(player == null)
|
|
||||||
continue;
|
|
||||||
Guild playerNation = player.guild.getNation();
|
|
||||||
//separate the players into categories
|
|
||||||
if(playerNation.equals(defendNation))
|
|
||||||
defenders.add(uuid);
|
|
||||||
else if(playerNation.equals(attackNation))
|
|
||||||
attackers.add(uuid);
|
|
||||||
else
|
|
||||||
MovementManager.translocate(player,Vector3fImmutable.getRandomPointOnCircle(ZoneManager.getZoneByUUID(656).getLoc(),30f),Regions.GetRegionForTeleport(ZoneManager.getZoneByUUID(656).getLoc()));
|
|
||||||
}
|
|
||||||
int attackerSize = 0;
|
|
||||||
int defenderSize = 0;
|
|
||||||
for(int uuid : city.baneAttendees.keySet()){
|
|
||||||
PlayerCharacter player = PlayerCharacter.getPlayerCharacter(uuid);
|
|
||||||
if(player == null)
|
|
||||||
continue;
|
|
||||||
if(player.guild.getNation().equals(defendNation))
|
|
||||||
defenderSize += 1;
|
|
||||||
else if(player.guild.getNation().equals(attackNation))
|
|
||||||
attackerSize += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
//apply zerg mechanic for attackers
|
|
||||||
float attackerMultiplier = ZergManager.getCurrentMultiplier(attackerSize,this.capSize);
|
|
||||||
float defenderMultiplier = ZergManager.getCurrentMultiplier(defenderSize,this.capSize);
|
|
||||||
for(int uuid : attackers){
|
|
||||||
PlayerCharacter player = PlayerCharacter.getPlayerCharacter(uuid);
|
|
||||||
if(inSiegeRange.contains(player)) //player is still physically here, needs updated multiplier
|
|
||||||
player.ZergMultiplier = attackerMultiplier;
|
|
||||||
else
|
|
||||||
player.ZergMultiplier = 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(int uuid : defenders){
|
|
||||||
PlayerCharacter player = PlayerCharacter.getPlayerCharacter(uuid);
|
|
||||||
if(inSiegeRange.contains(player)) //player is still physically here, needs updated multiplier
|
|
||||||
player.ZergMultiplier = defenderMultiplier;
|
|
||||||
else
|
|
||||||
player.ZergMultiplier = 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ import org.pmw.tinylog.Logger;
|
|||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
/* @Summary - Blueprint class is used for determining
|
/* @Summary - Blueprint class is used for determining
|
||||||
characteristics of instanced player owned
|
characteristics of instanced player owned
|
||||||
@@ -61,12 +60,13 @@ public class Blueprint {
|
|||||||
this.name = rs.getString("MeshName");
|
this.name = rs.getString("MeshName");
|
||||||
this.icon = rs.getInt("Icon");
|
this.icon = rs.getInt("Icon");
|
||||||
this.buildingGroup = BuildingGroup.valueOf(rs.getString("BuildingGroup"));
|
this.buildingGroup = BuildingGroup.valueOf(rs.getString("BuildingGroup"));
|
||||||
|
this.maxRank = rs.getInt("MaxRank");
|
||||||
this.maxSlots = rs.getInt("MaxSlots");
|
this.maxSlots = rs.getInt("MaxSlots");
|
||||||
this.rank1UUID = rs.getInt("Rank1UUID");
|
this.rank1UUID = rs.getInt("Rank1UUID");
|
||||||
this.rank3UUID = rs.getInt("Rank3UUID");
|
this.rank3UUID = rs.getInt("Rank3UUID");
|
||||||
this.rank7UUID = rs.getInt("Rank7UUID");
|
this.rank7UUID = rs.getInt("Rank7UUID");
|
||||||
this.destroyedUUID = rs.getInt("DestroyedUUID");
|
this.destroyedUUID = rs.getInt("DestroyedUUID");
|
||||||
this.maxRank = rs.getInt("MaxRank");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Accessors
|
// Accessors
|
||||||
@@ -108,10 +108,8 @@ this.maxRank = rs.getInt("MaxRank");
|
|||||||
maxShrines = 2;
|
maxShrines = 2;
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
maxShrines = 3;
|
|
||||||
break;
|
|
||||||
case 8:
|
case 8:
|
||||||
maxShrines = 4;
|
maxShrines = 3;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
maxShrines = 0;
|
maxShrines = 0;
|
||||||
@@ -169,48 +167,20 @@ this.maxRank = rs.getInt("MaxRank");
|
|||||||
// 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) {
|
||||||
return 0;
|
int maintCost = Integer.MAX_VALUE;
|
||||||
|
|
||||||
|
maintCost = (9730 * rank) + 1890;
|
||||||
|
|
||||||
|
return maintCost;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getMaxRank() {
|
public int getMaxRank() {
|
||||||
BuildingGroup bg = this.buildingGroup;
|
|
||||||
switch(bg){
|
|
||||||
case AMAZONHALL:
|
|
||||||
case CATHEDRAL:
|
|
||||||
case GREATHALL:
|
|
||||||
case KEEP:
|
|
||||||
case THIEFHALL:
|
|
||||||
case TEMPLEHALL:
|
|
||||||
case WIZARDHALL:
|
|
||||||
case ELVENHALL:
|
|
||||||
case ELVENSANCTUM:
|
|
||||||
case IREKEIHALL:
|
|
||||||
case FORESTHALL:
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return maxRank;
|
return maxRank;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getMaxSlots() {
|
public int getMaxSlots() {
|
||||||
if (this.buildingGroup != null && this.buildingGroup.equals(BuildingGroup.BARRACK))
|
if (this.buildingGroup != null && this.buildingGroup.equals(BuildingGroup.BARRACK))
|
||||||
return 1;
|
return 1;
|
||||||
if (this.buildingGroup != null && this.buildingGroup.equals(BuildingGroup.TOL))
|
|
||||||
return 4;
|
|
||||||
BuildingGroup bg = this.buildingGroup;
|
|
||||||
switch(bg){
|
|
||||||
case AMAZONHALL:
|
|
||||||
case CATHEDRAL:
|
|
||||||
case GREATHALL:
|
|
||||||
case KEEP:
|
|
||||||
case THIEFHALL:
|
|
||||||
case TEMPLEHALL:
|
|
||||||
case WIZARDHALL:
|
|
||||||
case ELVENHALL:
|
|
||||||
case ELVENSANCTUM:
|
|
||||||
case IREKEIHALL:
|
|
||||||
case FORESTHALL:
|
|
||||||
return 3;
|
|
||||||
}
|
|
||||||
return maxSlots;
|
return maxSlots;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -342,23 +312,9 @@ this.maxRank = rs.getInt("MaxRank");
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// Early exit for buildings with single or no slots
|
// Early exit for buildings with single or no slots
|
||||||
if (this.maxSlots <= 1 && !this.buildingGroup.equals(BuildingGroup.TOL))
|
|
||||||
return maxSlots;
|
|
||||||
|
|
||||||
BuildingGroup bg = this.buildingGroup;
|
if (this.maxSlots <= 1)
|
||||||
switch(bg.name()) {
|
return maxSlots;
|
||||||
case "AMAZONHALL":
|
|
||||||
case "CATHEDRAL":
|
|
||||||
case "GREATHALL":
|
|
||||||
case "THIEFHALL":
|
|
||||||
case "TEMPLEHALL":
|
|
||||||
case "WIZARDHALL":
|
|
||||||
case "ELVENHALL":
|
|
||||||
case "ELVENSANCTUM":
|
|
||||||
case "IREKEIHALL":
|
|
||||||
case "FORESTHALL":
|
|
||||||
return 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.maxRank == 1 && currentRank == 1)
|
if (this.maxRank == 1 && currentRank == 1)
|
||||||
return getMaxSlots();
|
return getMaxSlots();
|
||||||
@@ -371,22 +327,20 @@ this.maxRank = rs.getInt("MaxRank");
|
|||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
case 4:
|
case 4:
|
||||||
availableSlots = 2;
|
|
||||||
break;
|
|
||||||
case 5:
|
case 5:
|
||||||
case 6:
|
case 6:
|
||||||
|
availableSlots = 2;
|
||||||
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
availableSlots = 3;
|
availableSlots = 3;
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
availableSlots = 4;
|
availableSlots = 1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
availableSlots = 0;
|
availableSlots = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(this.buildingGroup != null && this.buildingGroup.equals(BuildingGroup.TOL))
|
|
||||||
availableSlots += 1;
|
|
||||||
|
|
||||||
return availableSlots;
|
return availableSlots;
|
||||||
}
|
}
|
||||||
@@ -649,14 +603,26 @@ this.maxRank = rs.getInt("MaxRank");
|
|||||||
return this.blueprintUUID;
|
return this.blueprintUUID;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getMaintCost() {
|
public int getMaintCost(int rank) {
|
||||||
|
|
||||||
int maintCost = Integer.MAX_VALUE;
|
int maintCost = Integer.MAX_VALUE;
|
||||||
|
|
||||||
if(this.buildingGroup.equals(BuildingGroup.TOL)){
|
switch (this.buildingGroup) {
|
||||||
return 3000000;
|
case TOL:
|
||||||
}else{
|
case BARRACK:
|
||||||
return 0;
|
maintCost = (61500 * rank) + 19500;
|
||||||
|
break;
|
||||||
|
case SPIRE:
|
||||||
|
maintCost = (4800 * rank) + 1200;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (maxRank == 1)
|
||||||
|
maintCost = 22500;
|
||||||
|
else
|
||||||
|
maintCost = (15900 * rank) + 3300;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return maintCost;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -182,22 +182,6 @@ public class Building extends AbstractWorldObject {
|
|||||||
this.setHealth(healthMax);
|
this.setHealth(healthMax);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!this.ownerIsNPC){
|
|
||||||
//add extra HP for city walls of R8 trees
|
|
||||||
City city = ZoneManager.getCityAtLocation(this.loc);
|
|
||||||
if(city != null){
|
|
||||||
Building ToL = city.getTOL();
|
|
||||||
if(ToL != null){
|
|
||||||
if(ToL.rank == 8){
|
|
||||||
float currentHealth = this.health.get();
|
|
||||||
float newHealth = (currentHealth/this.healthMax) * (this.healthMax * 1.1f);
|
|
||||||
this.healthMax *= 1.1f;
|
|
||||||
this.setHealth(newHealth);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Null out blueprint if not needed (npc building)
|
// Null out blueprint if not needed (npc building)
|
||||||
|
|
||||||
if (blueprintUUID == 0)
|
if (blueprintUUID == 0)
|
||||||
@@ -796,9 +780,24 @@ public class Building extends AbstractWorldObject {
|
|||||||
|
|
||||||
public int getMaintCost() {
|
public int getMaintCost() {
|
||||||
|
|
||||||
if(this.getBlueprint() != null && this.getBlueprint().getBuildingGroup().equals(BuildingGroup.TOL))
|
int maintCost = 0;
|
||||||
return 3000000;
|
|
||||||
else return 0;
|
// Add cost for building structure
|
||||||
|
|
||||||
|
maintCost += this.getBlueprint().getMaintCost(rank);
|
||||||
|
|
||||||
|
// Add costs associated with hirelings
|
||||||
|
|
||||||
|
for (AbstractCharacter npc : this.hirelings.keySet()) {
|
||||||
|
|
||||||
|
if (npc.getObjectType() != GameObjectType.NPC)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
|
||||||
|
maintCost += Blueprint.getNpcMaintCost(npc.getRank());
|
||||||
|
}
|
||||||
|
|
||||||
|
return maintCost;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void submitOpenDoorJob(int doorID) {
|
public final void submitOpenDoorJob(int doorID) {
|
||||||
@@ -837,10 +836,6 @@ public class Building extends AbstractWorldObject {
|
|||||||
return this.meshScale;
|
return this.meshScale;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMeshScale(Vector3f scale) {
|
|
||||||
this.meshScale = scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final int getMeshUUID() {
|
public final int getMeshUUID() {
|
||||||
return this.meshUUID;
|
return this.meshUUID;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -610,8 +610,6 @@ public class CharacterItemManager {
|
|||||||
if (i == null)
|
if (i == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
i.stripCastableEnchants();
|
|
||||||
|
|
||||||
if (!this.doesCharOwnThisItem(i.getObjectUUID()))
|
if (!this.doesCharOwnThisItem(i.getObjectUUID()))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -1056,7 +1054,6 @@ public class CharacterItemManager {
|
|||||||
// add to Bank
|
// add to Bank
|
||||||
this.bank.add(i);
|
this.bank.add(i);
|
||||||
i.addToCache();
|
i.addToCache();
|
||||||
i.stripCastableEnchants();
|
|
||||||
|
|
||||||
calculateWeights();
|
calculateWeights();
|
||||||
|
|
||||||
@@ -1205,7 +1202,6 @@ public class CharacterItemManager {
|
|||||||
|
|
||||||
calculateWeights();
|
calculateWeights();
|
||||||
|
|
||||||
i.stripCastableEnchants();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2013,7 +2009,6 @@ public class CharacterItemManager {
|
|||||||
if (item.getItemBase().getType().equals(ItemType.GOLD)) {
|
if (item.getItemBase().getType().equals(ItemType.GOLD)) {
|
||||||
int amt = item.getNumOfItems();
|
int amt = item.getNumOfItems();
|
||||||
item.setNumOfItems(0);
|
item.setNumOfItems(0);
|
||||||
item.stripCastableEnchants();
|
|
||||||
MobLoot ml = new MobLoot(this.absCharacter, amt);
|
MobLoot ml = new MobLoot(this.absCharacter, amt);
|
||||||
ml.zeroItem();
|
ml.zeroItem();
|
||||||
ml.containerType = Enum.ItemContainerType.INVENTORY;
|
ml.containerType = Enum.ItemContainerType.INVENTORY;
|
||||||
|
|||||||
@@ -992,9 +992,6 @@ public class CharacterSkill extends AbstractGameObject {
|
|||||||
|
|
||||||
//Get Base skill for unmodified stats
|
//Get Base skill for unmodified stats
|
||||||
float base = 7f;
|
float base = 7f;
|
||||||
if(this.skillsBase.getToken() == -660435875){
|
|
||||||
base = 0;
|
|
||||||
}
|
|
||||||
float statMod = 0.5f;
|
float statMod = 0.5f;
|
||||||
if (this.skillsBase.getStrMod() > 0)
|
if (this.skillsBase.getStrMod() > 0)
|
||||||
statMod += (float) this.skillsBase.getStrMod() * (float) (int) ((PlayerCharacter) CharacterSkill.GetOwner(this)).statStrBase / 100f;
|
statMod += (float) this.skillsBase.getStrMod() * (float) (int) ((PlayerCharacter) CharacterSkill.GetOwner(this)).statStrBase / 100f;
|
||||||
@@ -1012,7 +1009,7 @@ public class CharacterSkill extends AbstractGameObject {
|
|||||||
statMod = 600f;
|
statMod = 600f;
|
||||||
base += CharacterSkill.baseSkillValues[(int) statMod];
|
base += CharacterSkill.baseSkillValues[(int) statMod];
|
||||||
|
|
||||||
if (base + bonus < 1f && this.skillsBase.getToken() != -660435875)
|
if (base + bonus < 1f)
|
||||||
this.baseAmountBeforeMods = 1f;
|
this.baseAmountBeforeMods = 1f;
|
||||||
else
|
else
|
||||||
this.baseAmountBeforeMods = base + bonus;
|
this.baseAmountBeforeMods = base + bonus;
|
||||||
@@ -1087,9 +1084,6 @@ public class CharacterSkill extends AbstractGameObject {
|
|||||||
//Get Base skill for modified stats
|
//Get Base skill for modified stats
|
||||||
//TODO this fomula needs verified
|
//TODO this fomula needs verified
|
||||||
float base = 7f;
|
float base = 7f;
|
||||||
if(this.skillsBase.getToken() == -660435875){
|
|
||||||
base = 0;
|
|
||||||
}
|
|
||||||
float statMod = 0.5f;
|
float statMod = 0.5f;
|
||||||
if (this.skillsBase.getStrMod() > 0)
|
if (this.skillsBase.getStrMod() > 0)
|
||||||
statMod += (float) this.skillsBase.getStrMod() * (float) CharacterSkill.GetOwner(this).getStatStrCurrent() / 100f;
|
statMod += (float) this.skillsBase.getStrMod() * (float) CharacterSkill.GetOwner(this).getStatStrCurrent() / 100f;
|
||||||
@@ -1105,9 +1099,6 @@ public class CharacterSkill extends AbstractGameObject {
|
|||||||
statMod = 1f;
|
statMod = 1f;
|
||||||
else if (statMod > 600)
|
else if (statMod > 600)
|
||||||
statMod = 600f;
|
statMod = 600f;
|
||||||
if(this.skillsBase.getToken() == -660435875){
|
|
||||||
statMod = 0;
|
|
||||||
}
|
|
||||||
base += CharacterSkill.baseSkillValues[(int) statMod];
|
base += CharacterSkill.baseSkillValues[(int) statMod];
|
||||||
SourceType sourceType = SourceType.GetSourceType(this.skillsBase.getNameNoSpace());
|
SourceType sourceType = SourceType.GetSourceType(this.skillsBase.getNameNoSpace());
|
||||||
|
|
||||||
@@ -1118,7 +1109,7 @@ public class CharacterSkill extends AbstractGameObject {
|
|||||||
base += bonus + CharacterSkill.GetOwner(this).getBonuses().getFloat(ModType.Skill, sourceType);
|
base += bonus + CharacterSkill.GetOwner(this).getBonuses().getFloat(ModType.Skill, sourceType);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (base < 1f && this.skillsBase.getToken() != -660435875)
|
if (base < 1f)
|
||||||
this.baseAmount = 1f;
|
this.baseAmount = 1f;
|
||||||
else
|
else
|
||||||
this.baseAmount = base;
|
this.baseAmount = base;
|
||||||
|
|||||||
@@ -39,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;
|
||||||
@@ -89,8 +88,6 @@ public class City extends AbstractWorldObject {
|
|||||||
private boolean reverseKOS = false;
|
private boolean reverseKOS = false;
|
||||||
private String hash;
|
private String hash;
|
||||||
|
|
||||||
public HashMap<Integer, Long> baneAttendees = new HashMap<>();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ResultSet Constructor
|
* ResultSet Constructor
|
||||||
*/
|
*/
|
||||||
@@ -237,24 +234,7 @@ public class City extends AbstractWorldObject {
|
|||||||
writer.putInt(rulingGuild.getObjectUUID());
|
writer.putInt(rulingGuild.getObjectUUID());
|
||||||
|
|
||||||
writer.putString(rulingGuild.getName());
|
writer.putString(rulingGuild.getName());
|
||||||
try {
|
|
||||||
if (city.getBane() != null) {
|
|
||||||
Bane bane = city.getBane();
|
|
||||||
if (bane.daySet && bane.timeSet && bane.getLiveDate() != null) {
|
|
||||||
int day = bane.getLiveDate().dayOfMonth().get();
|
|
||||||
int month = bane.getLiveDate().getMonthOfYear();
|
|
||||||
int year = bane.getLiveDate().year().get();
|
|
||||||
int hour = bane.getLiveDate().getHourOfDay();
|
|
||||||
writer.putString("BANE SET: " + month + "/" + day + "/" + year + " " + hour + ":00 CST");
|
|
||||||
} else {
|
|
||||||
writer.putString("BANED!: Unset");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
writer.putString(city.motto);
|
writer.putString(city.motto);
|
||||||
}
|
|
||||||
}catch(Exception e){
|
|
||||||
writer.putString(city.motto);
|
|
||||||
}
|
|
||||||
writer.putString(rulingGuild.getLeadershipType());
|
writer.putString(rulingGuild.getLeadershipType());
|
||||||
|
|
||||||
// Serialize guild ruler's name
|
// Serialize guild ruler's name
|
||||||
@@ -309,11 +289,8 @@ public class City extends AbstractWorldObject {
|
|||||||
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
|
||||||
@@ -340,11 +317,8 @@ public class City extends AbstractWorldObject {
|
|||||||
writer.putFloat(city.location.y);
|
writer.putFloat(city.location.y);
|
||||||
writer.putFloat(city.location.z);
|
writer.putFloat(city.location.z);
|
||||||
|
|
||||||
if(city.getBane() != null) {
|
writer.putInt(city.siegesWithstood);
|
||||||
writer.putInt(city.getBane().capSize);
|
|
||||||
}else{
|
|
||||||
writer.putInt(0);
|
|
||||||
}
|
|
||||||
writer.put((byte) 1);
|
writer.put((byte) 1);
|
||||||
writer.put((byte) 0);
|
writer.put((byte) 0);
|
||||||
writer.putInt(0x64);
|
writer.putInt(0x64);
|
||||||
@@ -1012,7 +986,7 @@ public class City extends AbstractWorldObject {
|
|||||||
|
|
||||||
// Gather current list of players within the zone bounds
|
// Gather current list of players within the zone bounds
|
||||||
|
|
||||||
currentPlayers = WorldGrid.getObjectsInRangePartial(this.location, 1500, MBServerStatics.MASK_PLAYER);
|
currentPlayers = WorldGrid.getObjectsInRangePartial(this.location, CityBoundsType.ZONE.extents, MBServerStatics.MASK_PLAYER);
|
||||||
currentMemory = new HashSet<>();
|
currentMemory = new HashSet<>();
|
||||||
|
|
||||||
for (AbstractWorldObject playerObject : currentPlayers) {
|
for (AbstractWorldObject playerObject : currentPlayers) {
|
||||||
@@ -1024,15 +998,7 @@ public class City extends AbstractWorldObject {
|
|||||||
currentMemory.add(player.getObjectUUID());
|
currentMemory.add(player.getObjectUUID());
|
||||||
|
|
||||||
// Player is already in our memory
|
// Player is already in our memory
|
||||||
if(this.getBane() != null){
|
|
||||||
//handle zerg mechanics here
|
|
||||||
if(this.getBane().getSiegePhase().equals(SiegePhase.WAR)){
|
|
||||||
//bane is live, start tallying players
|
|
||||||
if(!this.baneAttendees.containsKey(player.getObjectUUID())){
|
|
||||||
this.baneAttendees.put(player.getObjectUUID(),System.currentTimeMillis());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (_playerMemory.contains(player.getObjectUUID()))
|
if (_playerMemory.contains(player.getObjectUUID()))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -1059,29 +1025,14 @@ public class City extends AbstractWorldObject {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.error(e.getMessage());
|
Logger.error(e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private void onExitBane() {
|
|
||||||
ArrayList<Integer> toRemove = new ArrayList<>();
|
|
||||||
for (Integer uuid : this.baneAttendees.keySet()) {
|
|
||||||
if (!_playerMemory.contains(uuid)) {
|
|
||||||
long timeGone = System.currentTimeMillis() - this.baneAttendees.get(uuid).longValue();
|
|
||||||
if (timeGone > 180000L) { // 3 minutes
|
|
||||||
toRemove.add(uuid); // Mark for removal
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
for(int uuid : toRemove){
|
|
||||||
this.baneAttendees.remove(uuid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void onExit(HashSet<Integer> currentMemory) {
|
private void onExit(HashSet<Integer> currentMemory) {
|
||||||
|
|
||||||
PlayerCharacter player;
|
PlayerCharacter player;
|
||||||
int playerUUID = 0;
|
int playerUUID = 0;
|
||||||
HashSet<Integer> toRemoveStandard = new HashSet<>();
|
HashSet<Integer> toRemove = new HashSet<>();
|
||||||
Iterator<Integer> iter = _playerMemory.iterator();
|
Iterator<Integer> iter = _playerMemory.iterator();
|
||||||
|
|
||||||
while (iter.hasNext()) {
|
while (iter.hasNext()) {
|
||||||
@@ -1103,28 +1054,21 @@ public class City extends AbstractWorldObject {
|
|||||||
|
|
||||||
this.removeAllCityEffects(player, false);
|
this.removeAllCityEffects(player, false);
|
||||||
|
|
||||||
player.ZergMultiplier = 1.0f;
|
|
||||||
// We will remove this player after iteration is complete
|
// We will remove this player after iteration is complete
|
||||||
// so store it in a temporary collection
|
// so store it in a temporary collection
|
||||||
|
|
||||||
toRemoveStandard.add(playerUUID);
|
toRemove.add(playerUUID);
|
||||||
// ***For debugging
|
// ***For debugging
|
||||||
// Logger.info("PlayerMemory for ", this.getCityName() + ": " + _playerMemory.size());
|
// Logger.info("PlayerMemory for ", this.getCityName() + ": " + _playerMemory.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove players from city memory
|
// Remove players from city memory
|
||||||
|
|
||||||
_playerMemory.removeAll(toRemoveStandard);
|
_playerMemory.removeAll(toRemove);
|
||||||
for (Integer removalUUID : toRemoveStandard) {
|
for (Integer removalUUID : toRemove) {
|
||||||
if (this.cityOutlaws.contains(removalUUID))
|
if (this.cityOutlaws.contains(removalUUID))
|
||||||
this.cityOutlaws.remove(removalUUID);
|
this.cityOutlaws.remove(removalUUID);
|
||||||
}
|
}
|
||||||
if(this.getBane() != null){
|
|
||||||
//handle zerg mechanics here
|
|
||||||
if(this.getBane().getSiegePhase().equals(SiegePhase.WAR)){
|
|
||||||
this.onExitBane();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getWarehouseBuildingID() {
|
public int getWarehouseBuildingID() {
|
||||||
|
|||||||
@@ -11,12 +11,7 @@ package engine.objects;
|
|||||||
|
|
||||||
import ch.claude_martin.enumbitset.EnumBitSet;
|
import ch.claude_martin.enumbitset.EnumBitSet;
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.gameManager.*;
|
import engine.gameManager.DbManager;
|
||||||
import engine.net.Dispatch;
|
|
||||||
import engine.net.DispatchMessage;
|
|
||||||
import engine.net.client.msg.CityDataMsg;
|
|
||||||
import engine.net.client.msg.ErrorPopupMsg;
|
|
||||||
import org.joda.time.DateTime;
|
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
@@ -91,15 +86,6 @@ public class Contract extends AbstractGameObject {
|
|||||||
this.iconID = rs.getInt("iconID");
|
this.iconID = rs.getInt("iconID");
|
||||||
this.vendorID = rs.getInt("vendorID");
|
this.vendorID = rs.getInt("vendorID");
|
||||||
this.allowedBuildings = EnumBitSet.asEnumBitSet(rs.getLong("allowedBuildingTypeID"), Enum.BuildingGroup.class);
|
this.allowedBuildings = EnumBitSet.asEnumBitSet(rs.getLong("allowedBuildingTypeID"), Enum.BuildingGroup.class);
|
||||||
switch(this.contractID){
|
|
||||||
case 866: //banker
|
|
||||||
case 865: //siege engineer
|
|
||||||
case 899: //alchemist
|
|
||||||
this.allowedBuildings.add(Enum.BuildingGroup.TOL);
|
|
||||||
}
|
|
||||||
if(this.getName().toLowerCase().contains("sage")){
|
|
||||||
this.allowedBuildings.add(Enum.BuildingGroup.TOL);
|
|
||||||
}
|
|
||||||
this.equipmentSet = rs.getInt("equipSetID");
|
this.equipmentSet = rs.getInt("equipSetID");
|
||||||
this.inventorySet = rs.getInt("inventorySet");
|
this.inventorySet = rs.getInt("inventorySet");
|
||||||
|
|
||||||
@@ -195,288 +181,6 @@ public class Contract extends AbstractGameObject {
|
|||||||
return this.vendorDialog;
|
return this.vendorDialog;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static VendorDialog HandleArenaMaster(int optionId, NPC npc, PlayerCharacter pc){
|
|
||||||
//1502043
|
|
||||||
pc.setLastNPCDialog(npc);
|
|
||||||
VendorDialog vd = new VendorDialog(VendorDialog.getHostileVendorDialog().getDialogType(),VendorDialog.getHostileVendorDialog().getIntro(),-1);//VendorDialog.getHostileVendorDialog();
|
|
||||||
vd.getOptions().clear();
|
|
||||||
|
|
||||||
switch(optionId){
|
|
||||||
case 15020431:
|
|
||||||
//if(pc.isBoxed){
|
|
||||||
// ChatManager.chatSystemInfo(pc, "You Cannot Join The Que, You Are Boxed");
|
|
||||||
//}else {
|
|
||||||
if (ArenaManager.playerQueue.contains(pc)) {
|
|
||||||
ChatManager.chatSystemInfo(pc, "You Are Already In The Arena Que");
|
|
||||||
} else {
|
|
||||||
ArenaManager.joinQueue(pc);
|
|
||||||
ChatManager.chatSystemInfo(pc, "You Have Joined The Arena Que");
|
|
||||||
}
|
|
||||||
//}
|
|
||||||
break;
|
|
||||||
case 15020432:
|
|
||||||
if(ArenaManager.playerQueue.contains(pc)) {
|
|
||||||
ArenaManager.leaveQueue(pc);
|
|
||||||
ChatManager.chatSystemInfo(pc, "You Have Left The Arena Que");
|
|
||||||
}else{
|
|
||||||
ChatManager.chatSystemInfo(pc, "You Are Not In The Arena Que");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
MenuOption option1 = new MenuOption(15020431, "Join Arena Que", 15020431);
|
|
||||||
vd.getOptions().add(option1);
|
|
||||||
MenuOption option2 = new MenuOption(15020432, "Leave Arena Que", 15020432);
|
|
||||||
vd.getOptions().add(option2);
|
|
||||||
return vd;
|
|
||||||
}
|
|
||||||
public static VendorDialog HandleEnrollmentOfficer(int optionId, NPC npc, PlayerCharacter pc){
|
|
||||||
pc.setLastNPCDialog(npc);
|
|
||||||
//VendorDialog vd = new VendorDialog(npc.contract.getVendorDialog().getDialogType(),npc.contract.getVendorDialog().getIntro(),-1);//VendorDialog.getHostileVendorDialog();
|
|
||||||
VendorDialog vd = new VendorDialog(npc.contract.getVendorDialog().getDialogType(),npc.contract.getVendorDialog().getIntro(),-1);//VendorDialog.getHostileVendorDialog();
|
|
||||||
vd.getOptions().clear();
|
|
||||||
switch(optionId) {
|
|
||||||
default:
|
|
||||||
if (pc.isBoxed) {
|
|
||||||
MenuOption option1 = new MenuOption(15020401, "Unbox Character", 15020401);
|
|
||||||
vd.getOptions().add(option1);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 15020401:
|
|
||||||
PlayerCharacter.unboxPlayer(pc);
|
|
||||||
vd.getOptions().clear();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return vd;
|
|
||||||
}
|
|
||||||
public static VendorDialog HandleBaneCommanderOptions(int optionId, NPC npc, PlayerCharacter pc){
|
|
||||||
pc.setLastNPCDialog(npc);
|
|
||||||
VendorDialog vd = new VendorDialog(VendorDialog.getHostileVendorDialog().getDialogType(),VendorDialog.getHostileVendorDialog().getIntro(),-1);//VendorDialog.getHostileVendorDialog();
|
|
||||||
vd.getOptions().clear();
|
|
||||||
Building building = npc.building;
|
|
||||||
Bane bane = null;
|
|
||||||
int updateBaneTime = 0;
|
|
||||||
int updateBaneDay = 0;
|
|
||||||
int updateBaneCap = 0;
|
|
||||||
|
|
||||||
int treesInNation = 0;
|
|
||||||
if(building != null)
|
|
||||||
{
|
|
||||||
City city = ZoneManager.getCityAtLocation(building.loc);
|
|
||||||
if(city != null){
|
|
||||||
bane = city.getBane();
|
|
||||||
if(!city.getGuild().equals(pc.guild))
|
|
||||||
return vd;
|
|
||||||
|
|
||||||
if(!GuildStatusController.isInnerCouncil(pc.getGuildStatus()) && !GuildStatusController.isGuildLeader(pc.getGuildStatus())){
|
|
||||||
return vd;
|
|
||||||
}
|
|
||||||
for(Guild sub : city.getGuild().getNation().getSubGuildList()){
|
|
||||||
if(sub.getOwnedCity() != null){
|
|
||||||
treesInNation += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(bane == null){
|
|
||||||
return VendorDialog.getHostileVendorDialog();
|
|
||||||
}
|
|
||||||
if(bane.timeSet && bane.capSet && bane.daySet){
|
|
||||||
vd.getOptions().clear();
|
|
||||||
return vd;
|
|
||||||
}
|
|
||||||
|
|
||||||
DateTime placement = bane.getPlacementDate();
|
|
||||||
vd.getOptions().clear();
|
|
||||||
switch(optionId){
|
|
||||||
default:
|
|
||||||
if(!bane.daySet) {
|
|
||||||
MenuOption option1 = new MenuOption(796, "Set Bane Day", 796);
|
|
||||||
vd.getOptions().add(option1);
|
|
||||||
}
|
|
||||||
if(!bane.timeSet) {
|
|
||||||
MenuOption option2 = new MenuOption(797, "Set Bane Time", 797);
|
|
||||||
vd.getOptions().add(option2);
|
|
||||||
}
|
|
||||||
if(!bane.capSet) {
|
|
||||||
MenuOption option3 = new MenuOption(797, "Set Bane Cap", 798);
|
|
||||||
vd.getOptions().add(option3);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 796: // set bane day
|
|
||||||
DateTime dayOption1Date = placement.plusDays(3);
|
|
||||||
MenuOption dayOption1 = new MenuOption(7961, dayOption1Date.toString("yyyy-MM-dd"), 7961);
|
|
||||||
vd.getOptions().add(dayOption1);
|
|
||||||
|
|
||||||
DateTime dayOption2Date = placement.plusDays(4);
|
|
||||||
MenuOption dayOption2 = new MenuOption(7962, dayOption2Date.toString("yyyy-MM-dd"), 7962);
|
|
||||||
vd.getOptions().add(dayOption2);
|
|
||||||
|
|
||||||
DateTime dayOption3Date = placement.plusDays(5);
|
|
||||||
MenuOption dayOption3 = new MenuOption(7963, dayOption3Date.toString("yyyy-MM-dd"), 7963);
|
|
||||||
vd.getOptions().add(dayOption3);
|
|
||||||
|
|
||||||
DateTime dayOption4Date = placement.plusDays(6);
|
|
||||||
MenuOption dayOption4 = new MenuOption(7964, dayOption4Date.toString("yyyy-MM-dd"), 7964);
|
|
||||||
vd.getOptions().add(dayOption4);
|
|
||||||
|
|
||||||
DateTime dayOption5Date = placement.plusDays(7);
|
|
||||||
MenuOption dayOption5 = new MenuOption(7965, dayOption5Date.toString("yyyy-MM-dd"), 7965);
|
|
||||||
vd.getOptions().add(dayOption5);
|
|
||||||
break;
|
|
||||||
case 797: // set bane time
|
|
||||||
MenuOption timeOption1 = new MenuOption(7971, "6:00 pm CST", 7971);
|
|
||||||
vd.getOptions().add(timeOption1);
|
|
||||||
|
|
||||||
MenuOption timeOption2 = new MenuOption(7972, "7:00 pm CST", 7972);
|
|
||||||
vd.getOptions().add(timeOption2);
|
|
||||||
|
|
||||||
MenuOption timeOption3 = new MenuOption(7973, "8:00 pm CST", 7973);
|
|
||||||
vd.getOptions().add(timeOption3);
|
|
||||||
|
|
||||||
MenuOption timeOption4 = new MenuOption(7974, "9:00 pm CST", 7974);
|
|
||||||
vd.getOptions().add(timeOption4);
|
|
||||||
|
|
||||||
MenuOption timeOption5 = new MenuOption(7975, "10:00 pm CST", 7975);
|
|
||||||
vd.getOptions().add(timeOption5);
|
|
||||||
break;
|
|
||||||
case 798: // set bane cap
|
|
||||||
if(treesInNation < 6) {
|
|
||||||
MenuOption capOption1 = new MenuOption(7981, "10 Maximum Players", 7981);
|
|
||||||
vd.getOptions().add(capOption1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(treesInNation < 11) {
|
|
||||||
MenuOption capOption2 = new MenuOption(7982, "20 Maximum Players", 7982);
|
|
||||||
vd.getOptions().add(capOption2);
|
|
||||||
}
|
|
||||||
|
|
||||||
MenuOption capOption3 = new MenuOption(7983, "30 Maximum Players", 7983);
|
|
||||||
vd.getOptions().add(capOption3);
|
|
||||||
|
|
||||||
MenuOption capOption4 = new MenuOption(7984, "40 Maximum Players", 7984);
|
|
||||||
vd.getOptions().add(capOption4);
|
|
||||||
|
|
||||||
MenuOption capOption5 = new MenuOption(7985, "Unlimited Players", 7985);
|
|
||||||
vd.getOptions().add(capOption5);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 7961: //3 days after placement
|
|
||||||
ErrorPopupMsg.sendErrorMsg(pc, "Bane Set 3 Days From Placement Date");
|
|
||||||
updateBaneDay = 3;
|
|
||||||
break;
|
|
||||||
case 7962: //4 days after placement
|
|
||||||
ErrorPopupMsg.sendErrorMsg(pc, "Bane Set 4 Days From Placement Date");
|
|
||||||
updateBaneDay = 4;
|
|
||||||
break;
|
|
||||||
case 7963: //5 days after placement
|
|
||||||
ErrorPopupMsg.sendErrorMsg(pc, "Bane Set 5 Days From Placement Date");
|
|
||||||
updateBaneDay = 5;
|
|
||||||
break;
|
|
||||||
case 7964: //6 days after placement
|
|
||||||
ErrorPopupMsg.sendErrorMsg(pc, "Bane Set 6 Days From Placement Date");
|
|
||||||
updateBaneDay = 6;
|
|
||||||
break;
|
|
||||||
case 7965: //7 days after placement
|
|
||||||
ErrorPopupMsg.sendErrorMsg(pc, "Bane Set 7 Days From Placement Date");
|
|
||||||
updateBaneDay = 7;
|
|
||||||
break;
|
|
||||||
case 7971: //6:00pm CST
|
|
||||||
ErrorPopupMsg.sendErrorMsg(pc, "Bane Set For 6:00 pm CST");
|
|
||||||
updateBaneTime = 6;
|
|
||||||
break;
|
|
||||||
case 7972: //7:00pm CST
|
|
||||||
ErrorPopupMsg.sendErrorMsg(pc, "Bane Set For 7:00 pm CST");
|
|
||||||
updateBaneTime = 7;
|
|
||||||
break;
|
|
||||||
case 7973: //8:00pm CST
|
|
||||||
ErrorPopupMsg.sendErrorMsg(pc, "Bane Set For 8:00 pm CST");
|
|
||||||
updateBaneTime = 8;
|
|
||||||
break;
|
|
||||||
case 7974: //9:00pm CST
|
|
||||||
ErrorPopupMsg.sendErrorMsg(pc, "Bane Set For 9:00 pm CST");
|
|
||||||
updateBaneTime = 9;
|
|
||||||
break;
|
|
||||||
case 7975: //10:00pm CST
|
|
||||||
ErrorPopupMsg.sendErrorMsg(pc, "Bane Set For 10:00 pm CST");
|
|
||||||
updateBaneTime = 10;
|
|
||||||
break;
|
|
||||||
case 7981: //cap = 10
|
|
||||||
ErrorPopupMsg.sendErrorMsg(pc, "Bane Cap Set To 10 Players On Each Side");
|
|
||||||
updateBaneCap = 10;
|
|
||||||
break;
|
|
||||||
case 7982: //cap = 20
|
|
||||||
ErrorPopupMsg.sendErrorMsg(pc, "Bane Cap Set To 20 Players On Each Side");
|
|
||||||
updateBaneCap = 20;
|
|
||||||
break;
|
|
||||||
case 7983: //cap = 30
|
|
||||||
ErrorPopupMsg.sendErrorMsg(pc, "Bane Cap Set To 30 Players On Each Side");
|
|
||||||
updateBaneCap = 30;
|
|
||||||
break;
|
|
||||||
case 7984: //cap = 40
|
|
||||||
ErrorPopupMsg.sendErrorMsg(pc, "Bane Cap Set To 40 Players On Each Side");
|
|
||||||
updateBaneCap = 40;
|
|
||||||
break;
|
|
||||||
case 7985: //cap = Unlimited
|
|
||||||
ErrorPopupMsg.sendErrorMsg(pc, "Bane Cap Set To Unlimited Players On Each Side");
|
|
||||||
updateBaneCap = 9999;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (updateBaneDay > 0) {
|
|
||||||
if(DbManager.BaneQueries.SET_BANE_DAY_NEW(updateBaneDay,bane.getCityUUID())){
|
|
||||||
bane.daySet = true;
|
|
||||||
if(bane.getLiveDate() == null) {
|
|
||||||
bane.setLiveDate_NEW(bane.getPlacementDate().plusDays(updateBaneDay));
|
|
||||||
}else{
|
|
||||||
bane.setLiveDate_NEW(bane.getLiveDate().plusDays(updateBaneDay));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (updateBaneTime > 0) {
|
|
||||||
if(DbManager.BaneQueries.SET_BANE_TIME_NEW(updateBaneTime,bane.getCityUUID())){
|
|
||||||
bane.timeSet = true;
|
|
||||||
if(bane.getLiveDate() == null) {
|
|
||||||
bane.setLiveDate_NEW(bane.getPlacementDate().withHourOfDay(12 + updateBaneTime));
|
|
||||||
}else{
|
|
||||||
bane.setLiveDate_NEW(bane.getLiveDate().withHourOfDay(12 + updateBaneTime));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bane.setLiveDate(DbManager.BaneQueries.getLiveDate(bane.getCityUUID()));
|
|
||||||
}
|
|
||||||
if (updateBaneCap > 0) {
|
|
||||||
if(DbManager.BaneQueries.SET_BANE_CAP_NEW(updateBaneCap,bane.getCityUUID())){
|
|
||||||
bane.capSet = true;
|
|
||||||
bane.capSize = updateBaneCap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(updateBaneCap > 0 || updateBaneTime > 0 || updateBaneDay > 0) {
|
|
||||||
bane.getSiegePhase();
|
|
||||||
for (PlayerCharacter playerCharacter : SessionManager.getAllActivePlayerCharacters()) {
|
|
||||||
CityDataMsg cityDataMsg = new CityDataMsg(SessionManager.getSession(playerCharacter), false);
|
|
||||||
cityDataMsg.updateMines(true);
|
|
||||||
cityDataMsg.updateCities(true);
|
|
||||||
Dispatch dispatch = Dispatch.borrow(playerCharacter, cityDataMsg);
|
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
|
|
||||||
}
|
|
||||||
vd.getOptions().clear();
|
|
||||||
if(!bane.daySet) {
|
|
||||||
MenuOption option1 = new MenuOption(796, "Set Bane Day", 796);
|
|
||||||
vd.getOptions().add(option1);
|
|
||||||
}
|
|
||||||
if(!bane.timeSet) {
|
|
||||||
MenuOption option2 = new MenuOption(797, "Set Bane Time", 797);
|
|
||||||
vd.getOptions().add(option2);
|
|
||||||
}
|
|
||||||
if(!bane.capSet) {
|
|
||||||
MenuOption option3 = new MenuOption(797, "Set Bane Cap", 798);
|
|
||||||
vd.getOptions().add(option3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return vd;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ArrayList<Integer> getNPCMenuOptions() {
|
public ArrayList<Integer> getNPCMenuOptions() {
|
||||||
return this.npcMenuOptions;
|
return this.npcMenuOptions;
|
||||||
}
|
}
|
||||||
@@ -494,92 +198,6 @@ public class Contract extends AbstractGameObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<MobEquipment> getSellInventory() {
|
public ArrayList<MobEquipment> getSellInventory() {
|
||||||
if(this.getObjectUUID() == 900){ //resource merchant
|
|
||||||
for(MobEquipment me : this.sellInventory){
|
|
||||||
if(me.getItemBase().getType().equals(Enum.ItemType.RESOURCE)){
|
|
||||||
int amountResource = Warehouse.getSellStackSize(me.getItemBase().getUUID());
|
|
||||||
me.magicValue = amountResource * me.getItemBase().getBaseValue();
|
|
||||||
} else{
|
|
||||||
me.magicValue = 1000000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(this.getObjectUUID() == 1202){ //rune merchant
|
|
||||||
for(MobEquipment me : this.sellInventory){
|
|
||||||
switch(me.getItemBase().getUUID()){
|
|
||||||
case 250001: //5 stats
|
|
||||||
case 250010:
|
|
||||||
case 250019:
|
|
||||||
case 250028:
|
|
||||||
case 250037:
|
|
||||||
me.magicValue = 3000000;
|
|
||||||
break;
|
|
||||||
case 250002: //10 stats
|
|
||||||
case 250011:
|
|
||||||
case 250020:
|
|
||||||
case 250029:
|
|
||||||
case 250038:
|
|
||||||
me.magicValue = 4000000;
|
|
||||||
break;
|
|
||||||
case 250003: //15 stats
|
|
||||||
case 250012:
|
|
||||||
case 250021:
|
|
||||||
case 250030:
|
|
||||||
case 250039:
|
|
||||||
me.magicValue = 5000000;
|
|
||||||
break;
|
|
||||||
case 250004: //20 stats
|
|
||||||
case 250013:
|
|
||||||
case 250022:
|
|
||||||
case 250031:
|
|
||||||
case 250040:
|
|
||||||
me.magicValue = 6000000;
|
|
||||||
break;
|
|
||||||
case 250005: //25 stats
|
|
||||||
case 250014:
|
|
||||||
case 250023:
|
|
||||||
case 250032:
|
|
||||||
case 250041:
|
|
||||||
me.magicValue = 7000000;
|
|
||||||
break;
|
|
||||||
case 250006: //30 stats
|
|
||||||
case 250015:
|
|
||||||
case 250024:
|
|
||||||
case 250033:
|
|
||||||
case 250042:
|
|
||||||
me.magicValue = 8000000;
|
|
||||||
break;
|
|
||||||
case 250007: //35 stats
|
|
||||||
case 250016:
|
|
||||||
case 250025:
|
|
||||||
case 250034:
|
|
||||||
case 250043:
|
|
||||||
me.magicValue = 9000000;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
me.magicValue = 10000000;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(this.getObjectUUID() == 1201){ //disc merchant
|
|
||||||
for(MobEquipment me : this.sellInventory){
|
|
||||||
if(me.getItemBase().getName().equals("Prospector")){
|
|
||||||
me.magicValue = 500000;
|
|
||||||
}else{
|
|
||||||
me.magicValue = 10000000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(this.getObjectUUID() == 1502041) {//noob helper{
|
|
||||||
for(MobEquipment me : this.sellInventory){
|
|
||||||
me.magicValue = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.sellInventory;
|
return this.sellInventory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
package engine.objects;
|
package engine.objects;
|
||||||
|
|
||||||
import engine.Enum;
|
|
||||||
import engine.Enum.TargetColor;
|
import engine.Enum.TargetColor;
|
||||||
import engine.gameManager.ZoneManager;
|
import engine.gameManager.ZoneManager;
|
||||||
import engine.math.Vector3fImmutable;
|
import engine.math.Vector3fImmutable;
|
||||||
@@ -118,11 +117,6 @@ public class Experience {
|
|||||||
159932666, // Level 74
|
159932666, // Level 74
|
||||||
169707808, // Level 75
|
169707808, // Level 75
|
||||||
179921247, // Level 76
|
179921247, // Level 76
|
||||||
190585732, // Level 77
|
|
||||||
201714185, // Level 78
|
|
||||||
213319687, // Level 79
|
|
||||||
225415457, // Level 80
|
|
||||||
238014819 // Level 81
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -220,14 +214,7 @@ 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
|
||||||
268774.71f, //Level 75
|
1 // 268774.71 //Level 75
|
||||||
280647.69f, // Level 76
|
|
||||||
292865.22f, // Level 77
|
|
||||||
305433.33f, // Level 78
|
|
||||||
318358.08f, // Level 79
|
|
||||||
|
|
||||||
// R8
|
|
||||||
1 //331645.74f // 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
|
||||||
@@ -281,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];
|
||||||
}
|
}
|
||||||
@@ -292,17 +279,17 @@ public class Experience {
|
|||||||
|
|
||||||
switch (TargetColor.getCon(pc, mob)) {
|
switch (TargetColor.getCon(pc, mob)) {
|
||||||
case Red:
|
case Red:
|
||||||
return 1.1;
|
return 1.25;
|
||||||
case Orange:
|
case Orange:
|
||||||
return 1.15;
|
return 1.15;
|
||||||
case Yellow:
|
case Yellow:
|
||||||
return 1.2;
|
return 1.05;
|
||||||
case Blue:
|
case Blue:
|
||||||
return 1.25;
|
return 1;
|
||||||
case Cyan:
|
case Cyan:
|
||||||
return 0.9;
|
return 0.8;
|
||||||
case Green:
|
case Green:
|
||||||
return 0.7;
|
return 0.5;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -346,9 +333,6 @@ public class Experience {
|
|||||||
if (killer == null || mob == null)
|
if (killer == null || mob == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(killer.equals(mob))
|
|
||||||
return;
|
|
||||||
|
|
||||||
double grantedExperience = 0.0;
|
double grantedExperience = 0.0;
|
||||||
|
|
||||||
if (g != null) { // Do group EXP stuff
|
if (g != null) { // Do group EXP stuff
|
||||||
@@ -399,14 +383,10 @@ public class Experience {
|
|||||||
if (playerCharacter.getLevel() >= MBServerStatics.LEVELCAP)
|
if (playerCharacter.getLevel() >= MBServerStatics.LEVELCAP)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(playerCharacter.level >= 75 && !mob.getObjectType().equals(Enum.GameObjectType.PlayerCharacter))
|
|
||||||
continue; // cannot PVE higher than level 75
|
|
||||||
|
|
||||||
// Sets Max XP with server exp mod taken into account.
|
// Sets Max XP with server exp mod taken into account.
|
||||||
|
|
||||||
grantedExperience = (double) LOOTMANAGER.NORMAL_EXP_RATE * maxXPPerKill(playerCharacter.getLevel());
|
grantedExperience = (double) LOOTMANAGER.NORMAL_EXP_RATE * maxXPPerKill(playerCharacter.getLevel());
|
||||||
|
|
||||||
grantedExperience *= (1/ giveEXPTo.size()+0.9);
|
|
||||||
// Adjust XP for Mob Level
|
// Adjust XP for Mob Level
|
||||||
|
|
||||||
grantedExperience *= getConMod(playerCharacter, mob);
|
grantedExperience *= getConMod(playerCharacter, mob);
|
||||||
@@ -448,13 +428,10 @@ public class Experience {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else { // Give EXP to a single character
|
} else { // Give EXP to a single character
|
||||||
//if (!killer.isAlive()) // Skip if the player is dead.
|
if (!killer.isAlive()) // Skip if the player is dead.
|
||||||
// return;
|
|
||||||
|
|
||||||
if (killer.getLevel() >= MBServerStatics.LEVELCAP)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(killer.level >= 75 && !mob.getObjectType().equals(Enum.GameObjectType.PlayerCharacter))
|
if (killer.getLevel() >= MBServerStatics.LEVELCAP)
|
||||||
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
|
||||||
|
|||||||
@@ -521,10 +521,6 @@ public class Guild extends AbstractWorldObject {
|
|||||||
public void setICMOTD(String value) {
|
public void setICMOTD(String value) {
|
||||||
this.icmotd = value;
|
this.icmotd = value;
|
||||||
}
|
}
|
||||||
public void setNMOTD(String value) {
|
|
||||||
this.nmotd = value;
|
|
||||||
}
|
|
||||||
public String getNMOTD(){return nmotd;}
|
|
||||||
|
|
||||||
public boolean isNPCGuild() {
|
public boolean isNPCGuild() {
|
||||||
|
|
||||||
@@ -756,9 +752,9 @@ public class Guild extends AbstractWorldObject {
|
|||||||
canSub = false;
|
canSub = false;
|
||||||
}
|
}
|
||||||
City nationCap = City.getCity(nation.cityUUID);
|
City nationCap = City.getCity(nation.cityUUID);
|
||||||
//if (nation.getSubGuildList().size() >= nationCap.getRank()) {
|
if (nation.getSubGuildList().size() >= nationCap.getRank()) {
|
||||||
// canSub = false;
|
canSub = false;
|
||||||
//}
|
}
|
||||||
return canSub;
|
return canSub;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import engine.net.client.ClientConnection;
|
|||||||
import engine.net.client.msg.DeleteItemMsg;
|
import engine.net.client.msg.DeleteItemMsg;
|
||||||
import engine.powers.EffectsBase;
|
import engine.powers.EffectsBase;
|
||||||
import engine.powers.effectmodifiers.AbstractEffectModifier;
|
import engine.powers.effectmodifiers.AbstractEffectModifier;
|
||||||
import engine.powers.effectmodifiers.WeaponProcEffectModifier;
|
|
||||||
import engine.powers.poweractions.AbstractPowerAction;
|
import engine.powers.poweractions.AbstractPowerAction;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
@@ -234,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)
|
||||||
@@ -303,7 +303,7 @@ public class Item extends AbstractWorldObject {
|
|||||||
writer.putString(item.customName); // Unknown. pad?
|
writer.putString(item.customName); // Unknown. pad?
|
||||||
writer.put((byte) 1); // End Datablock byte
|
writer.put((byte) 1); // End Datablock byte
|
||||||
|
|
||||||
writer.putFloat((float) item.getDurabilityMax());
|
writer.putFloat((float) item.durabilityMax);
|
||||||
writer.putFloat((float) item.durabilityCurrent);
|
writer.putFloat((float) item.durabilityCurrent);
|
||||||
|
|
||||||
writer.put((byte) 1); // End Datablock byte
|
writer.put((byte) 1); // End Datablock byte
|
||||||
@@ -609,7 +609,7 @@ public class Item extends AbstractWorldObject {
|
|||||||
writer.putIntAt(serialized, indexPosition);
|
writer.putIntAt(serialized, indexPosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Item createItemForPlayer(PlayerCharacter pc, ItemBase ib, boolean fromNoob) {
|
public static Item createItemForPlayer(PlayerCharacter pc, ItemBase ib) {
|
||||||
Item item = null;
|
Item item = null;
|
||||||
byte charges = 0;
|
byte charges = 0;
|
||||||
|
|
||||||
@@ -817,29 +817,8 @@ public class Item extends AbstractWorldObject {
|
|||||||
return ownerID;
|
return ownerID;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stripCastableEnchants(){
|
|
||||||
ArrayList<String> keys =new ArrayList<>();
|
|
||||||
|
|
||||||
for(String eff : this.effects.keySet()){
|
|
||||||
for(AbstractEffectModifier mod : this.effects.get(eff).getEffectsBase().getModifiers()){
|
|
||||||
if(mod.modType.equals(ModType.WeaponProc)){
|
|
||||||
keys.add(eff);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for(String eff : keys){
|
|
||||||
try {
|
|
||||||
this.effects.get(eff).endEffect();
|
|
||||||
this.effects.remove(eff);
|
|
||||||
}catch(Exception e){
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//Only to be used for trading
|
//Only to be used for trading
|
||||||
public void setOwnerID(int ownerID) {
|
public void setOwnerID(int ownerID) {
|
||||||
this.stripCastableEnchants();
|
|
||||||
this.ownerID = ownerID;
|
this.ownerID = ownerID;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -863,7 +842,6 @@ public class Item extends AbstractWorldObject {
|
|||||||
public boolean setOwner(AbstractGameObject owner) {
|
public boolean setOwner(AbstractGameObject owner) {
|
||||||
if (owner == null)
|
if (owner == null)
|
||||||
return false;
|
return false;
|
||||||
this.stripCastableEnchants();
|
|
||||||
if (owner.getObjectType().equals(GameObjectType.NPC))
|
if (owner.getObjectType().equals(GameObjectType.NPC))
|
||||||
this.ownerType = OwnerType.Npc;
|
this.ownerType = OwnerType.Npc;
|
||||||
else if (owner.getObjectType().equals(GameObjectType.PlayerCharacter))
|
else if (owner.getObjectType().equals(GameObjectType.PlayerCharacter))
|
||||||
@@ -907,15 +885,7 @@ public class Item extends AbstractWorldObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public short getDurabilityMax() {
|
public short getDurabilityMax() {
|
||||||
int extra = 0;
|
return durabilityMax;
|
||||||
for(Effect eff : this.effects.values()){
|
|
||||||
for(AbstractEffectModifier mod : eff.getEffectModifiers()){
|
|
||||||
if(mod.modType.equals(ModType.Durability)){
|
|
||||||
extra += mod.getMaxMod();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (short)(durabilityMax + extra);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isCanDestroy() {
|
public boolean isCanDestroy() {
|
||||||
@@ -978,7 +948,6 @@ public class Item extends AbstractWorldObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isID() {
|
public boolean isID() {
|
||||||
this.flags |= 1;
|
|
||||||
return ((this.flags & 1) > 0);
|
return ((this.flags & 1) > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1085,7 +1054,6 @@ public class Item extends AbstractWorldObject {
|
|||||||
this.ownerID = pc.getObjectUUID();
|
this.ownerID = pc.getObjectUUID();
|
||||||
this.ownerType = OwnerType.PlayerCharacter;
|
this.ownerType = OwnerType.PlayerCharacter;
|
||||||
this.containerType = ItemContainerType.INVENTORY;
|
this.containerType = ItemContainerType.INVENTORY;
|
||||||
this.stripCastableEnchants();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1106,7 +1074,6 @@ public class Item extends AbstractWorldObject {
|
|||||||
this.ownerID = npc.getObjectUUID();
|
this.ownerID = npc.getObjectUUID();
|
||||||
this.ownerType = OwnerType.Npc;
|
this.ownerType = OwnerType.Npc;
|
||||||
this.containerType = Enum.ItemContainerType.INVENTORY;
|
this.containerType = Enum.ItemContainerType.INVENTORY;
|
||||||
this.stripCastableEnchants();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1124,7 +1091,6 @@ public class Item extends AbstractWorldObject {
|
|||||||
this.ownerID = 0;
|
this.ownerID = 0;
|
||||||
this.ownerType = null;
|
this.ownerType = null;
|
||||||
this.containerType = Enum.ItemContainerType.INVENTORY;
|
this.containerType = Enum.ItemContainerType.INVENTORY;
|
||||||
this.stripCastableEnchants();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1231,7 +1197,6 @@ public class Item extends AbstractWorldObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int getBaseValue() {
|
public int getBaseValue() {
|
||||||
|
|
||||||
if (this.getItemBase() != null)
|
if (this.getItemBase() != null)
|
||||||
return this.getItemBase().getBaseValue();
|
return this.getItemBase().getBaseValue();
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1275,8 +1240,6 @@ public class Item extends AbstractWorldObject {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
AbstractPowerAction apa = PowersManager.getPowerActionByIDString(effect.getIDString());
|
AbstractPowerAction apa = PowersManager.getPowerActionByIDString(effect.getIDString());
|
||||||
|
|
||||||
if(apa != null)
|
|
||||||
apa.applyBakedInStatsForItem(this, this.getItemBase().getBakedInStats().get(token));
|
apa.applyBakedInStatsForItem(this, this.getItemBase().getBakedInStats().get(token));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ public class ItemBase {
|
|||||||
private boolean isStrBased;
|
private boolean isStrBased;
|
||||||
private ArrayList<Integer> animations = new ArrayList<>();
|
private ArrayList<Integer> animations = new ArrayList<>();
|
||||||
private ArrayList<Integer> offHandAnimations = new ArrayList<>();
|
private ArrayList<Integer> offHandAnimations = new ArrayList<>();
|
||||||
|
private boolean autoID = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ResultSet Constructor
|
* ResultSet Constructor
|
||||||
@@ -144,6 +145,8 @@ public class ItemBase {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.autoIDItemsCheck();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
DbManager.ItemBaseQueries.LOAD_ANIMATIONS(this);
|
DbManager.ItemBaseQueries.LOAD_ANIMATIONS(this);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -229,79 +232,7 @@ public class ItemBase {
|
|||||||
AnniverseryGifts.add(5101060);
|
AnniverseryGifts.add(5101060);
|
||||||
AnniverseryGifts.add(5101080);
|
AnniverseryGifts.add(5101080);
|
||||||
|
|
||||||
//fate peddler presents
|
|
||||||
AnniverseryGifts.add(971012);
|
|
||||||
AnniverseryGifts.add(971013);
|
|
||||||
AnniverseryGifts.add(971014);
|
|
||||||
AnniverseryGifts.add(971015);
|
|
||||||
AnniverseryGifts.add(971016);
|
|
||||||
AnniverseryGifts.add(971017);
|
|
||||||
AnniverseryGifts.add(971018);
|
|
||||||
AnniverseryGifts.add(971019);
|
|
||||||
AnniverseryGifts.add(971020);
|
|
||||||
AnniverseryGifts.add(971021);
|
|
||||||
AnniverseryGifts.add(971022);
|
|
||||||
AnniverseryGifts.add(971023);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getDiscPrice(int uuid) {
|
|
||||||
if(uuid == 3040)
|
|
||||||
return 500000;
|
|
||||||
else return 10000000;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getStatPrice(int uuid) {
|
|
||||||
switch(uuid){
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
return 10000000;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -441,10 +372,74 @@ public class ItemBase {
|
|||||||
return modTable;
|
return modTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getVendorType() {
|
||||||
|
return vendorType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVendorType(int vendorType) {
|
||||||
|
this.vendorType = vendorType;
|
||||||
|
}
|
||||||
|
|
||||||
public int getHashID() {
|
public int getHashID() {
|
||||||
return hashID;
|
return hashID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setHashID(int hashID) {
|
||||||
|
this.hashID = hashID;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void autoIDItemsCheck() {
|
||||||
|
//AUto ID Vorg and Glass
|
||||||
|
switch (uuid) {
|
||||||
|
|
||||||
|
case 27550:
|
||||||
|
case 27560:
|
||||||
|
case 27580:
|
||||||
|
case 27590:
|
||||||
|
case 188500:
|
||||||
|
case 188510:
|
||||||
|
case 188520:
|
||||||
|
case 188530:
|
||||||
|
case 188540:
|
||||||
|
case 188550:
|
||||||
|
case 189100:
|
||||||
|
case 189110:
|
||||||
|
case 189120:
|
||||||
|
case 189130:
|
||||||
|
case 189140:
|
||||||
|
case 189150:
|
||||||
|
case 189510:
|
||||||
|
case 27600:
|
||||||
|
case 181840:
|
||||||
|
case 188700:
|
||||||
|
case 188720:
|
||||||
|
case 189550:
|
||||||
|
case 189560:
|
||||||
|
case 7000100:
|
||||||
|
case 7000110:
|
||||||
|
case 7000120:
|
||||||
|
case 7000130:
|
||||||
|
case 7000140:
|
||||||
|
case 7000150:
|
||||||
|
case 7000160:
|
||||||
|
case 7000170:
|
||||||
|
case 7000180:
|
||||||
|
case 7000190:
|
||||||
|
case 7000200:
|
||||||
|
case 7000210:
|
||||||
|
case 7000220:
|
||||||
|
case 7000230:
|
||||||
|
case 7000240:
|
||||||
|
case 7000250:
|
||||||
|
case 7000270:
|
||||||
|
case 7000280:
|
||||||
|
this.autoID = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
this.autoID = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean validForSkills(ConcurrentHashMap<String, CharacterSkill> skills) {
|
public boolean validForSkills(ConcurrentHashMap<String, CharacterSkill> skills) {
|
||||||
|
|
||||||
CharacterSkill characterSkill;
|
CharacterSkill characterSkill;
|
||||||
@@ -911,4 +906,12 @@ public class ItemBase {
|
|||||||
public void setOffHandAnimations(ArrayList<Integer> offHandAnimations) {
|
public void setOffHandAnimations(ArrayList<Integer> offHandAnimations) {
|
||||||
this.offHandAnimations = offHandAnimations;
|
this.offHandAnimations = offHandAnimations;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isAutoID() {
|
||||||
|
return autoID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAutoID(boolean autoID) {
|
||||||
|
this.autoID = autoID;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class ItemFactory {
|
|||||||
itemManager.updateInventory();
|
itemManager.updateInventory();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Item ResourceRoll(NPC npc, PlayerCharacter pc, int itemsToRoll, int itemID, int pToken, int sToken, String customName) {
|
public static Item fillForge(NPC npc, PlayerCharacter pc, int itemsToRoll, int itemID, int pToken, int sToken, String customName) {
|
||||||
|
|
||||||
String prefixString = "";
|
String prefixString = "";
|
||||||
String suffixString = "";
|
String suffixString = "";
|
||||||
@@ -215,7 +215,7 @@ public class ItemFactory {
|
|||||||
pi.setAmount(itemsToRoll);
|
pi.setAmount(itemsToRoll);
|
||||||
pi.setRandom(false);
|
pi.setRandom(false);
|
||||||
|
|
||||||
ItemQueue produced = ItemQueue.borrow(pi, (long) time);
|
ItemQueue produced = ItemQueue.borrow(pi, (long) (time * Float.parseFloat(ConfigManager.MB_PRODUCTION_RATE.getValue())));
|
||||||
ItemProductionManager.send(produced);
|
ItemProductionManager.send(produced);
|
||||||
|
|
||||||
return ml;
|
return ml;
|
||||||
@@ -410,7 +410,7 @@ public class ItemFactory {
|
|||||||
|
|
||||||
if (overdraft > 0 && !useWarehouse) {
|
if (overdraft > 0 && !useWarehouse) {
|
||||||
if (pc != null)
|
if (pc != null)
|
||||||
ErrorPopupMsg.sendErrorMsg(pc, "Not enough gold in building strongbox. " + ib.getName());
|
ErrorPopupMsg.sendErrorMsg(pc, "Not enough gold in building strongbox." + ib.getName());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -707,7 +707,7 @@ public class ItemFactory {
|
|||||||
|
|
||||||
if (rollPrefix < 80) {
|
if (rollPrefix < 80) {
|
||||||
|
|
||||||
int randomPrefix = 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 = 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)
|
||||||
@@ -774,43 +774,6 @@ public class ItemFactory {
|
|||||||
return toRoll;
|
return toRoll;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int TableRoll(int vendorLevel) {
|
|
||||||
// Calculate min and max based on mobLevel
|
|
||||||
int min = 60;
|
|
||||||
int max = 120;
|
|
||||||
switch(vendorLevel){
|
|
||||||
case 20:
|
|
||||||
min = 70;
|
|
||||||
max = 140;
|
|
||||||
break;
|
|
||||||
case 30:
|
|
||||||
min = 80;
|
|
||||||
max = 160;
|
|
||||||
break;
|
|
||||||
case 40:
|
|
||||||
min = 90;
|
|
||||||
max = 180;
|
|
||||||
break;
|
|
||||||
case 50:
|
|
||||||
min = 100;
|
|
||||||
max = 200;
|
|
||||||
break;
|
|
||||||
case 60:
|
|
||||||
min = 175;
|
|
||||||
max = 260;
|
|
||||||
break;
|
|
||||||
case 70:
|
|
||||||
min = 220;
|
|
||||||
max = 320;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
int roll = ThreadLocalRandom.current().nextInt(min, max + 1);
|
|
||||||
|
|
||||||
return roll;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static MobLoot produceRandomRoll(NPC npc, PlayerCharacter pc, String prefixString, String suffixString, int itemID) {
|
public static MobLoot produceRandomRoll(NPC npc, PlayerCharacter pc, String prefixString, String suffixString, int itemID) {
|
||||||
|
|
||||||
boolean useWarehouse = false;
|
boolean useWarehouse = false;
|
||||||
@@ -922,8 +885,8 @@ public class ItemFactory {
|
|||||||
|
|
||||||
ItemBase goldIB = ItemBase.getGoldItemBase();
|
ItemBase goldIB = ItemBase.getGoldItemBase();
|
||||||
|
|
||||||
//int baseCost = ib.getBaseValue();
|
int baseCost = ib.getBaseValue();
|
||||||
int total = ib.getBaseValue();
|
int total = (int) (baseCost + baseCost * .10);
|
||||||
|
|
||||||
EffectsBase suffix = null;
|
EffectsBase suffix = null;
|
||||||
|
|
||||||
@@ -936,7 +899,7 @@ public class ItemFactory {
|
|||||||
|
|
||||||
//calculate gold costs and remove from the warehouse
|
//calculate gold costs and remove from the warehouse
|
||||||
if (prefix != null || suffix != null) {
|
if (prefix != null || suffix != null) {
|
||||||
int costToCreate = ib.getBaseValue();
|
int costToCreate = (int) (ib.getBaseValue() + ib.getBaseValue() * .10f);
|
||||||
int buildingWithdraw = BuildingManager.GetWithdrawAmountForRolling(forge, costToCreate);
|
int buildingWithdraw = BuildingManager.GetWithdrawAmountForRolling(forge, costToCreate);
|
||||||
int overdraft = BuildingManager.GetOverdraft(forge, costToCreate);
|
int overdraft = BuildingManager.GetOverdraft(forge, costToCreate);
|
||||||
|
|
||||||
|
|||||||
@@ -31,13 +31,6 @@ public class MenuOption extends AbstractGameObject {
|
|||||||
this.prereq = rs.getInt("prereq");
|
this.prereq = rs.getInt("prereq");
|
||||||
}
|
}
|
||||||
|
|
||||||
public MenuOption(int id, String msg, int option){
|
|
||||||
this.menuID = id;
|
|
||||||
this.message = msg;
|
|
||||||
this.optionID = option;
|
|
||||||
this.prereq = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Getters
|
* Getters
|
||||||
*/
|
*/
|
||||||
|
|||||||
+80
-323
@@ -10,11 +10,11 @@
|
|||||||
package engine.objects;
|
package engine.objects;
|
||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.InterestManagement.InterestManager;
|
|
||||||
import engine.InterestManagement.WorldGrid;
|
import engine.InterestManagement.WorldGrid;
|
||||||
import engine.gameManager.*;
|
import engine.gameManager.BuildingManager;
|
||||||
import engine.math.Vector3f;
|
import engine.gameManager.ChatManager;
|
||||||
import engine.math.Vector3fImmutable;
|
import engine.gameManager.DbManager;
|
||||||
|
import engine.gameManager.ZoneManager;
|
||||||
import engine.net.ByteBufferWriter;
|
import engine.net.ByteBufferWriter;
|
||||||
import engine.net.client.msg.ErrorPopupMsg;
|
import engine.net.client.msg.ErrorPopupMsg;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
@@ -25,9 +25,6 @@ import java.sql.ResultSet;
|
|||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
import static engine.gameManager.DbManager.MineQueries;
|
import static engine.gameManager.DbManager.MineQueries;
|
||||||
@@ -54,48 +51,20 @@ public class Mine extends AbstractGameObject {
|
|||||||
private int buildingID;
|
private int buildingID;
|
||||||
private MineProduction mineType;
|
private MineProduction mineType;
|
||||||
|
|
||||||
public int openHour;
|
|
||||||
public int openMinute;
|
|
||||||
public int capSize;
|
|
||||||
public LocalDateTime liveTime;
|
|
||||||
public final HashSet<Integer> _playerMemory = new HashSet<>();
|
|
||||||
public ArrayList<PlayerCharacter> affectedPlayers = new ArrayList<>();
|
|
||||||
|
|
||||||
//stronghold stuff
|
|
||||||
public boolean isStronghold = false;
|
|
||||||
public ArrayList<Mob> strongholdMobs;
|
|
||||||
public HashMap<Integer,Integer> oldBuildings;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ResultSet Constructor
|
* ResultSet Constructor
|
||||||
*/
|
*/
|
||||||
public Mine(ResultSet rs) throws SQLException, UnknownHostException {
|
public Mine(ResultSet rs) throws SQLException, UnknownHostException {
|
||||||
super(rs);
|
super(rs);
|
||||||
|
|
||||||
if (rs.getInt("capSize") == 0) {
|
|
||||||
throw new IllegalArgumentException("Mine creation canceled: capSize cannot be 0");
|
|
||||||
}
|
|
||||||
|
|
||||||
this.mineType = MineProduction.getByName(rs.getString("mine_type"));
|
this.mineType = MineProduction.getByName(rs.getString("mine_type"));
|
||||||
|
|
||||||
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(ZoneManager.getZoneByUUID(parent) != null) {
|
|
||||||
this.parentZone = ZoneManager.getZoneByUUID(parent);
|
this.parentZone = ZoneManager.getZoneByUUID(parent);
|
||||||
this.zoneName = this.parentZone.getParent().getName();
|
this.zoneName = this.parentZone.getParent().getName();
|
||||||
}else{
|
|
||||||
this.parentZone = ZoneManager.getSeaFloor();
|
|
||||||
if(this.parentZone.getParent() != null)
|
|
||||||
this.zoneName = this.parentZone.getParent().getName();
|
|
||||||
else
|
|
||||||
this.zoneName = "FAILED TO LOAD ZONE";
|
|
||||||
Logger.error("MINE FAILED TO LOAD PARENT: ");
|
|
||||||
Logger.error("MINE UID: " + rs.getInt("UID"));
|
|
||||||
Logger.error("MINE buildingID: " + buildingID);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
this.owningGuild = Guild.getGuild(ownerUID);
|
this.owningGuild = Guild.getGuild(ownerUID);
|
||||||
Guild nation = null;
|
Guild nation = null;
|
||||||
@@ -121,15 +90,7 @@ public class Mine extends AbstractGameObject {
|
|||||||
|
|
||||||
this.production = Resource.valueOf(rs.getString("mine_resource"));
|
this.production = Resource.valueOf(rs.getString("mine_resource"));
|
||||||
this.lastClaimer = null;
|
this.lastClaimer = null;
|
||||||
this.openHour = rs.getInt("mineLiveHour");
|
|
||||||
this.openMinute = rs.getInt("mineLiveMinute");
|
|
||||||
this.capSize = rs.getInt("capSize");
|
|
||||||
this.liveTime = LocalDateTime.now().withHour(this.openHour).withMinute(this.openMinute);
|
|
||||||
Building tower = BuildingManager.getBuildingFromCache(this.buildingID);
|
|
||||||
if(tower != null){
|
|
||||||
tower.setMaxHitPoints(5000f * this.capSize);
|
|
||||||
tower.setCurrentHitPoints(tower.healthMax);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void releaseMineClaims(PlayerCharacter playerCharacter) {
|
public static void releaseMineClaims(PlayerCharacter playerCharacter) {
|
||||||
@@ -182,11 +143,9 @@ public class Mine extends AbstractGameObject {
|
|||||||
ArrayList<Mine> serverMines = MineQueries.GET_ALL_MINES_FOR_SERVER();
|
ArrayList<Mine> serverMines = MineQueries.GET_ALL_MINES_FOR_SERVER();
|
||||||
|
|
||||||
for (Mine mine : serverMines) {
|
for (Mine mine : serverMines) {
|
||||||
if(mine.capSize != 0) {
|
|
||||||
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) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@@ -202,59 +161,57 @@ public class Mine extends AbstractGameObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void serializeForClientMsg(Mine mine, ByteBufferWriter writer) {
|
public static void serializeForClientMsg(Mine mine, ByteBufferWriter writer) {
|
||||||
try {
|
|
||||||
writer.putInt(mine.getObjectType().ordinal());
|
writer.putInt(mine.getObjectType().ordinal());
|
||||||
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
|
||||||
if(mine.isStronghold){
|
|
||||||
writer.putString("STRONGHOLD");
|
|
||||||
writer.putString("");
|
|
||||||
}else {
|
|
||||||
writer.putString(mine.mineType.name);
|
writer.putString(mine.mineType.name);
|
||||||
writer.putString(mine.capSize + " Man ");
|
writer.putString(mine.zoneName);
|
||||||
}
|
|
||||||
//writer.putString(mine.zoneName + " " + mine.capSize + " Man ");
|
|
||||||
|
|
||||||
writer.putInt(mine.production.hash);
|
writer.putInt(mine.production.hash);
|
||||||
writer.putInt(mine.production.baseProduction);
|
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
|
writer.putInt(3600); //window in seconds
|
||||||
|
|
||||||
LocalDateTime mineOpenTime = LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute).withSecond(0).withNano(0);
|
// Errant mines are currently open. Set time to now.
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
writer.putLocalDateTime(mineOpenTime);
|
writer.putLocalDateTime(mineOpenTime);
|
||||||
writer.putLocalDateTime(mineOpenTime.plusMinutes(30));
|
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);
|
||||||
if (mineTower != null) {
|
|
||||||
writer.putFloat(mineTower.getLoc().x);
|
writer.putFloat(mineTower.getLoc().x);
|
||||||
writer.putFloat(mineTower.getParentZone().getLoc().y);
|
writer.putFloat(mineTower.getParentZone().getLoc().y);
|
||||||
writer.putFloat(mineTower.getLoc().z);
|
writer.putFloat(mineTower.getLoc().z);
|
||||||
} else {
|
|
||||||
writer.putFloat(mine.parentZone.getLoc().x);
|
|
||||||
writer.putFloat(mine.parentZone.getLoc().y);
|
|
||||||
writer.putFloat(mine.parentZone.getLoc().z);
|
|
||||||
Logger.error("Mine Tower Was Null For Mine: " + mine.getObjectUUID());
|
|
||||||
}
|
|
||||||
|
|
||||||
writer.putInt(mine.isExpansion() ? mine.mineType.xpacHash : mine.mineType.hash);
|
writer.putInt(mine.isExpansion() ? mine.mineType.xpacHash : mine.mineType.hash);
|
||||||
|
|
||||||
if (mine.isStronghold) {
|
|
||||||
writer.putString("");
|
|
||||||
GuildTag._serializeForDisplay(Guild.getErrantGuild().getGuildTag(), writer);
|
|
||||||
writer.putString("");
|
|
||||||
GuildTag._serializeForDisplay(Guild.getErrantGuild().getGuildTag(), writer);
|
|
||||||
}else {
|
|
||||||
writer.putString(mine.guildName);
|
writer.putString(mine.guildName);
|
||||||
GuildTag._serializeForDisplay(mine.guildTag, writer);
|
GuildTag._serializeForDisplay(mine.guildTag, writer);
|
||||||
writer.putString(mine.nationName);
|
writer.putString(mine.nationName);
|
||||||
GuildTag._serializeForDisplay(mine.nationTag, writer);
|
GuildTag._serializeForDisplay(mine.nationTag, writer);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
|
||||||
Logger.error("Failed TO Serialize Mine Because: " + e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ArrayList<Mine> getMinesForGuild(int guildID) {
|
public static ArrayList<Mine> getMinesForGuild(int guildID) {
|
||||||
|
|
||||||
@@ -263,7 +220,8 @@ public class Mine extends AbstractGameObject {
|
|||||||
// Only inactive mines are returned.
|
// Only inactive mines are returned.
|
||||||
|
|
||||||
for (Mine mine : Mine.mineMap.keySet()) {
|
for (Mine mine : Mine.mineMap.keySet()) {
|
||||||
if (mine.owningGuild.getObjectUUID() == guildID)
|
if (mine.owningGuild.getObjectUUID() == guildID &&
|
||||||
|
mine.isActive == false)
|
||||||
mineList.add(mine);
|
mineList.add(mine);
|
||||||
}
|
}
|
||||||
return mineList;
|
return mineList;
|
||||||
@@ -332,18 +290,24 @@ public class Mine extends AbstractGameObject {
|
|||||||
if (treeRank < 1)
|
if (treeRank < 1)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (guildUnderMineLimit(playerGuild.getNation(), treeRank) == false) {
|
||||||
|
ErrorPopupMsg.sendErrorMsg(playerCharacter, "Your nation cannot support another mine.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ArrayList<Mine> getMinesToTeleportTo(PlayerCharacter player) {
|
private static boolean guildUnderMineLimit(Guild playerGuild, int tolRank) {
|
||||||
ArrayList<Mine> mines = new ArrayList<>();
|
|
||||||
for(Mine mine : Mine.getMines())
|
|
||||||
if(!mine.isActive)
|
|
||||||
if(mine.getOwningGuild() != null)
|
|
||||||
if(mine.getOwningGuild().getNation().equals(player.getGuild().getNation()))
|
|
||||||
mines.add(mine);
|
|
||||||
|
|
||||||
return mines;
|
int mineCnt = 0;
|
||||||
|
|
||||||
|
mineCnt += Mine.getMinesForGuild(playerGuild.getObjectUUID()).size();
|
||||||
|
|
||||||
|
for (Guild guild : playerGuild.getSubGuildList())
|
||||||
|
mineCnt += Mine.getMinesForGuild(guild.getObjectUUID()).size();
|
||||||
|
|
||||||
|
return mineCnt <= tolRank;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean changeProductionType(Resource resource) {
|
public boolean changeProductionType(Resource resource) {
|
||||||
@@ -414,24 +378,12 @@ 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){
|
|
||||||
for(PlayerCharacter player : this.affectedPlayers){
|
|
||||||
try {
|
|
||||||
player.ZergMultiplier = 1.0f;
|
|
||||||
} catch(Exception e){
|
|
||||||
//something went wrong resetting zerg multiplier, maybe player was deleted?
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean validForMine(Resource r) {
|
public boolean validForMine(Resource r) {
|
||||||
if (this.mineType == null) {
|
if (this.mineType == null)
|
||||||
Logger.error("Mine Was Null Setting Resources for Mine: " + this.getObjectUUID());
|
|
||||||
return false;
|
return false;
|
||||||
}
|
return this.mineType.validForMine(r, this.isExpansion());
|
||||||
return this.mineType.validForMine(r);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void serializeForMineProduction(ByteBufferWriter writer) {
|
public void serializeForMineProduction(ByteBufferWriter writer) {
|
||||||
@@ -442,10 +394,10 @@ public class Mine extends AbstractGameObject {
|
|||||||
writer.putString(this.mineType.name);
|
writer.putString(this.mineType.name);
|
||||||
writer.putString(this.zoneName);
|
writer.putString(this.zoneName);
|
||||||
writer.putInt(this.production.hash);
|
writer.putInt(this.production.hash);
|
||||||
writer.putInt(this.getModifiedProductionAmount());
|
writer.putInt(this.production.baseProduction);
|
||||||
writer.putInt(this.getModifiedProductionAmount()); //TODO calculate range penalty here
|
writer.putInt(this.getModifiedProductionAmount()); //TODO calculate range penalty here
|
||||||
writer.putInt(3600); //window in seconds
|
writer.putInt(3600); //window in seconds
|
||||||
writer.putInt(this.mineType.hash);
|
writer.putInt(this.isExpansion() ? this.mineType.xpacHash : this.mineType.hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -586,236 +538,41 @@ public class Mine extends AbstractGameObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int getModifiedProductionAmount() {
|
public int getModifiedProductionAmount() {
|
||||||
ItemBase resourceBase = ItemBase.getItemBase(this.production.UUID);
|
//TODO Calculate Distance modifications.
|
||||||
if(resourceBase == null)
|
|
||||||
return 0;
|
|
||||||
int value = resourceBase.getBaseValue();
|
|
||||||
|
|
||||||
int amount = 0;
|
//calculate base values.
|
||||||
switch(this.capSize){
|
int baseProduction = this.production.baseProduction;
|
||||||
case 3:
|
float baseModValue = this.production.baseProduction * .1f;
|
||||||
amount = 1800000;
|
float rankModValue = this.production.baseProduction * .0143f;
|
||||||
break;
|
float totalModded = 0;
|
||||||
case 5:
|
|
||||||
amount = 3000000;
|
//get Mine Building.
|
||||||
break;
|
Building mineBuilding = BuildingManager.getBuilding(this.buildingID);
|
||||||
case 10:
|
if (mineBuilding == null)
|
||||||
amount = 6000000;
|
return this.production.baseProduction;
|
||||||
break;
|
for (AbstractCharacter harvester : mineBuilding.getHirelings().keySet()) {
|
||||||
case 20:
|
totalModded += baseModValue;
|
||||||
amount = 12000000;
|
totalModded += rankModValue * harvester.getRank();
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
if(this.production.UUID == 7)
|
//add base production on top;
|
||||||
value = 1;
|
totalModded += baseProduction;
|
||||||
|
//skip distance check for expansion.
|
||||||
|
if (this.isExpansion())
|
||||||
|
return (int) totalModded;
|
||||||
|
|
||||||
amount = amount / value;
|
if (this.owningGuild.isEmptyGuild() == false) {
|
||||||
|
if (this.owningGuild.getOwnedCity() != null) {
|
||||||
|
float distanceSquared = this.owningGuild.getOwnedCity().getLoc().distanceSquared2D(mineBuilding.getLoc());
|
||||||
|
|
||||||
return amount;
|
if (distanceSquared > sqr(10000 * 3))
|
||||||
}
|
totalModded *= .25f;
|
||||||
public void onEnter() {
|
else if (distanceSquared > sqr(10000 * 2))
|
||||||
|
totalModded *= .50f;
|
||||||
Building tower = BuildingManager.getBuildingFromCache(this.buildingID);
|
else if (distanceSquared > sqr(10000))
|
||||||
if(tower == null)
|
totalModded *= .75f;
|
||||||
return;
|
|
||||||
|
|
||||||
// Gather current list of players within the zone bounds
|
|
||||||
|
|
||||||
HashSet<AbstractWorldObject> currentPlayers = WorldGrid.getObjectsInRangePartial(tower.loc, Enum.CityBoundsType.GRID.extents, MBServerStatics.MASK_PLAYER);
|
|
||||||
HashMap<Guild,ArrayList<PlayerCharacter>> charactersByNation = new HashMap<>();
|
|
||||||
ArrayList<Guild> updatedNations = new ArrayList<>();
|
|
||||||
for (AbstractWorldObject playerObject : currentPlayers) {
|
|
||||||
|
|
||||||
if (playerObject == null)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
PlayerCharacter player = (PlayerCharacter) playerObject;
|
|
||||||
|
|
||||||
if(this.affectedPlayers.contains(player) == false)
|
|
||||||
this.affectedPlayers.add(player);
|
|
||||||
|
|
||||||
if(!this._playerMemory.contains(player.getObjectUUID())){
|
|
||||||
this._playerMemory.add(player.getObjectUUID());
|
|
||||||
}
|
|
||||||
Guild nation = player.guild.getNation();
|
|
||||||
if(charactersByNation.containsKey(nation)){
|
|
||||||
if(!charactersByNation.get(nation).contains(player)) {
|
|
||||||
charactersByNation.get(nation).add(player);
|
|
||||||
if(!updatedNations.contains(nation)){
|
|
||||||
updatedNations.add(nation);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else{
|
return (int) totalModded;
|
||||||
ArrayList<PlayerCharacter> players = new ArrayList<>();
|
|
||||||
players.add(player);
|
|
||||||
charactersByNation.put(nation,players);
|
|
||||||
if(!updatedNations.contains(nation)){
|
|
||||||
updatedNations.add(nation);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for(Guild nation : updatedNations){
|
|
||||||
float multiplier = ZergManager.getCurrentMultiplier(charactersByNation.get(nation).size(),this.capSize);
|
|
||||||
for(PlayerCharacter player : charactersByNation.get(nation)){
|
|
||||||
player.ZergMultiplier = multiplier;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
try
|
|
||||||
{
|
|
||||||
this.onExit(this._playerMemory);
|
|
||||||
}
|
|
||||||
catch(Exception ignored){
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onExit(HashSet<Integer> currentMemory) {
|
|
||||||
|
|
||||||
Building tower = BuildingManager.getBuildingFromCache(this.buildingID);
|
|
||||||
if(tower == null)
|
|
||||||
return;
|
|
||||||
ArrayList<Integer>toRemove = new ArrayList<>();
|
|
||||||
HashSet<AbstractWorldObject> currentPlayers = WorldGrid.getObjectsInRangePartial(tower.loc, Enum.CityBoundsType.GRID.extents, MBServerStatics.MASK_PLAYER);
|
|
||||||
for(Integer id : currentMemory){
|
|
||||||
PlayerCharacter pc = PlayerCharacter.getPlayerCharacter(id);
|
|
||||||
if(currentPlayers.contains(pc) == false){
|
|
||||||
toRemove.add(id);
|
|
||||||
pc.ZergMultiplier = 1.0f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove players from city memory
|
|
||||||
|
|
||||||
_playerMemory.removeAll(toRemove);
|
|
||||||
}
|
|
||||||
public static Building getTower(Mine mine){
|
|
||||||
Building tower = BuildingManager.getBuildingFromCache(mine.buildingID);
|
|
||||||
if(tower != null)
|
|
||||||
return tower;
|
|
||||||
else
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
public static void serializeForClientMsgTeleport(Mine mine, ByteBufferWriter writer) {
|
|
||||||
AbstractCharacter guildRuler;
|
|
||||||
Guild rulingGuild;
|
|
||||||
Guild rulingNation;
|
|
||||||
java.time.LocalDateTime dateTime1900;
|
|
||||||
|
|
||||||
// Cities aren't a mine without a TOL. Time to early exit.
|
|
||||||
// No need to spam the log here as non-existant TOL's are indicated
|
|
||||||
// during bootstrap routines.
|
|
||||||
Building tower = Mine.getTower(mine);
|
|
||||||
if (tower == null) {
|
|
||||||
|
|
||||||
Logger.error("NULL TOWER FOR " + mine.zoneName + " mine");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Assign mine owner
|
|
||||||
|
|
||||||
if (tower.getOwner() != null)
|
|
||||||
guildRuler = tower.getOwner();
|
|
||||||
else
|
|
||||||
guildRuler = null;
|
|
||||||
|
|
||||||
// If is an errant tree, use errant guild for serialization.
|
|
||||||
// otherwise we serialize the soverign guild
|
|
||||||
|
|
||||||
if (guildRuler == null)
|
|
||||||
rulingGuild = Guild.getErrantGuild();
|
|
||||||
else
|
|
||||||
rulingGuild = guildRuler.getGuild();
|
|
||||||
|
|
||||||
rulingNation = rulingGuild.getNation();
|
|
||||||
|
|
||||||
// Begin Serialzing soverign guild data
|
|
||||||
writer.putInt(mine.getObjectType().ordinal());
|
|
||||||
writer.putInt(mine.getObjectUUID());
|
|
||||||
writer.putString(mine.zoneName + " Mine");
|
|
||||||
writer.putInt(rulingGuild.getObjectType().ordinal());
|
|
||||||
writer.putInt(rulingGuild.getObjectUUID());
|
|
||||||
|
|
||||||
writer.putString(rulingGuild.getName());
|
|
||||||
writer.putString("");
|
|
||||||
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((byte)0);
|
|
||||||
|
|
||||||
writer.put((byte) 1);
|
|
||||||
writer.put((byte) 1); // *** Refactor: What are these flags?
|
|
||||||
writer.put((byte) 1);
|
|
||||||
writer.put((byte) 1);
|
|
||||||
writer.put((byte) 1);
|
|
||||||
|
|
||||||
GuildTag._serializeForDisplay(rulingGuild.getGuildTag(), writer);
|
|
||||||
GuildTag._serializeForDisplay(rulingNation.getGuildTag(), writer);
|
|
||||||
|
|
||||||
writer.putInt(0);// TODO Implement description text
|
|
||||||
|
|
||||||
writer.put((byte) 1);
|
|
||||||
writer.put((byte) 0);
|
|
||||||
writer.put((byte) 1);
|
|
||||||
|
|
||||||
// Begin serializing nation guild info
|
|
||||||
|
|
||||||
if (rulingNation.isEmptyGuild()) {
|
|
||||||
writer.putInt(rulingGuild.getObjectType().ordinal());
|
|
||||||
writer.putInt(rulingGuild.getObjectUUID());
|
|
||||||
} else {
|
|
||||||
writer.putInt(rulingNation.getObjectType().ordinal());
|
|
||||||
writer.putInt(rulingNation.getObjectUUID());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Serialize nation name
|
|
||||||
|
|
||||||
if (rulingNation.isEmptyGuild())
|
|
||||||
writer.putString("None");
|
|
||||||
else
|
|
||||||
writer.putString(rulingNation.getName());
|
|
||||||
|
|
||||||
writer.putInt(1);
|
|
||||||
|
|
||||||
writer.putInt(0xFFFFFFFF);
|
|
||||||
|
|
||||||
writer.putInt(0);
|
|
||||||
|
|
||||||
if (rulingNation.isEmptyGuild())
|
|
||||||
writer.putString(" ");
|
|
||||||
else
|
|
||||||
writer.putString(Guild.GetGL(rulingNation).getFirstName() + ' ' + Guild.GetGL(rulingNation).getLastName());
|
|
||||||
|
|
||||||
writer.putLocalDateTime(LocalDateTime.now());
|
|
||||||
|
|
||||||
if(tower != null) {
|
|
||||||
writer.putFloat(tower.loc.x);
|
|
||||||
writer.putFloat(tower.loc.y);
|
|
||||||
writer.putFloat(tower.loc.z);
|
|
||||||
} else{
|
|
||||||
writer.putFloat(0);
|
|
||||||
writer.putFloat(0);
|
|
||||||
writer.putFloat(0);
|
|
||||||
}
|
|
||||||
writer.putInt(0);
|
|
||||||
|
|
||||||
writer.put((byte) 1);
|
|
||||||
writer.put((byte) 0);
|
|
||||||
writer.putInt(0x64);
|
|
||||||
writer.put((byte) 0);
|
|
||||||
writer.put((byte) 0);
|
|
||||||
writer.put((byte) 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,19 +13,21 @@ import java.util.HashMap;
|
|||||||
|
|
||||||
public enum MineProduction {
|
public enum MineProduction {
|
||||||
|
|
||||||
LUMBER("Lumber Camp", new HashMap<>(), 1618637196, 1663491950),
|
LUMBER("Lumber Camp", new HashMap<>(), Resource.WORMWOOD, 1618637196, 1663491950),
|
||||||
ORE("Ore Mine", new HashMap<>(), 518103023, -788976428),
|
ORE("Ore Mine", new HashMap<>(), Resource.OBSIDIAN, 518103023, -788976428),
|
||||||
MAGIC("Magic Mine", new HashMap<>(), 504746863, -1753567069),
|
GOLD("Gold Mine", new HashMap<>(), Resource.GALVOR, -662193002, -1227205358),
|
||||||
GOLDMINE("Gold Mine", new HashMap<>(), -662193002, -1227205358);
|
MAGIC("Magic Mine", new HashMap<>(), Resource.BLOODSTONE, 504746863, -1753567069);
|
||||||
|
|
||||||
public final String name;
|
public final String name;
|
||||||
public final HashMap<Integer, Resource> resources;
|
public final HashMap<Integer, Resource> resources;
|
||||||
|
public final Resource xpac;
|
||||||
public final int hash;
|
public final int hash;
|
||||||
public final int xpacHash;
|
public final int xpacHash;
|
||||||
|
|
||||||
MineProduction(String name, HashMap<Integer, Resource> resources,int hash, int xpacHash) {
|
MineProduction(String name, HashMap<Integer, Resource> resources, Resource xpac, int hash, int xpacHash) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.resources = resources;
|
this.resources = resources;
|
||||||
|
this.xpac = xpac;
|
||||||
this.hash = hash;
|
this.hash = hash;
|
||||||
this.xpacHash = xpacHash;
|
this.xpacHash = xpacHash;
|
||||||
}
|
}
|
||||||
@@ -37,7 +39,6 @@ public enum MineProduction {
|
|||||||
MineProduction.LUMBER.resources.put(1580005, Resource.OAK);
|
MineProduction.LUMBER.resources.put(1580005, Resource.OAK);
|
||||||
MineProduction.LUMBER.resources.put(1580006, Resource.BRONZEWOOD);
|
MineProduction.LUMBER.resources.put(1580006, Resource.BRONZEWOOD);
|
||||||
MineProduction.LUMBER.resources.put(1580007, Resource.MANDRAKE);
|
MineProduction.LUMBER.resources.put(1580007, Resource.MANDRAKE);
|
||||||
MineProduction.LUMBER.resources.put(1580018, Resource.WORMWOOD);
|
|
||||||
}
|
}
|
||||||
if (MineProduction.ORE.resources.size() == 0) {
|
if (MineProduction.ORE.resources.size() == 0) {
|
||||||
MineProduction.ORE.resources.put(7, Resource.GOLD);
|
MineProduction.ORE.resources.put(7, Resource.GOLD);
|
||||||
@@ -45,16 +46,14 @@ 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);
|
||||||
MineProduction.ORE.resources.put(1580019, Resource.OBSIDIAN);
|
|
||||||
}
|
}
|
||||||
if (MineProduction.GOLDMINE.resources.size() == 0) {
|
if (MineProduction.GOLD.resources.size() == 0) {
|
||||||
MineProduction.GOLDMINE.resources.put(7, Resource.GOLD);
|
MineProduction.GOLD.resources.put(7, Resource.GOLD);
|
||||||
MineProduction.GOLDMINE.resources.put(1580000, Resource.STONE);
|
MineProduction.GOLD.resources.put(1580000, Resource.STONE);
|
||||||
MineProduction.GOLDMINE.resources.put(1580008, Resource.COAL);
|
MineProduction.GOLD.resources.put(1580008, Resource.COAL);
|
||||||
MineProduction.GOLDMINE.resources.put(1580009, Resource.AGATE);
|
MineProduction.GOLD.resources.put(1580009, Resource.AGATE);
|
||||||
MineProduction.GOLDMINE.resources.put(1580010, Resource.DIAMOND);
|
MineProduction.GOLD.resources.put(1580010, Resource.DIAMOND);
|
||||||
MineProduction.GOLDMINE.resources.put(1580011, Resource.ONYX);
|
MineProduction.GOLD.resources.put(1580011, Resource.ONYX);
|
||||||
MineProduction.GOLDMINE.resources.put(1580017, Resource.GALVOR);
|
|
||||||
}
|
}
|
||||||
if (MineProduction.MAGIC.resources.size() == 0) {
|
if (MineProduction.MAGIC.resources.size() == 0) {
|
||||||
MineProduction.MAGIC.resources.put(7, Resource.GOLD);
|
MineProduction.MAGIC.resources.put(7, Resource.GOLD);
|
||||||
@@ -63,25 +62,27 @@ public enum MineProduction {
|
|||||||
MineProduction.MAGIC.resources.put(1580014, Resource.ANTIMONY);
|
MineProduction.MAGIC.resources.put(1580014, Resource.ANTIMONY);
|
||||||
MineProduction.MAGIC.resources.put(1580015, Resource.SULFUR);
|
MineProduction.MAGIC.resources.put(1580015, Resource.SULFUR);
|
||||||
MineProduction.MAGIC.resources.put(1580016, Resource.QUICKSILVER);
|
MineProduction.MAGIC.resources.put(1580016, Resource.QUICKSILVER);
|
||||||
MineProduction.MAGIC.resources.put(1580020, Resource.BLOODSTONE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MineProduction getByName(String name) {
|
public static MineProduction getByName(String name) {
|
||||||
if (name.equalsIgnoreCase("lumber"))
|
if (name.toLowerCase().equals("lumber"))
|
||||||
return MineProduction.LUMBER;
|
return MineProduction.LUMBER;
|
||||||
else if (name.equalsIgnoreCase("ore"))
|
else if (name.toLowerCase().equals("ore"))
|
||||||
return MineProduction.ORE;
|
return MineProduction.ORE;
|
||||||
else if (name.equalsIgnoreCase("gold"))
|
else if (name.toLowerCase().equals("gold"))
|
||||||
return MineProduction.GOLDMINE;
|
return MineProduction.GOLD;
|
||||||
else
|
else
|
||||||
return MineProduction.MAGIC;
|
return MineProduction.MAGIC;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean validForMine(Resource r) {
|
public boolean validForMine(Resource r, boolean isXpac) {
|
||||||
if (r == null)
|
if (r == null)
|
||||||
return false;
|
return false;
|
||||||
return this.resources.containsKey(r.UUID);
|
if (this.resources.containsKey(r.UUID))
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return isXpac && r.UUID == this.xpac.UUID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+363
-873
File diff suppressed because it is too large
Load Diff
@@ -34,8 +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;
|
||||||
int magicValue;
|
private int magicValue;
|
||||||
public boolean fromNoob = false;
|
|
||||||
|
|
||||||
private float dropChance = 0;
|
private float dropChance = 0;
|
||||||
|
|
||||||
@@ -107,6 +106,7 @@ 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();
|
||||||
writer.putInt(mobEquipment.magicValue);
|
writer.putInt(mobEquipment.magicValue);
|
||||||
writer.putInt(mobEquipment.magicValue);
|
writer.putInt(mobEquipment.magicValue);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ public final class MobLoot extends Item {
|
|||||||
this.setNumOfItems(quantity);
|
this.setNumOfItems(quantity);
|
||||||
|
|
||||||
this.noSteal = noSteal;
|
this.noSteal = noSteal;
|
||||||
this.setIsID(true);
|
this.setIsID(this.getItemBase().isAutoID());
|
||||||
|
|
||||||
// Class is 'final'; passing 'this' should be okay at the end of the constructor
|
// Class is 'final'; passing 'this' should be okay at the end of the constructor
|
||||||
|
|
||||||
|
|||||||
+15
-138
@@ -50,7 +50,6 @@ public class NPC extends AbstractCharacter {
|
|||||||
// Used for thread safety
|
// Used for thread safety
|
||||||
public final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
|
public final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
|
||||||
private final ArrayList<MobLoot> rolling = new ArrayList<>();
|
private final ArrayList<MobLoot> rolling = new ArrayList<>();
|
||||||
private final ConcurrentHashMap<Mob, Integer> siegeMinionMap = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
|
|
||||||
public ReentrantReadWriteLock minionLock = new ReentrantReadWriteLock();
|
public ReentrantReadWriteLock minionLock = new ReentrantReadWriteLock();
|
||||||
public ArrayList<ProducedItem> forgedItems = new ArrayList<>();
|
public ArrayList<ProducedItem> forgedItems = new ArrayList<>();
|
||||||
public HashMap<Integer, MobEquipment> equip = null;
|
public HashMap<Integer, MobEquipment> equip = null;
|
||||||
@@ -79,13 +78,14 @@ public class NPC extends AbstractCharacter {
|
|||||||
private HashSet<Integer> canRoll = null;
|
private HashSet<Integer> canRoll = null;
|
||||||
public int parentZoneUUID;
|
public int parentZoneUUID;
|
||||||
public int equipmentSetID = 0;
|
public int equipmentSetID = 0;
|
||||||
private int specialPrice = 5;
|
private int repairCost = 5;
|
||||||
|
|
||||||
// New NPC constructor. Fill in the blanks and then call
|
// New NPC constructor. Fill in the blanks and then call
|
||||||
// PERSIST.
|
// PERSIST.
|
||||||
|
|
||||||
public NPC() {
|
public NPC() {
|
||||||
|
|
||||||
|
super();
|
||||||
this.dbID = MBServerStatics.NO_DB_ROW_ASSIGNED_YET;
|
this.dbID = MBServerStatics.NO_DB_ROW_ASSIGNED_YET;
|
||||||
this.currentID = MBServerStatics.NO_DB_ROW_ASSIGNED_YET;
|
this.currentID = MBServerStatics.NO_DB_ROW_ASSIGNED_YET;
|
||||||
}
|
}
|
||||||
@@ -122,11 +122,7 @@ public class NPC extends AbstractCharacter {
|
|||||||
// this.buyPercent = rs.getFloat("npc_buyPercent");
|
// this.buyPercent = rs.getFloat("npc_buyPercent");
|
||||||
|
|
||||||
this.buyPercent = .33f;
|
this.buyPercent = .33f;
|
||||||
if(ZoneManager.findSmallestZone(this.loc) != null && ZoneManager.findSmallestZone(this.loc).getSafeZone() == 1){
|
|
||||||
this.sellPercent = 0;
|
|
||||||
}else{
|
|
||||||
this.sellPercent = 1;
|
this.sellPercent = 1;
|
||||||
}
|
|
||||||
|
|
||||||
this.setRot(new Vector3f(0, rs.getFloat("npc_rotation"), 0));
|
this.setRot(new Vector3f(0, rs.getFloat("npc_rotation"), 0));
|
||||||
|
|
||||||
@@ -153,12 +149,6 @@ public class NPC extends AbstractCharacter {
|
|||||||
|
|
||||||
this.name = rs.getString("npc_name");
|
this.name = rs.getString("npc_name");
|
||||||
|
|
||||||
try {
|
|
||||||
this.specialPrice = rs.getInt("specialPrice");
|
|
||||||
}catch(Exception e){
|
|
||||||
this.specialPrice = 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.error("NPC: " + this.dbID + " :" + e);
|
Logger.error("NPC: " + this.dbID + " :" + e);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@@ -199,18 +189,6 @@ public class NPC extends AbstractCharacter {
|
|||||||
serializeForClientMsgOtherPlayer(npc, writer);
|
serializeForClientMsgOtherPlayer(npc, writer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInSafeZone() {
|
|
||||||
|
|
||||||
Zone zone = ZoneManager.findSmallestZone(this.getLoc());
|
|
||||||
|
|
||||||
if (zone != null) {
|
|
||||||
return zone.getSafeZone() == (byte) 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
//return this.safeZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void serializeForClientMsgOtherPlayer(NPC npc, ByteBufferWriter writer)
|
public static void serializeForClientMsgOtherPlayer(NPC npc, ByteBufferWriter writer)
|
||||||
throws SerializationException {
|
throws SerializationException {
|
||||||
|
|
||||||
@@ -676,12 +654,14 @@ public class NPC extends AbstractCharacter {
|
|||||||
WorldGrid.RemoveWorldObject(toRemove);
|
WorldGrid.RemoveWorldObject(toRemove);
|
||||||
DbManager.removeFromCache(toRemove);
|
DbManager.removeFromCache(toRemove);
|
||||||
|
|
||||||
PlayerCharacter petOwner = toRemove.getOwner();
|
|
||||||
|
PlayerCharacter petOwner = (PlayerCharacter) toRemove.guardCaptain;
|
||||||
|
|
||||||
if (petOwner != null) {
|
if (petOwner != null) {
|
||||||
|
|
||||||
petOwner.setPet(null);
|
petOwner.setPet(null);
|
||||||
toRemove.setOwner(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(petOwner, petMsg);
|
||||||
@@ -804,7 +784,7 @@ public class NPC extends AbstractCharacter {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateDatabase() {
|
public void updateDatabase() {
|
||||||
DbManager.NPCQueries.updateSpecialPricing(this);
|
DbManager.NPCQueries.updateDatabase(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getSymbol() {
|
public int getSymbol() {
|
||||||
@@ -827,6 +807,8 @@ public class NPC extends AbstractCharacter {
|
|||||||
@Override
|
@Override
|
||||||
public void runAfterLoad() {
|
public void runAfterLoad() {
|
||||||
|
|
||||||
|
this.charItemManager = new CharacterItemManager(this);
|
||||||
|
|
||||||
if (ConfigManager.serverType.equals(ServerType.LOGINSERVER))
|
if (ConfigManager.serverType.equals(ServerType.LOGINSERVER))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -868,10 +850,6 @@ public class NPC extends AbstractCharacter {
|
|||||||
if (wordCount(this.name) < 2 && this.contract != null)
|
if (wordCount(this.name) < 2 && this.contract != null)
|
||||||
this.name += " the " + this.contract.getName();
|
this.name += " the " + this.contract.getName();
|
||||||
|
|
||||||
// Initialize inventory
|
|
||||||
|
|
||||||
this.charItemManager = new CharacterItemManager(this);
|
|
||||||
|
|
||||||
// Configure parent zone adding this NPC to the
|
// Configure parent zone adding this NPC to the
|
||||||
// zone collection
|
// zone collection
|
||||||
|
|
||||||
@@ -1125,10 +1103,6 @@ public class NPC extends AbstractCharacter {
|
|||||||
return (int) time;
|
return (int) time;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ConcurrentHashMap<Mob, Integer> getSiegeMinionMap() {
|
|
||||||
return siegeMinionMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean remove() {
|
public boolean remove() {
|
||||||
|
|
||||||
Building building;
|
Building building;
|
||||||
@@ -1202,7 +1176,7 @@ public class NPC extends AbstractCharacter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Cannot roll items without a warehouse.
|
// Cannot roll items without a warehouse.
|
||||||
// Due to the fact ResourceRoll references the
|
// Due to the fact fillForge references the
|
||||||
// warehouse and early exits. *** Refactor???
|
// warehouse and early exits. *** Refactor???
|
||||||
|
|
||||||
serverZone = this.building.getParentZone();
|
serverZone = this.building.getParentZone();
|
||||||
@@ -1236,7 +1210,7 @@ public class NPC extends AbstractCharacter {
|
|||||||
if (isRandom)
|
if (isRandom)
|
||||||
item = ItemFactory.randomRoll(this, player, amount, itemID);
|
item = ItemFactory.randomRoll(this, player, amount, itemID);
|
||||||
else
|
else
|
||||||
item = ItemFactory.ResourceRoll(this, player, amount, itemID, pToken, sToken, customName);
|
item = ItemFactory.fillForge(this, player, amount, itemID, pToken, sToken, customName);
|
||||||
|
|
||||||
if (item == null)
|
if (item == null)
|
||||||
return null;
|
return null;
|
||||||
@@ -1296,13 +1270,12 @@ public class NPC extends AbstractCharacter {
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getSpecialPrice() {
|
public int getRepairCost() {
|
||||||
return specialPrice;
|
return repairCost;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSpecialPrice(int specialPrice) {
|
public void setRepairCost(int repairCost) {
|
||||||
this.specialPrice = specialPrice;
|
this.repairCost = repairCost;
|
||||||
DbManager.NPCQueries.updateSpecialPricing(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processUpgradeNPC(PlayerCharacter player) {
|
public void processUpgradeNPC(PlayerCharacter player) {
|
||||||
@@ -1370,100 +1343,4 @@ public class NPC extends AbstractCharacter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<MobEquipment> getSellInventorySteward() {
|
|
||||||
|
|
||||||
ArrayList<MobEquipment> smallList = new ArrayList<>();
|
|
||||||
for (MobEquipment me : this.contract.getSellInventory()) {
|
|
||||||
int rankRequired = 0;
|
|
||||||
if (me.getItemBase().getType().equals(Enum.ItemType.CONTRACT)) {
|
|
||||||
switch (me.getItemBase().getUUID()) {
|
|
||||||
case 866:
|
|
||||||
case 889:
|
|
||||||
case 860:
|
|
||||||
case 850:
|
|
||||||
case 892:
|
|
||||||
case 1502003:
|
|
||||||
case 890:
|
|
||||||
case 896:
|
|
||||||
rankRequired = 1;
|
|
||||||
break;
|
|
||||||
case 899:
|
|
||||||
case 801:
|
|
||||||
case 803:
|
|
||||||
case 802:
|
|
||||||
case 821:
|
|
||||||
case 810:
|
|
||||||
case 806:
|
|
||||||
case 818:
|
|
||||||
case 800:
|
|
||||||
rankRequired = 2;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 840:
|
|
||||||
case 848:
|
|
||||||
case 813:
|
|
||||||
case 805:
|
|
||||||
case 804:
|
|
||||||
case 838:
|
|
||||||
rankRequired = 3;
|
|
||||||
break;
|
|
||||||
case 815:
|
|
||||||
rankRequired = 4;
|
|
||||||
break;
|
|
||||||
case 847:
|
|
||||||
case 830:
|
|
||||||
case 820:
|
|
||||||
rankRequired = 6;
|
|
||||||
break;
|
|
||||||
case 865:
|
|
||||||
case 252637:
|
|
||||||
rankRequired = 7;
|
|
||||||
break;
|
|
||||||
case 1502002: // harvesters don't need to exist but might one day
|
|
||||||
case 1502001: //mine guards don't need to exist but might one day
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if(me.getItemBase().getName().toLowerCase().contains("trainer") || me.getItemBase().getName().toLowerCase().contains("refiner")){
|
|
||||||
rankRequired = 5;
|
|
||||||
}
|
|
||||||
if (this.getRank() >= rankRequired)
|
|
||||||
smallList.add(me);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return smallList;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ArrayList<MobEquipment> getSellInventoryBuilder() {
|
|
||||||
|
|
||||||
ArrayList<MobEquipment> smallList = new ArrayList<>();
|
|
||||||
int maxValue = 0;
|
|
||||||
switch(this.getRank()){
|
|
||||||
case 1:
|
|
||||||
maxValue = 300000;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
maxValue = 450000;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
maxValue = 550000;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
maxValue = 650000;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
maxValue = 1000000;
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
case 7:
|
|
||||||
maxValue = 999999999;
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
for(MobEquipment me : this.contract.getSellInventory()){
|
|
||||||
if(me.getItemBase().getBaseValue() <= maxValue)
|
|
||||||
smallList.add(me);
|
|
||||||
}
|
|
||||||
return smallList;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -144,7 +144,6 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
private long lastUpdateTime = System.currentTimeMillis();
|
private long lastUpdateTime = System.currentTimeMillis();
|
||||||
private long lastStamUpdateTime = System.currentTimeMillis();
|
private long lastStamUpdateTime = System.currentTimeMillis();
|
||||||
private boolean safeZone = false;
|
private boolean safeZone = false;
|
||||||
private int bindBuildingID;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
DataWarehouse based kill/death tracking.
|
DataWarehouse based kill/death tracking.
|
||||||
@@ -175,10 +174,6 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
private boolean dirtyLoad = true;
|
private boolean dirtyLoad = true;
|
||||||
private final ReadWriteLock dirtyLock = new ReentrantReadWriteLock(true);
|
private final ReadWriteLock dirtyLock = new ReentrantReadWriteLock(true);
|
||||||
|
|
||||||
public float ZergMultiplier = 1.0f;
|
|
||||||
|
|
||||||
public boolean isBoxed = false;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* No Id Constructor
|
* No Id Constructor
|
||||||
*/
|
*/
|
||||||
@@ -209,15 +204,18 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
this.spiMod.set(spiMod);
|
this.spiMod.set(spiMod);
|
||||||
|
|
||||||
this.guildStatus = new AtomicInteger(0);
|
this.guildStatus = new AtomicInteger(0);
|
||||||
this.bindBuildingID = -1;
|
this.buildingUUID = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ResultSet Constructor
|
* ResultSet Constructor
|
||||||
*/
|
*/
|
||||||
public PlayerCharacter(ResultSet rs) throws SQLException {
|
public PlayerCharacter(ResultSet rs) throws SQLException {
|
||||||
|
|
||||||
super(rs, true);
|
super(rs, true);
|
||||||
|
|
||||||
|
this.charItemManager = new CharacterItemManager(this);
|
||||||
|
|
||||||
this.runes = DbManager.CharacterRuneQueries.GET_RUNES_FOR_CHARACTER(this.getObjectUUID());
|
this.runes = DbManager.CharacterRuneQueries.GET_RUNES_FOR_CHARACTER(this.getObjectUUID());
|
||||||
int accountID = rs.getInt("parent");
|
int accountID = rs.getInt("parent");
|
||||||
this.account = DbManager.AccountQueries.GET_ACCOUNT(accountID);
|
this.account = DbManager.AccountQueries.GET_ACCOUNT(accountID);
|
||||||
@@ -269,7 +267,7 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
this.intMod.set(rs.getShort("char_intMod"));
|
this.intMod.set(rs.getShort("char_intMod"));
|
||||||
this.spiMod.set(rs.getShort("char_spiMod"));
|
this.spiMod.set(rs.getShort("char_spiMod"));
|
||||||
|
|
||||||
this.bindBuildingID = rs.getInt("char_bindBuilding");
|
this.buildingUUID = rs.getInt("char_bindBuilding");
|
||||||
|
|
||||||
this.hash = rs.getString("hash");
|
this.hash = rs.getString("hash");
|
||||||
|
|
||||||
@@ -784,9 +782,6 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
// Verify Race
|
// Verify Race
|
||||||
int raceID = msg.getRace();
|
int raceID = msg.getRace();
|
||||||
|
|
||||||
if(raceID == 0)
|
|
||||||
raceID = 1999;
|
|
||||||
|
|
||||||
Race race = Race.getRace(raceID);
|
Race race = Race.getRace(raceID);
|
||||||
|
|
||||||
if (race == null) {
|
if (race == null) {
|
||||||
@@ -826,7 +821,6 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
int hairColorID = msg.getHairColor();
|
int hairColorID = msg.getHairColor();
|
||||||
int beardColorID = msg.getBeardColor();
|
int beardColorID = msg.getBeardColor();
|
||||||
|
|
||||||
if(raceID != 1999) {
|
|
||||||
if (!race.isValidHairStyle(hairStyleID)) {
|
if (!race.isValidHairStyle(hairStyleID)) {
|
||||||
Logger.info("Invalid HairStyleID: " + hairStyleID + " for race: " + race.getName());
|
Logger.info("Invalid HairStyleID: " + hairStyleID + " for race: " + race.getName());
|
||||||
return null;
|
return null;
|
||||||
@@ -846,7 +840,7 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
Logger.info("Invalid beardColorID: " + beardColorID + " for race: " + race.getName());
|
Logger.info("Invalid beardColorID: " + beardColorID + " for race: " + race.getName());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
// Get stat modifiers
|
// Get stat modifiers
|
||||||
int strMod = msg.getStrengthMod();
|
int strMod = msg.getStrengthMod();
|
||||||
int dexMod = msg.getDexterityMod();
|
int dexMod = msg.getDexterityMod();
|
||||||
@@ -934,12 +928,11 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Validate Rune against Race
|
// Validate Rune against Race
|
||||||
if(raceID != 1999) {
|
|
||||||
if (!race.isAllowedRune(runeBase)) {
|
if (!race.isAllowedRune(runeBase)) {
|
||||||
Logger.info("Trait Not valid for Race");
|
Logger.info("Trait Not valid for Race");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
// Validate BaseClass against Race
|
// Validate BaseClass against Race
|
||||||
if (!baseClass.isAllowedRune(runeBase)) {
|
if (!baseClass.isAllowedRune(runeBase)) {
|
||||||
Logger.info("Trait Not valid for BaseClass");
|
Logger.info("Trait Not valid for BaseClass");
|
||||||
@@ -1128,15 +1121,9 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
int kitID = msg.getKit();
|
int kitID = msg.getKit();
|
||||||
|
|
||||||
// get the correctKit
|
// get the correctKit
|
||||||
int raceClassID;
|
int raceClassID = Kit.GetKitIDByRaceClass(raceID, baseClassID);
|
||||||
if(raceID != 1999){
|
|
||||||
raceClassID = Kit.GetKitIDByRaceClass(raceID, baseClassID);
|
|
||||||
}else{
|
|
||||||
raceClassID = Kit.GetKitIDByRaceClass(2011, baseClassID);
|
|
||||||
}
|
|
||||||
ArrayList<Kit> allKits = Kit.RaceClassIDMap.get(raceClassID);
|
ArrayList<Kit> allKits = Kit.RaceClassIDMap.get(raceClassID);
|
||||||
|
|
||||||
|
|
||||||
Kit kit = null;
|
Kit kit = null;
|
||||||
|
|
||||||
for (Kit k : allKits) {
|
for (Kit k : allKits) {
|
||||||
@@ -1166,13 +1153,6 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
clientConnection);
|
clientConnection);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if(raceID == 1999){
|
|
||||||
hairStyleID = 0;
|
|
||||||
beardStyleID = 0;
|
|
||||||
skinColorID = 0;
|
|
||||||
hairColorID = 0;
|
|
||||||
beardColorID = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make PC
|
// Make PC
|
||||||
PlayerCharacter pcWithoutID = new PlayerCharacter(firstName, lastName, (short) strMod, (short) dexMod, (short) conMod,
|
PlayerCharacter pcWithoutID = new PlayerCharacter(firstName, lastName, (short) strMod, (short) dexMod, (short) conMod,
|
||||||
@@ -1847,20 +1827,20 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
//see if we shold grant xp to attacker
|
//see if we shold grant xp to attacker
|
||||||
boolean doPVPEXP = false;
|
boolean doPVPEXP = false;
|
||||||
long lastKill = att.getLastKillOfTarget(this.getObjectUUID());
|
long lastKill = att.getLastKillOfTarget(this.getObjectUUID());
|
||||||
//if ((System.currentTimeMillis() - lastKill) > MBServerStatics.PLAYER_KILL_XP_TIMER)
|
if ((System.currentTimeMillis() - lastKill) > MBServerStatics.PLAYER_KILL_XP_TIMER)
|
||||||
//if (attacker.getLevel() > 39 && this.getLevel() > 39) {
|
if (attacker.getLevel() > 39 && this.getLevel() > 39) {
|
||||||
//Guild aN = null;
|
Guild aN = null;
|
||||||
//Guild tN = null;
|
Guild tN = null;
|
||||||
//if (attacker.getGuild() != null)
|
if (attacker.getGuild() != null)
|
||||||
// aN = attacker.getGuild().getNation();
|
aN = attacker.getGuild().getNation();
|
||||||
//if (this.getGuild() != null)
|
if (this.getGuild() != null)
|
||||||
// tN = this.getGuild().getNation();
|
tN = this.getGuild().getNation();
|
||||||
//if (aN == null || tN == null || aN.isEmptyGuild() || Guild.sameGuild(aN, tN) || this.isDeathShroud()) {
|
if (aN == null || tN == null || aN.isEmptyGuild() || Guild.sameGuild(aN, tN) || this.isDeathShroud()) {
|
||||||
//skip giving xp if same guild or attacker is errant, or target is in death shroud.
|
//skip giving xp if same guild or attacker is errant, or target is in death shroud.
|
||||||
//} else {
|
} else {
|
||||||
doPVPEXP = true;
|
doPVPEXP = true;
|
||||||
//}
|
}
|
||||||
// }
|
}
|
||||||
//apply death shroud to non safeholds.
|
//apply death shroud to non safeholds.
|
||||||
Zone zone = ZoneManager.findSmallestZone(this.getLoc());
|
Zone zone = ZoneManager.findSmallestZone(this.getLoc());
|
||||||
|
|
||||||
@@ -2047,8 +2027,7 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
public void respawn(boolean setAlive, boolean enterWorld, boolean makeCorpse) {
|
public void respawn(boolean setAlive, boolean enterWorld, boolean makeCorpse) {
|
||||||
|
|
||||||
// Recalculate everything
|
// Recalculate everything
|
||||||
if(this.timestamps.containsKey("DeathTime"))
|
|
||||||
this.timestamps.remove("DeathTime");
|
|
||||||
|
|
||||||
this.recalculatePlayerStats(true);
|
this.recalculatePlayerStats(true);
|
||||||
this.setCombat(false);
|
this.setCombat(false);
|
||||||
@@ -2101,7 +2080,7 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
this.lastUpdateTime = System.currentTimeMillis();
|
this.lastUpdateTime = System.currentTimeMillis();
|
||||||
this.lastStamUpdateTime = System.currentTimeMillis();
|
this.lastStamUpdateTime = System.currentTimeMillis();
|
||||||
|
|
||||||
this.update(false);
|
this.update();
|
||||||
|
|
||||||
PowersManager.applyPower(this, this, Vector3fImmutable.ZERO, -1661758934, 40, false);
|
PowersManager.applyPower(this, this, Vector3fImmutable.ZERO, -1661758934, 40, false);
|
||||||
|
|
||||||
@@ -2206,10 +2185,6 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
if (bindLocation == null)
|
if (bindLocation == null)
|
||||||
bindLocation = Enum.Ruins.getRandomRuin().getLocation();
|
bindLocation = Enum.Ruins.getRandomRuin().getLocation();
|
||||||
|
|
||||||
if(this.guild.getNation().equals(Guild.getErrantGuild())){
|
|
||||||
bindLocation = Vector3fImmutable.getRandomPointOnCircle(BuildingManager.getBuilding(27977).loc,20f);
|
|
||||||
}
|
|
||||||
|
|
||||||
return bindLocation;
|
return bindLocation;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2748,12 +2723,12 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
public synchronized int getBindBuildingID() {
|
public synchronized int getBindBuildingID() {
|
||||||
return this.bindBuildingID;
|
return this.buildingUUID;
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void setBindBuildingID(int value) {
|
public synchronized void setBindBuildingID(int value) {
|
||||||
DbManager.PlayerCharacterQueries.SET_BIND_BUILDING(this, value);
|
DbManager.PlayerCharacterQueries.SET_BIND_BUILDING(this, value);
|
||||||
this.bindBuildingID = value;
|
this.buildingUUID = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AbstractGameObject getLastTarget() {
|
public AbstractGameObject getLastTarget() {
|
||||||
@@ -2895,7 +2870,7 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
|
|
||||||
float speed;
|
float speed;
|
||||||
|
|
||||||
if (this.isFlying())
|
if (this.getAltitude() > 0)
|
||||||
if (this.walkMode) {
|
if (this.walkMode) {
|
||||||
speed = race.getRaceType().getRunSpeed().getFlyWalk();
|
speed = race.getRaceType().getRunSpeed().getFlyWalk();
|
||||||
} else {
|
} else {
|
||||||
@@ -2915,8 +2890,7 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
speed = race.getRaceType().getRunSpeed().getRunStandard();
|
speed = race.getRaceType().getRunSpeed().getRunStandard();
|
||||||
}
|
}
|
||||||
|
|
||||||
float mod = this.speedMod;
|
float endSpeed = speed * this.speedMod;
|
||||||
float endSpeed = speed * mod;
|
|
||||||
|
|
||||||
if (endSpeed > 41 && !this.isCSR)
|
if (endSpeed > 41 && !this.isCSR)
|
||||||
endSpeed = 41;
|
endSpeed = 41;
|
||||||
@@ -2925,21 +2899,6 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void grantXP(int xp) {
|
public synchronized void grantXP(int xp) {
|
||||||
if(this.promotionClass == null && this.level == 10){
|
|
||||||
this.setOverFlowEXP(0);
|
|
||||||
this.update(false);
|
|
||||||
this.incVer();
|
|
||||||
this.recalculate();
|
|
||||||
this.calculateMaxHealthManaStamina();
|
|
||||||
this.setHealth(this.healthMax);
|
|
||||||
this.mana.set(this.manaMax);
|
|
||||||
this.stamina.set(this.staminaMax);
|
|
||||||
//LoadJob.reloadCharacter(this);
|
|
||||||
DbManager.PlayerCharacterQueries.SET_PROPERTY(this, "char_experience", this.exp);
|
|
||||||
// updateDatabase();
|
|
||||||
DbManager.AccountQueries.INVALIDATE_LOGIN_CACHE(this.getObjectUUID(), "character");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Stop players from getting experience past the cap
|
// Stop players from getting experience past the cap
|
||||||
if (this.exp + xp >= Experience.getBaseExperience(MBServerStatics.LEVELCAP))
|
if (this.exp + xp >= Experience.getBaseExperience(MBServerStatics.LEVELCAP))
|
||||||
xp = Experience.getBaseExperience(MBServerStatics.LEVELCAP) - this.exp + 1;
|
xp = Experience.getBaseExperience(MBServerStatics.LEVELCAP) - this.exp + 1;
|
||||||
@@ -3088,7 +3047,7 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (charReloadRequired) {
|
if (charReloadRequired) {
|
||||||
this.update(false);
|
this.update();
|
||||||
this.incVer();
|
this.incVer();
|
||||||
this.recalculate();
|
this.recalculate();
|
||||||
this.calculateMaxHealthManaStamina();
|
this.calculateMaxHealthManaStamina();
|
||||||
@@ -3161,7 +3120,7 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
bonus += this.bonuses.getFloatPercentNullZero(ModType.Speed, SourceType.None);
|
bonus += this.bonuses.getFloatPercentNullZero(ModType.Speed, SourceType.None);
|
||||||
|
|
||||||
// TODO get equip bonus
|
// TODO get equip bonus
|
||||||
this.update(false);
|
this.update();
|
||||||
this.speedMod = bonus;
|
this.speedMod = bonus;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3394,11 +3353,11 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
public void recalculatePlayerStats(boolean initialized) {
|
public void recalculatePlayerStats(boolean initialized) {
|
||||||
|
|
||||||
//calculate base stats
|
//calculate base stats
|
||||||
this.calculateBaseStats();
|
calculateBaseStats();
|
||||||
|
|
||||||
//calculate base skills
|
//calculate base skills
|
||||||
CharacterSkill.updateAllBaseAmounts(this);
|
CharacterSkill.updateAllBaseAmounts(this);
|
||||||
this.calculateModifiedStats();
|
calculateModifiedStats();
|
||||||
|
|
||||||
//calculate modified skills
|
//calculate modified skills
|
||||||
CharacterSkill.updateAllModifiedAmounts(this);
|
CharacterSkill.updateAllModifiedAmounts(this);
|
||||||
@@ -3408,13 +3367,13 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
|
|
||||||
|
|
||||||
//calculate ATR, damage and defense
|
//calculate ATR, damage and defense
|
||||||
this.calculateAtrDefenseDamage();
|
calculateAtrDefenseDamage();
|
||||||
|
|
||||||
//calculate movement bonus
|
//calculate movement bonus
|
||||||
this.calculateSpeedMod();
|
calculateSpeedMod();
|
||||||
|
|
||||||
// recalculate Max Health/Mana/Stamina
|
// recalculate Max Health/Mana/Stamina
|
||||||
this.calculateMaxHealthManaStamina();
|
calculateMaxHealthManaStamina();
|
||||||
|
|
||||||
// recalculate Resists
|
// recalculate Resists
|
||||||
Resists.calculateResists(this);
|
Resists.calculateResists(this);
|
||||||
@@ -4604,10 +4563,6 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
@Override
|
@Override
|
||||||
public void runAfterLoad() {
|
public void runAfterLoad() {
|
||||||
|
|
||||||
// Init inventory
|
|
||||||
|
|
||||||
this.charItemManager = new CharacterItemManager(this);
|
|
||||||
|
|
||||||
Bounds playerBounds = Bounds.borrow();
|
Bounds playerBounds = Bounds.borrow();
|
||||||
playerBounds.setBounds(this.getLoc());
|
playerBounds.setBounds(this.getLoc());
|
||||||
this.setBounds(playerBounds);
|
this.setBounds(playerBounds);
|
||||||
@@ -4735,7 +4690,8 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
|
|
||||||
} else if (currentPet.isSiege()) {
|
} else if (currentPet.isSiege()) {
|
||||||
currentPet.agentType = AIAgentType.MOBILE;
|
currentPet.agentType = AIAgentType.MOBILE;
|
||||||
currentPet.setOwner(null);
|
|
||||||
|
currentPet.guardCaptain = null;
|
||||||
currentPet.setCombatTarget(null);
|
currentPet.setCombatTarget(null);
|
||||||
if (currentPet.isAlive())
|
if (currentPet.isAlive())
|
||||||
WorldGrid.updateObject(currentPet);
|
WorldGrid.updateObject(currentPet);
|
||||||
@@ -4830,34 +4786,15 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void forceRespawn(PlayerCharacter sourcePlayer) throws MsgSendException {
|
|
||||||
|
|
||||||
if (sourcePlayer == null)
|
|
||||||
return;
|
|
||||||
try {
|
|
||||||
sourcePlayer.getClientConnection().disconnect();
|
|
||||||
} catch (Exception e) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Boolean newSystem) {
|
public void update() {
|
||||||
|
|
||||||
if(!newSystem)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (this.updateLock.writeLock().tryLock()) {
|
if (this.updateLock.writeLock().tryLock()) {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
if (!this.isAlive() && this.isEnteredWorld()) {
|
if (!this.isAlive())
|
||||||
if(!this.timestamps.containsKey("DeathTime")){
|
|
||||||
this.timestamps.put("DeathTime",System.currentTimeMillis());
|
|
||||||
}else if((System.currentTimeMillis() - this.timestamps.get("DeathTime")) > 600000)
|
|
||||||
forceRespawn(this);
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
updateLocation();
|
updateLocation();
|
||||||
updateMovementState();
|
updateMovementState();
|
||||||
updateRegen();
|
updateRegen();
|
||||||
@@ -4873,37 +4810,6 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
updateBlessingMessage();
|
updateBlessingMessage();
|
||||||
|
|
||||||
this.safeZone = this.isInSafeZone();
|
this.safeZone = this.isInSafeZone();
|
||||||
if(!this.timestamps.containsKey("nextBoxCheck"))
|
|
||||||
this.timestamps.put("nextBoxCheck", System.currentTimeMillis() + 10000);
|
|
||||||
|
|
||||||
if(!this.isBoxed && this.timestamps.get("nextBoxCheck") < System.currentTimeMillis()) {
|
|
||||||
this.isBoxed = checkIfBoxed(this);
|
|
||||||
this.timestamps.put("nextBoxCheck", System.currentTimeMillis() + 10000);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(this.level < 10 && this.enteredWorld) {
|
|
||||||
// this.setLevel((short) 10);
|
|
||||||
while (this.level < 10) {
|
|
||||||
grantXP(Experience.getBaseExperience(this.level + 1) - this.exp);
|
|
||||||
}
|
|
||||||
if(this.charItemManager != null && this.charItemManager.getGoldInventory() != null && this.charItemManager.getGoldInventory().getNumOfItems() < 1000) {
|
|
||||||
this.getCharItemManager().addGoldToInventory(1000, false);
|
|
||||||
this.getCharItemManager().addItemToInventory(new MobLoot(this, ItemBase.getItemBase(980066), 1, false).promoteToItem(this));
|
|
||||||
this.getCharItemManager().updateInventory();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(this.isBoxed && !this.containsEffect(1672601862)) {
|
|
||||||
PowersManager.applyPower(this, this, Vector3fImmutable.ZERO, 1672601862, 40, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(this.isFlying()){
|
|
||||||
//if (!AbstractCharacter.CanFly(this)) {
|
|
||||||
if(this.effects.containsKey("MoveBuff")){
|
|
||||||
GroundPlayer(this);
|
|
||||||
//ChatManager.chatSystemInfo(this, "You Cannot Fly While Having A MovementBuff");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.error(e);
|
Logger.error(e);
|
||||||
@@ -4912,47 +4818,7 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static void unboxPlayer(PlayerCharacter player){
|
|
||||||
String machineID = player.getClientConnection().machineID;
|
|
||||||
ArrayList<PlayerCharacter> sameMachine = new ArrayList<>();
|
|
||||||
for(PlayerCharacter pc : SessionManager.getAllActivePlayerCharacters()){
|
|
||||||
if(!pc.equals(player) && pc. isActive && pc.isEnteredWorld() && pc.getClientConnection().machineID.equals(machineID)){
|
|
||||||
sameMachine.add(pc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for(PlayerCharacter pc : sameMachine)
|
|
||||||
pc.isBoxed = true;
|
|
||||||
|
|
||||||
player.isBoxed = false;
|
|
||||||
if(player.containsEffect(1672601862)) {
|
|
||||||
player.removeEffectBySource(EffectSourceType.DeathShroud,41,false);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
public static boolean checkIfBoxed(PlayerCharacter player){
|
|
||||||
if(ConfigManager.MB_WORLD_TESTMODE.getValue().equals("true")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
String machineID = player.getClientConnection().machineID;
|
|
||||||
ArrayList<PlayerCharacter> sameMachine = new ArrayList<>();
|
|
||||||
for (PlayerCharacter pc : SessionManager.getAllActivePlayerCharacters()) {
|
|
||||||
if (!pc.equals(player) && pc.isActive && pc.isEnteredWorld() && pc.getClientConnection().machineID.equals(machineID)) {
|
|
||||||
sameMachine.add(pc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean boxed = false;
|
|
||||||
for (PlayerCharacter pc : sameMachine)
|
|
||||||
if (!pc.isBoxed)
|
|
||||||
boxed = true;
|
|
||||||
|
|
||||||
return boxed;
|
|
||||||
}catch(Exception e){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@Override
|
@Override
|
||||||
public void updateFlight() {
|
public void updateFlight() {
|
||||||
|
|
||||||
@@ -5555,7 +5421,7 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
@Override
|
@Override
|
||||||
public final void setIsCasting(final boolean isCasting) {
|
public final void setIsCasting(final boolean isCasting) {
|
||||||
if (this.isCasting != isCasting)
|
if (this.isCasting != isCasting)
|
||||||
this.update(false);
|
this.update();
|
||||||
this.isCasting = isCasting;
|
this.isCasting = isCasting;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -150,7 +150,6 @@ public class PromotionClass extends AbstractGameObject {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,24 +34,6 @@ public class Resists {
|
|||||||
private int protectionTrains = 0;
|
private int protectionTrains = 0;
|
||||||
private boolean immuneToAll;
|
private boolean immuneToAll;
|
||||||
|
|
||||||
public Resists() {
|
|
||||||
this.immuneToAll = false;
|
|
||||||
this.resists.put(DamageType.Slash, 0f);
|
|
||||||
this.resists.put(DamageType.Crush, 0f);
|
|
||||||
this.resists.put(DamageType.Pierce, 0f);
|
|
||||||
this.resists.put(DamageType.Magic, 0f);
|
|
||||||
this.resists.put(DamageType.Bleed, 0f);
|
|
||||||
this.resists.put(DamageType.Poison, 0f);
|
|
||||||
this.resists.put(DamageType.Mental, 0f);
|
|
||||||
this.resists.put(DamageType.Holy, 0f);
|
|
||||||
this.resists.put(DamageType.Unholy, 0f);
|
|
||||||
this.resists.put(DamageType.Lightning, 0f);
|
|
||||||
this.resists.put(DamageType.Fire, 0f);
|
|
||||||
this.resists.put(DamageType.Cold, 0f);
|
|
||||||
this.resists.put(DamageType.Healing, 0f);
|
|
||||||
this.immuneTo.put(DamageType.Siege, true);
|
|
||||||
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* Generic Constructor
|
* Generic Constructor
|
||||||
*/
|
*/
|
||||||
@@ -64,12 +46,6 @@ public class Resists {
|
|||||||
case "Mine":
|
case "Mine":
|
||||||
setMineResists();
|
setMineResists();
|
||||||
break;
|
break;
|
||||||
case "Dropper":
|
|
||||||
setDropperResists();
|
|
||||||
break;
|
|
||||||
case "Elite":
|
|
||||||
setEliteResists();
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
setGenericResists();
|
setGenericResists();
|
||||||
break;
|
break;
|
||||||
@@ -255,42 +231,6 @@ public class Resists {
|
|||||||
this.resists.put(DamageType.Siege, 0f);
|
this.resists.put(DamageType.Siege, 0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void setDropperResists() {
|
|
||||||
this.immuneToAll = false;
|
|
||||||
this.resists.put(DamageType.Slash, 50f);
|
|
||||||
this.resists.put(DamageType.Crush, 50f);
|
|
||||||
this.resists.put(DamageType.Pierce, 50f);
|
|
||||||
this.resists.put(DamageType.Magic, 50f);
|
|
||||||
this.resists.put(DamageType.Bleed, 50f);
|
|
||||||
this.resists.put(DamageType.Poison, 50f);
|
|
||||||
this.resists.put(DamageType.Mental, 50f);
|
|
||||||
this.resists.put(DamageType.Holy, 50f);
|
|
||||||
this.resists.put(DamageType.Unholy, 50f);
|
|
||||||
this.resists.put(DamageType.Lightning, 50f);
|
|
||||||
this.resists.put(DamageType.Fire, 50f);
|
|
||||||
this.resists.put(DamageType.Cold, 50f);
|
|
||||||
this.resists.put(DamageType.Healing, 0f);
|
|
||||||
this.immuneTo.put(DamageType.Siege, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setEliteResists() {
|
|
||||||
this.immuneToAll = false;
|
|
||||||
this.resists.put(DamageType.Slash, 75f);
|
|
||||||
this.resists.put(DamageType.Crush, 75f);
|
|
||||||
this.resists.put(DamageType.Pierce, 75f);
|
|
||||||
this.resists.put(DamageType.Magic, 75f);
|
|
||||||
this.resists.put(DamageType.Bleed, 75f);
|
|
||||||
this.resists.put(DamageType.Poison, 75f);
|
|
||||||
this.resists.put(DamageType.Mental, 75f);
|
|
||||||
this.resists.put(DamageType.Holy, 75f);
|
|
||||||
this.resists.put(DamageType.Unholy, 75f);
|
|
||||||
this.resists.put(DamageType.Lightning, 75f);
|
|
||||||
this.resists.put(DamageType.Fire, 75f);
|
|
||||||
this.resists.put(DamageType.Cold, 75f);
|
|
||||||
this.resists.put(DamageType.Healing, 0f);
|
|
||||||
this.immuneTo.put(DamageType.Siege, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create generic resists
|
* Create generic resists
|
||||||
*/
|
*/
|
||||||
@@ -454,7 +394,7 @@ public class Resists {
|
|||||||
*/
|
*/
|
||||||
public float getResistedDamage(AbstractCharacter source, AbstractCharacter target, DamageType type, float damage, int trains) {
|
public float getResistedDamage(AbstractCharacter source, AbstractCharacter target, DamageType type, float damage, int trains) {
|
||||||
//handle fortitudes
|
//handle fortitudes
|
||||||
//damage = handleFortitude(target, type, damage);
|
damage = handleFortitude(target, type, damage);
|
||||||
//calculate armor piercing
|
//calculate armor piercing
|
||||||
float ap = source.getBonuses().getFloatPercentAll(ModType.ArmorPiercing, SourceType.None);
|
float ap = source.getBonuses().getFloatPercentAll(ModType.ArmorPiercing, SourceType.None);
|
||||||
float damageAfterResists = damage * (1 - (this.getResist(type, trains) * 0.01f) + ap);
|
float damageAfterResists = damage * (1 - (this.getResist(type, trains) * 0.01f) + ap);
|
||||||
@@ -477,7 +417,6 @@ public class Resists {
|
|||||||
}
|
}
|
||||||
target.cancelOnTakeDamage(type, (damageAfterResists));
|
target.cancelOnTakeDamage(type, (damageAfterResists));
|
||||||
}
|
}
|
||||||
damageAfterResists = handleFortitude(target, type, damageAfterResists);
|
|
||||||
return damageAfterResists;
|
return damageAfterResists;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -487,38 +426,6 @@ public class Resists {
|
|||||||
// get resists for runes
|
// get resists for runes
|
||||||
PlayerBonuses rb = ac.getBonuses();
|
PlayerBonuses rb = ac.getBonuses();
|
||||||
float slash = 0f, crush = 0f, pierce = 0f, magic = 0f, bleed = 0f, mental = 0f, holy = 0f, unholy = 0f, poison = 0f, lightning = 0f, fire = 0f, cold = 0f, healing = 0f;
|
float slash = 0f, crush = 0f, pierce = 0f, magic = 0f, bleed = 0f, mental = 0f, holy = 0f, unholy = 0f, poison = 0f, lightning = 0f, fire = 0f, cold = 0f, healing = 0f;
|
||||||
if(ac.getObjectType().equals(Enum.GameObjectType.Mob)){
|
|
||||||
Mob mob = (Mob)ac;
|
|
||||||
if(mob.StrongholdEpic || mob.StrongholdCommander || mob.StrongholdGuardian) {
|
|
||||||
slash = 75f;
|
|
||||||
crush = 75f;
|
|
||||||
pierce = 75f;
|
|
||||||
magic = 75f;
|
|
||||||
bleed = 75f;
|
|
||||||
mental = 75f;
|
|
||||||
holy = 75f;
|
|
||||||
unholy = 75f;
|
|
||||||
poison = 75f;
|
|
||||||
lightning = 75f;
|
|
||||||
fire = 75f;
|
|
||||||
cold = 75f;
|
|
||||||
healing = 0f;
|
|
||||||
} else if(Mob.discDroppers.contains(mob) || mob.isDropper) {
|
|
||||||
slash = 200f;
|
|
||||||
crush = 200f;
|
|
||||||
pierce = 200f;
|
|
||||||
magic = 200f;
|
|
||||||
bleed = 200f;
|
|
||||||
mental = 200f;
|
|
||||||
holy = 200f;
|
|
||||||
unholy = 200f;
|
|
||||||
poison = 200f;
|
|
||||||
lightning = 200f;
|
|
||||||
fire = 200f;
|
|
||||||
cold = 200f;
|
|
||||||
healing = 0f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rb != null) {
|
if (rb != null) {
|
||||||
// Handle immunities
|
// Handle immunities
|
||||||
@@ -558,6 +465,19 @@ public class Resists {
|
|||||||
cold += rb.getFloat(ModType.Resistance, SourceType.Cold);
|
cold += rb.getFloat(ModType.Resistance, SourceType.Cold);
|
||||||
healing += rb.getFloat(ModType.Resistance, SourceType.Healing); // DamageType.Healing.name());
|
healing += rb.getFloat(ModType.Resistance, SourceType.Healing); // DamageType.Healing.name());
|
||||||
|
|
||||||
|
//HHO
|
||||||
|
|
||||||
|
// String protectionString = rb.getString("protection");
|
||||||
|
//
|
||||||
|
// if (protectionString.isEmpty())
|
||||||
|
// this.protection = null;
|
||||||
|
// else try {
|
||||||
|
// this.protection = DamageType.valueOf(rb.getString("protection"));
|
||||||
|
// } catch (IllegalArgumentException e) {
|
||||||
|
// Logger.error( "No enum for: " + protectionString);
|
||||||
|
// this.protection = null;
|
||||||
|
// }
|
||||||
|
// this.protectionTrains = rb.getFloat("protection");
|
||||||
}
|
}
|
||||||
|
|
||||||
// get resists from equipment
|
// get resists from equipment
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public class Shrine extends AbstractWorldObject implements Comparable<Shrine> {
|
|||||||
|
|
||||||
public static boolean canTakeFavor(PlayerCharacter grantee, Shrine shrine) {
|
public static boolean canTakeFavor(PlayerCharacter grantee, Shrine shrine) {
|
||||||
|
|
||||||
if (shrine.shrineType.isRace()) {
|
if (shrine.shrineType.isRace())
|
||||||
switch (grantee.getRaceID()) {
|
switch (grantee.getRaceID()) {
|
||||||
case 2000:
|
case 2000:
|
||||||
case 2001:
|
case 2001:
|
||||||
@@ -96,7 +96,6 @@ public class Shrine extends AbstractWorldObject implements Comparable<Shrine> {
|
|||||||
|
|
||||||
case 2025:
|
case 2025:
|
||||||
case 2026:
|
case 2026:
|
||||||
case 1999:
|
|
||||||
if (shrine.shrineType == ShrineType.Nephilim)
|
if (shrine.shrineType == ShrineType.Nephilim)
|
||||||
return true;
|
return true;
|
||||||
break;
|
break;
|
||||||
@@ -107,7 +106,7 @@ public class Shrine extends AbstractWorldObject implements Comparable<Shrine> {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
}else {
|
else
|
||||||
switch (grantee.getPromotionClassID()) {
|
switch (grantee.getPromotionClassID()) {
|
||||||
case 2504:
|
case 2504:
|
||||||
if (shrine.shrineType == ShrineType.Assassin)
|
if (shrine.shrineType == ShrineType.Assassin)
|
||||||
@@ -198,7 +197,7 @@ public class Shrine extends AbstractWorldObject implements Comparable<Shrine> {
|
|||||||
return true;
|
return true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,6 +226,26 @@ public class Shrine extends AbstractWorldObject implements Comparable<Shrine> {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void decay() {
|
||||||
|
|
||||||
|
if (this.getFavors() == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int decayAmount = (int) (this.getFavors() - (this.getFavors() * .10f));
|
||||||
|
|
||||||
|
if (decayAmount < 0)
|
||||||
|
decayAmount = 0;
|
||||||
|
|
||||||
|
if (!DbManager.ShrineQueries.updateFavors(this, decayAmount, this.getFavors())) {
|
||||||
|
Logger.error("Shrine Decay", "Error writing to DB. UUID: " + this.getObjectUUID());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.favors = decayAmount;
|
||||||
|
|
||||||
|
Logger.info(shrineType.name() + " uuid:" + this.getObjectUUID() + " Amount: " + this.getFavors() * .10f);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public synchronized boolean addFavor(PlayerCharacter boonOwner, Item boonItem) {
|
public synchronized boolean addFavor(PlayerCharacter boonOwner, Item boonItem) {
|
||||||
|
|
||||||
if (boonOwner == null)
|
if (boonOwner == null)
|
||||||
|
|||||||
@@ -281,84 +281,6 @@ public class Warehouse extends AbstractWorldObject {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getCostForResource(int id){
|
|
||||||
int newCost = 1;
|
|
||||||
switch(id){
|
|
||||||
case 1580000://stone
|
|
||||||
newCost = 3000;
|
|
||||||
break;
|
|
||||||
case 1580001://truesteel
|
|
||||||
newCost = 50000;
|
|
||||||
break;
|
|
||||||
case 1580002://iron
|
|
||||||
newCost = 50000;
|
|
||||||
break;
|
|
||||||
case 1580003://adamant
|
|
||||||
newCost = 100000;
|
|
||||||
break;
|
|
||||||
case 1580004://lumber
|
|
||||||
newCost = 3000;
|
|
||||||
break;
|
|
||||||
case 1580005://oak
|
|
||||||
newCost = 30000;
|
|
||||||
break;
|
|
||||||
case 1580006://bronzewood
|
|
||||||
newCost = 30000;
|
|
||||||
break;
|
|
||||||
case 1580007://mandrake
|
|
||||||
newCost = 100000;
|
|
||||||
break;
|
|
||||||
case 1580008://coal
|
|
||||||
newCost = 30000;
|
|
||||||
break;
|
|
||||||
case 1580009://agate
|
|
||||||
newCost = 50000;
|
|
||||||
break;
|
|
||||||
case 1580010://diamond
|
|
||||||
newCost = 50000;
|
|
||||||
break;
|
|
||||||
case 1580011://onyx
|
|
||||||
newCost = 100000;
|
|
||||||
break;
|
|
||||||
case 1580012://azoth
|
|
||||||
newCost = 50000;
|
|
||||||
break;
|
|
||||||
case 1580013://orichalk
|
|
||||||
newCost = 30000;
|
|
||||||
break;
|
|
||||||
case 1580014://antimony
|
|
||||||
newCost = 100000;
|
|
||||||
break;
|
|
||||||
case 1580015://sulfur
|
|
||||||
newCost = 100000;
|
|
||||||
break;
|
|
||||||
case 1580016://quicksilver
|
|
||||||
newCost = 100000;
|
|
||||||
break;
|
|
||||||
case 1580017://galvor
|
|
||||||
newCost = 300000;
|
|
||||||
break;
|
|
||||||
case 1580018://wormwood
|
|
||||||
newCost = 300000;
|
|
||||||
break;
|
|
||||||
case 1580019://obsidian
|
|
||||||
newCost = 200000;
|
|
||||||
break;
|
|
||||||
case 1580020://bloodstone
|
|
||||||
newCost = 200000;
|
|
||||||
break;
|
|
||||||
case 1705032:
|
|
||||||
newCost = 100000;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return newCost;
|
|
||||||
}
|
|
||||||
public static int getSellStackSize(int id){
|
|
||||||
if(id == 1705032)
|
|
||||||
return 10;
|
|
||||||
return 3000000 / getCostForResource(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ConcurrentHashMap<ItemBase, Integer> getResources() {
|
public ConcurrentHashMap<ItemBase, Integer> getResources() {
|
||||||
return resources;
|
return resources;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
|
||||||
|
|
||||||
public class Zone extends AbstractGameObject {
|
public class Zone extends AbstractGameObject {
|
||||||
|
|
||||||
@@ -102,45 +101,6 @@ public class Zone extends AbstractGameObject {
|
|||||||
if (hash == null)
|
if (hash == null)
|
||||||
setHash();
|
setHash();
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//custom constructor
|
|
||||||
|
|
||||||
public Zone(int template, Vector3fImmutable loc, String name){
|
|
||||||
this.parentZoneID = 100;//seafloor
|
|
||||||
this.playerCityID = 0;
|
|
||||||
this.isPlayerCity = false;
|
|
||||||
this.zoneName = name;
|
|
||||||
this.xCoord = loc.x;
|
|
||||||
this.zCoord = loc.z;
|
|
||||||
this.yCoord = loc.y;
|
|
||||||
this.loadNum = template;
|
|
||||||
this.safeZone = (byte)0;
|
|
||||||
this.Icon1 = "T_Bandits";
|
|
||||||
this.Icon2 = "B_Standard";
|
|
||||||
this.Icon3 = "H_T_Bandits";
|
|
||||||
this.hash = null;
|
|
||||||
|
|
||||||
this.minLvl = 10;
|
|
||||||
this.maxLvl = 75;
|
|
||||||
|
|
||||||
//this needs to be here specifically for new zones created after server boot (e.g. player city zones)
|
|
||||||
Zone parentZone = ZoneManager.getZoneByUUID(parentZoneID);
|
|
||||||
|
|
||||||
this.setParent(parentZone);
|
|
||||||
|
|
||||||
if (this.minLvl == 0 && parentZone != null) {
|
|
||||||
this.minLvl = parentZone.minLvl;
|
|
||||||
this.maxLvl = parentZone.maxLvl;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parentZone != null)
|
|
||||||
parentZone.addNode(this);
|
|
||||||
|
|
||||||
// If zone doesn't yet hava a hash then write it back to the zone table
|
|
||||||
|
|
||||||
if (hash == null)
|
|
||||||
setHash();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,8 +113,8 @@ public class Zone extends AbstractGameObject {
|
|||||||
|
|
||||||
if (zone.playerCityID > 0) {
|
if (zone.playerCityID > 0) {
|
||||||
writer.put((byte) 1); // Player City - True
|
writer.put((byte) 1); // Player City - True
|
||||||
writer.putFloat(Enum.CityBoundsType.GRID.extents + 128);
|
writer.putFloat(Enum.CityBoundsType.ZONE.extents);
|
||||||
writer.putFloat(Enum.CityBoundsType.GRID.extents + 128);
|
writer.putFloat(Enum.CityBoundsType.ZONE.extents);
|
||||||
} else
|
} else
|
||||||
writer.put((byte) 0); // Player City - False
|
writer.put((byte) 0); // Player City - False
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ public class AttributeEffectModifier extends AbstractEffectModifier {
|
|||||||
@Override
|
@Override
|
||||||
public void applyBonus(AbstractCharacter ac, int trains) {
|
public void applyBonus(AbstractCharacter ac, int trains) {
|
||||||
|
|
||||||
ac.update(false);
|
ac.update();
|
||||||
Float amount = 0f;
|
Float amount = 0f;
|
||||||
PlayerBonuses bonus = ac.getBonuses();
|
PlayerBonuses bonus = ac.getBonuses();
|
||||||
if (this.percentMod != 0f) { //Stat Percent Modifiers
|
if (this.percentMod != 0f) { //Stat Percent Modifiers
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ public class HealthRecoverRateEffectModifier extends AbstractEffectModifier {
|
|||||||
@Override
|
@Override
|
||||||
public void applyBonus(AbstractCharacter ac, int trains) {
|
public void applyBonus(AbstractCharacter ac, int trains) {
|
||||||
|
|
||||||
ac.update(false);
|
ac.update();
|
||||||
Float amount = 0f;
|
Float amount = 0f;
|
||||||
PlayerBonuses bonus = ac.getBonuses();
|
PlayerBonuses bonus = ac.getBonuses();
|
||||||
if (this.useRampAdd)
|
if (this.useRampAdd)
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ public class NoModEffectModifier extends AbstractEffectModifier {
|
|||||||
PlayerCharacter flyer = (PlayerCharacter) ac;
|
PlayerCharacter flyer = (PlayerCharacter) ac;
|
||||||
|
|
||||||
if (flyer.getAltitude() > 0)
|
if (flyer.getAltitude() > 0)
|
||||||
flyer.update(false);
|
flyer.update();
|
||||||
PlayerCharacter.GroundPlayer(flyer);
|
PlayerCharacter.GroundPlayer(flyer);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ package engine.powers.poweractions;
|
|||||||
import engine.Enum.GameObjectType;
|
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.gameManager.ChatManager;
|
import engine.gameManager.ChatManager;
|
||||||
import engine.jobs.ChantJob;
|
import engine.jobs.ChantJob;
|
||||||
import engine.jobs.DeferredPowerJob;
|
import engine.jobs.DeferredPowerJob;
|
||||||
@@ -22,6 +23,7 @@ import engine.objects.*;
|
|||||||
import engine.powers.ActionsBase;
|
import engine.powers.ActionsBase;
|
||||||
import engine.powers.EffectsBase;
|
import engine.powers.EffectsBase;
|
||||||
import engine.powers.PowersBase;
|
import engine.powers.PowersBase;
|
||||||
|
import engine.server.MBServerStatics;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
@@ -117,20 +119,12 @@ public class ApplyEffectPowerAction extends AbstractPowerAction {
|
|||||||
awo.addEffect(stackType, duration, eff, effect, trains);
|
awo.addEffect(stackType, duration, eff, effect, trains);
|
||||||
} else
|
} else
|
||||||
awo.applyAllBonuses();
|
awo.applyAllBonuses();
|
||||||
// //TODO if chant, start cycle
|
|
||||||
// if (pb.isChant() && source.equals(awo)) {
|
|
||||||
// ChantJob cj = new ChantJob(source, awo, stackType, trains, ab, pb, effect, eff);
|
|
||||||
// source.setLastChant((int)(pb.getChantDuration()-2) * 1000, cj);
|
|
||||||
// eff.setChant(true);
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (this.effectID.equals("TAUNT")) {
|
if (this.effectID.equals("TAUNT")) {
|
||||||
|
|
||||||
if (awo != null && awo.getObjectType() == GameObjectType.Mob) {
|
if (awo != null && awo.getObjectType() == GameObjectType.Mob) {
|
||||||
((Mob) awo).setCombatTarget(source);
|
|
||||||
ChatSystemMsg msg = ChatManager.CombatInfo(source, awo);
|
ChatSystemMsg msg = ChatManager.CombatInfo(source, awo);
|
||||||
DispatchMessage.sendToAllInRange(source, msg);
|
DispatchMessage.sendToAllInRange(source, msg);
|
||||||
((Mob)awo).refresh();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (awo != null && awo.getObjectType() == GameObjectType.Mob) {
|
if (awo != null && awo.getObjectType() == GameObjectType.Mob) {
|
||||||
@@ -140,8 +134,22 @@ public class ApplyEffectPowerAction extends AbstractPowerAction {
|
|||||||
}
|
}
|
||||||
this.effect.startEffect(source, awo, trains, eff);
|
this.effect.startEffect(source, awo, trains, eff);
|
||||||
}
|
}
|
||||||
|
//apply effects to mobs within range for chants
|
||||||
|
if(pb.isChant){
|
||||||
|
for(AbstractGameObject ago : WorldGrid.getObjectsInRangePartial(awo.loc,pb.range, MBServerStatics.MASK_MOB)){
|
||||||
|
Mob mob = (Mob)ago;
|
||||||
|
if(mob.playerAgroMap.containsKey(source.getObjectUUID()))
|
||||||
|
mob.playerAgroMap.put(source.getObjectUUID(), mob.playerAgroMap.get(source.getObjectUUID()).floatValue() + pb.hateValue);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}else {
|
||||||
|
if (awo != null && awo.getObjectType() == GameObjectType.Mob) {
|
||||||
|
Mob mob = (Mob) awo;
|
||||||
|
if (mob.playerAgroMap.containsKey(source.getObjectUUID()))
|
||||||
|
mob.playerAgroMap.put(source.getObjectUUID(), mob.playerAgroMap.get(source.getObjectUUID()).floatValue() + pb.hateValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected void _applyEffectForItem(Item item, int trains) {
|
protected void _applyEffectForItem(Item item, int trains) {
|
||||||
if (item == null || this.effect == null)
|
if (item == null || this.effect == null)
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user