添加刺雷的3P模型,将刺雷的命中判定移到客户端

This commit is contained in:
Atsuihsio 2024-12-31 03:31:36 +08:00
parent be9be69db7
commit 47f45a11a5
7 changed files with 588 additions and 109 deletions

View file

@ -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")

View file

@ -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

View file

@ -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<LungeMine> 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());
}
}

View file

@ -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<NetworkEvent.Context> 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());
}
}

View file

@ -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();
}

View file

@ -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"

View file

@ -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]
}
]
}