forked from MagicBane/Server
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 962bebab6c | |||
| a67fee76c3 | |||
| d22ff916bf | |||
| 2d1da7679e | |||
| 549a381174 | |||
| 43563aeb14 | |||
| 7a4c2fe72a | |||
| 24cc6af147 |
@@ -24,3 +24,8 @@
|
|||||||
hs_err_pid*
|
hs_err_pid*
|
||||||
replay_pid*
|
replay_pid*
|
||||||
|
|
||||||
|
*.idea/
|
||||||
|
Server.iml
|
||||||
|
*.gitignore
|
||||||
|
prestonbane.iml
|
||||||
|
qodana.yaml
|
||||||
+6
-20
@@ -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,7 @@ 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.35f, 15.25f, 4.2199998f, 14.5f, 6.3299999f, 18.379999f, 6.5f);
|
|
||||||
|
|
||||||
private float walkStandard;
|
private float walkStandard;
|
||||||
private float walkCombat;
|
private float walkCombat;
|
||||||
@@ -960,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;
|
||||||
@@ -2320,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;
|
||||||
|
|
||||||
|
|||||||
@@ -521,12 +521,9 @@ 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);
|
||||||
if(player.level < 10)
|
|
||||||
player.setLevel((short) 10);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -95,26 +95,7 @@ public class dbCityHandler extends dbHandlerBase {
|
|||||||
|
|
||||||
return objectList;
|
return objectList;
|
||||||
}
|
}
|
||||||
public Integer GET_CAPITAL_CITY_COUNT() {
|
|
||||||
|
|
||||||
int cityCount = 0;
|
|
||||||
try (Connection connection = DbManager.getConnection();
|
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM obj_city;")) {
|
|
||||||
|
|
||||||
ResultSet rs = preparedStatement.executeQuery();
|
|
||||||
|
|
||||||
while(rs.next()){
|
|
||||||
if(rs.getInt("isNpc") == 0)
|
|
||||||
if(DbManager.BuildingQueries.GET_BUILDINGBYUUID(rs.getInt("treeOfLifeUUID")).getRank() == 8)
|
|
||||||
cityCount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (SQLException e) {
|
|
||||||
Logger.error(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
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<>();
|
||||||
|
|||||||
@@ -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) {
|
||||||
@@ -60,17 +61,8 @@ public abstract class dbHandlerBase {
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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,7 +25,7 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
|||||||
|
|
||||||
String output;
|
String output;
|
||||||
|
|
||||||
output = "Booty Simulation: Rolls:" + simCount + newline;
|
output = "Booty Simulation:" + newline;
|
||||||
|
|
||||||
Mob mob = (Mob) target;
|
Mob mob = (Mob) target;
|
||||||
output += "Name: " + mob.getName() + newline;
|
output += "Name: " + mob.getName() + newline;
|
||||||
@@ -53,7 +51,7 @@ public class SimulateBootyCmd extends AbstractDevCmd {
|
|||||||
int failures = 0;
|
int failures = 0;
|
||||||
int goldAmount = 0;
|
int goldAmount = 0;
|
||||||
|
|
||||||
for (int i = 0; i < simCount; ++i) {
|
for (int i = 0; i < 100; ++i) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
mob.loadInventory();
|
mob.loadInventory();
|
||||||
|
|||||||
@@ -520,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());
|
||||||
|
|||||||
@@ -1054,10 +1054,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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
@@ -178,17 +179,8 @@ public enum DevCmdManager {
|
|||||||
|
|
||||||
//kill any commands not available to everyone on production server
|
//kill any commands not available to everyone on production server
|
||||||
//only admin level can run dev commands on production
|
//only admin level can run dev commands on production
|
||||||
boolean playerAllowed = false;
|
|
||||||
switch(adc.getMainCmdString()){
|
if (a.status.equals(Enum.AccountStatus.ADMIN) == false) {
|
||||||
case "printresists":
|
|
||||||
case "printstats":
|
|
||||||
case "printskills":
|
|
||||||
case "printpowers":
|
|
||||||
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,11 +34,6 @@ public enum LootManager {
|
|||||||
public static HashMap<Integer, ArrayList<ModTableEntry>> _modTables = new HashMap<>();
|
public static HashMap<Integer, ArrayList<ModTableEntry>> _modTables = new HashMap<>();
|
||||||
public static HashMap<Integer, ArrayList<ModTypeTableEntry>> _modTypeTables = new HashMap<>();
|
public static HashMap<Integer, ArrayList<ModTypeTableEntry>> _modTypeTables = new HashMap<>();
|
||||||
|
|
||||||
public static 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));
|
|
||||||
|
|
||||||
// Drop Rates
|
// Drop Rates
|
||||||
|
|
||||||
public static float NORMAL_DROP_RATE;
|
public static float NORMAL_DROP_RATE;
|
||||||
@@ -74,73 +67,23 @@ public enum LootManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void GenerateMobLoot(Mob mob) {
|
public static void GenerateMobLoot(Mob mob) {
|
||||||
//determine if mob is in hotzone
|
|
||||||
boolean inHotzone = false;
|
|
||||||
|
|
||||||
//special blood rune droppers
|
//determine if mob is in hotzone
|
||||||
MobLoot specialDrop = null;
|
boolean inHotzone = ZoneManager.inHotZone(mob.getLoc());
|
||||||
switch(mob.getObjectUUID()) {
|
|
||||||
case 22595://elf 1
|
|
||||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252134),true);
|
|
||||||
mob.setFirstName("Melandrach The Blood-Mage");
|
|
||||||
break;
|
|
||||||
case 22432: //elf 2
|
|
||||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252135),true);
|
|
||||||
mob.setFirstName("Kyrtaar The Blood-Mage");
|
|
||||||
break;
|
|
||||||
case 22537: //elf 3
|
|
||||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252136),true);
|
|
||||||
mob.setFirstName("Vamir The Blood-Mage");
|
|
||||||
break;
|
|
||||||
case 16387: //human 4 DONE
|
|
||||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252129),true);
|
|
||||||
mob.setFirstName("Alatar The Blood-Mage");
|
|
||||||
break;
|
|
||||||
case 32724:// human 5 GOOD
|
|
||||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252130),true);
|
|
||||||
mob.setFirstName("Elphaba The Blood-Mage");
|
|
||||||
break;
|
|
||||||
case 23379: //human 1 GOOD
|
|
||||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252131),true);
|
|
||||||
mob.setFirstName("Bavmorda The Blood-Mage");
|
|
||||||
break;
|
|
||||||
case 10826: //human 2 REDO
|
|
||||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252132),true);
|
|
||||||
mob.setFirstName("Draco The Blood-Mage");
|
|
||||||
break;
|
|
||||||
case 15929: //human 3 GOOD
|
|
||||||
specialDrop = new MobLoot(mob,ItemBase.getItemBase(252133),true);
|
|
||||||
mob.setFirstName("Atlantes The Blood-Mage");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(specialDrop != null) {
|
|
||||||
mob.setLevel((short) 65);
|
|
||||||
mob.setSpawnTime(10800);
|
|
||||||
mob.healthMax = (7500);
|
|
||||||
mob.setHealth(7500);
|
|
||||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + specialDrop.getName() + ". Are you tough enough to take it?");
|
|
||||||
chatMsg.setMessageType(10);
|
|
||||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
|
||||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
|
||||||
mob.getCharItemManager().addItemToInventory(specialDrop);
|
|
||||||
mob.setResists(new Resists("Dropper"));
|
|
||||||
if(!Mob.discDroppers.contains(mob))
|
|
||||||
Mob.AddDiscDropper(mob);
|
|
||||||
}
|
|
||||||
|
|
||||||
//iterate the booty sets
|
//iterate the booty sets
|
||||||
|
|
||||||
if (mob.getMobBase().bootySet != 0 && _bootySetMap.containsKey(mob.getMobBase().bootySet))
|
if (mob.getMobBase().bootySet != 0 && _bootySetMap.containsKey(mob.getMobBase().bootySet) == true)
|
||||||
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);
|
||||||
|
|
||||||
//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?");
|
||||||
@@ -155,25 +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;
|
||||||
|
|
||||||
//1 in 1,000 chance to drop glass
|
|
||||||
if(ThreadLocalRandom.current().nextInt(1,1000) == 500){
|
|
||||||
int glassID = rollRandomItem(126);
|
|
||||||
ItemBase glassItem = ItemBase.getItemBase(glassID);
|
|
||||||
if(glassItem != null) {
|
|
||||||
MobLoot toAdd = new MobLoot(mob, glassItem, false);
|
|
||||||
|
|
||||||
if (toAdd != null)
|
|
||||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//check for special gifts 1/100 to drop present
|
|
||||||
if(ThreadLocalRandom.current().nextInt(1,25) == 15)
|
|
||||||
DropPresent(mob);
|
|
||||||
|
|
||||||
// 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":
|
||||||
@@ -181,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)
|
||||||
@@ -246,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 {
|
||||||
@@ -280,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -389,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);
|
||||||
@@ -400,48 +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) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
MobLoot toAdd = getGenTableItem(tableID, mob, inHotzone);
|
MobLoot toAdd = getGenTableItem(tableID, mob, inHotzone);
|
||||||
|
|
||||||
if (toAdd != null) {
|
if (toAdd != null)
|
||||||
toAdd.setIsID(true);
|
|
||||||
mob.getCharItemManager().addItemToInventory(toAdd);
|
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
|
|
||||||
|
|
||||||
//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;
|
|
||||||
|
|
||||||
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.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -457,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) {
|
||||||
@@ -485,7 +392,7 @@ 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
|
||||||
@@ -506,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);
|
||||||
@@ -530,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);
|
||||||
@@ -557,110 +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 = ThreadLocalRandom.current().nextInt(ItemBase.AnniverseryGifts.size());
|
|
||||||
int presentID = ItemBase.AnniverseryGifts.get(random);
|
|
||||||
ItemBase presentBase = ItemBase.getItemBase(presentID);
|
|
||||||
if(presentBase != null){
|
|
||||||
MobLoot lootItem = new MobLoot(mob, presentBase, true);
|
|
||||||
mob.getCharItemManager().addItemToInventory(lootItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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))
|
||||||
@@ -222,6 +222,12 @@ public enum MaintenanceManager {
|
|||||||
if ((hasFunds == false) ||
|
if ((hasFunds == false) ||
|
||||||
((building.getRank() == 8) && !hasResources)) {
|
((building.getRank() == 8) && !hasResources)) {
|
||||||
|
|
||||||
|
// Add cash back to strongbox for lost rank if the building isn't being destroyed
|
||||||
|
// and it's not an R8 deranking
|
||||||
|
|
||||||
|
if ((building.getRank() > 1) && (building.getRank() < 8)) {
|
||||||
|
building.setStrongboxValue(building.getStrongboxValue() + building.getBlueprint().getRankCost(Math.min(building.getRank(), 7)));
|
||||||
|
}
|
||||||
|
|
||||||
return false; // Early exit for having failed to meet maintenance
|
return false; // Early exit for having failed to meet maintenance
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -216,6 +216,16 @@ public enum MovementManager {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (toMove.getObjectType().equals(GameObjectType.PlayerCharacter)) {
|
||||||
|
Vector3fImmutable playerCollidePoint = Bounds.PlayerCollisionPoint((PlayerCharacter) toMove, toMove.getLoc(), endLocation);
|
||||||
|
|
||||||
|
if (playerCollidePoint != null) {
|
||||||
|
msg.setEndCoord(playerCollidePoint);
|
||||||
|
endLocation = playerCollidePoint;
|
||||||
|
collide = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (toMove.getObjectType() == GameObjectType.PlayerCharacter && ((PlayerCharacter) toMove).isTeleportMode()) {
|
if (toMove.getObjectType() == GameObjectType.PlayerCharacter && ((PlayerCharacter) toMove).isTeleportMode()) {
|
||||||
toMove.teleport(endLocation);
|
toMove.teleport(endLocation);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -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);
|
||||||
@@ -200,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -215,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,92 +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);
|
|
||||||
default:
|
|
||||||
return getMultiplier20Man(count);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static float getMultiplier3Man(int count) {
|
|
||||||
if(count < 4)
|
|
||||||
return 1.0f;
|
|
||||||
|
|
||||||
if(count > 6)
|
|
||||||
return 0.0f;
|
|
||||||
|
|
||||||
switch(count){
|
|
||||||
case 4:
|
|
||||||
return 0.75f;
|
|
||||||
case 5:
|
|
||||||
return 0.60f;
|
|
||||||
case 6:
|
|
||||||
return 0.37f;
|
|
||||||
|
|
||||||
}
|
|
||||||
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.67f;
|
|
||||||
case 8:
|
|
||||||
return 0.56f;
|
|
||||||
case 9:
|
|
||||||
return 0.43f;
|
|
||||||
case 10:
|
|
||||||
return 0.25f;
|
|
||||||
|
|
||||||
}
|
|
||||||
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.75f;
|
|
||||||
case 12:
|
|
||||||
return 0.71f;
|
|
||||||
case 13:
|
|
||||||
return 0.67f;
|
|
||||||
case 14:
|
|
||||||
return 0.62f;
|
|
||||||
case 15:
|
|
||||||
return 0.56f;
|
|
||||||
case 16:
|
|
||||||
return 0.50f;
|
|
||||||
case 17:
|
|
||||||
return 0.43f;
|
|
||||||
case 18:
|
|
||||||
return 0.35f;
|
|
||||||
case 19:
|
|
||||||
return 0.25f;
|
|
||||||
case 20:
|
|
||||||
return 0.14f;
|
|
||||||
|
|
||||||
}
|
|
||||||
return 1.0f;
|
|
||||||
}
|
|
||||||
public static float getMultiplier20Man(int count) {
|
|
||||||
return getMultiplier10Man(count * 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -44,16 +42,4 @@ public class ItemTableEntry {
|
|||||||
|
|
||||||
return itemTableEntry;
|
return itemTableEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Integer getRandomItem(int itemTable) {
|
|
||||||
int id = 0;
|
|
||||||
List<ItemTableEntry> itemTableEntryList;
|
|
||||||
|
|
||||||
itemTableEntryList = LootManager._itemTables.get(itemTable);
|
|
||||||
|
|
||||||
if(itemTableEntryList != null){
|
|
||||||
id = itemTableEntryList.get(ThreadLocalRandom.current().nextInt(0,itemTableEntryList.size() - 1)).cacheID;
|
|
||||||
}
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ public class Bounds {
|
|||||||
Bounds identityBounds = Bounds.borrow();
|
Bounds identityBounds = Bounds.borrow();
|
||||||
identityBounds.setBounds(location);
|
identityBounds.setBounds(location);
|
||||||
|
|
||||||
collisionState = collide(targetBounds, identityBounds, 0.0f);
|
collisionState = collide(targetBounds, identityBounds, 0.1f);
|
||||||
identityBounds.release();
|
identityBounds.release();
|
||||||
return collisionState;
|
return collisionState;
|
||||||
}
|
}
|
||||||
@@ -267,6 +267,45 @@ public class Bounds {
|
|||||||
return collidePoint;
|
return collidePoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Vector3fImmutable PlayerCollisionPoint(PlayerCharacter player, Vector3fImmutable start, Vector3fImmutable end) {
|
||||||
|
Vector3fImmutable collidePoint = null;
|
||||||
|
float distance = player.getLoc().distance2D(end);
|
||||||
|
|
||||||
|
// Check for building collisions first
|
||||||
|
collidePoint = PlayerBuildingCollisionPoint(player, start, end);
|
||||||
|
if (collidePoint != null) {
|
||||||
|
return collidePoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now check for player collisions
|
||||||
|
HashSet<AbstractWorldObject> nearbyPlayers = WorldGrid.getObjectsInRangePartial(player, distance + 2, MBServerStatics.MASK_PLAYER);
|
||||||
|
float minDistance = 5.0f; // Minimum distance between players
|
||||||
|
|
||||||
|
for (AbstractWorldObject awo : nearbyPlayers) {
|
||||||
|
PlayerCharacter otherPlayer = (PlayerCharacter) awo;
|
||||||
|
if (otherPlayer == player) continue;
|
||||||
|
|
||||||
|
Vector3fImmutable otherLoc = otherPlayer.getLoc();
|
||||||
|
Vector3fImmutable closestPoint = getClosestPointOnLine(start, end, otherLoc);
|
||||||
|
|
||||||
|
if (closestPoint.distance2D(otherLoc) < minDistance) {
|
||||||
|
// Collision detected, adjust end point
|
||||||
|
Vector3fImmutable pushVector = closestPoint.subtract(otherLoc).normalize();
|
||||||
|
collidePoint = closestPoint.add(pushVector.scaleAdd(minDistance, Vector3fImmutable.ZERO));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return collidePoint != null ? collidePoint : end;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Vector3fImmutable getClosestPointOnLine(Vector3fImmutable lineStart, Vector3fImmutable lineEnd, Vector3fImmutable point) {
|
||||||
|
Vector3fImmutable line = lineEnd.subtract(lineStart);
|
||||||
|
float t = point.subtract(lineStart).dot(line) / line.dot(line);
|
||||||
|
t = Math.max(0, Math.min(1, t));
|
||||||
|
return lineStart.add(line.scaleAdd(t, Vector3fImmutable.ZERO));
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean linesTouching(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) {
|
public static boolean linesTouching(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) {
|
||||||
float denominator = ((x2 - x1) * (y4 - y3)) - ((y2 - y1) * (x4 - x3));
|
float denominator = ((x2 - x1) * (y4 - y3)) - ((y2 - y1) * (x4 - x3));
|
||||||
float numerator1 = ((y1 - y3) * (x4 - x3)) - ((x1 - x3) * (y4 - y3));
|
float numerator1 = ((y1 - y3) * (x4 - x3)) - ((x1 - x3) * (y4 - y3));
|
||||||
|
|||||||
@@ -625,7 +625,7 @@ public class MobAI {
|
|||||||
|
|
||||||
//check to send mob home for player guards to prevent exploit of dragging guards away and then teleporting
|
//check to send mob home for player guards to prevent exploit of dragging guards away and then teleporting
|
||||||
|
|
||||||
|
if (mob.BehaviourType.ordinal() != Enum.MobBehaviourType.Pet1.ordinal())
|
||||||
CheckToSendMobHome(mob);
|
CheckToSendMobHome(mob);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -646,6 +646,9 @@ public class MobAI {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mob.BehaviourType.ordinal() != Enum.MobBehaviourType.Pet1.ordinal())
|
||||||
|
CheckToSendMobHome(mob);
|
||||||
|
|
||||||
if (mob.getCombatTarget() != null) {
|
if (mob.getCombatTarget() != null) {
|
||||||
|
|
||||||
if (mob.getCombatTarget().isAlive() == false) {
|
if (mob.getCombatTarget().isAlive() == false) {
|
||||||
@@ -871,12 +874,9 @@ public class MobAI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (System.currentTimeMillis() > (aiAgent.deathTime + (aiAgent.spawnTime * 1000L))) {
|
} else if (System.currentTimeMillis() > (aiAgent.deathTime + (aiAgent.spawnTime * 1000))) {
|
||||||
|
|
||||||
if(Mob.discDroppers.contains(aiAgent))
|
if (Zone.respawnQue.contains(aiAgent) == false) {
|
||||||
return;
|
|
||||||
|
|
||||||
if (!Zone.respawnQue.contains(aiAgent)) {
|
|
||||||
Zone.respawnQue.add(aiAgent);
|
Zone.respawnQue.add(aiAgent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -911,11 +911,6 @@ public class MobAI {
|
|||||||
|
|
||||||
private static void CheckToSendMobHome(Mob mob) {
|
private static void CheckToSendMobHome(Mob mob) {
|
||||||
|
|
||||||
if(mob.BehaviourType.equals(Enum.MobBehaviourType.Pet1)){
|
|
||||||
if(mob.loc.distanceSquared(mob.getOwner().loc) > 60 * 60)
|
|
||||||
mob.teleport(mob.getOwner().loc);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
if (mob.BehaviourType.isAgressive) {
|
if (mob.BehaviourType.isAgressive) {
|
||||||
|
|
||||||
@@ -927,6 +922,9 @@ public class MobAI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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());
|
||||||
@@ -1008,7 +1006,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;
|
||||||
|
|||||||
@@ -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) {
|
||||||
@@ -1261,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();
|
||||||
@@ -1363,14 +1343,6 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
|
|
||||||
NPC npc = NPC.getFromCache(msg.getNpcID());
|
NPC npc = NPC.getFromCache(msg.getNpcID());
|
||||||
|
|
||||||
|
|
||||||
switch(npc.getContractID()){
|
|
||||||
case 900:
|
|
||||||
case 1201:
|
|
||||||
case 1202:
|
|
||||||
npc.sellPercent = 0.0f;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (npc == null)
|
if (npc == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -1386,182 +1358,219 @@ public class ClientMessagePump implements NetMsgHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void buyFromNPC(BuyFromNPCMsg msg, ClientConnection origin) {
|
private static void buyFromNPC(BuyFromNPCMsg msg, ClientConnection origin) {
|
||||||
|
|
||||||
PlayerCharacter sourcePlayer = SessionManager.getPlayerCharacter(origin);
|
PlayerCharacter sourcePlayer = SessionManager.getPlayerCharacter(origin);
|
||||||
|
|
||||||
if (sourcePlayer == null)
|
if (sourcePlayer == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (origin.buyLock.tryLock()) {
|
if (origin.buyLock.tryLock()) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
CharacterItemManager itemMan = sourcePlayer.getCharItemManager();
|
CharacterItemManager itemMan = sourcePlayer.getCharItemManager();
|
||||||
if (itemMan == null) {
|
|
||||||
|
if (itemMan == null)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
NPC npc = NPC.getFromCache(msg.getNPCID());
|
NPC npc = NPC.getFromCache(msg.getNPCID());
|
||||||
if (npc == null) {
|
|
||||||
|
if (npc == null)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
Item gold = itemMan.getGoldInventory();
|
Item gold = itemMan.getGoldInventory();
|
||||||
if (gold == null) {
|
|
||||||
|
if (gold == null)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
Item buy = null;
|
Item buy = null;
|
||||||
|
|
||||||
if (msg.getItemType() == GameObjectType.MobEquipment.ordinal()) {
|
if (msg.getItemType() == GameObjectType.MobEquipment.ordinal()) {
|
||||||
ArrayList<MobEquipment> sellInventory = npc.getContract().getSellInventory();
|
ArrayList<MobEquipment> sellInventory = npc.getContract().getSellInventory();
|
||||||
if (sellInventory == null) {
|
if (sellInventory == null)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
for (MobEquipment me : sellInventory) {
|
for (MobEquipment me : sellInventory) {
|
||||||
if (me.getObjectUUID() == msg.getItemID()) {
|
if (me.getObjectUUID() == msg.getItemID()) {
|
||||||
ItemBase ib = me.getItemBase();
|
ItemBase ib = me.getItemBase();
|
||||||
if (ib == null) {
|
if (ib == null)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
//test room available for item
|
//test room available for item
|
||||||
if (!itemMan.hasRoomInventory(ib.getWeight())) {
|
if (!itemMan.hasRoomInventory(ib.getWeight()))
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
int cost = me.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 = npc.getSellPercent(sourcePlayer) - bargain;
|
float profit = npc.getSellPercent(sourcePlayer) - bargain;
|
||||||
if(me.getItemBase().getType().equals(ItemType.POTION))
|
|
||||||
profit -= 1.0f;
|
|
||||||
if (profit < 1)
|
if (profit < 1)
|
||||||
profit = 1;
|
profit = 1;
|
||||||
|
|
||||||
|
|
||||||
cost *= profit;
|
cost *= profit;
|
||||||
if(npc.getContractID() == 1502041)
|
|
||||||
cost = 2;
|
|
||||||
if (gold.getNumOfItems() - cost < 0) {
|
if (gold.getNumOfItems() - cost < 0) {
|
||||||
//dont' have enough goldItem exit!
|
//dont' have enough goldItem exit!
|
||||||
// chatMan.chatSystemInfo(pc, "" + "You dont have enough gold.");
|
// chatMan.chatSystemInfo(pc, "" + "You dont have enough gold.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
|
||||||
|
|
||||||
if (b != null && b.getProtectionState().equals(ProtectionState.NPC))
|
if (b != null && b.getProtectionState().equals(ProtectionState.NPC))
|
||||||
b = null;
|
b = null;
|
||||||
int buildingDeposit = cost - me.getMagicValue();
|
int buildingDeposit = cost - me.getMagicValue();
|
||||||
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold() && !b.isOwnerIsNPC()) {
|
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold()) {
|
||||||
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
|
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
|
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
|
||||||
// chatMan.chatSystemInfo(pc, "" + "You Failed to buy the item.");
|
// chatMan.chatSystemInfo(pc, "" + "You Failed to buy the item.");
|
||||||
ChatManager.chatSystemError(sourcePlayer, "Failed To Buy Item");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(me.getItemBase().getType().equals(ItemType.RESOURCE) && npc.getContractID() == 900){
|
|
||||||
handleResourcePurchase(me,itemMan,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());
|
||||||
@@ -1570,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) {
|
||||||
@@ -1666,17 +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.getRepairCost() * npc.buyPercent));
|
int cost = (int) ((max - dur) * 80.1);
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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,34 +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 = 5;
|
if (rank != 0)
|
||||||
break;
|
rank = 1;
|
||||||
case 2:
|
int trains = 40 - (rank * 10);
|
||||||
trains = 10;
|
if (trains < 0)
|
||||||
break;
|
trains = 0;
|
||||||
case 3:
|
|
||||||
trains = 15;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
trains = 20;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
trains = 25;
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
trains = 30;
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
trains = 35;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(Objects.requireNonNull(shrineBuilding.getCity()).getTOL() != null && shrineBuilding.getCity().getTOL().getRank() == 8)
|
|
||||||
trains += 5;
|
|
||||||
|
|
||||||
|
//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);
|
||||||
@@ -437,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();
|
||||||
|
|||||||
@@ -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)) {
|
||||||
@@ -509,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);
|
||||||
|
|||||||
@@ -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,18 +89,11 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(runeID == 3040)
|
|
||||||
valid = true;
|
|
||||||
if(runeID == 2514 && raceID == 1999)
|
|
||||||
valid = true;
|
|
||||||
if(runeID == 3036 && raceID == 1999)
|
|
||||||
valid = true;
|
|
||||||
if(runeID == 3033 && raceID == 1999)
|
|
||||||
valid = true;
|
|
||||||
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) {
|
||||||
@@ -111,18 +105,11 @@ 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) {
|
||||||
@@ -134,23 +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 (!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();
|
||||||
@@ -164,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();
|
||||||
@@ -176,32 +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":
|
|
||||||
mod = 0;
|
|
||||||
}
|
|
||||||
if (mod > playerCharacter.getUnusedStatPoints()) {
|
if (mod > playerCharacter.getUnusedStatPoints()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -254,33 +226,14 @@ 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) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
switch (rb.getName()) {
|
|
||||||
case "Born of the Ethyri":
|
|
||||||
case "Born of the Taripontor":
|
|
||||||
case "Born of the Gwendannen":
|
|
||||||
case "Born of the Invorri":
|
|
||||||
case "Born of the Irydnu":
|
|
||||||
for (CharacterRune charRune : playerCharacter.getRunes()) {
|
|
||||||
RuneBase rb2 = charRune.getRuneBase();
|
|
||||||
switch (rb2.getName()) {
|
|
||||||
case "Born of the Ethyri":
|
|
||||||
case "Born of the Taripontor":
|
|
||||||
case "Born of the Gwendannen":
|
|
||||||
case "Born of the Invorri":
|
|
||||||
case "Born of the Irydnu":
|
|
||||||
ChatManager.chatSystemError(playerCharacter, "You Have Already Applied A Blood Rune");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//if discipline, check number applied
|
//if discipline, check number applied
|
||||||
if (isDiscipline(runeID)) {
|
if (isDiscipline(runeID)) {
|
||||||
//if(playerCharacter.getLevel() == 80)
|
|
||||||
discCount -= 1; // level 80 characters get an extra disc rune
|
|
||||||
if (playerCharacter.getLevel() < 70) {
|
if (playerCharacter.getLevel() < 70) {
|
||||||
if (discCount > 2) {
|
if (discCount > 2) {
|
||||||
return false;
|
return false;
|
||||||
@@ -291,6 +244,7 @@ public class ApplyRuneMsg extends ClientNetMsg {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//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());
|
||||||
@@ -304,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;
|
||||||
@@ -312,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();
|
||||||
@@ -341,32 +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":
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
@@ -497,7 +497,7 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
|
|||||||
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) {
|
if (building.getRank() == 8) {
|
||||||
writer.putInt(74856115); // Stone
|
writer.putInt(74856115); // Stone
|
||||||
@@ -514,7 +514,7 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
|
|||||||
|
|
||||||
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
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -96,11 +96,6 @@ public class VendorDialogMsg extends ClientNetMsg {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(npc.contractUUID == 1502040){ //enrollment officer
|
|
||||||
PlayerCharacter.unboxPlayer(playerCharacter);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Restrict disc trainers to only characters who have
|
// Restrict disc trainers to only characters who have
|
||||||
// tht disc applied.
|
// tht disc applied.
|
||||||
|
|
||||||
|
|||||||
@@ -1187,15 +1187,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 {
|
||||||
|
|
||||||
@@ -1259,19 +1254,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;
|
||||||
}
|
}
|
||||||
@@ -1306,19 +1293,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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -108,10 +108,8 @@ public class Blueprint {
|
|||||||
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,7 +167,11 @@ public class Blueprint {
|
|||||||
// based upon the building's current rank
|
// based upon the building's current rank
|
||||||
|
|
||||||
public static int getNpcMaintCost(int rank) {
|
public static int getNpcMaintCost(int rank) {
|
||||||
return 0;
|
int maintCost = Integer.MAX_VALUE;
|
||||||
|
|
||||||
|
maintCost = (9730 * rank) + 1890;
|
||||||
|
|
||||||
|
return maintCost;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getMaxRank() {
|
public int getMaxRank() {
|
||||||
@@ -179,8 +181,6 @@ public class Blueprint {
|
|||||||
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;
|
|
||||||
return maxSlots;
|
return maxSlots;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -313,7 +313,7 @@ public class Blueprint {
|
|||||||
|
|
||||||
// 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))
|
if (this.maxSlots <= 1)
|
||||||
return maxSlots;
|
return maxSlots;
|
||||||
|
|
||||||
if (this.maxRank == 1 && currentRank == 1)
|
if (this.maxRank == 1 && currentRank == 1)
|
||||||
@@ -327,20 +327,20 @@ public class Blueprint {
|
|||||||
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:
|
||||||
case 8:
|
|
||||||
availableSlots = 3;
|
availableSlots = 3;
|
||||||
break;
|
break;
|
||||||
|
case 8:
|
||||||
|
availableSlots = 1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
availableSlots = 0;
|
availableSlots = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(this.buildingGroup != null && this.buildingGroup.equals(BuildingGroup.TOL))
|
|
||||||
availableSlots += 1;
|
|
||||||
|
|
||||||
return availableSlots;
|
return availableSlots;
|
||||||
}
|
}
|
||||||
@@ -603,14 +603,26 @@ public class Blueprint {
|
|||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -780,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) {
|
||||||
|
|||||||
@@ -86,12 +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);
|
|
||||||
}
|
|
||||||
this.equipmentSet = rs.getInt("equipSetID");
|
this.equipmentSet = rs.getInt("equipSetID");
|
||||||
this.inventorySet = rs.getInt("inventorySet");
|
this.inventorySet = rs.getInt("inventorySet");
|
||||||
|
|
||||||
@@ -204,91 +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() * 2;
|
|
||||||
} else{
|
|
||||||
me.magicValue = 100000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -752,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -233,6 +233,7 @@ public class Item extends AbstractWorldObject {
|
|||||||
this.value = rs.getInt("item_value");
|
this.value = rs.getInt("item_value");
|
||||||
this.customName = rs.getString("item_name");
|
this.customName = rs.getString("item_name");
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void _serializeForClientMsg(Item item, ByteBufferWriter writer)
|
public static void _serializeForClientMsg(Item item, ByteBufferWriter writer)
|
||||||
@@ -302,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
|
||||||
@@ -608,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;
|
||||||
|
|
||||||
@@ -884,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() {
|
||||||
@@ -955,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1205,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;
|
||||||
|
|||||||
@@ -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) {
|
||||||
@@ -220,78 +223,18 @@ public class ItemBase {
|
|||||||
AnniverseryGifts.add(971008);
|
AnniverseryGifts.add(971008);
|
||||||
AnniverseryGifts.add(971009);
|
AnniverseryGifts.add(971009);
|
||||||
AnniverseryGifts.add(971010);
|
AnniverseryGifts.add(971010);
|
||||||
//AnniverseryGifts.add(5101000);
|
AnniverseryGifts.add(5101000);
|
||||||
//AnniverseryGifts.add(5101020);
|
AnniverseryGifts.add(5101020);
|
||||||
//AnniverseryGifts.add(5101100);
|
AnniverseryGifts.add(5101100);
|
||||||
//AnniverseryGifts.add(5101120);
|
AnniverseryGifts.add(5101120);
|
||||||
//AnniverseryGifts.add(5101040);
|
AnniverseryGifts.add(5101040);
|
||||||
//AnniverseryGifts.add(5101140);
|
AnniverseryGifts.add(5101140);
|
||||||
//AnniverseryGifts.add(5101060);
|
AnniverseryGifts.add(5101060);
|
||||||
//AnniverseryGifts.add(5101080);
|
AnniverseryGifts.add(5101080);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Getters
|
* Getters
|
||||||
*/
|
*/
|
||||||
@@ -429,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;
|
||||||
@@ -899,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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+77
-139
@@ -11,7 +11,10 @@ package engine.objects;
|
|||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.InterestManagement.WorldGrid;
|
import engine.InterestManagement.WorldGrid;
|
||||||
import engine.gameManager.*;
|
import engine.gameManager.BuildingManager;
|
||||||
|
import engine.gameManager.ChatManager;
|
||||||
|
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;
|
||||||
@@ -22,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;
|
||||||
@@ -51,13 +51,6 @@ 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<>();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ResultSet Constructor
|
* ResultSet Constructor
|
||||||
*/
|
*/
|
||||||
@@ -97,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) {
|
||||||
@@ -176,35 +161,49 @@ 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
|
||||||
writer.putString(mine.mineType.name);
|
writer.putString(mine.mineType.name);
|
||||||
//writer.putString(mine.zoneName + " " + mine.capSize + " Man ");
|
writer.putString(mine.zoneName);
|
||||||
writer.putString(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);
|
||||||
|
|
||||||
@@ -212,9 +211,6 @@ public class Mine extends AbstractGameObject {
|
|||||||
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) {
|
||||||
@@ -294,9 +290,26 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean guildUnderMineLimit(Guild playerGuild, int tolRank) {
|
||||||
|
|
||||||
|
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) {
|
||||||
if (!this.validForMine(resource))
|
if (!this.validForMine(resource))
|
||||||
return false;
|
return false;
|
||||||
@@ -365,16 +378,6 @@ public class Mine extends AbstractGameObject {
|
|||||||
Building building = BuildingManager.getBuildingFromCache(this.buildingID);
|
Building building = BuildingManager.getBuildingFromCache(this.buildingID);
|
||||||
if (building != null && !this.isActive)
|
if (building != null && !this.isActive)
|
||||||
building.isDeranking.compareAndSet(true, false);
|
building.isDeranking.compareAndSet(true, false);
|
||||||
|
|
||||||
if(!isAc){
|
|
||||||
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) {
|
||||||
@@ -535,106 +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;
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
amount = 6000000;
|
|
||||||
break;
|
|
||||||
case 20:
|
|
||||||
amount = 12000000;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(this.production.UUID == 7)
|
|
||||||
value = 1;
|
|
||||||
|
|
||||||
amount = amount / value;
|
//get Mine Building.
|
||||||
|
Building mineBuilding = BuildingManager.getBuilding(this.buildingID);
|
||||||
|
if (mineBuilding == null)
|
||||||
|
return this.production.baseProduction;
|
||||||
|
for (AbstractCharacter harvester : mineBuilding.getHirelings().keySet()) {
|
||||||
|
totalModded += baseModValue;
|
||||||
|
totalModded += rankModValue * harvester.getRank();
|
||||||
|
}
|
||||||
|
//add base production on top;
|
||||||
|
totalModded += baseProduction;
|
||||||
|
//skip distance check for expansion.
|
||||||
|
if (this.isExpansion())
|
||||||
|
return (int) totalModded;
|
||||||
|
|
||||||
return amount;
|
if (this.owningGuild.isEmptyGuild() == false) {
|
||||||
}
|
if (this.owningGuild.getOwnedCity() != null) {
|
||||||
public void onEnter() {
|
float distanceSquared = this.owningGuild.getOwnedCity().getLoc().distanceSquared2D(mineBuilding.getLoc());
|
||||||
|
|
||||||
Building tower = BuildingManager.getBuildingFromCache(this.buildingID);
|
if (distanceSquared > sqr(10000 * 3))
|
||||||
if(tower == null)
|
totalModded *= .25f;
|
||||||
return;
|
else if (distanceSquared > sqr(10000 * 2))
|
||||||
|
totalModded *= .50f;
|
||||||
// Gather current list of players within the zone bounds
|
else if (distanceSquared > sqr(10000))
|
||||||
|
totalModded *= .75f;
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,6 @@ import static engine.net.client.msg.ErrorPopupMsg.sendErrorPopup;
|
|||||||
|
|
||||||
public class Mob extends AbstractIntelligenceAgent {
|
public class Mob extends AbstractIntelligenceAgent {
|
||||||
|
|
||||||
public static ArrayList<Mob> discDroppers = new ArrayList<>();
|
|
||||||
private static final ReentrantReadWriteLock createLock = new ReentrantReadWriteLock();
|
private static final ReentrantReadWriteLock createLock = new ReentrantReadWriteLock();
|
||||||
private static final ConcurrentHashMap<Integer, Mob> mobMapByDBID = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
|
private static final ConcurrentHashMap<Integer, Mob> mobMapByDBID = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
|
||||||
// Variables NOT to be stored in db
|
// Variables NOT to be stored in db
|
||||||
@@ -575,11 +574,11 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
mob = new Mob(mobBase, guild, parent, level, owner, 0);
|
mob = new Mob(mobBase, guild, parent, level, owner, 0);
|
||||||
if (mob.mobBase == null)
|
if (mob.mobBase == null)
|
||||||
return null;
|
return null;
|
||||||
|
mob.runAfterLoad();
|
||||||
|
Vector3fImmutable loc = owner.getLoc();
|
||||||
DbManager.addToCache(mob);
|
DbManager.addToCache(mob);
|
||||||
mob.setPet(owner, true);
|
mob.setPet(owner, true);
|
||||||
mob.setWalkMode(false);
|
mob.setWalkMode(false);
|
||||||
mob.runAfterLoad();
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.error(e);
|
Logger.error(e);
|
||||||
@@ -1397,11 +1396,6 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
loadInventory();
|
loadInventory();
|
||||||
|
|
||||||
this.updateLocation();
|
this.updateLocation();
|
||||||
|
|
||||||
if(Mob.discDroppers.contains(this)){
|
|
||||||
this.setLevel((short)65);
|
|
||||||
this.setResists(new Resists("Dropper"));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void despawn() {
|
public void despawn() {
|
||||||
@@ -1472,7 +1466,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
Logger.error(e.getMessage());
|
Logger.error(e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
//Resists.calculateResists(this);
|
Resists.calculateResists(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void calculateMaxHealthManaStamina() {
|
public void calculateMaxHealthManaStamina() {
|
||||||
@@ -2269,9 +2263,5 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static void AddDiscDropper(Mob mob){
|
|
||||||
discDroppers.add(mob);
|
|
||||||
mob.setLevel((short)65);
|
|
||||||
mob.setResists(new Resists("Dropper"));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ import engine.job.JobScheduler;
|
|||||||
import engine.jobs.DeferredPowerJob;
|
import engine.jobs.DeferredPowerJob;
|
||||||
import engine.jobs.FinishSpireEffectJob;
|
import engine.jobs.FinishSpireEffectJob;
|
||||||
import engine.jobs.NoTimeJob;
|
import engine.jobs.NoTimeJob;
|
||||||
import engine.math.Bounds;
|
|
||||||
import engine.math.FastMath;
|
import engine.math.FastMath;
|
||||||
import engine.math.Vector3fImmutable;
|
import engine.math.Vector3fImmutable;
|
||||||
import engine.net.ByteBufferWriter;
|
import engine.net.ByteBufferWriter;
|
||||||
@@ -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
|
||||||
*/
|
*/
|
||||||
@@ -273,9 +268,6 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
|
|
||||||
this.hash = rs.getString("hash");
|
this.hash = rs.getString("hash");
|
||||||
|
|
||||||
|
|
||||||
// For debugging skills
|
|
||||||
// CharacterSkill.printSkills(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Building getUpdatedBindBuilding(PlayerCharacter player) {
|
public static Building getUpdatedBindBuilding(PlayerCharacter player) {
|
||||||
@@ -4569,9 +4561,6 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
|
|
||||||
this.charItemManager = new CharacterItemManager(this);
|
this.charItemManager = new CharacterItemManager(this);
|
||||||
|
|
||||||
Bounds playerBounds = Bounds.borrow();
|
|
||||||
playerBounds.setBounds(this.getLoc());
|
|
||||||
this.setBounds(playerBounds);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -4815,17 +4804,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.isBoxed && !this.containsEffect(1672601862)) {
|
|
||||||
PowersManager.applyPower(this, this, Vector3fImmutable.ZERO, 1672601862, 40, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.error(e);
|
Logger.error(e);
|
||||||
@@ -4834,44 +4812,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){
|
|
||||||
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() {
|
||||||
|
|
||||||
@@ -5415,6 +5356,7 @@ public class PlayerCharacter extends AbstractCharacter {
|
|||||||
moveToMsg.setSourceType(GameObjectType.PlayerCharacter.ordinal());
|
moveToMsg.setSourceType(GameObjectType.PlayerCharacter.ordinal());
|
||||||
moveToMsg.setSourceID(this.getObjectUUID());
|
moveToMsg.setSourceID(this.getObjectUUID());
|
||||||
|
|
||||||
|
|
||||||
Dispatch dispatch = Dispatch.borrow(this, moveToMsg);
|
Dispatch dispatch = Dispatch.borrow(this, moveToMsg);
|
||||||
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
|
||||||
|
|
||||||
|
|||||||
@@ -46,9 +46,6 @@ public class Resists {
|
|||||||
case "Mine":
|
case "Mine":
|
||||||
setMineResists();
|
setMineResists();
|
||||||
break;
|
break;
|
||||||
case "Dropper":
|
|
||||||
setDropperResists();
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
setGenericResists();
|
setGenericResists();
|
||||||
break;
|
break;
|
||||||
@@ -234,24 +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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create generic resists
|
* Create generic resists
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ public class Zone extends AbstractGameObject {
|
|||||||
if (hash == null)
|
if (hash == null)
|
||||||
setHash();
|
setHash();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void serializeForClientMsg(Zone zone, ByteBufferWriter writer) {
|
public static void serializeForClientMsg(Zone zone, ByteBufferWriter writer) {
|
||||||
@@ -112,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);
|
writer.putFloat(Enum.CityBoundsType.ZONE.extents);
|
||||||
writer.putFloat(Enum.CityBoundsType.GRID.extents);
|
writer.putFloat(Enum.CityBoundsType.ZONE.extents);
|
||||||
} else
|
} else
|
||||||
writer.put((byte) 0); // Player City - False
|
writer.put((byte) 0); // Player City - False
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,10 @@ import engine.net.client.msg.chat.ChatSystemMsg;
|
|||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import engine.server.MBServerStatics;
|
import engine.server.MBServerStatics;
|
||||||
import engine.util.ThreadUtils;
|
import engine.util.ThreadUtils;
|
||||||
import engine.workthreads.*;
|
import engine.workthreads.DisconnectTrashTask;
|
||||||
|
import engine.workthreads.HourlyJobThread;
|
||||||
|
import engine.workthreads.PurgeOprhans;
|
||||||
|
import engine.workthreads.WarehousePushThread;
|
||||||
import org.pmw.tinylog.Configurator;
|
import org.pmw.tinylog.Configurator;
|
||||||
import org.pmw.tinylog.Level;
|
import org.pmw.tinylog.Level;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
@@ -198,7 +201,6 @@ public class WorldServer {
|
|||||||
LocalDateTime nextPopulationFileTime = LocalDateTime.now();
|
LocalDateTime nextPopulationFileTime = LocalDateTime.now();
|
||||||
LocalDateTime nextFlashTrashCheckTime = LocalDateTime.now();
|
LocalDateTime nextFlashTrashCheckTime = LocalDateTime.now();
|
||||||
LocalDateTime nextHourlyJobTime = LocalDateTime.now().withMinute(0).withSecond(0).plusHours(1);
|
LocalDateTime nextHourlyJobTime = LocalDateTime.now().withMinute(0).withSecond(0).plusHours(1);
|
||||||
LocalDateTime nextHalfHourlyJobTime = LocalDateTime.now().withMinute(0).withSecond(0);
|
|
||||||
LocalDateTime nextWareHousePushTime = LocalDateTime.now();
|
LocalDateTime nextWareHousePushTime = LocalDateTime.now();
|
||||||
|
|
||||||
// Begin execution of main game loop
|
// Begin execution of main game loop
|
||||||
@@ -230,13 +232,6 @@ public class WorldServer {
|
|||||||
nextHourlyJobTime = LocalDateTime.now().withMinute(0).withSecond(0).plusHours(1);
|
nextHourlyJobTime = LocalDateTime.now().withMinute(0).withSecond(0).plusHours(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LocalDateTime.now().isAfter(nextHalfHourlyJobTime)) {
|
|
||||||
Thread halfHourlyJobThread = new Thread(new HalfHourlyJobThread());
|
|
||||||
halfHourlyJobThread.setName("halfHourlyJob");
|
|
||||||
halfHourlyJobThread.start();
|
|
||||||
nextHalfHourlyJobTime = nextHalfHourlyJobTime.plusMinutes(30);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (LocalDateTime.now().isAfter(nextWareHousePushTime)) {
|
if (LocalDateTime.now().isAfter(nextWareHousePushTime)) {
|
||||||
Thread warehousePushThread = new Thread(new WarehousePushThread());
|
Thread warehousePushThread = new Thread(new WarehousePushThread());
|
||||||
warehousePushThread.setName("warehousePush");
|
warehousePushThread.setName("warehousePush");
|
||||||
@@ -440,6 +435,9 @@ public class WorldServer {
|
|||||||
Logger.info("Loading Max Skills for Trainers");
|
Logger.info("Loading Max Skills for Trainers");
|
||||||
DbManager.SkillsBaseQueries.LOAD_ALL_MAX_SKILLS_FOR_CONTRACT();
|
DbManager.SkillsBaseQueries.LOAD_ALL_MAX_SKILLS_FOR_CONTRACT();
|
||||||
|
|
||||||
|
//pick a startup Hotzone
|
||||||
|
ZoneManager.generateAndSetRandomHotzone();
|
||||||
|
|
||||||
Logger.info("Loading All Players from database to Server Cache");
|
Logger.info("Loading All Players from database to Server Cache");
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
|
|
||||||
@@ -490,8 +488,8 @@ public class WorldServer {
|
|||||||
MobRespawnThread.startRespawnThread();
|
MobRespawnThread.startRespawnThread();
|
||||||
|
|
||||||
// Run maintenance
|
// Run maintenance
|
||||||
//moved this to hourly job thread to sustain no reboot system
|
|
||||||
//MaintenanceManager.dailyMaintenance();
|
MaintenanceManager.dailyMaintenance();
|
||||||
|
|
||||||
Logger.info("Starting Orphan Item Purge");
|
Logger.info("Starting Orphan Item Purge");
|
||||||
PurgeOprhans.startPurgeThread();
|
PurgeOprhans.startPurgeThread();
|
||||||
@@ -499,7 +497,7 @@ public class WorldServer {
|
|||||||
// Open/Close mines for the current window
|
// Open/Close mines for the current window
|
||||||
|
|
||||||
Logger.info("Processing mine window.");
|
Logger.info("Processing mine window.");
|
||||||
HalfHourlyJobThread.processMineWindow();
|
HourlyJobThread.processMineWindow();
|
||||||
|
|
||||||
// Calculate bootstrap time and rest boot time to current time.
|
// Calculate bootstrap time and rest boot time to current time.
|
||||||
|
|
||||||
|
|||||||
@@ -1,166 +0,0 @@
|
|||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.workthreads;
|
|
||||||
|
|
||||||
import engine.Enum;
|
|
||||||
import engine.InterestManagement.WorldGrid;
|
|
||||||
import engine.db.archive.DataWarehouse;
|
|
||||||
import engine.db.archive.MineRecord;
|
|
||||||
import engine.gameManager.*;
|
|
||||||
import engine.net.DispatchMessage;
|
|
||||||
import engine.net.MessageDispatcher;
|
|
||||||
import engine.net.client.msg.chat.ChatSystemMsg;
|
|
||||||
import engine.objects.*;
|
|
||||||
import engine.server.world.WorldServer;
|
|
||||||
import org.pmw.tinylog.Logger;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
|
|
||||||
import static engine.server.MBServerStatics.MINE_LATE_WINDOW;
|
|
||||||
|
|
||||||
public class HalfHourlyJobThread implements Runnable {
|
|
||||||
|
|
||||||
public HalfHourlyJobThread() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static void processMineWindow() {
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
ArrayList<Mine> mines = Mine.getMines();
|
|
||||||
|
|
||||||
for (Mine mine : mines) {
|
|
||||||
try {
|
|
||||||
|
|
||||||
//handle mines opening on server reboot weird time interval
|
|
||||||
if(LocalDateTime.now().isAfter(LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute))) {
|
|
||||||
if (LocalDateTime.now().isBefore(LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute).plusMinutes(30))) {
|
|
||||||
HalfHourlyJobThread.mineWindowOpen(mine);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// set to the current mine window.
|
|
||||||
|
|
||||||
if (mine.openHour == LocalDateTime.now().getHour() && mine.openMinute == LocalDateTime.now().getMinute() && !mine.wasClaimed) {
|
|
||||||
HalfHourlyJobThread.mineWindowOpen(mine);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close the mine if it reaches this far
|
|
||||||
LocalDateTime openTime = LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute);
|
|
||||||
if(LocalDateTime.now().plusMinutes(1).isAfter(openTime.plusMinutes(30)))
|
|
||||||
mineWindowClose(mine);
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
Logger.error("mineID: " + mine.getObjectUUID(), e.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
Logger.error(e.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void mineWindowOpen(Mine mine) {
|
|
||||||
|
|
||||||
mine.setActive(true);
|
|
||||||
ChatManager.chatSystemChannel(mine.getZoneName() + "'s Mine is now Active!");
|
|
||||||
Logger.info(mine.getZoneName() + "'s Mine is now Active!");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean mineWindowClose(Mine mine) {
|
|
||||||
|
|
||||||
// No need to end the window of a mine which never opened.
|
|
||||||
|
|
||||||
if (mine.isActive == false)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
Building mineBuilding = BuildingManager.getBuildingFromCache(mine.getBuildingID());
|
|
||||||
|
|
||||||
if (mineBuilding == null) {
|
|
||||||
Logger.debug("Null mine building for Mine " + mine.getObjectUUID() + " Building " + mine.getBuildingID());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mine building still stands; nothing to do.
|
|
||||||
// We can early exit here.
|
|
||||||
|
|
||||||
if (mineBuilding.getRank() > 0) {
|
|
||||||
mine.setActive(false);
|
|
||||||
mine.lastClaimer = null;
|
|
||||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mine.guildName + " has defended the mine in " + mine.getParentZone().getParent().getName() + ". The mine is no longer active.");
|
|
||||||
chatMsg.setMessageType(10);
|
|
||||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
|
||||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This mine does not have a valid claimer
|
|
||||||
// we will therefore set it to errant
|
|
||||||
// and keep the window open.
|
|
||||||
|
|
||||||
if (!Mine.validateClaimer(mine.lastClaimer)) {
|
|
||||||
mine.lastClaimer = null;
|
|
||||||
mine.updateGuildOwner(null);
|
|
||||||
mine.setActive(true);
|
|
||||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mine.getParentZone().getParent().getName() + " Was not claimed, the battle rages on!");
|
|
||||||
chatMsg.setMessageType(10);
|
|
||||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
|
||||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Update ownership to map
|
|
||||||
|
|
||||||
mine.guildName = mine.getOwningGuild().getName();
|
|
||||||
mine.guildTag = mine.getOwningGuild().getGuildTag();
|
|
||||||
Guild nation = mine.getOwningGuild().getNation();
|
|
||||||
mine.nationName = nation.getName();
|
|
||||||
mine.nationTag = nation.getGuildTag();
|
|
||||||
|
|
||||||
mineBuilding.rebuildMine();
|
|
||||||
WorldGrid.updateObject(mineBuilding);
|
|
||||||
|
|
||||||
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mine.lastClaimer.getName() + " has claimed the mine in " + mine.getParentZone().getParent().getName() + " for " + mine.getOwningGuild().getName() + ". The mine is no longer active.");
|
|
||||||
chatMsg.setMessageType(10);
|
|
||||||
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
|
||||||
DispatchMessage.dispatchMsgToAll(chatMsg);
|
|
||||||
|
|
||||||
// Warehouse this claim event
|
|
||||||
|
|
||||||
MineRecord mineRecord = MineRecord.borrow(mine, mine.lastClaimer, Enum.RecordEventType.CAPTURE);
|
|
||||||
DataWarehouse.pushToWarehouse(mineRecord);
|
|
||||||
|
|
||||||
mineBuilding.setRank(mineBuilding.getRank());
|
|
||||||
mine.lastClaimer = null;
|
|
||||||
mine.setActive(false);
|
|
||||||
mine.wasClaimed = true;
|
|
||||||
for(Integer id : mine._playerMemory){
|
|
||||||
PlayerCharacter pc = PlayerCharacter.getFromCache(id);
|
|
||||||
if(pc != null)
|
|
||||||
pc.ZergMultiplier = 1.0f;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
|
|
||||||
Logger.info("Half-Hourly job is now running.");
|
|
||||||
|
|
||||||
// Open or Close mines for the current mine window.
|
|
||||||
|
|
||||||
processMineWindow();
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -10,8 +10,13 @@
|
|||||||
package engine.workthreads;
|
package engine.workthreads;
|
||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
|
import engine.InterestManagement.WorldGrid;
|
||||||
|
import engine.db.archive.DataWarehouse;
|
||||||
|
import engine.db.archive.MineRecord;
|
||||||
import engine.gameManager.*;
|
import engine.gameManager.*;
|
||||||
|
import engine.net.DispatchMessage;
|
||||||
import engine.net.MessageDispatcher;
|
import engine.net.MessageDispatcher;
|
||||||
|
import engine.net.client.msg.chat.ChatSystemMsg;
|
||||||
import engine.objects.*;
|
import engine.objects.*;
|
||||||
import engine.server.world.WorldServer;
|
import engine.server.world.WorldServer;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
@@ -20,18 +25,240 @@ import java.time.LocalDateTime;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
import static engine.server.MBServerStatics.MINE_LATE_WINDOW;
|
||||||
|
|
||||||
public class HourlyJobThread implements Runnable {
|
public class HourlyJobThread implements Runnable {
|
||||||
|
|
||||||
public HourlyJobThread() {
|
public HourlyJobThread() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void decayShrines() {
|
||||||
|
ArrayList<Shrine> shrineList = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Shrine shrine : Shrine.shrinesByBuildingUUID.values()) {
|
||||||
|
try {
|
||||||
|
Building shrineBuilding = (Building) DbManager.getObject(Enum.GameObjectType.Building, shrine.getBuildingID());
|
||||||
|
|
||||||
|
if (shrineBuilding == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
|
||||||
|
if (shrineBuilding.getOwner().equals(shrineBuilding.getCity().getOwner()) == false)
|
||||||
|
shrineBuilding.claim(shrineBuilding.getCity().getOwner());
|
||||||
|
} catch (Exception e) {
|
||||||
|
Logger.info("Shrine " + shrine.getBuildingID() + " Error " + e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Grab list of top two shrines of each type
|
||||||
|
|
||||||
|
for (Shrine shrine : Shrine.shrinesByBuildingUUID.values()) {
|
||||||
|
|
||||||
|
if (shrine.getRank() == 0 || shrine.getRank() == 1)
|
||||||
|
shrineList.add(shrine);
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger.info("Decaying " + shrineList.size() + " shrines...");
|
||||||
|
|
||||||
|
// Top 2 shrines decay by 10% a day
|
||||||
|
|
||||||
|
for (Shrine shrine : shrineList) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
shrine.decay();
|
||||||
|
} catch (Exception e) {
|
||||||
|
Logger.info("Shrine " + shrine.getBuildingID() + " Error " + e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void processMineWindow() {
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
ArrayList<Mine> mines = Mine.getMines();
|
||||||
|
|
||||||
|
for (Mine mine : mines) {
|
||||||
|
if (LocalDateTime.now().getHour() == 1400) {
|
||||||
|
mine.wasClaimed = false;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
|
||||||
|
// Open Errant Mines
|
||||||
|
|
||||||
|
if (mine.getOwningGuild().isEmptyGuild()) {
|
||||||
|
HourlyJobThread.mineWindowOpen(mine);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open Mines owned by nations having their WOO
|
||||||
|
// set to the current mine window.
|
||||||
|
|
||||||
|
if (mine.getOwningGuild().getNation().getMineTime() ==
|
||||||
|
LocalDateTime.now().getHour() && mine.wasClaimed == false) {
|
||||||
|
HourlyJobThread.mineWindowOpen(mine);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close the mine if it reaches this far
|
||||||
|
|
||||||
|
mineWindowClose(mine);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
Logger.error("mineID: " + mine.getObjectUUID(), e.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
Logger.error(e.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void mineWindowOpen(Mine mine) {
|
||||||
|
|
||||||
|
mine.setActive(true);
|
||||||
|
ChatManager.chatSystemChannel(mine.getZoneName() + "'s Mine is now Active!");
|
||||||
|
Logger.info(mine.getZoneName() + "'s Mine is now Active!");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean mineWindowClose(Mine mine) {
|
||||||
|
|
||||||
|
// No need to end the window of a mine which never opened.
|
||||||
|
|
||||||
|
if (mine.isActive == false)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Building mineBuilding = BuildingManager.getBuildingFromCache(mine.getBuildingID());
|
||||||
|
|
||||||
|
if (mineBuilding == null) {
|
||||||
|
Logger.debug("Null mine building for Mine " + mine.getObjectUUID() + " Building " + mine.getBuildingID());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mine building still stands; nothing to do.
|
||||||
|
// We can early exit here.
|
||||||
|
|
||||||
|
if (mineBuilding.getRank() > 0) {
|
||||||
|
mine.setActive(false);
|
||||||
|
mine.lastClaimer = null;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This mine does not have a valid claimer
|
||||||
|
// we will therefore set it to errant
|
||||||
|
// and keep the window open.
|
||||||
|
|
||||||
|
if (!Mine.validateClaimer(mine.lastClaimer)) {
|
||||||
|
mine.lastClaimer = null;
|
||||||
|
mine.updateGuildOwner(null);
|
||||||
|
mine.setActive(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Update ownership to map
|
||||||
|
|
||||||
|
mine.guildName = mine.getOwningGuild().getName();
|
||||||
|
mine.guildTag = mine.getOwningGuild().getGuildTag();
|
||||||
|
Guild nation = mine.getOwningGuild().getNation();
|
||||||
|
mine.nationName = nation.getName();
|
||||||
|
mine.nationTag = nation.getGuildTag();
|
||||||
|
|
||||||
|
mineBuilding.rebuildMine();
|
||||||
|
WorldGrid.updateObject(mineBuilding);
|
||||||
|
|
||||||
|
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mine.lastClaimer.getName() + " has claimed the mine in " + mine.getParentZone().getParent().getName() + " for " + mine.getOwningGuild().getName() + ". The mine is no longer active.");
|
||||||
|
chatMsg.setMessageType(10);
|
||||||
|
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
|
||||||
|
DispatchMessage.dispatchMsgToAll(chatMsg);
|
||||||
|
|
||||||
|
// Warehouse this claim event
|
||||||
|
|
||||||
|
MineRecord mineRecord = MineRecord.borrow(mine, mine.lastClaimer, Enum.RecordEventType.CAPTURE);
|
||||||
|
DataWarehouse.pushToWarehouse(mineRecord);
|
||||||
|
|
||||||
|
mineBuilding.setRank(mineBuilding.getRank());
|
||||||
|
mine.lastClaimer = null;
|
||||||
|
mine.setActive(false);
|
||||||
|
mine.wasClaimed = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
||||||
// *** REFACTOR: TRY TRY TRY TRY {{{{{{{{{{{ OMG
|
// *** REFACTOR: TRY TRY TRY TRY {{{{{{{{{{{ OMG
|
||||||
|
|
||||||
Logger.info("Hourly job is now running.");
|
Logger.info("Hourly job is now running.");
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
// Use the same hotZone this hour up and until
|
||||||
|
// the HotZone_Duration from the ConfigManager
|
||||||
|
|
||||||
|
if (ZoneManager.hotZone == null)
|
||||||
|
ZoneManager.generateAndSetRandomHotzone();
|
||||||
|
else
|
||||||
|
ZoneManager.hotZoneCycle = ZoneManager.hotZoneCycle + 1;
|
||||||
|
|
||||||
|
if (ZoneManager.hotZoneCycle > Integer.parseInt(ConfigManager.MB_HOTZONE_DURATION.getValue()))
|
||||||
|
ZoneManager.generateAndSetRandomHotzone();
|
||||||
|
|
||||||
|
if (ZoneManager.hotZone == null) {
|
||||||
|
Logger.error("Null HotZone returned from ZoneManager");
|
||||||
|
} else {
|
||||||
|
Logger.info("HotZone switched to: " + ZoneManager.hotZone.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
Logger.error(e.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open or Close mines for the current mine window.
|
||||||
|
|
||||||
|
processMineWindow();
|
||||||
|
|
||||||
|
// Deposit mine resources to Guilds
|
||||||
|
|
||||||
|
for (Mine mine : Mine.getMines()) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
mine.depositMineResources();
|
||||||
|
} catch (Exception e) {
|
||||||
|
Logger.info(e.getMessage() + " for Mine " + mine.getObjectUUID());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset time-gated access to WOO slider.
|
||||||
|
// *** Do this after the mines open/close!
|
||||||
|
|
||||||
|
if (LocalDateTime.now().getHour() == MINE_LATE_WINDOW) {
|
||||||
|
Guild guild;
|
||||||
|
|
||||||
|
for (AbstractGameObject dbObject : DbManager.getList(Enum.GameObjectType.Guild)) {
|
||||||
|
guild = (Guild) dbObject;
|
||||||
|
|
||||||
|
if (guild != null)
|
||||||
|
guild.wooWasModified = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mines can only be claimed once per cycle.
|
||||||
|
// This will reset at 1am after the last mine
|
||||||
|
// window closes.
|
||||||
|
|
||||||
|
if (LocalDateTime.now().getHour() == MINE_LATE_WINDOW + 1) {
|
||||||
|
|
||||||
|
for (Mine mine : Mine.getMines()) {
|
||||||
|
|
||||||
|
if (mine.wasClaimed == true)
|
||||||
|
mine.wasClaimed = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decay Shrines at midnight every day
|
||||||
|
|
||||||
|
if (LocalDateTime.now().getHour() == MINE_LATE_WINDOW)
|
||||||
|
decayShrines();
|
||||||
|
|
||||||
// Update city population values
|
// Update city population values
|
||||||
|
|
||||||
ConcurrentHashMap<Integer, AbstractGameObject> map = DbManager.getMap(Enum.GameObjectType.City);
|
ConcurrentHashMap<Integer, AbstractGameObject> map = DbManager.getMap(Enum.GameObjectType.City);
|
||||||
@@ -53,36 +280,6 @@ public class HourlyJobThread implements Runnable {
|
|||||||
Logger.error("missing city map");
|
Logger.error("missing city map");
|
||||||
}
|
}
|
||||||
|
|
||||||
//run maintenance every day at 2 am
|
|
||||||
if(LocalDateTime.now().getHour() == 2) {
|
|
||||||
MaintenanceManager.dailyMaintenance();
|
|
||||||
|
|
||||||
//produce mine resources once a day
|
|
||||||
for (Mine mine : Mine.getMines()) {
|
|
||||||
try {
|
|
||||||
mine.depositMineResources();
|
|
||||||
} catch (Exception e) {
|
|
||||||
Logger.info(e.getMessage() + " for Mine " + mine.getObjectUUID());
|
|
||||||
}
|
|
||||||
mine.wasClaimed = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(LocalDateTime.now().getHour()){
|
|
||||||
case 3:
|
|
||||||
case 6:
|
|
||||||
case 9:
|
|
||||||
case 12:
|
|
||||||
case 15:
|
|
||||||
case 18:
|
|
||||||
case 21:
|
|
||||||
case 0:
|
|
||||||
for(Mob mob : Mob.discDroppers)
|
|
||||||
if(!mob.isAlive())
|
|
||||||
Zone.respawnQue.add(mob);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Log metrics to console
|
// Log metrics to console
|
||||||
Logger.info(WorldServer.getUptimeString());
|
Logger.info(WorldServer.getUptimeString());
|
||||||
Logger.info(SimulationManager.getPopulationString());
|
Logger.info(SimulationManager.getPopulationString());
|
||||||
|
|||||||
Reference in New Issue
Block a user