From b7530d1ebbcd04ecd8667d0e2e31f44e7b91f96d Mon Sep 17 00:00:00 2001 From: Atsuihsio <842960157@qq.com> Date: Wed, 22 Jan 2025 01:07:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B1=A4=E5=A7=86F6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/model/entity/Tom6Model.java | 25 + .../client/renderer/entity/Tom6Renderer.java | 46 + .../superbwarfare/entity/DroneEntity.java | 10 + .../entity/vehicle/Ah6Entity.java | 6 +- .../entity/vehicle/Tom6Entity.java | 265 +++++ .../entity/vehicle/VehicleEntity.java | 1 - .../superbwarfare/init/ModEntities.java | 2 + .../init/ModEntityRenderers.java | 1 + .../atsuishio/superbwarfare/init/ModTabs.java | 1 + .../superbwarfare/mixins/CameraMixin.java | 5 + .../mixins/GameRendererMixin.java | 26 + .../mixins/LivingEntityRendererMixin.java | 5 + .../assets/superbwarfare/geo/tom_6.geo.json | 1011 +++++++++++++++++ .../superbwarfare/textures/entity/tom_6.png | Bin 0 -> 5191 bytes 14 files changed, 1398 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/entity/Tom6Model.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/Tom6Renderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java create mode 100644 src/main/resources/assets/superbwarfare/geo/tom_6.geo.json create mode 100644 src/main/resources/assets/superbwarfare/textures/entity/tom_6.png diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/entity/Tom6Model.java b/src/main/java/com/atsuishio/superbwarfare/client/model/entity/Tom6Model.java new file mode 100644 index 000000000..97d61dd88 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/entity/Tom6Model.java @@ -0,0 +1,25 @@ +package com.atsuishio.superbwarfare.client.model.entity; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.entity.vehicle.Tom6Entity; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.model.GeoModel; + +public class Tom6Model extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(Tom6Entity entity) { + return null; +// return ModUtils.loc("animations/wheel_chair.animation.json"); + } + + @Override + public ResourceLocation getModelResource(Tom6Entity entity) { + return ModUtils.loc("geo/tom_6.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(Tom6Entity entity) { + return ModUtils.loc("textures/entity/tom_6.png"); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/Tom6Renderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/Tom6Renderer.java new file mode 100644 index 000000000..65a4c03f1 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/Tom6Renderer.java @@ -0,0 +1,46 @@ +package com.atsuishio.superbwarfare.client.renderer.entity; + +import com.atsuishio.superbwarfare.client.model.entity.Tom6Model; +import com.atsuishio.superbwarfare.entity.vehicle.Tom6Entity; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoEntityRenderer; + +public class Tom6Renderer extends GeoEntityRenderer { + + public Tom6Renderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new Tom6Model()); + this.shadowRadius = 0.5f; + } + + @Override + public RenderType getRenderType(Tom6Entity animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + @Override + public void preRender(PoseStack poseStack, Tom6Entity entity, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, + float blue, float alpha) { + float scale = 1f; + this.scaleHeight = scale; + this.scaleWidth = scale; + super.preRender(poseStack, entity, model, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + } + + @Override + public void render(Tom6Entity entityIn, float entityYaw, float partialTicks, PoseStack poseStack, MultiBufferSource bufferIn, int packedLightIn) { + poseStack.pushPose(); + poseStack.mulPose(Axis.YP.rotationDegrees(-entityYaw)); + poseStack.mulPose(Axis.XP.rotationDegrees(Mth.lerp(partialTicks, entityIn.xRotO, entityIn.getXRot()))); + poseStack.mulPose(Axis.ZP.rotationDegrees(Mth.lerp(partialTicks, entityIn.prevRoll, entityIn.getRoll()))); + super.render(entityIn, entityYaw, partialTicks, poseStack, bufferIn, packedLightIn); + poseStack.popPose(); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/DroneEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/DroneEntity.java index 79ef2bc8d..4b0ea08ab 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/DroneEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/DroneEntity.java @@ -548,6 +548,16 @@ public class DroneEntity extends MobileVehicleEntity implements GeoEntity { return this.cache; } + @Override + public float ignoreExplosionHorizontalKnockBack() { + return 0; + } + + @Override + public float ignoreExplosionVerticalKnockBack() { + return 0; + } + @Override public void onRemovedFromWorld() { if (this.level() instanceof ServerLevel serverLevel) { diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java index cac74ec7a..6f5349736 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java @@ -152,6 +152,7 @@ public class Ah6Entity extends ContainerMobileEntity implements GeoEntity, IHeli @Override public void baseTick() { propellerRotO = this.getPropellerRot(); + setZRot(roll * 0.9f); super.baseTick(); if (heat > 0) { @@ -403,10 +404,6 @@ public class Ah6Entity extends ContainerMobileEntity implements GeoEntity, IHeli Vector4f worldPosition = transformPosition(transform, x, y, z); passenger.setPos(worldPosition.x, worldPosition.y, worldPosition.z); callback.accept(passenger, worldPosition.x, worldPosition.y, worldPosition.z); - } else if (i == 1) { - Vector4f worldPosition = transformPosition(transform, -x, y, z); - passenger.setPos(worldPosition.x, worldPosition.y, worldPosition.z); - callback.accept(passenger, worldPosition.x, worldPosition.y, worldPosition.z); } if (passenger != this.getFirstPassenger()) { @@ -419,7 +416,6 @@ public class Ah6Entity extends ContainerMobileEntity implements GeoEntity, IHeli public void copyEntityData(Entity entity) { float f = Mth.wrapDegrees(entity.getYRot() - getYRot()); float g = Mth.clamp(f, -105.0f, 105.0f); - entity.yRotO += g - f; entity.setYRot(entity.getYRot() + g - f); entity.setYHeadRot(entity.getYRot()); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java new file mode 100644 index 000000000..74a53e020 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Tom6Entity.java @@ -0,0 +1,265 @@ +package com.atsuishio.superbwarfare.entity.vehicle; + +import com.atsuishio.superbwarfare.config.server.ExplosionDestroyConfig; +import com.atsuishio.superbwarfare.init.ModDamageTypes; +import com.atsuishio.superbwarfare.init.ModEntities; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.tools.CustomExplosion; +import com.atsuishio.superbwarfare.tools.EntityFindUtil; +import com.atsuishio.superbwarfare.tools.ParticleTool; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.Mth; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; +import net.minecraftforge.network.NetworkHooks; +import net.minecraftforge.network.PlayMessages; +import org.jetbrains.annotations.NotNull; +import org.joml.Math; +import org.joml.Matrix4f; +import org.joml.Vector4f; +import software.bernie.geckolib.animatable.GeoEntity; +import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.util.GeckoLibUtil; + +public class Tom6Entity extends MobileVehicleEntity implements GeoEntity { + public static final EntityDataAccessor DELTA_ROT = SynchedEntityData.defineId(Tom6Entity.class, EntityDataSerializers.FLOAT); + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static final float MAX_HEALTH = 50; + public static final int MAX_ENERGY = 100000; + + public Tom6Entity(PlayMessages.SpawnEntity packet, Level world) { + this(ModEntities.TOM_6.get(), world); + } + + public Tom6Entity(EntityType type, Level world) { + super(type, world); + this.setMaxUpStep(0.5f); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(DELTA_ROT, 0f); + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + } + + @Override + public Packet getAddEntityPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + public boolean hurt(DamageSource source, float amount) { + super.hurt(source, amount); + this.level().playSound(null, this.getOnPos(), ModSounds.HIT.get(), SoundSource.PLAYERS, 1, 1); + this.hurt(amount); + return true; + } + + @Override + public void baseTick() { + setZRot(roll * (onGround() ? 0.9f : 0.995f)); + super.baseTick(); + float f; + + if (this.onGround()) { + f = (float) Mth.clamp(0.403f + 0.34f * Mth.abs(90 - (float) calculateAngle(this.getDeltaMovement(), this.getViewVector(1))) / 90, 0.01, 0.99); + } else { + f = (float) Mth.clamp(0.683f + 0.06f * Mth.abs(90 - (float) calculateAngle(this.getDeltaMovement(), this.getViewVector(1))) / 90, 0.01, 0.99); + } + + this.setDeltaMovement(this.getDeltaMovement().add(this.getViewVector(1).scale((0.33) * this.getDeltaMovement().length()))); + this.setDeltaMovement(this.getDeltaMovement().multiply(f, f, f)); + this.refreshDimensions(); + } + + @Override + public void travel() { + Entity passenger = this.getPassengers().isEmpty() ? null : this.getPassengers().get(0); + +// if (this.getEnergy() <= 0) return; + + float diffX; + float diffY; + + if (passenger == null) { + this.leftInputDown = false; + this.rightInputDown = false; + this.forwardInputDown = false; + this.backInputDown = false; + this.setZRot(this.roll * 0.8f); + this.setXRot(this.getXRot() * 0.7f); + this.entityData.set(POWER, this.entityData.get(POWER) * 0.98f); + } else if (passenger instanceof Player) { + + diffY = Math.clamp(-90f, 90f, Mth.wrapDegrees(passenger.getYHeadRot() - this.getYRot())); + diffX = Math.clamp(-60f, 60f, Mth.wrapDegrees(passenger.getXRot() - this.getXRot())); + + if (!onGround()) { + if (rightInputDown) { + this.entityData.set(DELTA_ROT, this.entityData.get(DELTA_ROT) - 0.35f); + } else if (this.leftInputDown) { + this.entityData.set(DELTA_ROT, this.entityData.get(DELTA_ROT) + 0.35f); + } + } + + this.setYRot(this.getYRot() + Mth.clamp(Math.min((this.onGround() ? 1.5f : 0.8f) * (float) Math.max(getDeltaMovement().length() - 0.06, 0), 0.9f) * diffY - 0.5f * this.entityData.get(DELTA_ROT), -3f, 3f)); + this.setXRot(Mth.clamp(this.getXRot() + Mth.clamp(Math.min(((this.onGround()) ? 0 : 0.3f) * (float) Math.max(getDeltaMovement().length() - 0.02, 0), 0.9f) * diffX, -2f, 2f), onGround() ? -10 : -120, onGround() ? 2 : 120)); + this.setZRot(this.getRoll() - this.entityData.get(DELTA_ROT) + (this.onGround() ? 0 : 0.004f) * diffY * (float) getDeltaMovement().length()); + } + + if (forwardInputDown) { + this.entityData.set(POWER, Math.min(this.entityData.get(POWER) + 0.002f, 0.12f)); + } + + if (backInputDown) { + this.entityData.set(POWER, Math.max(this.entityData.get(POWER) - 0.004f, -0.08f)); + } + + +// if (this.forwardInputDown || this.backInputDown) { +// this.extraEnergy(VehicleConfig.SPEEDBOAT_ENERGY_COST.get()); +// } + + this.entityData.set(POWER, this.entityData.get(POWER) * 0.99f); + this.entityData.set(DELTA_ROT, this.entityData.get(DELTA_ROT) * 0.95f); + + + this.setDeltaMovement(this.getDeltaMovement().add( + Mth.sin(-this.getYRot() * 0.017453292F) * 0.16f * this.entityData.get(POWER), + Mth.clamp(Math.sin((onGround() ? 45 : -(getXRot() - 30)) * Mth.DEG_TO_RAD) * getDeltaMovement().horizontalDistance() * 0.092f, -0.04, 0.09), + Mth.cos(this.getYRot() * 0.017453292F) * 0.16f * this.entityData.get(POWER) + )); + + } + + @Override + public SoundEvent getEngineSound() { + return ModSounds.WHEEL_CHAIR_ENGINE.get(); + } + + protected void clampRotation(Entity entity) { + float f = Mth.wrapDegrees(entity.getXRot()); + float f1 = Mth.clamp(f, -90.0F, 90F); + entity.xRotO += f1 - f; + entity.setXRot(entity.getXRot() + f1 - f); + + entity.setYBodyRot(this.getYRot()); + float f2 = Mth.wrapDegrees(entity.getYRot() - this.getYRot()); + float f3 = Mth.clamp(f2, -80.0F, 50.0F); + entity.yRotO += f3 - f2; + entity.setYRot(entity.getYRot() + f3 - f2); + entity.setYBodyRot(this.getYRot()); + } + + @Override + public void onPassengerTurned(Entity entity) { + this.clampRotation(entity); + } + + @Override + public void positionRider(@NotNull Entity passenger, @NotNull MoveFunction callback) { + // From Immersive_Aircraft + if (!this.hasPassenger(passenger)) { + return; + } + + Matrix4f transform = getVehicleTransform(); + + float x = 0f; + float y = 0.95f; + float z = -0.2f; + y += (float) passenger.getMyRidingOffset(); + + int i = this.getPassengers().indexOf(passenger); + + if (i == 0) { + Vector4f worldPosition = transformPosition(transform, x, y, z); + passenger.setPos(worldPosition.x, worldPosition.y, worldPosition.z); + callback.accept(passenger, worldPosition.x, worldPosition.y, worldPosition.z); + } + + if (passenger != this.getFirstPassenger()) { + passenger.setXRot(passenger.getXRot() + (getXRot() - xRotO)); + } + + copyEntityData(passenger); + } + + public void copyEntityData(Entity entity) { + float f = Mth.wrapDegrees(entity.getYRot() - getYRot()); + float g = Mth.clamp(f, -105.0f, 105.0f); + entity.yRotO += g - f; + entity.setYRot(entity.getYRot() + g - f); + entity.setYHeadRot(entity.getYRot()); + entity.setYBodyRot(getYRot()); + } + + @Override + public void destroy() { + Entity attacker = EntityFindUtil.findEntity(this.level(), this.entityData.get(LAST_ATTACKER_UUID)); + + if (level() instanceof ServerLevel) { + CustomExplosion explosion = new CustomExplosion(this.level(), this, + ModDamageTypes.causeProjectileBoomDamage(this.level().registryAccess(), attacker, attacker), 10f, + this.getX(), this.getY(), this.getZ(), 2f, ExplosionDestroyConfig.EXPLOSION_DESTROY.get() ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP).setDamageMultiplier(1); + explosion.explode(); + net.minecraftforge.event.ForgeEventFactory.onExplosionStart(this.level(), explosion); + explosion.finalizeExplosion(false); + ParticleTool.spawnSmallExplosionParticles(this.level(), this.position()); + } + + this.discard(); + } + + @Override + public float ignoreExplosionHorizontalKnockBack() { + return -0.2f; + } + + @Override + public float ignoreExplosionVerticalKnockBack() { + return -0.3f; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public float getMaxHealth() { + return MAX_HEALTH; + } + + @Override + public int getMaxEnergy() { + return MAX_ENERGY; + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/VehicleEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/VehicleEntity.java index 744974eb1..9a930df61 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/VehicleEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/VehicleEntity.java @@ -236,7 +236,6 @@ public class VehicleEntity extends Entity { lastHurtTick ++; prevRoll = this.getRoll(); - setZRot(roll * 0.9f); float delta = Math.abs(getYRot() - yRotO); while (getYRot() > 180F) { diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModEntities.java b/src/main/java/com/atsuishio/superbwarfare/init/ModEntities.java index 3edffa1b6..1a0a03c07 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModEntities.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModEntities.java @@ -76,6 +76,8 @@ public class ModEntities { EntityType.Builder.of(FlareDecoyEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(1).setCustomClientFactory(FlareDecoyEntity::new).sized(0.5f, 0.5f)); public static final RegistryObject> LAV_150 = register("lav_150", EntityType.Builder.of(Lav150Entity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(3).setCustomClientFactory(Lav150Entity::new).fireImmune().sized(2.8f, 3.1f)); + public static final RegistryObject> TOM_6 = register("tom_6", + EntityType.Builder.of(Tom6Entity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(3).setCustomClientFactory(Tom6Entity::new).fireImmune().sized(1.15f, 1.0f)); private static RegistryObject> register(String name, EntityType.Builder entityTypeBuilder) { return REGISTRY.register(name, () -> entityTypeBuilder.build(name)); diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModEntityRenderers.java b/src/main/java/com/atsuishio/superbwarfare/init/ModEntityRenderers.java index b3ecaf6b8..61c90823d 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModEntityRenderers.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModEntityRenderers.java @@ -36,5 +36,6 @@ public class ModEntityRenderers { event.registerEntityRenderer(ModEntities.FLARE_DECOY.get(), FlareDecoyEntityRenderer::new); event.registerEntityRenderer(ModEntities.LAV_150.get(), Lav150Renderer::new); event.registerEntityRenderer(ModEntities.SMALL_CANNON_SHELL.get(), SmallCannonShellRenderer::new); + event.registerEntityRenderer(ModEntities.TOM_6.get(), Tom6Renderer::new); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java b/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java index 475541223..e44a23c9f 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java @@ -110,6 +110,7 @@ public class ModTabs { output.accept(ContainerBlockItem.createInstance(ModEntities.WHEEL_CHAIR.get())); output.accept(ContainerBlockItem.createInstance(ModEntities.AH_6.get())); output.accept(ContainerBlockItem.createInstance(ModEntities.LAV_150.get())); + output.accept(ContainerBlockItem.createInstance(ModEntities.TOM_6.get())); } else { output.accept(registryObject.get()); if (registryObject.get() == ModItems.ARMOR_PLATE.get()) { diff --git a/src/main/java/com/atsuishio/superbwarfare/mixins/CameraMixin.java b/src/main/java/com/atsuishio/superbwarfare/mixins/CameraMixin.java index 5d9f23f42..903f5399c 100644 --- a/src/main/java/com/atsuishio/superbwarfare/mixins/CameraMixin.java +++ b/src/main/java/com/atsuishio/superbwarfare/mixins/CameraMixin.java @@ -128,6 +128,11 @@ public abstract class CameraMixin { return; } + if (thirdPerson && entity.getVehicle() instanceof Tom6Entity) { + move(-getMaxZoom(4), 1, 0); + return; + } + if (thirdPerson && entity.getVehicle() instanceof Lav150Entity && !ClientEventHandler.zoomVehicle) { move(-getMaxZoom(2.75), 1, 0.0); return; diff --git a/src/main/java/com/atsuishio/superbwarfare/mixins/GameRendererMixin.java b/src/main/java/com/atsuishio/superbwarfare/mixins/GameRendererMixin.java index 8a049a3d8..2e482a975 100644 --- a/src/main/java/com/atsuishio/superbwarfare/mixins/GameRendererMixin.java +++ b/src/main/java/com/atsuishio/superbwarfare/mixins/GameRendererMixin.java @@ -1,6 +1,7 @@ package com.atsuishio.superbwarfare.mixins; import com.atsuishio.superbwarfare.entity.vehicle.Ah6Entity; +import com.atsuishio.superbwarfare.entity.vehicle.Tom6Entity; import com.atsuishio.superbwarfare.init.ModTags; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; @@ -69,5 +70,30 @@ public class GameRendererMixin { matrices.mulPose(Axis.YP.rotationDegrees(-mainCamera.getYRot() - 180.0f)); matrices.mulPose(Axis.XP.rotationDegrees(-mainCamera.getXRot())); } + + if (entity != null && !mainCamera.isDetached() && entity.getRootVehicle() instanceof Tom6Entity vehicle) { + // rotate camera + + matrices.mulPose(Axis.ZP.rotationDegrees(vehicle.getRoll(tickDelta))); +// matrices.mulPose(Axis.XP.rotationDegrees(vehicle.getViewXRot(tickDelta))); + + // fetch eye offset + float eye = entity.getEyeHeight(); + + // transform eye offset to match aircraft rotation + Vector3f offset = new Vector3f(0, -eye, 0); + Quaternionf quaternion = Axis.XP.rotationDegrees(0.0f); + quaternion.mul(Axis.YP.rotationDegrees(-vehicle.getViewYRot(tickDelta))); + quaternion.mul(Axis.XP.rotationDegrees(vehicle.getViewXRot(tickDelta))); + quaternion.mul(Axis.ZP.rotationDegrees(vehicle.getRoll(tickDelta))); + offset.rotate(quaternion); + + // apply camera offset + matrices.mulPose(Axis.XP.rotationDegrees(mainCamera.getXRot())); + matrices.mulPose(Axis.YP.rotationDegrees(mainCamera.getYRot() + 180.0f)); + matrices.translate(offset.x(), offset.y() + eye, offset.z()); + matrices.mulPose(Axis.YP.rotationDegrees(-mainCamera.getYRot() - 180.0f)); + matrices.mulPose(Axis.XP.rotationDegrees(-mainCamera.getXRot())); + } } } diff --git a/src/main/java/com/atsuishio/superbwarfare/mixins/LivingEntityRendererMixin.java b/src/main/java/com/atsuishio/superbwarfare/mixins/LivingEntityRendererMixin.java index 33331bcfd..59359db6e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/mixins/LivingEntityRendererMixin.java +++ b/src/main/java/com/atsuishio/superbwarfare/mixins/LivingEntityRendererMixin.java @@ -1,6 +1,7 @@ package com.atsuishio.superbwarfare.mixins; import com.atsuishio.superbwarfare.entity.vehicle.Ah6Entity; +import com.atsuishio.superbwarfare.entity.vehicle.Tom6Entity; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; import net.minecraft.client.renderer.entity.LivingEntityRenderer; @@ -19,5 +20,9 @@ public class LivingEntityRendererMixin { matrices.mulPose(Axis.XP.rotationDegrees(-ah6Entity.getViewXRot(tickDelta))); matrices.mulPose(Axis.ZP.rotationDegrees(-ah6Entity.getRoll(tickDelta))); } + if (entity.getRootVehicle() != entity && entity.getRootVehicle() instanceof Tom6Entity tom6Entity) { + matrices.mulPose(Axis.XP.rotationDegrees(-tom6Entity.getViewXRot(tickDelta))); + matrices.mulPose(Axis.ZP.rotationDegrees(-tom6Entity.getRoll(tickDelta))); + } } } diff --git a/src/main/resources/assets/superbwarfare/geo/tom_6.geo.json b/src/main/resources/assets/superbwarfare/geo/tom_6.geo.json new file mode 100644 index 000000000..75a138c3e --- /dev/null +++ b/src/main/resources/assets/superbwarfare/geo/tom_6.geo.json @@ -0,0 +1,1011 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.unknown", + "texture_width": 128, + "texture_height": 128, + "visible_bounds_width": 4, + "visible_bounds_height": 3.5, + "visible_bounds_offset": [0, 1.25, 0] + }, + "bones": [ + { + "name": "bone", + "pivot": [0, 0, 0], + "cubes": [ + { + "origin": [-8.5, 1.7, -12.75], + "size": [17, 0.85, 25.5], + "uv": { + "north": {"uv": [68, 58], "uv_size": [20, 1]}, + "east": {"uv": [60, 63], "uv_size": [30, 1]}, + "south": {"uv": [68, 59], "uv_size": [20, 1]}, + "west": {"uv": [64, 0], "uv_size": [30, 1]}, + "up": {"uv": [0, 0], "uv_size": [20, 30]}, + "down": {"uv": [20, 30], "uv_size": [20, -30]} + } + }, + { + "origin": [-8.5, 17, -12.75], + "size": [17, 0.85, 25.5], + "uv": { + "north": {"uv": [68, 60], "uv_size": [20, 1]}, + "east": {"uv": [64, 1], "uv_size": [30, 1]}, + "south": {"uv": [68, 61], "uv_size": [20, 1]}, + "west": {"uv": [64, 2], "uv_size": [30, 1]}, + "up": {"uv": [0, 30], "uv_size": [20, 30]}, + "down": {"uv": [20, 60], "uv_size": [20, -30]} + } + }, + { + "origin": [-8.075, 17.3625, -13.6], + "size": [0.8875, 1.275, 0.85], + "uv": { + "north": {"uv": [42, 72], "uv_size": [1, 2]}, + "east": {"uv": [43, 72], "uv_size": [1, 2]}, + "south": {"uv": [44, 72], "uv_size": [1, 2]}, + "west": {"uv": [45, 72], "uv_size": [1, 2]}, + "up": {"uv": [72, 57], "uv_size": [1, 1]}, + "down": {"uv": [58, 73], "uv_size": [1, -1]} + } + }, + { + "origin": [-8.075, 17.51727, -14.3781], + "size": [0.8875, 1.19, 1.0625], + "pivot": [-7.75625, 18.15477, -13.84685], + "rotation": [-22.5, 0, 0], + "uv": { + "north": {"uv": [59, 72], "uv_size": [1, 1]}, + "east": {"uv": [72, 65], "uv_size": [1, 1]}, + "south": {"uv": [72, 66], "uv_size": [1, 1]}, + "west": {"uv": [72, 67], "uv_size": [1, 1]}, + "up": {"uv": [72, 68], "uv_size": [1, 1]}, + "down": {"uv": [72, 70], "uv_size": [1, -1]} + } + }, + { + "origin": [-8.075, 17.86637, -20.9772], + "size": [0.8875, 0.85, 7.3125], + "pivot": [-7.75625, 18.50387, -14.19595], + "rotation": [-67.5, 0, 0], + "uv": { + "north": {"uv": [72, 71], "uv_size": [1, 1]}, + "east": {"uv": [45, 71], "uv_size": [3, 1]}, + "south": {"uv": [72, 72], "uv_size": [1, 1]}, + "west": {"uv": [71, 45], "uv_size": [3, 1]}, + "up": {"uv": [66, 22], "uv_size": [1, 3]}, + "down": {"uv": [67, 34], "uv_size": [1, -3]} + } + }, + { + "origin": [7.1875, 17.86637, -20.9772], + "size": [0.8875, 0.85, 7.3125], + "pivot": [7.75625, 18.50387, -14.19595], + "rotation": [-67.5, 0, 0], + "uv": { + "north": {"uv": [73, 30], "uv_size": [1, 1]}, + "east": {"uv": [71, 46], "uv_size": [3, 1]}, + "south": {"uv": [73, 34], "uv_size": [1, 1]}, + "west": {"uv": [71, 47], "uv_size": [3, 1]}, + "up": {"uv": [48, 71], "uv_size": [1, 3]}, + "down": {"uv": [71, 51], "uv_size": [1, -3]} + } + }, + { + "origin": [-7.1875, 23.92955, -17.11473], + "size": [14.375, 0.595, 0.595], + "pivot": [3.825, 24.22705, -16.81723], + "rotation": [-45, 0, 0], + "uv": { + "north": {"uv": [69, 19], "uv_size": [18, 1]}, + "east": {"uv": [73, 35], "uv_size": [1, 1]}, + "south": {"uv": [69, 20], "uv_size": [18, 1]}, + "west": {"uv": [73, 36], "uv_size": [1, 1]}, + "up": {"uv": [69, 21], "uv_size": [18, 1]}, + "down": {"uv": [69, 65], "uv_size": [18, -1]} + } + }, + { + "origin": [7.1875, 17.3625, -13.6], + "size": [0.8875, 1.275, 0.85], + "uv": { + "north": {"uv": [46, 72], "uv_size": [1, 2]}, + "east": {"uv": [47, 72], "uv_size": [1, 2]}, + "south": {"uv": [72, 48], "uv_size": [1, 2]}, + "west": {"uv": [49, 72], "uv_size": [1, 2]}, + "up": {"uv": [73, 28], "uv_size": [1, 1]}, + "down": {"uv": [73, 30], "uv_size": [1, -1]} + } + }, + { + "origin": [7.1875, 17.51727, -14.3781], + "size": [0.8875, 1.19, 1.0625], + "pivot": [7.75625, 18.15477, -13.84685], + "rotation": [-22.5, 0, 0], + "uv": { + "north": {"uv": [17, 73], "uv_size": [1, 1]}, + "east": {"uv": [18, 73], "uv_size": [1, 1]}, + "south": {"uv": [19, 73], "uv_size": [1, 1]}, + "west": {"uv": [20, 73], "uv_size": [1, 1]}, + "up": {"uv": [21, 73], "uv_size": [1, 1]}, + "down": {"uv": [22, 74], "uv_size": [1, -1]} + } + }, + { + "origin": [-8.5, 17.85, -12.75], + "size": [17, 0.85, 0.2125], + "uv": { + "north": {"uv": [68, 62], "uv_size": [20, 1]}, + "east": {"uv": [72, 52], "uv_size": [1, 1]}, + "south": {"uv": [3, 69], "uv_size": [20, 1]}, + "west": {"uv": [72, 53], "uv_size": [1, 1]}, + "up": {"uv": [69, 13], "uv_size": [20, 1]}, + "down": {"uv": [69, 15], "uv_size": [20, -1]} + } + }, + { + "origin": [-8.18125, 17.85, -4.14375], + "size": [25.075, 0.85, 0.2125], + "pivot": [8.39375, 18.275, -4.0375], + "rotation": [0, 90, 0], + "uv": { + "north": {"uv": [64, 3], "uv_size": [30, 1]}, + "east": {"uv": [72, 55], "uv_size": [1, 1]}, + "south": {"uv": [64, 4], "uv_size": [30, 1]}, + "west": {"uv": [56, 72], "uv_size": [1, 1]}, + "up": {"uv": [64, 5], "uv_size": [30, 1]}, + "down": {"uv": [64, 7], "uv_size": [30, -1]} + } + }, + { + "origin": [-16.89375, 17.85, -4.14375], + "size": [25.075, 0.85, 0.2125], + "pivot": [-8.39375, 18.275, -4.0375], + "rotation": [0, -90, 0], + "uv": { + "north": {"uv": [64, 7], "uv_size": [30, 1]}, + "east": {"uv": [72, 56], "uv_size": [1, 1]}, + "south": {"uv": [64, 8], "uv_size": [30, 1]}, + "west": {"uv": [57, 72], "uv_size": [1, 1]}, + "up": {"uv": [64, 9], "uv_size": [30, 1]}, + "down": {"uv": [64, 11], "uv_size": [30, -1]} + } + }, + { + "origin": [-8.5, 17.85, 12.5375], + "size": [17, 0.85, 0.2125], + "uv": { + "north": {"uv": [69, 15], "uv_size": [20, 1]}, + "east": {"uv": [72, 54], "uv_size": [1, 1]}, + "south": {"uv": [69, 16], "uv_size": [20, 1]}, + "west": {"uv": [55, 72], "uv_size": [1, 1]}, + "up": {"uv": [69, 17], "uv_size": [20, 1]}, + "down": {"uv": [69, 19], "uv_size": [20, -1]} + } + } + ] + }, + { + "name": "wing", + "parent": "bone", + "pivot": [8.87149, 17.6375, 0.00014], + "rotation": [0, 0, -15], + "cubes": [ + { + "origin": [8.5, 17.2125, -12.75], + "size": [3.6125, 0.85, 25.5], + "uv": { + "north": {"uv": [71, 40], "uv_size": [4, 1]}, + "east": {"uv": [64, 11], "uv_size": [30, 1]}, + "south": {"uv": [41, 71], "uv_size": [4, 1]}, + "up": {"uv": [40, 32], "uv_size": [4, 30]}, + "down": {"uv": [44, 62], "uv_size": [4, -30]} + } + }, + { + "origin": [7.12814, 17.2125, -13.19195], + "size": [2.7625, 0.85, 7.65], + "pivot": [8.50939, 17.6375, -0.44195], + "rotation": [0, -22.5, 0], + "uv": { + "north": {"uv": [71, 43], "uv_size": [3, 1]}, + "up": {"uv": [64, 27], "uv_size": [3, 9]}, + "down": {"uv": [66, 22], "uv_size": [3, -9]} + } + }, + { + "origin": [11.55548, 17.2125, -11.83646], + "size": [4.0375, 0.85, 7.65], + "pivot": [12.93673, 17.6375, -8.01146], + "rotation": [0, -45, 0], + "uv": { + "north": {"uv": [69, 70], "uv_size": [5, 1]}, + "up": {"uv": [35, 60], "uv_size": [5, 9]}, + "down": {"uv": [40, 71], "uv_size": [5, -9]} + } + }, + { + "origin": [13.13315, 17.2125, -9.92302], + "size": [5.7375, 0.85, 7.65], + "pivot": [14.5144, 17.6375, -6.09802], + "rotation": [0, -67.5, 0], + "uv": { + "north": {"uv": [70, 24], "uv_size": [7, 1]}, + "up": {"uv": [56, 36], "uv_size": [7, 9]}, + "down": {"uv": [56, 54], "uv_size": [7, -9]} + } + }, + { + "origin": [13.13315, 17.2125, 2.27302], + "size": [5.7375, 0.85, 7.65], + "pivot": [14.5144, 17.6375, 6.09802], + "rotation": [0, 67.5, 0], + "uv": { + "south": {"uv": [70, 25], "uv_size": [7, 1]}, + "up": {"uv": [56, 54], "uv_size": [7, 9]}, + "down": {"uv": [0, 69], "uv_size": [7, -9]} + } + }, + { + "origin": [11.55548, 17.2125, 4.18646], + "size": [4.0375, 0.85, 7.65], + "pivot": [12.93673, 17.6375, 8.01146], + "rotation": [0, 45, 0], + "uv": { + "south": {"uv": [71, 31], "uv_size": [5, 1]}, + "up": {"uv": [45, 62], "uv_size": [5, 9]}, + "down": {"uv": [50, 71], "uv_size": [5, -9]} + } + }, + { + "origin": [7.12814, 17.2125, 5.54195], + "size": [2.7625, 0.85, 7.65], + "pivot": [8.50939, 17.6375, 0.44195], + "rotation": [0, 22.5, 0], + "uv": { + "south": {"uv": [71, 44], "uv_size": [3, 1]}, + "up": {"uv": [66, 64], "uv_size": [3, 9]}, + "down": {"uv": [67, 31], "uv_size": [3, -9]} + } + }, + { + "origin": [14.50906, 17.2125, -1.62237], + "size": [7.072, 0.85, 7.60325], + "pivot": [15.89031, 17.6375, 2.15588], + "rotation": [0, 90, 0], + "uv": { + "south": {"uv": [70, 22], "uv_size": [8, 1]}, + "up": {"uv": [56, 0], "uv_size": [8, 9]}, + "down": {"uv": [56, 18], "uv_size": [8, -9]} + } + } + ] + }, + { + "name": "wing2", + "parent": "bone", + "pivot": [-8.87149, 17.6375, 0.00014], + "rotation": [0, 0, 15], + "cubes": [ + { + "origin": [-12.1125, 17.2125, -12.75], + "size": [3.6125, 0.85, 25.5], + "uv": { + "north": {"uv": [71, 41], "uv_size": [4, 1]}, + "south": {"uv": [71, 42], "uv_size": [4, 1]}, + "west": {"uv": [64, 12], "uv_size": [30, 1]}, + "up": {"uv": [48, 32], "uv_size": [4, 30]}, + "down": {"uv": [52, 62], "uv_size": [4, -30]} + } + }, + { + "origin": [-9.89064, 17.2125, -13.19195], + "size": [2.7625, 0.85, 7.65], + "pivot": [-8.50939, 17.6375, -0.44195], + "rotation": [0, 22.5, 0], + "uv": { + "north": {"uv": [49, 71], "uv_size": [3, 1]}, + "up": {"uv": [68, 31], "uv_size": [3, 9]}, + "down": {"uv": [68, 49], "uv_size": [3, -9]} + } + }, + { + "origin": [-15.59298, 17.2125, -11.83646], + "size": [4.0375, 0.85, 7.65], + "pivot": [-12.93673, 17.6375, -8.01146], + "rotation": [0, 45, 0], + "uv": { + "north": {"uv": [71, 32], "uv_size": [5, 1]}, + "up": {"uv": [63, 36], "uv_size": [5, 9]}, + "down": {"uv": [63, 54], "uv_size": [5, -9]} + } + }, + { + "origin": [-18.87065, 17.2125, -9.92302], + "size": [5.7375, 0.85, 7.65], + "pivot": [-14.5144, 17.6375, -6.09802], + "rotation": [0, 67.5, 0], + "uv": { + "north": {"uv": [70, 26], "uv_size": [7, 1]}, + "up": {"uv": [7, 60], "uv_size": [7, 9]}, + "down": {"uv": [14, 69], "uv_size": [7, -9]} + } + }, + { + "origin": [-18.87065, 17.2125, 2.27302], + "size": [5.7375, 0.85, 7.65], + "pivot": [-14.5144, 17.6375, 6.09802], + "rotation": [0, -67.5, 0], + "uv": { + "south": {"uv": [70, 27], "uv_size": [7, 1]}, + "up": {"uv": [21, 60], "uv_size": [7, 9]}, + "down": {"uv": [28, 69], "uv_size": [7, -9]} + } + }, + { + "origin": [-15.59298, 17.2125, 4.18646], + "size": [4.0375, 0.85, 7.65], + "pivot": [-12.93673, 17.6375, 8.01146], + "rotation": [0, -45, 0], + "uv": { + "south": {"uv": [71, 33], "uv_size": [5, 1]}, + "up": {"uv": [63, 54], "uv_size": [5, 9]}, + "down": {"uv": [55, 72], "uv_size": [5, -9]} + } + }, + { + "origin": [-9.89064, 17.2125, 5.54195], + "size": [2.7625, 0.85, 7.65], + "pivot": [-8.50939, 17.6375, 0.44195], + "rotation": [0, -22.5, 0], + "uv": { + "south": {"uv": [71, 51], "uv_size": [3, 1]}, + "up": {"uv": [68, 49], "uv_size": [3, 9]}, + "down": {"uv": [0, 78], "uv_size": [3, -9]} + } + }, + { + "origin": [-21.58106, 17.2125, -1.62237], + "size": [7.072, 0.85, 7.60325], + "pivot": [-15.89031, 17.6375, 2.15588], + "rotation": [0, -90, 0], + "uv": { + "south": {"uv": [70, 23], "uv_size": [8, 1]}, + "up": {"uv": [56, 18], "uv_size": [8, 9]}, + "down": {"uv": [56, 36], "uv_size": [8, -9]} + } + } + ] + }, + { + "name": "melon", + "parent": "bone", + "pivot": [0, 0, 0], + "cubes": [ + { + "origin": [-6.8, 2.55, -6.8], + "size": [13.6, 13.6, 13.6], + "uv": { + "north": {"uv": [40, 0], "uv_size": [16, 16]}, + "east": {"uv": [40, 0], "uv_size": [16, 16]}, + "south": {"uv": [40, 0], "uv_size": [16, 16]}, + "west": {"uv": [40, 0], "uv_size": [16, 16]}, + "up": {"uv": [40, 16], "uv_size": [16, 16]} + } + } + ] + }, + { + "name": "zhu", + "parent": "bone", + "pivot": [-7.4375, 14.875, -11.6875], + "cubes": [ + { + "origin": [-8.075, 14.45, -12.325], + "size": [1.275, 2.55, 1.275], + "pivot": [-7.4375, 20.4, -11.6875], + "rotation": [0, -45, 0], + "uv": { + "north": {"uv": [17, 70], "uv_size": [2, 3]}, + "east": {"uv": [19, 70], "uv_size": [2, 3]}, + "south": {"uv": [21, 70], "uv_size": [2, 3]}, + "west": {"uv": [70, 28], "uv_size": [2, 3]}, + "up": {"uv": [71, 38], "uv_size": [2, 2]}, + "down": {"uv": [39, 73], "uv_size": [2, -2]} + } + }, + { + "origin": [-8.075, 2.55, -12.325], + "size": [1.275, 11.05, 1.275], + "pivot": [-7.4375, 8.5, -11.6875], + "rotation": [0, -45, 0], + "uv": { + "north": {"uv": [64, 13], "uv_size": [2, 14]}, + "east": {"uv": [60, 64], "uv_size": [2, 14]}, + "south": {"uv": [62, 64], "uv_size": [2, 14]}, + "west": {"uv": [64, 64], "uv_size": [2, 14]}, + "up": {"uv": [71, 34], "uv_size": [2, 2]}, + "down": {"uv": [71, 38], "uv_size": [2, -2]} + } + }, + { + "origin": [-7.7775, 13.6, -12.0275], + "size": [0.68, 0.85, 0.68], + "pivot": [-7.4375, 14.025, -11.6875], + "rotation": [0, -45, 0], + "uv": { + "north": {"uv": [55, 62], "uv_size": [1, 1]}, + "east": {"uv": [71, 69], "uv_size": [1, 1]}, + "south": {"uv": [72, 30], "uv_size": [1, 1]}, + "west": {"uv": [50, 72], "uv_size": [1, 1]}, + "up": {"uv": [72, 50], "uv_size": [1, 1]}, + "down": {"uv": [51, 73], "uv_size": [1, -1]} + } + } + ] + }, + { + "name": "zhu2", + "parent": "bone", + "pivot": [7.4375, 14.875, -11.6875], + "cubes": [ + { + "origin": [6.8, 14.45, -12.325], + "size": [1.275, 2.55, 1.275], + "pivot": [7.4375, 20.4, -11.6875], + "rotation": [0, 45, 0], + "uv": { + "north": {"uv": [19, 70], "uv_size": [-2, 3]}, + "east": {"uv": [72, 28], "uv_size": [-2, 3]}, + "south": {"uv": [23, 70], "uv_size": [-2, 3]}, + "west": {"uv": [21, 70], "uv_size": [-2, 3]}, + "up": {"uv": [73, 38], "uv_size": [-2, 2]}, + "down": {"uv": [41, 73], "uv_size": [-2, -2]} + } + }, + { + "origin": [6.8, 2.55, -12.325], + "size": [1.275, 11.05, 1.275], + "pivot": [7.4375, 8.5, -11.6875], + "rotation": [0, 45, 0], + "uv": { + "north": {"uv": [66, 13], "uv_size": [-2, 14]}, + "east": {"uv": [66, 64], "uv_size": [-2, 14]}, + "south": {"uv": [64, 64], "uv_size": [-2, 14]}, + "west": {"uv": [62, 64], "uv_size": [-2, 14]}, + "up": {"uv": [73, 34], "uv_size": [-2, 2]}, + "down": {"uv": [73, 38], "uv_size": [-2, -2]} + } + }, + { + "origin": [7.0975, 13.6, -12.0275], + "size": [0.68, 0.85, 0.68], + "pivot": [7.4375, 14.025, -11.6875], + "rotation": [0, 45, 0], + "uv": { + "north": {"uv": [56, 62], "uv_size": [-1, 1]}, + "east": {"uv": [51, 72], "uv_size": [-1, 1]}, + "south": {"uv": [73, 30], "uv_size": [-1, 1]}, + "west": {"uv": [72, 69], "uv_size": [-1, 1]}, + "up": {"uv": [73, 50], "uv_size": [-1, 1]}, + "down": {"uv": [52, 73], "uv_size": [-1, -1]} + } + } + ] + }, + { + "name": "zhu3", + "parent": "bone", + "pivot": [7.4375, 14.875, 11.6875], + "cubes": [ + { + "origin": [6.8, 14.45, 11.05], + "size": [1.275, 2.55, 1.275], + "pivot": [7.4375, 20.4, 11.6875], + "rotation": [0, -45, 0], + "uv": { + "north": {"uv": [21, 70], "uv_size": [2, 3]}, + "east": {"uv": [70, 28], "uv_size": [2, 3]}, + "south": {"uv": [17, 70], "uv_size": [2, 3]}, + "west": {"uv": [19, 70], "uv_size": [2, 3]}, + "up": {"uv": [73, 40], "uv_size": [-2, -2]}, + "down": {"uv": [41, 71], "uv_size": [-2, 2]} + } + }, + { + "origin": [6.8, 2.55, 11.05], + "size": [1.275, 11.05, 1.275], + "pivot": [7.4375, 8.5, 11.6875], + "rotation": [0, -45, 0], + "uv": { + "north": {"uv": [62, 64], "uv_size": [2, 14]}, + "east": {"uv": [64, 64], "uv_size": [2, 14]}, + "south": {"uv": [64, 13], "uv_size": [2, 14]}, + "west": {"uv": [60, 64], "uv_size": [2, 14]}, + "up": {"uv": [73, 36], "uv_size": [-2, -2]}, + "down": {"uv": [73, 36], "uv_size": [-2, 2]} + } + }, + { + "origin": [7.0975, 13.6, 11.3475], + "size": [0.68, 0.85, 0.68], + "pivot": [7.4375, 14.025, 11.6875], + "rotation": [0, -45, 0], + "uv": { + "north": {"uv": [72, 30], "uv_size": [1, 1]}, + "east": {"uv": [50, 72], "uv_size": [1, 1]}, + "south": {"uv": [55, 62], "uv_size": [1, 1]}, + "west": {"uv": [71, 69], "uv_size": [1, 1]}, + "up": {"uv": [73, 51], "uv_size": [-1, -1]}, + "down": {"uv": [52, 72], "uv_size": [-1, 1]} + } + } + ] + }, + { + "name": "zhu4", + "parent": "bone", + "pivot": [-7.4375, 14.875, 11.6875], + "cubes": [ + { + "origin": [-8.075, 14.45, 11.05], + "size": [1.275, 2.55, 1.275], + "pivot": [-7.4375, 20.4, 11.6875], + "rotation": [0, 45, 0], + "uv": { + "north": {"uv": [23, 70], "uv_size": [-2, 3]}, + "east": {"uv": [21, 70], "uv_size": [-2, 3]}, + "south": {"uv": [19, 70], "uv_size": [-2, 3]}, + "west": {"uv": [72, 28], "uv_size": [-2, 3]}, + "up": {"uv": [71, 40], "uv_size": [2, -2]}, + "down": {"uv": [39, 71], "uv_size": [2, 2]} + } + }, + { + "origin": [-8.075, 2.55, 11.05], + "size": [1.275, 11.05, 1.275], + "pivot": [-7.4375, 8.5, 11.6875], + "rotation": [0, 45, 0], + "uv": { + "north": {"uv": [64, 64], "uv_size": [-2, 14]}, + "east": {"uv": [62, 64], "uv_size": [-2, 14]}, + "south": {"uv": [66, 13], "uv_size": [-2, 14]}, + "west": {"uv": [66, 64], "uv_size": [-2, 14]}, + "up": {"uv": [71, 36], "uv_size": [2, -2]}, + "down": {"uv": [71, 36], "uv_size": [2, 2]} + } + }, + { + "origin": [-7.7775, 13.6, 11.3475], + "size": [0.68, 0.85, 0.68], + "pivot": [-7.4375, 14.025, 11.6875], + "rotation": [0, 45, 0], + "uv": { + "north": {"uv": [73, 30], "uv_size": [-1, 1]}, + "east": {"uv": [72, 69], "uv_size": [-1, 1]}, + "south": {"uv": [56, 62], "uv_size": [-1, 1]}, + "west": {"uv": [51, 72], "uv_size": [-1, 1]}, + "up": {"uv": [72, 51], "uv_size": [1, -1]}, + "down": {"uv": [51, 72], "uv_size": [1, 1]} + } + } + ] + }, + { + "name": "wheel1", + "parent": "bone", + "pivot": [8.97813, 2.125, -10.2], + "cubes": [ + { + "origin": [8.5425, 0, -11.07975], + "size": [0.85, 4.25, 1.7595], + "pivot": [8.9675, 2.125, -10.2], + "rotation": [22.5, 0, 0], + "uv": { + "east": {"uv": [23, 69], "uv_size": [2, 5]}, + "west": {"uv": [25, 69], "uv_size": [2, 5]}, + "up": {"uv": [66, 25], "uv_size": [1, 2]}, + "down": {"uv": [67, 36], "uv_size": [1, -2]} + } + }, + { + "origin": [8.5425, 0, -11.07975], + "size": [0.85, 4.25, 1.7595], + "pivot": [8.9675, 2.125, -10.2], + "rotation": [67.5, 0, 0], + "uv": { + "east": {"uv": [27, 69], "uv_size": [2, 5]}, + "west": {"uv": [29, 69], "uv_size": [2, 5]}, + "up": {"uv": [39, 69], "uv_size": [1, 2]}, + "down": {"uv": [52, 73], "uv_size": [1, -2]} + } + }, + { + "origin": [8.5425, 0, -11.07975], + "size": [0.85, 4.25, 1.7595], + "pivot": [8.9675, 2.125, -10.2], + "rotation": [112.5, 0, 0], + "uv": { + "east": {"uv": [31, 69], "uv_size": [2, 5]}, + "west": {"uv": [33, 69], "uv_size": [2, 5]}, + "up": {"uv": [71, 52], "uv_size": [1, 2]}, + "down": {"uv": [53, 73], "uv_size": [1, -2]} + } + }, + { + "origin": [8.5425, 0, -11.07975], + "size": [0.85, 4.25, 1.7595], + "pivot": [8.9675, 2.125, -10.2], + "rotation": [157.5, 0, 0], + "uv": { + "east": {"uv": [35, 69], "uv_size": [2, 5]}, + "west": {"uv": [37, 69], "uv_size": [2, 5]}, + "up": {"uv": [54, 71], "uv_size": [1, 2]}, + "down": {"uv": [71, 56], "uv_size": [1, -2]} + } + }, + { + "origin": [8.5, 0.2125, -10.99177], + "size": [0.9775, 3.825, 1.58355], + "pivot": [8.9675, 2.125, -10.2], + "rotation": [22.5, 0, 0], + "uv": { + "east": {"uv": [13, 70], "uv_size": [2, 5]}, + "west": {"uv": [15, 70], "uv_size": [2, 5]}, + "up": {"uv": [72, 28], "uv_size": [1, 2]}, + "down": {"uv": [41, 74], "uv_size": [1, -2]} + } + }, + { + "origin": [8.5, 0.2125, -10.99177], + "size": [0.9775, 3.825, 1.58355], + "pivot": [8.9675, 2.125, -10.2], + "rotation": [67.5, 0, 0], + "uv": { + "east": {"uv": [9, 70], "uv_size": [2, 5]}, + "west": {"uv": [11, 70], "uv_size": [2, 5]}, + "up": {"uv": [70, 71], "uv_size": [1, 2]}, + "down": {"uv": [71, 73], "uv_size": [1, -2]} + } + }, + { + "origin": [8.5, 0.2125, -10.99177], + "size": [0.9775, 3.825, 1.58355], + "pivot": [8.9675, 2.125, -10.2], + "rotation": [112.5, 0, 0], + "uv": { + "east": {"uv": [5, 70], "uv_size": [2, 5]}, + "west": {"uv": [7, 70], "uv_size": [2, 5]}, + "up": {"uv": [71, 67], "uv_size": [1, 2]}, + "down": {"uv": [69, 73], "uv_size": [1, -2]} + } + }, + { + "origin": [8.5, 0.2125, -10.99177], + "size": [0.9775, 3.825, 1.58355], + "pivot": [8.9675, 2.125, -10.2], + "rotation": [157.5, 0, 0], + "uv": { + "east": {"uv": [69, 65], "uv_size": [2, 5]}, + "west": {"uv": [3, 70], "uv_size": [2, 5]}, + "up": {"uv": [71, 56], "uv_size": [1, 2]}, + "down": {"uv": [71, 67], "uv_size": [1, -2]} + } + } + ] + }, + { + "name": "wheel2", + "parent": "bone", + "pivot": [-8.97813, 2.125, -10.2], + "cubes": [ + { + "origin": [-9.3925, 0, -11.07975], + "size": [0.85, 4.25, 1.7595], + "pivot": [-8.9675, 2.125, -10.2], + "rotation": [22.5, 0, 0], + "uv": { + "east": {"uv": [27, 69], "uv_size": [-2, 5]}, + "west": {"uv": [25, 69], "uv_size": [-2, 5]}, + "up": {"uv": [67, 25], "uv_size": [-1, 2]}, + "down": {"uv": [68, 36], "uv_size": [-1, -2]} + } + }, + { + "origin": [-9.3925, 0, -11.07975], + "size": [0.85, 4.25, 1.7595], + "pivot": [-8.9675, 2.125, -10.2], + "rotation": [67.5, 0, 0], + "uv": { + "east": {"uv": [31, 69], "uv_size": [-2, 5]}, + "west": {"uv": [29, 69], "uv_size": [-2, 5]}, + "up": {"uv": [40, 69], "uv_size": [-1, 2]}, + "down": {"uv": [53, 73], "uv_size": [-1, -2]} + } + }, + { + "origin": [-9.3925, 0, -11.07975], + "size": [0.85, 4.25, 1.7595], + "pivot": [-8.9675, 2.125, -10.2], + "rotation": [112.5, 0, 0], + "uv": { + "east": {"uv": [35, 69], "uv_size": [-2, 5]}, + "west": {"uv": [33, 69], "uv_size": [-2, 5]}, + "up": {"uv": [72, 52], "uv_size": [-1, 2]}, + "down": {"uv": [54, 73], "uv_size": [-1, -2]} + } + }, + { + "origin": [-9.3925, 0, -11.07975], + "size": [0.85, 4.25, 1.7595], + "pivot": [-8.9675, 2.125, -10.2], + "rotation": [157.5, 0, 0], + "uv": { + "east": {"uv": [39, 69], "uv_size": [-2, 5]}, + "west": {"uv": [37, 69], "uv_size": [-2, 5]}, + "up": {"uv": [55, 71], "uv_size": [-1, 2]}, + "down": {"uv": [72, 56], "uv_size": [-1, -2]} + } + }, + { + "origin": [-9.4775, 0.2125, -10.99177], + "size": [0.9775, 3.825, 1.58355], + "pivot": [-8.9675, 2.125, -10.2], + "rotation": [22.5, 0, 0], + "uv": { + "east": {"uv": [17, 70], "uv_size": [-2, 5]}, + "west": {"uv": [15, 70], "uv_size": [-2, 5]}, + "up": {"uv": [73, 28], "uv_size": [-1, 2]}, + "down": {"uv": [42, 74], "uv_size": [-1, -2]} + } + }, + { + "origin": [-9.4775, 0.2125, -10.99177], + "size": [0.9775, 3.825, 1.58355], + "pivot": [-8.9675, 2.125, -10.2], + "rotation": [67.5, 0, 0], + "uv": { + "east": {"uv": [13, 70], "uv_size": [-2, 5]}, + "west": {"uv": [11, 70], "uv_size": [-2, 5]}, + "up": {"uv": [71, 71], "uv_size": [-1, 2]}, + "down": {"uv": [72, 73], "uv_size": [-1, -2]} + } + }, + { + "origin": [-9.4775, 0.2125, -10.99177], + "size": [0.9775, 3.825, 1.58355], + "pivot": [-8.9675, 2.125, -10.2], + "rotation": [112.5, 0, 0], + "uv": { + "east": {"uv": [9, 70], "uv_size": [-2, 5]}, + "west": {"uv": [7, 70], "uv_size": [-2, 5]}, + "up": {"uv": [72, 67], "uv_size": [-1, 2]}, + "down": {"uv": [70, 73], "uv_size": [-1, -2]} + } + }, + { + "origin": [-9.4775, 0.2125, -10.99177], + "size": [0.9775, 3.825, 1.58355], + "pivot": [-8.9675, 2.125, -10.2], + "rotation": [157.5, 0, 0], + "uv": { + "east": {"uv": [5, 70], "uv_size": [-2, 5]}, + "west": {"uv": [71, 65], "uv_size": [-2, 5]}, + "up": {"uv": [72, 56], "uv_size": [-1, 2]}, + "down": {"uv": [72, 67], "uv_size": [-1, -2]} + } + } + ] + }, + { + "name": "wheel3", + "parent": "bone", + "pivot": [-8.97813, 2.125, 10.2], + "cubes": [ + { + "origin": [-9.3925, 0, 9.32025], + "size": [0.85, 4.25, 1.7595], + "pivot": [-8.9675, 2.125, 10.2], + "rotation": [-22.5, 0, 0], + "uv": { + "east": {"uv": [25, 69], "uv_size": [2, 5]}, + "west": {"uv": [23, 69], "uv_size": [2, 5]}, + "up": {"uv": [67, 27], "uv_size": [-1, -2]}, + "down": {"uv": [68, 34], "uv_size": [-1, 2]} + } + }, + { + "origin": [-9.3925, 0, 9.32025], + "size": [0.85, 4.25, 1.7595], + "pivot": [-8.9675, 2.125, 10.2], + "rotation": [-67.5, 0, 0], + "uv": { + "east": {"uv": [29, 69], "uv_size": [2, 5]}, + "west": {"uv": [27, 69], "uv_size": [2, 5]}, + "up": {"uv": [40, 71], "uv_size": [-1, -2]}, + "down": {"uv": [53, 71], "uv_size": [-1, 2]} + } + }, + { + "origin": [-9.3925, 0, 9.32025], + "size": [0.85, 4.25, 1.7595], + "pivot": [-8.9675, 2.125, 10.2], + "rotation": [-112.5, 0, 0], + "uv": { + "east": {"uv": [33, 69], "uv_size": [2, 5]}, + "west": {"uv": [31, 69], "uv_size": [2, 5]}, + "up": {"uv": [72, 54], "uv_size": [-1, -2]}, + "down": {"uv": [54, 71], "uv_size": [-1, 2]} + } + }, + { + "origin": [-9.3925, 0, 9.32025], + "size": [0.85, 4.25, 1.7595], + "pivot": [-8.9675, 2.125, 10.2], + "rotation": [-157.5, 0, 0], + "uv": { + "east": {"uv": [37, 69], "uv_size": [2, 5]}, + "west": {"uv": [35, 69], "uv_size": [2, 5]}, + "up": {"uv": [55, 73], "uv_size": [-1, -2]}, + "down": {"uv": [72, 54], "uv_size": [-1, 2]} + } + }, + { + "origin": [-9.4775, 0.2125, 9.40823], + "size": [0.9775, 3.825, 1.58355], + "pivot": [-8.9675, 2.125, 10.2], + "rotation": [-22.5, 0, 0], + "uv": { + "east": {"uv": [15, 70], "uv_size": [2, 5]}, + "west": {"uv": [13, 70], "uv_size": [2, 5]}, + "up": {"uv": [73, 30], "uv_size": [-1, -2]}, + "down": {"uv": [42, 72], "uv_size": [-1, 2]} + } + }, + { + "origin": [-9.4775, 0.2125, 9.40823], + "size": [0.9775, 3.825, 1.58355], + "pivot": [-8.9675, 2.125, 10.2], + "rotation": [-67.5, 0, 0], + "uv": { + "east": {"uv": [11, 70], "uv_size": [2, 5]}, + "west": {"uv": [9, 70], "uv_size": [2, 5]}, + "up": {"uv": [71, 73], "uv_size": [-1, -2]}, + "down": {"uv": [72, 71], "uv_size": [-1, 2]} + } + }, + { + "origin": [-9.4775, 0.2125, 9.40823], + "size": [0.9775, 3.825, 1.58355], + "pivot": [-8.9675, 2.125, 10.2], + "rotation": [-112.5, 0, 0], + "uv": { + "east": {"uv": [7, 70], "uv_size": [2, 5]}, + "west": {"uv": [5, 70], "uv_size": [2, 5]}, + "up": {"uv": [72, 69], "uv_size": [-1, -2]}, + "down": {"uv": [70, 71], "uv_size": [-1, 2]} + } + }, + { + "origin": [-9.4775, 0.2125, 9.40823], + "size": [0.9775, 3.825, 1.58355], + "pivot": [-8.9675, 2.125, 10.2], + "rotation": [-157.5, 0, 0], + "uv": { + "east": {"uv": [3, 70], "uv_size": [2, 5]}, + "west": {"uv": [69, 65], "uv_size": [2, 5]}, + "up": {"uv": [72, 58], "uv_size": [-1, -2]}, + "down": {"uv": [72, 65], "uv_size": [-1, 2]} + } + } + ] + }, + { + "name": "wheel4", + "parent": "bone", + "pivot": [8.97813, 2.125, 10.2], + "cubes": [ + { + "origin": [8.5425, 0, 9.32025], + "size": [0.85, 4.25, 1.7595], + "pivot": [8.9675, 2.125, 10.2], + "rotation": [-22.5, 0, 0], + "uv": { + "east": {"uv": [25, 69], "uv_size": [-2, 5]}, + "west": {"uv": [27, 69], "uv_size": [-2, 5]}, + "up": {"uv": [66, 27], "uv_size": [1, -2]}, + "down": {"uv": [67, 34], "uv_size": [1, 2]} + } + }, + { + "origin": [8.5425, 0, 9.32025], + "size": [0.85, 4.25, 1.7595], + "pivot": [8.9675, 2.125, 10.2], + "rotation": [-67.5, 0, 0], + "uv": { + "east": {"uv": [29, 69], "uv_size": [-2, 5]}, + "west": {"uv": [31, 69], "uv_size": [-2, 5]}, + "up": {"uv": [39, 71], "uv_size": [1, -2]}, + "down": {"uv": [52, 71], "uv_size": [1, 2]} + } + }, + { + "origin": [8.5425, 0, 9.32025], + "size": [0.85, 4.25, 1.7595], + "pivot": [8.9675, 2.125, 10.2], + "rotation": [-112.5, 0, 0], + "uv": { + "east": {"uv": [33, 69], "uv_size": [-2, 5]}, + "west": {"uv": [35, 69], "uv_size": [-2, 5]}, + "up": {"uv": [71, 54], "uv_size": [1, -2]}, + "down": {"uv": [53, 71], "uv_size": [1, 2]} + } + }, + { + "origin": [8.5425, 0, 9.32025], + "size": [0.85, 4.25, 1.7595], + "pivot": [8.9675, 2.125, 10.2], + "rotation": [-157.5, 0, 0], + "uv": { + "east": {"uv": [37, 69], "uv_size": [-2, 5]}, + "west": {"uv": [39, 69], "uv_size": [-2, 5]}, + "up": {"uv": [54, 73], "uv_size": [1, -2]}, + "down": {"uv": [71, 54], "uv_size": [1, 2]} + } + }, + { + "origin": [8.5, 0.2125, 9.40823], + "size": [0.9775, 3.825, 1.58355], + "pivot": [8.9675, 2.125, 10.2], + "rotation": [-22.5, 0, 0], + "uv": { + "east": {"uv": [15, 70], "uv_size": [-2, 5]}, + "west": {"uv": [17, 70], "uv_size": [-2, 5]}, + "up": {"uv": [72, 30], "uv_size": [1, -2]}, + "down": {"uv": [41, 72], "uv_size": [1, 2]} + } + }, + { + "origin": [8.5, 0.2125, 9.40823], + "size": [0.9775, 3.825, 1.58355], + "pivot": [8.9675, 2.125, 10.2], + "rotation": [-67.5, 0, 0], + "uv": { + "east": {"uv": [11, 70], "uv_size": [-2, 5]}, + "west": {"uv": [13, 70], "uv_size": [-2, 5]}, + "up": {"uv": [70, 73], "uv_size": [1, -2]}, + "down": {"uv": [71, 71], "uv_size": [1, 2]} + } + }, + { + "origin": [8.5, 0.2125, 9.40823], + "size": [0.9775, 3.825, 1.58355], + "pivot": [8.9675, 2.125, 10.2], + "rotation": [-112.5, 0, 0], + "uv": { + "east": {"uv": [7, 70], "uv_size": [-2, 5]}, + "west": {"uv": [9, 70], "uv_size": [-2, 5]}, + "up": {"uv": [71, 69], "uv_size": [1, -2]}, + "down": {"uv": [69, 71], "uv_size": [1, 2]} + } + }, + { + "origin": [8.5, 0.2125, 9.40823], + "size": [0.9775, 3.825, 1.58355], + "pivot": [8.9675, 2.125, 10.2], + "rotation": [-157.5, 0, 0], + "uv": { + "east": {"uv": [71, 65], "uv_size": [-2, 5]}, + "west": {"uv": [5, 70], "uv_size": [-2, 5]}, + "up": {"uv": [71, 58], "uv_size": [1, -2]}, + "down": {"uv": [71, 65], "uv_size": [1, 2]} + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/superbwarfare/textures/entity/tom_6.png b/src/main/resources/assets/superbwarfare/textures/entity/tom_6.png new file mode 100644 index 0000000000000000000000000000000000000000..bc225322e31e3fc78ae4b341b485ffd1bfe48a02 GIT binary patch literal 5191 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 literal 0 HcmV?d00001