添加快艇炮塔的过热红温效果

This commit is contained in:
Atsuihsio 2024-12-18 18:28:37 +08:00
parent 527c38d751
commit cb1b2d694f
6 changed files with 166 additions and 120 deletions

View file

@ -0,0 +1,31 @@
package com.atsuishio.superbwarfare.client.layer;
import com.atsuishio.superbwarfare.ModUtils;
import com.atsuishio.superbwarfare.entity.SpeedboatEntity;
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;
import static com.atsuishio.superbwarfare.entity.SpeedboatEntity.HEAT;
public class SpeedBoatHeatLayer extends GeoRenderLayer<SpeedboatEntity> {
private static final ResourceLocation LAYER = ModUtils.loc("textures/entity/speedboat_heat.png");
public SpeedBoatHeatLayer(GeoRenderer<SpeedboatEntity> entityRenderer) {
super(entityRenderer);
}
@Override
public void render(PoseStack poseStack, SpeedboatEntity animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) {
RenderType glowRenderType = RenderType.eyes(LAYER);
float heat = animatable.getEntityData().get(HEAT) < 20 ? 0 : animatable.getEntityData().get(HEAT) - 20;
getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, heat / 80, heat / 80, heat / 80, 1);
}
}

View file

@ -1,5 +1,6 @@
package com.atsuishio.superbwarfare.client.renderer.entity; package com.atsuishio.superbwarfare.client.renderer.entity;
import com.atsuishio.superbwarfare.client.layer.SpeedBoatHeatLayer;
import com.atsuishio.superbwarfare.client.layer.SpeedBoatLayer; import com.atsuishio.superbwarfare.client.layer.SpeedBoatLayer;
import com.atsuishio.superbwarfare.client.layer.SpeedBoatPowerLayer; import com.atsuishio.superbwarfare.client.layer.SpeedBoatPowerLayer;
import com.atsuishio.superbwarfare.client.model.entity.SpeedboatModel; import com.atsuishio.superbwarfare.client.model.entity.SpeedboatModel;
@ -22,6 +23,7 @@ public class SpeedboatRenderer extends GeoEntityRenderer<SpeedboatEntity> {
super(renderManager, new SpeedboatModel()); super(renderManager, new SpeedboatModel());
this.addRenderLayer(new SpeedBoatLayer(this)); this.addRenderLayer(new SpeedBoatLayer(this));
this.addRenderLayer(new SpeedBoatPowerLayer(this)); this.addRenderLayer(new SpeedBoatPowerLayer(this));
this.addRenderLayer(new SpeedBoatHeatLayer(this));
} }
@Override @Override

View file

@ -84,6 +84,7 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity,
public static final EntityDataAccessor<Float> POWER = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor<Float> POWER = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.FLOAT);
public static final EntityDataAccessor<Float> ROTOR = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor<Float> ROTOR = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.FLOAT);
public static final EntityDataAccessor<Integer> COOL_DOWN = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.INT); public static final EntityDataAccessor<Integer> COOL_DOWN = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.INT);
public static final EntityDataAccessor<Integer> HEAT = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.INT);
protected static final EntityDataAccessor<String> LAST_ATTACKER_UUID = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.STRING); protected static final EntityDataAccessor<String> LAST_ATTACKER_UUID = SynchedEntityData.defineId(SpeedboatEntity.class, EntityDataSerializers.STRING);
public static final float MAX_HEALTH = CannonConfig.SPEEDBOAT_HP.get(); public static final float MAX_HEALTH = CannonConfig.SPEEDBOAT_HP.get();
@ -106,7 +107,6 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity,
public float turretYRotO; public float turretYRotO;
public float turretXRotO; public float turretXRotO;
public float heat;
public boolean cannotFire; public boolean cannotFire;
public SpeedboatEntity(PlayMessages.SpawnEntity packet, Level world) { public SpeedboatEntity(PlayMessages.SpawnEntity packet, Level world) {
@ -126,6 +126,7 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity,
this.entityData.define(POWER, 0f); this.entityData.define(POWER, 0f);
this.entityData.define(ROTOR, 0f); this.entityData.define(ROTOR, 0f);
this.entityData.define(COOL_DOWN, 0); this.entityData.define(COOL_DOWN, 0);
this.entityData.define(HEAT, 0);
this.entityData.define(LAST_ATTACKER_UUID, "undefined"); this.entityData.define(LAST_ATTACKER_UUID, "undefined");
} }
@ -292,11 +293,11 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity,
this.entityData.set(COOL_DOWN, this.entityData.get(COOL_DOWN) - 1); this.entityData.set(COOL_DOWN, this.entityData.get(COOL_DOWN) - 1);
} }
if (heat > 0) { if (this.entityData.get(HEAT) > 0) {
heat--; this.entityData.set(HEAT, this.entityData.get(HEAT) - 1);
} }
if (heat < 40) { if (this.entityData.get(HEAT) < 40) {
cannotFire = false; cannotFire = false;
} }
@ -305,7 +306,7 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity,
Entity driver = this.getFirstPassenger(); Entity driver = this.getFirstPassenger();
if (driver instanceof Player player) { if (driver instanceof Player player) {
if (heat > 100) { if (this.entityData.get(HEAT) > 100) {
cannotFire = true; cannotFire = true;
if (!player.level().isClientSide() && player instanceof ServerPlayer serverPlayer) { if (!player.level().isClientSide() && player instanceof ServerPlayer serverPlayer) {
SoundTool.playLocalSound(serverPlayer, ModSounds.MINIGUN_OVERHEAT.get(), 1f, 1f); SoundTool.playLocalSound(serverPlayer, ModSounds.MINIGUN_OVERHEAT.get(), 1f, 1f);
@ -385,7 +386,7 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity,
(float) 0.4); (float) 0.4);
this.level().addFreshEntity(projectile); this.level().addFreshEntity(projectile);
float pitch = heat <= 60 ? 1 : (float) (1 - 0.015 * java.lang.Math.abs(60 - heat)); float pitch = this.entityData.get(HEAT) <= 60 ? 1 : (float) (1 - 0.011 * java.lang.Math.abs(60 - this.entityData.get(HEAT)));
if (player instanceof ServerPlayer serverPlayer) { if (player instanceof ServerPlayer serverPlayer) {
SoundTool.playLocalSound(serverPlayer, ModSounds.M_2_FIRE_1P.get(), 2, 1); SoundTool.playLocalSound(serverPlayer, ModSounds.M_2_FIRE_1P.get(), 2, 1);
@ -399,12 +400,12 @@ public class SpeedboatEntity extends Entity implements GeoEntity, IChargeEntity,
for (Entity target : level.getEntitiesOfClass(Entity.class, new AABB(center, center).inflate(4), e -> true).stream().sorted(Comparator.comparingDouble(e -> e.distanceToSqr(center))).toList()) { for (Entity target : level.getEntitiesOfClass(Entity.class, new AABB(center, center).inflate(4), e -> true).stream().sorted(Comparator.comparingDouble(e -> e.distanceToSqr(center))).toList()) {
if (target instanceof ServerPlayer serverPlayer) { if (target instanceof ServerPlayer serverPlayer) {
ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new ShakeClientMessage(6, 5, 7, this.getX(), this.getEyeY(), this.getZ())); ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new ShakeClientMessage(6, 5, 5, this.getX(), this.getEyeY(), this.getZ()));
} }
} }
if (level instanceof ServerLevel) { if (level instanceof ServerLevel) {
this.entityData.set(COOL_DOWN, 3); this.entityData.set(COOL_DOWN, 3);
heat += 4; this.entityData.set(HEAT, this.entityData.get(HEAT) + 4);
} }
this.getItemStacks().stream().filter(stack -> stack.is(ModItems.HEAVY_AMMO.get())).findFirst().ifPresent(stack -> stack.shrink(1)); this.getItemStacks().stream().filter(stack -> stack.is(ModItems.HEAVY_AMMO.get())).findFirst().ifPresent(stack -> stack.shrink(1));
} }

View file

@ -26,12 +26,19 @@
"gun": { "gun": {
"position": { "position": {
"0.0": [0, 0, 0], "0.0": [0, 0, 0],
"0.0083": [0, 0.05, 0.1], "0.0083": [-0.035, 0.05, 0.1],
"0.05": [0, -0.025, 0], "0.05": [0.035, -0.025, 0],
"0.075": [0, 0.05, 0.05], "0.075": [-0.04, 0.05, 0.05],
"0.0917": [0, 0, 0], "0.0917": [0, 0, 0],
"0.15": [0, 0, 0] "0.15": [0, 0, 0]
} }
},
"action": {
"position": {
"0.0": [0, 0, 0],
"0.0083": [0, 0, 0.85],
"0.0667": [0, 0, 0]
}
} }
} }
} }

View file

@ -382,7 +382,12 @@
{ {
"name": "barrel", "name": "barrel",
"parent": "gun", "parent": "gun",
"pivot": [-0.9802, 137.6418, 34.1014], "pivot": [-0.9802, 137.6418, 34.1014]
},
{
"name": "action",
"parent": "barrel",
"pivot": [0, 47.55715, -12.40832],
"cubes": [ "cubes": [
{ {
"origin": [-0.22291, 47.02159, -19.62486], "origin": [-0.22291, 47.02159, -19.62486],
@ -426,6 +431,114 @@
} }
] ]
}, },
{
"name": "bone18",
"parent": "action",
"pivot": [0, 47.55715, -0.15721],
"rotation": [0, 180, 0],
"cubes": [
{
"origin": [-0.31104, 46.80986, 3.84279],
"size": [0.62208, 1.49457, 1],
"pivot": [0, 47.55715, 8.89546],
"rotation": [0, 0, 22.5],
"uv": {
"south": {"uv": [3.5, 78.5], "uv_size": [0.25, 0.75]},
"up": {"uv": [12, 78.5], "uv_size": [0.25, 0.5]},
"down": {"uv": [19, 72], "uv_size": [0.25, -0.5]}
}
},
{
"origin": [-0.31104, 46.80986, 3.84279],
"size": [0.62208, 1.49457, 1],
"pivot": [0, 47.55715, 8.89546],
"rotation": [0, 0, 67.5],
"uv": {
"south": {"uv": [4.5, 78.5], "uv_size": [0.25, 0.75]},
"up": {"uv": [12.5, 78.5], "uv_size": [0.25, 0.5]},
"down": {"uv": [19, 72.5], "uv_size": [0.25, -0.5]}
}
},
{
"origin": [-0.31104, 46.80986, 3.84279],
"size": [0.62208, 1.49457, 1],
"pivot": [0, 47.55715, 8.89546],
"rotation": [0, 0, 112.5],
"uv": {
"south": {"uv": [5, 78.5], "uv_size": [0.25, 0.75]},
"up": {"uv": [19, 72.5], "uv_size": [0.25, 0.5]},
"down": {"uv": [19, 73.5], "uv_size": [0.25, -0.5]}
}
},
{
"origin": [-0.31104, 46.80986, 3.84279],
"size": [0.62208, 1.49457, 1],
"pivot": [0, 47.55715, 8.89546],
"rotation": [0, 0, 157.5],
"uv": {
"south": {"uv": [5.5, 78.5], "uv_size": [0.25, 0.75]},
"up": {"uv": [19, 73.5], "uv_size": [0.25, 0.5]},
"down": {"uv": [19, 74.5], "uv_size": [0.25, -0.5]}
}
}
]
},
{
"name": "bone17",
"parent": "action",
"pivot": [0, 47.55715, -24.65721],
"rotation": [0, 180, 0],
"cubes": [
{
"origin": [-0.25505, 46.94437, -29.67721],
"size": [0.51011, 1.22555, 2.46],
"pivot": [0, 47.55715, -28.44721],
"rotation": [0, 0, 22.5],
"uv": {
"north": {"uv": [19, 70.5], "uv_size": [0.25, 0.5]},
"south": {"uv": [19, 71], "uv_size": [0.25, 0.5]},
"up": {"uv": [12, 76.5], "uv_size": [0.25, 1.25]},
"down": {"uv": [12.5, 77.75], "uv_size": [0.25, -1.25]}
}
},
{
"origin": [-0.25505, 46.94437, -29.67721],
"size": [0.51011, 1.22555, 2.46],
"pivot": [0, 47.55715, -28.44721],
"rotation": [0, 0, 67.5],
"uv": {
"north": {"uv": [19, 69.5], "uv_size": [0.25, 0.5]},
"south": {"uv": [10.5, 78.5], "uv_size": [0.25, 0.5]},
"up": {"uv": [11, 76.5], "uv_size": [0.25, 1.25]},
"down": {"uv": [11.5, 77.75], "uv_size": [0.25, -1.25]}
}
},
{
"origin": [-0.25505, 46.94437, -29.67721],
"size": [0.51011, 1.22555, 2.46],
"pivot": [0, 47.55715, -28.44721],
"rotation": [0, 0, 112.5],
"uv": {
"north": {"uv": [19, 69], "uv_size": [0.25, 0.5]},
"south": {"uv": [10, 78.5], "uv_size": [0.25, 0.5]},
"up": {"uv": [10, 76.5], "uv_size": [0.25, 1.25]},
"down": {"uv": [10.5, 77.75], "uv_size": [0.25, -1.25]}
}
},
{
"origin": [-0.25505, 46.94437, -29.67721],
"size": [0.51011, 1.22555, 2.46],
"pivot": [0, 47.55715, -28.44721],
"rotation": [0, 0, 157.5],
"uv": {
"north": {"uv": [6, 78.5], "uv_size": [0.25, 0.5]},
"south": {"uv": [19, 67], "uv_size": [0.25, 0.5]},
"up": {"uv": [9, 76.5], "uv_size": [0.25, 1.25]},
"down": {"uv": [9.5, 77.75], "uv_size": [0.25, -1.25]}
}
}
]
},
{ {
"name": "bone16", "name": "bone16",
"parent": "barrel", "parent": "barrel",
@ -629,114 +742,6 @@
} }
] ]
}, },
{
"name": "bone17",
"parent": "barrel",
"pivot": [0, 47.55715, -24.65721],
"rotation": [0, 180, 0],
"cubes": [
{
"origin": [-0.25505, 46.94437, -29.67721],
"size": [0.51011, 1.22555, 2.46],
"pivot": [0, 47.55715, -28.44721],
"rotation": [0, 0, 22.5],
"uv": {
"north": {"uv": [19, 70.5], "uv_size": [0.25, 0.5]},
"south": {"uv": [19, 71], "uv_size": [0.25, 0.5]},
"up": {"uv": [12, 76.5], "uv_size": [0.25, 1.25]},
"down": {"uv": [12.5, 77.75], "uv_size": [0.25, -1.25]}
}
},
{
"origin": [-0.25505, 46.94437, -29.67721],
"size": [0.51011, 1.22555, 2.46],
"pivot": [0, 47.55715, -28.44721],
"rotation": [0, 0, 67.5],
"uv": {
"north": {"uv": [19, 69.5], "uv_size": [0.25, 0.5]},
"south": {"uv": [10.5, 78.5], "uv_size": [0.25, 0.5]},
"up": {"uv": [11, 76.5], "uv_size": [0.25, 1.25]},
"down": {"uv": [11.5, 77.75], "uv_size": [0.25, -1.25]}
}
},
{
"origin": [-0.25505, 46.94437, -29.67721],
"size": [0.51011, 1.22555, 2.46],
"pivot": [0, 47.55715, -28.44721],
"rotation": [0, 0, 112.5],
"uv": {
"north": {"uv": [19, 69], "uv_size": [0.25, 0.5]},
"south": {"uv": [10, 78.5], "uv_size": [0.25, 0.5]},
"up": {"uv": [10, 76.5], "uv_size": [0.25, 1.25]},
"down": {"uv": [10.5, 77.75], "uv_size": [0.25, -1.25]}
}
},
{
"origin": [-0.25505, 46.94437, -29.67721],
"size": [0.51011, 1.22555, 2.46],
"pivot": [0, 47.55715, -28.44721],
"rotation": [0, 0, 157.5],
"uv": {
"north": {"uv": [6, 78.5], "uv_size": [0.25, 0.5]},
"south": {"uv": [19, 67], "uv_size": [0.25, 0.5]},
"up": {"uv": [9, 76.5], "uv_size": [0.25, 1.25]},
"down": {"uv": [9.5, 77.75], "uv_size": [0.25, -1.25]}
}
}
]
},
{
"name": "bone18",
"parent": "barrel",
"pivot": [0, 47.55715, -0.15721],
"rotation": [0, 180, 0],
"cubes": [
{
"origin": [-0.31104, 46.80986, 3.84279],
"size": [0.62208, 1.49457, 1],
"pivot": [0, 47.55715, 8.89546],
"rotation": [0, 0, 22.5],
"uv": {
"south": {"uv": [3.5, 78.5], "uv_size": [0.25, 0.75]},
"up": {"uv": [12, 78.5], "uv_size": [0.25, 0.5]},
"down": {"uv": [19, 72], "uv_size": [0.25, -0.5]}
}
},
{
"origin": [-0.31104, 46.80986, 3.84279],
"size": [0.62208, 1.49457, 1],
"pivot": [0, 47.55715, 8.89546],
"rotation": [0, 0, 67.5],
"uv": {
"south": {"uv": [4.5, 78.5], "uv_size": [0.25, 0.75]},
"up": {"uv": [12.5, 78.5], "uv_size": [0.25, 0.5]},
"down": {"uv": [19, 72.5], "uv_size": [0.25, -0.5]}
}
},
{
"origin": [-0.31104, 46.80986, 3.84279],
"size": [0.62208, 1.49457, 1],
"pivot": [0, 47.55715, 8.89546],
"rotation": [0, 0, 112.5],
"uv": {
"south": {"uv": [5, 78.5], "uv_size": [0.25, 0.75]},
"up": {"uv": [19, 72.5], "uv_size": [0.25, 0.5]},
"down": {"uv": [19, 73.5], "uv_size": [0.25, -0.5]}
}
},
{
"origin": [-0.31104, 46.80986, 3.84279],
"size": [0.62208, 1.49457, 1],
"pivot": [0, 47.55715, 8.89546],
"rotation": [0, 0, 157.5],
"uv": {
"south": {"uv": [5.5, 78.5], "uv_size": [0.25, 0.75]},
"up": {"uv": [19, 73.5], "uv_size": [0.25, 0.5]},
"down": {"uv": [19, 74.5], "uv_size": [0.25, -0.5]}
}
}
]
},
{ {
"name": "bone19", "name": "bone19",
"parent": "barrel", "parent": "barrel",

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB