实现初步的多目标添加

This commit is contained in:
17146 2025-07-08 23:14:26 +08:00 committed by Light_Quanta
parent 380dbf79b7
commit b8bcac246d
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
2 changed files with 78 additions and 37 deletions

View file

@ -9,7 +9,6 @@ import com.atsuishio.superbwarfare.init.ModSounds;
import com.atsuishio.superbwarfare.item.ArtilleryIndicator; import com.atsuishio.superbwarfare.item.ArtilleryIndicator;
import com.atsuishio.superbwarfare.item.Monitor; import com.atsuishio.superbwarfare.item.Monitor;
import com.atsuishio.superbwarfare.item.common.ammo.MortarShell; import com.atsuishio.superbwarfare.item.common.ammo.MortarShell;
import com.atsuishio.superbwarfare.tools.NBTTool;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.commands.arguments.EntityAnchorArgument; import net.minecraft.commands.arguments.EntityAnchorArgument;
import net.minecraft.core.particles.ParticleTypes; import net.minecraft.core.particles.ParticleTypes;
@ -160,15 +159,22 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container,
public @NotNull InteractionResult interact(Player player, @NotNull InteractionHand hand) { public @NotNull InteractionResult interact(Player player, @NotNull InteractionHand hand) {
ItemStack mainHandItem = player.getMainHandItem(); ItemStack mainHandItem = player.getMainHandItem();
if (mainHandItem.getItem() instanceof ArtilleryIndicator && player == getOwner() && this.entityData.get(INTELLIGENT)) { if (mainHandItem.getItem() instanceof ArtilleryIndicator indicator && player == getOwner() && this.entityData.get(INTELLIGENT)) {
var tag = NBTTool.getTag(mainHandItem); if (indicator.addMortar(mainHandItem, getStringUUID())) {
tag.putString("LinkedCannon", getStringUUID()); if (player instanceof ServerPlayer serverPlayer) {
NBTTool.saveTag(mainHandItem, tag); serverPlayer.level().playSound(null, serverPlayer.getOnPos(), SoundEvents.ARROW_HIT_PLAYER, SoundSource.PLAYERS, 0.5F, 1);
}
if (player instanceof ServerPlayer serverPlayer) { player.displayClientMessage(Component.literal("added"), true);
serverPlayer.level().playSound(null, serverPlayer.getOnPos(), SoundEvents.ARROW_HIT_PLAYER, SoundSource.PLAYERS, 0.5F, 1); return InteractionResult.SUCCESS;
} else if (indicator.removeMortar(mainHandItem, getStringUUID())) {
if (player instanceof ServerPlayer serverPlayer) {
serverPlayer.level().playSound(null, serverPlayer.getOnPos(), SoundEvents.ARROW_HIT_PLAYER, SoundSource.PLAYERS, 0.5F, 1);
}
player.displayClientMessage(Component.literal("removed"), true);
return InteractionResult.SUCCESS;
} else {
return InteractionResult.FAIL;
} }
return InteractionResult.SUCCESS;
} }
if (mainHandItem.getItem() instanceof Monitor && player.isShiftKeyDown() && !this.entityData.get(INTELLIGENT)) { if (mainHandItem.getItem() instanceof Monitor && player.isShiftKeyDown() && !this.entityData.get(INTELLIGENT)) {
@ -216,7 +222,7 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container,
entityData.set(YAW, player.getYRot()); entityData.set(YAW, player.getYRot());
} }
return InteractionResult.SUCCESS; return InteractionResult.FAIL;
} }
public boolean setTarget(ItemStack stack) { public boolean setTarget(ItemStack stack) {

View file

@ -1,5 +1,9 @@
package com.atsuishio.superbwarfare.item; package com.atsuishio.superbwarfare.item;
import com.atsuishio.superbwarfare.tools.NBTTool;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.Tag;
import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundEvents;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.InteractionResultHolder;
@ -7,25 +11,29 @@ import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.ItemUtils; import net.minecraft.world.item.Rarity;
import net.minecraft.world.item.UseAnim; import net.minecraft.world.item.UseAnim;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.annotation.ParametersAreNonnullByDefault; import javax.annotation.ParametersAreNonnullByDefault;
import java.util.ArrayList;
import java.util.List;
public class ArtilleryIndicator extends Item { public class ArtilleryIndicator extends Item {
public static final String TAG_MORTARS = "Mortars";
public ArtilleryIndicator() { public ArtilleryIndicator() {
super(new Properties().stacksTo(1)); super(new Properties().stacksTo(1).rarity(Rarity.UNCOMMON));
} }
@Override @Override
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
public int getUseDuration(ItemStack stack, LivingEntity entity) { public int getUseDuration(ItemStack stack, LivingEntity entity) {
return 1200; return 72000;
} }
@Override @Override
public @NotNull UseAnim getUseAnimation(@NotNull ItemStack stack) { public @NotNull UseAnim getUseAnimation(@NotNull ItemStack stack) {
return UseAnim.SPYGLASS; return UseAnim.SPYGLASS;
@ -33,44 +41,71 @@ public class ArtilleryIndicator extends Item {
@Override @Override
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
public @NotNull InteractionResultHolder<ItemStack> use(Level worldIn, Player playerIn, InteractionHand handIn) { public @NotNull InteractionResultHolder<ItemStack> use(Level pLevel, Player pPlayer, InteractionHand pHand) {
playerIn.playSound(SoundEvents.SPYGLASS_USE, 1.0F, 1.0F); pPlayer.playSound(SoundEvents.SPYGLASS_USE, 1.0F, 1.0F);
return ItemUtils.startUsingInstantly(worldIn, playerIn, handIn); pPlayer.startUsingItem(pHand);
return InteractionResultHolder.consume(pPlayer.getItemInHand(pHand));
} }
@Override @Override
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
public @NotNull ItemStack finishUsingItem(ItemStack pStack, Level pLevel, LivingEntity pLivingEntity) { public @NotNull ItemStack finishUsingItem(ItemStack pStack, Level pLevel, LivingEntity pLivingEntity) {
this.stopUsing(pLivingEntity); pLivingEntity.playSound(SoundEvents.SPYGLASS_STOP_USING, 1.0F, 1.0F);
return pStack; return pStack;
} }
@Override @Override
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
public void releaseUsing(ItemStack pStack, Level pLevel, LivingEntity pLivingEntity, int pTimeCharged) { public void releaseUsing(ItemStack pStack, Level pLevel, LivingEntity pLivingEntity, int pTimeCharged) {
this.stopUsing(pLivingEntity); pLivingEntity.playSound(SoundEvents.SPYGLASS_STOP_USING, 1.0F, 1.0F);
} }
private void stopUsing(LivingEntity pUser) { public boolean addMortar(ItemStack stack, String uuid) {
pUser.playSound(SoundEvents.SPYGLASS_STOP_USING, 1.0F, 1.0F); var tag = NBTTool.getTag(stack);
ListTag tags = tag.getList(TAG_MORTARS, Tag.TAG_COMPOUND);
List<CompoundTag> list = new ArrayList<>();
for (int i = 0; i < tags.size(); i++) {
list.add(tags.getCompound(i));
}
for (var t : list) {
if (t.getString("UUID").equals(uuid)) {
return false;
}
}
CompoundTag mortar = new CompoundTag();
mortar.putString("UUID", uuid);
list.add(mortar);
ListTag listTag = new ListTag();
listTag.addAll(list);
tag.put(TAG_MORTARS, listTag);
NBTTool.saveTag(stack, tag);
return true;
} }
// @Override public boolean removeMortar(ItemStack stack, String uuid) {
// public @NotNull InteractionResult useOn(UseOnContext pContext) { var tag = NBTTool.getTag(stack);
// ItemStack stack = pContext.getItemInHand(); ListTag tags = tag.getList(TAG_MORTARS, Tag.TAG_COMPOUND);
// BlockPos pos = pContext.getClickedPos(); List<CompoundTag> list = new ArrayList<>();
// pos = pos.relative(pContext.getClickedFace()); boolean flag = false;
// Player player = pContext.getPlayer(); for (int i = 0; i < tags.size(); i++) {
// if (player == null) return InteractionResult.PASS; var t = tags.getCompound(i);
// if (t.getString("UUID").equals(uuid)) {
// if (player.isShiftKeyDown()) { flag = true;
// stack.getOrCreateTag().putDouble("TargetX", pos.getX()); continue;
// stack.getOrCreateTag().putDouble("TargetY", pos.getY()); }
// stack.getOrCreateTag().putDouble("TargetZ", pos.getZ()); list.add(tags.getCompound(i));
// } }
// if (flag) {
// return InteractionResult.SUCCESS; ListTag listTag = new ListTag();
// } listTag.addAll(list);
tag.put(TAG_MORTARS, listTag);
NBTTool.saveTag(stack, tag);
}
return flag;
}
// @Override // @Override
// @ParametersAreNonnullByDefault // @ParametersAreNonnullByDefault