From 3fc5e7253afdf59ddfa7ea51f423596e136059a5 Mon Sep 17 00:00:00 2001 From: MagicBot Date: Mon, 26 Oct 2026 05:37:36 -0400 Subject: [PATCH] Build power actions from PowerActions.cfg PowersManager.loadPowerActions builds every AbstractPowerAction from PowerActionTemplate (template ctor on all subclasses), in id order with IDs 1..3046; OPENGATE keeps 5000. The ResultSet loader stays until removal. The parser now reads the SimpleDamage (min, max), Teleport (bool), Track (two bools) and TransferStat (bool at token 8) header fields. Parity (JSON-Refactor-Plan/scripts/p47.py, every column): ids 3046/3046 plus the DB-only AELFBORN row, which nothing references (the cfg has BOON-AELFBORN). Effect ids, deferred powers, RemoveEffect source/REMOVEALL, track filter/max, transfer types/ramps/ramp-add, mob level identical. The old flags match the new header fields: Track 1024/2048 = tokens 3/4, TransferStat 16384 = token 8, Teleport 32768 = SAB-001A's TRUE. Value changes (PowerActions.cfg wins): - DamageOverTime/TransferStatOT: the cfg value is the tick count; tick length = action duration / ticks. The DB stored cfg+1 as tick seconds, which only worked for 30s DoTs (5 x 6s, unchanged). HOLY-DOT-17 (60s) goes 10 -> 5 ticks, BLEED-DOT (4s) 0 -> 4, TransferStatOT 30s 6 -> 5 ticks. - TransferStat amounts are read with ToInt as the client does: 16 actions drop by 0.5 (BEL-001A 31.5 -> 31, CON-001A 13.5 -> 13, ...). - PRE-334..337 become ApplyEffects with one effect; ApplyEffectsPowerAction now allows a missing second effect on baked-in items. - Charm level cap ramp from the LEVELCAP= curve (same values as the DB). - Charm actions with effect FEAR/CONFUSION (12, DB type Confusion) stay ConfusionPowerAction no-ops; CHARM ones use CharmPowerAction (decided). - CreateMob: the cfg client mob id (49..74, 3500, 3501) maps to the mobbase through a map in CreateMobPowerAction, from the old DB values. - The 50 Charm/Block/SpireDisable rows with no DB effect id get the cfg id (unread by those classes); isAggressive differs on 330 rows (unread). - SimpleDamage keeps min/max instead of the always-0 simpleDamage (unread). Co-Authored-By: Claude Opus 5.5 --- src/engine/gameManager/PowersManager.java | 108 +++++++++++++++++- src/engine/jobs/DamageOverTimeJob.java | 7 +- src/engine/jobs/TransferStatOTJob.java | 8 +- .../objects/wpak/PowerActionTemplate.java | 9 ++ .../parsers/wpak/PowerActionParser.java | 10 ++ .../poweractions/AbstractPowerAction.java | 13 +++ .../poweractions/ApplyEffectPowerAction.java | 9 ++ .../poweractions/ApplyEffectsPowerAction.java | 21 +++- .../powers/poweractions/BlockPowerAction.java | 5 + .../powers/poweractions/CharmPowerAction.java | 9 ++ .../poweractions/ClaimMinePowerAction.java | 5 + .../poweractions/ClearAggroPowerAction.java | 5 + .../ClearNearbyAggroPowerAction.java | 5 + .../poweractions/ConfusionPowerAction.java | 5 + .../poweractions/CreateMobPowerAction.java | 31 +++++ .../DamageOverTimePowerAction.java | 9 ++ .../DeferredPowerPowerAction.java | 9 ++ .../poweractions/DirectDamagePowerAction.java | 8 ++ .../powers/poweractions/FearPowerAction.java | 9 ++ .../powers/poweractions/InvisPowerAction.java | 8 ++ .../poweractions/MobRecallPowerAction.java | 5 + .../poweractions/OpenGatePowerAction.java | 5 + .../powers/poweractions/PeekPowerAction.java | 5 + .../poweractions/RecallPowerAction.java | 5 + .../poweractions/RemoveEffectPowerAction.java | 8 ++ .../poweractions/ResurrectPowerAction.java | 5 + .../RunegateTeleportPowerAction.java | 5 + .../poweractions/SetItemFlagPowerAction.java | 5 + .../poweractions/SimpleDamagePowerAction.java | 21 +++- .../poweractions/SpireDisablePowerAction.java | 5 + .../powers/poweractions/StealPowerAction.java | 5 + .../poweractions/SummonPowerAction.java | 5 + .../poweractions/TeleportPowerAction.java | 7 ++ .../powers/poweractions/TrackPowerAction.java | 19 +++ .../TransferStatOTPowerAction.java | 7 ++ .../poweractions/TransferStatPowerAction.java | 33 ++++++ .../poweractions/TransformPowerAction.java | 8 ++ .../poweractions/TreeChokePowerAction.java | 5 + 38 files changed, 435 insertions(+), 16 deletions(-) diff --git a/src/engine/gameManager/PowersManager.java b/src/engine/gameManager/PowersManager.java index 64ceaccb..54b17321 100644 --- a/src/engine/gameManager/PowersManager.java +++ b/src/engine/gameManager/PowersManager.java @@ -31,7 +31,7 @@ import engine.parsers.objects.wpak.PowActionCostTemplate; import engine.parsers.objects.wpak.PowerActionTemplate; import engine.parsers.objects.wpak.PowerTemplate; import engine.powers.*; -import engine.powers.poweractions.AbstractPowerAction; +import engine.powers.poweractions.*; import engine.server.MBServerStatics; import org.pmw.tinylog.Logger; @@ -135,6 +135,109 @@ public enum PowersManager { + actionKeyCount + " effect keys from PowerActions.cfg"); } + // PowerActions.cfg in id order; ids 1..n, OPENGATE keeps 5000 + private static void loadPowerActions() { + + int powerActionID = 0; + PowerActionTemplate powerActionTemplate; + AbstractPowerAction powerAction; + AbstractPowerAction openGateAction; + + for (String actionID : new TreeSet<>(PowerActionTemplate._powerActions.keySet())) { + + powerActionTemplate = PowerActionTemplate._powerActions.get(actionID); + powerAction = buildPowerAction(powerActionTemplate, ++powerActionID); + + if (powerAction == null) { + Logger.error("Power action " + actionID + " has unsupported type " + powerActionTemplate.action_type); + continue; + } + + PowersManager.ActionTokenByIDString.put(actionID, DbManager.hasher.SBStringHash(actionID)); + PowersManager.powerActionsByIDString.put(actionID, powerAction); + PowersManager.powerActionsByID.put(powerAction.getUUID(), powerAction); + } + + openGateAction = new OpenGatePowerAction(5000, "OPENGATE", "OpenGate", false); + PowersManager.powerActionsByIDString.put("OPENGATE", openGateAction); + PowersManager.powerActionsByID.put(openGateAction.getUUID(), openGateAction); + + Logger.info("Loaded " + PowersManager.powerActionsByIDString.size() + " power actions from PowerActions.cfg (incl. OPENGATE)"); + } + + private static AbstractPowerAction buildPowerAction(PowerActionTemplate powerActionTemplate, int id) { + + HashMap effects = PowersManager.effectsBaseByIDString; + + switch (powerActionTemplate.action_type) { + case ApplyEffect: + return new ApplyEffectPowerAction(powerActionTemplate, id, effects); + case ApplyEffects: + return new ApplyEffectsPowerAction(powerActionTemplate, id, effects); + case Block: + return new BlockPowerAction(powerActionTemplate, id); + case Charm: + // FEAR and CONFUSION Charm actions stay no-ops, as when the DB typed them Confusion + if (powerActionTemplate.effect_ids.get(0).equals("CHARM")) + return new CharmPowerAction(powerActionTemplate, id); + return new ConfusionPowerAction(powerActionTemplate, id); + case ClaimMine: + return new ClaimMinePowerAction(powerActionTemplate, id); + case ClearAggro: + return new ClearAggroPowerAction(powerActionTemplate, id); + case ClearNearbyAggro: + return new ClearNearbyAggroPowerAction(powerActionTemplate, id); + case Confusion: + return new ConfusionPowerAction(powerActionTemplate, id); + case CreateMob: + return new CreateMobPowerAction(powerActionTemplate, id); + case DamageOverTime: + return new DamageOverTimePowerAction(powerActionTemplate, id, effects); + case DeferredPower: + return new DeferredPowerPowerAction(powerActionTemplate, id, effects); + case DirectDamage: + return new DirectDamagePowerAction(powerActionTemplate, id, effects); + case Invis: + return new InvisPowerAction(powerActionTemplate, id, effects); + case MobRecall: + return new MobRecallPowerAction(powerActionTemplate, id); + case Peek: + return new PeekPowerAction(powerActionTemplate, id); + case Recall: + return new RecallPowerAction(powerActionTemplate, id); + case RemoveEffect: + return new RemoveEffectPowerAction(powerActionTemplate, id); + case Resurrect: + return new ResurrectPowerAction(powerActionTemplate, id); + case RunegateTeleport: + return new RunegateTeleportPowerAction(powerActionTemplate, id); + case SetItemFlag: + return new SetItemFlagPowerAction(powerActionTemplate, id); + case SimpleDamage: + return new SimpleDamagePowerAction(powerActionTemplate, id); + case SpireDisable: + return new SpireDisablePowerAction(powerActionTemplate, id); + case Steal: + return new StealPowerAction(powerActionTemplate, id); + case Summon: + return new SummonPowerAction(powerActionTemplate, id); + case Teleport: + return new TeleportPowerAction(powerActionTemplate, id); + case Track: + return new TrackPowerAction(powerActionTemplate, id, effects); + case TransferStat: + return new TransferStatPowerAction(powerActionTemplate, id, effects); + case TransferStatOT: + return new TransferStatOTPowerAction(powerActionTemplate, id, effects); + case Transform: + return new TransformPowerAction(powerActionTemplate, id, effects); + case TreeChoke: + return new TreeChokePowerAction(powerActionTemplate, id); + default: + return null; + } + } + private static void addEffect(EffectsBase effectsBase) { PowersManager.effectsBaseByToken.put(effectsBase.getToken(), effectsBase); PowersManager.effectsBaseByIDString.put(effectsBase.getIDString(), effectsBase); @@ -192,8 +295,7 @@ public enum PowersManager { loadEffects(); - // Add PowerActions - AbstractPowerAction.getAllPowerActions(PowersManager.powerActionsByIDString, PowersManager.powerActionsByID, PowersManager.effectsBaseByIDString); + loadPowerActions(); // get all PowersBase ArrayList pbList = dbSkillReqHandler.getAllPowersBase(); diff --git a/src/engine/jobs/DamageOverTimeJob.java b/src/engine/jobs/DamageOverTimeJob.java index 3e6fc3d3..370ad2ac 100644 --- a/src/engine/jobs/DamageOverTimeJob.java +++ b/src/engine/jobs/DamageOverTimeJob.java @@ -25,6 +25,7 @@ public class DamageOverTimeJob extends AbstractEffectJob { private final DamageOverTimePowerAction dot; private int iteration = 0; private int liveCounter = 0; + private final int tickLength; public DamageOverTimeJob(AbstractWorldObject source, AbstractWorldObject target, String stackType, int trains, ActionsBase action, PowersBase power, EffectsBase eb, DamageOverTimePowerAction dot) { super(source, target, stackType, trains, action, power, eb); @@ -33,7 +34,9 @@ public class DamageOverTimeJob extends AbstractEffectJob { if (this.target != null && AbstractWorldObject.IsAbstractCharacter(target)) this.liveCounter = ((AbstractCharacter) target).getLiveCounter(); - this.iteration = action.getDurationInSeconds(trains) / this.dot.getNumIterations(); + // PowerActions.cfg gives the tick count; the ticks split the action's duration + this.iteration = this.dot.getNumIterations(); + this.tickLength = action.getDuration(trains) / Math.max(1, this.dot.getNumIterations()); } @Override @@ -82,7 +85,7 @@ public class DamageOverTimeJob extends AbstractEffectJob { } public int getTickLength() { - return this.dot.getNumIterations() * 1000; + return this.tickLength; } public int inc() { diff --git a/src/engine/jobs/TransferStatOTJob.java b/src/engine/jobs/TransferStatOTJob.java index bafe5ef2..26dcfb79 100644 --- a/src/engine/jobs/TransferStatOTJob.java +++ b/src/engine/jobs/TransferStatOTJob.java @@ -21,11 +21,15 @@ public class TransferStatOTJob extends AbstractEffectJob { private final TransferStatOTPowerAction dot; private int iteration = 0; + private final int tickLength; public TransferStatOTJob(AbstractWorldObject source, AbstractWorldObject target, String stackType, int trains, ActionsBase action, PowersBase power, EffectsBase eb, TransferStatOTPowerAction dot) { super(source, target, stackType, trains, action, power, eb); this.dot = dot; - this.iteration = action.getDurationInSeconds(trains) / this.dot.getNumIterations(); + + // PowerActions.cfg gives the tick count; the ticks split the action's duration + this.iteration = this.dot.getNumIterations(); + this.tickLength = action.getDuration(trains) / Math.max(1, this.dot.getNumIterations()); } @Override @@ -64,7 +68,7 @@ public class TransferStatOTJob extends AbstractEffectJob { } public int getTickLength() { - return this.dot.getNumIterations() * 1000; + return this.tickLength; } public int inc() { diff --git a/src/engine/parsers/objects/wpak/PowerActionTemplate.java b/src/engine/parsers/objects/wpak/PowerActionTemplate.java index 232263a9..67eef9ae 100644 --- a/src/engine/parsers/objects/wpak/PowerActionTemplate.java +++ b/src/engine/parsers/objects/wpak/PowerActionTemplate.java @@ -46,6 +46,15 @@ public class PowerActionTemplate { public String track_filter; public int max_track; + // Names from the old DB flags (1024, 2048, 16384, 32768); the client's use is unchecked + public boolean track_player; + public boolean track_corpse; + public boolean transfer_target_to_caster; + public boolean ignore_no_tele_spire; + + public float simple_damage_min; + public float simple_damage_max; + public mbEnums.CostType transfer_from_type; public mbEnums.CostType transfer_to_type; diff --git a/src/engine/parsers/wpak/PowerActionParser.java b/src/engine/parsers/wpak/PowerActionParser.java index 10ae3905..32f254c1 100644 --- a/src/engine/parsers/wpak/PowerActionParser.java +++ b/src/engine/parsers/wpak/PowerActionParser.java @@ -139,12 +139,21 @@ public class PowerActionParser { break; case Track: powerAction.effect_ids.add(header.token(2)); + powerAction.track_player = header.boolToken(3); + powerAction.track_corpse = header.boolToken(4); powerAction.track_filter = header.token(5); powerAction.max_track = header.intToken(7); break; case Transform: powerAction.effect_ids.add(header.token(2)); break; + case SimpleDamage: + powerAction.simple_damage_min = header.floatToken(2); + powerAction.simple_damage_max = header.floatToken(3); + break; + case Teleport: + powerAction.ignore_no_tele_spire = header.optionalBoolToken(2); + break; case TransferStat: parseTransferStat(powerAction, header); break; @@ -166,6 +175,7 @@ public class PowerActionParser { powerAction.transfer_amount_curve = WpakParserUtil.curveToken(header, 5); powerAction.transfer_efficiency = header.floatToken(6); powerAction.transfer_efficiency_curve = WpakParserUtil.curveToken(header, 7); + powerAction.transfer_target_to_caster = header.boolToken(8); powerAction.isaggressive = header.optionalIntToken(9) != 0; } diff --git a/src/engine/powers/poweractions/AbstractPowerAction.java b/src/engine/powers/poweractions/AbstractPowerAction.java index c223e343..49a0c17b 100644 --- a/src/engine/powers/poweractions/AbstractPowerAction.java +++ b/src/engine/powers/poweractions/AbstractPowerAction.java @@ -15,6 +15,7 @@ import engine.math.Vector3fImmutable; import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; import engine.objects.Item; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.EffectsBase; import engine.powers.PowersBase; @@ -54,6 +55,18 @@ public abstract class AbstractPowerAction { this.isAggressive = ((flags & 128) != 0) ? true : false; } + public AbstractPowerAction(PowerActionTemplate powerActionTemplate, int id) { + this.UUID = id; + this.IDString = powerActionTemplate.action_id; + this.type = powerActionTemplate.action_type.name(); + this.isAggressive = powerActionTemplate.isaggressive; + } + + // Empty when the action has no effect at that position, as the DB column default was + protected static String effectIDAt(PowerActionTemplate powerActionTemplate, int index) { + return (index < powerActionTemplate.effect_ids.size()) ? powerActionTemplate.effect_ids.get(index) : ""; + } + public AbstractPowerAction(int uUID, String iDString, String type, boolean isAggressive) { super(); UUID = uUID; diff --git a/src/engine/powers/poweractions/ApplyEffectPowerAction.java b/src/engine/powers/poweractions/ApplyEffectPowerAction.java index e6a18668..337eac71 100644 --- a/src/engine/powers/poweractions/ApplyEffectPowerAction.java +++ b/src/engine/powers/poweractions/ApplyEffectPowerAction.java @@ -21,6 +21,7 @@ import engine.mbEnums.ModType; import engine.mbEnums.SourceType; import engine.net.client.msg.chat.ChatSystemMsg; import engine.objects.*; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.EffectsBase; import engine.powers.PowersBase; @@ -46,6 +47,14 @@ public class ApplyEffectPowerAction extends AbstractPowerAction { this.effect = effects.get(this.effectID); } + public ApplyEffectPowerAction(PowerActionTemplate powerActionTemplate, int id, HashMap effects) { + super(powerActionTemplate, id); + this.effectParentID = powerActionTemplate.action_id; + this.effectParent = effects.get(this.effectParentID); + this.effectID = effectIDAt(powerActionTemplate, 0); + this.effect = effects.get(this.effectID); + } + private static boolean blockInvul(PowersBase pb, AbstractCharacter source, AbstractWorldObject awo) { if (awo == null || pb == null || source == null) return false; diff --git a/src/engine/powers/poweractions/ApplyEffectsPowerAction.java b/src/engine/powers/poweractions/ApplyEffectsPowerAction.java index cdfb4e29..51ee78da 100644 --- a/src/engine/powers/poweractions/ApplyEffectsPowerAction.java +++ b/src/engine/powers/poweractions/ApplyEffectsPowerAction.java @@ -14,6 +14,7 @@ import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; import engine.objects.Effect; import engine.objects.Item; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.EffectsBase; import engine.powers.PowersBase; @@ -43,6 +44,16 @@ public class ApplyEffectsPowerAction extends AbstractPowerAction { } + public ApplyEffectsPowerAction(PowerActionTemplate powerActionTemplate, int id, HashMap effects) { + super(powerActionTemplate, id); + this.IDString = powerActionTemplate.action_id; + this.effectID = effectIDAt(powerActionTemplate, 0); + this.effectID2 = effectIDAt(powerActionTemplate, 1); + this.effect = effects.get(this.effectID); + this.effect2 = effects.get(this.effectID2); + this.effectParent = effects.get(this.IDString); + } + public String getEffectID() { return this.effectID; } @@ -83,7 +94,8 @@ public class ApplyEffectsPowerAction extends AbstractPowerAction { return; } - if (this.effect2 == null) { + // PRE-334 to PRE-337 list a single effect + if (this.effect2 == null && !this.effectID2.isEmpty()) { Logger.error("Unknown Token: EffectBase ID " + this.effectID2 + '.'); return; } @@ -94,13 +106,14 @@ public class ApplyEffectsPowerAction extends AbstractPowerAction { } Effect eff = item.addEffectNoTimer(Integer.toString(this.effect.getUUID()), this.effect, trains, false); - Effect eff2 = item.addEffectNoTimer(Integer.toString(this.effect2.getUUID()), this.effect2, trains, false); + Effect eff2 = (this.effect2 == null) ? null : item.addEffectNoTimer(Integer.toString(this.effect2.getUUID()), this.effect2, trains, false); Effect eff3 = item.addEffectNoTimer(Integer.toString(this.effectParent.getUUID()), this.effectParent, trains, false); - if (eff != null && eff2 != null && eff3 != null) { + if (eff != null && (eff2 != null || this.effect2 == null) && eff3 != null) { eff3.setBakedInStat(true); item.getEffectNames().add(this.effect.getIDString()); - item.getEffectNames().add(this.effect2.getIDString()); + if (this.effect2 != null) + item.getEffectNames().add(this.effect2.getIDString()); item.getEffectNames().add(this.effectParent.getIDString()); } } diff --git a/src/engine/powers/poweractions/BlockPowerAction.java b/src/engine/powers/poweractions/BlockPowerAction.java index 22434495..a79fdac0 100644 --- a/src/engine/powers/poweractions/BlockPowerAction.java +++ b/src/engine/powers/poweractions/BlockPowerAction.java @@ -12,6 +12,7 @@ package engine.powers.poweractions; import engine.math.Vector3fImmutable; import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; @@ -25,6 +26,10 @@ public class BlockPowerAction extends AbstractPowerAction { super(rs); } + public BlockPowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + } + @Override protected void _startAction(AbstractCharacter source, AbstractWorldObject awo, Vector3fImmutable targetLoc, int trains, ActionsBase ab, PowersBase pb) { diff --git a/src/engine/powers/poweractions/CharmPowerAction.java b/src/engine/powers/poweractions/CharmPowerAction.java index c9e1f644..f16fee62 100644 --- a/src/engine/powers/poweractions/CharmPowerAction.java +++ b/src/engine/powers/poweractions/CharmPowerAction.java @@ -16,6 +16,8 @@ import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; import engine.objects.Mob; import engine.objects.PlayerCharacter; +import engine.parsers.objects.wpak.CurveRamp; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; @@ -34,6 +36,13 @@ public class CharmPowerAction extends AbstractPowerAction { this.levelCapRamp = rs.getFloat("levelCapRamp"); } + public CharmPowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + CurveRamp curveRamp = (powerActionTemplate.levelcap_curve == null) ? null : CurveRamp.fromCurve(powerActionTemplate.levelcap_curve); + this.levelCap = powerActionTemplate.levelcap; + this.levelCapRamp = (curveRamp == null) ? 0 : curveRamp.ramp; + } + @Override protected void _startAction(AbstractCharacter source, AbstractWorldObject awo, Vector3fImmutable targetLoc, int trains, ActionsBase ab, PowersBase pb) { diff --git a/src/engine/powers/poweractions/ClaimMinePowerAction.java b/src/engine/powers/poweractions/ClaimMinePowerAction.java index c41cdda6..561634d7 100644 --- a/src/engine/powers/poweractions/ClaimMinePowerAction.java +++ b/src/engine/powers/poweractions/ClaimMinePowerAction.java @@ -13,6 +13,7 @@ import engine.gameManager.ChatManager; import engine.math.Vector3fImmutable; import engine.mbEnums; import engine.objects.*; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; @@ -26,6 +27,10 @@ public class ClaimMinePowerAction extends AbstractPowerAction { super(rs); } + public ClaimMinePowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + } + @Override protected void _startAction(AbstractCharacter source, AbstractWorldObject worldObject, Vector3fImmutable targetLoc, int trains, ActionsBase ab, PowersBase pb) { diff --git a/src/engine/powers/poweractions/ClearAggroPowerAction.java b/src/engine/powers/poweractions/ClearAggroPowerAction.java index d1b32cf3..ca48d864 100644 --- a/src/engine/powers/poweractions/ClearAggroPowerAction.java +++ b/src/engine/powers/poweractions/ClearAggroPowerAction.java @@ -14,6 +14,7 @@ import engine.mbEnums.GameObjectType; import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; import engine.objects.Mob; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; @@ -27,6 +28,10 @@ public class ClearAggroPowerAction extends AbstractPowerAction { super(rs); } + public ClearAggroPowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + } + @Override protected void _startAction(AbstractCharacter source, AbstractWorldObject awo, Vector3fImmutable targetLoc, int trains, ActionsBase ab, PowersBase pb) { if (awo != null && awo.getObjectType() == GameObjectType.Mob) { diff --git a/src/engine/powers/poweractions/ClearNearbyAggroPowerAction.java b/src/engine/powers/poweractions/ClearNearbyAggroPowerAction.java index a2a12493..ab7e2017 100644 --- a/src/engine/powers/poweractions/ClearNearbyAggroPowerAction.java +++ b/src/engine/powers/poweractions/ClearNearbyAggroPowerAction.java @@ -13,6 +13,7 @@ import engine.math.Vector3fImmutable; import engine.mbEnums.GameObjectType; import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; @@ -26,6 +27,10 @@ public class ClearNearbyAggroPowerAction extends AbstractPowerAction { super(rs); } + public ClearNearbyAggroPowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + } + @Override protected void _startAction(AbstractCharacter source, AbstractWorldObject awo, Vector3fImmutable targetLoc, int trains, ActionsBase ab, PowersBase pb) { if (source.getObjectType() == GameObjectType.Mob) { diff --git a/src/engine/powers/poweractions/ConfusionPowerAction.java b/src/engine/powers/poweractions/ConfusionPowerAction.java index e959d80b..8a13eb76 100644 --- a/src/engine/powers/poweractions/ConfusionPowerAction.java +++ b/src/engine/powers/poweractions/ConfusionPowerAction.java @@ -12,6 +12,7 @@ package engine.powers.poweractions; import engine.math.Vector3fImmutable; import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; @@ -25,6 +26,10 @@ public class ConfusionPowerAction extends AbstractPowerAction { super(rs); } + public ConfusionPowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + } + @Override protected void _startAction(AbstractCharacter source, AbstractWorldObject awo, Vector3fImmutable targetLoc, int trains, ActionsBase ab, PowersBase pb) { diff --git a/src/engine/powers/poweractions/CreateMobPowerAction.java b/src/engine/powers/poweractions/CreateMobPowerAction.java index 875fd1c7..eb81aefd 100644 --- a/src/engine/powers/poweractions/CreateMobPowerAction.java +++ b/src/engine/powers/poweractions/CreateMobPowerAction.java @@ -20,19 +20,38 @@ import engine.net.Dispatch; import engine.net.client.ClientConnection; import engine.net.client.msg.PetMsg; import engine.objects.*; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; import org.pmw.tinylog.Logger; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.HashMap; public class CreateMobPowerAction extends AbstractPowerAction { + // PowerActions.cfg names the pet by a client object id that no MBDATA file maps; this is the old DB mapping + private static final HashMap MOBBASE_BY_CLIENT_MOB_ID = new HashMap<>(); + private int mobID; private int mobLevel; + static { + for (int clientMobID = 49; clientMobID <= 65; clientMobID++) + MOBBASE_BY_CLIENT_MOB_ID.put(clientMobID, 12000 + clientMobID - 49); + + MOBBASE_BY_CLIENT_MOB_ID.put(68, 12018); + MOBBASE_BY_CLIENT_MOB_ID.put(69, 12020); + MOBBASE_BY_CLIENT_MOB_ID.put(70, 12019); + MOBBASE_BY_CLIENT_MOB_ID.put(71, 12021); + MOBBASE_BY_CLIENT_MOB_ID.put(72, 12022); + MOBBASE_BY_CLIENT_MOB_ID.put(74, 12023); + MOBBASE_BY_CLIENT_MOB_ID.put(3500, 11999); + MOBBASE_BY_CLIENT_MOB_ID.put(3501, 11998); + } + public CreateMobPowerAction(ResultSet rs) throws SQLException { super(rs); @@ -40,6 +59,18 @@ public class CreateMobPowerAction extends AbstractPowerAction { this.mobLevel = rs.getInt("mobLevel"); } + public CreateMobPowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + + Integer mobBaseID = MOBBASE_BY_CLIENT_MOB_ID.get(powerActionTemplate.mob_id); + + if (mobBaseID == null) + Logger.error("Power action " + powerActionTemplate.action_id + ": no mobbase for client mob " + powerActionTemplate.mob_id); + + this.mobID = (mobBaseID == null) ? 0 : mobBaseID; + this.mobLevel = powerActionTemplate.mob_level; + } + public int getMobID() { return this.mobID; } diff --git a/src/engine/powers/poweractions/DamageOverTimePowerAction.java b/src/engine/powers/poweractions/DamageOverTimePowerAction.java index ba2f9f67..df87c845 100644 --- a/src/engine/powers/poweractions/DamageOverTimePowerAction.java +++ b/src/engine/powers/poweractions/DamageOverTimePowerAction.java @@ -13,6 +13,7 @@ import engine.jobs.DamageOverTimeJob; import engine.math.Vector3fImmutable; import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.EffectsBase; import engine.powers.PowersBase; @@ -36,6 +37,14 @@ public class DamageOverTimePowerAction extends AbstractPowerAction { this.effect = effects.get(this.effectID); } + public DamageOverTimePowerAction(PowerActionTemplate powerActionTemplate, int id, HashMap effects) { + super(powerActionTemplate, id); + + this.effectID = effectIDAt(powerActionTemplate, 0); + this.numIterations = powerActionTemplate.num_iterations; + this.effect = effects.get(this.effectID); + } + public String getEffectID() { return this.effectID; } diff --git a/src/engine/powers/poweractions/DeferredPowerPowerAction.java b/src/engine/powers/poweractions/DeferredPowerPowerAction.java index 74c93897..a1dce2f9 100644 --- a/src/engine/powers/poweractions/DeferredPowerPowerAction.java +++ b/src/engine/powers/poweractions/DeferredPowerPowerAction.java @@ -15,6 +15,7 @@ import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; import engine.objects.Mob; import engine.objects.PlayerCharacter; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.EffectsBase; import engine.powers.PowersBase; @@ -39,6 +40,14 @@ public class DeferredPowerPowerAction extends AbstractPowerAction { this.effect = effects.get(this.effectID); } + public DeferredPowerPowerAction(PowerActionTemplate powerActionTemplate, int id, HashMap effects) { + super(powerActionTemplate, id); + + this.effectID = effectIDAt(powerActionTemplate, 0); + this.deferedPowerID = powerActionTemplate.deferred_power_id; + this.effect = effects.get(this.effectID); + } + public String getEffectID() { return this.effectID; } diff --git a/src/engine/powers/poweractions/DirectDamagePowerAction.java b/src/engine/powers/poweractions/DirectDamagePowerAction.java index aad504a2..e24b89bf 100644 --- a/src/engine/powers/poweractions/DirectDamagePowerAction.java +++ b/src/engine/powers/poweractions/DirectDamagePowerAction.java @@ -14,6 +14,7 @@ import engine.jobs.PersistentAoeJob; import engine.math.Vector3fImmutable; import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.EffectsBase; import engine.powers.PowersBase; @@ -35,6 +36,13 @@ public class DirectDamagePowerAction extends AbstractPowerAction { this.effect = effects.get(this.effectID); } + public DirectDamagePowerAction(PowerActionTemplate powerActionTemplate, int id, HashMap effects) { + super(powerActionTemplate, id); + + this.effectID = effectIDAt(powerActionTemplate, 0); + this.effect = effects.get(this.effectID); + } + public String getEffectID() { return this.effectID; } diff --git a/src/engine/powers/poweractions/FearPowerAction.java b/src/engine/powers/poweractions/FearPowerAction.java index 91a62d2b..97e8d8c5 100644 --- a/src/engine/powers/poweractions/FearPowerAction.java +++ b/src/engine/powers/poweractions/FearPowerAction.java @@ -18,6 +18,8 @@ import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; import engine.objects.Mob; import engine.objects.PlayerCharacter; +import engine.parsers.objects.wpak.CurveRamp; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; @@ -35,6 +37,13 @@ public class FearPowerAction extends AbstractPowerAction { this.levelCapRamp = rs.getFloat("levelCapRamp"); } + public FearPowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + CurveRamp curveRamp = (powerActionTemplate.levelcap_curve == null) ? null : CurveRamp.fromCurve(powerActionTemplate.levelcap_curve); + this.levelCap = powerActionTemplate.levelcap; + this.levelCapRamp = (curveRamp == null) ? 0 : curveRamp.ramp; + } + @Override protected void _startAction(AbstractCharacter source, AbstractWorldObject awo, Vector3fImmutable targetLoc, int trains, ActionsBase ab, PowersBase pb) { if (source == null || awo == null || !(awo.getObjectType().equals(mbEnums.GameObjectType.Mob)) || !(source.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter))) diff --git a/src/engine/powers/poweractions/InvisPowerAction.java b/src/engine/powers/poweractions/InvisPowerAction.java index 1065400f..8282a40c 100644 --- a/src/engine/powers/poweractions/InvisPowerAction.java +++ b/src/engine/powers/poweractions/InvisPowerAction.java @@ -13,6 +13,7 @@ import engine.jobs.FinishEffectTimeJob; import engine.math.Vector3fImmutable; import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.EffectsBase; import engine.powers.PowersBase; @@ -34,6 +35,13 @@ public class InvisPowerAction extends AbstractPowerAction { this.effect = effects.get(this.effectID); } + public InvisPowerAction(PowerActionTemplate powerActionTemplate, int id, HashMap effects) { + super(powerActionTemplate, id); + + this.effectID = effectIDAt(powerActionTemplate, 0); + this.effect = effects.get(this.effectID); + } + public String getEffectID() { return this.effectID; } diff --git a/src/engine/powers/poweractions/MobRecallPowerAction.java b/src/engine/powers/poweractions/MobRecallPowerAction.java index af52680b..a351ed58 100644 --- a/src/engine/powers/poweractions/MobRecallPowerAction.java +++ b/src/engine/powers/poweractions/MobRecallPowerAction.java @@ -15,6 +15,7 @@ import engine.mbEnums.GameObjectType; import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; import engine.objects.Mob; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; @@ -28,6 +29,10 @@ public class MobRecallPowerAction extends AbstractPowerAction { super(rs); } + public MobRecallPowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + } + @Override protected void _startAction(AbstractCharacter source, AbstractWorldObject awo, Vector3fImmutable targetLoc, int trains, ActionsBase ab, PowersBase pb) { if (!AbstractWorldObject.IsAbstractCharacter(awo) || source == null) diff --git a/src/engine/powers/poweractions/OpenGatePowerAction.java b/src/engine/powers/poweractions/OpenGatePowerAction.java index f45d2902..1e8d7248 100644 --- a/src/engine/powers/poweractions/OpenGatePowerAction.java +++ b/src/engine/powers/poweractions/OpenGatePowerAction.java @@ -17,6 +17,7 @@ import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; import engine.objects.Building; import engine.objects.Runegate; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; @@ -32,6 +33,10 @@ public class OpenGatePowerAction extends AbstractPowerAction { super(rs); } + public OpenGatePowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + } + public OpenGatePowerAction(int uUID, String iDString, String type, boolean isAggressive) { super(uUID, iDString, type, isAggressive); // TODO Auto-generated constructor stub diff --git a/src/engine/powers/poweractions/PeekPowerAction.java b/src/engine/powers/poweractions/PeekPowerAction.java index f013db01..2a32d187 100644 --- a/src/engine/powers/poweractions/PeekPowerAction.java +++ b/src/engine/powers/poweractions/PeekPowerAction.java @@ -16,6 +16,7 @@ import engine.mbEnums; import engine.net.Dispatch; import engine.net.client.msg.LootWindowResponseMsg; import engine.objects.*; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; @@ -30,6 +31,10 @@ public class PeekPowerAction extends AbstractPowerAction { super(rs); } + public PeekPowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + } + protected static boolean peekSuccess(AbstractCharacter pc, AbstractWorldObject awo) { if (pc == null || awo == null || !AbstractWorldObject.IsAbstractCharacter(awo) || pc.getPowers() == null) return false; diff --git a/src/engine/powers/poweractions/RecallPowerAction.java b/src/engine/powers/poweractions/RecallPowerAction.java index 4d1eb952..db008adc 100644 --- a/src/engine/powers/poweractions/RecallPowerAction.java +++ b/src/engine/powers/poweractions/RecallPowerAction.java @@ -22,6 +22,7 @@ import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; import engine.objects.Mob; import engine.objects.PlayerCharacter; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; import engine.server.MBServerStatics; @@ -36,6 +37,10 @@ public class RecallPowerAction extends AbstractPowerAction { super(rs); } + public RecallPowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + } + @Override protected void _startAction(AbstractCharacter source, AbstractWorldObject awo, Vector3fImmutable targetLoc, int trains, ActionsBase ab, PowersBase pb) { if (!AbstractWorldObject.IsAbstractCharacter(awo) || source == null) diff --git a/src/engine/powers/poweractions/RemoveEffectPowerAction.java b/src/engine/powers/poweractions/RemoveEffectPowerAction.java index c53c44ed..ae3a9195 100644 --- a/src/engine/powers/poweractions/RemoveEffectPowerAction.java +++ b/src/engine/powers/poweractions/RemoveEffectPowerAction.java @@ -13,6 +13,7 @@ import engine.math.Vector3fImmutable; import engine.mbEnums.EffectSourceType; import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; @@ -34,6 +35,13 @@ public class RemoveEffectPowerAction extends AbstractPowerAction { this.removeAll = ((flags & 2) != 0) ? true : false; } + public RemoveEffectPowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + String effectTypeToRemove = powerActionTemplate.effect_source_to_remove.replace("-", "").trim(); + sourceType = EffectSourceType.GetEffectSourceType(effectTypeToRemove); + this.removeAll = powerActionTemplate.removeall; + } + @Override protected void _startAction(AbstractCharacter source, AbstractWorldObject awo, Vector3fImmutable targetLoc, int trains, ActionsBase ab, PowersBase pb) { diff --git a/src/engine/powers/poweractions/ResurrectPowerAction.java b/src/engine/powers/poweractions/ResurrectPowerAction.java index ffccd8a0..1cbe6643 100644 --- a/src/engine/powers/poweractions/ResurrectPowerAction.java +++ b/src/engine/powers/poweractions/ResurrectPowerAction.java @@ -12,6 +12,7 @@ package engine.powers.poweractions; import engine.math.Vector3fImmutable; import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; @@ -25,6 +26,10 @@ public class ResurrectPowerAction extends AbstractPowerAction { super(rs); } + public ResurrectPowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + } + @Override protected void _startAction(AbstractCharacter source, AbstractWorldObject awo, Vector3fImmutable targetLoc, int trains, ActionsBase ab, PowersBase pb) { diff --git a/src/engine/powers/poweractions/RunegateTeleportPowerAction.java b/src/engine/powers/poweractions/RunegateTeleportPowerAction.java index 71569c94..58724028 100644 --- a/src/engine/powers/poweractions/RunegateTeleportPowerAction.java +++ b/src/engine/powers/poweractions/RunegateTeleportPowerAction.java @@ -15,6 +15,7 @@ import engine.mbEnums; import engine.net.Dispatch; import engine.net.client.msg.PromptRecallMsg; import engine.objects.*; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; @@ -33,6 +34,10 @@ public class RunegateTeleportPowerAction extends AbstractPowerAction { super(rs); } + public RunegateTeleportPowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + } + @Override protected void _startAction(AbstractCharacter source, AbstractWorldObject awo, Vector3fImmutable targetLoc, int trains, ActionsBase ab, PowersBase pb) { diff --git a/src/engine/powers/poweractions/SetItemFlagPowerAction.java b/src/engine/powers/poweractions/SetItemFlagPowerAction.java index cb0fe0bb..3ad5670d 100644 --- a/src/engine/powers/poweractions/SetItemFlagPowerAction.java +++ b/src/engine/powers/poweractions/SetItemFlagPowerAction.java @@ -16,6 +16,7 @@ import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; import engine.objects.CharacterItemManager; import engine.objects.Item; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; @@ -29,6 +30,10 @@ public class SetItemFlagPowerAction extends AbstractPowerAction { super(rs); } + public SetItemFlagPowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + } + @Override protected void _startAction(AbstractCharacter source, AbstractWorldObject awo, Vector3fImmutable targetLoc, int trains, ActionsBase ab, PowersBase pb) { diff --git a/src/engine/powers/poweractions/SimpleDamagePowerAction.java b/src/engine/powers/poweractions/SimpleDamagePowerAction.java index 7ce70b01..f6e1d40c 100644 --- a/src/engine/powers/poweractions/SimpleDamagePowerAction.java +++ b/src/engine/powers/poweractions/SimpleDamagePowerAction.java @@ -12,6 +12,7 @@ package engine.powers.poweractions; import engine.math.Vector3fImmutable; import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; @@ -21,16 +22,26 @@ import java.sql.SQLException; public class SimpleDamagePowerAction extends AbstractPowerAction { - private int simpleDamage; + private float minDamage; + private float maxDamage; public SimpleDamagePowerAction(ResultSet rs) throws SQLException { super(rs); - - this.simpleDamage = rs.getInt("simpleDamage"); } - public int getSimpleDamage() { - return this.simpleDamage; + public SimpleDamagePowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + + this.minDamage = powerActionTemplate.simple_damage_min; + this.maxDamage = powerActionTemplate.simple_damage_max; + } + + public float getMinDamage() { + return this.minDamage; + } + + public float getMaxDamage() { + return this.maxDamage; } @Override diff --git a/src/engine/powers/poweractions/SpireDisablePowerAction.java b/src/engine/powers/poweractions/SpireDisablePowerAction.java index 4edd05ae..2d81cd9c 100644 --- a/src/engine/powers/poweractions/SpireDisablePowerAction.java +++ b/src/engine/powers/poweractions/SpireDisablePowerAction.java @@ -17,6 +17,7 @@ import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; import engine.objects.Building; import engine.objects.PlayerCharacter; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; @@ -32,6 +33,10 @@ public class SpireDisablePowerAction extends AbstractPowerAction { super(rs); } + public SpireDisablePowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + } + @Override protected void _startAction(AbstractCharacter source, AbstractWorldObject awo, Vector3fImmutable targetLoc, int trains, ActionsBase ab, PowersBase pb) { if (awo == null) diff --git a/src/engine/powers/poweractions/StealPowerAction.java b/src/engine/powers/poweractions/StealPowerAction.java index 5c9cb2c9..4df47c5d 100644 --- a/src/engine/powers/poweractions/StealPowerAction.java +++ b/src/engine/powers/poweractions/StealPowerAction.java @@ -19,6 +19,7 @@ import engine.net.Dispatch; import engine.net.client.ClientConnection; import engine.net.client.msg.LootMsg; import engine.objects.*; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; import engine.server.MBServerStatics; @@ -39,6 +40,10 @@ public class StealPowerAction extends AbstractPowerAction { super(rs); } + public StealPowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + } + protected static boolean stealSuccess(PlayerCharacter pc, AbstractWorldObject awo) { if (pc == null || awo == null || !AbstractWorldObject.IsAbstractCharacter(awo) || pc.getPowers() == null) return false; diff --git a/src/engine/powers/poweractions/SummonPowerAction.java b/src/engine/powers/poweractions/SummonPowerAction.java index 2970fde8..a0379af7 100644 --- a/src/engine/powers/poweractions/SummonPowerAction.java +++ b/src/engine/powers/poweractions/SummonPowerAction.java @@ -21,6 +21,7 @@ import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; import engine.objects.PlayerCharacter; import engine.objects.Zone; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; @@ -36,6 +37,10 @@ public class SummonPowerAction extends AbstractPowerAction { super(rs); } + public SummonPowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + } + @Override protected void _startAction(AbstractCharacter source, AbstractWorldObject awo, Vector3fImmutable targetLoc, int trains, ActionsBase ab, PowersBase pb) { diff --git a/src/engine/powers/poweractions/TeleportPowerAction.java b/src/engine/powers/poweractions/TeleportPowerAction.java index 10f87a71..fbde8b06 100644 --- a/src/engine/powers/poweractions/TeleportPowerAction.java +++ b/src/engine/powers/poweractions/TeleportPowerAction.java @@ -17,6 +17,7 @@ import engine.mbEnums; import engine.mbEnums.ModType; import engine.mbEnums.SourceType; import engine.objects.*; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; import engine.powers.effectmodifiers.AbstractEffectModifier; @@ -37,6 +38,12 @@ public class TeleportPowerAction extends AbstractPowerAction { this.ignoreNoTeleSpire = ((flags & 32768) != 0) ? true : false; } + public TeleportPowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + + this.ignoreNoTeleSpire = powerActionTemplate.ignore_no_tele_spire; + } + private static void failTeleport(PowersBase pb, AbstractCharacter awo) { if (pb == null || awo == null || (!(awo.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)))) diff --git a/src/engine/powers/poweractions/TrackPowerAction.java b/src/engine/powers/poweractions/TrackPowerAction.java index 83aa0d4e..1f948672 100644 --- a/src/engine/powers/poweractions/TrackPowerAction.java +++ b/src/engine/powers/poweractions/TrackPowerAction.java @@ -13,6 +13,7 @@ import engine.jobs.TrackJob; import engine.math.Vector3fImmutable; import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.EffectsBase; import engine.powers.PowersBase; @@ -56,6 +57,24 @@ public class TrackPowerAction extends AbstractPowerAction { this.effect = effects.get(this.effectID); } + public TrackPowerAction(PowerActionTemplate powerActionTemplate, int id, HashMap effects) { + super(powerActionTemplate, id); + + this.effectID = effectIDAt(powerActionTemplate, 0); + this.trackPlayer = powerActionTemplate.track_player; + this.trackCorpse = powerActionTemplate.track_corpse; + String trackFilter = powerActionTemplate.track_filter; + this.trackAll = trackFilter.equals("All") ? true : false; + this.trackDragon = trackFilter.equals("Dragon") ? true : false; + this.trackGiant = trackFilter.equals("Giant") ? true : false; + this.trackNPC = trackFilter.equals("NPC") ? true : false; + this.trackUndead = trackFilter.equals("Undead") ? true : false; + this.trackVampire = trackFilter.equals("Vampire") ? true : false; + + this.maxTrack = powerActionTemplate.max_track; + this.effect = effects.get(this.effectID); + } + public String getEffectID() { return this.effectID; } diff --git a/src/engine/powers/poweractions/TransferStatOTPowerAction.java b/src/engine/powers/poweractions/TransferStatOTPowerAction.java index 418984a3..c05a78b9 100644 --- a/src/engine/powers/poweractions/TransferStatOTPowerAction.java +++ b/src/engine/powers/poweractions/TransferStatOTPowerAction.java @@ -14,6 +14,7 @@ import engine.math.Vector3f; import engine.math.Vector3fImmutable; import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.EffectsBase; import engine.powers.PowersBase; @@ -33,6 +34,12 @@ public class TransferStatOTPowerAction extends TransferStatPowerAction { this.numIterations = rs.getInt("numIterations"); } + public TransferStatOTPowerAction(PowerActionTemplate powerActionTemplate, int id, HashMap effects) { + super(powerActionTemplate, id, effects); + + this.numIterations = powerActionTemplate.num_iterations; + } + public int getNumIterations() { return this.numIterations; } diff --git a/src/engine/powers/poweractions/TransferStatPowerAction.java b/src/engine/powers/poweractions/TransferStatPowerAction.java index c8cb44ad..6ae92ab6 100644 --- a/src/engine/powers/poweractions/TransferStatPowerAction.java +++ b/src/engine/powers/poweractions/TransferStatPowerAction.java @@ -18,6 +18,8 @@ import engine.net.AbstractNetMsg; import engine.net.client.msg.ModifyHealthKillMsg; import engine.net.client.msg.ModifyHealthMsg; import engine.objects.*; +import engine.parsers.objects.wpak.CurveRamp; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.EffectsBase; import engine.powers.PowersBase; @@ -84,6 +86,37 @@ public class TransferStatPowerAction extends AbstractPowerAction { } } + public TransferStatPowerAction(PowerActionTemplate powerActionTemplate, int id, HashMap effects) { + super(powerActionTemplate, id); + CurveRamp amountRamp = CurveRamp.fromCurve(powerActionTemplate.transfer_amount_curve); + CurveRamp efficiencyRamp = CurveRamp.fromCurve(powerActionTemplate.transfer_efficiency_curve); + + // TransferStatOT names its effect in the header, TransferStat with EFFECTID= + if (!powerActionTemplate.effect_ids.isEmpty()) + this.effectID = powerActionTemplate.effect_ids.get(0); + else + this.effectID = (powerActionTemplate.effectid == null) ? "" : powerActionTemplate.effectid; + + this.transferFromHealth = powerActionTemplate.transfer_from_type == mbEnums.CostType.HEALTH; + this.transferFromMana = powerActionTemplate.transfer_from_type == mbEnums.CostType.MANA; + this.transferFromStamina = !this.transferFromHealth && !this.transferFromMana; + this.transferToHealth = powerActionTemplate.transfer_to_type == mbEnums.CostType.HEALTH; + this.transferToMana = powerActionTemplate.transfer_to_type == mbEnums.CostType.MANA; + this.transferToStamina = !this.transferToHealth && !this.transferToMana; + + // The client reads both with String::ToInt (0x56ADF0), so 31.5 acts as 31 + this.transferAmount = (int) powerActionTemplate.transfer_amount; + this.transferEfficiency = (int) powerActionTemplate.transfer_efficiency; + + this.transferRamp = (amountRamp == null) ? 0 : amountRamp.ramp; + this.transferRampAdd = amountRamp == null || amountRamp.useAdd; + this.transferEfficiencyRamp = (efficiencyRamp == null) ? 0 : efficiencyRamp.ramp; + this.transferEfficiencyRampAdd = efficiencyRamp == null || efficiencyRamp.useAdd; + this.targetToCaster = powerActionTemplate.transfer_target_to_caster; + this.damageType = powerActionTemplate.damagetype; + this.effect = effects.get(this.effectID); + } + public String getEffectID() { return this.effectID; } diff --git a/src/engine/powers/poweractions/TransformPowerAction.java b/src/engine/powers/poweractions/TransformPowerAction.java index e9ca9212..09ebf974 100644 --- a/src/engine/powers/poweractions/TransformPowerAction.java +++ b/src/engine/powers/poweractions/TransformPowerAction.java @@ -13,6 +13,7 @@ import engine.jobs.FinishEffectTimeJob; import engine.math.Vector3fImmutable; import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.EffectsBase; import engine.powers.PowersBase; @@ -34,6 +35,13 @@ public class TransformPowerAction extends AbstractPowerAction { this.effect = effects.get(this.effectID); } + public TransformPowerAction(PowerActionTemplate powerActionTemplate, int id, HashMap effects) { + super(powerActionTemplate, id); + + this.effectID = effectIDAt(powerActionTemplate, 0); + this.effect = effects.get(this.effectID); + } + public String getEffectID() { return this.effectID; } diff --git a/src/engine/powers/poweractions/TreeChokePowerAction.java b/src/engine/powers/poweractions/TreeChokePowerAction.java index 30087cb2..4dc801e3 100644 --- a/src/engine/powers/poweractions/TreeChokePowerAction.java +++ b/src/engine/powers/poweractions/TreeChokePowerAction.java @@ -12,6 +12,7 @@ package engine.powers.poweractions; import engine.math.Vector3fImmutable; import engine.objects.AbstractCharacter; import engine.objects.AbstractWorldObject; +import engine.parsers.objects.wpak.PowerActionTemplate; import engine.powers.ActionsBase; import engine.powers.PowersBase; @@ -25,6 +26,10 @@ public class TreeChokePowerAction extends AbstractPowerAction { super(rs); } + public TreeChokePowerAction(PowerActionTemplate powerActionTemplate, int id) { + super(powerActionTemplate, id); + } + @Override protected void _startAction(AbstractCharacter source, AbstractWorldObject awo, Vector3fImmutable targetLoc, int trains, ActionsBase ab, PowersBase pb) {