diff --git a/src/main/java/fr/openmc/core/features/corpse/CorpseListener.java b/src/main/java/fr/openmc/core/features/corpse/CorpseListener.java index 7fa4f6275..29041552c 100644 --- a/src/main/java/fr/openmc/core/features/corpse/CorpseListener.java +++ b/src/main/java/fr/openmc/core/features/corpse/CorpseListener.java @@ -13,6 +13,7 @@ import fr.openmc.core.utils.text.messages.MessagesManager; import fr.openmc.core.utils.text.messages.Prefix; import fr.openmc.core.utils.text.messages.TranslationManager; +import fr.openmc.core.utils.world.WorldUtils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.TextColor; import org.bukkit.Color; @@ -20,9 +21,11 @@ import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.inventory.ItemStack; import java.util.*; @@ -31,12 +34,32 @@ public class CorpseListener implements Listener { private final Sound equipSound = Sound.ITEM_ARMOR_EQUIP_CHAIN; + @EventHandler(ignoreCancelled = true) + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + + if (CorpseManager.hasCorpseDB(player.getUniqueId())) { + + DBCorpse dbCorpse = CorpseManager.getCorpsesDB().get(player.getUniqueId()); + + if (dbCorpse.isKillByPlayer()) return; + + if (!player.hasPermission("fancynpcs.npc.corpse-" + player.getUniqueId() + ".see")) + player.addAttachment(OMCPlugin.getInstance(), "fancynpcs.npc.corpse-" + player.getUniqueId() + ".see", true); + } + } + @EventHandler public void onPlayerDeath(PlayerDeathEvent event) { + + if (!CorpseManager.ALLOWED_DIM.contains(event.getPlayer().getWorld().getName())) return; + Player player = event.getPlayer(); OMCPlayer omcPlayer = OMCPlayer.of(player); + boolean killByPlayer = false; + if (omcPlayer.city().hasCity()) if (omcPlayer.city().getCity().isInWar()) return; @@ -45,9 +68,12 @@ public void onPlayerDeath(PlayerDeathEvent event) { if (player.getLastDamageCause() != null) cause = player.getLastDamageCause().getCause(); + if (event.getEntity().getKiller() != null && !event.getEntity().getKiller().getUniqueId().equals(player.getUniqueId())) + killByPlayer = true; + if (!CorpseManager.hasCorpseDB(player.getUniqueId()) &&!CorpseNPCManager.hasNPC(player.getUniqueId())) { - if (CorpseManager.createCorpse(player, (event.getEntity().getKiller() != null), cause)) { + if (CorpseManager.createCorpse(player, killByPlayer, cause)) { event.setDroppedExp(0); event.getDrops().clear(); } @@ -70,8 +96,6 @@ public void onNPCInteraction(NpcInteractEvent event) { Player player = event.getPlayer(); - if (DynamicCooldownManager.isReady(player.getUniqueId(), "corpse")) return; - if (event.getNpc().getData().getName().startsWith("corpse-")) { UUID ownerUUID = UUID.fromString(event.getNpc().getData().getName().replace("corpse-", "")); @@ -87,13 +111,15 @@ public void onNPCInteraction(NpcInteractEvent event) { return; } - if (corpse.isKillByPlayer()) { + if (DynamicCooldownManager.isReady(ownerUUID, "corpse")) return; + + if (corpse.isKillByPlayer() && !player.getUniqueId().equals(corpse.getPlayerUUID())) { OfflinePlayer offlinePlayer = CacheOfflinePlayer.getOfflinePlayer(player.getUniqueId()); OfflinePlayer offlineOwner = CacheOfflinePlayer.getOfflinePlayer(ownerUUID); if (offlinePlayer != null) MessagesManager.sendMessage(offlinePlayer, TranslationManager.translation("feature.corpse.messages.strip", - Component.text(offlineOwner != null ? offlineOwner.getName() : "Unknow Player")) + Component.text(offlineOwner != null ? offlineOwner.getName() : "Unknow Player")) .color(TextColor.color(Color.YELLOW.asRGB())), Prefix.CORPSE, MessageType.INFO, true); @@ -108,8 +134,7 @@ public void onNPCInteraction(NpcInteractEvent event) { } if (!player.getUniqueId().equals(corpse.getPlayerUUID())) { - OfflinePlayer offlinePlayer = CacheOfflinePlayer.getOfflinePlayer(ownerUUID); - MessagesManager.sendMessage(offlinePlayer, TranslationManager.translation("feature.corpse.messages.not_owner"), + MessagesManager.sendMessage(player, TranslationManager.translation("feature.corpse.messages.not_owner"), Prefix.CORPSE, MessageType.WARNING, true); return; } diff --git a/src/main/java/fr/openmc/core/features/corpse/CorpseManager.java b/src/main/java/fr/openmc/core/features/corpse/CorpseManager.java index 2e5e9e505..0ac892341 100644 --- a/src/main/java/fr/openmc/core/features/corpse/CorpseManager.java +++ b/src/main/java/fr/openmc/core/features/corpse/CorpseManager.java @@ -54,6 +54,12 @@ public class CorpseManager extends Feature implements LoadIfEnable lastSafeLocation = new ConcurrentHashMap<>(); + public static final List ALLOWED_DIM = List.of( + "world", "world_nether", "world_the_end" + ); + + + @Override public void init() { CorpseNPCManager.init(); @@ -94,7 +100,8 @@ private static void startVoidDetection() { Location loc = player.getLocation(); - if (lastSafeLocation.get(player.getUniqueId()).equals(loc)) continue; + if (lastSafeLocation.containsKey(player.getUniqueId())) + if (lastSafeLocation.get(player.getUniqueId()).equals(loc)) continue; Block blockUnder = loc.clone().subtract(0, 1, 0).getBlock(); @@ -157,7 +164,7 @@ public static boolean createCorpse(Player player, boolean killByPlayer, EntityDa } if (exposedLocation != null) - location = exposedLocation; + location = exposedLocation.add(0, -0.4, 0); } case VOID -> { location = getLastSafePositionOf(player); diff --git a/src/main/java/fr/openmc/core/features/corpse/npc/CorpseNPCManager.java b/src/main/java/fr/openmc/core/features/corpse/npc/CorpseNPCManager.java index 318e89392..f5f8cbadf 100644 --- a/src/main/java/fr/openmc/core/features/corpse/npc/CorpseNPCManager.java +++ b/src/main/java/fr/openmc/core/features/corpse/npc/CorpseNPCManager.java @@ -1,6 +1,7 @@ package fr.openmc.core.features.corpse.npc; import de.oliver.fancynpcs.api.*; +import de.oliver.fancynpcs.api.data.property.NpcVisibility; import de.oliver.fancynpcs.api.utils.NpcEquipmentSlot; import fr.openmc.api.cooldown.DynamicCooldownManager; import fr.openmc.core.OMCPlugin; @@ -8,11 +9,13 @@ import fr.openmc.core.features.corpse.model.DBCorpse; import fr.openmc.core.hooks.FancyNpcsHook; import fr.openmc.core.utils.cache.CacheOfflinePlayer; +import fr.openmc.core.utils.cache.PlayerNameCache; import fr.openmc.core.utils.text.messages.TranslationManager; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.OfflinePlayer; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.entity.Pose; @@ -92,16 +95,15 @@ public static boolean createNPCS(Player owner, Location deathLocation, ItemStack UUID ownerUUID = owner.getUniqueId(); NpcData dataCorpse = new NpcData("corpse-" + ownerUUID, ownerUUID, deathLocation); - String ownerName = CacheOfflinePlayer.getOfflinePlayer(ownerUUID).getName(); + String ownerName = PlayerNameCache.getName(ownerUUID); if (ownerName == null) return false; - dataCorpse.setSkin(ownerName); + dataCorpse.setType(EntityType.PLAYER); - String ownerDisplayName = LegacyComponentSerializer.legacySection() - .serialize(TranslationManager.translation("feature.corpse.npc.display.owner", Component.text(ownerName))); + dataCorpse.setSkin(ownerName); - dataCorpse.setDisplayName("" + " " + ownerDisplayName + ""); + dataCorpse.setDisplayName(""); dataCorpse.addEquipment(NpcEquipmentSlot.HEAD, helmet); dataCorpse.addEquipment(NpcEquipmentSlot.CHEST, chestplate); @@ -114,6 +116,13 @@ public static boolean createNPCS(Player owner, Location deathLocation, ItemStack pose.name().toLowerCase() ); + if (!all) { + dataCorpse.setVisibility(NpcVisibility.PERMISSION_REQUIRED); + owner.addAttachment(OMCPlugin.getInstance(), "fancynpcs.npc." + dataCorpse.getName() + ".see", true); + } + else + dataCorpse.setVisibility(NpcVisibility.ALL); + Npc npcCorpse = FancyNpcsPlugin.get().getNpcAdapter().apply(dataCorpse); corpseNpcMap.put(ownerUUID, new CorpseNPC(npcCorpse, deathLocation, ownerUUID, helmet, chestplate, leggings, boots, pose, all)); @@ -122,13 +131,7 @@ public static boolean createNPCS(Player owner, Location deathLocation, ItemStack npcCorpse.create(); - Bukkit.getScheduler().runTaskAsynchronously(OMCPlugin.getInstance(), () -> { - if (!all) - npcCorpse.spawn(owner); - else - npcCorpse.spawnForAll(); - npcCorpse.getData().setSpawnEntity(true); - }); + Bukkit.getScheduler().runTaskAsynchronously(OMCPlugin.getInstance(), npcCorpse::spawnForAll); if (DynamicCooldownManager.getCooldowns(owner.getUniqueId()) != null && DynamicCooldownManager.getCooldowns(owner.getUniqueId()).containsKey(COOLDOWN_GROUP))