From 93c35dcfa09d911315ee5c444e0a4d875013b0b2 Mon Sep 17 00:00:00 2001 From: Atsuihsio <842960157@qq.com> Date: Wed, 24 Jul 2024 11:19:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=97=A0=E4=BA=BA=E6=9C=BA?= =?UTF-8?q?=E7=9A=84=E9=81=A5=E6=8E=A7=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/net/mcreator/target/TargetMod.java | 6 + .../mcreator/target/client/ClickHandler.java | 40 +++++ .../mcreator/target/entity/DroneEntity.java | 152 +++++++++++++--- .../target/event/ClientEventHandler.java | 15 +- .../net/mcreator/target/item/Monitor.java | 24 +++ .../target/mixins/KeyMappingMixin.java | 21 ++- .../mcreator/target/mixins/MixinCamera.java | 36 ++-- .../message/DroneMoveBackwardMessage.java | 51 ++++++ .../network/message/DroneMoveDownMessage.java | 51 ++++++ .../message/DroneMoveForwardMessage.java | 51 ++++++ .../network/message/DroneMoveLeftMessage.java | 52 ++++++ .../message/DroneMoveRightMessage.java | 51 ++++++ .../network/message/DroneMoveUpMessage.java | 51 ++++++ .../mcreator/target/tools/TooltipTool.java | 6 +- .../assets/target/geo/drone.geo.json | 170 +++++++++--------- 15 files changed, 652 insertions(+), 125 deletions(-) create mode 100644 src/main/java/net/mcreator/target/network/message/DroneMoveBackwardMessage.java create mode 100644 src/main/java/net/mcreator/target/network/message/DroneMoveDownMessage.java create mode 100644 src/main/java/net/mcreator/target/network/message/DroneMoveForwardMessage.java create mode 100644 src/main/java/net/mcreator/target/network/message/DroneMoveLeftMessage.java create mode 100644 src/main/java/net/mcreator/target/network/message/DroneMoveRightMessage.java create mode 100644 src/main/java/net/mcreator/target/network/message/DroneMoveUpMessage.java diff --git a/src/main/java/net/mcreator/target/TargetMod.java b/src/main/java/net/mcreator/target/TargetMod.java index 6c9d203fe..3f41a40d9 100644 --- a/src/main/java/net/mcreator/target/TargetMod.java +++ b/src/main/java/net/mcreator/target/TargetMod.java @@ -105,6 +105,12 @@ public class TargetMod { addNetworkMessage(AdjustZoomFovMessage.class, AdjustZoomFovMessage::encode, AdjustZoomFovMessage::decode, AdjustZoomFovMessage::handler); addNetworkMessage(AdjustMortarAngleMessage.class, AdjustMortarAngleMessage::encode, AdjustMortarAngleMessage::decode, AdjustMortarAngleMessage::handler); addNetworkMessage(InteractMessage.class, InteractMessage::encode, InteractMessage::decode, InteractMessage::handler); + addNetworkMessage(DroneMoveLeftMessage.class, DroneMoveLeftMessage::encode, DroneMoveLeftMessage::decode, DroneMoveLeftMessage::handler); + addNetworkMessage(DroneMoveRightMessage.class, DroneMoveRightMessage::encode, DroneMoveRightMessage::decode, DroneMoveRightMessage::handler); + addNetworkMessage(DroneMoveForwardMessage.class, DroneMoveForwardMessage::encode, DroneMoveForwardMessage::decode, DroneMoveForwardMessage::handler); + addNetworkMessage(DroneMoveBackwardMessage.class, DroneMoveBackwardMessage::encode, DroneMoveBackwardMessage::decode, DroneMoveBackwardMessage::handler); + addNetworkMessage(DroneMoveUpMessage.class, DroneMoveUpMessage::encode, DroneMoveUpMessage::decode, DroneMoveUpMessage::handler); + addNetworkMessage(DroneMoveDownMessage.class, DroneMoveDownMessage::encode, DroneMoveDownMessage::decode, DroneMoveDownMessage::handler); event.enqueueWork(() -> BrewingRecipeRegistry.addRecipe(Ingredient.of(PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER)), Ingredient.of(Items.LIGHTNING_ROD), PotionUtils.setPotion(new ItemStack(Items.POTION), TargetModPotion.SHOCK.get()))); diff --git a/src/main/java/net/mcreator/target/client/ClickHandler.java b/src/main/java/net/mcreator/target/client/ClickHandler.java index 0103b23b8..30260d272 100644 --- a/src/main/java/net/mcreator/target/client/ClickHandler.java +++ b/src/main/java/net/mcreator/target/client/ClickHandler.java @@ -147,6 +147,26 @@ public class ClickHandler { if (notInGame()) return; if (event.getAction() != InputConstants.PRESS) return; setKeyState(event.getKey(), 1); + + int button = event.getKey(); + if (button == GLFW.GLFW_KEY_A) { + TargetMod.PACKET_HANDLER.sendToServer(new DroneMoveLeftMessage(true)); + } + if (button == GLFW.GLFW_KEY_D) { + TargetMod.PACKET_HANDLER.sendToServer(new DroneMoveRightMessage(true)); + } + if (button == GLFW.GLFW_KEY_W) { + TargetMod.PACKET_HANDLER.sendToServer(new DroneMoveForwardMessage(true)); + } + if (button == GLFW.GLFW_KEY_S) { + TargetMod.PACKET_HANDLER.sendToServer(new DroneMoveBackwardMessage(true)); + } + if (button == GLFW.GLFW_KEY_SPACE) { + TargetMod.PACKET_HANDLER.sendToServer(new DroneMoveUpMessage(true)); + } + if (button == GLFW.GLFW_KEY_LEFT_CONTROL) { + TargetMod.PACKET_HANDLER.sendToServer(new DroneMoveDownMessage(true)); + } } @SubscribeEvent @@ -154,5 +174,25 @@ public class ClickHandler { if (notInGame()) return; if (event.getAction() != InputConstants.RELEASE) return; setKeyState(event.getKey(), 0); + + int button = event.getKey(); + if (button == GLFW.GLFW_KEY_A) { + TargetMod.PACKET_HANDLER.sendToServer(new DroneMoveLeftMessage(false)); + } + if (button == GLFW.GLFW_KEY_D) { + TargetMod.PACKET_HANDLER.sendToServer(new DroneMoveRightMessage(false)); + } + if (button == GLFW.GLFW_KEY_W) { + TargetMod.PACKET_HANDLER.sendToServer(new DroneMoveForwardMessage(false)); + } + if (button == GLFW.GLFW_KEY_S) { + TargetMod.PACKET_HANDLER.sendToServer(new DroneMoveBackwardMessage(false)); + } + if (button == GLFW.GLFW_KEY_SPACE) { + TargetMod.PACKET_HANDLER.sendToServer(new DroneMoveUpMessage(false)); + } + if (button == GLFW.GLFW_KEY_LEFT_CONTROL) { + TargetMod.PACKET_HANDLER.sendToServer(new DroneMoveDownMessage(false)); + } } } \ No newline at end of file diff --git a/src/main/java/net/mcreator/target/entity/DroneEntity.java b/src/main/java/net/mcreator/target/entity/DroneEntity.java index 5867cacae..5b04c6ea6 100644 --- a/src/main/java/net/mcreator/target/entity/DroneEntity.java +++ b/src/main/java/net/mcreator/target/entity/DroneEntity.java @@ -3,15 +3,20 @@ package net.mcreator.target.entity; import net.mcreator.target.init.TargetModItems; import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; +import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.*; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.registries.ForgeRegistries; import software.bernie.geckolib.util.GeckoLibUtil; import software.bernie.geckolib.core.object.PlayState; @@ -44,19 +49,18 @@ import net.minecraft.core.BlockPos; import net.mcreator.target.init.TargetModEntities; import net.mcreator.target.item.Monitor; +import java.text.DecimalFormat; import java.util.Objects; public class DroneEntity extends PathfinderMob implements GeoEntity { - public static final EntityDataAccessor SHOOT = SynchedEntityData.defineId(DroneEntity.class, EntityDataSerializers.BOOLEAN); public static final EntityDataAccessor ANIMATION = SynchedEntityData.defineId(DroneEntity.class, EntityDataSerializers.STRING); + public static final EntityDataAccessor LINKED = SynchedEntityData.defineId(DroneEntity.class, EntityDataSerializers.BOOLEAN); + public static final EntityDataAccessor CONTROLLER = SynchedEntityData.defineId(DroneEntity.class, EntityDataSerializers.STRING); private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + private float moveX = 0; + private float moveY = 0; + private float moveZ = 0; - private boolean swinging; - private boolean lastloop; - private boolean linked = false; - private String controller; - - private long lastSwing; public String animationprocedure = "empty"; @@ -69,19 +73,26 @@ public class DroneEntity extends PathfinderMob implements GeoEntity { xpReward = 0; setNoAi(false); setPersistenceRequired(); - this.moveControl = new FlyingMoveControl(this, 10, true); + } + + public DroneEntity(EntityType type, Level world, float moveX, float moveY, float moveZ) { + super(type, world); + this.moveX = moveX; + this.moveY = moveY; + this.moveZ = moveZ; } @Override protected void defineSynchedData() { super.defineSynchedData(); - this.entityData.define(SHOOT, false); this.entityData.define(ANIMATION, "undefined"); + this.entityData.define(CONTROLLER, "undefined"); + this.entityData.define(LINKED, false); } @Override protected float getStandingEyeHeight(Pose poseIn, EntityDimensions sizeIn) { - return 0.05F; + return 0.075F; } @Override @@ -113,21 +124,77 @@ public class DroneEntity extends PathfinderMob implements GeoEntity { public void addAdditionalSaveData(CompoundTag compound) { super.addAdditionalSaveData(compound); - compound.putBoolean("Linked", this.linked); - compound.putString("Controller", this.controller); + compound.putBoolean("Linked", this.entityData.get(LINKED)); + compound.putString("Controller", this.entityData.get(CONTROLLER)); } @Override public void readAdditionalSaveData(CompoundTag compound) { super.readAdditionalSaveData(compound); - this.linked = compound.getBoolean("Linked"); - this.controller = compound.getString("Controller"); + if (compound.contains("Linked")) + this.entityData.set(LINKED, compound.getBoolean("Linked")); + if (compound.contains("Controller")) + this.entityData.set(CONTROLLER, compound.getString("Controller")); } @Override public void baseTick() { super.baseTick(); + + if (this.getPersistentData().getBoolean("left")) { + moveX = -1.5f; + } + if (this.getPersistentData().getBoolean("right")) { + moveX = 1.5f; + } + + if (!this.getPersistentData().getBoolean("left") && !this.getPersistentData().getBoolean("right")) { + if (moveX >= 0) { + moveX = Mth.clamp(moveX - 0.3f,0,1); + } else { + moveX = Mth.clamp(moveX + 0.3f,-1,0); + } + } + + if (this.getPersistentData().getBoolean("forward")) { + moveZ = -1.5f; + } + if (this.getPersistentData().getBoolean("backward")) { + moveZ = 1.5f; + } + + if (!this.getPersistentData().getBoolean("forward") && !this.getPersistentData().getBoolean("backward")) { + if (moveZ >= 0) { + moveZ = Mth.clamp(moveZ - 0.3f,0,1); + } else { + moveZ = Mth.clamp(moveZ + 0.3f,-1,0); + } + } + + if (this.getPersistentData().getBoolean("up")) { + moveY = -1.5f; + } + if (this.getPersistentData().getBoolean("down")) { + moveY = 1.5f; + } + + if (!this.getPersistentData().getBoolean("up") && !this.getPersistentData().getBoolean("down")) { + if (moveY >= 0) { + moveY = Mth.clamp(moveY - 0.3f,0,1); + } else { + moveY = Mth.clamp(moveY + 0.3f,-1,0); + } + } + + Vec3 vec = this.getDeltaMovement(); + + double x = vec.x; + double y = vec.y; + double z = vec.z; + + this.setDeltaMovement(Mth.clamp(1.04 * x ,-0.8,0.8), y, Mth.clamp(1.04 * z,-0.8,0.8)); + this.refreshDimensions(); } @@ -138,14 +205,14 @@ public class DroneEntity extends PathfinderMob implements GeoEntity { ItemStack stack = player.getMainHandItem(); if (stack.getItem() == TargetModItems.MONITOR.get()) { if (!player.isCrouching()) { - if (!this.linked) { + if (!this.entityData.get(LINKED)) { if (stack.getOrCreateTag().getBoolean("Linked")) { player.displayClientMessage(Component.translatable("des.target.monitor.monitor_already_linked").withStyle(ChatFormatting.RED), true); return InteractionResult.sidedSuccess(this.level().isClientSide()); } - this.linked = true; - this.controller = player.getStringUUID(); + this.entityData.set(LINKED, true); + this.entityData.set(CONTROLLER, player.getStringUUID()); Monitor.link(stack, this.getStringUUID()); player.displayClientMessage(Component.translatable("des.target.monitor.linked").withStyle(ChatFormatting.GREEN), true); @@ -157,14 +224,14 @@ public class DroneEntity extends PathfinderMob implements GeoEntity { player.displayClientMessage(Component.translatable("des.target.monitor.already_linked").withStyle(ChatFormatting.RED), true); } } else { - if (this.linked) { + if (this.entityData.get(LINKED)) { if (!stack.getOrCreateTag().getBoolean("Linked")) { player.displayClientMessage(Component.translatable("des.target.monitor.already_linked").withStyle(ChatFormatting.RED), true); return InteractionResult.sidedSuccess(this.level().isClientSide()); } - this.controller = "none"; - this.linked = false; + this.entityData.set(CONTROLLER, "none"); + this.entityData.set(LINKED, false); Monitor.disLink(stack); player.displayClientMessage(Component.translatable("des.target.monitor.unlinked").withStyle(ChatFormatting.RED), true); @@ -174,11 +241,48 @@ public class DroneEntity extends PathfinderMob implements GeoEntity { } } } + } else if (stack.isEmpty()&& player.isCrouching()) { + if (!this.level().isClientSide()) this.discard(); + ItemHandlerHelper.giveItemToPlayer(player, new ItemStack(TargetModItems.DRONE_SPAWN_EGG.get())); } return InteractionResult.sidedSuccess(this.level().isClientSide()); } + @Override + public void travel(Vec3 dir) { + LivingEntity control = this.level().getEntitiesOfClass(Player.class, this.getBoundingBox().inflate(512)) + .stream().filter(e -> e.getStringUUID().equals(this.entityData.get(CONTROLLER))).findFirst().orElse(null); + + if (control != null) { + ItemStack stack = control.getMainHandItem(); + if (stack.getOrCreateTag().getBoolean("Using")) { + this.setYRot(control.getYRot()); + this.yRotO = this.getYRot(); + this.setXRot(control.getXRot()); + this.setRot(this.getYRot(), this.getXRot()); + this.yBodyRot = control.getYRot(); + this.yHeadRot = control.getYRot(); + this.setMaxUpStep(1.0F); + this.setSpeed(4 * (float)this.getAttributeValue(Attributes.MOVEMENT_SPEED)); + float forward = -moveZ; + float upDown = -moveY; + float strafe = -moveX; + super.travel(new Vec3(strafe, upDown, forward)); + return; + } + + } + this.setMaxUpStep(0.5F); + super.travel(dir); + } + + + + @Override + public void die(DamageSource source) { + super.die(source); + } @Override public EntityDimensions getDimensions(Pose p_33597_) { @@ -217,7 +321,7 @@ public class DroneEntity extends PathfinderMob implements GeoEntity { private PlayState movementPredicate(AnimationState event) { if (this.animationprocedure.equals("empty")) { - if (this.linked) { + if (this.entityData.get(LINKED) || !this.onGround()) { return event.setAndContinue(RawAnimation.begin().thenLoop("animation.drone.fly")); } return event.setAndContinue(RawAnimation.begin().thenLoop("animation.drone.idle")); @@ -241,10 +345,14 @@ public class DroneEntity extends PathfinderMob implements GeoEntity { @Override protected void tickDeath() { ++this.deathTime; - if (this.deathTime == 20) { + if (this.deathTime >= 100 || this.onGround()) { this.remove(DroneEntity.RemovalReason.KILLED); + if (level() instanceof ServerLevel) { + level().explode(null, this.getX(), this.getY(), this.getZ(), 0.1F, Level.ExplosionInteraction.NONE); + } this.dropExperience(); } + this.setDeltaMovement(new Vec3(this.getDeltaMovement().x(), this.getDeltaMovement().y() - 0.02, this.getDeltaMovement().z())); } public String getSyncedAnimation() { diff --git a/src/main/java/net/mcreator/target/event/ClientEventHandler.java b/src/main/java/net/mcreator/target/event/ClientEventHandler.java index 375567071..6d5554ae7 100644 --- a/src/main/java/net/mcreator/target/event/ClientEventHandler.java +++ b/src/main/java/net/mcreator/target/event/ClientEventHandler.java @@ -1,7 +1,9 @@ package net.mcreator.target.event; +import net.mcreator.target.entity.DroneEntity; import net.mcreator.target.entity.Mk42Entity; import net.mcreator.target.init.TargetModAttributes; +import net.mcreator.target.init.TargetModItems; import net.mcreator.target.init.TargetModMobEffects; import net.mcreator.target.init.TargetModTags; import net.mcreator.target.network.TargetModVariables; @@ -85,9 +87,20 @@ public class ClientEventHandler { if (player == null) return; InteractionHand hand = Minecraft.getInstance().options.mainHand().get() == HumanoidArm.RIGHT ? InteractionHand.OFF_HAND : InteractionHand.MAIN_HAND; + ItemStack stack = player.getMainHandItem(); if (event.getHand() == hand) { - if (player.getMainHandItem().is(TargetModTags.Items.GUN)) { + if (player.getUseItem().is(TargetModTags.Items.GUN)) { + event.setCanceled(true); + } + } + + if (stack.is(TargetModItems.MONITOR.get()) && stack.getOrCreateTag().getBoolean("Using") && stack.getOrCreateTag().getBoolean("Linked")) { + + DroneEntity drone = player.level().getEntitiesOfClass(DroneEntity.class, player.getBoundingBox().inflate(512)) + .stream().filter(e -> e.getStringUUID().equals(stack.getOrCreateTag().getString("LinkedDrone"))).findFirst().orElse(null); + + if (drone != null) { event.setCanceled(true); } } diff --git a/src/main/java/net/mcreator/target/item/Monitor.java b/src/main/java/net/mcreator/target/item/Monitor.java index 977e95bb9..441915628 100644 --- a/src/main/java/net/mcreator/target/item/Monitor.java +++ b/src/main/java/net/mcreator/target/item/Monitor.java @@ -1,8 +1,15 @@ package net.mcreator.target.item; +import net.mcreator.target.entity.DroneEntity; import net.mcreator.target.tools.ItemNBTTool; import net.mcreator.target.tools.TooltipTool; +import net.minecraft.client.CameraType; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; @@ -28,6 +35,23 @@ public class Monitor extends Item { itemstack.getOrCreateTag().putString(LINKED_DRONE, "none"); } + @Override + public InteractionResultHolder use(Level world, Player player, InteractionHand hand) { + InteractionResultHolder ar = super.use(world, player, hand); + Minecraft mc = Minecraft.getInstance(); + ItemStack stack = player.getMainHandItem(); + if (!stack.getOrCreateTag().getBoolean("Using")) { + stack.getOrCreateTag().putBoolean("Using", true); + mc.options.setCameraType(CameraType.THIRD_PERSON_BACK); + } else { + stack.getOrCreateTag().putBoolean("Using", false); + mc.options.setCameraType(CameraType.FIRST_PERSON); + } + + return ar; + } + + @Override public void appendHoverText(ItemStack stack, Level world, List list, TooltipFlag flag) { TooltipTool.addMonitorTips(list, stack.getOrCreateTag().getString(LINKED_DRONE)); diff --git a/src/main/java/net/mcreator/target/mixins/KeyMappingMixin.java b/src/main/java/net/mcreator/target/mixins/KeyMappingMixin.java index 867b46a73..800e76cce 100644 --- a/src/main/java/net/mcreator/target/mixins/KeyMappingMixin.java +++ b/src/main/java/net/mcreator/target/mixins/KeyMappingMixin.java @@ -1,8 +1,11 @@ package net.mcreator.target.mixins; +import net.mcreator.target.init.TargetModItems; import net.minecraft.client.Minecraft; import net.minecraft.client.player.Input; import net.minecraft.client.player.KeyboardInput; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -16,7 +19,23 @@ public abstract class KeyMappingMixin extends Input { // 按键修改mixin @Inject(method = "tick", at = @At("RETURN")) public void tick(boolean pIsSneaking, float pSneakingSpeedMultiplier, CallbackInfo ci) { - if (Minecraft.getInstance().player == null || !Minecraft.getInstance().player.hasEffect(TargetModMobEffects.SHOCK.get()) + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + ItemStack stack = player.getMainHandItem(); + + if (stack.is(TargetModItems.MONITOR.get()) && stack.getOrCreateTag().getBoolean("Using") && stack.getOrCreateTag().getBoolean("Linked")) { + this.up = false; + this.down = false; + this.left = false; + this.right = false; + this.shiftKeyDown = false; + this.forwardImpulse = 0; + this.leftImpulse = 0; + this.jumping = false; + } + + if (Minecraft.getInstance().player == null + || !Minecraft.getInstance().player.hasEffect(TargetModMobEffects.SHOCK.get()) || Minecraft.getInstance().player.isSpectator()) { return; } diff --git a/src/main/java/net/mcreator/target/mixins/MixinCamera.java b/src/main/java/net/mcreator/target/mixins/MixinCamera.java index aab880172..9c232b76e 100644 --- a/src/main/java/net/mcreator/target/mixins/MixinCamera.java +++ b/src/main/java/net/mcreator/target/mixins/MixinCamera.java @@ -1,8 +1,11 @@ package net.mcreator.target.mixins; +import net.mcreator.target.entity.DroneEntity; +import net.mcreator.target.init.TargetModItems; import net.mcreator.target.init.TargetModTags; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; +import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -26,18 +29,27 @@ public abstract class MixinCamera { at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Camera;setRotation(FF)V", ordinal = 0), method = "setup(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/world/entity/Entity;ZZF)V", cancellable = true) + private void onSetup(BlockGetter level, Entity entity, boolean detached, boolean mirrored, float partialTicks, CallbackInfo info) { -// Minecraft mc = Minecraft.getInstance(); -// Player player = mc.player; -// -// if (player != null) { -// ItemStack stack = player.getMainHandItem(); -// -// if (stack.is(TargetModTags.Items.GUN)) { -// setRotation(player.getYRot(), player.getXRot()); -// setPosition(player.getX(), player.getY() + 3, player.getZ()); -// info.cancel(); -// } -// } + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + + if (player != null) { + ItemStack stack = player.getMainHandItem(); + + if (stack.is(TargetModItems.MONITOR.get()) && stack.getOrCreateTag().getBoolean("Using") && stack.getOrCreateTag().getBoolean("Linked")) { + + DroneEntity drone = player.level().getEntitiesOfClass(DroneEntity.class, player.getBoundingBox().inflate(512)) + .stream().filter(e -> e.getStringUUID().equals(stack.getOrCreateTag().getString("LinkedDrone"))).findFirst().orElse(null); + + if (drone != null) { + + setRotation(drone.getYRot(), drone.getXRot()); + setPosition(drone.getX() + 0.18 * drone.getLookAngle().x, drone.getY() + drone.getEyeHeight(), drone.getZ() + 0.18 * drone.getLookAngle().z); + info.cancel(); + } + } + } } + } diff --git a/src/main/java/net/mcreator/target/network/message/DroneMoveBackwardMessage.java b/src/main/java/net/mcreator/target/network/message/DroneMoveBackwardMessage.java new file mode 100644 index 000000000..93a3f5069 --- /dev/null +++ b/src/main/java/net/mcreator/target/network/message/DroneMoveBackwardMessage.java @@ -0,0 +1,51 @@ +package net.mcreator.target.network.message; + +import net.mcreator.target.entity.DroneEntity; +import net.mcreator.target.init.TargetModItems; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; + +import java.util.function.Supplier; + +public class DroneMoveBackwardMessage { + private final boolean backward; + + public DroneMoveBackwardMessage(boolean backward) { + this.backward = backward; + } + + public static DroneMoveBackwardMessage decode(FriendlyByteBuf buffer) { + return new DroneMoveBackwardMessage(buffer.readBoolean()); + } + + public static void encode(DroneMoveBackwardMessage message, FriendlyByteBuf buffer) { + buffer.writeBoolean(message.backward); + } + + public static void handler(DroneMoveBackwardMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + if (context.getSender() != null) { + pressAction(context.getSender(), message.backward); + } + }); + context.setPacketHandled(true); + } + + public static void pressAction(Player player, boolean backward) { + ItemStack stack = player.getMainHandItem(); + if (stack.is(TargetModItems.MONITOR.get()) && stack.getOrCreateTag().getBoolean("Using") && stack.getOrCreateTag().getBoolean("Linked")) { + DroneEntity drone = player.level().getEntitiesOfClass(DroneEntity.class, player.getBoundingBox().inflate(512)) + .stream().filter(e -> e.getStringUUID().equals(stack.getOrCreateTag().getString("LinkedDrone"))).findFirst().orElse(null); + if (drone != null) { + if (backward) { + drone.getPersistentData().putBoolean("backward",true); + } else { + drone.getPersistentData().putBoolean("backward",false); + } + } + } + } +} diff --git a/src/main/java/net/mcreator/target/network/message/DroneMoveDownMessage.java b/src/main/java/net/mcreator/target/network/message/DroneMoveDownMessage.java new file mode 100644 index 000000000..17e68e87a --- /dev/null +++ b/src/main/java/net/mcreator/target/network/message/DroneMoveDownMessage.java @@ -0,0 +1,51 @@ +package net.mcreator.target.network.message; + +import net.mcreator.target.entity.DroneEntity; +import net.mcreator.target.init.TargetModItems; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; + +import java.util.function.Supplier; + +public class DroneMoveDownMessage { + private final boolean down; + + public DroneMoveDownMessage(boolean down) { + this.down = down; + } + + public static DroneMoveDownMessage decode(FriendlyByteBuf buffer) { + return new DroneMoveDownMessage(buffer.readBoolean()); + } + + public static void encode(DroneMoveDownMessage message, FriendlyByteBuf buffer) { + buffer.writeBoolean(message.down); + } + + public static void handler(DroneMoveDownMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + if (context.getSender() != null) { + pressAction(context.getSender(), message.down); + } + }); + context.setPacketHandled(true); + } + + public static void pressAction(Player player, boolean down) { + ItemStack stack = player.getMainHandItem(); + if (stack.is(TargetModItems.MONITOR.get()) && stack.getOrCreateTag().getBoolean("Using") && stack.getOrCreateTag().getBoolean("Linked")) { + DroneEntity drone = player.level().getEntitiesOfClass(DroneEntity.class, player.getBoundingBox().inflate(512)) + .stream().filter(e -> e.getStringUUID().equals(stack.getOrCreateTag().getString("LinkedDrone"))).findFirst().orElse(null); + if (drone != null) { + if (down) { + drone.getPersistentData().putBoolean("down",true); + } else { + drone.getPersistentData().putBoolean("down",false); + } + } + } + } +} diff --git a/src/main/java/net/mcreator/target/network/message/DroneMoveForwardMessage.java b/src/main/java/net/mcreator/target/network/message/DroneMoveForwardMessage.java new file mode 100644 index 000000000..599dfdb00 --- /dev/null +++ b/src/main/java/net/mcreator/target/network/message/DroneMoveForwardMessage.java @@ -0,0 +1,51 @@ +package net.mcreator.target.network.message; + +import net.mcreator.target.entity.DroneEntity; +import net.mcreator.target.init.TargetModItems; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; + +import java.util.function.Supplier; + +public class DroneMoveForwardMessage { + private final boolean forward; + + public DroneMoveForwardMessage(boolean forward) { + this.forward = forward; + } + + public static DroneMoveForwardMessage decode(FriendlyByteBuf buffer) { + return new DroneMoveForwardMessage(buffer.readBoolean()); + } + + public static void encode(DroneMoveForwardMessage message, FriendlyByteBuf buffer) { + buffer.writeBoolean(message.forward); + } + + public static void handler(DroneMoveForwardMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + if (context.getSender() != null) { + pressAction(context.getSender(), message.forward); + } + }); + context.setPacketHandled(true); + } + + public static void pressAction(Player player, boolean forward) { + ItemStack stack = player.getMainHandItem(); + if (stack.is(TargetModItems.MONITOR.get()) && stack.getOrCreateTag().getBoolean("Using") && stack.getOrCreateTag().getBoolean("Linked")) { + DroneEntity drone = player.level().getEntitiesOfClass(DroneEntity.class, player.getBoundingBox().inflate(512)) + .stream().filter(e -> e.getStringUUID().equals(stack.getOrCreateTag().getString("LinkedDrone"))).findFirst().orElse(null); + if (drone != null) { + if (forward) { + drone.getPersistentData().putBoolean("forward",true); + } else { + drone.getPersistentData().putBoolean("forward",false); + } + } + } + } +} diff --git a/src/main/java/net/mcreator/target/network/message/DroneMoveLeftMessage.java b/src/main/java/net/mcreator/target/network/message/DroneMoveLeftMessage.java new file mode 100644 index 000000000..493dcb2e6 --- /dev/null +++ b/src/main/java/net/mcreator/target/network/message/DroneMoveLeftMessage.java @@ -0,0 +1,52 @@ +package net.mcreator.target.network.message; + +import net.mcreator.target.entity.DroneEntity; +import net.mcreator.target.init.TargetModItems; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraftforge.network.NetworkEvent; + +import java.util.function.Supplier; + +public class DroneMoveLeftMessage { + private final boolean left; + + public DroneMoveLeftMessage(boolean left) { + this.left = left; + } + + public static DroneMoveLeftMessage decode(FriendlyByteBuf buffer) { + return new DroneMoveLeftMessage(buffer.readBoolean()); + } + + public static void encode(DroneMoveLeftMessage message, FriendlyByteBuf buffer) { + buffer.writeBoolean(message.left); + } + + public static void handler(DroneMoveLeftMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + if (context.getSender() != null) { + pressAction(context.getSender(), message.left); + } + }); + context.setPacketHandled(true); + } + + public static void pressAction(Player player, boolean left) { + ItemStack stack = player.getMainHandItem(); + if (stack.is(TargetModItems.MONITOR.get()) && stack.getOrCreateTag().getBoolean("Using") && stack.getOrCreateTag().getBoolean("Linked")) { + DroneEntity drone = player.level().getEntitiesOfClass(DroneEntity.class, player.getBoundingBox().inflate(512)) + .stream().filter(e -> e.getStringUUID().equals(stack.getOrCreateTag().getString("LinkedDrone"))).findFirst().orElse(null); + if (drone != null) { + if (left) { + drone.getPersistentData().putBoolean("left",true); + } else { + drone.getPersistentData().putBoolean("left",false); + } + } + } + } +} diff --git a/src/main/java/net/mcreator/target/network/message/DroneMoveRightMessage.java b/src/main/java/net/mcreator/target/network/message/DroneMoveRightMessage.java new file mode 100644 index 000000000..23b71f37a --- /dev/null +++ b/src/main/java/net/mcreator/target/network/message/DroneMoveRightMessage.java @@ -0,0 +1,51 @@ +package net.mcreator.target.network.message; + +import net.mcreator.target.entity.DroneEntity; +import net.mcreator.target.init.TargetModItems; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; + +import java.util.function.Supplier; + +public class DroneMoveRightMessage { + private final boolean right; + + public DroneMoveRightMessage(boolean right) { + this.right = right; + } + + public static DroneMoveRightMessage decode(FriendlyByteBuf buffer) { + return new DroneMoveRightMessage(buffer.readBoolean()); + } + + public static void encode(DroneMoveRightMessage message, FriendlyByteBuf buffer) { + buffer.writeBoolean(message.right); + } + + public static void handler(DroneMoveRightMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + if (context.getSender() != null) { + pressAction(context.getSender(), message.right); + } + }); + context.setPacketHandled(true); + } + + public static void pressAction(Player player, boolean left) { + ItemStack stack = player.getMainHandItem(); + if (stack.is(TargetModItems.MONITOR.get()) && stack.getOrCreateTag().getBoolean("Using") && stack.getOrCreateTag().getBoolean("Linked")) { + DroneEntity drone = player.level().getEntitiesOfClass(DroneEntity.class, player.getBoundingBox().inflate(512)) + .stream().filter(e -> e.getStringUUID().equals(stack.getOrCreateTag().getString("LinkedDrone"))).findFirst().orElse(null); + if (drone != null) { + if (left) { + drone.getPersistentData().putBoolean("right",true); + } else { + drone.getPersistentData().putBoolean("right",false); + } + } + } + } +} diff --git a/src/main/java/net/mcreator/target/network/message/DroneMoveUpMessage.java b/src/main/java/net/mcreator/target/network/message/DroneMoveUpMessage.java new file mode 100644 index 000000000..31b7e085d --- /dev/null +++ b/src/main/java/net/mcreator/target/network/message/DroneMoveUpMessage.java @@ -0,0 +1,51 @@ +package net.mcreator.target.network.message; + +import net.mcreator.target.entity.DroneEntity; +import net.mcreator.target.init.TargetModItems; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; + +import java.util.function.Supplier; + +public class DroneMoveUpMessage { + private final boolean up; + + public DroneMoveUpMessage(boolean up) { + this.up = up; + } + + public static DroneMoveUpMessage decode(FriendlyByteBuf buffer) { + return new DroneMoveUpMessage(buffer.readBoolean()); + } + + public static void encode(DroneMoveUpMessage message, FriendlyByteBuf buffer) { + buffer.writeBoolean(message.up); + } + + public static void handler(DroneMoveUpMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + if (context.getSender() != null) { + pressAction(context.getSender(), message.up); + } + }); + context.setPacketHandled(true); + } + + public static void pressAction(Player player, boolean up) { + ItemStack stack = player.getMainHandItem(); + if (stack.is(TargetModItems.MONITOR.get()) && stack.getOrCreateTag().getBoolean("Using") && stack.getOrCreateTag().getBoolean("Linked")) { + DroneEntity drone = player.level().getEntitiesOfClass(DroneEntity.class, player.getBoundingBox().inflate(512)) + .stream().filter(e -> e.getStringUUID().equals(stack.getOrCreateTag().getString("LinkedDrone"))).findFirst().orElse(null); + if (drone != null) { + if (up) { + drone.getPersistentData().putBoolean("up",true); + } else { + drone.getPersistentData().putBoolean("up",false); + } + } + } + } +} diff --git a/src/main/java/net/mcreator/target/tools/TooltipTool.java b/src/main/java/net/mcreator/target/tools/TooltipTool.java index 782546ef3..9791c1500 100644 --- a/src/main/java/net/mcreator/target/tools/TooltipTool.java +++ b/src/main/java/net/mcreator/target/tools/TooltipTool.java @@ -124,13 +124,11 @@ public class TooltipTool { Player player = Minecraft.getInstance().player; if (player == null) return; - DroneEntity entity = player.level().getEntitiesOfClass(DroneEntity.class, player.getBoundingBox().inflate(256)) + DroneEntity entity = player.level().getEntitiesOfClass(DroneEntity.class, player.getBoundingBox().inflate(512)) .stream().filter(e -> e.getStringUUID().equals(id)).findFirst().orElse(null); if (entity == null) return; - tooltip.add(Component.literal("")); - - tooltip.add(Component.literal(player.distanceTo(entity) + " M").withStyle(ChatFormatting.GRAY)); + tooltip.add(Component.literal("Distance:" + new DecimalFormat("##.#").format(player.distanceTo(entity)) + "M").withStyle(ChatFormatting.GRAY)); } } diff --git a/src/main/resources/assets/target/geo/drone.geo.json b/src/main/resources/assets/target/geo/drone.geo.json index 290c6bc58..893a2e5f2 100644 --- a/src/main/resources/assets/target/geo/drone.geo.json +++ b/src/main/resources/assets/target/geo/drone.geo.json @@ -18,15 +18,15 @@ { "name": "0", "parent": "bone", - "pivot": [0, 0, 0] + "pivot": [0, 0.5, 0] }, { "name": "body", "parent": "0", - "pivot": [0, 0, 0], + "pivot": [0, 0.5, 0], "cubes": [ { - "origin": [-1, 1.75, -3], + "origin": [-1, 2.25, -3], "size": [2, 0.5, 6], "uv": { "north": {"uv": [14, 3], "uv_size": [2, 0.5]}, @@ -38,7 +38,7 @@ } }, { - "origin": [-1, 2.25, -1], + "origin": [-1, 2.75, -1], "size": [2, 0.5, 3.5], "uv": { "north": {"uv": [15, 10], "uv_size": [2, 0.5]}, @@ -50,9 +50,9 @@ } }, { - "origin": [-1, 1.08579, 1.81066], + "origin": [-1, 1.58579, 1.81066], "size": [2, 0.5, 0.71094], - "pivot": [0, 1.33579, 3.56066], + "pivot": [0, 1.83579, 3.56066], "rotation": [-45, 0, 0], "uv": { "north": {"uv": [16, 3], "uv_size": [2, 0.5]}, @@ -64,9 +64,9 @@ } }, { - "origin": [-1, 1.16583, 1.99831], + "origin": [-1, 1.66583, 1.99831], "size": [2, 0.5, 1.05078], - "pivot": [0, 1.41583, 2.5237], + "pivot": [0, 1.91583, 2.5237], "rotation": [60.5, 0, 0], "uv": { "north": {"uv": [14, 9], "uv_size": [2, 0.5]}, @@ -78,9 +78,9 @@ } }, { - "origin": [-1, 1.58044, -2.94914], + "origin": [-1, 2.08044, -2.94914], "size": [2, 0.5, 1.35078], - "pivot": [0, 1.83044, -2.42375], + "pivot": [0, 2.33044, -2.42375], "rotation": [-17.5, 0, 0], "uv": { "north": {"uv": [15, 1], "uv_size": [2, 0.5]}, @@ -92,9 +92,9 @@ } }, { - "origin": [-1, 2.06723, -2.82811], + "origin": [-1, 2.56723, -2.82811], "size": [2, 0.5, 2.04219], - "pivot": [0, 1.81723, -1.61131], + "pivot": [0, 2.31723, -1.61131], "rotation": [14.5, 0, 0], "uv": { "north": {"uv": [15, 12], "uv_size": [2, 0.5]}, @@ -106,7 +106,7 @@ } }, { - "origin": [-1, 0.75, -1.75], + "origin": [-1, 1.25, -1.75], "size": [2, 1, 4.25], "uv": { "north": {"uv": [4, 12], "uv_size": [2, 1]}, @@ -118,9 +118,9 @@ } }, { - "origin": [-0.45, 0.85, -2.75], + "origin": [-0.45, 1.35, -2.75], "size": [0.9, 0.6, 0.9], - "pivot": [0, 1.15, -2.3], + "pivot": [0, 1.65, -2.3], "rotation": [16, 0, 0], "uv": { "north": {"uv": [7, 19], "uv_size": [1, 0.5]}, @@ -132,7 +132,7 @@ } }, { - "origin": [0.45, 0.95, -2.55], + "origin": [0.45, 1.45, -2.55], "size": [0.2, 0.4, 1], "uv": { "north": {"uv": [21, 15], "uv_size": [0.25, 0.5]}, @@ -144,7 +144,7 @@ } }, { - "origin": [-0.65, 0.95, -2.55], + "origin": [-0.65, 1.45, -2.55], "size": [0.2, 0.4, 1], "uv": { "north": {"uv": [21, 16], "uv_size": [0.25, 0.5]}, @@ -156,9 +156,9 @@ } }, { - "origin": [-1.25, 1.5, -5.25], + "origin": [-1.25, 2, -5.25], "size": [0.75, 0.5, 5.25], - "pivot": [0, 0, 0], + "pivot": [0, 0.5, 0], "rotation": [0, -67.5, 0], "uv": { "north": {"uv": [17, 19], "uv_size": [0.75, 0.5]}, @@ -170,9 +170,9 @@ } }, { - "origin": [0.5, 1.5, -5.25], + "origin": [0.5, 2, -5.25], "size": [0.75, 0.5, 5.25], - "pivot": [0, 0, 0], + "pivot": [0, 0.5, 0], "rotation": [0, 67.5, 0], "uv": { "north": {"uv": [19, 18], "uv_size": [0.75, 0.5]}, @@ -184,9 +184,9 @@ } }, { - "origin": [0.5, 1.05, -6], + "origin": [0.5, 1.55, -6], "size": [0.75, 0.95, 0.75], - "pivot": [0, 0, 0], + "pivot": [0, 0.5, 0], "rotation": [0, 67.5, 0], "uv": { "north": {"uv": [16, 5], "uv_size": [0.75, 1]}, @@ -198,9 +198,9 @@ } }, { - "origin": [-1.25, 1.05, -6], + "origin": [-1.25, 1.55, -6], "size": [0.75, 0.95, 0.75], - "pivot": [0, 0, 0], + "pivot": [0, 0.5, 0], "rotation": [0, -67.5, 0], "uv": { "north": {"uv": [16, 9], "uv_size": [0.75, 1]}, @@ -212,9 +212,9 @@ } }, { - "origin": [0.5, 1.5, 1], + "origin": [0.5, 2, 1], "size": [0.75, 0.5, 4.25], - "pivot": [0, 0, 0], + "pivot": [0, 0.5, 0], "rotation": [0, -55, 0], "uv": { "north": {"uv": [0, 20], "uv_size": [0.75, 0.5]}, @@ -226,9 +226,9 @@ } }, { - "origin": [-1.25, 1.5, 1], + "origin": [-1.25, 2, 1], "size": [0.75, 0.5, 4.25], - "pivot": [0, 0, 0], + "pivot": [0, 0.5, 0], "rotation": [0, 55, 0], "uv": { "north": {"uv": [1, 20], "uv_size": [0.75, 0.5]}, @@ -240,9 +240,9 @@ } }, { - "origin": [-1.25, 1.05, 5.25], + "origin": [-1.25, 1.55, 5.25], "size": [0.75, 0.95, 0.75], - "pivot": [0, -0.05, 0], + "pivot": [0, 0.45, 0], "rotation": [0, 55, 0], "uv": { "north": {"uv": [17, 0], "uv_size": [0.75, 1]}, @@ -254,9 +254,9 @@ } }, { - "origin": [0.5, 1.05, 5.25], + "origin": [0.5, 1.55, 5.25], "size": [0.75, 0.95, 0.75], - "pivot": [0, -0.05, 0], + "pivot": [0, 0.45, 0], "rotation": [0, -55, 0], "uv": { "north": {"uv": [17, 2], "uv_size": [0.75, 1]}, @@ -268,9 +268,9 @@ } }, { - "origin": [-1.15, 2, -5.9], + "origin": [-1.15, 2.5, -5.9], "size": [0.55, 0.45, 0.55], - "pivot": [0, 0, 0], + "pivot": [0, 0.5, 0], "rotation": [0, -67.5, 0], "uv": { "north": {"uv": [21, 4], "uv_size": [0.5, 0.5]}, @@ -282,9 +282,9 @@ } }, { - "origin": [0.6, 2, -5.9], + "origin": [0.6, 2.5, -5.9], "size": [0.55, 0.45, 0.55], - "pivot": [0, 0, 0], + "pivot": [0, 0.5, 0], "rotation": [0, 67.5, 0], "uv": { "north": {"uv": [21, 1], "uv_size": [0.5, 0.5]}, @@ -296,9 +296,9 @@ } }, { - "origin": [0.6, 2, 5.35], + "origin": [0.6, 2.5, 5.35], "size": [0.55, 0.45, 0.55], - "pivot": [0, -0.05, 0], + "pivot": [0, 0.45, 0], "rotation": [0, -55, 0], "uv": { "north": {"uv": [19, 20], "uv_size": [0.5, 0.5]}, @@ -310,9 +310,9 @@ } }, { - "origin": [-1.15, 2, 5.35], + "origin": [-1.15, 2.5, 5.35], "size": [0.55, 0.45, 0.55], - "pivot": [0, -0.05, 0], + "pivot": [0, 0.45, 0], "rotation": [0, 55, 0], "uv": { "north": {"uv": [16, 20], "uv_size": [0.5, 0.5]}, @@ -325,8 +325,8 @@ }, { "origin": [0.6, 0.05, 5.5], - "size": [0.55, 1, 0.5], - "pivot": [0, -1, 0], + "size": [0.55, 1.5, 0.5], + "pivot": [0, -0.5, 0], "rotation": [0, -55, 0], "uv": { "north": {"uv": [19, 4], "uv_size": [0.5, 1]}, @@ -339,8 +339,8 @@ }, { "origin": [0.6, 0.05, -5.9], - "size": [0.55, 1, 0.4], - "pivot": [0, -0.95, 0], + "size": [0.55, 1.5, 0.4], + "pivot": [0, -0.45, 0], "rotation": [0, 67.5, 0], "uv": { "north": {"uv": [19, 2], "uv_size": [0.5, 1]}, @@ -353,8 +353,8 @@ }, { "origin": [-1.15, 0.05, -5.9], - "size": [0.55, 1, 0.4], - "pivot": [0, -0.95, 0], + "size": [0.55, 1.5, 0.4], + "pivot": [0, -0.45, 0], "rotation": [0, -67.5, 0], "uv": { "north": {"uv": [19, 0], "uv_size": [0.5, 1]}, @@ -367,8 +367,8 @@ }, { "origin": [-1.15, 0.05, 5.5], - "size": [0.55, 1, 0.5], - "pivot": [0, -1, 0], + "size": [0.55, 1.5, 0.5], + "pivot": [0, -0.5, 0], "rotation": [0, 55, 0], "uv": { "north": {"uv": [16, 18], "uv_size": [0.5, 1]}, @@ -384,12 +384,12 @@ { "name": "wing", "parent": "0", - "pivot": [4.87422, 2.5, -2.96641], + "pivot": [4.87422, 3, -2.96641], "cubes": [ { - "origin": [4.77422, 2.4, -3.06641], + "origin": [4.77422, 2.9, -3.06641], "size": [0.2, 0.7, 0.2], - "pivot": [4.87422, 2.25, -2.96641], + "pivot": [4.87422, 2.75, -2.96641], "rotation": [0, -32.5, 0], "uv": { "north": {"uv": [21, 7], "uv_size": [0.25, 0.75]}, @@ -401,9 +401,9 @@ } }, { - "origin": [4.52422, 2.5, -3.31641], + "origin": [4.52422, 3, -3.31641], "size": [0.7, 0.45, 0.7], - "pivot": [4.87422, 2.25, -2.96641], + "pivot": [4.87422, 2.75, -2.96641], "rotation": [0, -32.5, 0], "uv": { "north": {"uv": [2, 20], "uv_size": [0.75, 0.5]}, @@ -415,9 +415,9 @@ } }, { - "origin": [4.62422, 2.6, -5.81641], + "origin": [4.62422, 3.1, -5.81641], "size": [0.5, 0.25, 2.5], - "pivot": [4.87422, 2.725, -2.96641], + "pivot": [4.87422, 3.225, -2.96641], "rotation": [-13.70122, -29.76212, 26.15697], "uv": { "north": {"uv": [21, 18], "uv_size": [0.5, 0.25]}, @@ -429,9 +429,9 @@ } }, { - "origin": [4.62422, 2.6, -2.61641], + "origin": [4.62422, 3.1, -2.61641], "size": [0.5, 0.25, 2.5], - "pivot": [4.87422, 2.725, -2.96641], + "pivot": [4.87422, 3.225, -2.96641], "rotation": [13.70122, -29.76212, -26.15697], "uv": { "north": {"uv": [21, 17], "uv_size": [0.5, 0.25]}, @@ -447,12 +447,12 @@ { "name": "wing2", "parent": "0", - "pivot": [-4.87422, 2.5, -2.96641], + "pivot": [-4.87422, 3, -2.96641], "cubes": [ { - "origin": [-4.97422, 2.4, -3.06641], + "origin": [-4.97422, 2.9, -3.06641], "size": [0.2, 0.7, 0.2], - "pivot": [-4.87422, 2.25, -2.96641], + "pivot": [-4.87422, 2.75, -2.96641], "rotation": [0, 67.5, 0], "uv": { "north": {"uv": [21, 9], "uv_size": [0.25, 0.75]}, @@ -464,9 +464,9 @@ } }, { - "origin": [-5.22422, 2.5, -3.31641], + "origin": [-5.22422, 3, -3.31641], "size": [0.7, 0.45, 0.7], - "pivot": [-4.87422, 2.25, -2.96641], + "pivot": [-4.87422, 2.75, -2.96641], "rotation": [0, 67.5, 0], "uv": { "north": {"uv": [4, 20], "uv_size": [0.75, 0.5]}, @@ -478,9 +478,9 @@ } }, { - "origin": [-5.12422, 2.6, -5.81641], + "origin": [-5.12422, 3.1, -5.81641], "size": [0.5, 0.25, 2.5], - "pivot": [-4.87422, 2.725, -2.96641], + "pivot": [-4.87422, 3.225, -2.96641], "rotation": [-42.73421, 58.60029, -47.26579], "uv": { "north": {"uv": [21, 19], "uv_size": [0.5, 0.25]}, @@ -492,9 +492,9 @@ } }, { - "origin": [-5.12422, 2.6, -2.61641], + "origin": [-5.12422, 3.1, -2.61641], "size": [0.5, 0.25, 2.5], - "pivot": [-4.87422, 2.725, -2.96641], + "pivot": [-4.87422, 3.225, -2.96641], "rotation": [42.73421, 58.60029, 47.26579], "uv": { "north": {"uv": [21, 20], "uv_size": [0.5, 0.25]}, @@ -510,12 +510,12 @@ { "name": "wing3", "parent": "0", - "pivot": [-4.10859, 2.5, 3.93984], + "pivot": [-4.10859, 3, 3.93984], "cubes": [ { - "origin": [-4.20859, 2.4, 3.83984], + "origin": [-4.20859, 2.9, 3.83984], "size": [0.2, 0.7, 0.2], - "pivot": [-4.10859, 2.25, 3.93984], + "pivot": [-4.10859, 2.75, 3.93984], "rotation": [0, -32.5, 0], "uv": { "north": {"uv": [21, 11], "uv_size": [0.25, 0.75]}, @@ -527,9 +527,9 @@ } }, { - "origin": [-4.45859, 2.5, 3.58984], + "origin": [-4.45859, 3, 3.58984], "size": [0.7, 0.45, 0.7], - "pivot": [-4.10859, 2.25, 3.93984], + "pivot": [-4.10859, 2.75, 3.93984], "rotation": [0, -32.5, 0], "uv": { "north": {"uv": [6, 20], "uv_size": [0.75, 0.5]}, @@ -541,9 +541,9 @@ } }, { - "origin": [-4.35859, 2.6, 1.08984], + "origin": [-4.35859, 3.1, 1.08984], "size": [0.5, 0.25, 2.5], - "pivot": [-4.10859, 2.725, 3.93984], + "pivot": [-4.10859, 3.225, 3.93984], "rotation": [13.70122, -29.76212, -26.15697], "uv": { "north": {"uv": [0, 22], "uv_size": [0.5, 0.25]}, @@ -555,9 +555,9 @@ } }, { - "origin": [-4.35859, 2.6, 4.28984], + "origin": [-4.35859, 3.1, 4.28984], "size": [0.5, 0.25, 2.5], - "pivot": [-4.10859, 2.725, 3.93984], + "pivot": [-4.10859, 3.225, 3.93984], "rotation": [-13.70122, -29.76212, 26.15697], "uv": { "north": {"uv": [1, 22], "uv_size": [0.5, 0.25]}, @@ -573,12 +573,12 @@ { "name": "wing4", "parent": "0", - "pivot": [4.10859, 2.5, 3.93984], + "pivot": [4.10859, 3, 3.93984], "cubes": [ { - "origin": [4.00859, 2.4, 3.83984], + "origin": [4.00859, 2.9, 3.83984], "size": [0.2, 0.7, 0.2], - "pivot": [4.10859, 2.25, 3.93984], + "pivot": [4.10859, 2.75, 3.93984], "rotation": [0, -37.5, 0], "uv": { "north": {"uv": [21, 13], "uv_size": [0.25, 0.75]}, @@ -590,9 +590,9 @@ } }, { - "origin": [3.75859, 2.5, 3.58984], + "origin": [3.75859, 3, 3.58984], "size": [0.7, 0.45, 0.7], - "pivot": [4.10859, 2.25, 3.93984], + "pivot": [4.10859, 2.75, 3.93984], "rotation": [0, -37.5, 0], "uv": { "north": {"uv": [8, 20], "uv_size": [0.75, 0.5]}, @@ -604,9 +604,9 @@ } }, { - "origin": [3.85859, 2.6, 1.08984], + "origin": [3.85859, 3.1, 1.08984], "size": [0.5, 0.25, 2.5], - "pivot": [4.10859, 2.725, 3.93984], + "pivot": [4.10859, 3.225, 3.93984], "rotation": [-16.36452, -34.22348, 27.56928], "uv": { "north": {"uv": [2, 22], "uv_size": [0.5, 0.25]}, @@ -618,9 +618,9 @@ } }, { - "origin": [3.85859, 2.6, 4.28984], + "origin": [3.85859, 3.1, 4.28984], "size": [0.5, 0.25, 2.5], - "pivot": [4.10859, 2.725, 3.93984], + "pivot": [4.10859, 3.225, 3.93984], "rotation": [16.36452, -34.22348, -27.56928], "uv": { "north": {"uv": [3, 22], "uv_size": [0.5, 0.25]},