From c5652234e53a907fb792bd256894214a69e857a5 Mon Sep 17 00:00:00 2001 From: Atsuihsio <842960157@qq.com> Date: Sun, 5 Jan 2025 23:45:38 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E8=BD=BD=E5=85=B7perk?= =?UTF-8?q?=EF=BC=8C=E6=96=B0=E5=BB=BA=E5=B8=A6=E5=AD=98=E5=82=A8=E7=9A=84?= =?UTF-8?q?=E8=BD=BD=E5=85=B7=E7=B1=BB=EF=BC=8C=E6=B7=BB=E5=8A=A0=E7=9B=B4?= =?UTF-8?q?=E5=8D=87=E6=9C=BA=E7=9A=84=E5=BC=B9=E8=8D=AF=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../b69ee8a2655365569b979911c0440daa8c470ac2 | 3 +- .../superbwarfare/models/item/rocket_70.json | 6 + .../client/layer/HeliRocketLayer.java | 27 + .../client/model/entity/HeliRocketModel.java | 24 + .../client/overlay/CrossHairOverlay.java | 2 +- .../client/overlay/HelicopterHudOverlay.java | 27 + .../client/overlay/VehicleHudOverlay.java | 15 +- .../renderer/entity/HeliRocketRenderer.java | 50 + .../datagen/ModItemModelProvider.java | 1 + .../entity/projectile/HeliRocketEntity.java | 190 +++ .../entity/vehicle/Ah6Entity.java | 138 ++- .../entity/vehicle/ContainerMobileEntity.java | 203 ++++ .../entity/vehicle/SpeedboatEntity.java | 224 +--- .../event/LivingEventHandler.java | 14 - .../superbwarfare/init/ModEntities.java | 2 + .../init/ModEntityRenderers.java | 1 + .../superbwarfare/init/ModItems.java | 1 + .../superbwarfare/init/ModSounds.java | 3 + .../superbwarfare/menu/VehicleMenu.java | 45 +- .../superbwarfare/mixins/CameraMixin.java | 2 +- .../animations/rpg_rocket.animation.json | 95 +- .../assets/superbwarfare/geo/ah_6.geo.json | 1023 ++++++++++++++++- .../superbwarfare/geo/heli_rocket.geo.json | 230 ++++ .../assets/superbwarfare/lang/en_us.json | 5 +- .../assets/superbwarfare/lang/zh_cn.json | 5 +- .../assets/superbwarfare/sounds.json | 24 + .../superbwarfare/sounds/into_cannon.ogg | Bin 0 -> 13663 bytes .../superbwarfare/sounds/into_missile.ogg | Bin 0 -> 9160 bytes .../superbwarfare/sounds/missile_reload.ogg | Bin 0 -> 12728 bytes .../superbwarfare/textures/entity/ah_6.png | Bin 16530 -> 16539 bytes .../textures/entity/heli_rocket.png | Bin 0 -> 324 bytes .../superbwarfare/textures/gui/vehicle.png | Bin 1882 -> 1676 bytes .../superbwarfare/textures/item/rocket_70.png | Bin 0 -> 346 bytes 33 files changed, 1980 insertions(+), 380 deletions(-) create mode 100644 src/generated/resources/assets/superbwarfare/models/item/rocket_70.json create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/HeliRocketLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/entity/HeliRocketModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/HeliRocketRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/entity/projectile/HeliRocketEntity.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/entity/vehicle/ContainerMobileEntity.java create mode 100644 src/main/resources/assets/superbwarfare/geo/heli_rocket.geo.json create mode 100644 src/main/resources/assets/superbwarfare/sounds/into_cannon.ogg create mode 100644 src/main/resources/assets/superbwarfare/sounds/into_missile.ogg create mode 100644 src/main/resources/assets/superbwarfare/sounds/missile_reload.ogg create mode 100644 src/main/resources/assets/superbwarfare/textures/entity/heli_rocket.png create mode 100644 src/main/resources/assets/superbwarfare/textures/item/rocket_70.png diff --git a/src/generated/resources/.cache/b69ee8a2655365569b979911c0440daa8c470ac2 b/src/generated/resources/.cache/b69ee8a2655365569b979911c0440daa8c470ac2 index 9ef1846bf..30ff9127d 100644 --- a/src/generated/resources/.cache/b69ee8a2655365569b979911c0440daa8c470ac2 +++ b/src/generated/resources/.cache/b69ee8a2655365569b979911c0440daa8c470ac2 @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-29T21:51:17.35717 Item Models: superbwarfare +// 1.20.1 2025-01-05T22:08:45.9480261 Item Models: superbwarfare 13ca8d5676888ff51f3308d88e4bf67691fa34f8 assets/superbwarfare/models/item/aa_12_blueprint.json 13ca8d5676888ff51f3308d88e4bf67691fa34f8 assets/superbwarfare/models/item/ak_12_blueprint.json 13ca8d5676888ff51f3308d88e4bf67691fa34f8 assets/superbwarfare/models/item/ak_47_blueprint.json @@ -80,6 +80,7 @@ e821640d80c55763e7e7b62f7b80c60ff56dcc4f assets/superbwarfare/models/item/rare_m ce0f0949b0545d8ef08aeaa52dd423dbe592f704 assets/superbwarfare/models/item/raw_cemented_carbide_powder.json 59cbca463403cfc50d964229268638c55dd915fb assets/superbwarfare/models/item/raw_silver.json 5b8f7d5922e49e06bcd4d4d2a2a3dc934548570b assets/superbwarfare/models/item/reforging_table.json +2ffa0e320740cfae96341842450e95c916971fb1 assets/superbwarfare/models/item/rocket_70.json 13ca8d5676888ff51f3308d88e4bf67691fa34f8 assets/superbwarfare/models/item/rpg_blueprint.json 13ca8d5676888ff51f3308d88e4bf67691fa34f8 assets/superbwarfare/models/item/rpk_blueprint.json 34aecddee2e3b903c075b1625e1b23c57ea23fd1 assets/superbwarfare/models/item/ru_chest_6b43.json diff --git a/src/generated/resources/assets/superbwarfare/models/item/rocket_70.json b/src/generated/resources/assets/superbwarfare/models/item/rocket_70.json new file mode 100644 index 000000000..a25444ac0 --- /dev/null +++ b/src/generated/resources/assets/superbwarfare/models/item/rocket_70.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "superbwarfare:item/rocket_70" + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/HeliRocketLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/HeliRocketLayer.java new file mode 100644 index 000000000..5bb501d84 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/HeliRocketLayer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.entity.projectile.HeliRocketEntity; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class HeliRocketLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = new ResourceLocation(ModUtils.MODID, "textures/entity/rpg_rocket_e.png"); + + public HeliRocketLayer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, HeliRocketEntity animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 1, 1, 1, 1); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/entity/HeliRocketModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/entity/HeliRocketModel.java new file mode 100644 index 000000000..9ac2614a3 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/entity/HeliRocketModel.java @@ -0,0 +1,24 @@ +package com.atsuishio.superbwarfare.client.model.entity; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.entity.projectile.HeliRocketEntity; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.model.GeoModel; + +public class HeliRocketModel extends GeoModel { + @Override + public ResourceLocation getAnimationResource(HeliRocketEntity entity) { + return new ResourceLocation(ModUtils.MODID, "animations/rpg_rocket.animation.json"); + } + + @Override + public ResourceLocation getModelResource(HeliRocketEntity entity) { + return new ResourceLocation(ModUtils.MODID, "geo/heli_rocket.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(HeliRocketEntity entity) { + return new ResourceLocation(ModUtils.MODID, "textures/entity/heli_rocket.png"); + } + +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/CrossHairOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/CrossHairOverlay.java index 8a32be419..354499c36 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/CrossHairOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/CrossHairOverlay.java @@ -118,7 +118,7 @@ public class CrossHairOverlay { } // 在开启伤害指示器时才进行渲染 - if (DisplayConfig.KILL_INDICATION.get()) { + if (DisplayConfig.KILL_INDICATION.get() && stack.is(ModTags.Items.GUN)) { renderKillIndicator(guiGraphics, w, h, moveX, moveY); } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/HelicopterHudOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/HelicopterHudOverlay.java index 1c465f339..7f4dc88e3 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/HelicopterHudOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/HelicopterHudOverlay.java @@ -32,6 +32,7 @@ import org.joml.Vector4f; import java.text.DecimalFormat; import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit; +import static com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay.*; @Mod.EventBusSubscriber(value = Dist.CLIENT) public class HelicopterHudOverlay { @@ -146,8 +147,10 @@ public class HelicopterHudOverlay { float y3 = (float) p3.y; if (Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON) { preciseBlit(guiGraphics, ModUtils.loc("textures/screens/helicopter/crosshair_ind.png"), x - 8, y - 8, 0, 0, 16, 16, 16, 16); + renderKillIndicator(guiGraphics, x - 7.5f + (float) (2 * (Math.random() - 0.5f)), y - 7.5f + (float) (2 * (Math.random() - 0.5f))); } else if (Minecraft.getInstance().options.getCameraType() == CameraType.THIRD_PERSON_BACK) { preciseBlit(guiGraphics, ModUtils.loc("textures/screens/drone.png"), x3 - 8, y3 - 8, 0, 0, 16, 16, 16, 16); + renderKillIndicator(guiGraphics, x3 - 7.5f + (float) (2 * (Math.random() - 0.5f)), y3 - 7.5f + (float) (2 * (Math.random() - 0.5f))); } poseStack.popPose(); @@ -159,6 +162,30 @@ public class HelicopterHudOverlay { } } + private static void renderKillIndicator(GuiGraphics guiGraphics, float posX, float posY) { + float rate = (40 - KILL_INDICATOR * 5) / 5.5f; + + if (HIT_INDICATOR > 0) { + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/hit_marker.png"), posX, posY, 0, 0, 16, 16, 16, 16); + } + + if (HEAD_INDICATOR > 0) { + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/headshot_mark.png"), posX, posY, 0, 0, 16, 16, 16, 16); + } + + if (KILL_INDICATOR > 0) { + float posX1 = posX - 2 + rate; + float posY1 = posY - 2 + rate; + float posX2 = posX + 2 - rate; + float posY2 = posY + 2 - rate; + + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/kill_mark1.png"), posX1, posY1, 0, 0, 16, 16, 16, 16); + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/kill_mark2.png"), posX2, posY1, 0, 0, 16, 16, 16, 16); + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/kill_mark3.png"), posX1, posY2, 0, 0, 16, 16, 16, 16); + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/kill_mark4.png"), posX2, posY2, 0, 0, 16, 16, 16, 16); + } + } + public static Matrix4f getVehicleTransform(VehicleEntity vehicle) { Matrix4f transform = new Matrix4f(); transform.translate((float) vehicle.getX(), (float) vehicle.getY(), (float) vehicle.getZ()); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleHudOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleHudOverlay.java index b03523497..f8a5f13ba 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleHudOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/VehicleHudOverlay.java @@ -22,6 +22,8 @@ import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import static com.atsuishio.superbwarfare.entity.vehicle.Ah6Entity.WEAPON_TYPE; + @Mod.EventBusSubscriber(value = Dist.CLIENT) public class VehicleHudOverlay { @@ -80,7 +82,10 @@ public class VehicleHudOverlay { poseStack.scale(1.5f, 1.5f, 1f); float v = h / 1.5f - (iCharge ? 42 : 29) / 1.5f; - if (player.getInventory().hasAnyMatching(s -> s.is(ModItems.CREATIVE_AMMO_BOX.get())) && !(iVehicle instanceof ICannonEntity)) { + if (player.getInventory().hasAnyMatching(s -> s.is(ModItems.CREATIVE_AMMO_BOX.get())) + && !(iVehicle instanceof ICannonEntity + || (iVehicle instanceof Ah6Entity ah6Entity && ah6Entity.getEntityData().get(WEAPON_TYPE) == 1)) + ) { event.getGuiGraphics().drawString( Minecraft.getInstance().font, "∞", @@ -130,6 +135,14 @@ public class VehicleHudOverlay { if (iVehicle instanceof SpeedboatEntity) { return Component.translatable("des.superbwarfare.tips.ammo_type.cal50").getString(); } + if (iVehicle instanceof Ah6Entity ah6Entity) { + if (ah6Entity.getEntityData().get(WEAPON_TYPE) == 0) { + return Component.translatable("des.superbwarfare.tips.ammo_type.20mm_cannon").getString(); + } else { + return Component.translatable("des.superbwarfare.tips.ammo_type.rocket").getString(); + } + + } return ""; } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/HeliRocketRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/HeliRocketRenderer.java new file mode 100644 index 000000000..2ab57f232 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/entity/HeliRocketRenderer.java @@ -0,0 +1,50 @@ +package com.atsuishio.superbwarfare.client.renderer.entity; + +import com.atsuishio.superbwarfare.client.layer.HeliRocketLayer; +import com.atsuishio.superbwarfare.client.model.entity.HeliRocketModel; +import com.atsuishio.superbwarfare.entity.projectile.HeliRocketEntity; +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 HeliRocketRenderer extends GeoEntityRenderer { + public HeliRocketRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new HeliRocketModel()); + this.addRenderLayer(new HeliRocketLayer(this)); + } + + @Override + public RenderType getRenderType(HeliRocketEntity animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + @Override + public void preRender(PoseStack poseStack, HeliRocketEntity 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(HeliRocketEntity entityIn, float entityYaw, float partialTicks, PoseStack poseStack, MultiBufferSource bufferIn, int packedLightIn) { + poseStack.pushPose(); + poseStack.mulPose(Axis.YP.rotationDegrees(Mth.lerp(partialTicks, entityIn.yRotO, entityIn.getYRot()) - 90)); + poseStack.mulPose(Axis.ZP.rotationDegrees(90 + Mth.lerp(partialTicks, entityIn.xRotO, entityIn.getXRot()))); + super.render(entityIn, entityYaw, partialTicks, poseStack, bufferIn, packedLightIn); + poseStack.popPose(); + } + + @Override + protected float getDeathMaxRotation(HeliRocketEntity entityLivingBaseIn) { + return 0.0F; + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/datagen/ModItemModelProvider.java b/src/main/java/com/atsuishio/superbwarfare/datagen/ModItemModelProvider.java index a579de999..8e547a90a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/datagen/ModItemModelProvider.java +++ b/src/main/java/com/atsuishio/superbwarfare/datagen/ModItemModelProvider.java @@ -65,6 +65,7 @@ public class ModItemModelProvider extends ItemModelProvider { simpleItem(ModItems.FIRING_PARAMETERS); simpleItem(ModItems.BEAM_TEST); simpleItem(ModItems.HEAVY_AMMO); + simpleItem(ModItems.ROCKET_70); simpleItem(ModItems.TUNGSTEN_ROD); simpleItem(ModItems.IRON_BARREL); diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/projectile/HeliRocketEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/projectile/HeliRocketEntity.java new file mode 100644 index 000000000..4c68395fa --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/entity/projectile/HeliRocketEntity.java @@ -0,0 +1,190 @@ +package com.atsuishio.superbwarfare.entity.projectile; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.config.server.ExplosionDestroyConfig; +import com.atsuishio.superbwarfare.entity.AnimatedEntity; +import com.atsuishio.superbwarfare.init.ModDamageTypes; +import com.atsuishio.superbwarfare.init.ModEntities; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.network.message.ClientIndicatorMessage; +import com.atsuishio.superbwarfare.tools.CustomExplosion; +import com.atsuishio.superbwarfare.tools.ParticleTool; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.ThrowableItemProjectile; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraftforge.network.NetworkHooks; +import net.minecraftforge.network.PacketDistributor; +import net.minecraftforge.network.PlayMessages; +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.core.animation.AnimationController; +import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.core.animation.RawAnimation; +import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.util.GeckoLibUtil; + +import javax.annotation.Nullable; + +public class HeliRocketEntity extends ThrowableItemProjectile implements GeoEntity, AnimatedEntity { + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + private float damage = 140f; + private float explosion_damage = 60f; + private float explosion_radius = 5f; + + public HeliRocketEntity(EntityType type, Level world) { + super(type, world); + this.noCulling = true; + } + + public HeliRocketEntity(LivingEntity entity, Level level, float damage, float explosion_damage, float explosion_radius) { + super(ModEntities.HELI_ROCKET.get(), entity, level); + this.damage = damage; + this.explosion_damage = explosion_damage; + this.explosion_radius = explosion_radius; + } + + public HeliRocketEntity(PlayMessages.SpawnEntity spawnEntity, Level level) { + this(ModEntities.HELI_ROCKET.get(), level); + } + + @Override + public Packet getAddEntityPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + protected Item getDefaultItem() { + return ModItems.ROCKET.get(); + } + + @Override + public boolean shouldRenderAtSqrDistance(double pDistance) { + return true; + } + + @Override + protected void onHitEntity(EntityHitResult result) { + + Entity entity = result.getEntity(); + if (entity == this.getOwner() || entity == this.getVehicle()) return; + if (this.getOwner() instanceof LivingEntity living) { + if (!living.level().isClientSide() && living instanceof ServerPlayer player) { + living.level().playSound(null, living.blockPosition(), ModSounds.INDICATION.get(), SoundSource.VOICE, 1, 1); + + ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> player), new ClientIndicatorMessage(0, 5)); + } + } + + entity.hurt(ModDamageTypes.causeCannonFireDamage(this.level().registryAccess(), this, this.getOwner()), this.damage); + + if (entity instanceof LivingEntity) { + entity.invulnerableTime = 0; + } + + if (this.tickCount > 1) { + if (this.level() instanceof ServerLevel) { + causeRocketExplode(this, + ModDamageTypes.causeProjectileBoomDamage(this.level().registryAccess(), this, this.getOwner()), + entity, this.explosion_damage, this.explosion_radius, 1); + } + } + + this.discard(); + } + + @Override + public void onHitBlock(BlockHitResult blockHitResult) { + super.onHitBlock(blockHitResult); + if (this.tickCount > 1) { + if (this.level() instanceof ServerLevel) { + causeRocketExplode(this, + ModDamageTypes.causeProjectileBoomDamage(this.level().registryAccess(), this, this.getOwner()), + this, this.explosion_damage, this.explosion_radius, 1); + } + } + + this.discard(); + } + + @Override + public void tick() { + super.tick(); + if (this.tickCount == 3) { + if (!this.level().isClientSide() && this.level() instanceof ServerLevel serverLevel) { + ParticleTool.sendParticle(serverLevel, ParticleTypes.CLOUD, this.xo, this.yo, this.zo, 15, 0.8, 0.8, 0.8, 0.01, true); + ParticleTool.sendParticle(serverLevel, ParticleTypes.CAMPFIRE_COSY_SMOKE, this.xo, this.yo, this.zo, 10, 0.8, 0.8, 0.8, 0.01, true); + } + } + if (this.tickCount > 2) { + this.setDeltaMovement(this.getDeltaMovement().multiply(1.025, 1.025, 1.025)); + + if (!this.level().isClientSide() && this.level() instanceof ServerLevel serverLevel) { + ParticleTool.sendParticle(serverLevel, ParticleTypes.SMOKE, this.xo, this.yo, this.zo, 1, 0, 0, 0, 0, true); + } + } + + if (this.tickCount > 100 || this.isInWater()) { + if (this.level() instanceof ServerLevel) { + causeRocketExplode(this, + ModDamageTypes.causeProjectileBoomDamage(this.level().registryAccess(), this, this.getOwner()), + this, this.explosion_damage, this.explosion_radius, 1); + } + this.discard(); + } + } + + public static void causeRocketExplode(ThrowableItemProjectile projectile, @Nullable DamageSource source, Entity target, float damage, float radius, float damageMultiplier) { + CustomExplosion explosion = new CustomExplosion(projectile.level(), projectile, source, damage, + target.getX(), target.getY(), target.getZ(), radius, ExplosionDestroyConfig.EXPLOSION_DESTROY.get() ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.KEEP).setDamageMultiplier(damageMultiplier); + explosion.explode(); + net.minecraftforge.event.ForgeEventFactory.onExplosionStart(projectile.level(), explosion); + explosion.finalizeExplosion(false); + ParticleTool.spawnMediumExplosionParticles(projectile.level(), projectile.position()); + projectile.discard(); + } + + private PlayState movementPredicate(AnimationState event) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.rpg.idle")); + } + + @Override + protected float getGravity() { + return 0.002f; + } + + public String getSyncedAnimation() { + return null; + } + + public void setAnimation(String animation) { + } + + @Override + public void setAnimationProcedure(String procedure) { + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + data.add(new AnimationController<>(this, "movement", 0, this::movementPredicate)); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } +} 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 b60ea7a4a..414b2a72d 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/Ah6Entity.java @@ -2,12 +2,9 @@ package com.atsuishio.superbwarfare.entity.vehicle; import com.atsuishio.superbwarfare.ModUtils; import com.atsuishio.superbwarfare.config.server.ExplosionDestroyConfig; -import com.atsuishio.superbwarfare.entity.projectile.GunGrenadeEntity; +import com.atsuishio.superbwarfare.entity.projectile.HeliRocketEntity; import com.atsuishio.superbwarfare.entity.projectile.ProjectileEntity; -import com.atsuishio.superbwarfare.init.ModDamageTypes; -import com.atsuishio.superbwarfare.init.ModEntities; -import com.atsuishio.superbwarfare.init.ModParticleTypes; -import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.*; import com.atsuishio.superbwarfare.network.message.ShakeClientMessage; import com.atsuishio.superbwarfare.tools.CustomExplosion; import com.atsuishio.superbwarfare.tools.EntityFindUtil; @@ -34,6 +31,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.vehicle.DismountHelper; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; import net.minecraft.world.level.gameevent.GameEvent; @@ -59,21 +57,24 @@ import java.util.List; import static com.atsuishio.superbwarfare.tools.ParticleTool.sendParticle; -public class Ah6Entity extends MobileVehicleEntity implements GeoEntity, IHelicopterEntity, MultiWeaponVehicleEntity { +public class Ah6Entity extends ContainerMobileEntity implements GeoEntity, IHelicopterEntity, MultiWeaponVehicleEntity { private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - public static final float MAX_HEALTH = 300; + public static final float MAX_HEALTH = 400; public static final int MAX_ENERGY = 4000000; public static final EntityDataAccessor DELTA_ROT = SynchedEntityData.defineId(Ah6Entity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor PROPELLER_ROT = SynchedEntityData.defineId(Ah6Entity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor WEAPON_TYPE = SynchedEntityData.defineId(Ah6Entity.class, EntityDataSerializers.INT); + + public static final EntityDataAccessor AMMO = SynchedEntityData.defineId(Ah6Entity.class, EntityDataSerializers.INT); + public static final EntityDataAccessor LOADED_ROCKET = SynchedEntityData.defineId(Ah6Entity.class, EntityDataSerializers.INT); public boolean engineStart; public boolean engineStartOver; public float propellerRot; public float propellerRotO; public double velocity; - + public int reloadCoolDown; public int fireIndex; public Ah6Entity(PlayMessages.SpawnEntity packet, Level world) { @@ -88,6 +89,8 @@ public class Ah6Entity extends MobileVehicleEntity implements GeoEntity, IHelico @Override protected void defineSynchedData() { super.defineSynchedData(); + this.entityData.define(AMMO, 0); + this.entityData.define(LOADED_ROCKET, 0); this.entityData.define(DELTA_ROT, 0f); this.entityData.define(WEAPON_TYPE, 0); this.entityData.define(PROPELLER_ROT, 0f); @@ -96,11 +99,13 @@ public class Ah6Entity extends MobileVehicleEntity implements GeoEntity, IHelico @Override public void addAdditionalSaveData(CompoundTag compound) { super.addAdditionalSaveData(compound); + compound.putInt("LoadedRocket", this.entityData.get(LOADED_ROCKET)); } @Override public void readAdditionalSaveData(CompoundTag compound) { super.readAdditionalSaveData(compound); + this.entityData.set(LOADED_ROCKET, compound.getInt("LoadedRocket")); } @Override @@ -135,6 +140,27 @@ public class Ah6Entity extends MobileVehicleEntity implements GeoEntity, IHelico propellerRotO = this.getPropellerRot(); super.baseTick(); + if (this.level() instanceof ServerLevel) { + if (reloadCoolDown > 0){ + reloadCoolDown--; + } + Player player = (Player) this.getFirstPassenger(); + if (player != null) { + if ((this.getItemStacks().stream().filter(stack -> stack.is(ModItems.ROCKET_70.get())).mapToInt(ItemStack::getCount).sum() > 0 || player.getInventory().hasAnyMatching(s -> s.is(ModItems.CREATIVE_AMMO_BOX.get()))) && reloadCoolDown == 0 && this.getEntityData().get(LOADED_ROCKET) < 14) { + this.entityData.set(LOADED_ROCKET,this.getEntityData().get(LOADED_ROCKET) + 1); + reloadCoolDown = 30; + this.getItemStacks().stream().filter(stack -> stack.is(ModItems.ROCKET_70.get())).findFirst().ifPresent(stack -> stack.shrink(1)); + this.level().playSound(null, this, ModSounds.MISSILE_RELOAD.get(), this.getSoundSource(), 1, 1); + } + } + + if (this.getEntityData().get(WEAPON_TYPE) == 0) { + this.entityData.set(AMMO, this.getItemStacks().stream().filter(stack -> stack.is(ModItems.HEAVY_AMMO.get())).mapToInt(ItemStack::getCount).sum()); + } else { + this.entityData.set(AMMO, this.getEntityData().get(LOADED_ROCKET)); + } + } + if (this.onGround()) { this.setDeltaMovement(this.getDeltaMovement().multiply(0.8, 0.95, 0.8)); this.setZRot(this.roll * 0.9f); @@ -333,7 +359,7 @@ public class Ah6Entity extends MobileVehicleEntity implements GeoEntity, IHelico List passenger = this.getPassengers(); for (var e : passenger) { if (e instanceof LivingEntity living) { - if (e instanceof ServerPlayer victim) { + if (e instanceof ServerPlayer victim && !(victim.isCreative() || victim.isSpectator())) { living.setHealth(0); if (attacker == null || attacker == victim) { living.level().players().forEach( @@ -404,7 +430,7 @@ public class Ah6Entity extends MobileVehicleEntity implements GeoEntity, IHelico Vector4f worldPositionLeft; if (entityData.get(WEAPON_TYPE) == 0) { - x = 1f; + x = 1.1f; y = 0.62f; z = 0.8f; @@ -417,10 +443,10 @@ public class Ah6Entity extends MobileVehicleEntity implements GeoEntity, IHelico .headShot(2f) .zoom(false); - projectileRight.heBullet(true, 5); - projectileRight.bypassArmorRate(1); + projectileRight.heBullet(true, 3); + projectileRight.bypassArmorRate(0.5f); projectileRight.setPos(worldPositionRight.x, worldPositionRight.y, worldPositionRight.z); - projectileRight.shoot(player, this.getLookAngle().x, this.getLookAngle().y+ 0.03, this.getLookAngle().z, 20, + projectileRight.shoot(player, this.getLookAngle().x, this.getLookAngle().y + 0.025, this.getLookAngle().z, 20, (float) 0.2); this.level().addFreshEntity(projectileRight); sendParticle((ServerLevel) this.level(), ParticleTypes.LARGE_SMOKE, worldPositionRight.x, worldPositionRight.y, worldPositionRight.z, 1, 0, 0, 0, 0, false); @@ -431,10 +457,10 @@ public class Ah6Entity extends MobileVehicleEntity implements GeoEntity, IHelico .headShot(2f) .zoom(false); - projectileLeft.heBullet(true, 5); - projectileLeft.bypassArmorRate(1); + projectileLeft.heBullet(true, 3); + projectileLeft.bypassArmorRate(0.5f); projectileLeft.setPos(worldPositionLeft.x, worldPositionLeft.y, worldPositionLeft.z); - projectileLeft.shoot(player, this.getLookAngle().x, this.getLookAngle().y + 0.03, this.getLookAngle().z, 20, + projectileLeft.shoot(player, this.getLookAngle().x, this.getLookAngle().y + 0.025, this.getLookAngle().z, 20, (float) 0.2); this.level().addFreshEntity(projectileLeft); sendParticle((ServerLevel) this.level(), ParticleTypes.LARGE_SMOKE, worldPositionLeft.x, worldPositionLeft.y, worldPositionLeft.z, 1, 0, 0, 0, 0, false); @@ -446,8 +472,20 @@ public class Ah6Entity extends MobileVehicleEntity implements GeoEntity, IHelico serverPlayer.playSound(ModSounds.HELICOPTER_CANNON_VERYFAR.get(), 24, 1); } } - } else if (entityData.get(WEAPON_TYPE) == 1) { - x = 1.15f; + + this.getItemStacks().stream().filter(stack -> stack.is(ModItems.HEAVY_AMMO.get())).findFirst().ifPresent(stack -> stack.shrink(1)); + + Level level = player.level(); + final Vec3 center = new Vec3(this.getX(), this.getEyeY(), this.getZ()); + + for (Entity target : level.getEntitiesOfClass(Entity.class, new AABB(center, center).inflate(6), e -> true).stream().sorted(Comparator.comparingDouble(e -> e.distanceToSqr(center))).toList()) { + if (target instanceof ServerPlayer serverPlayer) { + ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new ShakeClientMessage(6, 5, 7, this.getX(), this.getEyeY(), this.getZ())); + } + } + + } else if (entityData.get(WEAPON_TYPE) == 1 && this.getEntityData().get(LOADED_ROCKET) > 0) { + x = 1.7f; y = 0.62f; z = 0.8f; @@ -455,24 +493,24 @@ public class Ah6Entity extends MobileVehicleEntity implements GeoEntity, IHelico worldPositionLeft = transformPosition(transform, x, y, z); if (fireIndex == 0) { - GunGrenadeEntity gunGrenadeEntity = new GunGrenadeEntity(player, player.level(), - 110, - 40, - 6); - - gunGrenadeEntity.setPos(worldPositionRight.x, worldPositionRight.y, worldPositionRight.z); - gunGrenadeEntity.shoot(this.getLookAngle().x, this.getLookAngle().y+ 0.03, this.getLookAngle().z, 8, 0.25f); - player.level().addFreshEntity(gunGrenadeEntity); - fireIndex = 1; - } else if (fireIndex == 1){ - GunGrenadeEntity gunGrenadeEntityLeft = new GunGrenadeEntity(player, player.level(), - 110, + HeliRocketEntity heliRocketEntityRight = new HeliRocketEntity(player, player.level(), + 140, 40, 5); - gunGrenadeEntityLeft.setPos(worldPositionLeft.x, worldPositionLeft.y, worldPositionLeft.z); - gunGrenadeEntityLeft.shoot(this.getLookAngle().x, this.getLookAngle().y+ 0.03, this.getLookAngle().z, 8, 0.25f); - player.level().addFreshEntity(gunGrenadeEntityLeft); + heliRocketEntityRight.setPos(worldPositionRight.x, worldPositionRight.y, worldPositionRight.z); + heliRocketEntityRight.shoot(this.getLookAngle().x, this.getLookAngle().y + 0.0125, this.getLookAngle().z, 5, 0.25f); + player.level().addFreshEntity(heliRocketEntityRight); + fireIndex = 1; + } else if (fireIndex == 1){ + HeliRocketEntity heliRocketEntityLeft = new HeliRocketEntity(player, player.level(), + 140, + 40, + 5); + + heliRocketEntityLeft.setPos(worldPositionLeft.x, worldPositionLeft.y, worldPositionLeft.z); + heliRocketEntityLeft.shoot(this.getLookAngle().x, this.getLookAngle().y + 0.0125, this.getLookAngle().z, 5, 0.25f); + player.level().addFreshEntity(heliRocketEntityLeft); fireIndex = 0; } @@ -481,14 +519,17 @@ public class Ah6Entity extends MobileVehicleEntity implements GeoEntity, IHelico serverPlayer.playSound(ModSounds.HELICOPTER_ROCKET_FIRE_3P.get(), 6, 1); } } - } - Level level = player.level(); - final Vec3 center = new Vec3(this.getX(), this.getEyeY(), this.getZ()); + this.entityData.set(LOADED_ROCKET, this.getEntityData().get(LOADED_ROCKET) - 1); + reloadCoolDown = 30; - for (Entity target : level.getEntitiesOfClass(Entity.class, new AABB(center, center).inflate(6), e -> true).stream().sorted(Comparator.comparingDouble(e -> e.distanceToSqr(center))).toList()) { - if (target instanceof ServerPlayer serverPlayer) { - ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new ShakeClientMessage(6, 5, 7, this.getX(), this.getEyeY(), this.getZ())); + Level level = player.level(); + final Vec3 center = new Vec3(this.getX(), this.getEyeY(), this.getZ()); + + for (Entity target : level.getEntitiesOfClass(Entity.class, new AABB(center, center).inflate(6), e -> true).stream().sorted(Comparator.comparingDouble(e -> e.distanceToSqr(center))).toList()) { + if (target instanceof ServerPlayer serverPlayer) { + ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new ShakeClientMessage(6, 5, 7, this.getX(), this.getEyeY(), this.getZ())); + } } } } @@ -534,17 +575,22 @@ public class Ah6Entity extends MobileVehicleEntity implements GeoEntity, IHelico @Override public int mainGunRpm() { - return 300; + return 480; } @Override public boolean canShoot(Player player) { - return true; + if (entityData.get(WEAPON_TYPE) == 0) { + return this.entityData.get(AMMO) > 0 || player.getInventory().hasAnyMatching(s -> s.is(ModItems.CREATIVE_AMMO_BOX.get())); + } else if (entityData.get(WEAPON_TYPE) == 1) { + return this.entityData.get(AMMO) > 0; + } + return false; } @Override public int getAmmoCount(Player player) { - return -1; + return this.entityData.get(AMMO); } @@ -570,9 +616,13 @@ public class Ah6Entity extends MobileVehicleEntity implements GeoEntity, IHelico @Override public void changeWeapon() { - entityData.set(WEAPON_TYPE, entityData.get(WEAPON_TYPE) + 1); - if (entityData.get(WEAPON_TYPE) == 2) { +// entityData.set(WEAPON_TYPE, entityData.get(WEAPON_TYPE) + 1); + if (entityData.get(WEAPON_TYPE) == 0) { + this.level().playSound(null, this, ModSounds.INTO_MISSILE.get(), this.getSoundSource(), 1, 1); + entityData.set(WEAPON_TYPE, 1); + } else if (entityData.get(WEAPON_TYPE) == 1) { entityData.set(WEAPON_TYPE, 0); + this.level().playSound(null, this, ModSounds.INTO_CANNON.get(), this.getSoundSource(), 1, 1); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/ContainerMobileEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/ContainerMobileEntity.java new file mode 100644 index 000000000..496edc617 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/ContainerMobileEntity.java @@ -0,0 +1,203 @@ +package com.atsuishio.superbwarfare.entity.vehicle; + +import com.atsuishio.superbwarfare.menu.VehicleMenu; +import net.minecraft.core.Direction; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.Containers; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.HasCustomInventoryScreen; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.vehicle.ContainerEntity; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.HopperBlockEntity; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.wrapper.InvWrapper; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class ContainerMobileEntity extends MobileVehicleEntity implements HasCustomInventoryScreen, ContainerEntity { + + public static final int CONTAINER_SIZE = 102; + + private NonNullList items = NonNullList.withSize(CONTAINER_SIZE, ItemStack.EMPTY); + private LazyOptional itemHandler = LazyOptional.of(() -> new InvWrapper(this)); + + public ContainerMobileEntity(EntityType pEntityType, Level pLevel) { + super(pEntityType, pLevel); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + ContainerHelper.saveAllItems(compound, this.getItemStacks()); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + ContainerHelper.loadAllItems(compound, this.getItemStacks()); + } + + @Override + public void remove(RemovalReason pReason) { + if (!this.level().isClientSide && pReason != RemovalReason.DISCARDED) { + Containers.dropContents(this.level(), this, this); + } + super.remove(pReason); + } + + + @Override + public void baseTick() { + super.baseTick(); + pickUpItem(); + this.refreshDimensions(); + } + + public void pickUpItem() { + List list = this.level().getEntitiesOfClass(ItemEntity.class, this.getBoundingBox().inflate(0.2F, 0.1, 0.2F)); + if (!list.isEmpty()) { + for (ItemEntity entity : list) { + if (!this.level().isClientSide) { + HopperBlockEntity.addItem(this, entity); + } + } + } + } + + @Override + public void openCustomInventoryScreen(Player pPlayer) { + pPlayer.openMenu(this); + if (!pPlayer.level().isClientSide) { + this.gameEvent(GameEvent.CONTAINER_OPEN, pPlayer); + } + } + + @Nullable + @Override + public ResourceLocation getLootTable() { + return null; + } + + @Override + public void setLootTable(@Nullable ResourceLocation pLootTable) { + } + + @Override + public long getLootTableSeed() { + return 0; + } + + @Override + public void setLootTableSeed(long pLootTableSeed) { + } + + @Override + public NonNullList getItemStacks() { + return this.items; + } + + @Override + public void clearItemStacks() { + this.items.clear(); + } + + @Override + public int getContainerSize() { + return CONTAINER_SIZE; + } + + @Override + public ItemStack getItem(int pSlot) { + return this.items.get(pSlot); + } + + @Override + public ItemStack removeItem(int pSlot, int pAmount) { + return ContainerHelper.removeItem(this.items, pSlot, pAmount); + } + + @Override + public ItemStack removeItemNoUpdate(int pSlot) { + ItemStack itemstack = this.getItemStacks().get(pSlot); + if (itemstack.isEmpty()) { + return ItemStack.EMPTY; + } else { + this.getItemStacks().set(pSlot, ItemStack.EMPTY); + return itemstack; + } + } + + @Override + public void setItem(int pSlot, ItemStack pStack) { + this.getItemStacks().set(pSlot, pStack); + if (!pStack.isEmpty() && pStack.getCount() > this.getMaxStackSize()) { + pStack.setCount(this.getMaxStackSize()); + } + } + + @Override + public void setChanged() { + } + + @Override + public boolean stillValid(Player pPlayer) { + return !this.isRemoved() && this.position().closerThan(pPlayer.position(), 8.0D); + } + + @Override + public void clearContent() { + this.getItemStacks().clear(); + } + + @Nullable + @Override + public AbstractContainerMenu createMenu(int pContainerId, Inventory pPlayerInventory, Player pPlayer) { + if (pPlayer.isSpectator()) { + return null; + } else { + return new VehicleMenu(pContainerId, pPlayerInventory, this); + } + } + + @Override + public LazyOptional getCapability(Capability capability, @Nullable Direction facing) { + if (this.isAlive() && capability == ForgeCapabilities.ITEM_HANDLER) { + return itemHandler.cast(); + } + return super.getCapability(capability, facing); + } + + @Override + public void invalidateCaps() { + super.invalidateCaps(); + itemHandler.invalidate(); + } + + @Override + public void reviveCaps() { + super.reviveCaps(); + itemHandler = LazyOptional.of(() -> new InvWrapper(this)); + } + + @Override + public void stopOpen(Player pPlayer) { + this.level().gameEvent(GameEvent.CONTAINER_CLOSE, this.position(), GameEvent.Context.of(pPlayer)); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/SpeedboatEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/SpeedboatEntity.java index ff0535581..dedf22f09 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/SpeedboatEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/vehicle/SpeedboatEntity.java @@ -5,19 +5,13 @@ import com.atsuishio.superbwarfare.config.server.CannonConfig; import com.atsuishio.superbwarfare.config.server.ExplosionDestroyConfig; import com.atsuishio.superbwarfare.entity.projectile.ProjectileEntity; import com.atsuishio.superbwarfare.init.*; -import com.atsuishio.superbwarfare.item.PerkItem; -import com.atsuishio.superbwarfare.menu.VehicleMenu; import com.atsuishio.superbwarfare.network.ModVariables; import com.atsuishio.superbwarfare.network.message.ShakeClientMessage; -import com.atsuishio.superbwarfare.perk.AmmoPerk; -import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.tools.CustomExplosion; import com.atsuishio.superbwarfare.tools.EntityFindUtil; import com.atsuishio.superbwarfare.tools.ParticleTool; import com.atsuishio.superbwarfare.tools.SoundTool; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.NonNullList; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.Packet; @@ -25,44 +19,27 @@ 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.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; -import net.minecraft.world.ContainerHelper; -import net.minecraft.world.Containers; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.effect.MobEffect; -import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.HasCustomInventoryScreen; -import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.vehicle.ContainerEntity; -import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.entity.HopperBlockEntity; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.gameevent.GameEvent; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.FluidType; -import net.minecraftforge.items.wrapper.InvWrapper; import net.minecraftforge.network.NetworkHooks; import net.minecraftforge.network.PacketDistributor; import net.minecraftforge.network.PlayMessages; import net.minecraftforge.registries.ForgeRegistries; -import org.jetbrains.annotations.Nullable; import org.joml.Math; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; @@ -73,13 +50,11 @@ import software.bernie.geckolib.core.animation.RawAnimation; import software.bernie.geckolib.core.object.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; -import java.util.ArrayList; import java.util.Comparator; -import java.util.List; import static com.atsuishio.superbwarfare.tools.ParticleTool.sendParticle; -public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, IChargeEntity, IArmedVehicleEntity, HasCustomInventoryScreen, ContainerEntity { +public class SpeedboatEntity extends ContainerMobileEntity implements GeoEntity, IChargeEntity, IArmedVehicleEntity { public static final EntityDataAccessor FIRE_ANIM = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.INT); public static final EntityDataAccessor DELTA_ROT = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.FLOAT); @@ -88,10 +63,6 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I public static final float MAX_HEALTH = CannonConfig.SPEEDBOAT_HP.get(); public static final int MAX_ENERGY = CannonConfig.SPEEDBOAT_MAX_ENERGY.get(); - public static final int CONTAINER_SIZE = 105; - - private NonNullList items = NonNullList.withSize(CONTAINER_SIZE, ItemStack.EMPTY); - private LazyOptional itemHandler = LazyOptional.of(() -> new InvWrapper(this)); private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); public float turretYRot; @@ -125,14 +96,11 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I @Override public void addAdditionalSaveData(CompoundTag compound) { super.addAdditionalSaveData(compound); - compound.putFloat("Energy", this.entityData.get(ENERGY)); - ContainerHelper.saveAllItems(compound, this.getItemStacks()); } @Override public void readAdditionalSaveData(CompoundTag compound) { super.readAdditionalSaveData(compound); - ContainerHelper.loadAllItems(compound, this.getItemStacks()); } @Override @@ -145,14 +113,6 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I return super.getPassengersRidingOffset() - 0.8; } - @Override - public void remove(Entity.RemovalReason pReason) { - if (!this.level().isClientSide && pReason != RemovalReason.DISCARDED) { - Containers.dropContents(this.level(), this, this); - } - super.remove(pReason); - } - @Override public boolean hurt(DamageSource source, float amount) { super.hurt(source, amount); @@ -241,7 +201,6 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I collideBlock(); gunnerAngle(); - pickUpItem(); this.refreshDimensions(); } @@ -268,43 +227,6 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I .headShot(2f) .zoom(false); - if (this.getItemStacks().size() > 102) { - ItemStack perkItem = this.getItemStacks().get(102); - if (perkItem.getItem() instanceof PerkItem perk) { - if (perk.getPerk() == ModPerks.SILVER_BULLET.get()) { - projectile.undeadMultiple(2.5f); - } else if (perk.getPerk() == ModPerks.BEAST_BULLET.get()) { - projectile.beast(); - } else if (perk.getPerk() == ModPerks.JHP_BULLET.get()) { - projectile.jhpBullet(true, 3); - } else if (perk.getPerk() == ModPerks.HE_BULLET.get()) { - projectile.heBullet(true, 3); - } else if (perk.getPerk() == ModPerks.INCENDIARY_BULLET.get()) { - projectile.fireBullet(true, 3, false); - } - - if (perk.getPerk() instanceof AmmoPerk ammoPerk) { - projectile.setRGB(ammoPerk.rgb); - if (!ammoPerk.mobEffects.get().isEmpty()) { - ArrayList mobEffectInstances = new ArrayList<>(); - for (MobEffect effect : ammoPerk.mobEffects.get()) { - mobEffectInstances.add(new MobEffectInstance(effect, 160, 2)); - } - projectile.effect(mobEffectInstances); - } - } - } - } - - if (this.getItemStacks().size() > 104) { - ItemStack perkItem = this.getItemStacks().get(104); - if (perkItem.getItem() instanceof PerkItem perk) { - if (perk.getPerk() == ModPerks.MONSTER_HUNTER.get()) { - projectile.monsterMultiple(0.5f); - } - } - } - projectile.bypassArmorRate(0.9f); projectile.setPos(this.xo - this.getViewVector(1).scale(0.54).x - this.getDeltaMovement().x, this.yo + 3.0, this.zo - this.getViewVector(1).scale(0.54).z - this.getDeltaMovement().z); projectile.shoot(player, player.getLookAngle().x, player.getLookAngle().y + (zooming() ? 0.002f : -0.009f), player.getLookAngle().z, 20, @@ -479,17 +401,6 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I } } - public void pickUpItem() { - List list = this.level().getEntitiesOfClass(ItemEntity.class, this.getBoundingBox().inflate(0.2F, 0.1, 0.2F)); - if (!list.isEmpty()) { - for (ItemEntity entity : list) { - if (!this.level().isClientSide) { - HopperBlockEntity.addItem(this, entity); - } - } - } - } - @Override public void destroy() { Entity attacker = EntityFindUtil.findEntity(this.level(), this.entityData.get(LAST_ATTACKER_UUID)); @@ -545,139 +456,6 @@ public class SpeedboatEntity extends MobileVehicleEntity implements GeoEntity, I return 5; } - @Override - public void openCustomInventoryScreen(Player pPlayer) { - pPlayer.openMenu(this); - if (!pPlayer.level().isClientSide) { - this.gameEvent(GameEvent.CONTAINER_OPEN, pPlayer); - } - } - - @Nullable - @Override - public ResourceLocation getLootTable() { - return null; - } - - @Override - public void setLootTable(@Nullable ResourceLocation pLootTable) { - } - - @Override - public long getLootTableSeed() { - return 0; - } - - @Override - public void setLootTableSeed(long pLootTableSeed) { - } - - @Override - public NonNullList getItemStacks() { - return this.items; - } - - @Override - public void clearItemStacks() { - this.items.clear(); - } - - @Override - public int getContainerSize() { - return CONTAINER_SIZE; - } - - @Override - public ItemStack getItem(int pSlot) { - return this.items.get(pSlot); - } - - @Override - public ItemStack removeItem(int pSlot, int pAmount) { - return ContainerHelper.removeItem(this.items, pSlot, pAmount); - } - - @Override - public boolean canPlaceItem(int pIndex, ItemStack pStack) { - return switch (pIndex) { - case VehicleMenu.DEFAULT_AMMO_PERK_SLOT -> - pStack.getItem() instanceof PerkItem perkItem && perkItem.getPerk().type == Perk.Type.AMMO; - case VehicleMenu.DEFAULT_FUNC_PERK_SLOT -> - pStack.getItem() instanceof PerkItem perkItem && perkItem.getPerk().type == Perk.Type.FUNCTIONAL && perkItem.getPerk() == ModPerks.POWERFUL_ATTRACTION.get(); - case VehicleMenu.DEFAULT_DAMAGE_PERK_SLOT -> - pStack.getItem() instanceof PerkItem perkItem && perkItem.getPerk().type == Perk.Type.DAMAGE && perkItem.getPerk() == ModPerks.MONSTER_HUNTER.get(); - default -> true; - }; - } - - @Override - public ItemStack removeItemNoUpdate(int pSlot) { - ItemStack itemstack = this.getItemStacks().get(pSlot); - if (itemstack.isEmpty()) { - return ItemStack.EMPTY; - } else { - this.getItemStacks().set(pSlot, ItemStack.EMPTY); - return itemstack; - } - } - - @Override - public void setItem(int pSlot, ItemStack pStack) { - this.getItemStacks().set(pSlot, pStack); - if (!pStack.isEmpty() && pStack.getCount() > this.getMaxStackSize()) { - pStack.setCount(this.getMaxStackSize()); - } - } - - @Override - public void setChanged() { - } - - @Override - public boolean stillValid(Player pPlayer) { - return !this.isRemoved() && this.position().closerThan(pPlayer.position(), 8.0D); - } - - @Override - public void clearContent() { - this.getItemStacks().clear(); - } - - @Nullable - @Override - public AbstractContainerMenu createMenu(int pContainerId, Inventory pPlayerInventory, Player pPlayer) { - if (pPlayer.isSpectator()) { - return null; - } else { - return new VehicleMenu(pContainerId, pPlayerInventory, this); - } - } - - @Override - public LazyOptional getCapability(Capability capability, @Nullable Direction facing) { - if (this.isAlive() && capability == ForgeCapabilities.ITEM_HANDLER) { - return itemHandler.cast(); - } - return super.getCapability(capability, facing); - } - - @Override - public void invalidateCaps() { - super.invalidateCaps(); - itemHandler.invalidate(); - } - - @Override - public void reviveCaps() { - super.reviveCaps(); - itemHandler = LazyOptional.of(() -> new InvWrapper(this)); - } - - @Override - public void stopOpen(Player pPlayer) { - this.level().gameEvent(GameEvent.CONTAINER_CLOSE, this.position(), GameEvent.Context.of(pPlayer)); - } - @Override public int getMaxEnergy() { return MAX_ENERGY; diff --git a/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java index 4a551eaae..1536ddadf 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/LivingEventHandler.java @@ -720,20 +720,6 @@ public class LivingEventHandler { if (!(sourceEntity instanceof Player player)) return; ItemStack stack = player.getMainHandItem(); - if (sourceEntity.getVehicle() instanceof IArmedVehicleEntity vehicle && DamageTypeTool.isGunDamage(source) && !stack.is(ModTags.Items.GUN)) { - var drops = event.getDrops(); - if (vehicle instanceof ContainerEntity containerEntity) { - drops.forEach(itemEntity -> { - ItemStack item = itemEntity.getItem(); - if (!HopperBlockEntity.addItem(containerEntity, itemEntity)) { - player.drop(item, false); - } - }); - event.setCanceled(true); - return; - } - } - if (sourceEntity.getVehicle() instanceof IArmedVehicleEntity vehicle && source.is(ModDamageTypes.VEHICLE_STRIKE)) { var drops = event.getDrops(); if (vehicle instanceof ContainerEntity containerEntity) { diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModEntities.java b/src/main/java/com/atsuishio/superbwarfare/init/ModEntities.java index a6991db6f..cd522696d 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModEntities.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModEntities.java @@ -68,6 +68,8 @@ public class ModEntities { EntityType.Builder.of(WheelChairEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(512).setUpdateInterval(3).setCustomClientFactory(WheelChairEntity::new).fireImmune().sized(1.0f, 1.0f)); public static final RegistryObject> AH_6 = register("ah_6", EntityType.Builder.of(Ah6Entity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(512).setUpdateInterval(3).setCustomClientFactory(Ah6Entity::new).fireImmune().sized(2.8f, 2.9f)); + public static final RegistryObject> HELI_ROCKET = register("projectile_heli_rocket", + EntityType.Builder.of(HeliRocketEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(512).setUpdateInterval(1).setCustomClientFactory(HeliRocketEntity::new).sized(0.5f, 0.5f)); 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 34bff6796..9bae710fa 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModEntityRenderers.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModEntityRenderers.java @@ -18,6 +18,7 @@ public class ModEntityRenderers { event.registerEntityRenderer(ModEntities.GUN_GRENADE.get(), GunGrenadeRenderer::new); event.registerEntityRenderer(ModEntities.TARGET.get(), TargetRenderer::new); event.registerEntityRenderer(ModEntities.RPG_ROCKET.get(), RpgRocketRenderer::new); + event.registerEntityRenderer(ModEntities.HELI_ROCKET.get(), HeliRocketRenderer::new); event.registerEntityRenderer(ModEntities.MORTAR_SHELL.get(), MortarShellRenderer::new); event.registerEntityRenderer(ModEntities.CANNON_SHELL.get(), CannonShellRenderer::new); event.registerEntityRenderer(ModEntities.PROJECTILE.get(), ProjectileEntityRenderer::new); diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java b/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java index 8c5fb57bd..3c04b1ceb 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java @@ -106,6 +106,7 @@ public class ModItems { public static final RegistryObject RGO_GRENADE = AMMO.register("rgo_grenade", RgoGrenade::new); public static final RegistryObject CLAYMORE_MINE = AMMO.register("claymore_mine", ClaymoreMine::new); public static final RegistryObject HEAVY_AMMO = AMMO.register("heavy_ammo", () -> new Item(new Item.Properties())); + public static final RegistryObject ROCKET_70 = AMMO.register("rocket_70", () -> new Item(new Item.Properties())); public static final RegistryObject BEAM_TEST = AMMO.register("beam_test", BeamTest::new); /** diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModSounds.java b/src/main/java/com/atsuishio/superbwarfare/init/ModSounds.java index b5845810b..823d5132f 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModSounds.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModSounds.java @@ -365,5 +365,8 @@ public class ModSounds { public static final RegistryObject HELICOPTER_CANNON_VERYFAR = REGISTRY.register("heli_cannon_veryfar", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("heli_cannon_veryfar"))); public static final RegistryObject HELICOPTER_ROCKET_FIRE_1P = REGISTRY.register("heli_rocket_fire_1p", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("heli_rocket_fire_1p"))); public static final RegistryObject HELICOPTER_ROCKET_FIRE_3P = REGISTRY.register("heli_rocket_fire_3p", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("heli_rocket_fire_3p"))); + public static final RegistryObject INTO_CANNON = REGISTRY.register("into_cannon", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("into_cannon"))); + public static final RegistryObject INTO_MISSILE = REGISTRY.register("into_missile", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("into_missile"))); + public static final RegistryObject MISSILE_RELOAD = REGISTRY.register("missile_reload", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("missile_reload"))); } diff --git a/src/main/java/com/atsuishio/superbwarfare/menu/VehicleMenu.java b/src/main/java/com/atsuishio/superbwarfare/menu/VehicleMenu.java index 08b07927b..08443a36e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/menu/VehicleMenu.java +++ b/src/main/java/com/atsuishio/superbwarfare/menu/VehicleMenu.java @@ -1,9 +1,6 @@ package com.atsuishio.superbwarfare.menu; import com.atsuishio.superbwarfare.init.ModMenuTypes; -import com.atsuishio.superbwarfare.init.ModPerks; -import com.atsuishio.superbwarfare.item.PerkItem; -import com.atsuishio.superbwarfare.perk.Perk; import net.minecraft.world.Container; import net.minecraft.world.SimpleContainer; import net.minecraft.world.entity.player.Inventory; @@ -13,14 +10,10 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; public class VehicleMenu extends AbstractContainerMenu { - private final Container container; private final int containerRows; - public static final int DEFAULT_SIZE = 105; - public static final int DEFAULT_AMMO_PERK_SLOT = 102; - public static final int DEFAULT_FUNC_PERK_SLOT = 103; - public static final int DEFAULT_DAMAGE_PERK_SLOT = 104; + public static final int DEFAULT_SIZE = 102; public static final int X_OFFSET = 97; public static final int Y_OFFSET = 20; @@ -44,10 +37,6 @@ public class VehicleMenu extends AbstractContainerMenu { } } - this.addSlot(new PerkSlot(pContainer, this.containerRows * 17, Perk.Type.AMMO, 8, 36)); - this.addSlot(new PerkSlot(pContainer, this.containerRows * 17 + 1, Perk.Type.FUNCTIONAL, 8, 54)); - this.addSlot(new PerkSlot(pContainer, this.containerRows * 17 + 2, Perk.Type.DAMAGE, 8, 72)); - for (int l = 0; l < 3; ++l) { for (int j = 0; j < 9; ++j) { this.addSlot(new Slot(pPlayerInventory, j + l * 9 + 9, 8 + j * 18 + X_OFFSET, 84 + l * 18 + Y_OFFSET + i)); @@ -70,13 +59,6 @@ public class VehicleMenu extends AbstractContainerMenu { if (!this.moveItemStackTo(itemstack1, this.containerRows * 17 + 3, this.slots.size(), true)) { return ItemStack.EMPTY; } - } else if (itemstack1.getItem() instanceof PerkItem) { - if (!this.moveItemStackTo(itemstack1, this.containerRows * 17, this.containerRows * 17 + 3, false)) { - if (!this.moveItemStackTo(itemstack1, 0, this.containerRows * 17, false)) { - return ItemStack.EMPTY; - } - return ItemStack.EMPTY; - } } else if (!this.moveItemStackTo(itemstack1, 0, this.containerRows * 17, false)) { return ItemStack.EMPTY; } @@ -96,30 +78,5 @@ public class VehicleMenu extends AbstractContainerMenu { return this.container.stillValid(pPlayer); } - static class PerkSlot extends Slot { - public Perk.Type type; - - public PerkSlot(Container pContainer, int pSlot, Perk.Type type, int pX, int pY) { - super(pContainer, pSlot, pX, pY); - this.type = type; - } - - @Override - public boolean mayPlace(ItemStack pStack) { - return pStack.getItem() instanceof PerkItem perkItem && perkItem.getPerk().type == this.type && switch (this.type) { - case AMMO: - yield true; - case FUNCTIONAL: - yield perkItem.getPerk() == ModPerks.POWERFUL_ATTRACTION.get(); - case DAMAGE: - yield perkItem.getPerk() == ModPerks.MONSTER_HUNTER.get(); - }; - } - - @Override - public int getMaxStackSize() { - return 1; - } - } } diff --git a/src/main/java/com/atsuishio/superbwarfare/mixins/CameraMixin.java b/src/main/java/com/atsuishio/superbwarfare/mixins/CameraMixin.java index c718760ee..99e75f6d2 100644 --- a/src/main/java/com/atsuishio/superbwarfare/mixins/CameraMixin.java +++ b/src/main/java/com/atsuishio/superbwarfare/mixins/CameraMixin.java @@ -98,7 +98,7 @@ public abstract class CameraMixin { return; } if (thirdPerson && entity.getVehicle() instanceof Ah6Entity) { - move(-getMaxZoom(6), 1, -2.0); + move(-getMaxZoom(7), 1, -2.7); return; } if (Minecraft.getInstance().options.getCameraType() == CameraType.THIRD_PERSON_BACK && entity instanceof Player player && player.getMainHandItem().is(ModTags.Items.GUN)) { diff --git a/src/main/resources/assets/superbwarfare/animations/rpg_rocket.animation.json b/src/main/resources/assets/superbwarfare/animations/rpg_rocket.animation.json index 4885194d9..d990446d3 100644 --- a/src/main/resources/assets/superbwarfare/animations/rpg_rocket.animation.json +++ b/src/main/resources/assets/superbwarfare/animations/rpg_rocket.animation.json @@ -64,61 +64,62 @@ "0.0": [0, 0, 0], "0.5": [0, 0, 0], "0.5417": [1.5, 1.5, 1.5], - "0.5667": [1, 1, 1], - "0.675": [1.05, 1.05, 1.05], + "0.5667": [0.6, 0.6, 0.6], + "0.675": [0.75, 0.75, 0.75], "0.7833": [1.1, 1.1, 1.1], "0.8917": [1.05121, 1.05121, 1.05121], - "1.0": [0.97056, 0.97056, 0.97056], - "1.0583": [0.955, 0.955, 0.955], + "1.0": [0.86056, 0.86056, 0.86056], + "1.0583": [0.775, 0.775, 0.775], "1.1667": [0.97562, 0.97562, 0.97562], - "1.275": [1.01085, 1.01085, 1.01085], + "1.275": [0.90085, 0.90085, 0.90085], "1.3833": [1.04249, 1.04249, 1.04249], - "1.4417": [1.05, 1.05, 1.05], + "1.4417": [1.22, 1.22, 1.22], "1.55": [1.03425, 1.03425, 1.03425], - "1.6583": [1.0079, 1.0079, 1.0079], + "1.6583": [0.8379, 0.8379, 0.8379], "1.7667": [0.98218, 0.98218, 0.98218], - "1.8583": [0.97, 0.97, 0.97], - "1.9667": [0.98318, 0.98318, 0.98318], - "2.075": [1.005, 1.005, 1.005], - "2.1833": [1.02682, 1.02682, 1.02682], - "2.2917": [1.04, 1.04, 1.04], - "2.4": [1.00495, 1.00495, 1.00495], - "2.5083": [0.95684, 0.95684, 0.95684], - "2.5333": [0.955, 0.955, 0.955], - "2.6417": [0.97562, 0.97562, 0.97562], - "2.75": [1.01085, 1.01085, 1.01085], - "2.8583": [1.04249, 1.04249, 1.04249], - "2.9167": [1.05, 1.05, 1.05], - "3.025": [1.03425, 1.03425, 1.03425], - "3.1333": [1.0079, 1.0079, 1.0079], - "3.2417": [0.98218, 0.98218, 0.98218], - "3.3333": [0.97, 0.97, 0.97], - "3.4417": [0.98318, 0.98318, 0.98318], - "3.55": [1.005, 1.005, 1.005], - "3.6583": [1.02682, 1.02682, 1.02682], - "3.7667": [1.04, 1.04, 1.04], - "3.875": [0.97636, 0.97636, 0.97636], - "3.9167": [0.94107, 0.94107, 0.94107], - "3.95": [0.955, 0.955, 0.955], - "4.0583": [0.99318, 0.99318, 0.99318], - "4.1667": [1.00498, 1.00498, 1.00498], - "4.275": [1.02112, 1.02112, 1.02112], - "4.325": [1.04197, 1.04197, 1.04197], - "4.3333": [1.05, 1.05, 1.05], - "4.4417": [1.04664, 1.04664, 1.04664], - "4.55": [1.00677, 1.00677, 1.00677], - "4.6583": [0.96833, 0.96833, 0.96833], - "4.7333": [0.95994, 0.95994, 0.95994], - "4.75": [0.97, 0.97, 0.97], - "4.8583": [1.00099, 1.00099, 1.00099], - "4.9667": [1.005, 1.005, 1.005], - "5.075": [1.00901, 1.00901, 1.00901], - "5.1667": [1.02741, 1.02741, 1.02741], - "5.1833": [1.04, 1.04, 1.04] + "1.8583": [0.68, 0.68, 0.68], + "1.9583": [0.75, 0.75, 0.75], + "2.0667": [1.1, 1.1, 1.1], + "2.175": [1.05121, 1.05121, 1.05121], + "2.2833": [0.86056, 0.86056, 0.86056], + "2.3417": [0.775, 0.775, 0.775], + "2.45": [0.97562, 0.97562, 0.97562], + "2.5583": [0.90085, 0.90085, 0.90085], + "2.6667": [1.04249, 1.04249, 1.04249], + "2.725": [1.22, 1.22, 1.22], + "2.8333": [1.03425, 1.03425, 1.03425], + "2.9417": [0.8379, 0.8379, 0.8379], + "3.05": [0.98218, 0.98218, 0.98218], + "3.1417": [0.68, 0.68, 0.68], + "3.2417": [0.75, 0.75, 0.75], + "3.35": [1.1, 1.1, 1.1], + "3.4583": [1.05121, 1.05121, 1.05121], + "3.5667": [0.86056, 0.86056, 0.86056], + "3.625": [0.775, 0.775, 0.775], + "3.7333": [0.97562, 0.97562, 0.97562], + "3.8417": [0.90085, 0.90085, 0.90085], + "3.95": [1.04249, 1.04249, 1.04249], + "4.0083": [1.22, 1.22, 1.22], + "4.1167": [1.03425, 1.03425, 1.03425], + "4.225": [0.8379, 0.8379, 0.8379], + "4.3333": [0.98218, 0.98218, 0.98218], + "4.425": [0.68, 0.68, 0.68], + "4.5333": [0.75, 0.75, 0.75], + "4.6417": [1.1, 1.1, 1.1], + "4.75": [1.05121, 1.05121, 1.05121], + "4.8583": [0.86056, 0.86056, 0.86056], + "4.9167": [0.775, 0.775, 0.775], + "5.025": [0.97562, 0.97562, 0.97562], + "5.1333": [0.90085, 0.90085, 0.90085], + "5.2417": [1.04249, 1.04249, 1.04249], + "5.3": [1.22, 1.22, 1.22], + "5.4083": [1.03425, 1.03425, 1.03425], + "5.5167": [0.8379, 0.8379, 0.8379], + "5.625": [0.98218, 0.98218, 0.98218], + "5.7167": [0.68, 0.68, 0.68] } } } } - }, - "geckolib_format_version": 2 + } } \ No newline at end of file diff --git a/src/main/resources/assets/superbwarfare/geo/ah_6.geo.json b/src/main/resources/assets/superbwarfare/geo/ah_6.geo.json index 87c457bb0..9868b613d 100644 --- a/src/main/resources/assets/superbwarfare/geo/ah_6.geo.json +++ b/src/main/resources/assets/superbwarfare/geo/ah_6.geo.json @@ -851,6 +851,1027 @@ } ] }, + { + "name": "glass", + "parent": "root", + "pivot": [13.64327, 34.55435, -33.8789], + "cubes": [ + { + "origin": [13.61019, 19.82637, -32.51924], + "size": [0.25, 13.2625, 0.5], + "pivot": [13.73519, 26.45762, -32.26924], + "rotation": [-5, 5, 0], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [13.08192, 17.4868, -33.15054], + "size": [0.25, 2.5125, 0.5], + "pivot": [13.20692, 18.74305, -32.90054], + "rotation": [-2.70353, 6.53139, 22.56415], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [11.55238, 15.05997, -33.20789], + "size": [0.25, 3.0125, 0.5], + "pivot": [11.67738, 16.56622, -32.95789], + "rotation": [0.01354, 7.06656, 45.21928], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [9.15591, 13.48344, -33.31978], + "size": [0.25, 3.0125, 0.5], + "pivot": [9.28091, 14.98969, -33.06978], + "rotation": [-4.2715, 6.52104, 67.87391], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [6.305, 0.04373, -33.4193], + "size": [0.25, 15.8725, 0.5], + "pivot": [6.43, 14.40998, -33.1693], + "rotation": [0, 15, 90], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-0.25, 13.76178, -40.08764], + "size": [0.25, 6.6225, 4.2], + "pivot": [-0.125, 17.07303, -37.98764], + "rotation": [0, 45, 90], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-0.25, 17.60823, -43.04044], + "size": [0.25, 6.6225, 5.2], + "pivot": [-0.125, 20.91948, -40.44044], + "rotation": [0, 67.5, 90], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-0.25, 22.13748, -43.1009], + "size": [0.25, 6.6225, 3.85], + "pivot": [-0.125, 25.44873, -41.4259], + "rotation": [0, 90, 90], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-0.25, 25.99706, -43.06104], + "size": [0.25, 6.6225, 4.66], + "pivot": [-0.125, 29.30831, -40.73104], + "rotation": [-180, 72.5, -90], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-0.25, 11.73304, -36.64936], + "size": [0.25, 6.6225, 3.35], + "pivot": [-0.125, 15.04429, -34.97436], + "rotation": [0, 20, 90], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [9.25438, 39.76269, -17.06162], + "size": [0.5, 0.25, 9.485], + "pivot": [16.38438, 39.59831, 0.93932], + "rotation": [0, 0, 45], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [11.51791, 43.48098, -22.39799], + "size": [0.5, 0.25, 5.655], + "pivot": [11.76791, 43.60598, -19.57049], + "rotation": [15.61747, -16.43322, 42.93001], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [11.73852, 41.9522, -23.70518], + "size": [0.5, 0.25, 1.75], + "pivot": [11.98852, 42.0772, -22.83018], + "rotation": [17.68198, -31.77302, 37.92253], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [12.32533, 39.28692, -29.56689], + "size": [0.5, 0.25, 6.83], + "pivot": [12.57533, 39.41192, -26.27689], + "rotation": [25.84074, -30.41349, 36.03197], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [13.31379, 33.52899, -30.46666], + "size": [0.5, 0.25, 4.13], + "pivot": [13.56379, 33.65399, -30.62666], + "rotation": [51.67557, -45.35486, 19.92448], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [13.69269, 33.17052, -30.97452], + "size": [0.5, 0.25, 0.8], + "pivot": [13.94269, 33.29552, -31.04952], + "rotation": [21.4449, -48.4343, 23.66266], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [7.82931, 31.48606, -40.93017], + "size": [0.25, 2.1, 3.4125], + "pivot": [7.64056, 33.47356, -39.22392], + "rotation": [0, 72.5, 0], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [4.62375, 31.48606, -50.29295], + "size": [0.25, 2.1, 12.2825], + "pivot": [4.435, 33.47356, -39.7167], + "rotation": [0, 90, 0], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [1.30125, 41.73864, -35.63041], + "size": [0.25, 2.25, 9.7625], + "pivot": [1.1125, 43.97614, -27.57416], + "rotation": [-180, 15, -90], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [1.30125, 43.8088, -27.50598], + "size": [0.25, 2.25, 11.0125], + "pivot": [1.1125, 46.0463, -18.19973], + "rotation": [-180, 0, -90], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [6.765, 46.11005, -9.39973], + "size": [0.25, 0.5, 15.2925], + "pivot": [6.89, 46.36005, -8.64348], + "rotation": [90, 0, -90], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [7.39521, 46.23505, -12.92848], + "size": [0.25, 0.5, 4.285], + "pivot": [7.64521, 46.48505, -8.64348], + "rotation": [90, 0, -68.75], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [1.30125, 37.8877, -40.10141], + "size": [0.25, 2.25, 7.7625], + "pivot": [1.1125, 40.1252, -34.04516], + "rotation": [-180, 35, -90], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [0.75, 34.53067, -41.41125], + "size": [0.25, 2.25, 7.4125], + "pivot": [0.875, 36.53067, -37.78], + "rotation": [-180, 53, -90], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [10.61356, 31.48606, -39.40268], + "size": [0.25, 2.1, 3.1625], + "pivot": [10.42481, 33.47356, -37.69643], + "rotation": [0, 50, 0], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [12.40982, 31.48606, -37.08667], + "size": [0.25, 2.1, 3.7], + "pivot": [12.22107, 33.47356, -35.38042], + "rotation": [0, 27.5, 0], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [13.2452, 31.48606, -33.73464], + "size": [0.25, 2.1, 3.7425], + "pivot": [13.05645, 33.47356, -33.97839], + "rotation": [0, 10, 0], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-2.43557, 45.30727, -28.20336], + "size": [2, 0.25, 10.05], + "pivot": [-0.01128, 44.26286, -23.17836], + "rotation": [90, 75, 90], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-2.15252, 46.7222, -18.93912], + "size": [2, 0.25, 4.3875], + "pivot": [0.16071, 44.26382, -23.17836], + "rotation": [67.5, 75, 85], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-2.15252, 48.86268, -15.54655], + "size": [2, 0.25, 3.0025], + "pivot": [0.16071, 44.26382, -23.17836], + "rotation": [52.5, 75, 85], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-9.40591, 13.48344, -33.31978], + "size": [0.25, 3.0125, 0.5], + "pivot": [-9.28091, 14.98969, -33.06978], + "rotation": [-4.2715, -6.52104, -67.87391], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-11.80238, 15.05997, -33.20789], + "size": [0.25, 3.0125, 0.5], + "pivot": [-11.67738, 16.56622, -32.95789], + "rotation": [0.01354, -7.06656, -45.21928], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-13.33192, 17.4868, -33.15054], + "size": [0.25, 2.5125, 0.5], + "pivot": [-13.20692, 18.74305, -32.90054], + "rotation": [-2.70353, -6.53139, -22.56415], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-13.86019, 19.82637, -32.51924], + "size": [0.25, 13.2625, 0.5], + "pivot": [-13.73519, 26.45762, -32.26924], + "rotation": [-5, -5, 0], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-13.4952, 31.48606, -33.73464], + "size": [0.25, 2.1, 3.7425], + "pivot": [-13.05645, 33.47356, -33.97839], + "rotation": [0, -10, 0], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-12.65982, 31.48606, -37.08667], + "size": [0.25, 2.1, 3.7], + "pivot": [-12.22107, 33.47356, -35.38042], + "rotation": [0, -27.5, 0], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-10.86356, 31.48606, -39.40268], + "size": [0.25, 2.1, 3.1625], + "pivot": [-10.42481, 33.47356, -37.69643], + "rotation": [0, -50, 0], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-8.07931, 31.48606, -40.93017], + "size": [0.25, 2.1, 3.4125], + "pivot": [-7.64056, 33.47356, -39.22392], + "rotation": [0, -72.5, 0], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-14.19269, 33.17052, -30.97452], + "size": [0.5, 0.25, 0.8], + "pivot": [-13.94269, 33.29552, -31.04952], + "rotation": [21.4449, 48.4343, -23.66266], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-13.81379, 33.52899, -30.46666], + "size": [0.5, 0.25, 4.13], + "pivot": [-13.56379, 33.65399, -30.62666], + "rotation": [51.67557, 45.35486, -19.92448], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-12.82533, 39.28692, -29.56689], + "size": [0.5, 0.25, 6.83], + "pivot": [-12.57533, 39.41192, -26.27689], + "rotation": [25.84074, 30.41349, -36.03197], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-12.23852, 41.9522, -23.70518], + "size": [0.5, 0.25, 1.75], + "pivot": [-11.98852, 42.0772, -22.83018], + "rotation": [17.68198, 31.77302, -37.92253], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-12.03202, 43.14613, -22.33126], + "size": [0.5, 0.25, 5.655], + "pivot": [-11.78202, 43.27113, -20.37876], + "rotation": [15.61747, 16.43322, -42.93001], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [0.15252, 48.86268, -15.54655], + "size": [2, 0.25, 3.0025], + "pivot": [-0.16071, 44.26382, -23.17836], + "rotation": [52.5, -75, -85], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [0.15252, 46.7222, -18.93912], + "size": [2, 0.25, 4.3875], + "pivot": [-0.16071, 44.26382, -23.17836], + "rotation": [67.5, -75, -85], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-9.75438, 39.76269, -17.06162], + "size": [0.5, 0.25, 9.485], + "pivot": [-16.38438, 39.59831, 0.93932], + "rotation": [0, 0, -45], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [-7.64521, 46.23505, -12.92848], + "size": [0.25, 0.5, 4.285], + "pivot": [-7.64521, 46.48505, -8.64348], + "rotation": [90, 0, 68.75], + "uv": { + "north": {"uv": [6, 88], "uv_size": [1, 1]}, + "east": {"uv": [6, 88], "uv_size": [1, 1]}, + "south": {"uv": [6, 88], "uv_size": [1, 1]}, + "west": {"uv": [6, 88], "uv_size": [1, 1]}, + "up": {"uv": [7, 89], "uv_size": [-1, -1]}, + "down": {"uv": [7, 89], "uv_size": [-1, -1]} + } + } + ] + }, + { + "name": "bone16", + "parent": "glass", + "pivot": [1.875, 46.36005, -9.64348], + "cubes": [ + { + "origin": [1.625, 33.98481, -39.85426], + "size": [0.5, 0.25, 0.5], + "pivot": [1.875, 34.10981, -39.60426], + "rotation": [90, 37, 90], + "uv": { + "up": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [4.31125, 30.08832, -40.65628], + "size": [0.25, 0.5, 0.5], + "pivot": [4.43625, 30.33832, -40.40628], + "rotation": [-180, 72.5, -90], + "uv": { + "west": {"uv": [6, 88], "uv_size": [1, 1]} + } + }, + { + "origin": [3.81125, 30.56518, -40.50593], + "size": [0.25, 0.5, 0.5], + "pivot": [3.93625, 30.81518, -40.25593], + "rotation": [-180, 72.5, -90], + "uv": { + "west": {"uv": [6, 88], "uv_size": [1, 1]} + } + }, + { + "origin": [3.81125, 14.47792, -34.35515], + "size": [0.25, 0.5, 0.5], + "pivot": [3.93625, 14.72792, -34.10515], + "rotation": [0, 20, 90], + "uv": { + "west": {"uv": [6, 88], "uv_size": [1, 1]} + } + }, + { + "origin": [4.31125, 14.64893, -34.82499], + "size": [0.25, 0.5, 0.5], + "pivot": [4.43625, 14.89893, -34.57499], + "rotation": [0, 20, 90], + "uv": { + "west": {"uv": [6, 88], "uv_size": [1, 1]} + } + }, + { + "origin": [11.55238, 16.30997, -34.20789], + "size": [0.25, 0.5, 0.5], + "pivot": [11.67738, 16.56622, -32.95789], + "rotation": [0.01354, 7.06656, 45.21928], + "uv": { + "west": {"uv": [6, 88], "uv_size": [1, 1]} + } + }, + { + "origin": [13.50753, 29.95579, -33.69256], + "size": [0.25, 0.5, 0.5], + "pivot": [13.63253, 30.20579, -33.44256], + "rotation": [-5, 5, 0], + "uv": { + "west": {"uv": [6, 88], "uv_size": [1, 1]} + } + }, + { + "origin": [13.55474, 30.41031, -33.15295], + "size": [0.25, 0.5, 0.5], + "pivot": [13.67974, 30.66031, -32.90295], + "rotation": [-5, 5, 0], + "uv": { + "west": {"uv": [6, 88], "uv_size": [1, 1]} + } + }, + { + "origin": [12.42301, 34.01277, -31.05373], + "size": [0.5, 0.25, 0.5], + "pivot": [13.17301, 34.13777, -30.80373], + "rotation": [51.6756, -45.3549, 19.9245], + "uv": { + "up": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [12.12955, 33.91053, -30.76841], + "size": [0.5, 0.25, 0.5], + "pivot": [12.87955, 34.03553, -31.26841], + "rotation": [51.6756, -45.3549, 19.9245], + "uv": { + "up": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [1.625, 45.20403, -23.98733], + "size": [0.5, 0.25, 0.5], + "pivot": [1.875, 45.32903, -23.73733], + "rotation": [90, 75, 90], + "uv": { + "up": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [2.125, 45.07462, -24.47029], + "size": [0.5, 0.25, 0.5], + "pivot": [2.375, 45.19962, -24.22029], + "rotation": [90, 75, 90], + "uv": { + "up": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [10.56156, 42.47599, -23.76981], + "size": [0.5, 0.25, 0.5], + "pivot": [10.81156, 42.56099, -23.51981], + "rotation": [44.60254, 60.30119, 79.06829], + "uv": { + "up": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [10.91795, 42.48217, -23.15912], + "size": [0.5, 0.25, 0.5], + "pivot": [11.16795, 42.56717, -22.90912], + "rotation": [44.60254, 60.30119, 79.06829], + "uv": { + "up": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [10.30119, 44.16664, -19.52229], + "size": [0.5, 0.25, 0.5], + "pivot": [10.80119, 44.29164, -19.52229], + "rotation": [18.99937, -12.32259, 29.37912], + "uv": { + "up": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [10.80119, 44.16664, -20.02229], + "size": [0.5, 0.25, 0.5], + "pivot": [10.80119, 44.29164, -19.52229], + "rotation": [18.99937, -12.32259, 29.37912], + "uv": { + "up": {"uv": [7, 89], "uv_size": [-1, -1]} + } + }, + { + "origin": [10.76956, 44.83733, -9.89348], + "size": [0.25, 0.5, 0.5], + "pivot": [10.89456, 45.08733, -9.64348], + "rotation": [90, 0, -68.75], + "uv": { + "west": {"uv": [6, 88], "uv_size": [1, 1]} + } + }, + { + "origin": [2.25, 46.11005, -10.39348], + "size": [0.25, 0.5, 0.5], + "pivot": [2.375, 46.36005, -10.14348], + "rotation": [-180, 0, -90], + "uv": { + "west": {"uv": [6, 88], "uv_size": [1, 1]} + } + }, + { + "origin": [1.75, 46.11005, -9.89348], + "size": [0.25, 0.5, 0.5], + "pivot": [1.875, 46.36005, -9.64348], + "rotation": [-180, 0, -90], + "uv": { + "west": {"uv": [6, 88], "uv_size": [1, 1]} + } + } + ] + }, + { + "name": "bone17", + "parent": "bone16", + "pivot": [-1.875, 46.36005, -9.64348], + "cubes": [ + { + "origin": [-2.125, 33.98481, -39.85426], + "size": [0.5, 0.25, 0.5], + "pivot": [-1.875, 34.10981, -39.60426], + "rotation": [90, -37, -90], + "uv": { + "up": {"uv": [6, 89], "uv_size": [1, -1]} + } + }, + { + "origin": [-4.56125, 30.08832, -40.65628], + "size": [0.25, 0.5, 0.5], + "pivot": [-4.43625, 30.33832, -40.40628], + "rotation": [-180, -72.5, 90], + "uv": { + "east": {"uv": [7, 88], "uv_size": [-1, 1]} + } + }, + { + "origin": [-4.06125, 30.56518, -40.50593], + "size": [0.25, 0.5, 0.5], + "pivot": [-3.93625, 30.81518, -40.25593], + "rotation": [-180, -72.5, 90], + "uv": { + "east": {"uv": [7, 88], "uv_size": [-1, 1]} + } + }, + { + "origin": [-4.06125, 14.47792, -34.35515], + "size": [0.25, 0.5, 0.5], + "pivot": [-3.93625, 14.72792, -34.10515], + "rotation": [0, -20, -90], + "uv": { + "east": {"uv": [7, 88], "uv_size": [-1, 1]} + } + }, + { + "origin": [-4.56125, 14.64893, -34.82499], + "size": [0.25, 0.5, 0.5], + "pivot": [-4.43625, 14.89893, -34.57499], + "rotation": [0, -20, -90], + "uv": { + "east": {"uv": [7, 88], "uv_size": [-1, 1]} + } + }, + { + "origin": [-11.80238, 16.30997, -34.20789], + "size": [0.25, 0.5, 0.5], + "pivot": [-11.67738, 16.56622, -32.95789], + "rotation": [0.01354, -7.06656, -45.21928], + "uv": { + "east": {"uv": [7, 88], "uv_size": [-1, 1]} + } + }, + { + "origin": [-13.75753, 29.95579, -33.69256], + "size": [0.25, 0.5, 0.5], + "pivot": [-13.63253, 30.20579, -33.44256], + "rotation": [-5, -5, 0], + "uv": { + "east": {"uv": [7, 88], "uv_size": [-1, 1]} + } + }, + { + "origin": [-13.80474, 30.41031, -33.15295], + "size": [0.25, 0.5, 0.5], + "pivot": [-13.67974, 30.66031, -32.90295], + "rotation": [-5, -5, 0], + "uv": { + "east": {"uv": [7, 88], "uv_size": [-1, 1]} + } + }, + { + "origin": [-12.92301, 34.01277, -31.05373], + "size": [0.5, 0.25, 0.5], + "pivot": [-13.17301, 34.13777, -30.80373], + "rotation": [51.6756, 45.3549, -19.9245], + "uv": { + "up": {"uv": [6, 89], "uv_size": [1, -1]} + } + }, + { + "origin": [-12.62955, 33.91053, -30.76841], + "size": [0.5, 0.25, 0.5], + "pivot": [-12.87955, 34.03553, -31.26841], + "rotation": [51.6756, 45.3549, -19.9245], + "uv": { + "up": {"uv": [6, 89], "uv_size": [1, -1]} + } + }, + { + "origin": [-2.125, 45.20403, -23.98733], + "size": [0.5, 0.25, 0.5], + "pivot": [-1.875, 45.32903, -23.73733], + "rotation": [90, -75, -90], + "uv": { + "up": {"uv": [6, 89], "uv_size": [1, -1]} + } + }, + { + "origin": [-2.625, 45.07462, -24.47029], + "size": [0.5, 0.25, 0.5], + "pivot": [-2.375, 45.19962, -24.22029], + "rotation": [90, -75, -90], + "uv": { + "up": {"uv": [6, 89], "uv_size": [1, -1]} + } + }, + { + "origin": [-11.06156, 42.47599, -23.76981], + "size": [0.5, 0.25, 0.5], + "pivot": [-10.81156, 42.56099, -23.51981], + "rotation": [44.60254, -60.30119, -79.06829], + "uv": { + "up": {"uv": [6, 89], "uv_size": [1, -1]} + } + }, + { + "origin": [-11.41795, 42.48217, -23.15912], + "size": [0.5, 0.25, 0.5], + "pivot": [-11.16795, 42.56717, -22.90912], + "rotation": [44.60254, -60.30119, -79.06829], + "uv": { + "up": {"uv": [6, 89], "uv_size": [1, -1]} + } + }, + { + "origin": [-10.80119, 44.16664, -19.52229], + "size": [0.5, 0.25, 0.5], + "pivot": [-10.80119, 44.29164, -19.52229], + "rotation": [18.99937, 12.32259, -29.37912], + "uv": { + "up": {"uv": [6, 89], "uv_size": [1, -1]} + } + }, + { + "origin": [-11.30119, 44.16664, -20.02229], + "size": [0.5, 0.25, 0.5], + "pivot": [-10.80119, 44.29164, -19.52229], + "rotation": [18.99937, 12.32259, -29.37912], + "uv": { + "up": {"uv": [6, 89], "uv_size": [1, -1]} + } + }, + { + "origin": [-11.01956, 44.83733, -9.89348], + "size": [0.25, 0.5, 0.5], + "pivot": [-10.89456, 45.08733, -9.64348], + "rotation": [90, 0, 68.75], + "uv": { + "east": {"uv": [7, 88], "uv_size": [-1, 1]} + } + }, + { + "origin": [-2.5, 46.11005, -10.39348], + "size": [0.25, 0.5, 0.5], + "pivot": [-2.375, 46.36005, -10.14348], + "rotation": [-180, 0, 90], + "uv": { + "east": {"uv": [7, 88], "uv_size": [-1, 1]} + } + }, + { + "origin": [-2, 46.11005, -9.89348], + "size": [0.25, 0.5, 0.5], + "pivot": [-1.875, 46.36005, -9.64348], + "rotation": [-180, 0, 90], + "uv": { + "east": {"uv": [7, 88], "uv_size": [-1, 1]} + } + } + ] + }, { "name": "body", "parent": "root", @@ -4117,8 +5138,6 @@ { "origin": [4.56422, 28.70568, 25.42359], "size": [2.58375, 1.775, 3.63472], - "pivot": [5.85609, 26.60574, 25.49095], - "rotation": [0, 0, 0], "uv": { "west": {"uv": [34, 72], "uv_size": [2, 5]}, "up": {"uv": [85, 57], "uv_size": [1, 2]}, diff --git a/src/main/resources/assets/superbwarfare/geo/heli_rocket.geo.json b/src/main/resources/assets/superbwarfare/geo/heli_rocket.geo.json new file mode 100644 index 000000000..0972a0c23 --- /dev/null +++ b/src/main/resources/assets/superbwarfare/geo/heli_rocket.geo.json @@ -0,0 +1,230 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.rpg", + "texture_width": 64, + "texture_height": 64, + "visible_bounds_width": 91, + "visible_bounds_height": 8, + "visible_bounds_offset": [0, 2, 0] + }, + "bones": [ + { + "name": "bone", + "pivot": [0, 19.5, 0] + }, + { + "name": "body", + "parent": "bone", + "pivot": [0, -18.5, 0], + "rotation": [90, 0, 0] + }, + { + "name": "bone5", + "parent": "body", + "pivot": [-0.00215, -18.54737, 10.23332], + "cubes": [ + { + "origin": [-0.23997, -19.18522, -16.12402], + "size": [0.53362, 1.28869, 34.12752], + "pivot": [0.02684, -18.54066, 3.13474], + "rotation": [0, 0, 90], + "uv": { + "north": {"uv": [9, 12], "uv_size": [1, 1]}, + "south": {"uv": [12, 10], "uv_size": [1, 1]}, + "up": {"uv": [0, 0], "uv_size": [1, 34]}, + "down": {"uv": [1, 34], "uv_size": [1, -34]} + } + }, + { + "origin": [-0.24018, -19.185, -16.12402], + "size": [0.53362, 1.28869, 34.12752], + "pivot": [0.02663, -18.54066, 9.18974], + "rotation": [0, 0, 45], + "uv": { + "north": {"uv": [12, 11], "uv_size": [1, 1]}, + "south": {"uv": [12, 12], "uv_size": [1, 1]}, + "up": {"uv": [2, 0], "uv_size": [1, 34]}, + "down": {"uv": [3, 34], "uv_size": [1, -34]} + } + }, + { + "origin": [-0.24018, -19.185, -16.12402], + "size": [0.53362, 1.28869, 34.12752], + "uv": { + "north": {"uv": [13, 0], "uv_size": [1, 1]}, + "south": {"uv": [13, 1], "uv_size": [1, 1]}, + "up": {"uv": [4, 0], "uv_size": [1, 34]}, + "down": {"uv": [5, 34], "uv_size": [1, -34]} + } + }, + { + "origin": [-0.24018, -19.185, -16.12402], + "size": [0.53362, 1.28869, 34.12752], + "pivot": [0.02663, -18.54066, 9.18974], + "rotation": [0, 0, -45], + "uv": { + "north": {"uv": [13, 2], "uv_size": [1, 1]}, + "south": {"uv": [13, 3], "uv_size": [1, 1]}, + "up": {"uv": [6, 0], "uv_size": [1, 34]}, + "down": {"uv": [7, 34], "uv_size": [1, -34]} + } + } + ] + }, + { + "name": "bone6", + "parent": "body", + "pivot": [0.02663, -18.54066, 2.15849], + "cubes": [ + { + "origin": [-0.14088, -19.80743, 16.19012], + "size": [0.33501, 2.53354, 1.73175], + "uv": { + "east": {"uv": [8, 0], "uv_size": [2, 3]}, + "south": {"uv": [10, 8], "uv_size": [1, 3]}, + "west": {"uv": [8, 3], "uv_size": [2, 3]}, + "up": {"uv": [10, 11], "uv_size": [1, 2]}, + "down": {"uv": [11, 13], "uv_size": [1, -2]} + } + }, + { + "origin": [-0.14088, -19.12759, 15.42042], + "size": [0.33501, 1.78854, 1.79175], + "pivot": [0.02662, -18.54019, 16.62249], + "rotation": [45, 0, 0], + "uv": { + "north": {"uv": [12, 0], "uv_size": [1, 2]}, + "east": {"uv": [10, 0], "uv_size": [2, 2]}, + "west": {"uv": [10, 2], "uv_size": [2, 2]}, + "up": {"uv": [12, 2], "uv_size": [1, 2]} + } + }, + { + "origin": [-0.14088, -19.80743, 16.19012], + "size": [0.33501, 2.53354, 1.73175], + "pivot": [0.02662, -18.54019, 16.62249], + "rotation": [0, 0, 90], + "uv": { + "east": {"uv": [8, 6], "uv_size": [2, 3]}, + "south": {"uv": [11, 8], "uv_size": [1, 3]}, + "west": {"uv": [8, 9], "uv_size": [2, 3]}, + "up": {"uv": [8, 12], "uv_size": [1, 2]}, + "down": {"uv": [12, 10], "uv_size": [1, -2]} + } + }, + { + "origin": [-0.14088, -19.12759, 15.42042], + "size": [0.33501, 1.78854, 1.79175], + "pivot": [0.02662, -18.54019, 16.62249], + "rotation": [45, 0, 90], + "uv": { + "north": {"uv": [12, 4], "uv_size": [1, 2]}, + "east": {"uv": [10, 4], "uv_size": [2, 2]}, + "west": {"uv": [10, 6], "uv_size": [2, 2]}, + "up": {"uv": [12, 6], "uv_size": [1, 2]} + } + } + ] + }, + { + "name": "flare", + "parent": "bone", + "pivot": [0, -0.47857, 0], + "cubes": [ + { + "origin": [-16.75, -0.45, -0.75], + "size": [16, 0, 1.5], + "uv": { + "up": {"uv": [40, 64], "uv_size": [-34, -4]}, + "down": {"uv": [40, 64], "uv_size": [-34, -4]} + } + }, + { + "origin": [-24.75, -0.45, -0.75], + "size": [24, 0, 1.5], + "pivot": [0, 0, 0], + "rotation": [0, 90, 0], + "uv": { + "up": {"uv": [40, 64], "uv_size": [-34, -4]}, + "down": {"uv": [40, 64], "uv_size": [-34, -4]} + } + }, + { + "origin": [-16.75, -0.45, -0.75], + "size": [16, 0, 1.5], + "pivot": [0, 0, 0], + "rotation": [0, 180, 0], + "uv": { + "up": {"uv": [40, 64], "uv_size": [-34, -4]}, + "down": {"uv": [40, 64], "uv_size": [-34, -4]} + } + }, + { + "origin": [-16, 14.5, -1], + "size": [32, 0, 2], + "pivot": [0, 14.5, 0], + "rotation": [135, 0, 90], + "uv": { + "up": {"uv": [40, 64], "uv_size": [-34, -4]}, + "down": {"uv": [40, 64], "uv_size": [-34, -4]} + } + }, + { + "origin": [-16, 14.5, -1], + "size": [32, 0, 2], + "pivot": [0, 14.5, 0], + "rotation": [-135, 0, 90], + "uv": { + "up": {"uv": [40, 64], "uv_size": [-34, -4]}, + "down": {"uv": [40, 64], "uv_size": [-34, -4]} + } + }, + { + "origin": [-24.75, -0.45, -0.75], + "size": [24, 0, 1.5], + "pivot": [0, 0, 0], + "rotation": [0, -90, 0], + "uv": { + "up": {"uv": [40, 64], "uv_size": [-34, -4]}, + "down": {"uv": [40, 64], "uv_size": [-34, -4]} + } + }, + { + "origin": [-2.75, -0.45, -2.75], + "size": [5.5, 0, 5.5], + "pivot": [0, -0.45, 0], + "rotation": [0, -45, 0], + "uv": { + "up": {"uv": [8, 64], "uv_size": [-4, -4]}, + "down": {"uv": [8, 64], "uv_size": [-4, -4]} + } + }, + { + "origin": [-2.5, 1.3, -2.5], + "size": [5, 0, 5], + "pivot": [0, 1.3, 0], + "rotation": [90, -45, 0], + "uv": { + "up": {"uv": [8, 64], "uv_size": [-4, -4]}, + "down": {"uv": [8, 64], "uv_size": [-4, -4]} + } + }, + { + "origin": [-2.5, 1.3, -2.5], + "size": [5, 0, 5], + "pivot": [0, 1.3, 0], + "rotation": [90, 45, 0], + "uv": { + "up": {"uv": [8, 64], "uv_size": [-4, -4]}, + "down": {"uv": [8, 64], "uv_size": [-4, -4]} + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/superbwarfare/lang/en_us.json b/src/main/resources/assets/superbwarfare/lang/en_us.json index d99e53038..49fc88afc 100644 --- a/src/main/resources/assets/superbwarfare/lang/en_us.json +++ b/src/main/resources/assets/superbwarfare/lang/en_us.json @@ -154,6 +154,7 @@ "item.superbwarfare.javelin_missile": "Javelin Missile", "item.superbwarfare.heavy_ammo": "Heavy Ammo", "item.superbwarfare.lunge_mine": "Lunge Mine", + "item.superbwarfare.rocket_70": "70mm Rocket", "block.superbwarfare.container": "Container", "des.superbwarfare.container.empty": "空的", @@ -473,5 +474,7 @@ "des.superbwarfare.revolver.sa": "SA", "des.superbwarfare.tips.ammo_type.ap": "AP SHELL", "des.superbwarfare.tips.ammo_type.he": "HE SHELL", - "des.superbwarfare.tips.ammo_type.cal50": ".50 BMG" + "des.superbwarfare.tips.ammo_type.cal50": ".50 BMG", + "des.superbwarfare.tips.ammo_type.20mm_cannon": "20MM HE", + "des.superbwarfare.tips.ammo_type.rocket": "ROCKET" } \ No newline at end of file diff --git a/src/main/resources/assets/superbwarfare/lang/zh_cn.json b/src/main/resources/assets/superbwarfare/lang/zh_cn.json index 9cd52bf81..365f5e5c4 100644 --- a/src/main/resources/assets/superbwarfare/lang/zh_cn.json +++ b/src/main/resources/assets/superbwarfare/lang/zh_cn.json @@ -154,6 +154,7 @@ "item.superbwarfare.javelin_missile": "标枪导弹", "item.superbwarfare.heavy_ammo": "重型弹药", "item.superbwarfare.lunge_mine": "突刺爆雷", + "item.superbwarfare.rocket_70": "70mm火箭弹", "block.superbwarfare.container": "集装箱", "des.superbwarfare.container.empty": "空的", @@ -473,5 +474,7 @@ "des.superbwarfare.revolver.sa": "单动", "des.superbwarfare.tips.ammo_type.ap": "AP SHELL", "des.superbwarfare.tips.ammo_type.he": "HE SHELL", - "des.superbwarfare.tips.ammo_type.cal50": ".50 BMG" + "des.superbwarfare.tips.ammo_type.cal50": ".50 BMG", + "des.superbwarfare.tips.ammo_type.20mm_cannon": "20MM HE", + "des.superbwarfare.tips.ammo_type.rocket": "ROCKET" } \ No newline at end of file diff --git a/src/main/resources/assets/superbwarfare/sounds.json b/src/main/resources/assets/superbwarfare/sounds.json index 6c464bc51..7fe1052f9 100644 --- a/src/main/resources/assets/superbwarfare/sounds.json +++ b/src/main/resources/assets/superbwarfare/sounds.json @@ -2569,5 +2569,29 @@ "stream": false } ] + }, + "into_cannon": { + "sounds": [ + { + "name": "superbwarfare:into_cannon", + "stream": false + } + ] + }, + "into_missile": { + "sounds": [ + { + "name": "superbwarfare:into_missile", + "stream": false + } + ] + }, + "missile_reload": { + "sounds": [ + { + "name": "superbwarfare:missile_reload", + "stream": false + } + ] } } \ No newline at end of file diff --git a/src/main/resources/assets/superbwarfare/sounds/into_cannon.ogg b/src/main/resources/assets/superbwarfare/sounds/into_cannon.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a9c8acdfc72466af16a9e90f01bad4f7944495d0 GIT binary patch literal 13663 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/superbwarfare/sounds/into_missile.ogg b/src/main/resources/assets/superbwarfare/sounds/into_missile.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1465cf7b7ae8db118893070db8b7fbfb932661c5 GIT binary patch literal 9160 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
    dkY7H!Lhij(ZVw*-)n2Hsxz*+UaC{! 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/superbwarfare/textures/entity/ah_6.png b/src/main/resources/assets/superbwarfare/textures/entity/ah_6.png index 4216d79650752bba7ccf59b7b22f1d9e02ef5f7a..6dddde555a664a2b6f8939d295d94e586b191338 100644 GIT binary patch delta 769 zcmV+c1OEJyfdQL=0kADRf7~_=VcBPx=uQ9-1{+0jK zw6Dp$XwS>HV%K*Qo28yMhOaphN^ALFzMNd=K|S^KGxyc6C3_#UG4Y;_$%&$W@P#k1 zU^@Wt1ONblY+?Wa06+#Y0000WgL41yAANe^?AfznVPRqUzm;+Je`2v1PMkOqcJJOD z&YU?DN~KaL6to_9eZBHm-ylv406+s3!>vTFrGgx~*v!g89V~1C0Koc?&*gIFAODrV z-RJXpvyA}&008Sle(5*&X|3#ZawQLq4Bho&vaXP_Xp>`T2Q500022e-rs|>mT`*H2}02(9+*g z2nYax^&vkuH&^qUeX&>!`F!3C1o-VA0D$!)KR-Vo!it#xQs#dymkY&WF)S=B)Kmuq z006CRIsJcWCBP6un4O(n{_TG$JTN;uyLP<<004EBFBXf-zxmJ4&o2)GmXZUP1_C?< z003b9$QKHQf0{Y~rBZ1*46yWMpj@b?>}jYV8uV`006WG zGYeqp|0@RsrBdmxWq<(yKx@jc%=}-9^DoT+SXfvHM3a+~%T)py1ONcAJ``8}qrURb zGcz+Gm&=8vLP1My007YXic1v$!>!nVKA#Ws^YhC!0shy2@zq=iA$<2c-(Ks!0<-Zx zQ2~-a1q?Elhk^hA06j@WK~$6RJ~SDCCiedWB0akm7Ie~%00000NkvXXu0mjfbBt(m delta 759 zcmVWdK>ZzxnxvzdL+54D{iT7+wP89uvFMNRo+W~+l0001F z69WJM05XUH0000Pl>3MO=+g^l&z=nn3k%Ett&Fo5i^Xu_#EGzbfA{Wi=FFK;DwRT^ zp!K-x>y^Ly260*d02-(mZY6Rp739#xW>yyJU||aY0M>_mE|)X^_^`)0YE;VH^1?#rTzZ;)o(Hq005xH)vN}%asY5Y zzx59d4MpwW+uIv`e+>WtkWMkIi0?0j0m7{(0{1HRAALQRK>z>%t1BNQ!B3O^mIeZa zLV-L0007pBd@h$u{B3_}RzR^>6D_ElG*1u!06@IFCjKq`mS3$_&9uO~O#|c~ZvX&V zPrg_zhHAAM^7;Jo6u^~(f~Eh@&(9MA003Z}$cJ11$givcf1t&Hmi~@HKmY)&5Ba&d zxtibXi^XEd=ksPDz;FKm0IVPR`T6+}R>b_5GXHbATqqWcVPRpRraB-10BCK?>HkYB z0frF5?Ck9FZ~sf-f!W#Fwd*AS0H~{cu~=OG&3}G=et8hElpMG;5a1~Q008SpzECLC z)Bz}!O3Pt@f2Ah_<#L%k0002iiQ>wC)K``S4!33iER_eoTd|zm+9{J-xlX(f^q9k3RqaYp1w!{{NEs`T6B}|4B;(EB;Xj0H8IPSpZA_UpXKs zl}dLl0}KEFT2p>y=KoThe`yB5!ootBoSa;)638F`I{<+7p}6uN^_72~nVAW>TrMmX z3R-Fd0D#t4T&e&VZpHrd`Fxn4pI@#C@W1|xujWDs;k)1Y_FDH9v++Jr0g^us3}liz p$^ZZWG)Y83RFm;OEEqJg{~tiTyA@U$mGJ-o002ovPDHLkV1nR5Yc2o) diff --git a/src/main/resources/assets/superbwarfare/textures/entity/heli_rocket.png b/src/main/resources/assets/superbwarfare/textures/entity/heli_rocket.png new file mode 100644 index 0000000000000000000000000000000000000000..1b79d6f785158d585f0c1de85a20f3a3117c6f24 GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|{&~7MhE&XX zd&7{g$w8#$;r6x{y>H&E$=TU$9^mhsuT;b+#Gkmb_tr|*GP4P;9Vw4K|JQOVn|v}Q zQtVLH-jzCwG`eo>z5O*QHL~r-o_NDo#xLvYYwSBc)-$P1{`h@zhssgA{(g?HeKuf6`rdC0{u&Ol4!umf{4D1C9aa&18Pl-b zc|vW}fwxta@zqu=GiR#K=lS&M;pHWztQA&YO&{tm;9KCv_=+J*1cR~A>+*~Ij}ubY y*|$x4`EkWLg|FZH8CX{^uLx|g0(uz^4p%dBz0x~#W@^S3keH{dpUXO@geCw9&W3gX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/superbwarfare/textures/gui/vehicle.png b/src/main/resources/assets/superbwarfare/textures/gui/vehicle.png index 02d35a6e0b988973a015467a24be7fdcb531e8c5..e30720f30e4e60de536d383cf63da53f29a81872 100644 GIT binary patch literal 1676 zcmeAS@N?(olHy`uVBq!ia0y~yU`zvI4-Ph{yJITk8%rmo`sU4ARd~RNji3LFWsv@7 zsnD~*EGKJL8?MiMHlMwKd-d$UkBogUFFAeSarD}-(_k`x~FpLK#~k!yP@8X zmV|ZXXX;yiK0iO-_-{nR&%Jy0^cWty@wP0vX2Is-y~+RjHJJD0eluYHV3x?%A(+-6 zL4f*M^jiGGpFcGpk5%oJ`~CM`pR9FR-lorAzLb1C_y6p_8|Sb4Pp_`4lY9O3*P@Sa z%dGd+{mnWKRAhd$^6u8%)o;`p@`VZ8g5r>f6)(3Re)!?I{r&y*^Vb~&+qm`fuI$-o z({AOMU6x4xGRR4QjPw>XZWgHJjhxiVXqz0pZO&MMr%u6~BW z@DPuHGO^T#0QLD_;&;0wfWqc^5sGn>mAk}w-`v=^d5)~O4};tsQk)F*+ySS#HJ9q& z3W37n&79M$D8}_^#F=aW`lhHX#(=S+fD|W#JjY%7$@BkKZbx zKM(JJ!E`xo^UR;__uA#{>v{}pEKk)6JlP&A^wjX!kD|TPKk2Q$oA-U8y&cn+Khg^S z$}Y~nxAU;gu|MxGy>I*ynROT{}?e-$Qj*#J7m J|jEv;KPW{`)Cel?Pe6Vhn!9*qvg46*wQC#?R5dS;l3(etpX4oh?84rmR!F9r>(J zf9dn5i+Ko^NvK`{@y;jrt&a8Hw)u?gv!}aqo3(G=5e?sDKfT|GA*n@D!EHw4=0E== zn$JHzy}#{h*49~k?alvRFutGR9Cm+S?e4GH4dtJY-hcj4e{1@#uiOpgm-vAN_+SHm ZKUf9oH;OI@ZAk<<&C}J-Wt~$(69E5ej1d3; literal 1882 zcmeAS@N?(olHy`uVBq!ia0y~yU`zvI4-PhSs4-PurF+x8i+uEZe&H%O*>EUc8RKY&%uH)2P6B z*E;RgBce@F>u2n5`FVc6{Zu)z1^cE?pC06;dHe0QDaKaOuSGwz2eSQ${A$4b!8nnP zL-`CtVvD3gj{$RwU|NI0Aszv@8H|TGj2$Epl4tJT@qh61XXO{S+uKsN-@dsq`S>{< zYkzu#U_yZf}Qz5VoUx$eFBX0ta%t$lN2V{-bmxqsK`zS}mR;g1i7iAdHx z`|Q5y_sw~%4D$C5|M@uarT4A>Hr1E9grYM_llz)BW?%%lyNyq!tM>xM=w=PPP2?>*M$Bi(fkjHA%IlhkW_ms#k_WPN`Bb3^fZ{rP`=mA?Sf$tP#M!|(6!_tv~8lPbybGd+1xjF)CP zFn3Qjx&8Lr8hLrfPk+P}_DO$Tw7qPG_saiTwVZ#_k52k&ZfltTj}c2;86WRIZFoRr zK1a^&ZEwn~t;^2ctE{S$+I#qAOC{s2ZL(kg&OW;gD)F)N%C4AG3`7+PXhE?mc87) z?(=lH4_%fXpMU(Y_+H#Fx$^P*qCX3ty?kEBRG{=1SQ`yC@SvfdF?~k=f;-i=CqQoV MboFyt=akR{03iPJ%>V!Z diff --git a/src/main/resources/assets/superbwarfare/textures/item/rocket_70.png b/src/main/resources/assets/superbwarfare/textures/item/rocket_70.png new file mode 100644 index 0000000000000000000000000000000000000000..91b47bac50d9d3fa924ec55e515e1949018c2d29 GIT binary patch literal 346 zcmV-g0j2(lP)Dk}+z;Fc3w*cZ096Y167mZ%8qaYRiDjoIrQT1>(Yu z&;hnq>P@rY##SkCF5GYAC3KQhAFtJs_@u9Q-6&Y>uZ9`@cNgb=kP3Gln3%nYRzy!Xhm4A$Bx sgB1W+Ym*_&%rWe_wAMmIv&9Yd124|3YD5-DfdBvi07*qoM6N<$f@5`-&j0`b literal 0 HcmV?d00001