diff --git a/core/src/com/riiablo/engine/client/SpellcastHandler.java b/core/src/com/riiablo/engine/client/SpellcastHandler.java new file mode 100644 index 00000000..323ead8b --- /dev/null +++ b/core/src/com/riiablo/engine/client/SpellcastHandler.java @@ -0,0 +1,24 @@ +package com.riiablo.engine.client; + +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.server.event.SpellcastEvent; + +public class SpellcastHandler extends PassiveSystem { + protected OverlayManager overlays; + + @Subscribe + public void onSpellcast(SpellcastEvent event) { + final Skills.Entry skill = Riiablo.files.skills.get(event.skillId); + + Riiablo.audio.play(skill.stsound, true); + + if (!skill.castoverlay.isEmpty()) { + overlays.set(event.entityId, skill.castoverlay); + } + } + +} diff --git a/core/src/com/riiablo/engine/server/Actioneer.java b/core/src/com/riiablo/engine/server/Actioneer.java index 35c5adc8..216c2242 100644 --- a/core/src/com/riiablo/engine/server/Actioneer.java +++ b/core/src/com/riiablo/engine/server/Actioneer.java @@ -3,26 +3,26 @@ package com.riiablo.engine.server; import org.apache.logging.log4j.Logger; import com.artemis.ComponentMapper; +import net.mostlyoriginal.api.event.common.EventSystem; import net.mostlyoriginal.api.system.core.PassiveSystem; import com.riiablo.Riiablo; import com.riiablo.codec.excel.Skills; -import com.riiablo.engine.client.OverlayManager; 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.SpellcastEvent; import com.riiablo.log.LogManager; public class Actioneer extends PassiveSystem { private static final Logger log = LogManager.getLogger(Actioneer.class); - protected OverlayManager overlays; - protected ComponentMapper mClass; protected ComponentMapper mSequence; protected ComponentMapper mMovementModes; - // TODO: much of this should be split into different systems or events (e.g., onSpellCast) + protected EventSystem events; + public void cast(int entityId, int skillId) { if (mSequence.has(entityId)) return; final Skills.Entry skill = Riiablo.files.skills.get(skillId); @@ -36,13 +36,6 @@ public class Actioneer extends PassiveSystem { } mSequence.create(entityId).sequence(mode, mMovementModes.get(entityId).NU); - - // FIXME: below uses client-side-only code -- may change to event-based model - // does server even need to care about overlays? - Riiablo.audio.play(skill.stsound, true); - - if (!skill.castoverlay.isEmpty()) { - overlays.set(entityId, skill.castoverlay); - } + events.dispatch(SpellcastEvent.obtain(entityId, skillId)); } } diff --git a/core/src/com/riiablo/engine/server/event/SpellcastEvent.java b/core/src/com/riiablo/engine/server/event/SpellcastEvent.java new file mode 100644 index 00000000..7730ef85 --- /dev/null +++ b/core/src/com/riiablo/engine/server/event/SpellcastEvent.java @@ -0,0 +1,17 @@ +package com.riiablo.engine.server.event; + +import com.artemis.annotations.EntityId; +import net.mostlyoriginal.api.event.common.Event; + +public class SpellcastEvent implements Event { + @EntityId + public int entityId; + public int skillId; + + public static SpellcastEvent obtain(int entityId, int skillId) { + SpellcastEvent event = new SpellcastEvent(); + event.entityId = entityId; + event.skillId = skillId; + return event; + } +} diff --git a/core/src/com/riiablo/screen/GameScreen.java b/core/src/com/riiablo/screen/GameScreen.java index 748a952e..393530a6 100644 --- a/core/src/com/riiablo/screen/GameScreen.java +++ b/core/src/com/riiablo/screen/GameScreen.java @@ -73,6 +73,7 @@ import com.riiablo.engine.client.OverlayManager; import com.riiablo.engine.client.OverlayStepper; import com.riiablo.engine.client.SelectableManager; import com.riiablo.engine.client.SoundEmitterHandler; +import com.riiablo.engine.client.SpellcastHandler; import com.riiablo.engine.client.WarpSubstManager; import com.riiablo.engine.client.ZoneChangeTracker; import com.riiablo.engine.client.ZoneEntryDisplayer; @@ -570,8 +571,8 @@ public class GameScreen extends ScreenAdapter implements GameLoadingScreen.Loada ; if (!DEBUG_TOUCHPAD && Gdx.app.getType() == Application.ApplicationType.Desktop) { builder.with(new CursorMovementSystem()); - /** FIXME: below is tightly coupled with client-side-only code {@link Actioneer#cast} */ builder.with(new Actioneer()); // TODO: move to more appropriate spot in list + builder.with(new SpellcastHandler()); // TODO: move to more appropriate spot in list builder.with(new OverlayManager()); // TODO: move to more appropriate spot in list builder.with(new OverlayStepper()); // TODO: move to more appropriate spot in list }