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 000000000..a9c8acdfc Binary files /dev/null and b/src/main/resources/assets/superbwarfare/sounds/into_cannon.ogg differ 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 000000000..1465cf7b7 Binary files /dev/null and b/src/main/resources/assets/superbwarfare/sounds/into_missile.ogg differ diff --git a/src/main/resources/assets/superbwarfare/sounds/missile_reload.ogg b/src/main/resources/assets/superbwarfare/sounds/missile_reload.ogg new file mode 100644 index 000000000..fc4f1417a Binary files /dev/null and b/src/main/resources/assets/superbwarfare/sounds/missile_reload.ogg differ 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 4216d7965..6dddde555 100644 Binary files a/src/main/resources/assets/superbwarfare/textures/entity/ah_6.png and b/src/main/resources/assets/superbwarfare/textures/entity/ah_6.png differ 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 000000000..1b79d6f78 Binary files /dev/null and b/src/main/resources/assets/superbwarfare/textures/entity/heli_rocket.png differ diff --git a/src/main/resources/assets/superbwarfare/textures/gui/vehicle.png b/src/main/resources/assets/superbwarfare/textures/gui/vehicle.png index 02d35a6e0..e30720f30 100644 Binary files a/src/main/resources/assets/superbwarfare/textures/gui/vehicle.png and b/src/main/resources/assets/superbwarfare/textures/gui/vehicle.png differ 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 000000000..91b47bac5 Binary files /dev/null and b/src/main/resources/assets/superbwarfare/textures/item/rocket_70.png differ