diff --git a/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java b/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java index 50b5be55b..524fa0eb1 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java @@ -91,9 +91,6 @@ public class ClickHandler { if (stack.is(ModTags.Items.GUN) || stack.is(ModItems.MONITOR.get()) || stack.is(ModItems.LUNGE_MINE.get()) || player.hasEffect(ModMobEffects.SHOCK.get()) || (player.getVehicle() instanceof IArmedVehicleEntity && !(player.getVehicle() instanceof WheelChairEntity))) { if (button == GLFW.GLFW_MOUSE_BUTTON_LEFT) { - if (stack.is(ModItems.LUNGE_MINE.get())) { - ModUtils.PACKET_HANDLER.sendToServer(new LungeMineAttackMessage(0)); - } event.setCanceled(true); } } @@ -118,6 +115,7 @@ public class ClickHandler { if ((stack.is(ModTags.Items.GUN) && !(player.getVehicle() instanceof ICannonEntity)) || stack.is(ModItems.MONITOR.get()) + || stack.is(ModItems.LUNGE_MINE.get()) || (player.getVehicle() instanceof ICannonEntity) || (player.getVehicle() instanceof IArmedVehicleEntity iVehicle && iVehicle.isDriver(player) && stack.is(ItemStack.EMPTY.getItem())) || (stack.is(Items.SPYGLASS) && player.isScoping() && player.getOffhandItem().is(ModItems.FIRING_PARAMETERS.get()))) { @@ -304,6 +302,10 @@ public class ClickHandler { ClientEventHandler.holdFire = true; } + if (stack.is(ModItems.LUNGE_MINE.get())) { + ClientEventHandler.holdFire = true; + } + if (stack.getItem() instanceof GunItem gunItem && !(player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity)) { if ((!(stack.getOrCreateTag().getBoolean("is_normal_reloading") || stack.getOrCreateTag().getBoolean("is_empty_reloading")) && !stack.getOrCreateTag().getBoolean("reloading") diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java index 6f5431a2a..1a7d81860 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java @@ -11,6 +11,7 @@ import com.atsuishio.superbwarfare.init.*; import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.network.ModVariables; import com.atsuishio.superbwarfare.network.message.LaserShootMessage; +import com.atsuishio.superbwarfare.network.message.LungeMineAttackMessage; import com.atsuishio.superbwarfare.network.message.ShootMessage; import com.atsuishio.superbwarfare.network.message.VehicleFireMessage; import com.atsuishio.superbwarfare.perk.AmmoPerk; @@ -22,8 +23,10 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.player.LocalPlayer; import net.minecraft.commands.arguments.EntityAnchorArgument; +import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; @@ -33,6 +36,8 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RenderGuiOverlayEvent; @@ -137,6 +142,7 @@ public class ClientEventHandler { public static double shakeType = 0; public static double vehicleFov = 1; public static double vehicleFovLerp = 1; + public static int lungeAttack; @SubscribeEvent public static void handleWeaponTurn(RenderHandEvent event) { @@ -200,7 +206,7 @@ public class ClientEventHandler { } if (miniGunRot > 0) { - miniGunRot -= 1; + miniGunRot --; } if (notInGame() && !ClickHandler.switchZoom) { @@ -208,7 +214,42 @@ public class ClientEventHandler { } beamShoot(player, stack); + handleLungeAttack(player, stack); + } + public static void handleLungeAttack(Player player, ItemStack stack) { + if (stack.is(ModItems.LUNGE_MINE.get()) && lungeAttack == 0 && holdFire && !player.getCooldowns().isOnCooldown(stack.getItem())) { + lungeAttack = 6; + player.playSound(SoundEvents.PLAYER_ATTACK_SWEEP, 1f, 1); + } + + if (stack.is(ModItems.LUNGE_MINE.get()) && lungeAttack >= 1 && lungeAttack <= 2) { + boolean lookAtEntity = false; + + Entity lookingEntity = TraceTool.findLookingEntity(player,5); + + BlockHitResult result = player.level().clip(new ClipContext(player.getEyePosition(), player.getEyePosition().add(player.getLookAngle().scale(5)), + ClipContext.Block.OUTLINE, ClipContext.Fluid.NONE, player)); + + Vec3 looking = Vec3.atLowerCornerOf(player.level().clip(new ClipContext(player.getEyePosition(), player.getEyePosition().add(player.getLookAngle().scale(5)), ClipContext.Block.OUTLINE, ClipContext.Fluid.NONE, player)).getBlockPos()); + BlockState blockState = player.level().getBlockState(BlockPos.containing(looking.x(), looking.y(), looking.z())); + + if (lookingEntity != null) { + lookAtEntity = true; + } + + if (lookAtEntity) { + ModUtils.PACKET_HANDLER.sendToServer(new LungeMineAttackMessage(0, lookingEntity.getUUID(), result)); + lungeAttack = 0; + } else if (blockState.canOcclude()) { + ModUtils.PACKET_HANDLER.sendToServer(new LungeMineAttackMessage(1, player.getUUID(), result)); + lungeAttack = 0; + } + } + + if (lungeAttack > 0) { + lungeAttack --; + } } @SubscribeEvent diff --git a/src/main/java/com/atsuishio/superbwarfare/item/LungeMine.java b/src/main/java/com/atsuishio/superbwarfare/item/LungeMine.java index 074fb3d08..6f90795e8 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/LungeMine.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/LungeMine.java @@ -1,35 +1,20 @@ package com.atsuishio.superbwarfare.item; import com.atsuishio.superbwarfare.client.renderer.item.LungeMineRenderer; -import com.atsuishio.superbwarfare.config.server.ExplosionDestroyConfig; -import com.atsuishio.superbwarfare.init.ModDamageTypes; -import com.atsuishio.superbwarfare.init.ModItems; -import com.atsuishio.superbwarfare.tools.CustomExplosion; -import com.atsuishio.superbwarfare.tools.ParticleTool; -import com.atsuishio.superbwarfare.tools.TraceTool; -import net.minecraft.client.Minecraft; +import com.atsuishio.superbwarfare.event.ClientEventHandler; import net.minecraft.client.model.HumanoidModel; -import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; -import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.HumanoidArm; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.ClipContext; -import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.HitResult; -import net.minecraft.world.phys.Vec3; import net.minecraftforge.client.extensions.common.IClientItemExtensions; import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; @@ -47,7 +32,7 @@ public class LungeMine extends Item implements GeoItem, AnimatedItem { public static ItemDisplayContext transformType; public LungeMine() { - super(new Properties().stacksTo(1)); + super(new Properties().stacksTo(64)); } @Override @@ -63,10 +48,10 @@ public class LungeMine extends Item implements GeoItem, AnimatedItem { private static final HumanoidModel.ArmPose LungeMinePose = HumanoidModel.ArmPose.create("LungeMine", false, (model, entity, arm) -> { if (arm != HumanoidArm.LEFT) { - model.rightArm.xRot = -22.5f * Mth.DEG_TO_RAD + model.head.xRot; - model.rightArm.yRot = -10f * Mth.DEG_TO_RAD; - model.leftArm.xRot = -55f * Mth.DEG_TO_RAD + model.head.xRot; - model.leftArm.yRot = 50f * Mth.DEG_TO_RAD; + model.rightArm.xRot = 20f * Mth.DEG_TO_RAD + model.head.xRot; + model.rightArm.yRot = -12f * Mth.DEG_TO_RAD; + model.leftArm.xRot = -45f * Mth.DEG_TO_RAD + model.head.xRot; + model.leftArm.yRot = 40f * Mth.DEG_TO_RAD; } }); @@ -82,27 +67,13 @@ public class LungeMine extends Item implements GeoItem, AnimatedItem { }); } - public static void attack(ItemStack stack, Player player) { - if (stack.getOrCreateTag().getInt("AttackTime") == 0) { - stack.getOrCreateTag().putInt("AttackTime" , 6); - player.getCooldowns().addCooldown(stack.getItem(), 6); - player.level().playSound(null, player.getOnPos(), SoundEvents.PLAYER_ATTACK_SWEEP, SoundSource.PLAYERS, 1, 1); - } - - } - public void getTransformType(ItemDisplayContext type) { transformType = type; } private PlayState idlePredicate(AnimationState event) { - LocalPlayer player = Minecraft.getInstance().player; - if (player == null) return PlayState.STOP; - ItemStack stack = player.getMainHandItem(); - if (stack.is(ModItems.LUNGE_MINE.get())) { - if (stack.getOrCreateTag().getInt("AttackTime") > 0) { - return event.setAndContinue(RawAnimation.begin().thenPlay("animation.lunge_mine.fire")); - } + if (ClientEventHandler.lungeAttack > 0) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.lunge_mine.fire")); } return event.setAndContinue(RawAnimation.begin().thenLoop("animation.lunge_mine.idle")); } @@ -136,66 +107,4 @@ public class LungeMine extends Item implements GeoItem, AnimatedItem { public boolean canAttackBlock(BlockState p_41441_, Level p_41442_, BlockPos p_41443_, Player p_41444_) { return false; } - - @Override - public void inventoryTick(ItemStack itemstack, Level world, Entity entity, int slot, boolean selected) { - super.inventoryTick(itemstack, world, entity, slot, selected); - - if (itemstack.getOrCreateTag().getInt("AttackTime") >= 3 && itemstack.getOrCreateTag().getInt("AttackTime") <= 4) { - if (selected && entity.level() instanceof ServerLevel) { - boolean lookAtEntity = false; - - Entity lookingEntity = TraceTool.findLookingEntity(entity,4.5); - - HitResult result = entity.level().clip(new ClipContext(entity.getEyePosition(), entity.getEyePosition().add(entity.getLookAngle().scale(4.5)), - ClipContext.Block.OUTLINE, ClipContext.Fluid.NONE, entity)); - - Vec3 looking = Vec3.atLowerCornerOf(entity.level().clip(new ClipContext(entity.getEyePosition(), entity.getEyePosition().add(entity.getLookAngle().scale(4)), ClipContext.Block.OUTLINE, ClipContext.Fluid.NONE, entity)).getBlockPos()); - BlockState blockState = entity.level().getBlockState(BlockPos.containing(looking.x(), looking.y(), looking.z())); - - Vec3 hitPos = result.getLocation(); - - if (lookingEntity != null) { - lookAtEntity = true; - } - -// if (entity instanceof Player player) { -// player.displayClientMessage(Component.literal("" + lookAtEntity), true); -// } - - if (lookAtEntity) { - if (entity instanceof Player player && !player.isCreative()) { - itemstack.shrink(1); - } - lookingEntity.hurt(ModDamageTypes.causeCannonFireDamage(entity.level().registryAccess(), entity, entity), 150); - causeLungeMineExplode(entity.level(), entity, lookingEntity); - } else if (blockState.canOcclude()) { - if (entity instanceof Player player && !player.isCreative()) { - itemstack.shrink(1); - } - CustomExplosion explosion = new CustomExplosion(entity.level(), null, - ModDamageTypes.causeProjectileBoomDamage(entity.level().registryAccess(), entity, entity), 60, - looking.x, looking.y, looking.z, 4f, ExplosionDestroyConfig.EXPLOSION_DESTROY.get() ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP).setDamageMultiplier(1.25f); - explosion.explode(); - net.minecraftforge.event.ForgeEventFactory.onExplosionStart(entity.level(), explosion); - explosion.finalizeExplosion(false); - ParticleTool.spawnMediumExplosionParticles(entity.level(), hitPos); - } - } - } - - if (itemstack.getOrCreateTag().getInt("AttackTime") > 0) { - itemstack.getOrCreateTag().putInt("AttackTime", itemstack.getOrCreateTag().getInt("AttackTime") - 1); - } - } - - public static void causeLungeMineExplode(Level pLevel, Entity entity, Entity pLivingEntity) { - CustomExplosion explosion = new CustomExplosion(pLevel, pLivingEntity, - ModDamageTypes.causeProjectileBoomDamage(pLevel.registryAccess(), pLivingEntity, entity), 60, - pLivingEntity.getX(), pLivingEntity.getY(), pLivingEntity.getZ(), 4f, ExplosionDestroyConfig.EXPLOSION_DESTROY.get() ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP).setDamageMultiplier(1.25f); - explosion.explode(); - net.minecraftforge.event.ForgeEventFactory.onExplosionStart(pLevel, explosion); - explosion.finalizeExplosion(false); - ParticleTool.spawnMediumExplosionParticles(pLevel, pLivingEntity.position()); - } } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/LungeMineAttackMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/LungeMineAttackMessage.java index 23aa76275..9b3d8b02b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/LungeMineAttackMessage.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/LungeMineAttackMessage.java @@ -1,28 +1,44 @@ package com.atsuishio.superbwarfare.network.message; +import com.atsuishio.superbwarfare.config.server.ExplosionDestroyConfig; +import com.atsuishio.superbwarfare.init.ModDamageTypes; import com.atsuishio.superbwarfare.init.ModItems; -import com.atsuishio.superbwarfare.item.LungeMine; +import com.atsuishio.superbwarfare.tools.CustomExplosion; +import com.atsuishio.superbwarfare.tools.EntityFindUtil; +import com.atsuishio.superbwarfare.tools.ParticleTool; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.network.NetworkEvent; +import java.util.UUID; import java.util.function.Supplier; public class LungeMineAttackMessage { private final int type; + private final UUID uuid; + private final BlockHitResult hitResult; - public LungeMineAttackMessage(int type) { + public LungeMineAttackMessage(int type, UUID uuid, BlockHitResult hitResult) { this.type = type; + this.uuid = uuid; + this.hitResult = hitResult; } public static LungeMineAttackMessage decode(FriendlyByteBuf buffer) { - return new LungeMineAttackMessage(buffer.readInt()); + return new LungeMineAttackMessage(buffer.readInt(), buffer.readUUID(), buffer.readBlockHitResult()); } public static void encode(LungeMineAttackMessage message, FriendlyByteBuf buffer) { buffer.writeInt(message.type); + buffer.writeUUID(message.uuid); + buffer.writeBlockHitResult(message.hitResult); } public static void handler(LungeMineAttackMessage message, Supplier contextSupplier) { @@ -35,11 +51,43 @@ public class LungeMineAttackMessage { if (stack.is(ModItems.LUNGE_MINE.get())) { if (message.type == 0) { - LungeMine.attack(stack,player); + player.getCooldowns().addCooldown(stack.getItem(), 10); + if (!player.isCreative()) { + stack.shrink(1); + } + Entity lookingEntity = EntityFindUtil.findEntity(player.level(), String.valueOf(message.uuid)); + if (lookingEntity != null) { + lookingEntity.hurt(ModDamageTypes.causeCannonFireDamage(player.level().registryAccess(), player, player), 150); + causeLungeMineExplode(player.level(), player, lookingEntity); + } + } else if (message.type == 1) { + player.getCooldowns().addCooldown(stack.getItem(), 10); + if (!player.isCreative()) { + stack.shrink(1); + } + CustomExplosion explosion = new CustomExplosion(player.level(), null, + ModDamageTypes.causeProjectileBoomDamage(player.level().registryAccess(), player, player), 60, + message.hitResult.getLocation().x, message.hitResult.getLocation().y, message.hitResult.getLocation().z, 4f, ExplosionDestroyConfig.EXPLOSION_DESTROY.get() ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP).setDamageMultiplier(1.25f); + explosion.explode(); + net.minecraftforge.event.ForgeEventFactory.onExplosionStart(player.level(), explosion); + explosion.finalizeExplosion(false); + ParticleTool.spawnMediumExplosionParticles(player.level(), message.hitResult.getLocation()); + } + player.swing(InteractionHand.MAIN_HAND); } } }); context.setPacketHandled(true); } + + public static void causeLungeMineExplode(Level pLevel, Entity entity, Entity pLivingEntity) { + CustomExplosion explosion = new CustomExplosion(pLevel, pLivingEntity, + ModDamageTypes.causeProjectileBoomDamage(pLevel.registryAccess(), pLivingEntity, entity), 60, + pLivingEntity.getX(), pLivingEntity.getY(), pLivingEntity.getZ(), 4f, ExplosionDestroyConfig.EXPLOSION_DESTROY.get() ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP).setDamageMultiplier(1.25f); + explosion.explode(); + net.minecraftforge.event.ForgeEventFactory.onExplosionStart(pLevel, explosion); + explosion.finalizeExplosion(false); + ParticleTool.spawnMediumExplosionParticles(pLevel, pLivingEntity.position()); + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/tools/SeekTool.java b/src/main/java/com/atsuishio/superbwarfare/tools/SeekTool.java index 520a6f422..7aec65a03 100644 --- a/src/main/java/com/atsuishio/superbwarfare/tools/SeekTool.java +++ b/src/main/java/com/atsuishio/superbwarfare/tools/SeekTool.java @@ -1,5 +1,6 @@ package com.atsuishio.superbwarfare.tools; +import com.atsuishio.superbwarfare.entity.ClaymoreEntity; import com.atsuishio.superbwarfare.entity.VehicleEntity; import com.atsuishio.superbwarfare.entity.projectile.ProjectileEntity; import net.minecraft.core.BlockPos; @@ -77,7 +78,7 @@ public class SeekTool { return StreamSupport.stream(EntityFindUtil.getEntities(level).getAll().spliterator(), false) .filter(e -> e.distanceToSqr(pos.getX(), pos.getY(), pos.getZ()) <= range * range && e.isAlive() - && !(e instanceof ItemEntity || e instanceof ExperienceOrb || e instanceof HangingEntity || e instanceof ProjectileEntity || e instanceof Projectile || e instanceof ArmorStand) + && !(e instanceof ItemEntity || e instanceof ExperienceOrb || e instanceof HangingEntity || e instanceof ProjectileEntity || e instanceof Projectile || e instanceof ArmorStand || e instanceof ClaymoreEntity) && !(e instanceof Player player && player.isSpectator())) .toList(); } diff --git a/src/main/resources/assets/superbwarfare/models/item/lunge_mine.json b/src/main/resources/assets/superbwarfare/models/item/lunge_mine.json index 8fa3111e8..22547664a 100644 --- a/src/main/resources/assets/superbwarfare/models/item/lunge_mine.json +++ b/src/main/resources/assets/superbwarfare/models/item/lunge_mine.json @@ -9,7 +9,7 @@ "parent": "superbwarfare:item/lunge_mine_icon" }, "thirdperson_righthand": { - "parent": "superbwarfare:item/lunge_mine_base" + "parent": "superbwarfare:item/lunge_mine_3d" }, "thirdperson_lefthand": { "parent": "superbwarfare:item/lunge_mine_icon" diff --git a/src/main/resources/assets/superbwarfare/models/item/lunge_mine_3d.json b/src/main/resources/assets/superbwarfare/models/item/lunge_mine_3d.json new file mode 100644 index 000000000..79c4e2550 --- /dev/null +++ b/src/main/resources/assets/superbwarfare/models/item/lunge_mine_3d.json @@ -0,0 +1,478 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [32, 32], + "textures": { + "1": "superbwarfare:item/lunge_mine" + }, + "elements": [ + { + "name": "cube2", + "from": [7.7901, -15.35316, 7.49326], + "to": [8.2099, 19.64684, 8.50674], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 5.14684, 8]}, + "faces": { + "north": {"uv": [10.5, 0.5, 0, 1], "rotation": 270, "texture": "#1"}, + "south": {"uv": [10.5, 2.5, 0, 2], "rotation": 270, "texture": "#1"}, + "down": {"uv": [8, 10, 8.5, 10.5], "texture": "#1"} + } + }, + { + "name": "cube3", + "from": [7.7901, -15.35316, 7.49326], + "to": [8.2099, 19.64684, 8.50674], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 5.14684, 8]}, + "faces": { + "north": {"uv": [10.5, 1, 0, 1.5], "rotation": 270, "texture": "#1"}, + "south": {"uv": [10.5, 0.5, 0, 0], "rotation": 270, "texture": "#1"}, + "down": {"uv": [8, 10, 8.5, 10.5], "texture": "#1"} + } + }, + { + "name": "cube4", + "from": [7.49326, -15.35316, 7.7901], + "to": [8.50674, 19.64684, 8.2099], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 5.14684, 8]}, + "faces": { + "east": {"uv": [10.5, 0.5, 0, 0], "rotation": 270, "texture": "#1"}, + "west": {"uv": [10.5, 2, 0, 2.5], "rotation": 270, "texture": "#1"}, + "down": {"uv": [8, 10, 8.5, 10.5], "rotation": 90, "texture": "#1"} + } + }, + { + "name": "cube3", + "from": [7.49326, -15.35316, 7.7901], + "to": [8.50674, 19.64684, 8.2099], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 5.14684, 8]}, + "faces": { + "east": {"uv": [10.5, 0.5, 0, 0], "rotation": 270, "texture": "#1"}, + "west": {"uv": [10.5, 1.5, 0, 2], "rotation": 270, "texture": "#1"}, + "down": {"uv": [8, 10, 8.5, 10.5], "rotation": 90, "texture": "#1"} + } + }, + { + "name": "cube5", + "from": [7.7901, -15.35316, 7.49326], + "to": [8.2099, 19.64684, 8.50674], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 5.14684, 8]}, + "faces": { + "north": {"uv": [10.5, 0.5, 0, 0], "rotation": 270, "texture": "#1"}, + "south": {"uv": [10.5, 0.5, 0, 1], "rotation": 270, "texture": "#1"}, + "down": {"uv": [8, 10, 8.5, 10.5], "rotation": 180, "texture": "#1"} + } + }, + { + "name": "cube4", + "from": [7.7901, -15.35316, 7.49326], + "to": [8.2099, 19.64684, 8.50674], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 5.14684, 8]}, + "faces": { + "north": {"uv": [10.5, 0.5, 0, 0], "rotation": 270, "texture": "#1"}, + "south": {"uv": [10.5, 0.5, 0, 1], "rotation": 270, "texture": "#1"}, + "down": {"uv": [8, 10, 8.5, 10.5], "rotation": 180, "texture": "#1"} + } + }, + { + "name": "cube4", + "from": [7.34124, 19.64684, 7.72713], + "to": [8.65876, 22.64684, 8.27287], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 25.64684, 8]}, + "faces": { + "east": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "west": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"} + } + }, + { + "name": "cube5", + "from": [7.34124, 19.64684, 7.72713], + "to": [8.65876, 22.64684, 8.27287], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 25.64684, 8]}, + "faces": { + "east": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "west": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"} + } + }, + { + "name": "cube6", + "from": [7.72713, 19.64684, 7.34124], + "to": [8.27287, 22.64684, 8.65876], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 25.64684, 8]}, + "faces": { + "north": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "south": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 10, 7.5, 10.5], "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 180, "texture": "#1"} + } + }, + { + "name": "cube7", + "from": [7.72713, 19.64684, 7.34124], + "to": [8.27287, 22.64684, 8.65876], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 25.64684, 8]}, + "faces": { + "north": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "south": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 10, 7.5, 10.5], "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 180, "texture": "#1"} + } + }, + { + "name": "cube5", + "from": [7.07774, 22.64684, 7.61799], + "to": [8.92226, 24, 8.38201], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 17.04684, 8]}, + "faces": { + "east": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "west": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"} + } + }, + { + "name": "cube6", + "from": [7.07774, 22.64684, 7.61799], + "to": [8.92226, 24, 8.38201], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 17.04684, 8]}, + "faces": { + "east": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "west": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"} + } + }, + { + "name": "cube7", + "from": [7.61799, 22.64684, 7.07774], + "to": [8.38201, 24, 8.92226], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 17.04684, 8]}, + "faces": { + "north": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "south": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 10, 7.5, 10.5], "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 180, "texture": "#1"} + } + }, + { + "name": "cube8", + "from": [7.61799, 22.64684, 7.07774], + "to": [8.38201, 24, 8.92226], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 17.04684, 8]}, + "faces": { + "north": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "south": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 10, 7.5, 10.5], "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 180, "texture": "#1"} + } + }, + { + "name": "cube6", + "from": [6.80106, 24, 7.50338], + "to": [9.19894, 25.25, 8.49662], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 14.96089, 8]}, + "faces": { + "east": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "west": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"} + } + }, + { + "name": "cube7", + "from": [6.80106, 24, 7.50338], + "to": [9.19894, 25.25, 8.49662], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 14.96089, 8]}, + "faces": { + "east": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "west": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"} + } + }, + { + "name": "cube8", + "from": [7.50338, 24, 6.80106], + "to": [8.49662, 25.25, 9.19894], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 14.96089, 8]}, + "faces": { + "north": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "south": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 10, 7.5, 10.5], "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 180, "texture": "#1"} + } + }, + { + "name": "cube9", + "from": [7.50338, 24, 6.80106], + "to": [8.49662, 25.25, 9.19894], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 14.96089, 8]}, + "faces": { + "north": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "south": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 10, 7.5, 10.5], "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 180, "texture": "#1"} + } + }, + { + "name": "cube7", + "from": [6.44138, 25.25, 7.3544], + "to": [9.55862, 26.75, 8.6456], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 11.87415, 8]}, + "faces": { + "east": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "west": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"} + } + }, + { + "name": "cube8", + "from": [6.44138, 25.25, 7.3544], + "to": [9.55862, 26.75, 8.6456], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 11.87415, 8]}, + "faces": { + "east": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "west": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"} + } + }, + { + "name": "cube9", + "from": [7.3544, 25.25, 6.44138], + "to": [8.6456, 26.75, 9.55862], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 11.87415, 8]}, + "faces": { + "north": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "south": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 10, 7.5, 10.5], "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 180, "texture": "#1"} + } + }, + { + "name": "cube10", + "from": [7.3544, 25.25, 6.44138], + "to": [8.6456, 26.75, 9.55862], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 11.87415, 8]}, + "faces": { + "north": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "south": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 10, 7.5, 10.5], "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 180, "texture": "#1"} + } + }, + { + "name": "cube8", + "from": [5.9738, 26.75, 7.16072], + "to": [10.0262, 28.5, 8.83928], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 25.775, 8]}, + "faces": { + "east": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "west": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"} + } + }, + { + "name": "cube9", + "from": [5.9738, 26.75, 7.16072], + "to": [10.0262, 28.5, 8.83928], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 25.775, 8]}, + "faces": { + "east": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "west": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"} + } + }, + { + "name": "cube10", + "from": [7.16072, 26.75, 5.9738], + "to": [8.83928, 28.5, 10.0262], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 25.775, 8]}, + "faces": { + "north": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "south": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 10, 7.5, 10.5], "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 180, "texture": "#1"} + } + }, + { + "name": "cube11", + "from": [7.16072, 26.75, 5.9738], + "to": [8.83928, 28.5, 10.0262], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 25.775, 8]}, + "faces": { + "north": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "south": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 10, 7.5, 10.5], "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 180, "texture": "#1"} + } + }, + { + "name": "cube9", + "from": [5.36593, 28.5, 6.90893], + "to": [10.63407, 30.25, 9.09107], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 27.3625, 8]}, + "faces": { + "east": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "west": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 4.5, 7.5, 6.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"} + } + }, + { + "name": "cube10", + "from": [7.875, 30.24093, 9.875], + "to": [8.125, 32, 10.125], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 31.12047, 10]}, + "faces": { + "north": {"uv": [7.5, 7, 8, 8], "texture": "#1"}, + "east": {"uv": [7.5, 7, 8, 8], "texture": "#1"}, + "south": {"uv": [7.5, 7, 8, 8], "texture": "#1"}, + "west": {"uv": [7.5, 7, 8, 8], "texture": "#1"}, + "up": {"uv": [8, 5.5, 8.5, 6], "texture": "#1"} + } + }, + { + "name": "cube11", + "from": [9.875, 30.24093, 6.875], + "to": [10.125, 32, 7.125], + "rotation": {"angle": -45, "axis": "y", "origin": [10, 31.12047, 7]}, + "faces": { + "north": {"uv": [7.5, 7, 8, 8], "texture": "#1"}, + "east": {"uv": [7.5, 7, 8, 8], "texture": "#1"}, + "south": {"uv": [7.5, 7, 8, 8], "texture": "#1"}, + "west": {"uv": [7.5, 7, 8, 8], "texture": "#1"}, + "up": {"uv": [8, 5.5, 8.5, 6], "texture": "#1"} + } + }, + { + "name": "cube12", + "from": [5.875, 30.24093, 6.875], + "to": [6.125, 32, 7.125], + "rotation": {"angle": 45, "axis": "y", "origin": [6, 31.12047, 7]}, + "faces": { + "north": {"uv": [8, 7, 7.5, 8], "texture": "#1"}, + "east": {"uv": [8, 7, 7.5, 8], "texture": "#1"}, + "south": {"uv": [8, 7, 7.5, 8], "texture": "#1"}, + "west": {"uv": [8, 7, 7.5, 8], "texture": "#1"}, + "up": {"uv": [8.5, 5.5, 8, 6], "texture": "#1"} + } + }, + { + "name": "cube10", + "from": [5.36593, 28.5, 6.90893], + "to": [10.63407, 30.25, 9.09107], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 27.3625, 8]}, + "faces": { + "east": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "west": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 4.5, 7.5, 6.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"} + } + }, + { + "name": "cube11", + "from": [6.90893, 28.5, 5.36593], + "to": [9.09107, 30.25, 10.63407], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 27.3625, 8]}, + "faces": { + "north": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "south": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 4.5, 7.5, 6.5], "rotation": 180, "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "texture": "#1"} + } + }, + { + "name": "cube12", + "from": [6.90893, 28.5, 5.36593], + "to": [9.09107, 30.25, 10.63407], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 27.3625, 8]}, + "faces": { + "north": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "south": {"uv": [7, 10, 7.5, 10.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [7, 4.5, 7.5, 6.5], "rotation": 180, "texture": "#1"}, + "down": {"uv": [7, 10, 7.5, 10.5], "texture": "#1"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [23.03, 4.5, 9.89], + "translation": [-4.25, 15.75, 9] + }, + "thirdperson_lefthand": { + "scale": [0, 0, 0] + }, + "firstperson_righthand": { + "translation": [-4.5, 0, 0] + }, + "firstperson_lefthand": { + "scale": [0, 0, 0] + }, + "ground": { + "rotation": [-90, 0, 0], + "translation": [0, 24.75, 0] + }, + "gui": { + "rotation": [138.65, -34.86, 151.18], + "translation": [0, -0.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "head": { + "rotation": [-90, 0, 0], + "translation": [0, 29.75, 0] + }, + "fixed": { + "rotation": [90, 45, -90], + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "group", + "origin": [8.5, 9.14684, -22.2099], + "color": 0, + "children": [0, 1, 2, 3, 4, 5] + }, + { + "name": "group", + "origin": [8.5, 9.14684, -22.2099], + "color": 0, + "children": [6, 7, 8, 9] + }, + { + "name": "group", + "origin": [8.5, 9.14684, -22.2099], + "color": 0, + "children": [10, 11, 12, 13] + }, + { + "name": "group", + "origin": [8.5, 9.14684, -22.2099], + "color": 0, + "children": [14, 15, 16, 17] + }, + { + "name": "group", + "origin": [8.5, 9.14684, -22.2099], + "color": 0, + "children": [18, 19, 20, 21] + }, + { + "name": "group", + "origin": [8.5, 9.14684, -22.2099], + "color": 0, + "children": [22, 23, 24, 25] + }, + { + "name": "group", + "origin": [8.5, 9.14684, -22.2099], + "color": 0, + "children": [26, 27, 28, 29, 30, 31, 32] + } + ] +} \ No newline at end of file