From 80e600775b8d18da6968e8c28232cdc5efabedbf Mon Sep 17 00:00:00 2001 From: Atsuishio <842960157@qq.com> Date: Tue, 8 Jul 2025 17:20:34 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=AB=E5=87=BB=E7=82=AE=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=99=BA=E8=83=BD=E6=A8=A1=E5=BC=8F=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=81=AB=E7=82=AE=E9=81=A5=E6=8E=A7=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../superbwarfare/client/ClickHandler.java | 14 +- .../renderer/entity/MortarRenderer.java | 15 +- .../entity/vehicle/MortarEntity.java | 78 ++++++- .../superbwarfare/init/ModItems.java | 1 + .../superbwarfare/item/CannonMonitor.java | 61 +++++ .../send/SetFiringParametersMessage.java | 80 +++++-- .../assets/superbwarfare/geo/mortar.geo.json | 217 ++++++++++++++++++ .../superbwarfare/textures/entity/mortar.png | Bin 10669 -> 10679 bytes 8 files changed, 442 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/CannonMonitor.java diff --git a/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java b/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java index f5cdf8cfc..741da2fef 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java @@ -84,7 +84,7 @@ public class ClickHandler { } private static boolean cancelFireKey(Player player, ItemStack stack) { - return stack.getItem() instanceof GunItem || stack.is(ModItems.MONITOR.get()) || stack.is(ModItems.LUNGE_MINE.get()) || player.hasEffect(ModMobEffects.SHOCK) + return stack.getItem() instanceof GunItem || stack.is(ModItems.MONITOR.get()) || stack.is(ModItems.LUNGE_MINE.get()) || stack.is(ModItems.CANNON_MONITOR.get()) || player.hasEffect(ModMobEffects.SHOCK) || (player.getVehicle() instanceof ArmedVehicleEntity iArmedVehicle && iArmedVehicle.banHand(player)); } @@ -135,7 +135,9 @@ public class ClickHandler { || stack.is(ModItems.MONITOR.get()) || stack.is(ModItems.LUNGE_MINE.get()) || (player.getVehicle() instanceof ArmedVehicleEntity) - || (stack.is(Items.SPYGLASS) && player.isScoping() && player.getOffhandItem().is(ModItems.FIRING_PARAMETERS.get()))) { + || (stack.is(Items.SPYGLASS) && player.isScoping() && player.getOffhandItem().is(ModItems.FIRING_PARAMETERS.get())) + || (stack.is(ModItems.CANNON_MONITOR.get())) + ) { if (button == ModKeyMappings.FIRE.getKey().getValue()) { handleWeaponFirePress(player, stack); } @@ -307,7 +309,9 @@ public class ClickHandler { if (stack.getItem() instanceof GunItem || stack.is(ModItems.MONITOR.get()) || (player.getVehicle() instanceof ArmedVehicleEntity iVehicle && iVehicle.isDriver(player)) - || (stack.is(Items.SPYGLASS) && player.isScoping() && player.getOffhandItem().is(ModItems.FIRING_PARAMETERS.get()))) { + || (stack.is(Items.SPYGLASS) && player.isScoping() && player.getOffhandItem().is(ModItems.FIRING_PARAMETERS.get())) + || (stack.is(ModItems.CANNON_MONITOR.get())) + ) { if (key == ModKeyMappings.FIRE.getKey().getValue()) { handleWeaponFirePress(player, stack); } @@ -351,6 +355,10 @@ public class ClickHandler { isEditing = false; if (player.hasEffect(ModMobEffects.SHOCK)) return; + if (stack.is(ModItems.CANNON_MONITOR.get())) { + PacketDistributor.sendToServer(new SetFiringParametersMessage(0)); + } + if (stack.is(Items.SPYGLASS) && player.isScoping() && player.getOffhandItem().is(ModItems.FIRING_PARAMETERS.get())) { PacketDistributor.sendToServer(new SetFiringParametersMessage(0)); } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/MortarRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/MortarRenderer.java index 7d1abaca6..04c50aa79 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/MortarRenderer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/MortarRenderer.java @@ -11,9 +11,13 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; +import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.renderer.GeoEntityRenderer; +import static com.atsuishio.superbwarfare.entity.vehicle.MortarEntity.INTELLIGENT; + public class MortarRenderer extends GeoEntityRenderer { public MortarRenderer(EntityRendererProvider.Context renderManager) { @@ -36,7 +40,7 @@ public class MortarRenderer extends GeoEntityRenderer { } @Override - public void render(MortarEntity entityIn, float entityYaw, float partialTicks, PoseStack poseStack, MultiBufferSource bufferIn, int packedLightIn) { + public void render(MortarEntity entityIn, float entityYaw, float partialTicks, PoseStack poseStack, @NotNull MultiBufferSource bufferIn, int packedLightIn) { poseStack.pushPose(); poseStack.mulPose(Axis.YP.rotationDegrees(-Mth.lerp(partialTicks, entityIn.yRotO, entityIn.getYRot()))); super.render(entityIn, entityYaw, partialTicks, poseStack, bufferIn, packedLightIn); @@ -44,8 +48,13 @@ public class MortarRenderer extends GeoEntityRenderer { } @Override - protected float getDeathMaxRotation(MortarEntity entityLivingBaseIn) { - return 0.0F; + public void renderRecursively(PoseStack poseStack, MortarEntity animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { + String name = bone.getName(); + + if (name.equals("monitor")) { + bone.setHidden(!animatable.getEntityData().get(INTELLIGENT)); + } + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/MortarEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/MortarEntity.java index e42c8bde5..060d12459 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/MortarEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/MortarEntity.java @@ -6,7 +6,10 @@ import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity; import com.atsuishio.superbwarfare.init.ModEntities; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.item.CannonMonitor; +import com.atsuishio.superbwarfare.item.Monitor; import com.atsuishio.superbwarfare.item.common.ammo.MortarShell; +import com.atsuishio.superbwarfare.tools.NBTTool; import net.minecraft.ChatFormatting; import net.minecraft.commands.arguments.EntityAnchorArgument; import net.minecraft.core.particles.ParticleTypes; @@ -16,6 +19,9 @@ import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.players.OldUsersConverter; +import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; import net.minecraft.world.Container; @@ -24,6 +30,7 @@ import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.MoverType; +import net.minecraft.world.entity.OwnableEntity; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -38,13 +45,18 @@ import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.*; import software.bernie.geckolib.util.GeckoLibUtil; +import java.util.Optional; +import java.util.UUID; + import static com.atsuishio.superbwarfare.tools.RangeTool.calculateLaunchVector; -public class MortarEntity extends VehicleEntity implements GeoEntity, Container { +public class MortarEntity extends VehicleEntity implements GeoEntity, Container, OwnableEntity { public static final EntityDataAccessor FIRE_TIME = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.INT); public static final EntityDataAccessor PITCH = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor YAW = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.FLOAT); + public static final EntityDataAccessor INTELLIGENT = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.BOOLEAN); + public static final EntityDataAccessor> OWNER_UUID = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.OPTIONAL_UUID); private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); @@ -68,7 +80,9 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container super.defineSynchedData(builder); builder.define(FIRE_TIME, 0) .define(PITCH, -70f) - .define(YAW, this.getYRot()); + .define(YAW, this.getYRot()) + .define(INTELLIGENT, false) + .define(OWNER_UUID, Optional.empty()); } @Override @@ -81,6 +95,10 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container super.addAdditionalSaveData(compound); compound.putFloat("Pitch", this.entityData.get(PITCH)); compound.putFloat("Yaw", this.entityData.get(YAW)); + compound.putBoolean("Intelligent", this.entityData.get(INTELLIGENT)); + if (this.getOwnerUUID() != null) { + compound.putUUID("Owner", this.getOwnerUUID()); + } } @Override @@ -92,11 +110,40 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container if (compound.contains("Yaw")) { this.entityData.set(YAW, compound.getFloat("Yaw")); } + if (compound.contains("Intelligent")) { + this.entityData.set(INTELLIGENT, compound.getBoolean("Intelligent")); + } + UUID uuid; + if (compound.hasUUID("Owner")) { + uuid = compound.getUUID("Owner"); + } else { + String s = compound.getString("Owner"); + + assert this.getServer() != null; + uuid = OldUsersConverter.convertMobOwnerIfNecessary(this.getServer(), s); + } + + if (uuid != null) { + try { + this.setOwnerUUID(uuid); + } catch (Throwable ignored) { + } + } } + public void setOwnerUUID(@Nullable UUID pUuid) { + this.entityData.set(OWNER_UUID, Optional.ofNullable(pUuid)); + } + + @Nullable + public UUID getOwnerUUID() { + return this.entityData.get(OWNER_UUID).orElse(null); + } + + private LivingEntity shooter = null; - private void fire(@Nullable LivingEntity shooter) { + public void fire(@Nullable LivingEntity shooter) { if (!(this.stack.getItem() instanceof MortarShell)) return; this.shooter = shooter; @@ -113,6 +160,25 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container public @NotNull InteractionResult interact(Player player, @NotNull InteractionHand hand) { ItemStack mainHandItem = player.getMainHandItem(); + if (mainHandItem.getItem() instanceof CannonMonitor && player == getOwner() && this.entityData.get(INTELLIGENT)) { + var tag = NBTTool.getTag(mainHandItem); + tag.putString("LinkedCannon", getStringUUID()); + NBTTool.saveTag(mainHandItem, tag); + + if (player instanceof ServerPlayer serverPlayer) { + serverPlayer.level().playSound(null, serverPlayer.getOnPos(), SoundEvents.ARROW_HIT_PLAYER, SoundSource.PLAYERS, 0.5F, 1); + } + return InteractionResult.SUCCESS; + } + + if (mainHandItem.getItem() instanceof Monitor && player.isShiftKeyDown() && !this.entityData.get(INTELLIGENT)) { + setOwnerUUID(player.getUUID()); + entityData.set(INTELLIGENT, true); + if (!player.isCreative()) { + mainHandItem.shrink(1); + } + } + if (mainHandItem.getItem() instanceof MortarShell && !player.isShiftKeyDown() && this.entityData.get(FIRE_TIME) == 0) { this.stack = mainHandItem.copyWithCount(1); if (!player.isCreative()) { @@ -285,7 +351,7 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container return this.cache; } - private ItemStack stack = ItemStack.EMPTY; + public ItemStack stack = ItemStack.EMPTY; @Override public int getContainerSize() { @@ -332,7 +398,9 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container @Override public void setChanged() { - fire(null); + if (!entityData.get(INTELLIGENT)) { + fire(null); + } } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java b/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java index cd5d16dd3..10181a567 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java @@ -142,6 +142,7 @@ public class ModItems { public static final DeferredHolder DRONE = ITEMS.register("drone", Drone::new); public static final DeferredHolder MONITOR = ITEMS.register("monitor", Monitor::new); + public static final DeferredHolder CANNON_MONITOR = ITEMS.register("cannon_monitor", CannonMonitor::new); public static final DeferredHolder DETONATOR = ITEMS.register("detonator", Detonator::new); public static final DeferredHolder TARGET_DEPLOYER = ITEMS.register("target_deployer", TargetDeployer::new); diff --git a/src/main/java/com/atsuishio/superbwarfare/item/CannonMonitor.java b/src/main/java/com/atsuishio/superbwarfare/item/CannonMonitor.java new file mode 100644 index 000000000..ef6c92abf --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/CannonMonitor.java @@ -0,0 +1,61 @@ +package com.atsuishio.superbwarfare.item; + +import net.minecraft.world.item.Item; + +public class CannonMonitor extends Item { + + public CannonMonitor() { + super(new Properties().stacksTo(1)); + } + +// @Override +// public @NotNull InteractionResult useOn(UseOnContext pContext) { +// ItemStack stack = pContext.getItemInHand(); +// BlockPos pos = pContext.getClickedPos(); +// pos = pos.relative(pContext.getClickedFace()); +// Player player = pContext.getPlayer(); +// if (player == null) return InteractionResult.PASS; +// +// if (player.isShiftKeyDown()) { +// stack.getOrCreateTag().putDouble("TargetX", pos.getX()); +// stack.getOrCreateTag().putDouble("TargetY", pos.getY()); +// stack.getOrCreateTag().putDouble("TargetZ", pos.getZ()); +// } +// +// return InteractionResult.SUCCESS; +// } + +// @Override +// @ParametersAreNonnullByDefault +// public @NotNull InteractionResultHolder use(Level level, Player player, InteractionHand usedHand) { +// if (!player.isCrouching()) return InteractionResultHolder.pass(player.getItemInHand(usedHand)); +// +// var stack = player.getItemInHand(usedHand); +// var isDepressed = !stack.getOrCreateTag().getBoolean("IsDepressed"); +// +// stack.getOrCreateTag().putBoolean("IsDepressed", isDepressed); +// +// player.displayClientMessage(Component.translatable( +// isDepressed +// ? "tips.superbwarfare.mortar.target_pos.depressed_trajectory" +// : "tips.superbwarfare.mortar.target_pos.lofted_trajectory" +// ).withStyle(ChatFormatting.GREEN), true); +// +// return InteractionResultHolder.success(stack); +// } +// +// @Override +// public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List pTooltipComponents, TooltipFlag pIsAdvanced) { +// pTooltipComponents.add(Component.translatable("tips.superbwarfare.mortar.target_pos").withStyle(ChatFormatting.GRAY) +// .append(Component.literal("[" + pStack.getOrCreateTag().getInt("TargetX") +// + "," + pStack.getOrCreateTag().getInt("TargetY") +// + "," + pStack.getOrCreateTag().getInt("TargetZ") + "]"))); +// +// +// pTooltipComponents.add(Component.translatable( +// pStack.getOrCreateTag().getBoolean("IsDepressed") +// ? "tips.superbwarfare.mortar.target_pos.depressed_trajectory" +// : "tips.superbwarfare.mortar.target_pos.lofted_trajectory" +// ).withStyle(ChatFormatting.GRAY)); +// } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/send/SetFiringParametersMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/send/SetFiringParametersMessage.java index a3387cfe0..b9379a765 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/send/SetFiringParametersMessage.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/send/SetFiringParametersMessage.java @@ -2,7 +2,12 @@ package com.atsuishio.superbwarfare.network.message.send; import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.component.ModDataComponents; +import com.atsuishio.superbwarfare.entity.vehicle.MortarEntity; +import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.item.FiringParameters; +import com.atsuishio.superbwarfare.item.common.ammo.MortarShell; +import com.atsuishio.superbwarfare.tools.EntityFindUtil; +import com.atsuishio.superbwarfare.tools.NBTTool; import com.atsuishio.superbwarfare.tools.TraceTool; import io.netty.buffer.ByteBuf; import net.minecraft.ChatFormatting; @@ -15,12 +20,17 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.network.handling.IPayloadContext; import org.jetbrains.annotations.NotNull; +import java.util.List; import java.util.Objects; +import java.util.stream.StreamSupport; + +import static com.atsuishio.superbwarfare.entity.vehicle.MortarEntity.FIRE_TIME; public record SetFiringParametersMessage(int msgType) implements CustomPacketPayload { public static final Type TYPE = new Type<>(Mod.loc("set_firing_parameters")); @@ -34,6 +44,7 @@ public record SetFiringParametersMessage(int msgType) implements CustomPacketPay public static void handler(SetFiringParametersMessage message, final IPayloadContext context) { Player player = context.player(); ItemStack stack = player.getOffhandItem(); + ItemStack mainStack = player.getMainHandItem(); boolean lookAtEntity = false; Entity lookingEntity = TraceTool.findLookingEntity(player, 520); @@ -44,28 +55,71 @@ public record SetFiringParametersMessage(int msgType) implements CustomPacketPay if (lookingEntity != null) { lookAtEntity = true; } + if (stack.is(ModItems.FIRING_PARAMETERS.get())) { - var parameters = stack.get(ModDataComponents.FIRING_PARAMETERS); - var isDepressed = parameters != null && parameters.isDepressed(); + var parameters = stack.get(ModDataComponents.FIRING_PARAMETERS); + var isDepressed = parameters != null && parameters.isDepressed(); - if (lookAtEntity) { - stack.set(ModDataComponents.FIRING_PARAMETERS, new FiringParameters.Parameters(lookingEntity.blockPosition(), isDepressed)); - } else { - stack.set(ModDataComponents.FIRING_PARAMETERS, new FiringParameters.Parameters(new BlockPos((int) hitPos.x, (int) hitPos.y, (int) hitPos.z), isDepressed)); + if (lookAtEntity) { + stack.set(ModDataComponents.FIRING_PARAMETERS, new FiringParameters.Parameters(lookingEntity.blockPosition(), isDepressed)); + } else { + stack.set(ModDataComponents.FIRING_PARAMETERS, new FiringParameters.Parameters(new BlockPos((int) hitPos.x, (int) hitPos.y, (int) hitPos.z), isDepressed)); + } + + var pos = Objects.requireNonNull(stack.get(ModDataComponents.FIRING_PARAMETERS)).pos(); + + player.displayClientMessage(Component.translatable("tips.superbwarfare.mortar.target_pos") + .withStyle(ChatFormatting.GRAY) + .append(Component.literal("[" + pos.getX() + + "," + pos.getY() + + "," + pos.getZ() + + "]")), true); } - var pos = Objects.requireNonNull(stack.get(ModDataComponents.FIRING_PARAMETERS)).pos(); + if (mainStack.is(ModItems.CANNON_MONITOR.get())) { + // TODO 这数据读写是一坨什么玩意 + BlockPos pos; + if (player.isShiftKeyDown()) { + if (lookAtEntity) { + pos = lookingEntity.blockPosition(); + } else { + pos = new BlockPos((int) hitPos.x, (int) hitPos.y, (int) hitPos.z); + } + mainStack.set(ModDataComponents.FIRING_PARAMETERS, new FiringParameters.Parameters(pos, false)); - player.displayClientMessage(Component.translatable("tips.superbwarfare.mortar.target_pos") - .withStyle(ChatFormatting.GRAY) - .append(Component.literal("[" + pos.getX() - + "," + pos.getY() - + "," + pos.getZ() - + "]")), true); + player.displayClientMessage(Component.translatable("tips.superbwarfare.mortar.target_pos") + .withStyle(ChatFormatting.GRAY) + .append(Component.literal("[" + pos.getX() + + "," + pos.getY() + + "," + pos.getZ() + + "]")), true); + } + + List entities = getCannon(player, player.level(), NBTTool.getTag(mainStack).getString("LinkedCannon")); + for (var e : entities) { + if (e instanceof MortarEntity mortarEntity) { + if (player.isShiftKeyDown()) { + if (!mortarEntity.setTarget(mainStack)) { + player.displayClientMessage(Component.translatable("tips.superbwarfare.mortar.warn").withStyle(ChatFormatting.RED), true); + } + } else { + if (mortarEntity.stack.getItem() instanceof MortarShell && mortarEntity.getEntityData().get(FIRE_TIME) == 0) { + mortarEntity.fire(player); + } + } + } + } + } } @Override public @NotNull Type type() { return TYPE; } + + public static List getCannon(Player player, Level level, String uuid) { + return StreamSupport.stream(EntityFindUtil.getEntities(level).getAll().spliterator(), false) + .filter(e -> e.getStringUUID().equals(uuid)) + .toList(); + } } diff --git a/src/main/resources/assets/superbwarfare/geo/mortar.geo.json b/src/main/resources/assets/superbwarfare/geo/mortar.geo.json index c359b6337..90b9359c7 100644 --- a/src/main/resources/assets/superbwarfare/geo/mortar.geo.json +++ b/src/main/resources/assets/superbwarfare/geo/mortar.geo.json @@ -1102,6 +1102,223 @@ } ] }, + { + "name": "monitor", + "parent": "paotong", + "pivot": [0, 16.92347, 0.00569], + "cubes": [ + { + "origin": [-6.8685, 18.01247, -0.42722], + "size": [5.25, 0.4, 0.85], + "uv": { + "north": {"uv": [48, 2], "uv_size": [4, 0.5]}, + "east": {"uv": [8, 52], "uv_size": [0.5, 0.5]}, + "south": {"uv": [48, 3], "uv_size": [4, 0.5]}, + "west": {"uv": [52, 8], "uv_size": [0.5, 0.5]}, + "up": {"uv": [48, 4], "uv_size": [4, 0.5]}, + "down": {"uv": [5, 48.5], "uv_size": [4, -0.5]} + } + }, + { + "origin": [-6.8685, 15.01247, -0.42722], + "size": [5.25, 0.4, 0.85], + "pivot": [-4.2435, 15.21247, -0.00222], + "rotation": [0, 0, -180], + "uv": { + "north": {"uv": [48, 2], "uv_size": [4, 0.5]}, + "east": {"uv": [8, 52], "uv_size": [0.5, 0.5]}, + "south": {"uv": [48, 3], "uv_size": [4, 0.5]}, + "west": {"uv": [52, 8], "uv_size": [0.5, 0.5]}, + "up": {"uv": [48, 4], "uv_size": [4, 0.5]}, + "down": {"uv": [5, 48.5], "uv_size": [4, -0.5]} + } + }, + { + "origin": [-7.9685, 16.51247, -0.42722], + "size": [2.6, 0.4, 0.85], + "pivot": [-6.6685, 16.71247, -0.00222], + "rotation": [0, 0, -90], + "uv": { + "north": {"uv": [48, 2], "uv_size": [4, 0.5]}, + "east": {"uv": [8, 52], "uv_size": [0.5, 0.5]}, + "south": {"uv": [48, 3], "uv_size": [4, 0.5]}, + "west": {"uv": [52, 8], "uv_size": [0.5, 0.5]}, + "up": {"uv": [48, 4], "uv_size": [4, 0.5]}, + "down": {"uv": [5, 48.5], "uv_size": [4, -0.5]} + } + }, + { + "origin": [-3.1315, 16.51247, -0.42722], + "size": [2.6, 0.4, 0.85], + "pivot": [-1.8315, 16.71247, -0.00222], + "rotation": [0, 0, 90], + "uv": { + "north": {"uv": [52, 2], "uv_size": [-4, 0.5]}, + "east": {"uv": [52.5, 8], "uv_size": [-0.5, 0.5]}, + "south": {"uv": [52, 3], "uv_size": [-4, 0.5]}, + "west": {"uv": [8.5, 52], "uv_size": [-0.5, 0.5]}, + "up": {"uv": [52, 4], "uv_size": [-4, 0.5]}, + "down": {"uv": [9, 48.5], "uv_size": [-4, -0.5]} + } + }, + { + "origin": [-0.56709, 17.18447, -1.36281], + "size": [1.13418, 0.978, 2.737], + "pivot": [0, 17.17347, 0.00569], + "rotation": [0, -90, 0], + "uv": { + "north": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "south": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "up": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]}, + "down": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]} + } + }, + { + "origin": [-0.56709, 17.18447, -1.36281], + "size": [1.13418, 0.978, 2.737], + "pivot": [0, 17.17347, 0.00569], + "rotation": [0, -45, 0], + "uv": { + "north": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "south": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "up": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]}, + "down": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]} + } + }, + { + "origin": [-0.56709, 17.18447, -1.36281], + "size": [1.13418, 0.978, 2.737], + "uv": { + "north": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "south": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "up": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]}, + "down": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]} + } + }, + { + "origin": [-0.56709, 17.18447, -1.36281], + "size": [1.13418, 0.978, 2.737], + "pivot": [0, 17.17347, 0.00569], + "rotation": [0, 45, 0], + "uv": { + "north": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "south": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "up": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]}, + "down": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]} + } + }, + { + "origin": [-0.56709, 15.18447, -1.36281], + "size": [1.13418, 0.978, 2.737], + "pivot": [0, 15.17347, 0.00569], + "rotation": [0, 45, 0], + "uv": { + "north": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "south": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "up": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]}, + "down": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]} + } + }, + { + "origin": [-0.56709, 15.18447, -1.36281], + "size": [1.13418, 0.978, 2.737], + "pivot": [0, 15.17347, 0.00569], + "rotation": [0, -90, 0], + "uv": { + "north": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "south": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "up": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]}, + "down": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]} + } + }, + { + "origin": [-0.31709, 15.18447, 1.37419], + "size": [0.63418, 0.978, 0.5], + "pivot": [0, 15.17347, 0.00569], + "rotation": [0, -90, 0], + "uv": { + "east": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "west": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "up": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]}, + "down": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]} + } + }, + { + "origin": [-4.56059, 15.18447, -2.36931], + "size": [0.63418, 2.978, 4.75], + "pivot": [-4.2435, 16.67347, 0.00569], + "rotation": [0, -90, 0], + "uv": { + "east": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "west": {"uv": [52, 27], "uv_size": [0.5, 0.5]}, + "up": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]}, + "down": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]} + } + }, + { + "origin": [-5.81672, 18.41247, -0.10222], + "size": [0.25, 2.978, 0.25], + "pivot": [-5.69172, 19.90147, 0.02278], + "rotation": [0, -135, 0], + "uv": { + "north": {"uv": [47.5, 8.5], "uv_size": [0.5, 0.5]}, + "east": {"uv": [47.5, 8.5], "uv_size": [0.5, 0.5]}, + "south": {"uv": [47.5, 8.5], "uv_size": [0.5, 0.5]}, + "west": {"uv": [47.5, 8.5], "uv_size": [0.5, 0.5]}, + "up": {"uv": [48, 9], "uv_size": [-0.5, -0.5]}, + "down": {"uv": [48, 9], "uv_size": [-0.5, -0.5]} + } + }, + { + "origin": [-3.06672, 18.41247, -0.10222], + "size": [0.25, 2.978, 0.25], + "pivot": [-2.94172, 19.90147, 0.02278], + "rotation": [0, -135, 0], + "uv": { + "north": {"uv": [47.5, 8.5], "uv_size": [0.5, 0.5]}, + "east": {"uv": [47.5, 8.5], "uv_size": [0.5, 0.5]}, + "south": {"uv": [47.5, 8.5], "uv_size": [0.5, 0.5]}, + "west": {"uv": [47.5, 8.5], "uv_size": [0.5, 0.5]}, + "up": {"uv": [48, 9], "uv_size": [-0.5, -0.5]}, + "down": {"uv": [48, 9], "uv_size": [-0.5, -0.5]} + } + }, + { + "origin": [-0.31709, 17.18447, 1.37419], + "size": [0.63418, 0.978, 0.5], + "pivot": [0, 17.17347, 0.00569], + "rotation": [0, -90, 0], + "uv": { + "east": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "west": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "up": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]}, + "down": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]} + } + }, + { + "origin": [-0.56709, 15.18447, -1.36281], + "size": [1.13418, 0.978, 2.737], + "pivot": [0, 15.17347, 0.00569], + "rotation": [0, -45, 0], + "uv": { + "north": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "south": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "up": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]}, + "down": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]} + } + }, + { + "origin": [-0.56709, 15.18447, -1.36281], + "size": [1.13418, 0.978, 2.737], + "uv": { + "north": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "south": {"uv": [46, 28.5], "uv_size": [0.5, 0.5]}, + "up": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]}, + "down": {"uv": [46.5, 29], "uv_size": [-0.5, -0.5]} + } + } + ] + }, { "name": "jiaojia", "parent": "bone2", diff --git a/src/main/resources/assets/superbwarfare/textures/entity/mortar.png b/src/main/resources/assets/superbwarfare/textures/entity/mortar.png index 2be7f7094ad12daef46a789b34239cf056818e76..240a58a8bc7c2637ec9987f20c6c69b8454c3d8a 100644 GIT binary patch literal 10679 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 literal 10669 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 n>S7)2%}Lk(A4}o9`@s17#+a{p&r