Skip to content

Commit

Permalink
Provide explicit resurrection listener for CombatEntity.
Browse files Browse the repository at this point in the history
- Fix issue where death and hit events were not fired on registered CombatEntityListeners.
- Streamline API for removing listeners: Adjust method name to "removeListener" where possible.
  • Loading branch information
steffen-wilke committed Jan 4, 2021
1 parent e87f708 commit 63fb8cf
Show file tree
Hide file tree
Showing 8 changed files with 80 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public void onChanged(ConfigurationChangedListener listener) {
this.listeners.add(listener);
}

public void removeChangedListener(ConfigurationChangedListener listener) {
public void removeListener(ConfigurationChangedListener listener) {
this.listeners.remove(listener);
}

Expand Down
65 changes: 42 additions & 23 deletions src/de/gurkenlabs/litiengine/entities/CombatEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,12 @@
public class CombatEntity extends CollisionEntity implements ICombatEntity {
public static final int DEFAULT_HITPOINTS = 100;

private final List<Effect> appliedEffects;
private final Collection<CombatEntityListener> listeners;
private final Collection<CombatEntityDeathListener> deathListeners;
private final Collection<CombatEntityResurrectListener> resurrectListeners;
private final Collection<CombatEntityHitListener> hitListeners;

private final List<Effect> appliedEffects;
private final RangeAttribute<Integer> hitPoints;

@TmxProperty(name = MapObjectProperty.COMBAT_INDESTRUCTIBLE)
Expand All @@ -47,6 +49,7 @@ public CombatEntity() {
super();
this.listeners = ConcurrentHashMap.newKeySet();
this.deathListeners = ConcurrentHashMap.newKeySet();
this.resurrectListeners = ConcurrentHashMap.newKeySet();
this.hitListeners = ConcurrentHashMap.newKeySet();
this.appliedEffects = new CopyOnWriteArrayList<>();

Expand Down Expand Up @@ -78,19 +81,21 @@ public void onHit(CombatEntityHitListener listener) {
}

@Override
public void removeHitListener(CombatEntityHitListener listener) {
public void onDeath(CombatEntityDeathListener listener) { this.deathListeners.add(listener); }

@Override
public void onResurrect(CombatEntityResurrectListener listener) { this.resurrectListeners.add(listener); }

@Override
public void removeListener(CombatEntityHitListener listener) {
this.hitListeners.remove(listener);
}

@Override
public void onDeath(CombatEntityDeathListener listener) {
this.deathListeners.add(listener);
}
public void removeListener(CombatEntityDeathListener listener) { this.deathListeners.remove(listener); }

@Override
public void removeDeathListener(CombatEntityDeathListener listener) {
this.deathListeners.remove(listener);
}
public void removeListener(CombatEntityResurrectListener listener) { this.resurrectListeners.remove(listener); }

@Override
public void die() {
Expand Down Expand Up @@ -142,21 +147,21 @@ public int getTeam() {
@Override
public float[] getTweenValues(TweenType tweenType) {
switch (tweenType) {
case HITPOINTS:
return new float[] { (float) this.getHitPoints().get() };
default:
return super.getTweenValues(tweenType);
case HITPOINTS:
return new float[]{(float) this.getHitPoints().get()};
default:
return super.getTweenValues(tweenType);
}
}

@Override
public void setTweenValues(TweenType tweenType, float[] newValues) {
switch (tweenType) {
case HITPOINTS:
this.getHitPoints().setBaseValue(Math.round(newValues[0]));
break;
default:
super.setTweenValues(tweenType, newValues);
case HITPOINTS:
this.getHitPoints().setBaseValue(Math.round(newValues[0]));
break;
default:
super.setTweenValues(tweenType, newValues);
}
}

Expand All @@ -175,20 +180,29 @@ public void hit(final int damage, final Ability ability) {
this.getHitPoints().modifyBaseValue(new AttributeModifier<>(Modification.SUBTRACT, damage));
}

if (this.isDead()) {
this.fireDeathEvent();
this.setCollision(false);
final EntityHitEvent event = new EntityHitEvent(this, ability, damage, this.isDead());

for(final CombatEntityListener listener : this.listeners){
listener.hit(event);
}

final EntityHitEvent event = new EntityHitEvent(this, ability, damage, this.isDead());
for (final CombatEntityHitListener listener : this.hitListeners) {
listener.hit(event);
}

if (this.isDead()) {
this.fireDeathEvent();
this.setCollision(false);
}

this.lastHit = Game.time().now();
}

private void fireDeathEvent() {
for(final CombatEntityListener listener : this.listeners){
listener.death(this);
}

for (final CombatEntityDeathListener listener : this.deathListeners) {
listener.death(this);
}
Expand All @@ -208,7 +222,8 @@ public boolean isDead() {
* Checks if is friendly.
*
* @param entity
* the entity
* the entity
*
* @return true, if is friendly
*/
@Override
Expand Down Expand Up @@ -246,6 +261,10 @@ public void resurrect() {
listener.resurrect(this);
}

for (final CombatEntityResurrectListener listener : this.resurrectListeners) {
listener.resurrect(this);
}

this.setCollision(true);
}

Expand All @@ -263,7 +282,7 @@ public void setTarget(final ICombatEntity target) {
* Sets the team.
*
* @param team
* the new team
* the new team
*/
@Override
public void setTeam(final int team) {
Expand Down
10 changes: 1 addition & 9 deletions src/de/gurkenlabs/litiengine/entities/CombatEntityListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,5 @@
* @see ICombatEntity#resurrect()
* @see ICombatEntity#hit(int)
*/
public interface CombatEntityListener extends CombatEntityHitListener, CombatEntityDeathListener, EventListener {

/**
* This method is called whenever a {@code ICombatEntity} was resurrected.
*
* @param entity
* The combat entity that was resurrected.
*/
public void resurrect(ICombatEntity entity);
public interface CombatEntityListener extends CombatEntityHitListener, CombatEntityDeathListener, CombatEntityResurrectListener, EventListener {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package de.gurkenlabs.litiengine.entities;

import java.util.EventListener;

/**
* This listener provides callbacks for when an {@code ICombatEntity} was resurrected.
*
* @see ICombatEntity#resurrect()
*/
@FunctionalInterface
public interface CombatEntityResurrectListener extends EventListener {
/**
* This method is called whenever a {@code ICombatEntity} was resurrected.
*
* @param entity
* The combat entity that was resurrected.
*/
public void resurrect(ICombatEntity entity);
}
8 changes: 4 additions & 4 deletions src/de/gurkenlabs/litiengine/entities/Entity.java
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ public void addTransformListener(EntityTransformListener listener) {
}

@Override
public void removeTransformListener(EntityTransformListener listener) {
public void removeListener(EntityTransformListener listener) {
this.transformListeners.remove(listener);
}

Expand All @@ -127,7 +127,7 @@ public void onRendered(final EntityRenderedListener listener) {
}

@Override
public void removeEntityRenderedListener(final EntityRenderedListener listener) {
public void removeListener(final EntityRenderedListener listener) {
this.renderedListeners.remove(listener);
}

Expand All @@ -137,7 +137,7 @@ public void addEntityRenderListener(final EntityRenderListener listener) {
}

@Override
public void removeEntityRenderListener(final EntityRenderListener listener) {
public void removeListener(final EntityRenderListener listener) {
this.renderListeners.remove(listener);
}

Expand All @@ -156,7 +156,7 @@ public void onMessage(String message, EntityMessageListener listener) {
}

@Override
public void removeMessageListener(EntityMessageListener listener) {
public void removeListener(EntityMessageListener listener) {
for (Collection<EntityMessageListener> listenerType : this.messageListeners.values()) {
if (listenerType == null || listenerType.isEmpty()) {
continue;
Expand Down
8 changes: 6 additions & 2 deletions src/de/gurkenlabs/litiengine/entities/ICombatEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,15 @@ public interface ICombatEntity extends ICollisionEntity {

public void onHit(CombatEntityHitListener listener);

public void removeHitListener(CombatEntityHitListener listener);
public void removeListener(CombatEntityHitListener listener);

public void onDeath(CombatEntityDeathListener listener);

public void removeDeathListener(CombatEntityDeathListener listener);
public void removeListener(CombatEntityDeathListener listener);

public void onResurrect(CombatEntityResurrectListener listener);

public void removeListener(CombatEntityResurrectListener listener);

public void die();

Expand Down
12 changes: 6 additions & 6 deletions src/de/gurkenlabs/litiengine/entities/IEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,14 @@ public interface IEntity{

public void onMessage(String message, EntityMessageListener listener);

public void removeMessageListener(EntityMessageListener listener);

public void addTransformListener(EntityTransformListener listener);

public void removeTransformListener(EntityTransformListener listener);

public void addListener(EntityListener listener);

public void removeListener(EntityMessageListener listener);

public void removeListener(EntityTransformListener listener);

public void removeListener(EntityListener listener);

/**
Expand All @@ -43,7 +43,7 @@ public interface IEntity{
* @param listener
* The listener to remove.
*/
public void removeEntityRenderedListener(final EntityRenderedListener listener);
public void removeListener(final EntityRenderedListener listener);

/**
* Adds the specified entity render listener to receive events and callbacks about the rendering process of entities.
Expand All @@ -59,7 +59,7 @@ public interface IEntity{
* @param listener
* The listener to remove.
*/
public void removeEntityRenderListener(final EntityRenderListener listener);
public void removeListener(final EntityRenderListener listener);

public double getAngle();

Expand Down
2 changes: 1 addition & 1 deletion src/de/gurkenlabs/litiengine/environment/Environment.java
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ public void onRendered(RenderType renderType, EnvironmentRenderedListener listen
* @param listener
* The listener to remove.
*/
public void removeRenderListener(EnvironmentRenderedListener listener) {
public void removeListener(EnvironmentRenderedListener listener) {
for (Collection<EnvironmentRenderedListener> rends : this.renderListeners.values()) {
rends.remove(listener);
}
Expand Down

0 comments on commit 63fb8cf

Please sign in to comment.