LeashedPlayer/src/main/java/com/r3944realms/leashedplayer/mixin/item/MixinLeadItem.java
3944Realms 6c9f27041d 2024/11/11
添加了彩蛋物品的獲取方式
2024-11-11 13:56:19 +08:00

66 lines
2.8 KiB
Java

package com.r3944realms.leashedplayer.mixin.item;
import com.r3944realms.leashedplayer.modInterface.PlayerLeashable;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.Leashable;
import net.minecraft.world.entity.decoration.LeashFenceKnotEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Equipable;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.LeadItem;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.gameevent.GameEvent;
import org.jetbrains.annotations.NotNull;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.List;
@Mixin(LeadItem.class)
public class MixinLeadItem implements Equipable {
/**
* 拴住自己的逻辑
*/
@Inject(
method = {"bindPlayerMobs"},
at = @At("HEAD"),
cancellable = true)
private static void selfLeash(Player pPlayer, Level pLevel, BlockPos pPos, CallbackInfoReturnable<InteractionResult> cir) {
List<Leashable> list = LeadItem.leashableInArea(pLevel, pPos, p_353025_ -> p_353025_.getLeashHolder() == pPlayer);
if (list.isEmpty()) {
ItemStack mainHandItem = pPlayer.getMainHandItem();
if (!(mainHandItem.getItem() instanceof LeadItem )) {
return;
}
//非创造模式减少,防止刷物品
if(!pPlayer.isCreative()) mainHandItem.shrink(1);
//自己
Entity leashDataEntity = PlayerLeashable.getLeashDataEntity((ServerPlayer) pPlayer, (ServerLevel) pLevel);
PlayerLeashable playerLeashable = (PlayerLeashable) pPlayer;
if(leashDataEntity != null) {
playerLeashable.dropLeash(true, true);
}
//获取拴绳结实体
LeashFenceKnotEntity leashfenceknotentity = LeashFenceKnotEntity.getOrCreateKnot(pLevel, pPos);
//播放绳结被放置的声音
leashfenceknotentity.playPlacementSound();
//将自己与拴绳结绑定LeashData
playerLeashable.setLeashedTo(leashfenceknotentity, true);
pLevel.gameEvent(GameEvent.BLOCK_ATTACH, pPos, GameEvent.Context.of(pPlayer));
cir.setReturnValue(InteractionResult.SUCCESS);
}
}
@Override
public @NotNull EquipmentSlot getEquipmentSlot() {
return EquipmentSlot.HEAD;
}
}