Compare commits

..

6 Commits

20 changed files with 289 additions and 323 deletions
+1 -1
View File
@@ -798,7 +798,7 @@ public enum BuildingManager {
// Attempt to write to database or delete the building // Attempt to write to database or delete the building
// if we are destroying it. // if we are destroying it.
if (rank < 0) if (rank == -1)
success = DbManager.BuildingQueries.DELETE_FROM_DATABASE(building); success = DbManager.BuildingQueries.DELETE_FROM_DATABASE(building);
else else
success = DbManager.BuildingQueries.updateBuildingRank(building, rank); success = DbManager.BuildingQueries.updateBuildingRank(building, rank);
-10
View File
@@ -11,9 +11,6 @@ package engine.gameManager;
import engine.mbEnums; import engine.mbEnums;
import engine.server.login.LoginServer; import engine.server.login.LoginServer;
import engine.server.world.WorldServer; import engine.server.world.WorldServer;
import engine.wpak.EffectsParser;
import engine.wpak.PowerActionParser;
import engine.wpak.PowersParser;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.io.BufferedReader; import java.io.BufferedReader;
@@ -167,13 +164,6 @@ public enum ConfigManager {
Logger.info("Compiling regex"); Logger.info("Compiling regex");
regex.put(MB_LOGIN_FNAME_REGEX, Pattern.compile(MB_LOGIN_FNAME_REGEX.getValue())); regex.put(MB_LOGIN_FNAME_REGEX, Pattern.compile(MB_LOGIN_FNAME_REGEX.getValue()));
Logger.info("Loading WPAK data");
//EffectsParser.parseWpakFile();
//PowersParser.parseWpakFile();
//PowerActionParser.parseWpakFile();
return true; return true;
} }
+5 -29
View File
@@ -31,10 +31,6 @@ import engine.objects.*;
import engine.powers.*; import engine.powers.*;
import engine.powers.poweractions.AbstractPowerAction; import engine.powers.poweractions.AbstractPowerAction;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import engine.wpak.EffectsParser;
import engine.wpak.PowerActionParser;
import engine.wpak.PowersParser;
import engine.wpak.data.Effect;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.util.ArrayList; import java.util.ArrayList;
@@ -116,30 +112,10 @@ public enum PowersManager {
return powerEntries; return powerEntries;
} }
public static void InitializeEffects(){
// Add EffectsBase
ArrayList<EffectsBase> effectList = new ArrayList<>();
for (Effect entry : EffectsParser.effect_data.values()) {
EffectsBase effectBase = new EffectsBase(entry);
effectList.add(effectBase);
PowersManager.effectsBaseByToken.put(effectBase.getToken(), effectBase);
PowersManager.effectsBaseByIDString.put(effectBase.getIDString(), effectBase);
}
// Add Fail Conditions
EffectsBase.getFailConditions(PowersManager.effectsBaseByIDString);
}
// This pre-loads all powers and effects // This pre-loads all powers and effects
public static void InitializePowers() { public static void InitializePowers() {
EffectsParser.parseWpakFile(); // Add EffectsBase
PowersParser.parseWpakFile();
PowerActionParser.parseWpakFile();
//InitializeEffects();
ArrayList<EffectsBase> ebList = dbEffectsBaseHandler.getAllEffectsBase(); ArrayList<EffectsBase> ebList = dbEffectsBaseHandler.getAllEffectsBase();
for (EffectsBase eb : ebList) { for (EffectsBase eb : ebList) {
@@ -981,7 +957,7 @@ public enum PowersManager {
// if (!stackType.equals("IgnoreStack")) { // if (!stackType.equals("IgnoreStack")) {
if (target.getEffects().containsKey(stackType)) { if (target.getEffects().containsKey(stackType)) {
// remove any existing power that overrides // remove any existing power that overrides
engine.objects.Effect ef = target.getEffects().get(stackType); Effect ef = target.getEffects().get(stackType);
AbstractEffectJob effect = null; AbstractEffectJob effect = null;
if (ef != null) { if (ef != null) {
JobContainer jc = ef.getJobContainer(); JobContainer jc = ef.getJobContainer();
@@ -1153,7 +1129,7 @@ public enum PowersManager {
// if (!stackType.equals("IgnoreStack")) { // if (!stackType.equals("IgnoreStack")) {
if (target.getEffects().containsKey(stackType)) { if (target.getEffects().containsKey(stackType)) {
// remove any existing power that overrides // remove any existing power that overrides
engine.objects.Effect ef = target.getEffects().get(stackType); Effect ef = target.getEffects().get(stackType);
AbstractEffectJob effect = null; AbstractEffectJob effect = null;
if (ef != null) { if (ef != null) {
JobContainer jc = ef.getJobContainer(); JobContainer jc = ef.getJobContainer();
@@ -1467,7 +1443,7 @@ public enum PowersManager {
stackType = (stackType.equals("IgnoreStack")) ? Integer.toString(ab.getUUID()) : stackType; stackType = (stackType.equals("IgnoreStack")) ? Integer.toString(ab.getUUID()) : stackType;
if (target.getEffects().containsKey(stackType)) { if (target.getEffects().containsKey(stackType)) {
// remove any existing power that overrides // remove any existing power that overrides
engine.objects.Effect ef = target.getEffects().get(stackType); Effect ef = target.getEffects().get(stackType);
AbstractEffectJob effect = null; AbstractEffectJob effect = null;
if (ef != null) { if (ef != null) {
JobContainer jc = ef.getJobContainer(); JobContainer jc = ef.getJobContainer();
@@ -1914,7 +1890,7 @@ public enum PowersManager {
stackType = (stackType.equals("IgnoreStack")) ? Integer stackType = (stackType.equals("IgnoreStack")) ? Integer
.toString(toRemove.getUUID()) : stackType; .toString(toRemove.getUUID()) : stackType;
if (fromChant) { if (fromChant) {
engine.objects.Effect eff = awo.getEffects().get(stackType); Effect eff = awo.getEffects().get(stackType);
if (eff != null) if (eff != null)
eff.cancelJob(true); eff.cancelJob(true);
} else } else
-57
View File
@@ -3022,62 +3022,5 @@ public class mbEnums {
PREFIX, PREFIX,
SUFFIX; SUFFIX;
} }
public enum PowerType {
None,
SPELL,
SKILL;
}
public enum CostType {
NONE,
HEALTH,
MANA,
STAMINA;
}
public enum AreaType {
NONE,
SPHERE,
POINTBLANK,
LINE,
CONE,
WALL;
}
public enum ExcludeType {
NONE,
CASTER,
GROUP,
GUILD,
NATION,
PLAYERS,
ALLBUTGROUP,
ALLBUTPETS;
}
public enum CastingModeType {
NONE,
COMBAT,
NONCOMBAT,
BOTH;
}
public enum TargetSelectType {
NONE,
CLICK,
GROUP,
GUILD,
NEARBYMOBS,
NAME;
}
public enum CategoryToPowerType {
None,
GreaterThanOrEqualTo,
GreaterThan,
Always
}
} }
+1 -1
View File
@@ -561,7 +561,7 @@ public class Building extends AbstractWorldObject {
BuildingManager.setRank(barracksBuilding, -1); BuildingManager.setRank(barracksBuilding, -1);
} }
// If the tree is R8 and deranking, we need to update the // If the tree is R8 and deranking, we need to update it's
// mesh along with buildings losing their health bonus // mesh along with buildings losing their health bonus
if (this.rank == 8) { if (this.rank == 8) {
+4 -11
View File
@@ -41,7 +41,6 @@ import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;
public class City extends AbstractWorldObject { public class City extends AbstractWorldObject {
@@ -81,7 +80,6 @@ public class City extends AbstractWorldObject {
private String hash; private String hash;
public Warehouse warehouse; public Warehouse warehouse;
public Realm realm; public Realm realm;
public AtomicBoolean isDestroyed = new AtomicBoolean(false);
/** /**
* ResultSet Constructor * ResultSet Constructor
@@ -324,7 +322,6 @@ public class City extends AbstractWorldObject {
continue; continue;
//can't repledge to a guild you're already part of //can't repledge to a guild you're already part of
if (repledge && city.getGuild().equals(playerCharacter.guild)) if (repledge && city.getGuild().equals(playerCharacter.guild))
continue; continue;
@@ -1119,21 +1116,17 @@ public class City extends AbstractWorldObject {
public final void destroy() { public final void destroy() {
if (this.isDestroyed.compareAndSet(false, true)) { Thread destroyCityThread = new Thread(new DestroyCityThread(this));
Thread destroyCityThread = new Thread(new DestroyCityThread(this)); destroyCityThread.setName("destroyCity:" + this.getName());
destroyCityThread.start();
destroyCityThread.setName("destroyCity:" + this.getParent().zoneName);
destroyCityThread.start();
} else
Logger.error("Attempt to destroy destroyed city");
} }
public final void transfer(AbstractCharacter newOwner) { public final void transfer(AbstractCharacter newOwner) {
Thread transferCityThread = new Thread(new TransferCityThread(this, newOwner)); Thread transferCityThread = new Thread(new TransferCityThread(this, newOwner));
transferCityThread.setName("TransferCity:" + this.getParent().zoneName); transferCityThread.setName("TransferCity:" + this.getName());
transferCityThread.start(); transferCityThread.start();
} }
+7 -35
View File
@@ -26,11 +26,10 @@ import engine.net.client.ClientConnection;
import engine.net.client.msg.ApplyEffectMsg; import engine.net.client.msg.ApplyEffectMsg;
import engine.objects.AbstractCharacter; import engine.objects.AbstractCharacter;
import engine.objects.AbstractWorldObject; import engine.objects.AbstractWorldObject;
import engine.objects.Effect;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
import engine.powers.effectmodifiers.AbstractEffectModifier; import engine.powers.effectmodifiers.AbstractEffectModifier;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import engine.util.Hasher;
import engine.wpak.data.Effect;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection; import java.sql.Connection;
@@ -63,7 +62,7 @@ public class EffectsBase {
// flags // flags
private boolean isItemEffect; private boolean isItemEffect;
private boolean isSpireEffect; private boolean isSpireEffect;
private boolean ignoreNoMod; private boolean ignoreMod;
private boolean dontSave; private boolean dontSave;
private boolean cancelOnAttack = false; private boolean cancelOnAttack = false;
private boolean cancelOnAttackSwing = false; private boolean cancelOnAttackSwing = false;
@@ -92,33 +91,6 @@ public class EffectsBase {
} }
//EffectEntry constructor
public EffectsBase(Effect entry) {
this.IDString = entry.effect_id;
this.name = entry.effect_name;
this.token = Hasher.SBStringHash(entry.effect_name);
//override tokens for some effects like Safemode that use the Action Token instead of the effect Token,
switch (this.IDString) {
case "INVIS-D":
this.token = -1661751254;
break;
case "SafeMode":
this.token = -1661750486;
break;
}
this.isItemEffect = entry.isItemEffect;
this.isSpireEffect = entry.isSpireEffect;
this.ignoreNoMod = entry.ignoreNoMod;
this.dontSave = entry.dontSave;
if (this.IDString.startsWith("PRE-"))
this.isPrefix = true;
else if (this.IDString.startsWith("SUF-"))
this.isSuffix = true;
}
public EffectsBase(EffectsBase copyEffect, int newToken, String IDString) { public EffectsBase(EffectsBase copyEffect, int newToken, String IDString) {
UUID = NewID++; UUID = NewID++;
@@ -130,7 +102,7 @@ public class EffectsBase {
int flags = 0; int flags = 0;
this.isItemEffect = ((flags & 1) != 0) ? true : false; this.isItemEffect = ((flags & 1) != 0) ? true : false;
this.isSpireEffect = ((flags & 2) != 0) ? true : false; this.isSpireEffect = ((flags & 2) != 0) ? true : false;
this.ignoreNoMod = ((flags & 4) != 0) ? true : false; this.ignoreMod = ((flags & 4) != 0) ? true : false;
this.dontSave = ((flags & 8) != 0) ? true : false; this.dontSave = ((flags & 8) != 0) ? true : false;
if (this.IDString.startsWith("PRE-")) if (this.IDString.startsWith("PRE-"))
@@ -145,7 +117,7 @@ public class EffectsBase {
this.amountRamp = copyEffect.amountRamp; this.amountRamp = copyEffect.amountRamp;
this.isItemEffect = copyEffect.isItemEffect; this.isItemEffect = copyEffect.isItemEffect;
this.isSpireEffect = copyEffect.isSpireEffect; this.isSpireEffect = copyEffect.isSpireEffect;
this.ignoreNoMod = copyEffect.ignoreNoMod; this.ignoreMod = copyEffect.ignoreMod;
this.dontSave = copyEffect.dontSave; this.dontSave = copyEffect.dontSave;
this.cancelOnAttack = copyEffect.cancelOnAttack; this.cancelOnAttack = copyEffect.cancelOnAttack;
this.cancelOnAttackSwing = copyEffect.cancelOnAttackSwing; this.cancelOnAttackSwing = copyEffect.cancelOnAttackSwing;
@@ -191,7 +163,7 @@ public class EffectsBase {
int flags = rs.getInt("flags"); int flags = rs.getInt("flags");
this.isItemEffect = ((flags & 1) != 0) ? true : false; this.isItemEffect = ((flags & 1) != 0) ? true : false;
this.isSpireEffect = ((flags & 2) != 0) ? true : false; this.isSpireEffect = ((flags & 2) != 0) ? true : false;
this.ignoreNoMod = ((flags & 4) != 0) ? true : false; this.ignoreMod = ((flags & 4) != 0) ? true : false;
this.dontSave = ((flags & 8) != 0) ? true : false; this.dontSave = ((flags & 8) != 0) ? true : false;
if (this.IDString.startsWith("PRE-")) if (this.IDString.startsWith("PRE-"))
@@ -379,7 +351,7 @@ public class EffectsBase {
} }
public boolean ignoreMod() { public boolean ignoreMod() {
return this.ignoreNoMod; return this.ignoreMod;
} }
public boolean dontSave() { public boolean dontSave() {
@@ -432,7 +404,7 @@ public class EffectsBase {
float duration = ab.getDurationInSeconds(trains); float duration = ab.getDurationInSeconds(trains);
if (pb.getToken() == 1672601862) { if (pb.getToken() == 1672601862) {
engine.objects.Effect eff = awo.getEffects().get("DeathShroud"); Effect eff = awo.getEffects().get("DeathShroud");
if (eff != null) { if (eff != null) {
+1 -1
View File
@@ -76,7 +76,7 @@ public class WorldServer {
super(); super();
} }
public static void main(String[] args) throws IOException { public static void main(String[] args) {
WorldServer worldServer; WorldServer worldServer;
+115 -103
View File
@@ -53,117 +53,129 @@ public class DestroyCityThread implements Runnable {
// Member variable assignment // Member variable assignment
try { cityZone = city.getParent();
cityZone = city.getParent(); newParent = cityZone.parent;
newParent = cityZone.parent; formerGuild = city.getTOL().getGuild();
formerGuild = city.getTOL().getGuild();
Logger.info("Destroy city thread started for: " + cityZone.zoneName); // Former guild loses it's tree!
// Former guild loses tree! if (DbManager.GuildQueries.SET_GUILD_OWNED_CITY(formerGuild.getObjectUUID(), 0)) {
if (DbManager.GuildQueries.SET_GUILD_OWNED_CITY(formerGuild.getObjectUUID(), 0)) { //Successful Update of guild
//Successful Update of guild formerGuild.setGuildState(mbEnums.GuildState.Errant);
formerGuild.setNation(null);
formerGuild.setGuildState(mbEnums.GuildState.Errant); formerGuild.setCityUUID(0);
formerGuild.setNation(null); GuildManager.updateAllGuildTags(formerGuild);
formerGuild.setCityUUID(0); GuildManager.updateAllGuildBinds(formerGuild, null);
GuildManager.updateAllGuildTags(formerGuild);
GuildManager.updateAllGuildBinds(formerGuild, null);
}
// By losing the tree, the former owners lose all of their subguilds.
if (!formerGuild.getSubGuildList().isEmpty()) {
subGuildList = new ArrayList<>();
subGuildList.addAll(formerGuild.getSubGuildList());
for (Guild subGuild : subGuildList) {
formerGuild.removeSubGuild(subGuild);
}
}
// Build list of buildings within this parent zone
ArrayList<Building> destroySet = new ArrayList<>();
for (Building cityBuilding : cityZone.zoneBuildingSet) {
// Sanity Check in case player deletes the building
// before this thread can get to it
if (cityBuilding == null)
continue;
// Do nothing with the banestone. It will be removed elsewhere
if (cityBuilding.getBlueprint().getBuildingGroup().equals(mbEnums.BuildingGroup.BANESTONE))
continue;
// All buildings are moved to a location relative
// to their new parent zone
localCoords = ZoneManager.worldToLocal(cityBuilding.getLoc(), newParent);
DbManager.BuildingQueries.MOVE_BUILDING(cityBuilding.getObjectUUID(), newParent.getObjectUUID(), localCoords.x, localCoords.y, localCoords.z);
// All buildings are re-parented to a zone one node
// higher in the tree (continent) as we will be
// deleting the city zone very shortly.
if (cityBuilding.getParentZoneID() != newParent.getParentZoneID())
cityBuilding.setParentZone(newParent);
// No longer a tree, no longer any protection contract!
cityBuilding.setProtectionState(mbEnums.ProtectionState.NONE);
// Remove warehouse entry if one exists.
if (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.WAREHOUSE) {
DbManager.WarehouseQueries.DELETE_WAREHOUSE(city.warehouse);
city.warehouse = null;
}
// Mark all auto protected buildings for destruction
if ((cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.BARRACK) || (cityBuilding.getBlueprint().isWallPiece()) || (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.SHRINE) || (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.TOL) || (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.SPIRE) || (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.WAREHOUSE))
destroySet.add(cityBuilding);
}
// Destroy set of auto-protected buildings
for (Building building : destroySet)
if (building.getRank() != -1)
BuildingManager.setRank(building, -1);
if (city.realm != null) {
city.realm.removeCity(city.getObjectUUID());
city.realm = null;
}
// It's now safe to delete the city zone from the database
// which will cause a cascade delete of everything else
if (!DbManager.ZoneQueries.DELETE_ZONE(cityZone)) {
Logger.error("DestroyCityThread", "Database error when deleting city zone: " + cityZone.getObjectUUID());
return;
}
// Refresh the city for map requests
City.lastCityUpdate = System.currentTimeMillis();
} catch (Exception e) {
Logger.error(e);
} }
// By losing the tree, the former owners lose all of their subguilds.
if (!formerGuild.getSubGuildList().isEmpty()) {
subGuildList = new ArrayList<>();
subGuildList.addAll(formerGuild.getSubGuildList());
for (Guild subGuild : subGuildList) {
formerGuild.removeSubGuild(subGuild);
}
}
Building tol = null;
// Build list of buildings within this parent zone
for (Building cityBuilding : cityZone.zoneBuildingSet) {
// Sanity Check in case player deletes the building
// before this thread can get to it
if (cityBuilding == null)
continue;
// check null bluepritn and log error
if (cityBuilding.getBlueprint() == null){
Logger.error("Null Blueprint for building ID: " + cityBuilding.getObjectUUID());
continue;
}
// Do nothing with the banestone. It will be removed elsewhere
if (cityBuilding.getBlueprint().getBuildingGroup().equals(mbEnums.BuildingGroup.BANESTONE))
continue;
// TOL is processed after all other structures in the city zone
if (cityBuilding.getBlueprint().getBuildingGroup().equals(mbEnums.BuildingGroup.TOL)) {
tol = cityBuilding;
continue;
}
// All buildings are moved to a location relative
// to their new parent zone
localCoords = ZoneManager.worldToLocal(cityBuilding.getLoc(), newParent);
DbManager.BuildingQueries.MOVE_BUILDING(cityBuilding.getObjectUUID(), newParent.getObjectUUID(), localCoords.x, localCoords.y, localCoords.z);
// All buildings are re-parented to a zone one node
// higher in the tree (continent) as we will be
// deleting the city zone very shortly.
if (cityBuilding.getParentZoneID() != newParent.getParentZoneID())
cityBuilding.setParentZone(newParent);
// No longer a tree, no longer any protection contract!
cityBuilding.setProtectionState(mbEnums.ProtectionState.NONE);
// Remove warehouse entry if one exists.
if (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.WAREHOUSE) {
DbManager.WarehouseQueries.DELETE_WAREHOUSE(city.warehouse);
city.warehouse = null;
}
// Destroy all remaining city assets
if ((cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.BARRACK)
|| (cityBuilding.getBlueprint().isWallPiece())
|| (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.SHRINE)
|| (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.TOL)
|| (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.SPIRE)
|| (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.WAREHOUSE)) {
if (cityBuilding.getRank() != -1)
BuildingManager.setRank(cityBuilding, -1);
}
}
// Destroy the tol
if (tol != null)
BuildingManager.setRank(tol, -1);
if (city.realm != null)
city.realm.removeCity(city.getObjectUUID());
// It's now safe to delete the city zone from the database
// which will cause a cascade delete of everything else
if (DbManager.ZoneQueries.DELETE_ZONE(cityZone) == false) {
Logger.error("DestroyCityThread", "Database error when deleting city zone: " + cityZone.getObjectUUID());
return;
}
// Refresh the city for map requests
City.lastCityUpdate = System.currentTimeMillis();
// Zone and city should vanish upon next reboot // Zone and city should vanish upon next reboot
// if the codebase reaches here. // if the codebase reaches here.
Logger.info(city.getParent().zoneName + " uuid: " + city.getObjectUUID() + " has been destroyed!"); Logger.info(city.getParent().zoneName + " uuid:" + city.getObjectUUID() + "has been destroyed!");
} }
} }
+13 -6
View File
@@ -13,19 +13,22 @@ import engine.mbEnums;
import engine.wpak.data.ConditionEntry; import engine.wpak.data.ConditionEntry;
import engine.wpak.data.Effect; import engine.wpak.data.Effect;
import engine.wpak.data.ModifierEntry; import engine.wpak.data.ModifierEntry;
import engine.wpakpowers.WpakPowerManager;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.*; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public class EffectsParser { public class EffectsParser {
public static String effectsPath = ConfigManager.DEFAULT_DATA_DIR + "wpak/Effects.cfg"; public static String effectsPath = ConfigManager.DEFAULT_DATA_DIR + "wpak/Effects.cfg";
public static HashMap<String, Effect> effect_data = new HashMap<>();
private static final Pattern EFFECT_REGEX = Pattern.compile("(?<=EFFECTBEGIN)(.+?)(?=EFFECTEND)", Pattern.DOTALL); private static final Pattern EFFECT_REGEX = Pattern.compile("(?<=EFFECTBEGIN)(.+?)(?=EFFECTEND)", Pattern.DOTALL);
private static final Pattern SOURCE_REGEX = Pattern.compile("(?<=SOURCEBEGIN)(.+?)(?=SOURCEEND)", Pattern.DOTALL); private static final Pattern SOURCE_REGEX = Pattern.compile("(?<=SOURCEBEGIN)(.+?)(?=SOURCEEND)", Pattern.DOTALL);
private static final Pattern MODS_REGEX = Pattern.compile("(?<=MODSBEGIN)(.+?)(?=MODSEND)", Pattern.DOTALL); private static final Pattern MODS_REGEX = Pattern.compile("(?<=MODSBEGIN)(.+?)(?=MODSEND)", Pattern.DOTALL);
@@ -51,8 +54,12 @@ public class EffectsParser {
Matcher matcher = EFFECT_REGEX.matcher(fileContents); Matcher matcher = EFFECT_REGEX.matcher(fileContents);
while (matcher.find()) { while (matcher.find()) {
Effect effect = parseEffectEntry(matcher.group()); try {
effect_data.put(effect.effect_id, effect); Effect effect = parseEffectEntry(matcher.group());
WpakPowerManager._effectsLookup.put(effect.effect_id, effect);
} catch (Exception e) {
Logger.error("EFFECT PARSE FAILED: " + e);
}
} }
} }
@@ -174,8 +181,8 @@ public class EffectsParser {
case Stamina: case Stamina:
modifierEntry.min = Float.parseFloat(modValues.get(1).trim()); modifierEntry.min = Float.parseFloat(modValues.get(1).trim());
modifierEntry.max = Float.parseFloat(modValues.get(2).trim()); modifierEntry.max = Float.parseFloat(modValues.get(2).trim());
modifierEntry.value = Float.parseFloat(modValues.get(3).trim()); modifierEntry.percentage = Float.parseFloat(modValues.get(3).trim());
// Parameter 4 is always 0. modifierEntry.value = Float.parseFloat(modValues.get(4).trim()); // Always zero
modifierEntry.compoundCurveType = mbEnums.CompoundCurveType.valueOf(modValues.get(5).trim()); modifierEntry.compoundCurveType = mbEnums.CompoundCurveType.valueOf(modValues.get(5).trim());
modifierEntry.arg1 = modValues.get(6).trim(); modifierEntry.arg1 = modValues.get(6).trim();
break; break;
+52 -47
View File
@@ -10,10 +10,12 @@ package engine.wpak;
import engine.gameManager.ConfigManager; import engine.gameManager.ConfigManager;
import engine.mbEnums; import engine.mbEnums;
import engine.util.Hasher;
import engine.wpak.data.Effect; import engine.wpak.data.Effect;
import engine.wpak.data.PowerAction; import engine.wpak.data.PowerAction;
import engine.wpak.data.StatTransfer; import engine.wpak.data.StatTransfer;
import engine.wpak.data.TrackEntry; import engine.wpak.data.TrackEntry;
import engine.wpakpowers.WpakPowerManager;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.io.IOException; import java.io.IOException;
@@ -52,7 +54,7 @@ public class PowerActionParser {
while (matcher.find()) { while (matcher.find()) {
PowerAction powerAction = parsePowerActionEntry(matcher.group().trim()); PowerAction powerAction = parsePowerActionEntry(matcher.group().trim());
WpakPowerManager._powerActionLookup.put(Hasher.SBStringHash(powerAction.action_id), powerAction);
} }
} }
@@ -82,26 +84,26 @@ public class PowerActionParser {
Iterator<String> headerIterator = headerData.iterator(); Iterator<String> headerIterator = headerData.iterator();
powerAction.action_id = headerIterator.next(); powerAction.action_id = headerIterator.next();
powerAction.action_type = headerIterator.next(); powerAction.action_type = mbEnums.PowerActionType.valueOf(headerIterator.next());
switch (powerAction.action_type) { switch (powerAction.action_type) {
case "RemoveEffect": case RemoveEffect:
effect = new Effect(); effect = new Effect();
effect.effect_id = headerIterator.next(); effect.effect_id = headerIterator.next();
powerAction.effects.add(effect); powerAction.effects.add(effect);
break; break;
case "CreateMob": case CreateMob:
powerAction.petLevel = Integer.parseInt(headerIterator.next());
powerAction.petRace = Integer.parseInt(headerIterator.next()); powerAction.petRace = Integer.parseInt(headerIterator.next());
powerAction.petLevel = Integer.parseInt(headerIterator.next());
break; break;
case "DamageOverTime": case DamageOverTime:
effect = new Effect(); effect = new Effect();
effect.effect_id = headerIterator.next(); effect.effect_id = headerIterator.next();
effect.cycleDuration = Integer.parseInt(headerIterator.next()); effect.cycleDuration = Integer.parseInt(headerIterator.next());
effect.cycleDelay = Integer.parseInt(headerIterator.next()); effect.cycleDelay = Integer.parseInt(headerIterator.next());
powerAction.effects.add(effect); powerAction.effects.add(effect);
break; break;
case "ApplyEffects": case ApplyEffects:
int level = Integer.parseInt(headerIterator.next()); int level = Integer.parseInt(headerIterator.next());
while (headerIterator.hasNext()) { while (headerIterator.hasNext()) {
@@ -111,12 +113,12 @@ public class PowerActionParser {
powerAction.effects.add(effect); powerAction.effects.add(effect);
} }
break; break;
case "Transform": case Transform:
case "Invis": case Invis:
case "ApplyEffect": case ApplyEffect:
case "DeferredPower": case DeferredPower:
case "DirectDamage": case DirectDamage:
case "SpireDisable": case SpireDisable:
while (headerIterator.hasNext()) { while (headerIterator.hasNext()) {
effect = new Effect(); effect = new Effect();
effect.effect_id = headerIterator.next(); effect.effect_id = headerIterator.next();
@@ -129,73 +131,76 @@ public class PowerActionParser {
powerAction.effects.add(effect); powerAction.effects.add(effect);
} }
break; break;
case "TransferStat": case TransferStat:
statTransfer = new StatTransfer(); statTransfer = new StatTransfer();
statTransfer.fromStat = mbEnums.CostType.valueOf(headerIterator.next()); statTransfer.fromStat = mbEnums.CostType.valueOf(headerIterator.next());
statTransfer.toStat = mbEnums.CostType.valueOf(headerIterator.next()); statTransfer.toStat = mbEnums.CostType.valueOf(headerIterator.next());
statTransfer.fromStatValue = Float.parseFloat(headerIterator.next()); statTransfer.ramp = Float.parseFloat(headerIterator.next());
statTransfer.fromCurve = mbEnums.CompoundCurveType.valueOf(headerIterator.next()); statTransfer.rampCurve = mbEnums.CompoundCurveType.valueOf(headerIterator.next());
statTransfer.toStatValue = Float.parseFloat(headerIterator.next()); statTransfer.efficiency = Float.parseFloat(headerIterator.next());
statTransfer.toCurve = mbEnums.CompoundCurveType.valueOf(headerIterator.next()); statTransfer.efficiencyCurve = mbEnums.CompoundCurveType.valueOf(headerIterator.next());
statTransfer.fromStatBool = Boolean.parseBoolean(headerIterator.next()); statTransfer.fromStatBool = Boolean.parseBoolean(headerIterator.next());
statTransfer.toStatBool = Boolean.parseBoolean(headerIterator.next()); statTransfer.isDrain = Boolean.parseBoolean(headerIterator.next());
powerAction.statTransfer = statTransfer; powerAction.statTransfer = statTransfer;
break; break;
case "TransferStatOT": case TransferStatOT:
statTransfer = new StatTransfer(); statTransfer = new StatTransfer();
statTransfer.fromStat = mbEnums.CostType.valueOf(headerIterator.next()); statTransfer.fromStat = mbEnums.CostType.valueOf(headerIterator.next());
statTransfer.toStat = mbEnums.CostType.valueOf(headerIterator.next()); statTransfer.toStat = mbEnums.CostType.valueOf(headerIterator.next());
statTransfer.fromStatValue = Float.parseFloat(headerIterator.next()); statTransfer.ramp = Float.parseFloat(headerIterator.next());
statTransfer.fromCurve = mbEnums.CompoundCurveType.valueOf(headerIterator.next()); statTransfer.rampCurve = mbEnums.CompoundCurveType.valueOf(headerIterator.next());
statTransfer.toStatValue = Float.parseFloat(headerIterator.next()); statTransfer.efficiency = Float.parseFloat(headerIterator.next());
statTransfer.toCurve = mbEnums.CompoundCurveType.valueOf(headerIterator.next()); statTransfer.efficiencyCurve = mbEnums.CompoundCurveType.valueOf(headerIterator.next());
statTransfer.fromStatBool = Boolean.parseBoolean(headerIterator.next()); statTransfer.fromStatBool = Boolean.parseBoolean(headerIterator.next());
statTransfer.toStatBool = Boolean.parseBoolean(headerIterator.next()); statTransfer.isDrain = Boolean.parseBoolean(headerIterator.next());
statTransfer.transfer_action = headerIterator.next(); statTransfer.transfer_action = headerIterator.next();
statTransfer.transfer_ticks = Integer.parseInt(headerIterator.next()); statTransfer.transfer_ticks = Integer.parseInt(headerIterator.next());
powerAction.statTransfer = statTransfer; powerAction.statTransfer = statTransfer;
break; break;
case "Charm": case Charm:
effect = new Effect(); effect = new Effect();
effect.effect_id = headerIterator.next(); effect.effect_id = headerIterator.next();
effect.level = Integer.parseInt(headerIterator.next()); effect.level = Integer.parseInt(headerIterator.next());
effect.type = headerIterator.next(); effect.type = headerIterator.next();
powerAction.effects.add(effect); powerAction.effects.add(effect);
break; break;
case "Block": case Block:
effect = new Effect(); effect = new Effect();
effect.effect_id = headerIterator.next(); effect.effect_id = headerIterator.next();
effect.level = Integer.parseInt(headerIterator.next()); effect.level = Integer.parseInt(headerIterator.next());
powerAction.effects.add(effect); powerAction.effects.add(effect);
break; break;
case "Resurrect": case Resurrect:
powerAction.levelCap = Integer.parseInt(headerIterator.next()); powerAction.levelCap = Integer.parseInt(headerIterator.next());
break; break;
case "SetItemFlag": case SetItemFlag:
powerAction.itemFlag = mbEnums.ItemFlags.valueOf(headerIterator.next()); powerAction.itemFlag = mbEnums.ItemFlags.valueOf(headerIterator.next());
break; break;
case "Track": case Track:
trackEntry = new TrackEntry(); trackEntry = new TrackEntry();
trackEntry.action_id = headerIterator.next(); trackEntry.action_id = headerIterator.next();
trackEntry.unknown1 = Boolean.parseBoolean(headerIterator.next()); trackEntry.trackPlayer = Boolean.parseBoolean(headerIterator.next());
trackEntry.unknown2 = Boolean.parseBoolean(headerIterator.next()); trackEntry.trackCorpse = Boolean.parseBoolean(headerIterator.next());
trackEntry.type = headerIterator.next(); trackEntry.filter = mbEnums.MonsterType.valueOf(headerIterator.next());
trackEntry.min = Integer.parseInt(headerIterator.next()); trackEntry.min = Integer.parseInt(headerIterator.next());
trackEntry.max = Integer.parseInt(headerIterator.next()); trackEntry.max = Integer.parseInt(headerIterator.next());
powerAction.trackEntry = trackEntry; powerAction.trackEntry = trackEntry;
break; break;
case "Recall": // No arguments for these tags or not parsed case Teleport:
case "Summon": if (headerIterator.hasNext())
case "Teleport": powerAction.ignoreNoTeleSpire = Boolean.parseBoolean(headerIterator.next());
case "TreeChoke": break;
case "SimpleDamage": case Recall: // No arguments for these tags or not parsed
case "MobRecall": // One argument always zero case Summon:
case "ClearAggro": case TreeChoke:
case "ClearNearbyAggro": case SimpleDamage:
case "Peek": case MobRecall: // One argument always zero
case "ClaimMine": case ClearAggro:
case "RunegateTeleport": case ClearNearbyAggro:
case "Steal": case Peek:
case ClaimMine:
case RunegateTeleport:
case Steal:
break; break;
default: default:
Logger.error("Unhandled type " + powerAction.action_type + " for Pow4erAction: " + powerAction.action_id); Logger.error("Unhandled type " + powerAction.action_type + " for Pow4erAction: " + powerAction.action_id);
@@ -215,7 +220,7 @@ public class PowerActionParser {
arguments = Arrays.asList(lineValues.get(1).trim().split("\\s+")); arguments = Arrays.asList(lineValues.get(1).trim().split("\\s+"));
for (String bodyPart : arguments) for (String bodyPart : arguments)
powerAction.bodyparts.add(Integer.parseInt(bodyPart)); powerAction.bodyParts.add(Integer.parseInt(bodyPart));
break; break;
case "FEMALEBODYPARTS": case "FEMALEBODYPARTS":
arguments = Arrays.asList(lineValues.get(1).trim().split("\\s+")); arguments = Arrays.asList(lineValues.get(1).trim().split("\\s+"));
@@ -269,7 +274,7 @@ public class PowerActionParser {
powerAction.levelCap = Integer.parseInt(arguments.get(0)); powerAction.levelCap = Integer.parseInt(arguments.get(0));
if (arguments.size() > 1) // Not all level caps have a curve if (arguments.size() > 1) // Not all level caps have a curve
powerAction.levelCurve = mbEnums.CompoundCurveType.valueOf(arguments.get(1)); powerAction.levelCapCurve = mbEnums.CompoundCurveType.valueOf(arguments.get(1));
break; break;
case "CLEARAGGRO": case "CLEARAGGRO":
powerAction.clearAggro = Boolean.parseBoolean(lineValues.get(1).trim()); powerAction.clearAggro = Boolean.parseBoolean(lineValues.get(1).trim());
+15 -8
View File
@@ -10,7 +10,9 @@ package engine.wpak;
import engine.gameManager.ConfigManager; import engine.gameManager.ConfigManager;
import engine.mbEnums; import engine.mbEnums;
import engine.util.Hasher;
import engine.wpak.data.*; import engine.wpak.data.*;
import engine.wpakpowers.WpakPowerManager;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.io.IOException; import java.io.IOException;
@@ -50,7 +52,7 @@ public class PowersParser {
while (matcher.find()) { while (matcher.find()) {
Power power = parsePowerEntry(matcher.group().trim()); Power power = parsePowerEntry(matcher.group().trim());
WpakPowerManager._powersLookup.put(Hasher.SBStringHash(power.power_id), power);
} }
} }
@@ -104,7 +106,7 @@ public class PowersParser {
PowerEntry power = new PowerEntry(); PowerEntry power = new PowerEntry();
power.power_type = mbEnums.PowerType.valueOf(iterator.next()); power.power_type = mbEnums.PowerType.valueOf(iterator.next());
power.icon = Integer.parseInt(iterator.next()); power.icon = Integer.parseInt(iterator.next());
power.powerBase = iterator.next().replaceAll("\"", ""); power.focusLine = iterator.next().replaceAll("\"", "");
powerEntry.powers.add(power); powerEntry.powers.add(power);
String nextValue = iterator.next(); String nextValue = iterator.next();
@@ -115,7 +117,7 @@ public class PowersParser {
power = new PowerEntry(); power = new PowerEntry();
power.power_type = mbEnums.PowerType.valueOf(nextValue); power.power_type = mbEnums.PowerType.valueOf(nextValue);
power.icon = Integer.parseInt(iterator.next()); power.icon = Integer.parseInt(iterator.next());
power.powerBase = iterator.next().replaceAll("\"", ""); power.focusLine = iterator.next().replaceAll("\"", "");
powerEntry.powers.add(power); powerEntry.powers.add(power);
powerEntry.target_type = mbEnums.PowerTargetType.valueOf(iterator.next()); powerEntry.target_type = mbEnums.PowerTargetType.valueOf(iterator.next());
} else } else
@@ -157,7 +159,7 @@ public class PowersParser {
case "ACTION": case "ACTION":
actionEntry = new ActionEntry(); actionEntry = new ActionEntry();
arguments = Arrays.asList(lineValues.get(1).trim().split("\\s+")); arguments = Arrays.asList(lineValues.get(1).trim().split("\\s+"));
actionEntry.effect_id = arguments.get(0); actionEntry.action_id = arguments.get(0);
actionEntry.minTrains = Integer.parseInt(arguments.get(1)); actionEntry.minTrains = Integer.parseInt(arguments.get(1));
actionEntry.maxTrains = Integer.parseInt(arguments.get(2)); actionEntry.maxTrains = Integer.parseInt(arguments.get(2));
actionEntry.duration = Float.parseFloat(arguments.get(3)); actionEntry.duration = Float.parseFloat(arguments.get(3));
@@ -189,7 +191,7 @@ public class PowersParser {
powerEntry.description.add(lineValues.get(1).trim()); powerEntry.description.add(lineValues.get(1).trim());
break; break;
case "CATEGORY": case "CATEGORY":
powerEntry.category = lineValues.get(1).trim(); powerEntry.category = mbEnums.PowerCategoryType.valueOf(lineValues.get(1).trim());
break; break;
case "CURVE": case "CURVE":
arguments = Arrays.asList(lineValues.get(1).trim().split("\\s+")); arguments = Arrays.asList(lineValues.get(1).trim().split("\\s+"));
@@ -206,9 +208,14 @@ public class PowersParser {
while (argumentIterator.hasNext()) { while (argumentIterator.hasNext()) {
EquipmentPreReq equipmentPreReq = new EquipmentPreReq(); EquipmentPreReq equipmentPreReq = new EquipmentPreReq();
equipmentPreReq.slot = mbEnums.EquipSlotType.valueOf(arguments.get(0)); equipmentPreReq.slot = mbEnums.EquipSlotType.valueOf(argumentIterator.next());
equipmentPreReq.skill = arguments.get(1).replaceAll("\"", ""); equipmentPreReq.skill = argumentIterator.next().replaceAll("\"", "");
equipmentPreReq.required = Integer.parseInt(arguments.get(2));
if (argumentIterator.hasNext())
equipmentPreReq.required = Integer.parseInt(argumentIterator.next());
else
equipmentPreReq.required = 0;
powerEntry.equipmentPreReq.add(equipmentPreReq); powerEntry.equipmentPreReq.add(equipmentPreReq);
} }
break; break;
+1 -1
View File
@@ -12,7 +12,7 @@ import engine.mbEnums;
public class ActionEntry { public class ActionEntry {
public String effect_id; public String action_id;
public int minTrains; public int minTrains;
public int maxTrains; public int maxTrains;
public float duration; public float duration;
+16
View File
@@ -10,6 +10,7 @@ package engine.wpak.data;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.Objects;
public class Effect { public class Effect {
public String effect_id; public String effect_id;
@@ -32,4 +33,19 @@ public class Effect {
public String message; public String message;
public int cycleDuration; public int cycleDuration;
public int cycleDelay; public int cycleDelay;
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
Effect effect = (Effect) o;
return Objects.equals(effect_id, effect.effect_id);
}
@Override
public int hashCode() {
return effect_id.hashCode(); // Use only the id field for hashCode
}
} }
+1
View File
@@ -14,6 +14,7 @@ public class ModifierEntry {
public mbEnums.ModType type; public mbEnums.ModType type;
public float min; public float min;
public float max; public float max;
public float percentage;
public float value; public float value;
public mbEnums.CompoundCurveType compoundCurveType; public mbEnums.CompoundCurveType compoundCurveType;
public String arg1; // ItemName "Masterwork" "" public String arg1; // ItemName "Masterwork" ""
+28 -1
View File
@@ -13,6 +13,7 @@ import engine.mbEnums;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.HashMap; import java.util.HashMap;
import java.util.Objects;
public class Power { public class Power {
public String power_id; public String power_id;
@@ -46,7 +47,7 @@ public class Power {
public String grantOverrideVar; public String grantOverrideVar;
public ArrayList<String> description = new ArrayList<>(); public ArrayList<String> description = new ArrayList<>();
public HashMap<String, mbEnums.CompoundCurveType> curves = new HashMap<>(); public HashMap<String, mbEnums.CompoundCurveType> curves = new HashMap<>();
public String category; public mbEnums.PowerCategoryType category;
public boolean canCastWhileMoving = false; public boolean canCastWhileMoving = false;
public boolean bladeTrails = false; public boolean bladeTrails = false;
public ArrayList<Effect> effectPreReqs = new ArrayList<>(); public ArrayList<Effect> effectPreReqs = new ArrayList<>();
@@ -66,4 +67,30 @@ public class Power {
public boolean isProjectile = false; public boolean isProjectile = false;
public HashMap<String, Float> conditions = new HashMap<>(); public HashMap<String, Float> conditions = new HashMap<>();
public boolean isSpell() {
return true;
}
public boolean isSkill() {
return true;
}
public boolean isChant() {
return true;
}
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
Power power = (Power) o;
return Objects.equals(power_id, power.power_id);
}
@Override
public int hashCode() {
return power_id.hashCode(); // Use only the id field for hashCode
}
} }
+18 -3
View File
@@ -11,24 +11,25 @@ package engine.wpak.data;
import engine.mbEnums; import engine.mbEnums;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Objects;
public class PowerAction { public class PowerAction {
// Header values // Header values
public String action_id; public String action_id;
public String action_type; public mbEnums.PowerActionType action_type;
public ArrayList<Effect> effects = new ArrayList<>(); public ArrayList<Effect> effects = new ArrayList<>();
public int petLevel; public int petLevel;
public int petRace; public int petRace;
public StatTransfer statTransfer; public StatTransfer statTransfer;
public int levelCap; public int levelCap;
public mbEnums.CompoundCurveType levelCurve; public mbEnums.CompoundCurveType levelCapCurve;
public TrackEntry trackEntry; public TrackEntry trackEntry;
// Additional variables after header go here. // Additional variables after header go here.
public ArrayList<Integer> bodyparts = new ArrayList<>(); public ArrayList<Integer> bodyParts = new ArrayList<>();
public ArrayList<Integer> femaleBodyParts = new ArrayList<>(); public ArrayList<Integer> femaleBodyParts = new ArrayList<>();
public boolean shouldShowWeapons = false; public boolean shouldShowWeapons = false;
public boolean shouldShowArmor = false; public boolean shouldShowArmor = false;
@@ -48,6 +49,20 @@ public class PowerAction {
public mbEnums.MobBehaviourType rootFsmID; public mbEnums.MobBehaviourType rootFsmID;
public int splashDamageMin; public int splashDamageMin;
public int splashDamageMax; public int splashDamageMax;
public boolean ignoreNoTeleSpire = false;
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
PowerAction powerAction = (PowerAction) o;
return Objects.equals(action_id, powerAction.action_id);
}
@Override
public int hashCode() {
return action_id.hashCode(); // Use only the id field for hashCode
}
} }
+1 -1
View File
@@ -13,5 +13,5 @@ import engine.mbEnums;
public class PowerEntry { public class PowerEntry {
public mbEnums.PowerType power_type; public mbEnums.PowerType power_type;
public int icon; public int icon;
public String powerBase; public String focusLine;
} }
+5 -5
View File
@@ -12,13 +12,13 @@ import engine.mbEnums;
public class StatTransfer { public class StatTransfer {
public mbEnums.CostType fromStat; public mbEnums.CostType fromStat;
public float fromStatValue; public float ramp;
public mbEnums.CompoundCurveType fromCurve; public mbEnums.CompoundCurveType rampCurve;
public mbEnums.CostType toStat; public mbEnums.CostType toStat;
public float toStatValue; public float efficiency;
public mbEnums.CompoundCurveType toCurve; public mbEnums.CompoundCurveType efficiencyCurve;
public boolean fromStatBool; public boolean fromStatBool;
public boolean toStatBool; public boolean isDrain;
public String transfer_action; public String transfer_action;
public int transfer_ticks; public int transfer_ticks;
} }
+5 -3
View File
@@ -8,12 +8,14 @@
package engine.wpak.data; package engine.wpak.data;
import engine.mbEnums;
public class TrackEntry { public class TrackEntry {
public String action_id; public String action_id;
public Boolean unknown1; public Boolean trackPlayer;
public Boolean unknown2; public Boolean trackCorpse;
public String type; public mbEnums.MonsterType filter;
public int min; public int min;
public int max; public int max;
} }