package net.radsteve.islanders.mixin; import net.minecraft.entity.ItemEntity; import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.radsteve.islanders.Islanders; import net.radsteve.islanders.SpecialItem; import net.radsteve.islanders.event.ItemPickupCallback; import net.radsteve.islanders.event.ResizeItemEntityAndAddRemainingStackCallback; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Debug; 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; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.UUID; @Mixin(ItemEntity.class) @Debug(export = true) public abstract class ItemEntityMixin { @Shadow private int pickupDelay; @Shadow private @Nullable UUID owner; @Shadow public abstract ItemStack getStack(); @Inject(method = "onPlayerCollision", at = @At("HEAD"), cancellable = true) private void islanders$onPlayerCollision(PlayerEntity player, CallbackInfo ci) { if (pickupDelay != 0 && (owner == null || owner.equals(player.getUuid()))) { return; } if (ItemPickupCallback.Companion.getEVENT().invoker().canPickUp(getStack(), ItemEntity.class.cast(this), (ServerPlayerEntity) player)) { return; } ResizeItemEntityAndAddRemainingStackCallback.Companion.getEVENT().invoker().resize(ItemEntity.class.cast(this), (ServerPlayerEntity) player); ci.cancel(); } @Inject(method = "damage", at = @At("HEAD"), cancellable = true) private void islanders$damage(ServerWorld world, DamageSource source, float amount, CallbackInfoReturnable cir) { final SpecialItem item = SpecialItem.Companion.find(getStack()); if (item != null) { Islanders.getLogger().info("Attempted to damage special item {} by {}", item.getId(), source.getType().msgId()); cir.setReturnValue(false); } } }