Skip to content

Commit

Permalink
Rewrite keepInventoryOnDeath implementation; fix EXP loss; resolves #579
Browse files Browse the repository at this point in the history
  • Loading branch information
Sataniel98 committed Jun 17, 2019
1 parent 86c09f6 commit 2641fb7
Show file tree
Hide file tree
Showing 8 changed files with 8 additions and 114 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -73,20 +71,6 @@ public void setTeleportWolf(boolean teleportWolf) {
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
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ public void update(boolean updateSecond) {
}
}

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()) {
Expand Down
32 changes: 4 additions & 28 deletions core/src/main/java/de/erethon/dungeonsxl/player/DGamePlayer.java
Original file line number Diff line number Diff line change
Expand Up @@ -559,11 +559,7 @@ public void kill() {
gameWorld.sendMessage(DMessage.GROUP_DEATH_KICK.getMessage(getName(), dGroup.getName()));
}

GameRuleProvider rules = Game.getByPlayer(player).getRules();
leave();
if (rules.getKeepInventoryOnEscape() && rules.getKeepInventoryOnDeath()) {
applyRespawnInventory();
}
}
}

Expand Down Expand Up @@ -744,13 +740,6 @@ public void respawn() {
if (wolf != null) {
wolf.teleport(getPlayer());
}

// Respawn Items
Game game = Game.getByWorld(getWorld());

if (game != null && game.getRules().getKeepInventoryOnDeath()) {
applyRespawnInventory();
}
}

/**
Expand Down Expand Up @@ -848,12 +837,9 @@ public void onDeath(PlayerDeathEvent event) {
}

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) {
Expand Down Expand Up @@ -904,7 +890,6 @@ public void update(boolean updateSecond) {
boolean locationValid = true;
Location teleportLocation = player.getLocation();
boolean teleportWolf = false;
boolean respawnInventory = false;
boolean offline = false;
boolean kick = false;
boolean triggerAllInDistance = false;
Expand All @@ -926,11 +911,6 @@ public void update(boolean updateSecond) {
if (getWolf() != null) {
teleportWolf = true;
}

// Respawn Items
if (getRespawnInventory() != null || getRespawnArmor() != null) {
respawnInventory = true;
}
}
}

Expand Down Expand Up @@ -965,7 +945,7 @@ public void update(boolean updateSecond) {
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()) {
Expand All @@ -980,10 +960,6 @@ public void update(boolean updateSecond) {
getWolf().teleport(teleportLocation);
}

if (respawnInventory) {
applyRespawnInventory();
}

if (kick) {
DPlayerKickEvent dPlayerKickEvent = new DPlayerKickEvent(this, DPlayerKickEvent.Cause.OFFLINE);
Bukkit.getPluginManager().callEvent(dPlayerKickEvent);
Expand Down
46 changes: 0 additions & 46 deletions core/src/main/java/de/erethon/dungeonsxl/player/DGlobalPlayer.java
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -90,8 +88,6 @@ public DGlobalPlayer(DGlobalPlayer dPlayer) {
chatSpyMode = dPlayer.isInChatSpyMode();
creatingPortal = dPlayer.getPortal();
announcerEnabled = dPlayer.isAnnouncerEnabled();
respawnInventory = dPlayer.getRespawnInventory();
respawnArmor = dPlayer.getRespawnArmor();

plugin.getDPlayerCache().addPlayer(this);
}
Expand Down Expand Up @@ -232,48 +228,6 @@ public void setAnnouncerEnabled(boolean enabled) {
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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -450,7 +450,6 @@ public void onPlayerRespawn(PlayerRespawnEvent event) {
if (isCitizensNPC(player)) {
return;
}
plugin.getDPlayerCache().getByPlayer(player).applyRespawnInventory();

DGlobalPlayer dPlayer = DGamePlayer.getByPlayer(player);
if (dPlayer == null) {
Expand Down Expand Up @@ -488,7 +487,7 @@ public void onPlayerRespawn(PlayerRespawnEvent event) {
}

// 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) {
Expand Down
15 changes: 1 addition & 14 deletions core/src/main/java/de/erethon/dungeonsxl/player/RespawnTask.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -27,14 +26,10 @@
*/
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;
}
Expand All @@ -47,14 +42,6 @@ public void run() {
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();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
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;
Expand Down Expand Up @@ -66,11 +65,7 @@ public void run() {

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();
Expand Down

0 comments on commit 2641fb7

Please sign in to comment.