Implement DPlayer events

This commit is contained in:
Daniel Saukel 2016-01-12 23:55:20 +01:00
parent 80ebdeeda3
commit 6157df9703
6 changed files with 135 additions and 25 deletions

View File

@ -1,6 +1,7 @@
package io.github.dre2n.dungeonsxl.command;
import io.github.dre2n.dungeonsxl.dungeon.game.GameWorld;
import io.github.dre2n.dungeonsxl.event.dplayer.DPlayerEscapeEvent;
import io.github.dre2n.dungeonsxl.file.DMessages.Messages;
import io.github.dre2n.dungeonsxl.player.DGroup;
import io.github.dre2n.dungeonsxl.player.DPlayer;
@ -33,6 +34,12 @@ public class LeaveCommand extends DCommand {
}
if (dPlayer != null) {
DPlayerEscapeEvent event = new DPlayerEscapeEvent(dPlayer);
if (event.isCancelled()) {
return;
}
dPlayer.leave();
MessageUtil.sendMessage(player, dMessages.getMessage(Messages.CMD_LEAVE_SUCCESS));

View File

@ -1,5 +1,6 @@
package io.github.dre2n.dungeonsxl.event.dplayer;
import io.github.dre2n.dungeonsxl.player.DGroup;
import io.github.dre2n.dungeonsxl.player.DPlayer;
import org.bukkit.event.Cancellable;
@ -11,10 +12,12 @@ public class DPlayerJoinDGroupEvent extends DPlayerEvent implements Cancellable
private boolean cancelled;
private boolean creator;
private DGroup dGroup;
public DPlayerJoinDGroupEvent(DPlayer dPlayer, boolean creator) {
public DPlayerJoinDGroupEvent(DPlayer dPlayer, boolean creator, DGroup dGroup) {
super(dPlayer);
this.creator = creator;
this.dGroup = dGroup;
}
/**
@ -24,6 +27,13 @@ public class DPlayerJoinDGroupEvent extends DPlayerEvent implements Cancellable
return creator;
}
/**
* @return the dGroup
*/
public DGroup getDGroup() {
return dGroup;
}
@Override
public HandlerList getHandlers() {
return handlers;

View File

@ -15,14 +15,16 @@ public class DPlayerUpdateEvent extends DPlayerEvent implements Cancellable {
private boolean respawnInventory;
private boolean offline;
private boolean kick;
private boolean triggerAllInDistance;
public DPlayerUpdateEvent(DPlayer dPlayer, boolean locationValid, boolean teleportWolf, boolean respawnInventory, boolean offline, boolean kick) {
public DPlayerUpdateEvent(DPlayer dPlayer, boolean locationValid, boolean teleportWolf, boolean respawnInventory, boolean offline, boolean kick, boolean triggerAllInDistance) {
super(dPlayer);
this.locationValid = locationValid;
this.teleportWolf = teleportWolf;
this.respawnInventory = respawnInventory;
this.offline = offline;
this.kick = kick;
this.triggerAllInDistance = triggerAllInDistance;
}
/**
@ -92,6 +94,21 @@ public class DPlayerUpdateEvent extends DPlayerEvent implements Cancellable {
this.kick = kick;
}
/**
* @return the triggerAllInDistance
*/
public boolean getTriggerAllInDistance() {
return triggerAllInDistance;
}
/**
* @param triggerAllInDistance
* the triggerAllInDistance to set
*/
public void setTriggerAllInDistance(boolean triggerAllInDistance) {
this.triggerAllInDistance = triggerAllInDistance;
}
@Override
public HandlerList getHandlers() {
return handlers;

View File

@ -7,6 +7,7 @@ import io.github.dre2n.dungeonsxl.dungeon.EditWorld;
import io.github.dre2n.dungeonsxl.dungeon.game.GameChest;
import io.github.dre2n.dungeonsxl.dungeon.game.GameWorld;
import io.github.dre2n.dungeonsxl.event.dgroup.DGroupCreateEvent;
import io.github.dre2n.dungeonsxl.event.dplayer.DPlayerDeathEvent;
import io.github.dre2n.dungeonsxl.file.DMessages;
import io.github.dre2n.dungeonsxl.file.DMessages.Messages;
import io.github.dre2n.dungeonsxl.global.DPortal;
@ -67,7 +68,13 @@ public class PlayerListener implements Listener {
return;
}
dPlayer.setLives(dPlayer.getLives() - 1);
DPlayerDeathEvent dPlayerDeathEvent = new DPlayerDeathEvent(dPlayer, event, 1);
if (dPlayerDeathEvent.isCancelled()) {
return;
}
dPlayer.setLives(dPlayer.getLives() - dPlayerDeathEvent.getLostLives());
if (dPlayer.getLives() == 0 && dPlayer.isReady()) {
MessageUtil.broadcastMessage(dMessages.getMessage(Messages.PLAYER_DEATH_KICK, player.getName()));

View File

@ -8,6 +8,9 @@ import io.github.dre2n.dungeonsxl.dungeon.EditWorld;
import io.github.dre2n.dungeonsxl.dungeon.game.GameWorld;
import io.github.dre2n.dungeonsxl.event.dgroup.DGroupFinishDungeonEvent;
import io.github.dre2n.dungeonsxl.event.dgroup.DGroupFinishFloorEvent;
import io.github.dre2n.dungeonsxl.event.dplayer.DPlayerFinishEvent;
import io.github.dre2n.dungeonsxl.event.dplayer.DPlayerKickEvent;
import io.github.dre2n.dungeonsxl.event.dplayer.DPlayerUpdateEvent;
import io.github.dre2n.dungeonsxl.file.DMessages;
import io.github.dre2n.dungeonsxl.file.DMessages.Messages;
import io.github.dre2n.dungeonsxl.reward.Reward;
@ -64,7 +67,7 @@ public class DPlayer {
private ItemStack[] respawnArmor;
private String[] linesCopy;
private Inventory treasureInv = DungeonsXL.getPlugin().getServer().createInventory(getPlayer(), 45, dMessages.getMessage(Messages.PLAYER_TREASURES));
private Inventory treasureInv = plugin.getServer().createInventory(getPlayer(), 45, dMessages.getMessage(Messages.PLAYER_TREASURES));
private int initialLives = -1;
private int lives;
@ -343,17 +346,30 @@ public class DPlayer {
return;
}
boolean first = true;
boolean hasToWait = false;
for (Player player : dGroup.getPlayers()) {
DPlayer dPlayer = getByPlayer(player);
if ( !dPlayer.finished) {
MessageUtil.sendMessage(this.getPlayer(), dMessages.getMessage(Messages.PLAYER_WAIT_FOR_OTHER_PLAYERS));
return;
hasToWait = true;
} else if (dPlayer != this) {
first = false;
}
}
DGroupFinishDungeonEvent event = new DGroupFinishDungeonEvent(dGroup);
DPlayerFinishEvent dPlayerFinishEvent = new DPlayerFinishEvent(this, first, hasToWait);
if (event.isCancelled()) {
if (dPlayerFinishEvent.isCancelled()) {
finished = false;
return;
}
DGroupFinishDungeonEvent dGroupFinishDungeonEvent = new DGroupFinishDungeonEvent(dGroup);
if (dGroupFinishDungeonEvent.isCancelled()) {
return;
}
@ -813,46 +829,53 @@ public class DPlayer {
public static void update(boolean updateSecond) {
for (DPlayer dPlayer : plugin.getDPlayers()) {
boolean locationValid = true;
Location teleportLocation = dPlayer.getPlayer().getLocation();
boolean teleportWolf = false;
boolean respawnInventory = false;
boolean offline = false;
boolean kick = false;
boolean triggerAllInDistance = false;
GameWorld gameWorld = GameWorld.getByWorld(dPlayer.world);
EditWorld editWorld = EditWorld.getByWorld(dPlayer.world);
if ( !updateSecond) {
if ( !dPlayer.getPlayer().getWorld().equals(dPlayer.world)) {
locationValid = false;
if (dPlayer.editing) {
EditWorld editWorld = EditWorld.getByWorld(dPlayer.world);
if (editWorld != null) {
if (editWorld.getLobby() == null) {
MiscUtil.secureTeleport(dPlayer.getPlayer(), editWorld.getWorld().getSpawnLocation());
teleportLocation = editWorld.getWorld().getSpawnLocation();
} else {
MiscUtil.secureTeleport(dPlayer.getPlayer(), editWorld.getLobby());
teleportLocation = editWorld.getLobby();
}
}
} else {
GameWorld gameWorld = GameWorld.getByWorld(dPlayer.world);
if (gameWorld != null) {
DGroup dGroup = DGroup.getByPlayer(dPlayer.getPlayer());
if (dPlayer.checkpoint == null) {
MiscUtil.secureTeleport(dPlayer.getPlayer(), dGroup.getGameWorld().getLocStart());
teleportLocation = dGroup.getGameWorld().getLocStart();
if (dPlayer.wolf != null) {
dPlayer.wolf.teleport(dGroup.getGameWorld().getLocStart());
}
} else {
MiscUtil.secureTeleport(dPlayer.getPlayer(), dPlayer.checkpoint);
teleportLocation = dPlayer.getCheckpoint();
if (dPlayer.wolf != null) {
dPlayer.wolf.teleport(dPlayer.checkpoint);
teleportWolf = true;
}
}
// Respawn Items
if (dPlayer.respawnInventory != null || dPlayer.respawnArmor != null) {
dPlayer.getPlayer().getInventory().setContents(dPlayer.respawnInventory);
dPlayer.getPlayer().getInventory().setArmorContents(dPlayer.respawnArmor);
dPlayer.respawnInventory = null;
dPlayer.respawnArmor = null;
respawnInventory = true;
}
}
}
}
} else {
GameWorld gameWorld = GameWorld.getByWorld(dPlayer.world);
} else {
if (gameWorld != null) {
// Update Wolf
if (dPlayer.wolf != null) {
@ -869,15 +892,49 @@ public class DPlayer {
// Kick offline plugin.getDPlayers()
if (dPlayer.offlineTime > 0) {
offline = true;
if (dPlayer.offlineTime < System.currentTimeMillis()) {
dPlayer.leave();
kick = true;
}
}
// Check Distance Trigger Signs
DistanceTrigger.triggerAllInDistance(dPlayer.getPlayer(), gameWorld);
triggerAllInDistance = true;
}
}
DPlayerUpdateEvent event = new DPlayerUpdateEvent(dPlayer, locationValid, teleportWolf, respawnInventory, offline, kick, triggerAllInDistance);
if (event.isCancelled()) {
return;
}
if ( !locationValid) {
MiscUtil.secureTeleport(dPlayer.getPlayer(), teleportLocation);
}
if (teleportWolf) {
dPlayer.wolf.teleport(dPlayer.checkpoint);
}
if (respawnInventory) {
dPlayer.getPlayer().getInventory().setContents(dPlayer.respawnInventory);
dPlayer.getPlayer().getInventory().setArmorContents(dPlayer.respawnArmor);
dPlayer.respawnInventory = null;
dPlayer.respawnArmor = null;
}
if (kick) {
DPlayerKickEvent dPlayerKickEvent = new DPlayerKickEvent(dPlayer);
if ( !dPlayerKickEvent.isCancelled()) {
dPlayer.leave();
}
}
if (triggerAllInDistance) {
DistanceTrigger.triggerAllInDistance(dPlayer.getPlayer(), gameWorld);
}
}
}

View File

@ -1,7 +1,7 @@
package io.github.dre2n.dungeonsxl.sign;
import io.github.dre2n.dungeonsxl.DungeonsXL;
import io.github.dre2n.dungeonsxl.dungeon.game.GameWorld;
import io.github.dre2n.dungeonsxl.event.dplayer.DPlayerEscapeEvent;
import io.github.dre2n.dungeonsxl.player.DPlayer;
import io.github.dre2n.dungeonsxl.trigger.InteractTrigger;
@ -46,6 +46,12 @@ public class LeaveSign extends DSign {
public boolean onPlayerTrigger(Player player) {
DPlayer dPlayer = DPlayer.getByPlayer(player);
if (dPlayer != null) {
DPlayerEscapeEvent event = new DPlayerEscapeEvent(dPlayer);
if (event.isCancelled()) {
return false;
}
dPlayer.leave();
}
@ -54,7 +60,13 @@ public class LeaveSign extends DSign {
@Override
public void onTrigger() {
for (DPlayer dPlayer : DungeonsXL.getPlugin().getDPlayers()) {
for (DPlayer dPlayer : plugin.getDPlayers()) {
DPlayerEscapeEvent event = new DPlayerEscapeEvent(dPlayer);
if (event.isCancelled()) {
return;
}
dPlayer.leave();
}
}