mod for the islanders smp
at master 58 lines 2.2 kB view raw
1package net.radsteve.islanders.mixin; 2 3import net.minecraft.entity.ItemEntity; 4import net.minecraft.entity.damage.DamageSource; 5import net.minecraft.entity.player.PlayerEntity; 6import net.minecraft.item.ItemStack; 7import net.minecraft.server.network.ServerPlayerEntity; 8import net.minecraft.server.world.ServerWorld; 9import net.radsteve.islanders.Islanders; 10import net.radsteve.islanders.SpecialItem; 11import net.radsteve.islanders.event.ItemPickupCallback; 12import net.radsteve.islanders.event.ResizeItemEntityAndAddRemainingStackCallback; 13import org.jetbrains.annotations.Nullable; 14import org.spongepowered.asm.mixin.Debug; 15import org.spongepowered.asm.mixin.Mixin; 16import org.spongepowered.asm.mixin.Shadow; 17import org.spongepowered.asm.mixin.injection.At; 18import org.spongepowered.asm.mixin.injection.Inject; 19import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 20import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 21 22import java.util.UUID; 23 24@Mixin(ItemEntity.class) 25@Debug(export = true) 26public abstract class ItemEntityMixin { 27 @Shadow 28 private int pickupDelay; 29 @Shadow 30 private @Nullable UUID owner; 31 32 @Shadow 33 public abstract ItemStack getStack(); 34 35 @Inject(method = "onPlayerCollision", at = @At("HEAD"), cancellable = true) 36 private void islanders$onPlayerCollision(PlayerEntity player, CallbackInfo ci) { 37 if (pickupDelay != 0 && (owner == null || owner.equals(player.getUuid()))) { 38 return; 39 } 40 41 if (ItemPickupCallback.Companion.getEVENT().invoker().canPickUp(getStack(), ItemEntity.class.cast(this), (ServerPlayerEntity) player)) { 42 return; 43 } 44 45 ResizeItemEntityAndAddRemainingStackCallback.Companion.getEVENT().invoker().resize(ItemEntity.class.cast(this), (ServerPlayerEntity) player); 46 47 ci.cancel(); 48 } 49 50 @Inject(method = "damage", at = @At("HEAD"), cancellable = true) 51 private void islanders$damage(ServerWorld world, DamageSource source, float amount, CallbackInfoReturnable<Boolean> cir) { 52 final SpecialItem item = SpecialItem.Companion.find(getStack()); 53 if (item != null) { 54 Islanders.getLogger().info("Attempted to damage special item {} by {}", item.getId(), source.getType().msgId()); 55 cir.setReturnValue(false); 56 } 57 } 58}