mirror of
https://github.com/DRE2N/DungeonsXL.git
synced 2025-02-17 21:02:12 +01:00
Rewrite keepInventoryOnDeath implementation; fix EXP loss; resolves #579
This commit is contained in:
parent
86c09f6a72
commit
2641fb7e5c
@ -30,16 +30,14 @@ public class DInstancePlayerUpdateEvent extends DInstancePlayerEvent implements
|
||||
|
||||
private boolean locationValid;
|
||||
private boolean teleportWolf;
|
||||
private boolean respawnInventory;
|
||||
private boolean offline;
|
||||
private boolean kick;
|
||||
private boolean triggerAllInDistance;
|
||||
|
||||
public DInstancePlayerUpdateEvent(DInstancePlayer dPlayer, boolean locationValid, boolean teleportWolf, boolean respawnInventory, boolean offline, boolean kick, boolean triggerAllInDistance) {
|
||||
public DInstancePlayerUpdateEvent(DInstancePlayer dPlayer, boolean locationValid, boolean teleportWolf, 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;
|
||||
@ -73,20 +71,6 @@ public class DInstancePlayerUpdateEvent extends DInstancePlayerEvent implements
|
||||
this.teleportWolf = teleportWolf;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return if the player's inventory gets respawned
|
||||
*/
|
||||
public boolean isRespawnInventory() {
|
||||
return respawnInventory;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param respawnInventory respawn the player's old inventory on this update?
|
||||
*/
|
||||
public void setRespawnInventory(boolean respawnInventory) {
|
||||
this.respawnInventory = respawnInventory;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return if the player is offline
|
||||
*/
|
||||
|
@ -16,7 +16,6 @@
|
||||
*/
|
||||
package de.erethon.dungeonsxl.global;
|
||||
|
||||
import de.erethon.caliburn.item.VanillaItem;
|
||||
import de.erethon.commons.misc.BlockUtil;
|
||||
import de.erethon.dungeonsxl.DungeonsXL;
|
||||
import de.erethon.dungeonsxl.dungeon.Dungeon;
|
||||
|
@ -176,7 +176,7 @@ public class DEditPlayer extends DInstancePlayer {
|
||||
}
|
||||
}
|
||||
|
||||
DInstancePlayerUpdateEvent event = new DInstancePlayerUpdateEvent(this, locationValid, false, false, false, false, false);
|
||||
DInstancePlayerUpdateEvent event = new DInstancePlayerUpdateEvent(this, locationValid, false, false, false, false);
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
|
||||
if (event.isCancelled()) {
|
||||
|
@ -559,11 +559,7 @@ public class DGamePlayer extends DInstancePlayer {
|
||||
gameWorld.sendMessage(DMessage.GROUP_DEATH_KICK.getMessage(getName(), dGroup.getName()));
|
||||
}
|
||||
|
||||
GameRuleProvider rules = Game.getByPlayer(player).getRules();
|
||||
leave();
|
||||
if (rules.getKeepInventoryOnEscape() && rules.getKeepInventoryOnDeath()) {
|
||||
applyRespawnInventory();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -744,13 +740,6 @@ public class DGamePlayer extends DInstancePlayer {
|
||||
if (wolf != null) {
|
||||
wolf.teleport(getPlayer());
|
||||
}
|
||||
|
||||
// Respawn Items
|
||||
Game game = Game.getByWorld(getWorld());
|
||||
|
||||
if (game != null && game.getRules().getKeepInventoryOnDeath()) {
|
||||
applyRespawnInventory();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -848,12 +837,9 @@ public class DGamePlayer extends DInstancePlayer {
|
||||
}
|
||||
|
||||
if (game.getRules().getKeepInventoryOnDeath()) {
|
||||
setRespawnInventory(event.getEntity().getInventory().getContents());
|
||||
setRespawnArmor(event.getEntity().getInventory().getArmorContents());
|
||||
// Delete all drops
|
||||
for (ItemStack item : event.getDrops()) {
|
||||
item.setType(VanillaItem.AIR.getMaterial());
|
||||
}
|
||||
event.setKeepInventory(true);
|
||||
event.setKeepLevel(true);
|
||||
event.setDroppedExp(0);
|
||||
}
|
||||
|
||||
if (getDGroup() != null && dGroup.getLives() != -1) {
|
||||
@ -904,7 +890,6 @@ public class DGamePlayer extends DInstancePlayer {
|
||||
boolean locationValid = true;
|
||||
Location teleportLocation = player.getLocation();
|
||||
boolean teleportWolf = false;
|
||||
boolean respawnInventory = false;
|
||||
boolean offline = false;
|
||||
boolean kick = false;
|
||||
boolean triggerAllInDistance = false;
|
||||
@ -926,11 +911,6 @@ public class DGamePlayer extends DInstancePlayer {
|
||||
if (getWolf() != null) {
|
||||
teleportWolf = true;
|
||||
}
|
||||
|
||||
// Respawn Items
|
||||
if (getRespawnInventory() != null || getRespawnArmor() != null) {
|
||||
respawnInventory = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -965,7 +945,7 @@ public class DGamePlayer extends DInstancePlayer {
|
||||
triggerAllInDistance = true;
|
||||
}
|
||||
|
||||
DInstancePlayerUpdateEvent event = new DInstancePlayerUpdateEvent(this, locationValid, teleportWolf, respawnInventory, offline, kick, triggerAllInDistance);
|
||||
DInstancePlayerUpdateEvent event = new DInstancePlayerUpdateEvent(this, locationValid, teleportWolf, offline, kick, triggerAllInDistance);
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
|
||||
if (event.isCancelled()) {
|
||||
@ -980,10 +960,6 @@ public class DGamePlayer extends DInstancePlayer {
|
||||
getWolf().teleport(teleportLocation);
|
||||
}
|
||||
|
||||
if (respawnInventory) {
|
||||
applyRespawnInventory();
|
||||
}
|
||||
|
||||
if (kick) {
|
||||
DPlayerKickEvent dPlayerKickEvent = new DPlayerKickEvent(this, DPlayerKickEvent.Cause.OFFLINE);
|
||||
Bukkit.getPluginManager().callEvent(dPlayerKickEvent);
|
||||
|
@ -61,8 +61,6 @@ public class DGlobalPlayer implements PlayerWrapper {
|
||||
private ItemStack cachedItem;
|
||||
private boolean announcerEnabled = true;
|
||||
|
||||
private ItemStack[] respawnInventory;
|
||||
private ItemStack[] respawnArmor;
|
||||
private List<ItemStack> rewardItems;
|
||||
|
||||
public DGlobalPlayer(DungeonsXL plugin, Player player) {
|
||||
@ -90,8 +88,6 @@ public class DGlobalPlayer implements PlayerWrapper {
|
||||
chatSpyMode = dPlayer.isInChatSpyMode();
|
||||
creatingPortal = dPlayer.getPortal();
|
||||
announcerEnabled = dPlayer.isAnnouncerEnabled();
|
||||
respawnInventory = dPlayer.getRespawnInventory();
|
||||
respawnArmor = dPlayer.getRespawnArmor();
|
||||
|
||||
plugin.getDPlayerCache().addPlayer(this);
|
||||
}
|
||||
@ -232,48 +228,6 @@ public class DGlobalPlayer implements PlayerWrapper {
|
||||
announcerEnabled = enabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the respawnInventory
|
||||
*/
|
||||
public ItemStack[] getRespawnInventory() {
|
||||
return respawnInventory;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param respawnInventory the respawnInventory to set
|
||||
*/
|
||||
public void setRespawnInventory(ItemStack[] respawnInventory) {
|
||||
this.respawnInventory = respawnInventory;
|
||||
}
|
||||
|
||||
/**
|
||||
* Give the saved respawn inventory to the player
|
||||
*/
|
||||
public void applyRespawnInventory() {
|
||||
if (respawnInventory == null || respawnArmor == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
player.getInventory().setContents(respawnInventory);
|
||||
player.getInventory().setArmorContents(respawnArmor);
|
||||
respawnInventory = null;
|
||||
respawnArmor = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the respawnArmor
|
||||
*/
|
||||
public ItemStack[] getRespawnArmor() {
|
||||
return respawnArmor;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param respawnArmor the respawnArmor to set
|
||||
*/
|
||||
public void setRespawnArmor(ItemStack[] respawnArmor) {
|
||||
this.respawnArmor = respawnArmor;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param permission the permission to check
|
||||
* @return if the player has the permission
|
||||
|
@ -450,7 +450,6 @@ public class DPlayerListener implements Listener {
|
||||
if (isCitizensNPC(player)) {
|
||||
return;
|
||||
}
|
||||
plugin.getDPlayerCache().getByPlayer(player).applyRespawnInventory();
|
||||
|
||||
DGlobalPlayer dPlayer = DGamePlayer.getByPlayer(player);
|
||||
if (dPlayer == null) {
|
||||
@ -488,7 +487,7 @@ public class DPlayerListener implements Listener {
|
||||
}
|
||||
|
||||
// Because some plugins set another respawn point, DXL teleports a few ticks later.
|
||||
new RespawnTask(plugin, player, respawn).runTaskLater(plugin, 10L);
|
||||
new RespawnTask(player, respawn).runTaskLater(plugin, 10L);
|
||||
|
||||
// Don't forget Doge!
|
||||
if (gamePlayer.getWolf() != null) {
|
||||
|
@ -17,7 +17,6 @@
|
||||
package de.erethon.dungeonsxl.player;
|
||||
|
||||
import de.erethon.commons.player.PlayerUtil;
|
||||
import de.erethon.dungeonsxl.DungeonsXL;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
@ -27,14 +26,10 @@ import org.bukkit.scheduler.BukkitRunnable;
|
||||
*/
|
||||
public class RespawnTask extends BukkitRunnable {
|
||||
|
||||
private DPlayerCache dPlayers;
|
||||
|
||||
private Player player;
|
||||
private Location location;
|
||||
|
||||
public RespawnTask(DungeonsXL plugin, Player player, Location location) {
|
||||
dPlayers = plugin.getDPlayerCache();
|
||||
|
||||
public RespawnTask(Player player, Location location) {
|
||||
this.location = location;
|
||||
this.player = player;
|
||||
}
|
||||
@ -47,14 +42,6 @@ public class RespawnTask extends BukkitRunnable {
|
||||
if (player.getWorld() != location.getWorld() || player.getLocation().distance(location) > 2) {
|
||||
PlayerUtil.secureTeleport(player, location);
|
||||
}
|
||||
|
||||
DGlobalPlayer dPlayer = dPlayers.getByPlayer(player);
|
||||
|
||||
if (dPlayer == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
dPlayer.applyRespawnInventory();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -19,7 +19,6 @@ package de.erethon.dungeonsxl.player;
|
||||
import de.erethon.commons.chat.MessageUtil;
|
||||
import de.erethon.dungeonsxl.config.DMessage;
|
||||
import de.erethon.dungeonsxl.event.dplayer.DPlayerKickEvent;
|
||||
import de.erethon.dungeonsxl.game.Game;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -66,11 +65,7 @@ public class TimeIsRunningTask extends BukkitRunnable {
|
||||
|
||||
if (!dPlayerKickEvent.isCancelled()) {
|
||||
MessageUtil.broadcastMessage(DMessage.PLAYER_TIME_KICK.getMessage(player.getName()));
|
||||
boolean keepInventory = Game.getByDGroup(dGroup).getRules().getKeepInventoryOnEscape();
|
||||
dPlayer.leave();
|
||||
if (keepInventory) {
|
||||
dPlayer.applyRespawnInventory();
|
||||
}
|
||||
}
|
||||
|
||||
cancel();
|
||||
|
Loading…
Reference in New Issue
Block a user