Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 32 additions & 7 deletions src/main/java/fr/openmc/core/features/corpse/CorpseListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,19 @@
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;
import org.bukkit.OfflinePlayer;
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.*;
Expand All @@ -31,12 +34,32 @@

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;

Expand All @@ -45,9 +68,12 @@
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();
}
Expand All @@ -65,85 +91,84 @@
CorpseManager.deleteCorpse(ownerUUID, FoundTypes.NOT_FOUND);
}

@EventHandler
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-", ""));

if (!CorpseManager.hasCorpseDB(ownerUUID)) {
OMCPlugin.getInstance().getLogger().warning("Corpse found with no DB");
return;
}

DBCorpse corpse = CorpseManager.getCorpsesDB().get(ownerUUID);

if (!corpse.getPlayerUUID().equals(ownerUUID)) {
OMCPlugin.getInstance().getLogger().warning("The ownerUUID did not match with the corpse's playerUUID");
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);

if (offlineOwner != null)
MessagesManager.sendMessage(offlineOwner, TranslationManager.translation("feature.corpse.messages.warn_strip")
.color(TextColor.color(Color.YELLOW.asRGB())),
Prefix.CORPSE, MessageType.WARNING, true);

corpse.dropLoot();
CorpseManager.deleteCorpse(ownerUUID, FoundTypes.STRIP);
return;
}

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

ItemStack[] inventory = corpse.getInventoryContent().clone();

int exp = corpse.getExp();

if (player.getInventory().isEmpty()) {
player.getInventory().setContents(inventory);
}
else {
List<ItemStack> remaining = new ArrayList<>();

for (ItemStack item : inventory) {
if (!ItemUtils.hasEnoughSpace(player, item, item.getAmount())) {
remaining.add(item);
} else {
player.getInventory().addItem(item);
}
}

if (!remaining.isEmpty()) {
ItemStack[] rm = remaining.toArray(ItemStack[]::new);
CorpseManager.sendMailItems(player, player, rm);
}
}

player.setExperienceLevelAndProgress(exp);

player.playSound(player.getLocation(), equipSound, 1f, 0);

CorpseManager.deleteCorpse(ownerUUID, FoundTypes.FOUND);
}
}

Check notice on line 173 in src/main/java/fr/openmc/core/features/corpse/CorpseListener.java

View check run for this annotation

codefactor.io / CodeFactor

src/main/java/fr/openmc/core/features/corpse/CorpseListener.java#L94-L173

Complex Method
}
11 changes: 9 additions & 2 deletions src/main/java/fr/openmc/core/features/corpse/CorpseManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,12 @@ public class CorpseManager extends Feature implements LoadIfEnable<FancyNpcsHook

public static final Map<UUID, Location> lastSafeLocation = new ConcurrentHashMap<>();

public static final List<String> ALLOWED_DIM = List.of(
"world", "world_nether", "world_the_end"
);



@Override
public void init() {
CorpseNPCManager.init();
Expand Down Expand Up @@ -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();

Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
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;
import fr.openmc.core.features.corpse.CorpseManager;
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;
Expand Down Expand Up @@ -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("<red>☠</red>" + "<gray> " + ownerDisplayName + "</gray>");
dataCorpse.setDisplayName("<red>☠ </red><gray><lang:feature.corpse.npc.display.owner:" + ownerName + "></gray>");

dataCorpse.addEquipment(NpcEquipmentSlot.HEAD, helmet);
dataCorpse.addEquipment(NpcEquipmentSlot.CHEST, chestplate);
Expand All @@ -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));
Expand 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))
Expand Down
Loading