Skip to content

Commit

Permalink
Turn "on player dies" world event into "on entity dies".
Browse files Browse the repository at this point in the history
  • Loading branch information
davidcernat committed Oct 14, 2013
1 parent a578c4b commit 0815a89
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 71 deletions.
Expand Up @@ -235,8 +235,8 @@ else if (act.equals(Action.REMOVE)) {

}
// Only remove all objectives from scoreboard if viewers
// argument was not specified (because then only a list
// of viewers should be removed)
// argument was not specified (because if it was, a list
// of viewers should be removed instead)
else if (viewers == null) {
dB.echoDebug("Removing all objectives from scoreboard " + id.asString());
for (Objective o : board.getObjectives()) {
Expand Down
Expand Up @@ -1137,7 +1137,7 @@ public void hangingBreak(HangingBreakEvent event) {
dEntity entity = new dEntity(subEvent.getRemover());
context.put("entity", entity.getDenizenObject());

if (entity.isNPC()) { npc = entity.getDenizenNPC(); }
if (entity.isNPC()) npc = entity.getDenizenNPC();
else if (entity.isPlayer()) player = entity.getPlayer();

events.add("entity breaks hanging");
Expand Down Expand Up @@ -1377,7 +1377,7 @@ public void entityDamage(EntityDamageEvent event) {
context.put("damage", new Element(event.getDamage()));
context.put("cause", new Element(event.getCause().name()));

if (entity.isNPC()) { npc = entity.getDenizenNPC(); }
if (entity.isNPC()) npc = entity.getDenizenNPC();
else if (entity.isPlayer()) player = entity.getPlayer();

boolean isFatal = false;
Expand Down Expand Up @@ -1568,6 +1568,80 @@ else if (Argument.valueOf(determination)
}
}

// <--[event]
// @Events
// entity dies
// <entity> death
//
// @Triggers when an entity dies.
// @Context
// <context.message> returns the dEntity that died.
// <context.message> returns an Element of the death message,
// only available for player deaths.
// <context.inventory> returns the dInventory of the entity,
// currently only available for players.
//
// @Determine
// Element(String) to change the death message.
// "NO_DROPS" to specify the Player's drops should be removed.
// "DROPS <i@item|...>" to specify new items to be dropped.
//
// -->
@EventHandler
public void entityDeath(EntityDeathEvent event) {

Player player = null;
dNPC npc = null;

Map<String, dObject> context = new HashMap<String, dObject>();
dEntity entity = new dEntity(event.getEntity());
context.put("entity", entity.getDenizenObject());

if (entity.isNPC()) npc = entity.getDenizenNPC();
else if (entity.isPlayer()) player = entity.getPlayer();

PlayerDeathEvent subEvent = null;

if (event instanceof PlayerDeathEvent) {
subEvent = (PlayerDeathEvent) event;
context.put("message", new Element(subEvent.getDeathMessage()));

// Null check to prevent NPCs from causing an NPE
if (player != null)
context.put("inventory", new dInventory(player.getInventory()));
}

String determination = doEvents(Arrays.asList
("entity dies",
entity.identifyType() + " dies",
"entity death",
entity.identifyType() + " death"),
npc, player, context, true);

// Handle message
if (determination.equalsIgnoreCase("NO_DROPS")) {
event.getDrops().clear();

}
else if (determination.toUpperCase().startsWith("DROPS ")) {
dList drops = dList.valueOf(determination.substring(6));
drops.filter(dItem.class);
event.getDrops().clear();
for (String drop : drops) {
dItem item = dItem.valueOf(drop);
if (item != null)
event.getDrops().add(item.getItemStack());
}

}

else if (!determination.equalsIgnoreCase("NONE")) {
if (event instanceof PlayerDeathEvent) {
subEvent.setDeathMessage(determination);
}
}
}

// <--[event]
// @Events
// entity explodes
Expand Down Expand Up @@ -1640,7 +1714,7 @@ public void entityRegainHealth(EntityRegainHealthEvent event) {
context.put("amount", new Element(event.getAmount()));
context.put("entity", entity.getDenizenObject());

if (entity.isNPC()) { npc = entity.getDenizenNPC(); }
if (entity.isNPC()) npc = entity.getDenizenNPC();
else if (entity.isPlayer()) player = entity.getPlayer();

String determination = doEvents(Arrays.asList
Expand Down Expand Up @@ -1682,7 +1756,7 @@ public void entityPortalEnter(EntityPortalEnterEvent event) {
context.put("location", new dLocation(event.getLocation()));
context.put("entity", entity.getDenizenObject());

if (entity.isNPC()) { npc = entity.getDenizenNPC(); }
if (entity.isNPC()) npc = entity.getDenizenNPC();
else if (entity.isPlayer()) player = entity.getPlayer();

doEvents(Arrays.asList
Expand Down Expand Up @@ -1714,7 +1788,7 @@ public void entityPortalExit(EntityPortalExitEvent event) {
context.put("location", new dLocation(event.getTo()));
context.put("entity", entity.getDenizenObject());

if (entity.isNPC()) { npc = entity.getDenizenNPC(); }
if (entity.isNPC()) npc = entity.getDenizenNPC();
else if (entity.isPlayer()) player = entity.getPlayer();

doEvents(Arrays.asList
Expand Down Expand Up @@ -1753,7 +1827,7 @@ public void entityShootBow(EntityShootBowEvent event) {
context.put("projectile", projectile);
context.put("entity", entity.getDenizenObject());

if (entity.isNPC()) { npc = entity.getDenizenNPC(); }
if (entity.isNPC()) npc = entity.getDenizenNPC();
else if (entity.isPlayer()) player = entity.getPlayer();

String determination = doEvents(Arrays.asList
Expand Down Expand Up @@ -1904,11 +1978,10 @@ public void entityTarget(EntityTargetEvent event) {
if (determination.toUpperCase().startsWith("CANCELLED"))
event.setCancelled(true);

// If the determination matches a dEntity, change the event's target
// using a scheduled task (otherwise, the target will not be changed)
//
// Note: this does not work with all monster types

// If the determination matches a dEntity, change the event's target
// using a scheduled task (otherwise, the target will not be changed)
//
// Note: this does not work with all monster types
else if (dEntity.matches(determination)) {

final dEntity newTarget = dEntity.valueOf(determination);
Expand Down Expand Up @@ -1950,7 +2023,7 @@ public void entityTeleport(EntityTeleportEvent event) {
context.put("destination", new dLocation(event.getTo()));
context.put("entity", entity.getDenizenObject());

if (entity.isNPC()) { npc = entity.getDenizenNPC(); }
if (entity.isNPC()) npc = entity.getDenizenNPC();
else if (entity.isPlayer()) player = entity.getPlayer();

String determination = doEvents(Arrays.asList
Expand Down Expand Up @@ -2052,7 +2125,7 @@ public void foodLevelChange(FoodLevelChangeEvent event) {
context.put("food", new Element(event.getFoodLevel()));
context.put("entity", entity.getDenizenObject());

if (entity.isNPC()) { npc = entity.getDenizenNPC(); }
if (entity.isNPC()) npc = entity.getDenizenNPC();
else if (entity.isPlayer()) player = entity.getPlayer();

String determination = doEvents(Arrays.asList
Expand Down Expand Up @@ -3108,53 +3181,6 @@ public void playerCommandPreprocess(PlayerCommandPreprocessEvent event) {
event.setCancelled(true);
}

// <--[event]
// @Events
// player dies
// player death
//
// @Triggers when a player dies.
// @Context
// <context.message> returns an Element of the death message.
// <context.inventory> returns a copy of the Player's inventory before death.
//
// @Determine
// Element(String) to change the death message.
// "NO_DROPS" to specify the Player's drops should be removed.
// "DROPS <i@item|...>" to specify new items to be dropped.
//
// -->
@EventHandler
public void playerDeath(PlayerDeathEvent event) {

Map<String, dObject> context = new HashMap<String, dObject>();
context.put("message", new Element(event.getDeathMessage()));
context.put("inventory", new dInventory(event.getEntity().getInventory()));

String determination = doEvents(Arrays.asList
("player dies",
"player death"),
null, event.getEntity(), context);

// Handle message
if (determination.equalsIgnoreCase("NO_DROPS")) {
event.getDrops().clear();

} else if (determination.toUpperCase().startsWith("DROPS ")) {
dList drops = dList.valueOf(determination.substring(6));
drops.filter(dItem.class);
event.getDrops().clear();
for (String drop : drops) {
dItem item = dItem.valueOf(drop);
if (item != null)
event.getDrops().add(item.getItemStack());
}

} else if (!determination.equalsIgnoreCase("NONE"))
event.setDeathMessage(determination);

}

// <--[event]
// @Events
// player drops item
Expand Down Expand Up @@ -3260,7 +3286,7 @@ public void playerFish(PlayerFishEvent event) {
dEntity entity = new dEntity(event.getCaught());
context.put("entity", entity.getDenizenObject());

if (entity.isNPC()) { npc = entity.getDenizenNPC(); }
if (entity.isNPC()) npc = entity.getDenizenNPC();

events.add("player fishes " + entity.identifyType());
events.add("player fishes " + entity.identifyType() + " while " + state);
Expand Down Expand Up @@ -3401,7 +3427,7 @@ public void playerInteractEntity(PlayerInteractEntityEvent event) {
context.put("location", new dLocation(event.getRightClicked().getLocation()));
context.put("entity", entity.getDenizenObject());

if (entity.isNPC()) { npc = entity.getDenizenNPC(); }
if (entity.isNPC()) npc = entity.getDenizenNPC();

List<String> events = new ArrayList<String>();
events.add("player right clicks entity");
Expand Down Expand Up @@ -3965,7 +3991,7 @@ public void vehicleEntityCollision(VehicleEntityCollisionEvent event) {
context.put("vehicle", vehicle);
context.put("entity", entity.getDenizenObject());

if (entity.isNPC()) { npc = entity.getDenizenNPC(); }
if (entity.isNPC()) npc = entity.getDenizenNPC();
else if (entity.isPlayer()) player = entity.getPlayer();

List<String> events = new ArrayList<String>();
Expand Down Expand Up @@ -4050,8 +4076,8 @@ public void vehicleDamage(VehicleDamageEvent event) {
dEntity entity = new dEntity(event.getAttacker());
context.put("entity", entity.getDenizenObject());

if (entity.isPlayer()) { player = entity.getPlayer(); }
else { npc = entity.getDenizenNPC(); }
if (entity.isNPC()) npc = entity.getDenizenNPC();
else if (entity.isPlayer()) player = entity.getPlayer();

events.add("entity damages vehicle");
events.add("entity damages " + vehicle.identifyType());
Expand Down Expand Up @@ -4108,8 +4134,8 @@ public void vehicleDestroy(VehicleDestroyEvent event) {
dEntity entity = new dEntity(event.getAttacker());
context.put("entity", entity.getDenizenObject());

if (entity.isPlayer()) { player = entity.getPlayer(); }
else { npc = entity.getDenizenNPC(); }
if (entity.isNPC()) npc = entity.getDenizenNPC();
else if (entity.isPlayer()) player = entity.getPlayer();

events.add("entity destroys vehicle");
events.add("entity destroys " + vehicle.identifyType());
Expand Down Expand Up @@ -4153,7 +4179,7 @@ public void vehicleEnter(VehicleEnterEvent event) {
context.put("vehicle", vehicle);
context.put("entity", entity.getDenizenObject());

if (entity.isNPC()) { npc = entity.getDenizenNPC(); }
if (entity.isNPC()) npc = entity.getDenizenNPC();
else if (entity.isPlayer()) player = entity.getPlayer();

String determination = doEvents(Arrays.asList
Expand Down Expand Up @@ -4197,7 +4223,7 @@ public void vehicleExit(VehicleExitEvent event) {
context.put("vehicle", vehicle);
context.put("entity", entity.getDenizenObject());

if (entity.isNPC()) { npc = entity.getDenizenNPC(); }
if (entity.isNPC()) npc = entity.getDenizenNPC();
else if (entity.isPlayer()) player = entity.getPlayer();

String determination = doEvents(Arrays.asList
Expand Down

0 comments on commit 0815a89

Please sign in to comment.