package net.radsteve.islanders.mixin; import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.decoration.ArmorStandEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.math.Vec3d; import net.radsteve.islanders.SpecialItem; 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.CallbackInfoReturnable; @Mixin(ArmorStandEntity.class) public abstract class ArmorStandEntityMixin { @Shadow protected abstract EquipmentSlot getSlotFromPosition(Vec3d hitPos); @Inject(method = "interactAt", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/decoration/ArmorStandEntity;equip(Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/entity/EquipmentSlot;Lnet/minecraft/item/ItemStack;Lnet/minecraft/util/Hand;)Z", ordinal = 1)) private void islanders$interactAt$glowingEnable(PlayerEntity player, Vec3d hitPos, Hand hand, CallbackInfoReturnable cir, @Local ItemStack stack) { final SpecialItem item = SpecialItem.Companion.find(stack); if (item == null) { return; } item.dropped((ServerPlayerEntity) player, true); final LivingEntity entity = LivingEntity.class.cast(this); entity.setGlowing(true); entity.getWorld().getScoreboard().addScoreHolderToTeam(entity.getNameForScoreboard(), item.getTeam()); } @Inject(method = "interactAt", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isEmpty()Z")) private void islanders$interactAt$glowingDisable(PlayerEntity player, Vec3d hitPos, Hand hand, CallbackInfoReturnable cir) { final LivingEntity entity = LivingEntity.class.cast(this); final EquipmentSlot hitSlot = getSlotFromPosition(hitPos); final ItemStack stack = entity.getEquippedStack(hitSlot); final SpecialItem item = SpecialItem.Companion.find(stack); if (item == null) { return; } item.pickedUp((ServerPlayerEntity) player); boolean containsMoreSpecialItems = false; for (final EquipmentSlot slot : EquipmentSlot.values()) { final ItemStack content = ((LivingEntityAccessor) entity).getEquipment().get(slot); final SpecialItem itemContent = SpecialItem.Companion.find(content); if (itemContent != null && !itemContent.getId().contentEquals(item.getId())) { containsMoreSpecialItems = true; break; } } if (!containsMoreSpecialItems) { entity.setGlowing(false); } } }