Decoupled client-side code from Actioneer

Created SpellcastEvent and SpellcastHandler to handle client-side effects
This commit is contained in:
Collin Smith 2020-08-21 01:42:08 -07:00
parent e42288f8f6
commit a1bc6c48fb
4 changed files with 48 additions and 13 deletions

View File

@ -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);
}
}
}

View File

@ -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<Class> mClass;
protected ComponentMapper<Sequence> mSequence;
protected ComponentMapper<MovementModes> 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));
}
}

View File

@ -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;
}
}

View File

@ -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
}