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) {