mod for the islanders smp
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}