diff --git a/core/src/com/riiablo/engine/Engine.java b/core/src/com/riiablo/engine/Engine.java index 4c8e0531..642af1c6 100644 --- a/core/src/com/riiablo/engine/Engine.java +++ b/core/src/com/riiablo/engine/Engine.java @@ -37,6 +37,20 @@ public class Engine { return COMPOSITE_NAME[component]; } + public static final byte KEYFRAME_NIL = 0; + public static final byte KEYFRAME_ATK = 1; + public static final byte KEYFRAME_MIS = 2; + public static final byte KEYFRAME_SND = 3; + public static final byte KEYFRAME_SKL = 4; + + private static final String[] KEYFRAME_NAME = { + "", "ATK", "MIS", "SND", "SKL" + }; + + public static String getKeyframe(byte keyframe) { + return KEYFRAME_NAME[keyframe]; + } + public static final class Object { public static final int SUBCLASS_SHRINE = 1 << 0; // displays " Shrine" public static final int SUBCLASS_OBELISH = 1 << 1; // does nothing diff --git a/core/src/com/riiablo/engine/server/Actioneer.java b/core/src/com/riiablo/engine/server/Actioneer.java index a79f3d82..849fdb15 100644 --- a/core/src/com/riiablo/engine/server/Actioneer.java +++ b/core/src/com/riiablo/engine/server/Actioneer.java @@ -4,13 +4,16 @@ import org.apache.logging.log4j.Logger; import com.artemis.ComponentMapper; import net.mostlyoriginal.api.event.common.EventSystem; +import net.mostlyoriginal.api.event.common.Subscribe; import net.mostlyoriginal.api.system.core.PassiveSystem; import com.riiablo.Riiablo; import com.riiablo.codec.excel.Skills; +import com.riiablo.engine.Engine; import com.riiablo.engine.server.component.Class; import com.riiablo.engine.server.component.MovementModes; import com.riiablo.engine.server.component.Sequence; +import com.riiablo.engine.server.event.AnimDataKeyframeEvent; import com.riiablo.engine.server.event.SkillCastEvent; import com.riiablo.log.LogManager; @@ -42,6 +45,12 @@ public class Actioneer extends PassiveSystem { srvstfunc(entityId, skill.srvstfunc); } + @Subscribe + public void onKeyframe(AnimDataKeyframeEvent event) { + log.debug("onKeyframe: {}, {} ({})", event.entityId, event.keyframe, Engine.getKeyframe(event.keyframe)); + // if isCasting(id): srvdofunc(id, spell.srcdofunc) + } + // start func private void srvstfunc(int entityId, int srvstfunc) { log.trace("srvstfunc({},{})", entityId, srvstfunc); diff --git a/core/src/com/riiablo/engine/server/AnimStepper.java b/core/src/com/riiablo/engine/server/AnimStepper.java index 4c6f1230..554567c9 100644 --- a/core/src/com/riiablo/engine/server/AnimStepper.java +++ b/core/src/com/riiablo/engine/server/AnimStepper.java @@ -1,16 +1,23 @@ package com.riiablo.engine.server; +import org.apache.logging.log4j.Logger; + import com.artemis.ComponentMapper; import com.artemis.annotations.All; import com.artemis.systems.IntervalIteratingSystem; +import net.mostlyoriginal.api.event.common.EventSystem; + import com.riiablo.codec.Animation; +import com.riiablo.engine.Engine; import com.riiablo.engine.server.component.AnimData; import com.riiablo.engine.server.event.AnimDataFinishedEvent; - -import net.mostlyoriginal.api.event.common.EventSystem; +import com.riiablo.engine.server.event.AnimDataKeyframeEvent; +import com.riiablo.log.LogManager; @All(AnimData.class) public class AnimStepper extends IntervalIteratingSystem { + private static final Logger log = LogManager.getLogger(AnimStepper.class); + protected ComponentMapper mAnimData; protected EventSystem events; @@ -27,5 +34,11 @@ public class AnimStepper extends IntervalIteratingSystem { animData.frame -= animData.numFrames; events.dispatch(AnimDataFinishedEvent.obtain(entityId)); } + + final byte keyframe = animData.keyframes[animData.frame >>> 8]; + if (keyframe > Engine.KEYFRAME_NIL) { + log.debug("broadcasting AnimDataKeyframeEvent({},{})", entityId, Engine.getKeyframe(keyframe)); + events.dispatch(AnimDataKeyframeEvent.obtain(entityId, keyframe)); + } } } diff --git a/core/src/com/riiablo/engine/server/event/AnimDataKeyframeEvent.java b/core/src/com/riiablo/engine/server/event/AnimDataKeyframeEvent.java new file mode 100644 index 00000000..8d58254c --- /dev/null +++ b/core/src/com/riiablo/engine/server/event/AnimDataKeyframeEvent.java @@ -0,0 +1,18 @@ +package com.riiablo.engine.server.event; + +import com.artemis.annotations.EntityId; +import net.mostlyoriginal.api.event.common.Event; + +public class AnimDataKeyframeEvent implements Event { + @EntityId + public int entityId; + + public byte keyframe; + + public static AnimDataKeyframeEvent obtain(int entityId, byte keyframe) { + AnimDataKeyframeEvent event = new AnimDataKeyframeEvent(); + event.entityId = entityId; + event.keyframe = keyframe; + return event; + } +}