package net.radsteve.islanders.mixin; import kotlin.Pair; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.damage.DamageTypes; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; import net.minecraft.scoreboard.Scoreboard; import net.minecraft.server.world.ServerWorld; import net.radsteve.islanders.Islanders; import net.radsteve.islanders.ItemEffects; import net.radsteve.islanders.SpecialItem; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(PlayerEntity.class) public abstract class PlayerEntityMixin { @Shadow @Final PlayerInventory inventory; @Shadow public abstract Scoreboard getScoreboard(); @Shadow public abstract String getNameForScoreboard(); @Inject(method = "dropInventory", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerInventory;dropAll()V")) private void islanders$dropInventory(ServerWorld world, CallbackInfo ci) { final LivingEntity entity = LivingEntity.class.cast(this); final DamageSource recentDamageSource = entity.getRecentDamageSource(); if (recentDamageSource != null && entity.getRecentDamageSource().isOf(DamageTypes.OUT_OF_WORLD)) { Islanders.getLogger().info("{} died to the void with special items on them, dropping items", entity.getNameForScoreboard()); return; } if (entity.getPrimeAdversary() instanceof PlayerEntity killer) { Islanders.getLogger().info("{} died to {} with special items on them, dropping items", entity.getNameForScoreboard(), killer.getNameForScoreboard()); return; } Islanders.getLogger().info("{} died with special items on them without a killer, giving back on respawn", entity.getNameForScoreboard()); for (int idx = 0; idx < this.inventory.size(); idx++) { ItemStack stack = this.inventory.getStack(idx); if (SpecialItem.Companion.find(stack) != null) { ItemEffects.INSTANCE.getItemsToRegive().add(new Pair<>(stack, entity.getUuid())); inventory.removeStack(idx); } } SpecialItem.getEntries().forEach(item -> { if (item.getTeam().getPlayerList().contains(getNameForScoreboard())) { getScoreboard().removeScoreHolderFromTeam(getNameForScoreboard(), item.getTeam()); } }); } }