添加激光的爆头判定

This commit is contained in:
Atsuihsio 2024-12-04 03:27:37 +08:00
parent e3f1fbf4e9
commit 63dda01876
21 changed files with 64 additions and 24 deletions

View file

@ -276,7 +276,7 @@ public class KillMessageOverlay {
icon = BURN;
} else if (record.damageType == ModDamageTypes.DRONE_HIT) {
icon = DRONE;
} else if (record.damageType == ModDamageTypes.LASER) {
} else if (record.damageType == ModDamageTypes.LASER || record.damageType == ModDamageTypes.LASER_HEADSHOT) {
icon = LASER;
} else {
icon = GENERIC;

View file

@ -368,7 +368,7 @@ public class ClientEventHandler {
&& (!player.isAlliedTo(lookingEntity) || lookingEntity.getTeam() == null || lookingEntity.getTeam().getName().equals("TDM"));
if (canAttack) {
ModUtils.PACKET_HANDLER.sendToServer(new LaserShootMessage(1, lookingEntity.getUUID()));
ModUtils.PACKET_HANDLER.sendToServer(new LaserShootMessage(1, lookingEntity.getUUID(), TraceTool.laserHeadshot));
}
}
}

View file

@ -29,6 +29,7 @@ public class ModDamageTypes {
public static final ResourceKey<DamageType> CUSTOM_EXPLOSION = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(ModUtils.MODID, "custom_explosion"));
public static final ResourceKey<DamageType> DRONE_HIT = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(ModUtils.MODID, "drone_hit"));
public static final ResourceKey<DamageType> LASER = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(ModUtils.MODID, "laser"));
public static final ResourceKey<DamageType> LASER_HEADSHOT = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(ModUtils.MODID, "laser_headshot"));
public static DamageSource causeGunFireDamage(RegistryAccess registryAccess, @Nullable Entity directEntity, @Nullable Entity attacker) {
return new DamageMessages(registryAccess.registry(Registries.DAMAGE_TYPE).get().getHolderOrThrow(GUN_FIRE), directEntity, attacker);
@ -78,6 +79,10 @@ public class ModDamageTypes {
return new DamageMessages(registryAccess.registry(Registries.DAMAGE_TYPE).get().getHolderOrThrow(LASER), directEntity, attacker);
}
public static DamageSource causeLaserHeadshotDamage(RegistryAccess registryAccess, @Nullable Entity directEntity, @Nullable Entity attacker) {
return new DamageMessages(registryAccess.registry(Registries.DAMAGE_TYPE).get().getHolderOrThrow(LASER_HEADSHOT), directEntity, attacker);
}
private static class DamageMessages extends DamageSource {
public DamageMessages(Holder.Reference<DamageType> typeReference) {
super(typeReference);

View file

@ -118,7 +118,7 @@ public class BeamTest extends Item {
&& (!player.isAlliedTo(lookingEntity) || lookingEntity.getTeam() == null || lookingEntity.getTeam().getName().equals("TDM"));
if (canAttack) {
ModUtils.PACKET_HANDLER.sendToServer(new LaserShootMessage(45, lookingEntity.getUUID()));
ModUtils.PACKET_HANDLER.sendToServer(new LaserShootMessage(45 , lookingEntity.getUUID(), TraceTool.laserHeadshot));
}
}

View file

@ -28,7 +28,7 @@ public class LivingEntityMixin {
|| this.target$source.is(ModDamageTypes.GUN_FIRE_HEADSHOT_ABSOLUTE) || this.target$source.is(ModDamageTypes.BURN)) {
return 0.05 * original;
}
if (this.target$source.is(ModDamageTypes.LASER)) {
if (this.target$source.is(ModDamageTypes.LASER) || this.target$source.is(ModDamageTypes.LASER_HEADSHOT)) {
return -original;
}
return original;

View file

@ -8,7 +8,6 @@ import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraftforge.network.NetworkEvent;
import net.minecraftforge.network.PacketDistributor;
@ -18,34 +17,36 @@ import java.util.function.Supplier;
public class LaserShootMessage {
private final double damage;
private final UUID uuid;
private final boolean headshot;
public LaserShootMessage(double damage, UUID uuid) {
public LaserShootMessage(double damage, UUID uuid, boolean headshot) {
this.damage = damage;
this.uuid = uuid;
this.headshot = headshot;
}
public static LaserShootMessage decode(FriendlyByteBuf buffer) {
return new LaserShootMessage(buffer.readDouble(), buffer.readUUID());
return new LaserShootMessage(buffer.readDouble(), buffer.readUUID(), buffer.readBoolean());
}
public static void encode(LaserShootMessage message, FriendlyByteBuf buffer) {
buffer.writeDouble(message.damage);
buffer.writeUUID(message.uuid);
buffer.writeBoolean(message.headshot);
}
public static void handler(LaserShootMessage message, Supplier<NetworkEvent.Context> contextSupplier) {
NetworkEvent.Context context = contextSupplier.get();
context.enqueueWork(() -> {
if (context.getSender() != null) {
pressAction(context.getSender(), message.damage, message.uuid);
pressAction(context.getSender(), message.damage, message.uuid, message.headshot);
}
});
context.setPacketHandled(true);
}
public static void pressAction(Player player, double damage, UUID uuid) {
public static void pressAction(ServerPlayer player, double damage, UUID uuid, boolean headshot) {
Level level = player.level();
if (!level.isLoaded(player.blockPosition())) {
@ -55,12 +56,16 @@ public class LaserShootMessage {
Entity entity = EntityFindUtil.findEntity(level, String.valueOf(uuid));
if (entity != null) {
entity.hurt(ModDamageTypes.causeLaserDamage(level.registryAccess(), player, player), (float) damage);
entity.invulnerableTime = 0;
if (player instanceof ServerPlayer serverPlayer) {
if (headshot) {
entity.hurt(ModDamageTypes.causeLaserHeadshotDamage(level.registryAccess(), player, player), (float) (2 * damage));
player.level().playSound(null, player.blockPosition(), ModSounds.HEADSHOT.get(), SoundSource.VOICE, 0.1f, 1);
ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> player), new ClientIndicatorMessage(1, 5));
} else {
entity.hurt(ModDamageTypes.causeLaserDamage(level.registryAccess(), player, player), (float) damage);
player.level().playSound(null, player.blockPosition(), ModSounds.INDICATION.get(), SoundSource.VOICE, 0.1f, 1);
ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new ClientIndicatorMessage(0, 5));
ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> player), new ClientIndicatorMessage(0, 5));
}
entity.invulnerableTime = 0;
}
}
}

View file

@ -10,7 +10,8 @@ public class DamageTypeTool {
public static boolean isGunDamage(DamageSource source) {
return source.is(ModDamageTypes.GUN_FIRE) || source.is(ModDamageTypes.GUN_FIRE_HEADSHOT)
|| source.is(ModDamageTypes.GUN_FIRE_ABSOLUTE) || source.is(ModDamageTypes.GUN_FIRE_HEADSHOT_ABSOLUTE)
|| source.is(ModDamageTypes.SHOCK)|| source.is(ModDamageTypes.BURN);
|| source.is(ModDamageTypes.SHOCK) || source.is(ModDamageTypes.BURN)
|| source.is(ModDamageTypes.LASER) || source.is(ModDamageTypes.LASER_HEADSHOT);
}
public static boolean isGunDamage(ResourceKey<DamageType> damageType) {
@ -23,14 +24,18 @@ public class DamageTypeTool {
}
public static boolean isGunFireDamage(DamageSource source) {
return source.is(ModDamageTypes.GUN_FIRE) || source.is(ModDamageTypes.GUN_FIRE_ABSOLUTE);
return source.is(ModDamageTypes.GUN_FIRE) || source.is(ModDamageTypes.GUN_FIRE_ABSOLUTE)
|| source.is(ModDamageTypes.SHOCK) || source.is(ModDamageTypes.BURN)
|| source.is(ModDamageTypes.LASER) || source.is(ModDamageTypes.LASER_HEADSHOT);
}
public static boolean isModDamage(DamageSource source) {
return source.is(ModDamageTypes.GUN_FIRE_ABSOLUTE) || source.is(ModDamageTypes.GUN_FIRE_HEADSHOT_ABSOLUTE)
|| source.is(ModDamageTypes.GUN_FIRE) || source.is(ModDamageTypes.GUN_FIRE_HEADSHOT)
|| source.is(ModDamageTypes.MINE) || source.is(ModDamageTypes.SHOCK)
|| source.is(ModDamageTypes.PROJECTILE_BOOM) || source.is(ModDamageTypes.CANNON_FIRE);
|| source.is(ModDamageTypes.PROJECTILE_BOOM) || source.is(ModDamageTypes.CANNON_FIRE)
|| source.is(ModDamageTypes.BURN)
|| source.is(ModDamageTypes.LASER) || source.is(ModDamageTypes.LASER_HEADSHOT);
}
}

View file

@ -3,6 +3,7 @@ package com.atsuishio.superbwarfare.tools;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.projectile.ProjectileUtil;
import net.minecraft.world.level.ClipContext;
import net.minecraft.world.level.block.state.BlockState;
@ -10,6 +11,8 @@ import net.minecraft.world.phys.*;
public class TraceTool {
public static boolean laserHeadshot = false;
public static Entity findLookingEntity(Entity player, double entityReach) {
double distance = entityReach * entityReach;
Vec3 eyePos = player.getEyePosition(1.0f);
@ -74,12 +77,17 @@ public class TraceTool {
} else if (distanceToTarget < distance) {
hitResult = entityhitresult;
}
}
if (hitResult.getType() == HitResult.Type.ENTITY) {
if (((EntityHitResult) hitResult).getEntity().isAlive()) {
Vec3 hitVec = entityhitresult.getLocation();
if (hitResult.getType() == HitResult.Type.ENTITY && ((EntityHitResult) hitResult).getEntity().isAlive()) {
if (((EntityHitResult) hitResult).getEntity() instanceof LivingEntity living) {
laserHeadshot = living.getEyeY() - 0.4 < hitVec.y && hitVec.y < living.getEyeY() + 0.5;
} else {
laserHeadshot = false;
}
return ((EntityHitResult) hitResult).getEntity();
}
}
return null;
}

View file

@ -329,6 +329,9 @@
"death.attack.laser": "%1$s被激光射穿了",
"death.attack.laser.entity": "%1$s被%2$s用激光射穿了",
"death.attack.laser.item": "%1$s被%2$s用%3$s激光射穿了",
"death.attack.laser_headshot": "%1$s的脑子被激光洞穿了",
"death.attack.laser_headshot.entity": "%1$s被%2$s用激光射穿了脑袋",
"death.attack.laser_headshot.item": "%1$s的脑子被%2$s用%3$s发射的激光洞穿了",
"gui.superbwarfare.mortar_gui.button_set": "Confirm",

View file

@ -329,6 +329,9 @@
"death.attack.laser": "%1$s被激光射穿了",
"death.attack.laser.entity": "%1$s被%2$s用激光射穿了",
"death.attack.laser.item": "%1$s被%2$s用%3$s激光射穿了",
"death.attack.laser_headshot": "%1$s的脑子被激光洞穿了",
"death.attack.laser_headshot.entity": "%1$s被%2$s用激光射穿了脑袋",
"death.attack.laser_headshot.item": "%1$s的脑子被%2$s用%3$s发射的激光洞穿了",
"gui.superbwarfare.mortar_gui.button_set": "确认",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 B

After

Width:  |  Height:  |  Size: 8.7 KiB

View file

@ -5,5 +5,6 @@
"superbwarfare:custom_explosion",
"superbwarfare:cannon_fire",
"superbwarfare:laser"
"superbwarfare:laser_headshot"
]
}

View file

@ -6,5 +6,6 @@
"superbwarfare:shock",
"superbwarfare:cannon_fire",
"superbwarfare:laser"
"superbwarfare:laser_headshot"
]
}

View file

@ -6,5 +6,6 @@
"superbwarfare:shock",
"superbwarfare:cannon_fire",
"superbwarfare:laser"
"superbwarfare:laser_headshot"
]
}

View file

@ -6,5 +6,6 @@
"superbwarfare:shock",
"superbwarfare:cannon_fire",
"superbwarfare:laser"
"superbwarfare:laser_headshot"
]
}

View file

@ -6,5 +6,6 @@
"superbwarfare:shock",
"superbwarfare:cannon_fire",
"superbwarfare:laser"
"superbwarfare:laser_headshot"
]
}

View file

@ -4,5 +4,6 @@
"superbwarfare:projectile_boom",
"superbwarfare:custom_explosion",
"superbwarfare:laser"
"superbwarfare:laser_headshot"
]
}

View file

@ -0,0 +1,5 @@
{
"exhaustion": 0,
"message_id": "laser_headshot",
"scaling": "never"
}

View file

@ -5,7 +5,7 @@
"mag": 1,
"weight": 10,
"EmptyReloadTime": 78,
"damage": 500,
"ExplosionDamage": 140,
"damage": 300,
"ExplosionDamage": 100,
"ExplosionRadius": 6
}

View file

@ -2,8 +2,8 @@
"spread": 5,
"recoil_x": 0.008,
"recoil_y": 0.018,
"damage": 400,
"ExplosionDamage": 200,
"damage": 200,
"ExplosionDamage": 150,
"ExplosionRadius": 10,
"velocity": 4,
"mag": 1,