添加YX100第三人称开火音效和炮口光效

This commit is contained in:
Atsuihsio 2025-03-04 20:50:26 +08:00
parent 3fce2339c3
commit ae56b6414a
18 changed files with 274 additions and 18 deletions

View file

@ -0,0 +1,29 @@
package com.atsuishio.superbwarfare.client.layer;
import com.atsuishio.superbwarfare.ModUtils;
import com.atsuishio.superbwarfare.client.ModRenderTypes;
import com.atsuishio.superbwarfare.entity.vehicle.Yx100Entity;
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 Yx100GlowLayer extends GeoRenderLayer<Yx100Entity> {
private static final ResourceLocation LAYER = ModUtils.loc("textures/entity/yx_100_glow.png");
public Yx100GlowLayer(GeoRenderer<Yx100Entity> entityRenderer) {
super(entityRenderer);
}
@Override
public void render(PoseStack poseStack, Yx100Entity animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) {
RenderType glowRenderType = ModRenderTypes.LASER.apply(LAYER);
getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 1, 1, 1, 1);
}
}

View file

@ -35,6 +35,7 @@ import org.joml.Math;
import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit;
import static com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay.*;
import static com.atsuishio.superbwarfare.entity.vehicle.Bmp2Entity.LOADED_MISSILE;
import static com.atsuishio.superbwarfare.entity.vehicle.Lav150Entity.COAX_HEAT;
import static com.atsuishio.superbwarfare.entity.vehicle.Lav150Entity.HEAT;
import static com.atsuishio.superbwarfare.entity.vehicle.Yx100Entity.AMMO;
@ -284,6 +285,7 @@ public class VehicleHudOverlay {
}
// 武器名称
//LAV-150
if (player.getVehicle() instanceof Lav150Entity lav) {
if (multiWeaponVehicle.getWeaponType() == 0) {
double heat = 1 - lav.getEntityData().get(HEAT) / 100.0F;
@ -294,6 +296,7 @@ public class VehicleHudOverlay {
}
}
//BMP-2
if (player.getVehicle() instanceof Bmp2Entity bmp2) {
if (multiWeaponVehicle.getWeaponType() == 0) {
double heat = 1 - bmp2.getEntityData().get(HEAT) / 100.0F;
@ -302,16 +305,17 @@ public class VehicleHudOverlay {
double heat = 1 - bmp2.getEntityData().get(COAX_HEAT) / 100.0F;
guiGraphics.drawString(mc.font, Component.literal(" 7.62MM ПКТ " + (player.getInventory().hasAnyMatching(s -> s.is(ModItems.CREATIVE_AMMO_BOX.get())) ? "" : bmp2.getAmmoCount(player))), w / 2 - 33, h - 65, Mth.hsvToRgb((float) heat / 3.745318352059925F, 1.0F, 1.0F), false);
} else {
guiGraphics.drawString(mc.font, Component.literal(" 9M113 " + bmp2.getAmmoCount(player)), w / 2 - 33, h - 65, 0x66FF00, false);
guiGraphics.drawString(mc.font, Component.literal(" 9M113 " + bmp2.getEntityData().get(LOADED_MISSILE) + " " + (player.getInventory().hasAnyMatching(s -> s.is(ModItems.CREATIVE_AMMO_BOX.get())) ? "" : bmp2.getAmmoCount(player))), w / 2 - 33, h - 65, 0x66FF00, false);
}
}
//YX-100
if (player.getVehicle() instanceof Yx100Entity yx100) {
if (multiWeaponVehicle.getWeaponType() == 0) {
guiGraphics.drawString(mc.font, Component.literal("AP SHELL " + yx100.getAmmoCount(player) + " " + yx100.getEntityData().get(AMMO)), w / 2 - 33, h - 65, 0x66FF00, false);
guiGraphics.drawString(mc.font, Component.literal("AP SHELL " + yx100.getAmmoCount(player) + " " + (player.getInventory().hasAnyMatching(s -> s.is(ModItems.CREATIVE_AMMO_BOX.get())) ? "" : yx100.getEntityData().get(AMMO))), w / 2 - 33, h - 65, 0x66FF00, false);
} else {
guiGraphics.drawString(mc.font, Component.literal("HE SHELL " + yx100.getAmmoCount(player) + " " + yx100.getEntityData().get(AMMO)), w / 2 - 33, h - 65, 0x66FF00, false);
guiGraphics.drawString(mc.font, Component.literal("HE SHELL " + yx100.getAmmoCount(player) + " " + (player.getInventory().hasAnyMatching(s -> s.is(ModItems.CREATIVE_AMMO_BOX.get())) ? "" : yx100.getEntityData().get(AMMO))), w / 2 - 33, h - 65, 0x66FF00, false);
}
}
@ -323,7 +327,7 @@ public class VehicleHudOverlay {
} else if (Minecraft.getInstance().options.getCameraType() == CameraType.THIRD_PERSON_BACK && !ClientEventHandler.zoomVehicle) {
Vec3 p = RenderHelper.worldToScreen(new Vec3(player.getX(), player.getY(), player.getZ()).add(iLand.getBarrelVec(event.getPartialTick()).scale(192)), cameraPos);
// 第三人称准星
if (p != null) {
poseStack.pushPose();
float x = (float) p.x;
@ -338,6 +342,7 @@ public class VehicleHudOverlay {
poseStack.translate(x, y, 0);
poseStack.scale(0.75f, 0.75f, 1);
//LAV-150
if (multiWeaponVehicle instanceof Lav150Entity lav1501) {
if (multiWeaponVehicle.getWeaponType() == 0) {
double heat = lav1501.getEntityData().get(HEAT) / 100.0F;
@ -347,7 +352,7 @@ public class VehicleHudOverlay {
guiGraphics.drawString(Minecraft.getInstance().font, Component.literal("7.62MM COAX " + (player.getInventory().hasAnyMatching(s -> s.is(ModItems.CREATIVE_AMMO_BOX.get())) ? "" : lav1501.getAmmoCount(player))), 30, -9, Mth.hsvToRgb(0F, (float) heat2, 1.0F), false);
}
}
//BMP-2
if (multiWeaponVehicle instanceof Bmp2Entity bmp201) {
if (multiWeaponVehicle.getWeaponType() == 0) {
double heat = bmp201.getEntityData().get(HEAT) / 100.0F;
@ -356,7 +361,15 @@ public class VehicleHudOverlay {
double heat2 = bmp201.getEntityData().get(COAX_HEAT) / 100.0F;
guiGraphics.drawString(Minecraft.getInstance().font, Component.literal("7.62MM ПКТ " + (player.getInventory().hasAnyMatching(s -> s.is(ModItems.CREATIVE_AMMO_BOX.get())) ? "" : bmp201.getAmmoCount(player))), 30, -9, Mth.hsvToRgb(0F, (float) heat2, 1.0F), false);
} else {
guiGraphics.drawString(Minecraft.getInstance().font, Component.literal("9M113 " + bmp201.getAmmoCount(player)), 30, -9, -1, false);
guiGraphics.drawString(Minecraft.getInstance().font, Component.literal("9M113 " + bmp201.getEntityData().get(LOADED_MISSILE) + " " + (player.getInventory().hasAnyMatching(s -> s.is(ModItems.CREATIVE_AMMO_BOX.get())) ? "" : bmp201.getAmmoCount(player))), 30, -9, -1, false);
}
}
//YX-100
if (multiWeaponVehicle instanceof Yx100Entity yx100) {
if (multiWeaponVehicle.getWeaponType() == 0) {
guiGraphics.drawString(Minecraft.getInstance().font, Component.literal("AP SHELL " + yx100.getAmmoCount(player) + " " + (player.getInventory().hasAnyMatching(s -> s.is(ModItems.CREATIVE_AMMO_BOX.get())) ? "" : yx100.getEntityData().get(AMMO))), 30, -9, -1, false);
} else {
guiGraphics.drawString(Minecraft.getInstance().font, Component.literal("HE SHELL " + yx100.getAmmoCount(player) + " " + (player.getInventory().hasAnyMatching(s -> s.is(ModItems.CREATIVE_AMMO_BOX.get())) ? "" : yx100.getEntityData().get(AMMO))), 30, -9, -1, false);
}
}

View file

@ -1,5 +1,6 @@
package com.atsuishio.superbwarfare.client.renderer.entity;
import com.atsuishio.superbwarfare.client.layer.Yx100GlowLayer;
import com.atsuishio.superbwarfare.client.model.entity.Yx100Model;
import com.atsuishio.superbwarfare.entity.vehicle.Yx100Entity;
import com.mojang.blaze3d.vertex.PoseStack;
@ -20,7 +21,7 @@ public class Yx100Renderer extends GeoEntityRenderer<Yx100Entity> {
public Yx100Renderer(EntityRendererProvider.Context renderManager) {
super(renderManager, new Yx100Model());
// this.addRenderLayer(new Yx100Layer(this));
this.addRenderLayer(new Yx100GlowLayer(this));
}
@Override
@ -89,7 +90,7 @@ public class Yx100Renderer extends GeoEntityRenderer<Yx100Entity> {
r2 = a / 90f;
} else {
if (a < 0) {
r2 = (180f + a) / 90f;
r2 = - (180f + a) / 90f;
} else {
r2 = (180f - a) / 90f;
}

View file

@ -292,7 +292,7 @@ public class Bmp2Entity extends ContainerMobileVehicleEntity implements GeoEntit
} else if (getWeaponType() == 1) {
this.entityData.set(AMMO, ammoCount);
} else {
this.entityData.set(AMMO, this.getEntityData().get(LOADED_MISSILE));
this.entityData.set(AMMO, countItem(ModItems.WIRE_GUIDE_MISSILE.get()));
}
}

View file

@ -12,6 +12,8 @@ import com.atsuishio.superbwarfare.tools.EntityFindUtil;
import com.atsuishio.superbwarfare.tools.ParticleTool;
import com.atsuishio.superbwarfare.tools.SoundTool;
import com.mojang.math.Axis;
import net.minecraft.client.CameraType;
import net.minecraft.client.Minecraft;
import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.nbt.CompoundTag;
@ -322,9 +324,9 @@ public class Yx100Entity extends ContainerMobileVehicleEntity implements GeoEnti
if (!player.level().isClientSide) {
if (player instanceof ServerPlayer serverPlayer) {
serverPlayer.playSound(ModSounds.BMP_CANNON_FIRE_3P.get(), 4, 1);
serverPlayer.playSound(ModSounds.LAV_CANNON_FAR.get(), 12, 1);
serverPlayer.playSound(ModSounds.LAV_CANNON_VERYFAR.get(), 24, 1);
serverPlayer.playSound(ModSounds.YX_100_FIRE_3P.get(), 8, 1);
serverPlayer.playSound(ModSounds.YX_100_FAR.get(), 16, 1);
serverPlayer.playSound(ModSounds.YX_100_VERYFAR.get(), 32, 1);
}
}
@ -335,6 +337,49 @@ public class Yx100Entity extends ContainerMobileVehicleEntity implements GeoEnti
reloadCoolDown = 80;
if (this.level() instanceof ServerLevel server) {
server.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE,
this.getX() + 5 * getBarrelVector(1).x,
this.getY() + 0.1,
this.getZ() + 5 * getBarrelVector(1).z,
300, 6, 0.02, 6, 0.005);
double x = worldPosition.x + 9 * getBarrelVector(1).x;
double y = worldPosition.y + 9 * getBarrelVector(1).y;
double z = worldPosition.z + 9 * getBarrelVector(1).z;
server.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, x, y, z, 10, 0.4, 0.4, 0.4, 0.0075);
server.sendParticles(ParticleTypes.CLOUD, x, y, z, 10, 0.4, 0.4, 0.4, 0.0075);
int count = 6;
for (float i = 9.5f; i < 23; i += .5f) {
server.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE,
worldPosition.x + i * getBarrelVector(1).x,
worldPosition.y + i * getBarrelVector(1).y,
worldPosition.z + i * getBarrelVector(1).z,
Mth.clamp(count--, 1, 5), 0.15, 0.15, 0.15, 0.0025);
}
Vector4f worldPositionL = transformPosition(transform, -0.35f, 0, 0);
Vector4f worldPositionR = transformPosition(transform, 0.35f, 0, 0);
for (float i = 3f; i < 6; i += .5f) {
server.sendParticles(ParticleTypes.CLOUD,
worldPositionL.x + i * getBarrelVector(1).x,
worldPositionL.y + i * getBarrelVector(1).y,
worldPositionL.z + i * getBarrelVector(1).z,
1, 0.025, 0.025, 0.025, 0.0015);
server.sendParticles(ParticleTypes.CLOUD,
worldPositionR.x + i * getBarrelVector(1).x,
worldPositionR.y + i * getBarrelVector(1).y,
worldPositionR.z + i * getBarrelVector(1).z,
1, 0.025, 0.025, 0.025, 0.0015);
}
}
Level level = player.level();
final Vec3 center = new Vec3(this.getX(), this.getEyeY(), this.getZ());
@ -430,8 +475,11 @@ public class Yx100Entity extends ContainerMobileVehicleEntity implements GeoEnti
diffY = Mth.wrapDegrees(gunAngle - getTurretYRot() + 0.05f);
diffX = Mth.wrapDegrees(driver.getXRot() - this.getTurretXRot());
this.setTurretXRot(Mth.clamp(this.getTurretXRot() + Mth.clamp(0.95f * diffX, -5, 5), -30f, 4f));
this.setTurretYRot(this.getTurretYRot() + Mth.clamp(0.95f * diffY, -8, 8));
float min = -5 - (float) (isInWater() && !onGround() ? 2.5 : 6) * entityData.get(DELTA_ROT);
float max = 5 - (float) (isInWater() && !onGround() ? 2.5 : 6) * entityData.get(DELTA_ROT);
this.setTurretXRot(Mth.clamp(this.getTurretXRot() + Mth.clamp(0.95f * diffX, min, max), -30f, 4f));
this.setTurretYRot(this.getTurretYRot() + Mth.clamp(0.9f * diffY, -4.5f, 4.5f));
}
@Override
@ -604,6 +652,18 @@ public class Yx100Entity extends ContainerMobileVehicleEntity implements GeoEnti
float f1 = Mth.clamp(f, -30F, 4F);
entity.xRotO += f1 - f;
entity.setXRot(entity.getXRot() + f1 - f);
if (entity.level().isClientSide && entity == getFirstPassenger()) {
Minecraft mc = Minecraft.getInstance();
if (mc.options.getCameraType() == CameraType.FIRST_PERSON) {
entity.setYBodyRot(this.getYRot());
float f2 = Mth.wrapDegrees(entity.getYRot() - this.getBarrelYRot(1));
float f3 = Mth.clamp(f2, -20.0F, 20.0F);
entity.yRotO += f3 - f2;
entity.setYRot(entity.getYRot() + f3 - f2);
entity.setYBodyRot(this.getYRot());
}
}
}
@Override

View file

@ -419,5 +419,8 @@ public class ModSounds {
public static final RegistryObject<SoundEvent> LASER_TOWER_SHOOT = REGISTRY.register("laser_tower_shoot", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("laser_tower_shoot")));
public static final RegistryObject<SoundEvent> YX_100_RELOAD = REGISTRY.register("yx_100_reload", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("yx_100_reload")));
public static final RegistryObject<SoundEvent> YX_100_FIRE_1P = REGISTRY.register("yx_100_fire_1p", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("yx_100_fire_1p")));
public static final RegistryObject<SoundEvent> YX_100_FIRE_3P = REGISTRY.register("yx_100_fire_3p", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("yx_100_fire_3p")));
public static final RegistryObject<SoundEvent> YX_100_FAR = REGISTRY.register("yx_100_far", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("yx_100_far")));
public static final RegistryObject<SoundEvent> YX_100_VERYFAR = REGISTRY.register("yx_100_veryfar", () -> SoundEvent.createVariableRangeEvent(ModUtils.loc("yx_100_veryfar")));
}

View file

@ -60,7 +60,7 @@ public class MouseHandlerMixin {
}
if (player.getVehicle() instanceof Yx100Entity) {
return ClientEventHandler.zoomVehicle ? 0.18 : 0.23;
return ClientEventHandler.zoomVehicle ? 0.17 : 0.22;
}
if (player.getVehicle() instanceof Ah6Entity ah6Entity && !ah6Entity.onGround() && ah6Entity.getFirstPassenger() == player) {

View file

@ -2,11 +2,17 @@
"format_version": "1.8.0",
"animations": {
"animation.yx100.idle": {
"loop": true
"loop": true,
"animation_length": 0.5,
"bones": {
"glow": {
"scale": 0
}
}
},
"animation.yx100.fire": {
"loop": "hold_on_last_frame",
"animation_length": 1,
"animation_length": 2,
"bones": {
"bone": {
"position": {
@ -28,6 +34,10 @@
"0.4833": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"2.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
}
},
@ -102,6 +112,16 @@
"lerp_mode": "catmullrom"
}
}
},
"glow": {
"scale": {
"0.0": [0, 0, 0],
"0.0083": [1, 1, 1],
"0.1917": [1, 1, 1],
"0.5": [0, 0, 0],
"0.9917": [0, 0, 0],
"2.0": [0, 0, 0]
}
}
}
}

View file

@ -6,7 +6,7 @@
"identifier": "geometry.unknown",
"texture_width": 1024,
"texture_height": 1024,
"visible_bounds_width": 20,
"visible_bounds_width": 81,
"visible_bounds_height": 15,
"visible_bounds_offset": [0, 0.5, 0]
},
@ -1434,6 +1434,110 @@
"parent": "barrel",
"pivot": [0.16946, 43.85243, -12.01557]
},
{
"name": "glow",
"parent": "barrelroot",
"pivot": [0.035, 41.7538, -138.23333],
"cubes": [
{
"origin": [-0.465, 41.7538, -416.4],
"size": [256, 0, 46],
"pivot": [0.035, 41.7538, -393.4],
"rotation": [0, -90, -72.5],
"uv": {
"up": {"uv": [1019.75, 508.75], "uv_size": [-148.5, -298.5]}
}
},
{
"origin": [-0.465, 41.7538, -416.4],
"size": [256, 0, 46],
"pivot": [0.035, 41.7538, -393.4],
"rotation": [0, -90, -132.5],
"uv": {
"up": {"uv": [1019.75, 508.75], "uv_size": [-148.5, -298.5]}
}
},
{
"origin": [-0.465, 41.7538, -416.4],
"size": [256, 0, 46],
"pivot": [0.035, 41.7538, -393.4],
"rotation": [0, -90, 167.5],
"uv": {
"up": {"uv": [1019.75, 508.75], "uv_size": [-148.5, -298.5]}
}
},
{
"origin": [-33.965, 41.7538, -171.9],
"size": [68, 0, 68],
"pivot": [0.035, 41.7538, -137.9],
"rotation": [90, 0, -90],
"uv": {
"up": {"uv": [1019.75, 508.75], "uv_size": [-298.5, -298.5]}
}
},
{
"origin": [-86.965, 41.7538, -153.9],
"size": [137, 0, 68],
"pivot": [0.035, 41.7538, -119.9],
"rotation": [0, -90, -90],
"uv": {
"up": {"uv": [1019.75, 508.75], "uv_size": [-298.5, -298.5]}
}
},
{
"origin": [-86.965, 41.7538, -153.9],
"size": [137, 0, 68],
"pivot": [0.035, 41.7538, -119.9],
"rotation": [0, -90, -180],
"uv": {
"up": {"uv": [1019.75, 508.75], "uv_size": [-298.5, -298.5]}
}
}
]
},
{
"name": "bone7",
"parent": "glow",
"pivot": [4.75728, 41.90479, -89.24],
"cubes": [
{
"origin": [-53.37728, 41.7505, -94.15342],
"size": [63.32, 0, 9.82685],
"pivot": [-4.75728, 41.7505, -89.24],
"rotation": [0, -90, -90],
"uv": {
"up": {"uv": [917.625, 397.75], "uv_size": [-195.875, -65.125]}
}
},
{
"origin": [-48.62, 46.66206, -93.99915],
"size": [63.32, 0, 9.5183],
"pivot": [0, 46.66206, -89.24],
"rotation": [0, -90, 0],
"uv": {
"up": {"uv": [917.625, 397.75], "uv_size": [-195.875, -65.125]}
}
},
{
"origin": [-48.62, 36.83895, -93.99915],
"size": [63.32, 0, 9.5183],
"pivot": [0, 36.83895, -89.24],
"rotation": [0, -90, -180],
"uv": {
"up": {"uv": [917.625, 397.75], "uv_size": [-195.875, -65.125]}
}
},
{
"origin": [-43.86272, 41.75052, -94.15342],
"size": [63.32, 0, 9.82685],
"pivot": [4.75728, 41.75052, -89.24],
"rotation": [0, -90, 90],
"uv": {
"up": {"uv": [917.625, 397.75], "uv_size": [-195.875, -65.125]}
}
}
]
},
{
"name": "bb_main",
"parent": "barrelroot",

View file

@ -409,6 +409,7 @@
"entity.superbwarfare.tom_6": "Tom F6F",
"entity.superbwarfare.melon_bomb": "Melon Bomb",
"entity.superbwarfare.bmp_2": "BMP-2",
"entity.superbwarfare.yx_100": "YX-100 MBT",
"entity.superbwarfare.wg_missile": "Wire Guide Missile",
"entity.superbwarfare.laser_tower": "Laser Defense Tower",

View file

@ -407,6 +407,7 @@
"entity.superbwarfare.tom_6": "汤姆 F6F",
"entity.superbwarfare.melon_bomb": "西瓜航弹",
"entity.superbwarfare.bmp_2": "BMP-2 履带式步兵战车",
"entity.superbwarfare.yx_100": "YX-100 主战坦克",
"entity.superbwarfare.wg_missile": "线控导弹",
"entity.superbwarfare.laser_tower": "激光防御塔",

View file

@ -2883,5 +2883,29 @@
"stream": false
}
]
},
"yx_100_fire_3p": {
"sounds": [
{
"name": "superbwarfare:yx100/yx100_fire_3p",
"stream": false
}
]
},
"yx_100_far": {
"sounds": [
{
"name": "superbwarfare:yx100/yx100_far",
"stream": false
}
]
},
"yx_100_veryfar": {
"sounds": [
{
"name": "superbwarfare:yx100/yx100_veryfar",
"stream": false
}
]
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 183 KiB

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB