Skip to content

Commit

Permalink
Add "on block spreads" and "on hanging breaks" world events. Now you …
Browse files Browse the repository at this point in the history
…can keep lava from falling and paintings from ever being broken.
  • Loading branch information
davidcernat committed Jul 12, 2013
1 parent 6d383b6 commit 251a8fb
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 18 deletions.
3 changes: 2 additions & 1 deletion src/main/java/net/aufdemrand/denizen/objects/aH.java
Expand Up @@ -525,7 +525,8 @@ public static boolean matchesItem(String arg) {

@Deprecated
public static boolean matchesContext(String arg) {
if (arg.toUpperCase().startsWith("CONTEXT:")) return true;
if (arg.toUpperCase().startsWith("CONTEXT:") ||
arg.toUpperCase().startsWith("DEFINE:")) return true;
// TODO: Other matches____ do some actual checks, should this?.
return false;
}
Expand Down
Expand Up @@ -248,10 +248,10 @@ public void registerCoreMembers() {
"RESET", "reset [fails/finishes/cooldown] (script:<name>)", 1);

registerCoreMember(RunCommand.class,
"RUN", "run [<script>] (path:<name>) (as:<player>/<npc>) (def:<element>|...) (id:id_name) (delay:duration) (loop) (q:#)", 1);
"RUN", "run [<script>] (path:<name>) (as:<player>/<npc>) (define:<element>|...) (id:<name>) (delay:<duration>) (loop) (qty:<#>)", 1);

registerCoreMember(RuntaskCommand.class,
"RUNTASK", "runtask [<name>] (instantly) (queue/queue:<name>) (delay:<#>)", 1);
"RUNTASK", "runtask [<name>] (instantly) (queue(:<name>)) (delay:<#>) (define:<element>|...)", 1);

registerCoreMember(ScoreboardCommand.class,
"SCOREBOARD", "scoreboard [set/remove/show/hide] [<name>] [value:<name>] (priority:<#>)", 1);
Expand Down
Expand Up @@ -86,7 +86,7 @@ else if (arg.matchesPrefix("a, as")
&& arg.matchesArgumentType(dNPC.class))
scriptEntry.setNPC((dNPC) arg.asType(dNPC.class));

else if (arg.matchesPrefix("d, def, c, context"))
else if (arg.matchesPrefix("d, def, define, c, context"))
scriptEntry.addObject("definitions", arg.asType(dList.class));
}

Expand Down
Expand Up @@ -27,6 +27,7 @@
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockBurnEvent;
import org.bukkit.event.block.BlockFromToEvent;
import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockPhysicsEvent;
import org.bukkit.event.block.BlockPlaceEvent;
Expand All @@ -44,6 +45,8 @@
import org.bukkit.event.entity.ExplosionPrimeEvent;
import org.bukkit.event.entity.FoodLevelChangeEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.hanging.HangingBreakEvent;
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.*;
import org.bukkit.event.server.ServerCommandEvent;
Expand Down Expand Up @@ -197,7 +200,7 @@ public void blockIgnite(BlockIgniteEvent event) {
}

@EventHandler
public void blockPhysicsEvent(BlockPhysicsEvent event) {
public void blockPhysics(BlockPhysicsEvent event) {

Map<String, Object> context = new HashMap<String, Object>();

Expand Down Expand Up @@ -256,6 +259,24 @@ public void blockRedstone(BlockRedstoneEvent event) {
event.setNewCurrent(event.getOldCurrent());
}

@EventHandler
public void blockFromTo(BlockFromToEvent event) {

Map<String, Object> context = new HashMap<String, Object>();

context.put("location", new dLocation(event.getBlock().getLocation()));
context.put("type", new Element(event.getBlock().getType().name()));
context.put("destination", new dLocation(event.getToBlock().getLocation()));

String determination = doEvents(Arrays.asList
("block spreads",
event.getBlock().getType().name() + " spreads"),
null, null, context);

if (determination.toUpperCase().startsWith("CANCELLED"))
event.setCancelled(true);
}

@EventHandler
public void signChange(SignChangeEvent event) {

Expand Down Expand Up @@ -331,6 +352,68 @@ public void timeEvent() {
}


/////////////////////
// HANGING EVENTS
/////////////////

@EventHandler
public void hangingBreak(HangingBreakEvent event) {

Map<String, Object> context = new HashMap<String, Object>();

Player player = null;
dNPC npc = null;

String hangingType = event.getEntity().getType().name();
String cause = event.getCause().name();

context.put("hanging", new dEntity(event.getEntity()));
context.put("cause", new Element(cause));

List<String> events = new ArrayList<String>();
events.add("hanging breaks");
events.add("hanging breaks because " + cause);
events.add(hangingType + " breaks");
events.add(hangingType +
" breaks because " + cause);

if (event instanceof HangingBreakByEntityEvent) {

HangingBreakByEntityEvent subEvent = (HangingBreakByEntityEvent) event;

Entity entity = subEvent.getRemover();
String entityType = entity.getType().name();

if (CitizensAPI.getNPCRegistry().isNPC(entity)) {
npc = DenizenAPI.getDenizenNPC(CitizensAPI.getNPCRegistry().getNPC(entity));
context.put("entity", npc);
entityType = "npc";
}
else if (entity instanceof Player) {
player = (Player) entity;
context.put("entity", new dPlayer((Player) entity));
}
else {
context.put("entity", new dEntity(entity));
}

events.add("entity breaks hanging");
events.add("entity breaks hanging because " + cause);
events.add("entity breaks " + hangingType);
events.add("entity breaks " + hangingType + " because " + cause);
events.add(entityType + " breaks hanging");
events.add(entityType + " breaks hanging because " + cause);
events.add(entityType + " breaks " + hangingType);
events.add(entityType + " breaks " + hangingType + " because " + cause);
}

String determination = doEvents(events, npc, player, context);

if (determination.toUpperCase().startsWith("CANCELLED"))
event.setCancelled(true);
}


/////////////////////
// ENTITY EVENTS
/////////////////
Expand Down Expand Up @@ -385,16 +468,16 @@ public void entityDamage(EntityDamageEvent event) {

String determination;

Player contextPlayer = null;
dNPC contextNPC = null;
Player player = null;
dNPC npc = null;

if (CitizensAPI.getNPCRegistry().isNPC(entity)) {
contextNPC = DenizenAPI.getDenizenNPC(CitizensAPI.getNPCRegistry().getNPC(entity));
context.put("entity", contextNPC);
npc = DenizenAPI.getDenizenNPC(CitizensAPI.getNPCRegistry().getNPC(entity));
context.put("entity", npc);
entityType = "npc";
}
else if (entity instanceof Player) {
contextPlayer = (Player) entity;
player = (Player) entity;
context.put("entity", new dPlayer((Player) entity));
}
else {
Expand Down Expand Up @@ -431,26 +514,26 @@ else if (entity instanceof Player) {
// like "player damages player" from the one we have for
// "player damaged by player"

Player subContextPlayer = null;
dNPC subContextNPC = null;
Player subPlayer = null;
dNPC subNPC = null;

Entity damager = subEvent.getDamager();
String damagerType = damager.getType().name();

if (CitizensAPI.getNPCRegistry().isNPC(damager)) {
subContextNPC = DenizenAPI.getDenizenNPC(CitizensAPI.getNPCRegistry().getNPC(entity));
subNPC = DenizenAPI.getDenizenNPC(CitizensAPI.getNPCRegistry().getNPC(entity));
context.put("damager", DenizenAPI.getDenizenNPC(CitizensAPI.getNPCRegistry().getNPC(damager)));
damagerType = "npc";

// If we had no NPC in our regular context, use this one
if (contextNPC == null) contextNPC = subContextNPC;
if (npc == null) npc = subNPC;
}
else if (damager instanceof Player) {
subContextPlayer = (Player) damager;
subPlayer = (Player) damager;
context.put("damager", new dPlayer((Player) damager));

// If we had no player in our regular context, use this one
if (contextPlayer == null) contextPlayer = subContextPlayer;
if (player == null) player = subPlayer;
}
else {
context.put("damager", new dEntity(damager));
Expand Down Expand Up @@ -483,15 +566,15 @@ else if (damager instanceof Player) {
subEvents.add(damagerType + " kills " + entityType);
}

determination = doEvents(subEvents, subContextNPC, subContextPlayer, context);
determination = doEvents(subEvents, subNPC, subPlayer, context);

if (determination.toUpperCase().startsWith("CANCELLED"))
event.setCancelled(true);
if (aH.matchesValueArg("DAMAGE", determination, aH.ArgumentType.Double))
event.setDamage(aH.getDoubleFrom(determination));
}

determination = doEvents(events, contextNPC, contextPlayer, context);
determination = doEvents(events, npc, player, context);

if (determination.toUpperCase().startsWith("CANCELLED"))
event.setCancelled(true);
Expand Down

0 comments on commit 251a8fb

Please sign in to comment.