package net.aufdemrand.denizen.events.player;
import net.aufdemrand.denizen.BukkitScriptEntryData;
import net.aufdemrand.denizen.objects.dEntity;
import net.aufdemrand.denizen.objects.dLocation;
import net.aufdemrand.denizen.utilities.DenizenAPI;
import net.aufdemrand.denizencore.events.ScriptEvent;
import net.aufdemrand.denizencore.objects.Element;
import net.aufdemrand.denizencore.objects.dObject;
import net.aufdemrand.denizencore.scripts.ScriptEntryData;
import net.aufdemrand.denizencore.scripts.containers.ScriptContainer;
import net.aufdemrand.denizencore.utilities.CoreUtilities;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent;
public class BiomeEnterExitScriptEvent extends ScriptEvent implements Listener {
// TODO: in area?
// <--[event]
// @Events
// player enters <biome>
// player exits <biome>
// player enters biome
// player exits biome
//
// @Regex ^on player (enters|exits) [^\s]+$
//
// @Warning Cancelling this event will fire a similar event immediately after.
//
// @Cancellable true
//
// @Triggers when a player enters or exits a biome.
//
// @Context
// <context.from> returns the block location moved from.
// <context.to> returns the block location moved to.
// <context.old_biome> returns an element of the biome being left.
// <context.new_biome> returns an element of the biome being entered.
//
// -->
public BiomeEnterExitScriptEvent() {
instance = this;
}
public static BiomeEnterExitScriptEvent instance;
public dLocation from;
public dLocation to;
public Element old_biome;
public Element new_biome;
public PlayerMoveEvent event;
@Override
public boolean couldMatch(ScriptContainer scriptContainer, String s) {
String lower = CoreUtilities.toLowerCase(s);
return lower.startsWith("player enters")
|| lower.startsWith("player exits");
}
@Override
public boolean matches(ScriptContainer scriptContainer, String s) {
String lower = CoreUtilities.toLowerCase(s);
String biome_test = lower.substring(lower.lastIndexOf(' ') + 1);
String direction = lower.substring(lower.indexOf(' ') + 1, lower.lastIndexOf(' ')).trim();
return biome_test.equals("biome")
|| (direction.equals("enters") && biome_test.equals(CoreUtilities.toLowerCase(new_biome.toString())))
|| (direction.equals("exits") && biome_test.equals(CoreUtilities.toLowerCase(old_biome.toString())));
}
@Override
public String getName() {
return "BiomeEnterExit";
}
@Override
public void init() {
Bukkit.getServer().getPluginManager().registerEvents(this, DenizenAPI.getCurrentInstance());
}
@Override
public void destroy() {
PlayerMoveEvent.getHandlerList().unregister(this);
}
@Override
public boolean applyDetermination(ScriptContainer container, String determination) {
return super.applyDetermination(container, determination);
}
@Override
public ScriptEntryData getScriptEntryData() {
// TODO: Store the player / npc?
return new BukkitScriptEntryData(event != null ? dEntity.getPlayerFrom(event.getPlayer()) : null, null);
}
@Override
public dObject getContext(String name) {
if (name.equals("to")) {
return to;
}
else if (name.equals("from")) {
return from;
}
else if (name.equals("old_biome")) {
return old_biome;
}
else if (name.equals("new_biome")) {
return new_biome;
}
return super.getContext(name);
}
@EventHandler
public void onPlayerEntersExitsBiome(PlayerMoveEvent event) {
from = new dLocation(event.getFrom());
to = new dLocation(event.getTo());
old_biome = new Element(from.getBlock().getBiome().name());
new_biome = new Element(to.getBlock().getBiome().name());
if (old_biome.identify().equals(new_biome.identify())) {
return;
}
cancelled = event.isCancelled();
this.event = event;
fire();
event.setCancelled(cancelled);
}
}