添加激光的爆头判定
This commit is contained in:
parent
e3f1fbf4e9
commit
63dda01876
21 changed files with 64 additions and 24 deletions
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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",
|
||||
|
||||
|
|
|
@ -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 |
|
@ -5,5 +5,6 @@
|
|||
"superbwarfare:custom_explosion",
|
||||
"superbwarfare:cannon_fire",
|
||||
"superbwarfare:laser"
|
||||
"superbwarfare:laser_headshot"
|
||||
]
|
||||
}
|
|
@ -6,5 +6,6 @@
|
|||
"superbwarfare:shock",
|
||||
"superbwarfare:cannon_fire",
|
||||
"superbwarfare:laser"
|
||||
"superbwarfare:laser_headshot"
|
||||
]
|
||||
}
|
|
@ -6,5 +6,6 @@
|
|||
"superbwarfare:shock",
|
||||
"superbwarfare:cannon_fire",
|
||||
"superbwarfare:laser"
|
||||
"superbwarfare:laser_headshot"
|
||||
]
|
||||
}
|
|
@ -6,5 +6,6 @@
|
|||
"superbwarfare:shock",
|
||||
"superbwarfare:cannon_fire",
|
||||
"superbwarfare:laser"
|
||||
"superbwarfare:laser_headshot"
|
||||
]
|
||||
}
|
|
@ -6,5 +6,6 @@
|
|||
"superbwarfare:shock",
|
||||
"superbwarfare:cannon_fire",
|
||||
"superbwarfare:laser"
|
||||
"superbwarfare:laser_headshot"
|
||||
]
|
||||
}
|
|
@ -4,5 +4,6 @@
|
|||
"superbwarfare:projectile_boom",
|
||||
"superbwarfare:custom_explosion",
|
||||
"superbwarfare:laser"
|
||||
"superbwarfare:laser_headshot"
|
||||
]
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"exhaustion": 0,
|
||||
"message_id": "laser_headshot",
|
||||
"scaling": "never"
|
||||
}
|
|
@ -5,7 +5,7 @@
|
|||
"mag": 1,
|
||||
"weight": 10,
|
||||
"EmptyReloadTime": 78,
|
||||
"damage": 500,
|
||||
"ExplosionDamage": 140,
|
||||
"damage": 300,
|
||||
"ExplosionDamage": 100,
|
||||
"ExplosionRadius": 6
|
||||
}
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Reference in a new issue