This commit is contained in:
Atsuihsio 2024-11-29 04:42:35 +08:00
parent a4057cbfd5
commit 23bf1b1737
9 changed files with 99 additions and 67 deletions

View file

@ -92,7 +92,7 @@ public class ClickHandler {
if (player.getMainHandItem().is(ModTags.Items.GUN)
|| stack.is(ModItems.MONITOR.get())
|| player.hasEffect(ModMobEffects.SHOCK.get())
|| (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity && player.getMainHandItem().getItem() instanceof CannonShellItem)) {
|| (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity)) {
if (button == GLFW.GLFW_MOUSE_BUTTON_LEFT) {
event.setCanceled(true);
}
@ -114,9 +114,9 @@ public class ClickHandler {
}
}
if (player.getMainHandItem().is(ModTags.Items.GUN)
if ((player.getMainHandItem().is(ModTags.Items.GUN) && !(player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity))
|| stack.is(ModItems.MONITOR.get())
|| (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity && !player.getMainHandItem().is(ModTags.Items.GUN))
|| (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity)
|| (stack.is(Items.SPYGLASS) && player.isScoping() && player.getOffhandItem().is(ModItems.FIRING_PARAMETERS.get()))) {
if (button == ModKeyMappings.FIRE.getKey().getValue()) {
handleWeaponFirePress(player, stack);
@ -235,9 +235,9 @@ public class ClickHandler {
ModUtils.PACKET_HANDLER.sendToServer(new SensitivityMessage(false));
}
if (player.getMainHandItem().is(ModTags.Items.GUN)
if ((player.getMainHandItem().is(ModTags.Items.GUN) && !(player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity))
|| stack.is(ModItems.MONITOR.get())
|| (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity && !player.getMainHandItem().is(ModTags.Items.GUN))
|| (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity)
|| (stack.is(Items.SPYGLASS) && player.isScoping() && player.getOffhandItem().is(ModItems.FIRING_PARAMETERS.get()))) {
if (key == ModKeyMappings.FIRE.getKey().getValue()) {
handleWeaponFirePress(player, stack);
@ -293,7 +293,7 @@ public class ClickHandler {
return;
}
if (stack.is(ModTags.Items.GUN)) {
if (stack.is(ModTags.Items.GUN) && !(player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity)) {
if ((!(stack.getOrCreateTag().getBoolean("is_normal_reloading") || stack.getOrCreateTag().getBoolean("is_empty_reloading"))
&& !stack.getOrCreateTag().getBoolean("reloading")
&& !stack.getOrCreateTag().getBoolean("charging")

View file

@ -5,11 +5,10 @@ import com.atsuishio.superbwarfare.client.RenderHelper;
import com.atsuishio.superbwarfare.entity.ICannonEntity;
import com.atsuishio.superbwarfare.entity.Mk42Entity;
import com.atsuishio.superbwarfare.entity.Mle1934Entity;
import com.atsuishio.superbwarfare.event.ClientEventHandler;
import com.atsuishio.superbwarfare.tools.TraceTool;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import com.atsuishio.superbwarfare.event.ClientEventHandler;
import com.atsuishio.superbwarfare.item.gun.GunItem;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.renderer.GameRenderer;
@ -72,10 +71,10 @@ public class CannonHudOverlay {
int k = (w - i) / 2;
int l = (h - j) / 2;
if (ClientEventHandler.zoom) {
Entity lookingEntity = TraceTool.findLookingEntity(player, 512);
Entity lookingEntity = TraceTool.cannonFindLookingEntity(player, 512);
boolean lookAtEntity = false;
double block_range = player.position().distanceTo((Vec3.atLowerCornerOf(player.level().clip(
new ClipContext(player.getEyePosition(), player.getEyePosition().add(player.getLookAngle().scale(512)),
new ClipContext(new Vec3(player.getX(), player.getEyeY() + 1, player.getZ()), new Vec3(player.getX(), player.getEyeY() + 1, player.getZ()).add(player.getLookAngle().scale(512)),
ClipContext.Block.OUTLINE, ClipContext.Fluid.NONE, player)).getBlockPos())));
double entity_range = 0;
@ -135,7 +134,6 @@ public class CannonHudOverlay {
private static boolean shouldRenderCrossHair(Player player) {
if (player == null) return false;
return !player.isSpectator()
&& !(player.getMainHandItem().getItem() instanceof GunItem)
&& (player.getVehicle() != null && (player.getVehicle() instanceof ICannonEntity));
}
}

View file

@ -1,16 +1,17 @@
package com.atsuishio.superbwarfare.client.screens;
import com.atsuishio.superbwarfare.ModUtils;
import com.atsuishio.superbwarfare.network.ModVariables;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import com.atsuishio.superbwarfare.config.client.DisplayConfig;
import com.atsuishio.superbwarfare.entity.ICannonEntity;
import com.atsuishio.superbwarfare.event.ClientEventHandler;
import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.init.ModTags;
import com.atsuishio.superbwarfare.network.ModVariables;
import com.atsuishio.superbwarfare.perk.AmmoPerk;
import com.atsuishio.superbwarfare.perk.Perk;
import com.atsuishio.superbwarfare.perk.PerkHelper;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.CameraType;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
@ -49,6 +50,7 @@ public class CrossHairOverlay {
}
if (player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).edit) return;
if (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity) return;
GuiGraphics guiGraphics = event.getGuiGraphics();

View file

@ -10,6 +10,7 @@ import com.atsuishio.superbwarfare.tools.ParticleTool;
import com.atsuishio.superbwarfare.tools.SoundTool;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.ClientGamePacketListener;
import net.minecraft.network.syncher.EntityDataAccessor;
@ -45,7 +46,6 @@ import software.bernie.geckolib.util.GeckoLibUtil;
public class Mk42Entity extends Entity implements GeoEntity, ICannonEntity {
public static final EntityDataAccessor<Integer> COOL_DOWN = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.INT);
public static final EntityDataAccessor<Integer> TYPE = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.INT);
public static final EntityDataAccessor<Float> HEALTH = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.FLOAT);
private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this);
public static final float MAX_HEALTH = 700.0f;
@ -64,21 +64,18 @@ public class Mk42Entity extends Entity implements GeoEntity, ICannonEntity {
@Override
protected void defineSynchedData() {
this.entityData.define(COOL_DOWN, 0);
this.entityData.define(TYPE, 0);
this.entityData.define(HEALTH, MAX_HEALTH);
}
@Override
public void addAdditionalSaveData(CompoundTag compound) {
compound.putInt("CoolDown", this.entityData.get(COOL_DOWN));
compound.putInt("Type", this.entityData.get(TYPE));
compound.putFloat("Health", this.entityData.get(HEALTH));
}
@Override
public void readAdditionalSaveData(CompoundTag compound) {
this.entityData.set(COOL_DOWN, compound.getInt("CoolDown"));
this.entityData.set(TYPE, compound.getInt("Type"));
if (compound.contains("Health")) {
this.entityData.set(HEALTH, compound.getFloat("Health"));
} else {
@ -194,14 +191,6 @@ public class Mk42Entity extends Entity implements GeoEntity, ICannonEntity {
this.entityData.set(COOL_DOWN, this.entityData.get(COOL_DOWN) - 1);
}
if (this.entityData.get(COOL_DOWN) > 28) {
if (Math.random() < 0.5) {
this.entityData.set(TYPE, -1);
} else {
this.entityData.set(TYPE, 1);
}
}
this.move(MoverType.SELF, this.getDeltaMovement());
if (this.onGround()) {
this.setDeltaMovement(Vec3.ZERO);
@ -363,33 +352,46 @@ public class Mk42Entity extends Entity implements GeoEntity, ICannonEntity {
if (!(passenger instanceof LivingEntity entity)) return;
float diffY = entity.getYHeadRot() - this.getYRot();
float passengerY = entity.getYHeadRot();
if (passengerY > 180.0f) {
passengerY -= 360.0f;
} else if (passengerY < -180.0f) {
passengerY += 360.0f;
}
float diffY = passengerY - this.getYRot();
float diffX = entity.getXRot() - 1.3f - this.getXRot();
if (diffY > 180.0f) {
diffY -= 360.0f;
} else if (diffY < -180.0f) {
diffY += 360.0f;
}
diffY = diffY * 0.15f;
diffY = Mth.clamp(diffY * 0.15f, -1.75f, 1.75f);
diffX = diffX * 0.15f;
this.setYRot(this.getYRot() + Mth.clamp(diffY, -1.75f, 1.75f));
this.setYRot(this.getYRot() + diffY);
if (passenger instanceof Player player) {
player.displayClientMessage(Component.literal("Angle:" + new java.text.DecimalFormat("##.##").format(this.getYRot()) + " diffY:" + new java.text.DecimalFormat("##.#").format(diffY)), true);
}
this.setXRot(Mth.clamp(this.getXRot() + Mth.clamp(diffX, -3f, 3f), -85, 16.3f));
this.setRot(this.getYRot(), this.getXRot());
}
protected void clampRotation(Entity entity) {
ItemStack stack = ItemStack.EMPTY;
if (entity instanceof Player player) {
stack = player.getMainHandItem();
}
if (!stack.is(ModTags.Items.GUN)) {
float f = Mth.wrapDegrees(entity.getXRot());
float f1 = Mth.clamp(f, -85.0F, 16.3F);
entity.xRotO += f1 - f;
entity.setXRot(entity.getXRot() + f1 - f);
}
float f = Mth.wrapDegrees(entity.getXRot());
float f1 = Mth.clamp(f, -85.0F, 16.3F);
entity.xRotO += f1 - f;
entity.setXRot(entity.getXRot() + f1 - f);
// entity.setYBodyRot(this.getYRot());
// float f2 = Mth.wrapDegrees(entity.getYRot() - this.getYRot());
// float f3 = Mth.clamp(f2, -60.0F, 60.0F);
// entity.yRotO += f3 - f2;
// entity.setYRot(entity.getYRot() + f3 - f2);
// entity.setYHeadRot(entity.getYRot());
}
@Override
@ -399,11 +401,7 @@ public class Mk42Entity extends Entity implements GeoEntity, ICannonEntity {
private PlayState movementPredicate(AnimationState<Mk42Entity> event) {
if (this.entityData.get(COOL_DOWN) > 10) {
if (this.entityData.get(TYPE) == 1) {
return event.setAndContinue(RawAnimation.begin().thenPlay("animation.mk42.fire"));
} else {
return event.setAndContinue(RawAnimation.begin().thenPlay("animation.mk42.fire2"));
}
return event.setAndContinue(RawAnimation.begin().thenPlay("animation.mk42.fire"));
}
return event.setAndContinue(RawAnimation.begin().thenLoop("animation.mk42.idle"));

View file

@ -437,32 +437,34 @@ public class Mle1934Entity extends Entity implements GeoEntity, ICannonEntity {
if (!(passenger instanceof LivingEntity entity)) return;
float diffY = entity.getYHeadRot() - this.getYRot();
float passengerY = entity.getYHeadRot();
if (passengerY > 180.0f) {
passengerY -= 360.0f;
} else if (passengerY < -180.0f) {
passengerY += 360.0f;
}
float diffY = passengerY - this.getYRot();
float diffX = entity.getXRot() - 1.2f - this.getXRot();
if (diffY > 180.0f) {
diffY -= 360.0f;
} else if (diffY < -180.0f) {
diffY += 360.0f;
}
diffY = diffY * 0.15f;
diffY = Mth.clamp(diffY * 0.15f, -1.25f, 1.25f);
diffX = diffX * 0.15f;
this.setYRot(this.getYRot() + Mth.clamp(diffY, -1.25f, 1.25f));
this.setYRot(this.getYRot() + diffY);
this.setXRot(Mth.clamp(this.getXRot() + Mth.clamp(diffX, -2f, 2f), -30, 4));
this.setRot(this.getYRot(), this.getXRot());
}
protected void clampRotation(Entity entity) {
ItemStack stack = ItemStack.EMPTY;
if (entity instanceof Player player) {
stack = player.getMainHandItem();
}
if (!stack.is(ModTags.Items.GUN)) {
float f = Mth.wrapDegrees(entity.getXRot());
float f1 = Mth.clamp(f, -30.0F, 4.0F);
entity.xRotO += f1 - f;
entity.setXRot(entity.getXRot() + f1 - f);
}
float f = Mth.wrapDegrees(entity.getXRot());
float f1 = Mth.clamp(f, -30.0F, 4.0F);
entity.xRotO += f1 - f;
entity.setXRot(entity.getXRot() + f1 - f);
}
@Override

View file

@ -495,6 +495,7 @@ public class ClientEventHandler {
Player player = Minecraft.getInstance().player;
if (player == null) return;
if (!player.getMainHandItem().is(ModTags.Items.GUN)) return;
if (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity) return;
float pose;
float times = 2 * (float) Math.min(Minecraft.getInstance().getDeltaFrameTime(), 0.8);
@ -1014,6 +1015,11 @@ public class ClientEventHandler {
ItemStack stack = player.getMainHandItem();
if (player.isPassenger() && player.getVehicle() instanceof ICannonEntity && zoom) {
event.setFOV(event.getFOV() / 5);
return;
}
if (stack.is(ModTags.Items.GUN)) {
if (!event.usedConfiguredFov()) {
return;
@ -1038,10 +1044,6 @@ public class ClientEventHandler {
return;
}
if (player.isPassenger() && player.getVehicle() instanceof ICannonEntity && zoom && !stack.is(ModTags.Items.GUN)) {
event.setFOV(event.getFOV() / 5);
}
if (stack.is(ModItems.MONITOR.get()) && stack.getOrCreateTag().getBoolean("Using") && stack.getOrCreateTag().getBoolean("Linked")) {
droneFovLerp = Mth.lerp(0.1 * Minecraft.getInstance().getDeltaFrameTime(), droneFovLerp, droneFov);

View file

@ -38,7 +38,7 @@ public class MouseHandlerMixin {
ItemStack stack = mc.player.getMainHandItem();
if (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity && !stack.is(ModTags.Items.GUN)) {
if (player.getVehicle() != null && player.getVehicle() instanceof ICannonEntity) {
if (ClientEventHandler.zoom) {
return 0.15;
} else {

View file

@ -1,11 +1,10 @@
package com.atsuishio.superbwarfare.network.message;
import com.atsuishio.superbwarfare.network.ModVariables;
import com.atsuishio.superbwarfare.ModUtils;
import com.atsuishio.superbwarfare.entity.ICannonEntity;
import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.init.ModSounds;
import com.atsuishio.superbwarfare.init.ModTags;
import com.atsuishio.superbwarfare.network.ModVariables;
import com.atsuishio.superbwarfare.tools.SoundTool;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.protocol.game.ClientboundStopSoundPacket;
@ -53,7 +52,7 @@ public class ZoomMessage {
capability.syncPlayerVariables(player);
});
if (player.isPassenger() && player.getVehicle() instanceof ICannonEntity && !stack.is(ModTags.Items.GUN)) {
if (player.isPassenger() && player.getVehicle() instanceof ICannonEntity) {
SoundTool.playLocalSound(player, ModSounds.CANNON_ZOOM_IN.get(), 2, 1);
}
}
@ -65,7 +64,7 @@ public class ZoomMessage {
capability.syncPlayerVariables(player);
});
if (player.isPassenger() && player.getVehicle() instanceof ICannonEntity && !stack.is(ModTags.Items.GUN)) {
if (player.isPassenger() && player.getVehicle() instanceof ICannonEntity) {
SoundTool.playLocalSound(player, ModSounds.CANNON_ZOOM_OUT.get(), 2, 1);
}

View file

@ -38,4 +38,35 @@ public class TraceTool {
}
return null;
}
public static Entity cannonFindLookingEntity(Entity player, double entityReach) {
double distance = entityReach * entityReach;
Vec3 eyePos = new Vec3(player.getX(), player.getEyeY() + 1, player.getZ());
HitResult hitResult = player.pick(entityReach, 1.0f, false);
if (hitResult.getType() != HitResult.Type.MISS) {
distance = hitResult.getLocation().distanceToSqr(eyePos);
double blockReach = 5;
if (distance > blockReach * blockReach) {
Vec3 pos = hitResult.getLocation();
hitResult = BlockHitResult.miss(pos, Direction.getNearest(eyePos.x, eyePos.y, eyePos.z), BlockPos.containing(pos));
}
}
Vec3 viewVec = player.getViewVector(1.0F);
Vec3 toVec = eyePos.add(viewVec.x * entityReach, viewVec.y * entityReach, viewVec.z * entityReach);
AABB aabb = player.getBoundingBox().expandTowards(viewVec.scale(entityReach)).inflate(1.0D, 1.0D, 1.0D);
EntityHitResult entityhitresult = ProjectileUtil.getEntityHitResult(player, eyePos, toVec, aabb, p -> !p.isSpectator(), distance);
if (entityhitresult != null) {
Vec3 targetPos = entityhitresult.getLocation();
double distanceToTarget = eyePos.distanceToSqr(targetPos);
if (distanceToTarget > distance || distanceToTarget > entityReach * entityReach) {
hitResult = BlockHitResult.miss(targetPos, Direction.getNearest(viewVec.x, viewVec.y, viewVec.z), BlockPos.containing(targetPos));
} else if (distanceToTarget < distance) {
hitResult = entityhitresult;
}
}
if (hitResult.getType() == HitResult.Type.ENTITY) {
return ((EntityHitResult) hitResult).getEntity();
}
return null;
}
}