重构所有overlay

This commit is contained in:
Light_Quanta 2025-04-09 04:19:43 +08:00
parent d192fc9ef8
commit f69012702d
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
22 changed files with 354 additions and 448 deletions

View file

@ -1,8 +1,6 @@
package com.atsuishio.superbwarfare.client;
import com.atsuishio.superbwarfare.client.overlay.AmmoBarOverlay;
import com.atsuishio.superbwarfare.client.overlay.AmmoCountOverlay;
import com.atsuishio.superbwarfare.client.overlay.ArmorPlateOverlay;
import com.atsuishio.superbwarfare.client.overlay.*;
import com.atsuishio.superbwarfare.client.renderer.block.*;
import com.atsuishio.superbwarfare.client.tooltip.*;
import com.atsuishio.superbwarfare.client.tooltip.component.*;
@ -41,8 +39,25 @@ public class ClientRenderHandler {
@SubscribeEvent
public static void registerOverlays(RegisterGuiLayersEvent event) {
event.registerBelowAll(ArmorPlateOverlay.ID, new ArmorPlateOverlay());
event.registerBelowAll(JavelinHudOverlay.ID, new JavelinHudOverlay());
event.registerBelow(JavelinHudOverlay.ID, VehicleHudOverlay.ID, new VehicleHudOverlay());
event.registerBelowAll(KillMessageOverlay.ID, new KillMessageOverlay());
event.registerBelowAll(VehicleTeamOverlay.ID, new VehicleTeamOverlay());
event.registerBelowAll(VehicleMgHudOverlay.ID, new VehicleMgHudOverlay());
event.registerBelowAll(Yx100SwarmDroneHudOverlay.ID, new Yx100SwarmDroneHudOverlay());
event.registerBelowAll(AmmoBarOverlay.ID, new AmmoBarOverlay());
event.registerBelowAll(AmmoCountOverlay.ID, new AmmoCountOverlay());
event.registerBelowAll(ArmorPlateOverlay.ID, new ArmorPlateOverlay());
event.registerBelowAll(ArmRendererFixOverlay.ID, new ArmRendererFixOverlay());
event.registerBelowAll(CannonHudOverlay.ID, new CannonHudOverlay());
event.registerBelowAll(CrossHairOverlay.ID, new CrossHairOverlay());
event.registerBelowAll(DroneHudOverlay.ID, new DroneHudOverlay());
event.registerBelowAll(GrenadeLauncherOverlay.ID, new GrenadeLauncherOverlay());
event.registerBelowAll(RedTriangleOverlay.ID, new RedTriangleOverlay());
event.registerBelowAll(HandsomeFrameOverlay.ID, new HandsomeFrameOverlay());
event.registerBelowAll(SpyglassRangeOverlay.ID, new SpyglassRangeOverlay());
event.registerBelowAll(HelicopterHudOverlay.ID, new HelicopterHudOverlay());
event.registerBelowAll(MortarInfoOverlay.ID, new MortarInfoOverlay());
}
}

View file

@ -21,10 +21,12 @@ import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn;
import javax.annotation.ParametersAreNonnullByDefault;
@OnlyIn(Dist.CLIENT)
public class AmmoBarOverlay implements LayeredDraw.Layer {
public static final ResourceLocation ID = Mod.loc("ammo_bar");

View file

@ -20,9 +20,12 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.FastColor;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn;
import javax.annotation.ParametersAreNonnullByDefault;
@OnlyIn(Dist.CLIENT)
public class AmmoCountOverlay implements LayeredDraw.Layer {
public static final ResourceLocation ID = Mod.loc("ammo_count");

View file

@ -1,199 +0,0 @@
package com.atsuishio.superbwarfare.client.overlay;
import com.atsuishio.superbwarfare.Mod;
import com.atsuishio.superbwarfare.component.ModDataComponents;
import com.atsuishio.superbwarfare.entity.vehicle.base.ArmedVehicleEntity;
import com.atsuishio.superbwarfare.init.ModAttachments;
import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.item.common.ammo.AmmoSupplierItem;
import com.atsuishio.superbwarfare.item.common.ammo.box.AmmoBoxInfo;
import com.atsuishio.superbwarfare.tools.AmmoType;
import com.atsuishio.superbwarfare.tools.animation.AnimationCurves;
import com.atsuishio.superbwarfare.tools.animation.AnimationTimer;
import com.atsuishio.superbwarfare.tools.animation.ValueAnimator;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.Minecraft;
import net.minecraft.network.chat.Component;
import net.minecraft.util.FastColor;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.RenderGuiEvent;
@EventBusSubscriber(modid = Mod.MODID, value = Dist.CLIENT)
public class AmmoOverlay {
private static final AnimationTimer ammoInfoTimer = new AnimationTimer(500, 2000)
.forwardAnimation(AnimationCurves.EASE_OUT_EXPO)
.backwardAnimation(AnimationCurves.EASE_IN_EXPO);
private static final AnimationTimer ammoBoxTimer = new AnimationTimer(500)
.forwardAnimation(AnimationCurves.EASE_OUT_EXPO)
.backwardAnimation(AnimationCurves.EASE_IN_EXPO);
private static final ValueAnimator<Integer>[] ammoCountAnimators = ValueAnimator.create(
AmmoType.values().length, 800, 0
);
private static final ValueAnimator<Integer>[] ammoBoxAnimators = ValueAnimator.create(
AmmoType.values().length, 800, 0
);
/**
* 在手持弹药或弹药盒时渲染玩家弹药总量信息
*/
@SubscribeEvent
public static void renderAmmoInfo(RenderGuiEvent.Pre event) {
boolean startRenderingAmmoInfo = false;
Player player = Minecraft.getInstance().player;
if (player == null || player.isSpectator()) return;
boolean isAmmoBox = false;
// 动画计算
var currentTime = System.currentTimeMillis();
ItemStack stack = player.getMainHandItem();
if ((stack.getItem() instanceof AmmoSupplierItem || stack.getItem() == ModItems.AMMO_BOX.get()) && !(player.getVehicle() instanceof ArmedVehicleEntity vehicle && vehicle.banHand(player))) {
// 刚拿出弹药物品时视为开始弹药信息渲染
startRenderingAmmoInfo = ammoInfoTimer.getProgress(currentTime) == 0;
ammoInfoTimer.forward(currentTime);
if (stack.getItem() == ModItems.AMMO_BOX.get()) {
isAmmoBox = true;
ammoBoxTimer.forward(currentTime);
} else {
ammoBoxTimer.backward(currentTime);
}
} else {
ammoInfoTimer.backward(currentTime);
ammoBoxTimer.backward(currentTime);
}
if (!ammoInfoTimer.isForward() && ammoInfoTimer.finished(currentTime)) return;
var poseStack = event.getGuiGraphics().pose();
poseStack.pushPose();
int w = event.getGuiGraphics().guiWidth();
int h = event.getGuiGraphics().guiHeight();
var ammoX = ammoInfoTimer.lerp(w + 120, (float) w / 2 + 40, currentTime);
final int fontHeight = 15;
var yOffset = (-h - AmmoType.values().length * fontHeight) / 2f;
// 渲染总弹药数量
var cap = player.getData(ModAttachments.PLAYER_VARIABLE);
var font = Minecraft.getInstance().font;
for (var type : AmmoType.values()) {
var index = type.ordinal();
var ammoCount = type.get(cap);
var animator = ammoCountAnimators[index];
var boxAnimator = ammoBoxAnimators[index];
var boxAmmoCount = boxAnimator.newValue();
boolean boxAmmoSelected = false;
if (isAmmoBox) {
var info = stack.get(ModDataComponents.AMMO_BOX_INFO);
if (info == null) info = new AmmoBoxInfo("All", false);
var ammoBoxType = info.type();
boxAmmoCount = type.get(stack);
if (ammoBoxType.equals("All") || ammoBoxType.equals(type.name)) {
boxAnimator.forward(currentTime);
boxAmmoSelected = true;
} else {
boxAnimator.reset(boxAmmoCount);
}
}
// 首次开始渲染弹药信息时记录弹药数量便于后续播放动画
if (startRenderingAmmoInfo) {
animator.reset(ammoCount);
animator.endForward(currentTime);
if (isAmmoBox) {
boxAnimator.reset(type.get(stack));
boxAnimator.endForward(currentTime);
}
}
int ammoAdd = Integer.compare(ammoCount, animator.oldValue());
// 弹药数量变化时更新并开始播放弹药数量更改动画
animator.compareAndUpdate(ammoCount, () -> {
// 弹药数量变化时开始播放弹药数量更改动画
animator.beginForward(currentTime);
});
var progress = animator.getProgress(currentTime);
var ammoCountStr = Integer.toString(
Math.round(animator.lerp(animator.oldValue(), ammoCount, currentTime))
);
// 弹药增加时颜色由绿变白否则由红变白
var fontColor = FastColor.ARGB32.lerp(progress, switch (ammoAdd) {
case 1 -> 0xFF00FF00;
case -1 -> 0xFFFF0000;
default -> 0xFFFFFFFF;
}, 0xFFFFFFFF);
RenderSystem.setShaderColor(1, 1, 1, ammoInfoTimer.lerp(0, 1, currentTime));
// 弹药数量
event.getGuiGraphics().drawString(
font,
ammoCountStr,
ammoX + (30 - font.width(ammoCountStr)),
h + yOffset,
fontColor,
true
);
// 弹药类型
event.getGuiGraphics().drawString(
font,
Component.translatable(type.translatableKey).getString(),
ammoX + 35,
h + yOffset,
fontColor,
true
);
// 弹药盒信息渲染
RenderSystem.setShaderColor(1, 1, 1, ammoBoxTimer.lerp(0, 1, currentTime));
var ammoBoxX = ammoBoxTimer.lerp(-30, (float) w / 2, currentTime);
int ammoBoxAdd = Integer.compare(boxAmmoCount, boxAnimator.oldValue());
boxAnimator.compareAndUpdate(boxAmmoCount, () -> boxAnimator.beginForward(currentTime));
// 选中时显示为黄色否则为白色
var targetColor = boxAmmoSelected ? 0xFFFFFF00 : 0xFFFFFFFF;
var boxFontColor = FastColor.ARGB32.lerp(boxAnimator.getProgress(currentTime),
switch (ammoBoxAdd) {
case 1 -> 0xFF00FF00;
case -1 -> 0xFFFF0000;
default -> targetColor;
},
targetColor
);
// 弹药盒内弹药数量
event.getGuiGraphics().drawString(
Minecraft.getInstance().font,
Integer.toString(
Math.round(boxAnimator.lerp(boxAnimator.oldValue(), boxAmmoCount, currentTime))
),
ammoBoxX - 70,
h + yOffset,
boxFontColor,
true
);
yOffset += fontHeight;
}
RenderSystem.setShaderColor(1, 1, 1, 1);
poseStack.popPose();
}
}

View file

@ -1,24 +1,32 @@
package com.atsuishio.superbwarfare.client.overlay;
import com.atsuishio.superbwarfare.Mod;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.LayeredDraw;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Player;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.RenderGuiEvent;
import net.neoforged.api.distmarker.OnlyIn;
@EventBusSubscriber(value = Dist.CLIENT)
public class ArmRendererFixOverlay {
import javax.annotation.ParametersAreNonnullByDefault;
@SubscribeEvent
public static void eventHandler(RenderGuiEvent.Pre event) {
int w = event.getGuiGraphics().guiWidth();
int h = event.getGuiGraphics().guiHeight();
@OnlyIn(Dist.CLIENT)
public class ArmRendererFixOverlay implements LayeredDraw.Layer {
public static final ResourceLocation ID = Mod.loc("arm_renderer_fix");
@Override
@ParametersAreNonnullByDefault
public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) {
int w = guiGraphics.guiWidth();
int h = guiGraphics.guiHeight();
Player entity = Minecraft.getInstance().player;
if (entity != null) {
// TODO what is this?
// InventoryScreen.renderEntityInInventoryFollowsAngle(
// event.getGuiGraphics(),
// guiGraphics,
// w / 2 - 114514,
// h / 2 + 22,
// 1,

View file

@ -12,10 +12,12 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn;
import javax.annotation.ParametersAreNonnullByDefault;
@OnlyIn(Dist.CLIENT)
public class ArmorPlateOverlay implements LayeredDraw.Layer {
public static final ResourceLocation ID = Mod.loc("armor_plate");

View file

@ -16,10 +16,13 @@ import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Camera;
import net.minecraft.client.CameraType;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.LayeredDraw;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
@ -28,25 +31,27 @@ import net.minecraft.world.level.ClipContext;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.RenderGuiEvent;
import net.neoforged.api.distmarker.OnlyIn;
import org.joml.Math;
import javax.annotation.ParametersAreNonnullByDefault;
import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit;
import static com.atsuishio.superbwarfare.client.overlay.VehicleHudOverlay.renderKillIndicator;
import static com.atsuishio.superbwarfare.client.overlay.VehicleHudOverlay.renderKillIndicator3P;
@EventBusSubscriber(value = Dist.CLIENT)
public class CannonHudOverlay {
@OnlyIn(Dist.CLIENT)
public class CannonHudOverlay implements LayeredDraw.Layer {
@SubscribeEvent
public static void eventHandler(RenderGuiEvent.Pre event) {
int w = event.getGuiGraphics().guiWidth();
int h = event.getGuiGraphics().guiHeight();
public static final ResourceLocation ID = Mod.loc("cannon_hud");
@Override
@ParametersAreNonnullByDefault
public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) {
int w = guiGraphics.guiWidth();
int h = guiGraphics.guiHeight();
Minecraft mc = Minecraft.getInstance();
Player player = mc.player;
GuiGraphics guiGraphics = event.getGuiGraphics();
PoseStack poseStack = guiGraphics.pose();
Camera camera = mc.gameRenderer.getMainCamera();
Vec3 cameraPos = camera.getPosition();
@ -63,23 +68,23 @@ public class CannonHudOverlay {
RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
RenderSystem.setShaderColor(1, 1, 1, 1);
preciseBlit(event.getGuiGraphics(), Mod.loc("textures/screens/compass_white.png"), (float) w / 2 - 128, (float) 10, 128 + ((float) 64 / 45 * (Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), cannon.yRotO, cannon.getYRot()))), 0, 256, 16, 512, 16);
preciseBlit(event.getGuiGraphics(), Mod.loc("textures/screens/roll_ind_white.png"), w / 2F - 4, 27, 0, 0.0F, 8, 8, 8, 8);
preciseBlit(guiGraphics, Mod.loc("textures/screens/compass_white.png"), (float) w / 2 - 128, (float) 10, 128 + ((float) 64 / 45 * (Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), cannon.yRotO, cannon.getYRot()))), 0, 256, 16, 512, 16);
preciseBlit(guiGraphics, Mod.loc("textures/screens/roll_ind_white.png"), w / 2F - 4, 27, 0, 0.0F, 8, 8, 8, 8);
String angle = FormatTool.DECIMAL_FORMAT_1ZZ.format(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), cannon.yRotO, cannon.getYRot()));
String angle = FormatTool.DECIMAL_FORMAT_1ZZ.format(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), cannon.yRotO, cannon.getYRot()));
int width = Minecraft.getInstance().font.width(angle);
event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.literal(angle), w / 2 - width / 2, 40, -1, false);
guiGraphics.drawString(Minecraft.getInstance().font, Component.literal(angle), w / 2 - width / 2, 40, -1, false);
preciseBlit(event.getGuiGraphics(), Mod.loc("textures/screens/cannon/cannon_pitch.png"), w / 2F + 166, h / 2F - 64, 0, 0.0F, 8, 128, 8, 128);
preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/cannon_pitch.png"), w / 2F + 166, h / 2F - 64, 0, 0.0F, 8, 128, 8, 128);
String pitch = FormatTool.DECIMAL_FORMAT_1ZZ.format(-Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), cannon.xRotO, cannon.getXRot()));
String pitch = FormatTool.DECIMAL_FORMAT_1ZZ.format(-Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), cannon.xRotO, cannon.getXRot()));
int widthP = Minecraft.getInstance().font.width(pitch);
poseStack.pushPose();
event.getGuiGraphics().pose().translate(0, Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), cannon.xRotO, cannon.getXRot()) * 0.7, 0);
preciseBlit(event.getGuiGraphics(), Mod.loc("textures/screens/cannon/cannon_pitch_ind.png"), w / 2F + 158, h / 2F - 4, 0, 0.0F, 8, 8, 8, 8);
event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.literal(pitch), w / 2 + 157 - widthP, h / 2 - 4, -1, false);
guiGraphics.pose().translate(0, Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), cannon.xRotO, cannon.getXRot()) * 0.7, 0);
preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/cannon_pitch_ind.png"), w / 2F + 158, h / 2F - 4, 0, 0.0F, 8, 8, 8, 8);
guiGraphics.drawString(Minecraft.getInstance().font, Component.literal(pitch), w / 2 + 157 - widthP, h / 2 - 4, -1, false);
poseStack.popPose();
if (Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON || ClientEventHandler.zoomVehicle) {
@ -111,32 +116,32 @@ public class CannonHudOverlay {
if (lookingEntity.getDisplayName() != null) {
component.append(lookingEntity.getDisplayName());
}
event.getGuiGraphics().drawString(Minecraft.getInstance().font, component, w / 2 + 14, h / 2 - 20, -1, false);
guiGraphics.drawString(Minecraft.getInstance().font, component, w / 2 + 14, h / 2 - 20, -1, false);
} else {
if (blockRange > 511) {
event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.drone.range")
guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.drone.range")
.append(Component.literal("---m")), w / 2 + 14, h / 2 - 20, -1, false);
} else {
event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.drone.range")
guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.drone.range")
.append(Component.literal(FormatTool.format1D(blockRange, "m"))),
w / 2 + 14, h / 2 - 20, -1, false);
}
}
if (cannon instanceof AnnihilatorEntity) {
preciseBlit(event.getGuiGraphics(), Mod.loc("textures/screens/cannon/laser_cannon_crosshair.png"), k, l, 0, 0.0F, i, j, i, j);
preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/laser_cannon_crosshair.png"), k, l, 0, 0.0F, i, j, i, j);
} else {
preciseBlit(event.getGuiGraphics(), Mod.loc("textures/screens/cannon/cannon_crosshair.png"), k, l, 0, 0.0F, i, j, i, j);
preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/cannon_crosshair.png"), k, l, 0, 0.0F, i, j, i, j);
}
float diffY = -Mth.wrapDegrees(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.yHeadRotO, player.getYHeadRot()) - Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), cannon.yRotO, cannon.getYRot()));
float diffY = -Mth.wrapDegrees(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.yHeadRotO, player.getYHeadRot()) - Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), cannon.yRotO, cannon.getYRot()));
preciseBlit(event.getGuiGraphics(), Mod.loc("textures/screens/cannon/indicator.png"), w / 2F - 4.3f + 0.45f * diffY, h / 2F - 10, 0, 0.0F, 8, 8, 8, 8);
preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/indicator.png"), w / 2F - 4.3f + 0.45f * diffY, h / 2F - 10, 0, 0.0F, 8, 8, 8, 8);
} else {
preciseBlit(event.getGuiGraphics(), Mod.loc("textures/screens/cannon/cannon_crosshair_notzoom.png"), k, l, 0, 0.0F, i, j, i, j);
preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/cannon_crosshair_notzoom.png"), k, l, 0, 0.0F, i, j, i, j);
}
renderKillIndicator(guiGraphics, w, h);
} else if (Minecraft.getInstance().options.getCameraType() == CameraType.THIRD_PERSON_BACK && !ClientEventHandler.zoomVehicle) {
Vec3 p = RenderHelper.worldToScreen(new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.yo, player.getY()),
Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.zo, player.getZ())).add(cannon.getViewVector(event.getPartialTick().getGameTimeDeltaPartialTick(true)).scale(128)), cameraPos);
Vec3 p = RenderHelper.worldToScreen(new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.yo, player.getY()),
Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.zo, player.getZ())).add(cannon.getViewVector(deltaTracker.getGameTimeDeltaPartialTick(true)).scale(128)), cameraPos);
// 第三人称准星
if (p != null) {

View file

@ -16,23 +16,30 @@ import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Axis;
import net.minecraft.client.CameraType;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.LayeredDraw;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.ClientTickEvent;
import net.neoforged.neoforge.client.event.RenderGuiEvent;
import javax.annotation.ParametersAreNonnullByDefault;
import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit;
@EventBusSubscriber(value = Dist.CLIENT)
public class CrossHairOverlay {
@OnlyIn(Dist.CLIENT)
@EventBusSubscriber(modid = Mod.MODID, value = Dist.CLIENT)
public class CrossHairOverlay implements LayeredDraw.Layer {
public static final ResourceLocation ID = Mod.loc("cross_hair");
private static final ResourceLocation REX_HORIZONTAL = Mod.loc("textures/screens/rex_horizontal.png");
private static final ResourceLocation REX_VERTICAL = Mod.loc("textures/screens/rex_vertical.png");
@ -44,10 +51,11 @@ public class CrossHairOverlay {
private static float scopeScale = 1f;
public static float gunRot;
@SubscribeEvent
public static void eventHandler(RenderGuiEvent.Pre event) {
int w = event.getGuiGraphics().guiWidth();
int h = event.getGuiGraphics().guiHeight();
@Override
@ParametersAreNonnullByDefault
public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) {
int w = guiGraphics.guiWidth();
int h = guiGraphics.guiHeight();
Player player = Minecraft.getInstance().player;
if (player == null) {
@ -59,11 +67,9 @@ public class CrossHairOverlay {
if (!player.getMainHandItem().is(ModTags.Items.GUN) || (player.getVehicle() instanceof ArmedVehicleEntity iArmedVehicle && iArmedVehicle.banHand(player)))
return;
GuiGraphics guiGraphics = event.getGuiGraphics();
ItemStack stack = player.getMainHandItem();
double spread = ClientEventHandler.gunSpread + 1 * ClientEventHandler.firePos;
float deltaFrame = event.getPartialTick().getGameTimeDeltaPartialTick(true);
float deltaFrame = deltaTracker.getGameTimeDeltaPartialTick(true);
float moveX = 0;
float moveY = 0;

View file

@ -12,8 +12,10 @@ import com.atsuishio.superbwarfare.tools.SeekTool;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.LayeredDraw;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
@ -25,33 +27,34 @@ import net.minecraft.world.level.ClipContext;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.RenderGuiEvent;
import net.neoforged.api.distmarker.OnlyIn;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit;
import static com.atsuishio.superbwarfare.entity.vehicle.DroneEntity.AMMO;
import static com.atsuishio.superbwarfare.entity.vehicle.DroneEntity.KAMIKAZE_MODE;
@EventBusSubscriber(value = Dist.CLIENT)
public class DroneUIOverlay {
@OnlyIn(Dist.CLIENT)
public class DroneHudOverlay implements LayeredDraw.Layer {
public static final ResourceLocation ID = Mod.loc("drone_hud");
public static int MAX_DISTANCE = 256;
private static final ResourceLocation FRAME = Mod.loc("textures/screens/frame/frame.png");
@SubscribeEvent
public static void eventHandler(RenderGuiEvent.Pre event) {
int w = event.getGuiGraphics().guiWidth();
int h = event.getGuiGraphics().guiHeight();
@Override
@ParametersAreNonnullByDefault
public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) {
int w = guiGraphics.guiWidth();
int h = guiGraphics.guiHeight();
Minecraft mc = Minecraft.getInstance();
Player player = mc.player;
if (player == null) return;
GuiGraphics guiGraphics = event.getGuiGraphics();
PoseStack poseStack = guiGraphics.pose();
ItemStack stack = player.getMainHandItem();
@ -149,8 +152,8 @@ public class DroneUIOverlay {
double zoom = 0.975 * ClientEventHandler.droneFovLerp + 0.06 * fovAdjust2;
for (var e : entities) {
Vec3 droneVec = new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), entity.xo, entity.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), entity.yo + entity.getEyeHeight(), entity.getEyeY()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), entity.zo, entity.getZ()));
Vec3 pos = new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), e.xo, e.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), e.yo + e.getEyeHeight(), e.getEyeY()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), e.zo, e.getZ()));
Vec3 droneVec = new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), entity.xo, entity.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), entity.yo + entity.getEyeHeight(), entity.getEyeY()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), entity.zo, entity.getZ()));
Vec3 pos = new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), e.xo, e.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), e.yo + e.getEyeHeight(), e.getEyeY()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), e.zo, e.getZ()));
Vec3 lookAngle = entity.getLookAngle().normalize().scale(pos.distanceTo(droneVec) * (1 - 1.0 / zoom));
@ -161,7 +164,7 @@ public class DroneUIOverlay {
float x = (float) point.x;
float y = (float) point.y;
RenderHelper.preciseBlit(event.getGuiGraphics(), FRAME, x - 12, y - 12, 24, 24, 0, 0, 24, 24, 24, 24);
RenderHelper.preciseBlit(guiGraphics, FRAME, x - 12, y - 12, 24, 24, 0, 0, 24, 24, 24, 24);
poseStack.popPose();
}
}

View file

@ -9,22 +9,28 @@ import com.atsuishio.superbwarfare.init.ModItems;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.CameraType;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.LayeredDraw;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Player;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.RenderGuiEvent;
import net.neoforged.api.distmarker.OnlyIn;
@EventBusSubscriber(value = Dist.CLIENT)
public class GrenadeLauncherOverlay {
import javax.annotation.ParametersAreNonnullByDefault;
@SubscribeEvent
public static void eventHandler(RenderGuiEvent.Pre event) {
int w = event.getGuiGraphics().guiWidth();
int h = event.getGuiGraphics().guiHeight();
@OnlyIn(Dist.CLIENT)
public class GrenadeLauncherOverlay implements LayeredDraw.Layer {
public static final ResourceLocation ID = Mod.loc("grenade_launcher");
@Override
@ParametersAreNonnullByDefault
public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) {
int w = guiGraphics.guiWidth();
int h = guiGraphics.guiHeight();
Player player = Minecraft.getInstance().player;
if (player == null) return;
@ -35,7 +41,6 @@ public class GrenadeLauncherOverlay {
return;
if (!shouldRenderCrossHair(player)) return;
GuiGraphics guiGraphics = event.getGuiGraphics();
guiGraphics.pose().pushPose();

View file

@ -12,7 +12,10 @@ import com.atsuishio.superbwarfare.tools.SeekTool;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.LayeredDraw;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
@ -21,25 +24,26 @@ import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.phys.Vec3;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.EventPriority;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.RenderGuiEvent;
import net.neoforged.api.distmarker.OnlyIn;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
@EventBusSubscriber(value = Dist.CLIENT)
public class HandsomeFrameOverlay {
@OnlyIn(Dist.CLIENT)
public class HandsomeFrameOverlay implements LayeredDraw.Layer {
public static final ResourceLocation ID = Mod.loc("handsome_frame");
private static final ResourceLocation FRAME = Mod.loc("textures/screens/frame/frame.png");
private static final ResourceLocation FRAME_WEAK = Mod.loc("textures/screens/frame/frame_weak.png");
private static final ResourceLocation FRAME_TARGET = Mod.loc("textures/screens/frame/frame_target.png");
private static final ResourceLocation FRAME_LOCK = Mod.loc("textures/screens/frame/frame_lock.png");
@SubscribeEvent(priority = EventPriority.LOWEST)
public static void eventHandler(RenderGuiEvent.Pre event) {
@Override
@ParametersAreNonnullByDefault
public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) {
Player player = Minecraft.getInstance().player;
PoseStack poseStack = event.getGuiGraphics().pose();
PoseStack poseStack = guiGraphics.pose();
if (player != null) {
ItemStack stack = player.getMainHandItem();
@ -75,8 +79,8 @@ public class HandsomeFrameOverlay {
}
for (var e : allEntities) {
Vec3 playerVec = new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.yo + player.getEyeHeight(), player.getEyeY()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.zo, player.getZ()));
Vec3 pos = new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), e.xo, e.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), e.yo + e.getEyeHeight(), e.getEyeY()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), e.zo, e.getZ()));
Vec3 playerVec = new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.yo + player.getEyeHeight(), player.getEyeY()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.zo, player.getZ()));
Vec3 pos = new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), e.xo, e.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), e.yo + e.getEyeHeight(), e.getEyeY()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), e.zo, e.getZ()));
Vec3 lookAngle = player.getLookAngle().normalize().scale(pos.distanceTo(playerVec) * (1 - 1.0 / zoom));
var cPos = playerVec.add(lookAngle);
@ -105,7 +109,7 @@ public class HandsomeFrameOverlay {
icon = FRAME_WEAK;
}
RenderHelper.preciseBlit(event.getGuiGraphics(), icon, x - 12, y - 12, 24, 24, 0, 0, 24, 24, 24, 24);
RenderHelper.preciseBlit(guiGraphics, icon, x - 12, y - 12, 24, 24, 0, 0, 24, 24, 24, 24);
poseStack.popPose();
}
}

View file

@ -17,44 +17,48 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Axis;
import net.minecraft.client.Camera;
import net.minecraft.client.CameraType;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.LayeredDraw;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.ClipContext;
import net.minecraft.world.phys.Vec3;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.EventPriority;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.RenderGuiEvent;
import net.neoforged.api.distmarker.OnlyIn;
import org.joml.Math;
import org.joml.Matrix4f;
import org.joml.Vector4f;
import javax.annotation.ParametersAreNonnullByDefault;
import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit;
import static com.atsuishio.superbwarfare.entity.vehicle.base.MobileVehicleEntity.HEAT;
@EventBusSubscriber(value = Dist.CLIENT)
public class HelicopterHudOverlay {
@OnlyIn(Dist.CLIENT)
public class HelicopterHudOverlay implements LayeredDraw.Layer {
public static final ResourceLocation ID = Mod.loc("helicopter_hud");
private static float scopeScale = 1;
private static float lerpVy = 1;
private static float lerpPower = 1;
@SubscribeEvent(priority = EventPriority.LOWEST)
public static void eventHandler(RenderGuiEvent.Pre event) {
int w = event.getGuiGraphics().guiWidth();
int h = event.getGuiGraphics().guiHeight();
@Override
@ParametersAreNonnullByDefault
public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) {
int w = guiGraphics.guiWidth();
int h = guiGraphics.guiHeight();
Minecraft mc = Minecraft.getInstance();
Player player = mc.player;
Camera camera = mc.gameRenderer.getMainCamera();
Vec3 cameraPos = camera.getPosition();
GuiGraphics guiGraphics = event.getGuiGraphics();
PoseStack poseStack = guiGraphics.pose();
if (player == null) return;
@ -72,7 +76,7 @@ public class HelicopterHudOverlay {
RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
RenderSystem.setShaderColor(1, 1, 1, 1);
scopeScale = Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), scopeScale, 1F);
scopeScale = Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), scopeScale, 1F);
float f = (float) Math.min(w, h);
float f1 = Math.min((float) w / f, (float) h / f) * scopeScale;
float i = Mth.floor(f * f1);
@ -82,18 +86,18 @@ public class HelicopterHudOverlay {
if (Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON) {
preciseBlit(guiGraphics, Mod.loc("textures/screens/helicopter/heli_base.png"), k, l, 0, 0.0F, i, j, i, j);
renderDriverAngle(guiGraphics, player, mobileVehicle, k, l, i, j, event.getPartialTick().getGameTimeDeltaPartialTick(true));
renderDriverAngle(guiGraphics, player, mobileVehicle, k, l, i, j, deltaTracker.getGameTimeDeltaPartialTick(true));
preciseBlit(guiGraphics, Mod.loc("textures/screens/compass.png"), (float) w / 2 - 128, (float) 6, 128 + ((float) 64 / 45 * mobileVehicle.getYRot()), 0, 256, 16, 512, 16);
poseStack.pushPose();
poseStack.rotateAround(Axis.ZP.rotationDegrees(-iHelicopterEntity.getRotZ(event.getPartialTick().getGameTimeDeltaPartialTick(true))), w / 2f, h / 2f, 0);
float pitch = iHelicopterEntity.getRotX(event.getPartialTick().getGameTimeDeltaPartialTick(true));
poseStack.rotateAround(Axis.ZP.rotationDegrees(-iHelicopterEntity.getRotZ(deltaTracker.getGameTimeDeltaPartialTick(true))), w / 2f, h / 2f, 0);
float pitch = iHelicopterEntity.getRotX(deltaTracker.getGameTimeDeltaPartialTick(true));
preciseBlit(guiGraphics, Mod.loc("textures/screens/helicopter/heli_line.png"), (float) w / 2 - 128, (float) h / 2 - 512 - 5.475f * pitch, 0, 0, 256, 1024, 256, 1024);
poseStack.popPose();
poseStack.pushPose();
poseStack.rotateAround(Axis.ZP.rotationDegrees(iHelicopterEntity.getRotZ(event.getPartialTick().getGameTimeDeltaPartialTick(true))), w / 2f, h / 2f - 56, 0);
poseStack.rotateAround(Axis.ZP.rotationDegrees(iHelicopterEntity.getRotZ(deltaTracker.getGameTimeDeltaPartialTick(true))), w / 2f, h / 2f - 56, 0);
preciseBlit(guiGraphics, Mod.loc("textures/screens/helicopter/roll_ind.png"), (float) w / 2 - 8, (float) h / 2 - 88, 0, 0, 16, 16, 16, 16);
poseStack.popPose();
@ -105,9 +109,9 @@ public class HelicopterHudOverlay {
ClipContext.Block.OUTLINE, ClipContext.Fluid.ANY, mobileVehicle)).getBlockPos())));
float power = iHelicopterEntity.getPower();
lerpPower = Mth.lerp(0.001f * event.getPartialTick().getGameTimeDeltaPartialTick(true), lerpPower, power);
lerpPower = Mth.lerp(0.001f * deltaTracker.getGameTimeDeltaPartialTick(true), lerpPower, power);
preciseBlit(guiGraphics, Mod.loc("textures/screens/helicopter/heli_power.png"), (float) w / 2 + 130f, ((float) h / 2 - 64 + 124 - power * 980), 0, 0, 4, power * 980, 4, power * 980);
lerpVy = (float) Mth.lerp(0.021f * event.getPartialTick().getGameTimeDeltaPartialTick(true), lerpVy, mobileVehicle.getDeltaMovement().y());
lerpVy = (float) Mth.lerp(0.021f * deltaTracker.getGameTimeDeltaPartialTick(true), lerpVy, mobileVehicle.getDeltaMovement().y());
preciseBlit(guiGraphics, Mod.loc("textures/screens/helicopter/heli_vy_move.png"), (float) w / 2 + 138, ((float) h / 2 - 3 - Math.max(lerpVy * 20, -24) * 2.5f), 0, 0, 8, 8, 8, 8);
guiGraphics.drawString(Minecraft.getInstance().font, Component.literal(FormatTool.format0D(lerpVy * 20, "m/s")),
w / 2 + 146, (int) (h / 2 - 3 - Math.max(lerpVy * 20, -24) * 2.5), (lerpVy * 20 < -24 || ((lerpVy * 20 < -10 || (lerpVy * 20 < -1 && length(mobileVehicle.getDeltaMovement().x, mobileVehicle.getDeltaMovement().y, mobileVehicle.getDeltaMovement().z) * 72 > 100)) && height < 36) || (length(mobileVehicle.getDeltaMovement().x, mobileVehicle.getDeltaMovement().y, mobileVehicle.getDeltaMovement().z) * 72 > 40 && blockInWay < 72) ? -65536 : 0x66FF00), false);
@ -148,7 +152,7 @@ public class HelicopterHudOverlay {
}
Matrix4f transform = getVehicleTransform(mobileVehicle, event.getPartialTick().getGameTimeDeltaPartialTick(true));
Matrix4f transform = getVehicleTransform(mobileVehicle, deltaTracker.getGameTimeDeltaPartialTick(true));
float x0 = 0f;
float y0 = 0.65f;
float z0 = 0.8f;
@ -158,12 +162,12 @@ public class HelicopterHudOverlay {
float fovAdjust2 = (float) (Minecraft.getInstance().options.fov().get() / 30) - 1;
double zoom = 0.96 * 3 + 0.06 * fovAdjust2;
Vec3 pos = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).add(mobileVehicle.getViewVector(event.getPartialTick().getGameTimeDeltaPartialTick(true)).scale(192));
Vec3 pos = new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).add(mobileVehicle.getViewVector(deltaTracker.getGameTimeDeltaPartialTick(true)).scale(192));
Vec3 lookAngle = player.getLookAngle().normalize().scale(pos.distanceTo(cameraPos) * (1 - 1.0 / zoom));
var cPos = cameraPos.add(lookAngle);
Vec3 p = RenderHelper.worldToScreen(new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).add(mobileVehicle.getViewVector(event.getPartialTick().getGameTimeDeltaPartialTick(true)).scale(192)), ClientEventHandler.zoomVehicle ? cPos : cameraPos);
Vec3 p = RenderHelper.worldToScreen(new Vec3(worldPosition.x, worldPosition.y, worldPosition.z).add(mobileVehicle.getViewVector(deltaTracker.getGameTimeDeltaPartialTick(true)).scale(192)), ClientEventHandler.zoomVehicle ? cPos : cameraPos);
if (p != null) {
poseStack.pushPose();
@ -176,7 +180,7 @@ public class HelicopterHudOverlay {
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) {
poseStack.pushPose();
poseStack.rotateAround(Axis.ZP.rotationDegrees(iHelicopterEntity.getRotZ(event.getPartialTick().getGameTimeDeltaPartialTick(true))), x, y, 0);
poseStack.rotateAround(Axis.ZP.rotationDegrees(iHelicopterEntity.getRotZ(deltaTracker.getGameTimeDeltaPartialTick(true))), x, y, 0);
preciseBlit(guiGraphics, Mod.loc("textures/screens/drone.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)));

View file

@ -12,7 +12,10 @@ import com.atsuishio.superbwarfare.tools.SeekTool;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.LayeredDraw;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.resources.ResourceLocation;
@ -22,29 +25,30 @@ import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.phys.Vec3;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.EventPriority;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.RenderGuiEvent;
import net.neoforged.api.distmarker.OnlyIn;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit;
@EventBusSubscriber(value = Dist.CLIENT)
public class JavelinHudOverlay {
@OnlyIn(Dist.CLIENT)
public class JavelinHudOverlay implements LayeredDraw.Layer {
public static final ResourceLocation ID = Mod.loc("javelin_hud");
private static final ResourceLocation FRAME = Mod.loc("textures/screens/frame/frame.png");
private static final ResourceLocation FRAME_TARGET = Mod.loc("textures/screens/frame/frame_target.png");
private static final ResourceLocation FRAME_LOCK = Mod.loc("textures/screens/frame/frame_lock.png");
private static float scopeScale = 1;
@SubscribeEvent(priority = EventPriority.LOWEST)
public static void eventHandler(RenderGuiEvent.Pre event) {
int w = event.getGuiGraphics().guiWidth();
int h = event.getGuiGraphics().guiHeight();
@Override
@ParametersAreNonnullByDefault
public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) {
int w = guiGraphics.guiWidth();
int h = guiGraphics.guiHeight();
Player player = Minecraft.getInstance().player;
PoseStack poseStack = event.getGuiGraphics().pose();
PoseStack poseStack = guiGraphics.pose();
if (player != null) {
ItemStack stack = player.getMainHandItem();
@ -76,15 +80,15 @@ public class JavelinHudOverlay {
float l = ((h - j) / 2) + moveY;
float i1 = k + i;
float j1 = l + j;
preciseBlit(event.getGuiGraphics(), Mod.loc("textures/screens/javelin/javelin_hud.png"), k, l, 0, 0.0F, i, j, i, j);
preciseBlit(event.getGuiGraphics(), Mod.loc(tag.getBoolean("TopMode") ? "textures/screens/javelin/top.png" : "textures/screens/javelin/dir.png"), k, l, 0, 0.0F, i, j, i, j);
preciseBlit(event.getGuiGraphics(), Mod.loc(data.ammo() > 0 ? "textures/screens/javelin/missile_green.png" : "textures/screens/javelin/missile_red.png"), k, l, 0, 0.0F, i, j, i, j);
preciseBlit(guiGraphics, Mod.loc("textures/screens/javelin/javelin_hud.png"), k, l, 0, 0.0F, i, j, i, j);
preciseBlit(guiGraphics, Mod.loc(tag.getBoolean("TopMode") ? "textures/screens/javelin/top.png" : "textures/screens/javelin/dir.png"), k, l, 0, 0.0F, i, j, i, j);
preciseBlit(guiGraphics, Mod.loc(data.ammo() > 0 ? "textures/screens/javelin/missile_green.png" : "textures/screens/javelin/missile_red.png"), k, l, 0, 0.0F, i, j, i, j);
if (tag.getInt("SeekTime") > 1 && tag.getInt("SeekTime") < 20) {
preciseBlit(event.getGuiGraphics(), Mod.loc("textures/screens/javelin/seek.png"), k, l, 0, 0.0F, i, j, i, j);
preciseBlit(guiGraphics, Mod.loc("textures/screens/javelin/seek.png"), k, l, 0, 0.0F, i, j, i, j);
}
event.getGuiGraphics().fill(RenderType.guiOverlay(), 0, (int) l, (int) k + 3, (int) j1, -90, -16777216);
event.getGuiGraphics().fill(RenderType.guiOverlay(), (int) i1, (int) l, w, (int) j1, -90, -16777216);
guiGraphics.fill(RenderType.guiOverlay(), 0, (int) l, (int) k + 3, (int) j1, -90, -16777216);
guiGraphics.fill(RenderType.guiOverlay(), (int) i1, (int) l, w, (int) j1, -90, -16777216);
RenderSystem.depthMask(true);
RenderSystem.defaultBlendFunc();
RenderSystem.enableDepthTest();
@ -101,11 +105,11 @@ public class JavelinHudOverlay {
double zoom = Minecraft.getInstance().options.fov().get() / ClientEventHandler.fov + 0.5 * fovAdjust2;
Vec3 playerVec = new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.yo + player.getEyeHeight(), player.getEyeY()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.zo, player.getZ()));
Vec3 playerVec = new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.yo + player.getEyeHeight(), player.getEyeY()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.zo, player.getZ()));
if (tag.getInt("GuideType") == 0) {
for (var e : entities) {
Vec3 pos = new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), e.xo, e.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), e.yo + e.getEyeHeight(), e.getEyeY()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), e.zo, e.getZ()));
Vec3 pos = new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), e.xo, e.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), e.yo + e.getEyeHeight(), e.getEyeY()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), e.zo, e.getZ()));
Vec3 lookAngle = player.getLookAngle().normalize().scale(pos.distanceTo(playerVec) * (1 - 1.0 / zoom));
var cPos = playerVec.add(lookAngle);
@ -119,7 +123,7 @@ public class JavelinHudOverlay {
float x = (float) point.x;
float y = (float) point.y;
RenderHelper.preciseBlit(event.getGuiGraphics(), lockOn ? FRAME_LOCK : nearest ? FRAME_TARGET : FRAME, x - 12, y - 12, 24, 24, 0, 0, 24, 24, 24, 24);
RenderHelper.preciseBlit(guiGraphics, lockOn ? FRAME_LOCK : nearest ? FRAME_TARGET : FRAME, x - 12, y - 12, 24, 24, 0, 0, 24, 24, 24, 24);
poseStack.popPose();
}
} else {
@ -136,7 +140,7 @@ public class JavelinHudOverlay {
float x = (float) point.x;
float y = (float) point.y;
RenderHelper.preciseBlit(event.getGuiGraphics(), lockOn ? FRAME_LOCK : FRAME_TARGET, x - 12, y - 12, 24, 24, 0, 0, 24, 24, 24, 24);
RenderHelper.preciseBlit(guiGraphics, lockOn ? FRAME_LOCK : FRAME_TARGET, x - 12, y - 12, 24, 24, 0, 0, 24, 24, 24, 24);
poseStack.popPose();
}

View file

@ -12,26 +12,30 @@ import com.atsuishio.superbwarfare.tools.DamageTypeTool;
import com.atsuishio.superbwarfare.tools.PlayerKillRecord;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.LayeredDraw;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.damagesource.DamageTypes;
import net.minecraft.world.entity.player.Player;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.RenderGuiEvent;
import net.neoforged.api.distmarker.OnlyIn;
import org.jetbrains.annotations.Nullable;
import top.theillusivec4.curios.api.CuriosApi;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.concurrent.atomic.AtomicReference;
import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit;
@EventBusSubscriber(value = Dist.CLIENT)
public class KillMessageOverlay {
@OnlyIn(Dist.CLIENT)
public class KillMessageOverlay implements LayeredDraw.Layer {
public static final ResourceLocation ID = Mod.loc("kill_message");
private static final ResourceLocation HEADSHOT = Mod.loc("textures/screens/damage_types/headshot.png");
@ -50,8 +54,9 @@ public class KillMessageOverlay {
private static final ResourceLocation WORLD_PEACE_STAFF = Mod.loc("textures/gun_icon/compat/world_peace_staff.png");
@SubscribeEvent
public static void onRenderGui(RenderGuiEvent.Pre event) {
@Override
@ParametersAreNonnullByDefault
public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) {
if (!KillMessageConfig.SHOW_KILL_MESSAGE.get()) {
return;
}
@ -88,12 +93,12 @@ public class KillMessageOverlay {
}
for (PlayerKillRecord r : KillMessageHandler.QUEUE) {
totalTop = renderKillMessages(r, event, totalTop);
totalTop = renderKillMessages(r, guiGraphics, deltaTracker, totalTop);
}
}
private static float renderKillMessages(PlayerKillRecord record, RenderGuiEvent.Pre event, float baseTop) {
int w = event.getGuiGraphics().guiWidth();
private static float renderKillMessages(PlayerKillRecord record, GuiGraphics guiGraphics, DeltaTracker deltaTracker, float baseTop) {
int w = guiGraphics.guiWidth();
float top = baseTop;
Font font = Minecraft.getInstance().font;
@ -107,8 +112,7 @@ public class KillMessageOverlay {
int targetNameWidth = font.width(targetName.get());
var gui = event.getGuiGraphics();
gui.pose().pushPose();
guiGraphics.pose().pushPose();
RenderSystem.disableDepthTest();
RenderSystem.depthMask(false);
@ -120,15 +124,15 @@ public class KillMessageOverlay {
// 入场效果
if (record.tick < 3) {
gui.pose().translate((3 - record.tick - event.getPartialTick().getGameTimeDeltaPartialTick(true)) * 33, 0, 0);
guiGraphics.pose().translate((3 - record.tick - deltaTracker.getGameTimeDeltaPartialTick(true)) * 33, 0, 0);
}
// 4s后开始消失
if (record.tick >= 80) {
int animationTickCount = record.fastRemove ? 2 : 20;
float rate = (float) Math.pow((record.tick + event.getPartialTick().getGameTimeDeltaPartialTick(true) - 80) / animationTickCount, 5);
gui.pose().translate(rate * 100, 0, 0);
gui.setColor(1, 1, 1, 1 - rate);
float rate = (float) Math.pow((record.tick + deltaTracker.getGameTimeDeltaPartialTick(true) - 80) / animationTickCount, 5);
guiGraphics.pose().translate(rate * 100, 0, 0);
guiGraphics.setColor(1, 1, 1, 1 - rate);
baseTop += 10 * (1 - rate);
} else {
baseTop += 10;
@ -137,7 +141,7 @@ public class KillMessageOverlay {
// 击杀提示是右对齐的这里从右向左渲染
// 渲染被击杀者名称
gui.drawString(
guiGraphics.drawString(
Minecraft.getInstance().font,
targetName.get(),
w - targetNameWidth - 10f,
@ -152,7 +156,7 @@ public class KillMessageOverlay {
ResourceLocation damageTypeIcon = getDamageTypeIcon(record);
if (damageTypeIcon != null) {
preciseBlit(gui,
preciseBlit(guiGraphics,
damageTypeIcon,
damageTypeIconW,
top - 2,
@ -176,7 +180,7 @@ public class KillMessageOverlay {
ResourceLocation resourceLocation = vehicleEntity.getVehicleIcon();
preciseBlit(gui,
preciseBlit(guiGraphics,
resourceLocation,
itemIconW,
top,
@ -193,7 +197,7 @@ public class KillMessageOverlay {
ResourceLocation resourceLocation = gunItem.getGunIcon();
preciseBlit(gui,
preciseBlit(guiGraphics,
resourceLocation,
itemIconW,
top,
@ -213,7 +217,7 @@ public class KillMessageOverlay {
ResourceLocation resourceLocation = gunItem.getGunIcon();
preciseBlit(gui,
preciseBlit(guiGraphics,
resourceLocation,
itemIconW,
top,
@ -230,7 +234,7 @@ public class KillMessageOverlay {
if (record.stack.getItem().getDescriptionId().equals("item.dreamaticvoyage.world_peace_staff")) {
renderItem = true;
preciseBlit(gui,
preciseBlit(guiGraphics,
WORLD_PEACE_STAFF,
itemIconW,
top,
@ -259,7 +263,7 @@ public class KillMessageOverlay {
nameW -= 18;
}
gui.drawString(
guiGraphics.drawString(
Minecraft.getInstance().font,
attackerName.get(),
nameW,
@ -273,8 +277,8 @@ public class KillMessageOverlay {
RenderSystem.depthMask(true);
RenderSystem.enableDepthTest();
gui.setColor(1, 1, 1, 1);
gui.pose().popPose();
guiGraphics.setColor(1, 1, 1, 1);
guiGraphics.pose().popPose();
return baseTop;
}

View file

@ -1,38 +1,46 @@
package com.atsuishio.superbwarfare.client.overlay;
import com.atsuishio.superbwarfare.Mod;
import com.atsuishio.superbwarfare.client.gui.RangeHelper;
import com.atsuishio.superbwarfare.entity.MortarEntity;
import com.atsuishio.superbwarfare.tools.FormatTool;
import com.atsuishio.superbwarfare.tools.TraceTool;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.LayeredDraw;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.RenderGuiEvent;
import net.neoforged.api.distmarker.OnlyIn;
@EventBusSubscriber(value = Dist.CLIENT)
public class MortarInfoOverlay {
import javax.annotation.ParametersAreNonnullByDefault;
@SubscribeEvent
public static void eventHandler(RenderGuiEvent.Pre event) {
int w = event.getGuiGraphics().guiWidth();
int h = event.getGuiGraphics().guiHeight();
@OnlyIn(Dist.CLIENT)
public class MortarInfoOverlay implements LayeredDraw.Layer {
public static final ResourceLocation ID = Mod.loc("mortar_info");
@Override
@ParametersAreNonnullByDefault
public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) {
int w = guiGraphics.guiWidth();
int h = guiGraphics.guiHeight();
Player player = Minecraft.getInstance().player;
Entity lookingEntity = null;
if (player != null) {
lookingEntity = TraceTool.findLookingEntity(player, 6);
}
if (lookingEntity instanceof MortarEntity mortar) {
event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.mortar.pitch")
guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.mortar.pitch")
.append(Component.literal(FormatTool.format1D(-mortar.getXRot(), "°"))),
w / 2 - 90, h / 2 - 26, -1, false);
event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.mortar.yaw")
guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.mortar.yaw")
.append(Component.literal(FormatTool.format1D(mortar.getYRot(), "°"))),
w / 2 - 90, h / 2 - 16, -1, false);
event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.mortar.range")
guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.mortar.range")
.append(Component.literal(FormatTool.format1D((int) RangeHelper.getRange(-mortar.getXRot(), 11.4, 0.146), "m"))),
w / 2 - 90, h / 2 - 6, -1, false);
}

View file

@ -7,7 +7,10 @@ import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.tools.SeekTool;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.LayeredDraw;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;
@ -15,19 +18,22 @@ import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.phys.Vec3;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.RenderGuiEvent;
import net.neoforged.api.distmarker.OnlyIn;
@EventBusSubscriber(value = Dist.CLIENT)
public class RedTriangleOverlay {
import javax.annotation.ParametersAreNonnullByDefault;
@OnlyIn(Dist.CLIENT)
public class RedTriangleOverlay implements LayeredDraw.Layer {
public static final ResourceLocation ID = Mod.loc("red_triangle");
private static final ResourceLocation TRIANGLE = Mod.loc("textures/screens/red_triangle.png");
@SubscribeEvent
public static void eventHandler(RenderGuiEvent.Pre event) {
@Override
@ParametersAreNonnullByDefault
public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) {
Minecraft mc = Minecraft.getInstance();
PoseStack poseStack = event.getGuiGraphics().pose();
PoseStack poseStack = guiGraphics.pose();
Player player = mc.player;
if (player == null) return;
@ -39,9 +45,9 @@ public class RedTriangleOverlay {
Entity idf = SeekTool.seekLivingEntity(player, player.level(), 128, 6);
if (idf == null) return;
Vec3 playerVec = new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.yo + player.getEyeHeight(), player.getEyeY()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.zo, player.getZ()));
Vec3 playerVec = new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.yo + player.getEyeHeight(), player.getEyeY()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.zo, player.getZ()));
double distance = idf.position().distanceTo(playerVec);
Vec3 pos = new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), idf.xo, idf.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), idf.yo + idf.getEyeHeight() + 0.5 + 0.07 * distance, idf.getEyeY() + 0.5 + 0.07 * distance), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), idf.zo, idf.getZ()));
Vec3 pos = new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), idf.xo, idf.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), idf.yo + idf.getEyeHeight() + 0.5 + 0.07 * distance, idf.getEyeY() + 0.5 + 0.07 * distance), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), idf.zo, idf.getZ()));
Vec3 point = RenderHelper.worldToScreen(pos, playerVec);
if (point == null) return;
@ -49,7 +55,7 @@ public class RedTriangleOverlay {
float x = (float) point.x;
float y = (float) point.y;
RenderHelper.preciseBlit(event.getGuiGraphics(), TRIANGLE, x - 4, y - 4, 8, 8, 0, 0, 8, 8, 8, 8);
RenderHelper.preciseBlit(guiGraphics, TRIANGLE, x - 4, y - 4, 8, 8, 0, 0, 8, 8, 8, 8);
RenderSystem.depthMask(true);
RenderSystem.defaultBlendFunc();

View file

@ -1,9 +1,14 @@
package com.atsuishio.superbwarfare.client.overlay;
import com.atsuishio.superbwarfare.Mod;
import com.atsuishio.superbwarfare.tools.FormatTool;
import com.atsuishio.superbwarfare.tools.TraceTool;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.LayeredDraw;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Items;
@ -11,17 +16,20 @@ import net.minecraft.world.level.ClipContext;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.RenderGuiEvent;
import net.neoforged.api.distmarker.OnlyIn;
@EventBusSubscriber(value = Dist.CLIENT)
public class SpyglassRangeOverlay {
import javax.annotation.ParametersAreNonnullByDefault;
@SubscribeEvent
public static void eventHandler(RenderGuiEvent.Pre event) {
int w = event.getGuiGraphics().guiWidth();
int h = event.getGuiGraphics().guiHeight();
@OnlyIn(Dist.CLIENT)
public class SpyglassRangeOverlay implements LayeredDraw.Layer {
public static final ResourceLocation ID = Mod.loc("spyglass_range");
@Override
@ParametersAreNonnullByDefault
public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) {
int w = guiGraphics.guiWidth();
int h = guiGraphics.guiHeight();
Player player = Minecraft.getInstance().player;
if (player != null && (player.getMainHandItem().getItem() == Items.SPYGLASS || player.getOffhandItem().getItem() == Items.SPYGLASS) && player.isUsingItem()) {
boolean lookAtEntity = false;
@ -41,15 +49,15 @@ public class SpyglassRangeOverlay {
}
if (lookAtEntity) {
event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.drone.range")
guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.drone.range")
.append(Component.literal(FormatTool.format1D(entityRange, "M ") + lookingEntity.getDisplayName().getString())),
w / 2 + 12, h / 2 - 28, -1, false);
} else {
if (blockRange > 500) {
event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.drone.range")
guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.drone.range")
.append(Component.literal("---M")), w / 2 + 12, h / 2 - 28, -1, false);
} else {
event.getGuiGraphics().drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.drone.range")
guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable("tips.superbwarfare.drone.range")
.append(Component.literal(FormatTool.format1D(blockRange, "M"))),
w / 2 + 12, h / 2 - 28, -1, false);
}

View file

@ -22,8 +22,10 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Axis;
import net.minecraft.client.Camera;
import net.minecraft.client.CameraType;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.LayeredDraw;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
@ -36,13 +38,11 @@ import net.minecraft.world.level.ClipContext;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.EventPriority;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.RenderGuiEvent;
import net.neoforged.api.distmarker.OnlyIn;
import org.joml.Math;
import top.theillusivec4.curios.api.CuriosApi;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.concurrent.atomic.AtomicReference;
import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit;
@ -51,8 +51,10 @@ import static com.atsuishio.superbwarfare.entity.vehicle.Bmp2Entity.LOADED_MISSI
import static com.atsuishio.superbwarfare.entity.vehicle.Bmp2Entity.MISSILE_COUNT;
import static com.atsuishio.superbwarfare.entity.vehicle.base.MobileVehicleEntity.*;
@EventBusSubscriber(value = Dist.CLIENT)
public class VehicleHudOverlay {
@OnlyIn(Dist.CLIENT)
public class VehicleHudOverlay implements LayeredDraw.Layer {
public static final ResourceLocation ID = Mod.loc("vehicle_hud");
private static float scopeScale = 1;
private static final ResourceLocation FRAME = Mod.loc("textures/screens/land/tv_frame.png");
@ -73,10 +75,11 @@ public class VehicleHudOverlay {
private static final AnimationTimer weaponIndexUpdateTimer = new AnimationTimer(ANIMATION_TIME).animation(AnimationCurves.EASE_OUT_CIRC);
@SubscribeEvent(priority = EventPriority.HIGH)
public static void eventHandler(RenderGuiEvent.Pre event) {
int w = event.getGuiGraphics().guiWidth();
int h = event.getGuiGraphics().guiHeight();
@Override
@ParametersAreNonnullByDefault
public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) {
int w = guiGraphics.guiWidth();
int h = guiGraphics.guiHeight();
Player player = Minecraft.getInstance().player;
if (!shouldRenderHud(player)) {
@ -86,7 +89,6 @@ public class VehicleHudOverlay {
Entity vehicle = player.getVehicle();
GuiGraphics guiGraphics = event.getGuiGraphics();
PoseStack poseStack = guiGraphics.pose();
poseStack.pushPose();
@ -99,7 +101,7 @@ public class VehicleHudOverlay {
RenderSystem.setShaderColor(1, 1, 1, 1);
// 渲染地面武装HUD
renderLandArmorHud(event, w, h);
renderLandArmorHud(guiGraphics, deltaTracker, w, h);
int compatHeight = getArmorPlateCompatHeight(player);
@ -138,10 +140,9 @@ public class VehicleHudOverlay {
return 9;
}
public static void renderLandArmorHud(RenderGuiEvent.Pre event, int w, int h) {
public static void renderLandArmorHud(GuiGraphics guiGraphics, DeltaTracker deltaTracker, int w, int h) {
Minecraft mc = Minecraft.getInstance();
Player player = mc.player;
GuiGraphics guiGraphics = event.getGuiGraphics();
PoseStack poseStack = guiGraphics.pose();
Camera camera = mc.gameRenderer.getMainCamera();
Vec3 cameraPos = camera.getPosition();
@ -165,7 +166,7 @@ public class VehicleHudOverlay {
RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
RenderSystem.setShaderColor(1, 1, 1, 1);
scopeScale = Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), scopeScale, 1F);
scopeScale = Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), scopeScale, 1F);
float f = (float) Math.min(w, h);
float f1 = Math.min((float) w / f, (float) h / f) * scopeScale;
float i = Mth.floor(f * f1);
@ -210,7 +211,7 @@ public class VehicleHudOverlay {
// 炮塔方向
poseStack.pushPose();
poseStack.rotateAround(Axis.ZP.rotationDegrees(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), iLand.turretYRotO(), iLand.turretYRot())), w / 2f + 112, h - 56, 0);
poseStack.rotateAround(Axis.ZP.rotationDegrees(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), iLand.turretYRotO(), iLand.turretYRot())), w / 2f + 112, h - 56, 0);
preciseBlit(guiGraphics, Mod.loc("textures/screens/land/body.png"), w / 2f + 96, h - 72, 0, 0.0F, 32, 32, 32, 32);
poseStack.popPose();
@ -300,7 +301,7 @@ public class VehicleHudOverlay {
renderKillIndicator(guiGraphics, w, h);
} else if (Minecraft.getInstance().options.getCameraType() == CameraType.THIRD_PERSON_BACK && !ClientEventHandler.zoomVehicle) {
Vec3 p = RenderHelper.worldToScreen(new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.yo + player.getEyeHeight(), player.getEyeY()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.zo, player.getZ())).add(iLand.getBarrelVec(event.getPartialTick().getGameTimeDeltaPartialTick(true)).scale(192)), cameraPos);
Vec3 p = RenderHelper.worldToScreen(new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.yo + player.getEyeHeight(), player.getEyeY()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.zo, player.getZ())).add(iLand.getBarrelVec(deltaTracker.getGameTimeDeltaPartialTick(true)).scale(192)), cameraPos);
// 第三人称准星
if (p != null) {
poseStack.pushPose();

View file

@ -15,36 +15,41 @@ import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Camera;
import net.minecraft.client.CameraType;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.LayeredDraw;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.phys.Vec3;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.RenderGuiEvent;
import net.neoforged.api.distmarker.OnlyIn;
import org.joml.Math;
import javax.annotation.ParametersAreNonnullByDefault;
import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit;
import static com.atsuishio.superbwarfare.client.overlay.VehicleHudOverlay.renderKillIndicator3P;
import static com.atsuishio.superbwarfare.entity.vehicle.Yx100Entity.MG_AMMO;
import static com.atsuishio.superbwarfare.entity.vehicle.base.MobileVehicleEntity.AMMO;
import static com.atsuishio.superbwarfare.entity.vehicle.base.MobileVehicleEntity.HEAT;
@EventBusSubscriber(value = Dist.CLIENT)
public class VehicleMgHudOverlay {
@OnlyIn(Dist.CLIENT)
public class VehicleMgHudOverlay implements LayeredDraw.Layer {
@SubscribeEvent
public static void eventHandler(RenderGuiEvent.Pre event) {
int w = event.getGuiGraphics().guiWidth();
int h = event.getGuiGraphics().guiHeight();
public static final ResourceLocation ID = Mod.loc("vehicle_mg_hud");
@Override
@ParametersAreNonnullByDefault
public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) {
int w = guiGraphics.guiWidth();
int h = guiGraphics.guiHeight();
Minecraft mc = Minecraft.getInstance();
Player player = mc.player;
GuiGraphics guiGraphics = event.getGuiGraphics();
PoseStack poseStack = guiGraphics.pose();
Camera camera = mc.gameRenderer.getMainCamera();
Vec3 cameraPos = camera.getPosition();
@ -74,8 +79,8 @@ public class VehicleMgHudOverlay {
RenderHelper.preciseBlit(guiGraphics, Mod.loc("textures/screens/cannon/cannon_crosshair_notzoom.png"), k, l, 0, 0.0F, i, j, i, j);
VehicleHudOverlay.renderKillIndicator(guiGraphics, w, h);
} else if (Minecraft.getInstance().options.getCameraType() == CameraType.THIRD_PERSON_BACK && !ClientEventHandler.zoomVehicle) {
Vec3 p = RenderHelper.worldToScreen(new Vec3(Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.yo + player.getEyeHeight(), player.getEyeY()),
Mth.lerp(event.getPartialTick().getGameTimeDeltaPartialTick(true), player.zo, player.getZ())).add(iLand.getGunVec(event.getPartialTick().getGameTimeDeltaPartialTick(true)).scale(192)), cameraPos);
Vec3 p = RenderHelper.worldToScreen(new Vec3(Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.xo, player.getX()), Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.yo + player.getEyeHeight(), player.getEyeY()),
Mth.lerp(deltaTracker.getGameTimeDeltaPartialTick(true), player.zo, player.getZ())).add(iLand.getGunVec(deltaTracker.getGameTimeDeltaPartialTick(true)).scale(192)), cameraPos);
// 第三人称准星
if (p != null) {

View file

@ -1,27 +1,35 @@
package com.atsuishio.superbwarfare.client.overlay;
import com.atsuishio.superbwarfare.Mod;
import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity;
import com.atsuishio.superbwarfare.tools.FormatTool;
import com.atsuishio.superbwarfare.tools.TraceTool;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.LayeredDraw;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.RenderGuiEvent;
import net.neoforged.api.distmarker.OnlyIn;
@EventBusSubscriber(value = Dist.CLIENT)
public class VehicleTeamOverlay {
import javax.annotation.ParametersAreNonnullByDefault;
@SubscribeEvent
public static void eventHandler(RenderGuiEvent.Pre event) {
int w = event.getGuiGraphics().guiWidth();
int h = event.getGuiGraphics().guiHeight();
@OnlyIn(Dist.CLIENT)
public class VehicleTeamOverlay implements LayeredDraw.Layer {
public static final ResourceLocation ID = Mod.loc("vehicle_team");
@Override
@ParametersAreNonnullByDefault
public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) {
int w = guiGraphics.guiWidth();
int h = guiGraphics.guiHeight();
Player player = Minecraft.getInstance().player;
PoseStack poseStack = event.getGuiGraphics().pose();
PoseStack poseStack = guiGraphics.pose();
if (player == null) return;
boolean lookAtEntity = false;
@ -38,14 +46,14 @@ public class VehicleTeamOverlay {
poseStack.pushPose();
poseStack.scale(0.8f, 0.8f, 1);
if (lookingEntity.getFirstPassenger() instanceof Player passenger) {
event.getGuiGraphics().drawString(Minecraft.getInstance().font,
guiGraphics.drawString(Minecraft.getInstance().font,
Component.literal(passenger.getDisplayName().getString() + (passenger.getTeam() == null ? "" : " <" + (passenger.getTeam().getName()) + ">")),
w / 2 + 90, h / 2 - 4, passenger.getTeamColor(), false);
event.getGuiGraphics().drawString(Minecraft.getInstance().font,
guiGraphics.drawString(Minecraft.getInstance().font,
Component.literal(lookingEntity.getDisplayName().getString() + " " + FormatTool.format1D(entityRange, "m")),
w / 2 + 90, h / 2 + 5, passenger.getTeamColor(), false);
} else {
event.getGuiGraphics().drawString(Minecraft.getInstance().font,
guiGraphics.drawString(Minecraft.getInstance().font,
Component.literal(lookingEntity.getDisplayName().getString() + " " + FormatTool.format1D(entityRange, "M")),
w / 2 + 90, h / 2 + 5, -1, false);
}

View file

@ -9,8 +9,10 @@ import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.CameraType;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.LayeredDraw;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
@ -18,23 +20,25 @@ import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.phys.Vec3;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.RenderGuiEvent;
import net.neoforged.api.distmarker.OnlyIn;
import org.joml.Math;
@EventBusSubscriber(modid = Mod.MODID, value = Dist.CLIENT)
public class Yx100SwarmDroneHudOverlay {
import javax.annotation.ParametersAreNonnullByDefault;
@OnlyIn(Dist.CLIENT)
public class Yx100SwarmDroneHudOverlay implements LayeredDraw.Layer {
public static final ResourceLocation ID = Mod.loc("yx100_swarm_drone_hud");
private static final ResourceLocation FRAME = Mod.loc("textures/screens/frame/frame.png");
private static final ResourceLocation FRAME_LOCK = Mod.loc("textures/screens/frame/frame_lock.png");
@SubscribeEvent
public static void eventHandler(RenderGuiEvent.Pre event) {
int w = event.getGuiGraphics().guiWidth();
int h = event.getGuiGraphics().guiHeight();
@Override
@ParametersAreNonnullByDefault
public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) {
int w = guiGraphics.guiWidth();
int h = guiGraphics.guiHeight();
Minecraft mc = Minecraft.getInstance();
Player player = mc.player;
GuiGraphics guiGraphics = event.getGuiGraphics();
PoseStack poseStack = guiGraphics.pose();
if (!shouldRenderCrossHair(player)) return;
@ -72,8 +76,8 @@ public class Yx100SwarmDroneHudOverlay {
}
if (naerestEntity != null) {
Vec3 playerVec = new Vec3(Mth.lerp(event.getPartialTick().getRealtimeDeltaTicks(), player.xo, player.getX()), Mth.lerp(event.getPartialTick().getRealtimeDeltaTicks(), player.yo + player.getEyeHeight(), player.getEyeY()), Mth.lerp(event.getPartialTick().getRealtimeDeltaTicks(), player.zo, player.getZ()));
Vec3 pos = new Vec3(Mth.lerp(event.getPartialTick().getRealtimeDeltaTicks(), naerestEntity.xo, naerestEntity.getX()), Mth.lerp(event.getPartialTick().getRealtimeDeltaTicks(), naerestEntity.yo + naerestEntity.getEyeHeight(), naerestEntity.getEyeY()), Mth.lerp(event.getPartialTick().getRealtimeDeltaTicks(), naerestEntity.zo, naerestEntity.getZ()));
Vec3 playerVec = new Vec3(Mth.lerp(deltaTracker.getRealtimeDeltaTicks(), player.xo, player.getX()), Mth.lerp(deltaTracker.getRealtimeDeltaTicks(), player.yo + player.getEyeHeight(), player.getEyeY()), Mth.lerp(deltaTracker.getRealtimeDeltaTicks(), player.zo, player.getZ()));
Vec3 pos = new Vec3(Mth.lerp(deltaTracker.getRealtimeDeltaTicks(), naerestEntity.xo, naerestEntity.getX()), Mth.lerp(deltaTracker.getRealtimeDeltaTicks(), naerestEntity.yo + naerestEntity.getEyeHeight(), naerestEntity.getEyeY()), Mth.lerp(deltaTracker.getRealtimeDeltaTicks(), naerestEntity.zo, naerestEntity.getZ()));
Vec3 lookAngle = player.getLookAngle().normalize().scale(pos.distanceTo(playerVec) * (1 - 1.0 / zoom));
var cPos = playerVec.add(lookAngle);

View file

@ -1,7 +1,7 @@
package com.atsuishio.superbwarfare.network.message.receive;
import com.atsuishio.superbwarfare.Mod;
import com.atsuishio.superbwarfare.client.overlay.DroneUIOverlay;
import com.atsuishio.superbwarfare.client.overlay.DroneHudOverlay;
import io.netty.buffer.ByteBuf;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
@ -19,7 +19,7 @@ public record SimulationDistanceMessage(int distance) implements CustomPacketPay
);
public static void handler(SimulationDistanceMessage message, final IPayloadContext context) {
DroneUIOverlay.MAX_DISTANCE = message.distance * 16;
DroneHudOverlay.MAX_DISTANCE = message.distance * 16;
}
@Override