Rewrite keepInventoryOnDeath implementation; fix EXP loss; resolves #579

This commit is contained in:
Daniel Saukel 2019-06-17 23:53:24 +02:00
parent 86c09f6a72
commit 2641fb7e5c
8 changed files with 8 additions and 114 deletions

View File

@ -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
*/

View File

@ -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;

View File

@ -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()) {

View File

@ -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);

View File

@ -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

View File

@ -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) {

View File

@ -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();
}
}

View File

@ -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();