增加混伤的方法

This commit is contained in:
17146 2024-08-03 23:22:51 +08:00
parent 28b47371f4
commit 3f2742efbe
7 changed files with 97 additions and 40 deletions

View file

@ -7,6 +7,7 @@ import net.mcreator.superbwarfare.event.KillMessageHandler;
import net.mcreator.superbwarfare.init.ModDamageTypes;
import net.mcreator.superbwarfare.init.ModItems;
import net.mcreator.superbwarfare.item.gun.GunItem;
import net.mcreator.superbwarfare.tools.DamageTypeTool;
import net.mcreator.superbwarfare.tools.PlayerKillRecord;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
@ -112,8 +113,6 @@ public class KillMessageOverlay {
GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE
);
// TODO 实现图标半透明渲染
// 入场效果
if (record.tick < 3) {
gui.pose().translate((3 - record.tick - event.getPartialTick()) * 33, 0, 0);
@ -247,8 +246,7 @@ public class KillMessageOverlay {
if (record.headshot) {
icon = HEADSHOT;
} else {
if (record.damageType == ModDamageTypes.GUN_FIRE || record.damageType == ModDamageTypes.GUN_FIRE_HEADSHOT
|| record.damageType == ModDamageTypes.ARROW_IN_KNEE || record.damageType == ModDamageTypes.ARROW_IN_BRAIN) {
if (DamageTypeTool.isArrowDamage(record.damageType) || DamageTypeTool.isGunDamage(record.damageType)) {
icon = null;
} else {
// 如果是其他伤害则渲染对应图标

View file

@ -76,10 +76,11 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
protected int shooterId;
private float damage = 1f;
private float headShot = 1f;
private int monster_multiple = 0;
private int monsterMultiple = 0;
private float legShot = 0.5f;
private boolean beast = false;
private boolean zoom = false;
private float bypassArmorRate = 0.0f;
public ProjectileEntity(EntityType<? extends ProjectileEntity> p_i50159_1_, Level p_i50159_2_) {
super(p_i50159_1_, p_i50159_2_);
@ -109,7 +110,7 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
}
public ProjectileEntity monsterMultiple(int monsterMultiple) {
this.monster_multiple = monsterMultiple;
this.monsterMultiple = monsterMultiple;
return this;
}
@ -128,6 +129,11 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
return this;
}
public ProjectileEntity bypassArmorRate(float bypassArmorRate) {
this.bypassArmorRate = bypassArmorRate;
return this;
}
@Nullable
protected EntityResult findEntityOnPath(Vec3 startVec, Vec3 endVec) {
Vec3 hitVec = null;
@ -352,8 +358,8 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
}
}
protected void onHitEntity(Entity entity, boolean headshot, boolean legshot) {
float m_multiple = 1 + 0.2f * this.monster_multiple;
protected void onHitEntity(Entity entity, boolean headshot, boolean legShot) {
float mMultiple = 1 + 0.2f * this.monsterMultiple;
if (entity == null) return;
@ -401,11 +407,11 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> player), new ClientIndicatorMessage(1, 5));
}
if (entity instanceof Monster monster) {
monster.hurt(ModDamageTypes.causeGunFireHeadshotDamage(this.level().registryAccess(), this, this.shooter), this.damage * this.headShot * m_multiple);
performDamage(monster, this.damage * mMultiple, true);
} else {
entity.hurt(ModDamageTypes.causeGunFireHeadshotDamage(this.level().registryAccess(), this, this.shooter), this.damage * this.headShot);
performDamage(entity, this.damage, true);
}
} else if (legshot) {
} else if (legShot) {
if (!this.shooter.level().isClientSide() && this.shooter instanceof ServerPlayer player) {
var holder = Holder.direct(ModSounds.INDICATION.get());
player.connection.send(new ClientboundSoundPacket(holder, SoundSource.PLAYERS, player.getX(), player.getY(), player.getZ(), 1f, 1f, player.level().random.nextLong()));
@ -414,9 +420,9 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
}
if (entity instanceof Monster monster) {
monster.hurt(ModDamageTypes.causeGunFireDamage(this.level().registryAccess(), this, this.shooter), this.damage * this.legShot * m_multiple);
performDamage(monster, this.damage * mMultiple * this.legShot, false);
} else {
entity.hurt(ModDamageTypes.causeGunFireDamage(this.level().registryAccess(), this, this.shooter), this.damage * this.legShot);
performDamage(entity, this.damage * this.legShot, false);
}
if (entity instanceof LivingEntity living) {
@ -436,9 +442,9 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
}
if (entity instanceof Monster monster) {
monster.hurt(ModDamageTypes.causeGunFireDamage(this.level().registryAccess(), this, this.shooter), this.damage * m_multiple);
performDamage(monster, this.damage * mMultiple, false);
} else {
entity.hurt(ModDamageTypes.causeGunFireDamage(this.level().registryAccess(), this, this.shooter), this.damage);
performDamage(entity, this.damage, false);
}
}
this.discard();
@ -560,14 +566,25 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
this.xRotO = this.getXRot();
}
private void performDamage(Entity entity, float damage, boolean headshot) {
float normalDamage = damage * Mth.clamp(1 - bypassArmorRate, 0, 1);
float absoluteDamage = damage * Mth.clamp(bypassArmorRate, 0, 1);
if (headshot) {
entity.hurt(ModDamageTypes.causeGunFireHeadshotDamage(this.level().registryAccess(), this, this.shooter), normalDamage * this.headShot);
entity.hurt(ModDamageTypes.causeGunFireHeadshotAbsoluteDamage(this.level().registryAccess(), this, this.shooter), absoluteDamage * this.headShot);
} else {
entity.hurt(ModDamageTypes.causeGunFireDamage(this.level().registryAccess(), this, this.shooter), normalDamage);
entity.hurt(ModDamageTypes.causeGunFireAbsoluteDamage(this.level().registryAccess(), this, this.shooter), absoluteDamage);
}
}
@Override
public void writeSpawnData(FriendlyByteBuf buffer) {
}
@Override
public void readSpawnData(FriendlyByteBuf additionalData) {
}
public static class EntityResult {

View file

@ -345,6 +345,7 @@ public class GunEventHandler {
float headshot = (float) heldItem.getOrCreateTag().getDouble("headshot");
int monsterMultiple = EnchantmentHelper.getTagEnchantmentLevel(ModEnchantments.MONSTER_HUNTER.get(), heldItem);
float damage = (float) (heldItem.getOrCreateTag().getDouble("damage") + heldItem.getOrCreateTag().getDouble("add_damage")) * (float) heldItem.getOrCreateTag().getDouble("damageadd");
float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor");
boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom;
@ -352,7 +353,8 @@ public class GunEventHandler {
.shooter(player)
.damage(damage)
.headShot(headshot)
.zoom(zoom);
.zoom(zoom)
.bypassArmorRate(bypassArmorRate);
if (heldItem.getOrCreateTag().getBoolean("beast")) {
projectile.beast();

View file

@ -8,6 +8,7 @@ import net.mcreator.superbwarfare.item.gun.GunItem;
import net.mcreator.superbwarfare.network.ModVariables;
import net.mcreator.superbwarfare.network.message.ClientIndicatorMessage;
import net.mcreator.superbwarfare.network.message.PlayerGunKillMessage;
import net.mcreator.superbwarfare.tools.DamageTypeTool;
import net.mcreator.superbwarfare.tools.SoundTool;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.game.ClientboundStopSoundPacket;
@ -55,25 +56,23 @@ public class LivingEventHandler {
handlePlayerKillEntity(event);
}
private static void reduceBulletDamage(LivingHurtEvent event, DamageSource damagesource, LivingEntity entity, Entity sourceentity, double amount) {
if (damagesource == null || entity == null || sourceentity == null) {
private static void reduceBulletDamage(LivingHurtEvent event, DamageSource damageSource, LivingEntity entity, Entity sourceentity, double amount) {
if (damageSource == null || entity == null || sourceentity == null) {
return;
}
double damage = amount;
ItemStack stack = sourceentity instanceof LivingEntity living ? living.getMainHandItem() : ItemStack.EMPTY;
if ((damagesource.is(ModDamageTypes.ARROW_IN_KNEE) || damagesource.is(ModDamageTypes.ARROW_IN_BRAIN)
&& stack.getItem() == ModItems.BOCEK.get())) {
if (DamageTypeTool.isArrowDamage(damageSource) && stack.getItem() == ModItems.BOCEK.get()) {
stack.getOrCreateTag().putDouble("damagetotal", stack.getOrCreateTag().getDouble("damagetotal") + damage);
}
if ((damagesource.is(ModDamageTypes.PROJECTILE_BOOM) || damagesource.is(DamageTypes.ARROW))
&& (stack.getItem() == ModItems.M_79.get() || stack.getItem() == ModItems.RPG.get())
) {
if ((damageSource.is(ModDamageTypes.PROJECTILE_BOOM) || damageSource.is(DamageTypes.ARROW))
&& (stack.getItem() == ModItems.M_79.get() || stack.getItem() == ModItems.RPG.get())) {
stack.getOrCreateTag().putDouble("damagetotal", stack.getOrCreateTag().getDouble("damagetotal") + damage);
}
if (damagesource.is(ModDamageTypes.GUN_FIRE) || damagesource.is(ModDamageTypes.GUN_FIRE_HEADSHOT)) {
if (DamageTypeTool.isGunDamage(damageSource)) {
double distance = entity.position().distanceTo(sourceentity.position());
if (stack.is(ModTags.Items.SHOTGUN) || stack.getItem() == ModItems.BOCEK.get()) {
@ -247,7 +246,7 @@ public class LivingEventHandler {
}
if (attacker != null) {
if (source.is(ModDamageTypes.GUN_FIRE_HEADSHOT) || source.is(ModDamageTypes.ARROW_IN_BRAIN)) {
if (DamageTypeTool.isHeadshotDamage(source)) {
ModUtils.PACKET_HANDLER.send(PacketDistributor.ALL.noArg(), new PlayerGunKillMessage(attacker.getId(), entity.getId(), true, damageTypeResourceKey));
} else {
ModUtils.PACKET_HANDLER.send(PacketDistributor.ALL.noArg(), new PlayerGunKillMessage(attacker.getId(), entity.getId(), false, damageTypeResourceKey));
@ -275,21 +274,19 @@ public class LivingEventHandler {
return;
}
if (source.is(ModDamageTypes.GUN_FIRE) || source.is(ModDamageTypes.GUN_FIRE_HEADSHOT) ||
source.is(ModDamageTypes.ARROW_IN_BRAIN) || source.is(ModDamageTypes.ARROW_IN_KNEE)
|| source.is(ModDamageTypes.PROJECTILE_BOOM)) {
if (DamageTypeTool.isGunDamage(source) || source.is(ModDamageTypes.PROJECTILE_BOOM)) {
handleKillClipDamage(stack, event);
}
if (source.is(ModDamageTypes.GUN_FIRE) && source.getDirectEntity() instanceof ProjectileEntity projectile && projectile.isZoom()) {
if (DamageTypeTool.isGunFireDamage(source) && source.getDirectEntity() instanceof ProjectileEntity projectile && projectile.isZoom()) {
handleGutshotStraightDamage(stack, event);
}
if (source.is(ModDamageTypes.GUN_FIRE) || source.is(ModDamageTypes.GUN_FIRE_HEADSHOT)) {
if (DamageTypeTool.isGunDamage(source)) {
handleKillingTallyDamage(stack, event);
}
if (source.is(ModDamageTypes.GUN_FIRE_HEADSHOT)) {
if (DamageTypeTool.isGunHeadshotDamage(source)) {
handleFourthTimesCharm(stack);
}
}
@ -314,13 +311,11 @@ public class LivingEventHandler {
return;
}
if (source.is(ModDamageTypes.GUN_FIRE) || source.is(ModDamageTypes.GUN_FIRE_HEADSHOT) ||
source.is(ModDamageTypes.ARROW_IN_BRAIN) || source.is(ModDamageTypes.ARROW_IN_KNEE)
|| source.is(ModDamageTypes.PROJECTILE_BOOM)) {
if (DamageTypeTool.isGunDamage(source) || source.is(ModDamageTypes.PROJECTILE_BOOM)) {
handleClipEnchantments(stack);
}
if (source.is(ModDamageTypes.GUN_FIRE) || source.is(ModDamageTypes.GUN_FIRE_HEADSHOT)) {
if (DamageTypeTool.isGunDamage(source)) {
handleKillingTallyAddCount(stack);
}
}
@ -339,7 +334,7 @@ public class LivingEventHandler {
private static void handleKillClipDamage(ItemStack stack, LivingHurtEvent event) {
if (stack.getOrCreateTag().getInt("KillClipTime") > 0) {
int enchantmentLevel = EnchantmentHelper.getTagEnchantmentLevel(ModEnchantments.GUTSHOT_STRAIGHT.get(), stack);
int enchantmentLevel = EnchantmentHelper.getTagEnchantmentLevel(ModEnchantments.KILL_CLIP.get(), stack);
if (enchantmentLevel == 0) {
return;
}

View file

@ -491,7 +491,7 @@ public class PlayerEventHandler {
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
ModUtils.LOGGER.error(e.getLocalizedMessage());
}
}
};

View file

@ -212,12 +212,14 @@ public class FireMessage {
float velocity = 4 * (float) tag.getDouble("speed");
int monsterMultiple = EnchantmentHelper.getTagEnchantmentLevel(ModEnchantments.MONSTER_HUNTER.get(), heldItem);
boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom;
float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor");
var projectile = new ProjectileEntity(player.level())
.shooter(player)
.headShot(headshot)
.monsterMultiple(monsterMultiple)
.zoom(zoom);
.zoom(zoom)
.bypassArmorRate(bypassArmorRate);
if (tag.getBoolean("beast")) {
projectile.beast();

View file

@ -0,0 +1,43 @@
package net.mcreator.superbwarfare.tools;
import net.mcreator.superbwarfare.init.ModDamageTypes;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.damagesource.DamageType;
public class DamageTypeTool {
public static boolean isArrowDamage(DamageSource source) {
return source.is(ModDamageTypes.ARROW_IN_BRAIN) || source.is(ModDamageTypes.ARROW_IN_KNEE)
|| source.is(ModDamageTypes.ARROW_IN_BRAIN_ABSOLUTE) || source.is(ModDamageTypes.ARROW_IN_KNEE_ABSOLUTE);
}
public static boolean isArrowDamage(ResourceKey<DamageType> damageType) {
return damageType == ModDamageTypes.ARROW_IN_BRAIN || damageType == ModDamageTypes.ARROW_IN_KNEE
|| damageType == ModDamageTypes.ARROW_IN_BRAIN_ABSOLUTE || damageType == ModDamageTypes.ARROW_IN_KNEE_ABSOLUTE;
}
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);
}
public static boolean isGunDamage(ResourceKey<DamageType> damageType) {
return damageType == ModDamageTypes.GUN_FIRE || damageType == ModDamageTypes.GUN_FIRE_HEADSHOT
|| damageType == ModDamageTypes.GUN_FIRE_ABSOLUTE || damageType == ModDamageTypes.GUN_FIRE_HEADSHOT_ABSOLUTE;
}
public static boolean isGunHeadshotDamage(DamageSource source) {
return source.is(ModDamageTypes.GUN_FIRE_HEADSHOT) || source.is(ModDamageTypes.GUN_FIRE_HEADSHOT_ABSOLUTE);
}
public static boolean isHeadshotDamage(DamageSource source) {
return source.is(ModDamageTypes.GUN_FIRE_HEADSHOT) || source.is(ModDamageTypes.GUN_FIRE_HEADSHOT_ABSOLUTE)
|| source.is(ModDamageTypes.ARROW_IN_BRAIN) || source.is(ModDamageTypes.ARROW_IN_BRAIN_ABSOLUTE);
}
public static boolean isGunFireDamage(DamageSource source) {
return source.is(ModDamageTypes.GUN_FIRE) || source.is(ModDamageTypes.GUN_FIRE_ABSOLUTE);
}
}