From ce65b14776c2a4b404276e5ab9f89ddbcf92a2cf Mon Sep 17 00:00:00 2001 From: Atsuihsio <842960157@qq.com> Date: Fri, 27 Sep 2024 00:51:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=AB=98=E7=88=86=E5=BC=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/projectile/ProjectileEntity.java | 42 ++++++++++++++++--- .../event/ClientEventHandler.java | 13 +++++- .../superbwarfare/event/GunEventHandler.java | 14 ++++--- .../mcreator/superbwarfare/init/ModPerks.java | 4 +- .../network/message/FireMessage.java | 18 +++++++- .../network/message/ShootMessage.java | 7 +++- .../superbwarfare/tools/CustomExplosion.java | 2 +- .../superbwarfare/tools/ParticleTool.java | 20 ++++++++- 8 files changed, 101 insertions(+), 19 deletions(-) diff --git a/src/main/java/net/mcreator/superbwarfare/entity/projectile/ProjectileEntity.java b/src/main/java/net/mcreator/superbwarfare/entity/projectile/ProjectileEntity.java index 33bb426d2..4861aa848 100644 --- a/src/main/java/net/mcreator/superbwarfare/entity/projectile/ProjectileEntity.java +++ b/src/main/java/net/mcreator/superbwarfare/entity/projectile/ProjectileEntity.java @@ -7,6 +7,7 @@ import net.mcreator.superbwarfare.init.*; import net.mcreator.superbwarfare.item.Transcript; import net.mcreator.superbwarfare.network.message.ClientIndicatorMessage; import net.mcreator.superbwarfare.network.message.PlayerGunKillMessage; +import net.mcreator.superbwarfare.tools.CustomExplosion; import net.mcreator.superbwarfare.tools.ExtendedEntityRayTraceResult; import net.mcreator.superbwarfare.tools.HitboxHelper; import net.mcreator.superbwarfare.tools.ParticleTool; @@ -39,6 +40,7 @@ import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockState; @@ -97,7 +99,9 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa private float bypassArmorRate = 0.0f; private float undeadMultiple = 1.0f; private boolean jhpBullet = false; - private float jhpLevel = 0f; + private int jhpLevel = 0; + private boolean heBullet = false; + private int heLevel = 0; private Supplier mobEffect = () -> null; public ProjectileEntity(EntityType p_i50159_1_, Level p_i50159_2_) { @@ -332,6 +336,9 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa } this.onHitBlock(hitVec); + if (heBullet) { + explosionBulletBlock(this, damage, heLevel, monsterMultiple + 1, hitVec); + } } if (result instanceof ExtendedEntityRayTraceResult entityHitResult) { @@ -351,6 +358,16 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa } } + protected void explosionBulletBlock(Entity projectile , float damage, int heLevel, float monsterMultiple, Vec3 hitVec) { + CustomExplosion explosion = new CustomExplosion(projectile.level(), projectile, + ModDamageTypes.causeProjectileBoomDamage(projectile.level().registryAccess(), projectile, this.getShooter()), (float) ((2 + 0.1 * damage) * (1 + 0.1 * heLevel)), + hitVec.x, hitVec.y, hitVec.z, (float)((2.5 + 0.01 * damage) * (1 + 0.05 * heLevel)) , Explosion.BlockInteraction.KEEP).setDamageMultiplier(monsterMultiple); + explosion.explode(); + net.minecraftforge.event.ForgeEventFactory.onExplosionStart(projectile.level(), explosion); + explosion.finalizeExplosion(false); + ParticleTool.spawnSmallExplosionParticles(this.level(), hitVec); + } + private static int getRings(@NotNull BlockHitResult blockHitResult, @NotNull Vec3 hitVec) { Direction direction = blockHitResult.getDirection(); double x = Math.abs(Mth.frac(hitVec.x) - 0.5); @@ -418,7 +435,6 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa } else { ParticleTool.sendParticle(serverLevel, ModParticleTypes.BULLET_HOLE.get(), location.x, location.y, location.z, 1, 0, 0, 0, 0, true); ParticleTool.sendParticle(serverLevel, ParticleTypes.SMOKE, location.x, location.y, location.z, 3, 0, 0.1, 0, 0.01, true); - this.discard(); } serverLevel.playSound(null, new BlockPos((int) location.x, (int) location.y, (int) location.z), ModSounds.LAND.get(), SoundSource.BLOCKS, 1.0F, 1.0F); @@ -482,6 +498,10 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa this.damage *= (1.0f + 0.12f * jhpLevel) * ((float)(10 / (living.getAttributeValue(Attributes.ARMOR) + 10)) + 0.25f); } + if (heBullet) { + explosionBulletEntity(this, entity, damage, heLevel, mMultiple); + } + if (headshot) { if (!this.shooter.level().isClientSide() && this.shooter instanceof ServerPlayer player) { var holder = Holder.direct(ModSounds.HEADSHOT.get()); @@ -521,6 +541,16 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa this.discard(); } + protected void explosionBulletEntity(Entity projectile, Entity target, float damage, int heLevel, float monsterMultiple) { + CustomExplosion explosion = new CustomExplosion(projectile.level(), projectile, + ModDamageTypes.causeProjectileBoomDamage(projectile.level().registryAccess(), projectile, this.getShooter()), (float) ((2 + 0.1 * damage) * (1 + 0.1 * heLevel)), + target.getX(), target.getY(), target.getZ(), (float)((2.5 + 0.01 * damage) * (1 + 0.05 * heLevel)) , Explosion.BlockInteraction.KEEP).setDamageMultiplier(monsterMultiple); + explosion.explode(); + net.minecraftforge.event.ForgeEventFactory.onExplosionStart(projectile.level(), explosion); + explosion.finalizeExplosion(false); + ParticleTool.spawnSmallExplosionParticles(target.level(), target.position()); + } + public void setDamage(float damage) { this.damage = damage; } @@ -762,13 +792,15 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa return this; } - public ProjectileEntity jhpBullet() { + public ProjectileEntity jhpBullet(boolean jhpBullet, int jhpLevel) { this.jhpBullet = true; + this.jhpLevel = jhpLevel; return this; } - public ProjectileEntity jhpLevel(float jhpLevel) { - this.jhpLevel = jhpLevel; + public ProjectileEntity heBullet(boolean heBullet, int heLevel) { + this.heBullet = true; + this.heLevel = heLevel; return this; } diff --git a/src/main/java/net/mcreator/superbwarfare/event/ClientEventHandler.java b/src/main/java/net/mcreator/superbwarfare/event/ClientEventHandler.java index df25f7852..4b027b81e 100644 --- a/src/main/java/net/mcreator/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/net/mcreator/superbwarfare/event/ClientEventHandler.java @@ -5,9 +5,12 @@ import net.mcreator.superbwarfare.entity.DroneEntity; import net.mcreator.superbwarfare.entity.ICannonEntity; import net.mcreator.superbwarfare.init.ModItems; import net.mcreator.superbwarfare.init.ModMobEffects; +import net.mcreator.superbwarfare.init.ModPerks; import net.mcreator.superbwarfare.init.ModTags; import net.mcreator.superbwarfare.network.ModVariables; import net.mcreator.superbwarfare.network.message.ShootMessage; +import net.mcreator.superbwarfare.perk.Perk; +import net.mcreator.superbwarfare.perk.PerkHelper; import net.mcreator.superbwarfare.tools.MillisTimer; import net.minecraft.client.CameraType; import net.minecraft.client.Minecraft; @@ -124,6 +127,7 @@ public class ClientEventHandler { if (level == null) return; ItemStack stack = player.getMainHandItem(); + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); // 精准度 float times = Minecraft.getInstance().getDeltaFrameTime(); @@ -140,7 +144,13 @@ public class ClientEventHandler { if (stack.is(ModTags.Items.SNIPER_RIFLE)) { zoomSpread = 1 - (0.995 * zoomTime); - } else if (stack.is(ModTags.Items.SHOTGUN) || stack.is(ModItems.MINIGUN.get())) { + } else if (stack.is(ModTags.Items.SHOTGUN)) { + if (perk == ModPerks.HE_BULLET.get()) { + zoomSpread = 1 - (0.85 * zoomTime); + } else { + zoomSpread = 1 - (0.25 * zoomTime); + } + } else if (stack.is(ModItems.MINIGUN.get())) { zoomSpread = 1 - (0.25 * zoomTime); } else { zoomSpread = 1 - (0.9 * zoomTime); @@ -157,6 +167,7 @@ public class ClientEventHandler { // 开火部分 if (GLFW.glfwGetMouseButton(Minecraft.getInstance().getWindow().getWindow(), GLFW.GLFW_MOUSE_BUTTON_LEFT) == GLFW.GLFW_PRESS && (player.getMainHandItem().is(ModTags.Items.NORMAL_GUN) + && !notInGame() || (stack.is(ModItems.MINIGUN.get()) && !player.isSprinting() && stack.getOrCreateTag().getDouble("overheat") == 0 && !player.getCooldowns().isOnCooldown(stack.getItem()) && stack.getOrCreateTag().getDouble("minigun_rotation") >= 10 ))) { diff --git a/src/main/java/net/mcreator/superbwarfare/event/GunEventHandler.java b/src/main/java/net/mcreator/superbwarfare/event/GunEventHandler.java index 29fcf9a2c..97f0948da 100644 --- a/src/main/java/net/mcreator/superbwarfare/event/GunEventHandler.java +++ b/src/main/java/net/mcreator/superbwarfare/event/GunEventHandler.java @@ -195,17 +195,17 @@ public class GunEventHandler { if (!player.level().isClientSide()) { float headshot = (float) heldItem.getOrCreateTag().getDouble("headshot"); float damage = (float) (heldItem.getOrCreateTag().getDouble("damage") + heldItem.getOrCreateTag().getDouble("sentinelChargeDamage")) * (float) heldItem.getOrCreateTag().getDouble("levelDamageMultiple"); - boolean zoom = player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).zoom; + var perk = PerkHelper.getPerkByType(heldItem, Perk.Type.AMMO); ProjectileEntity projectile = new ProjectileEntity(player.level()) .shooter(player) - .damage(damage) + .damage((perk == ModPerks.HE_BULLET.get() ? (int)heldItem.getOrCreateTag().getDouble("projectile_amount") * damage : damage)) .headShot(headshot) .zoom(zoom); float bypassArmorRate = (float) heldItem.getOrCreateTag().getDouble("BypassesArmor"); - var perk = PerkHelper.getPerkByType(heldItem, Perk.Type.AMMO); + if (perk instanceof AmmoPerk ammoPerk) { int level = PerkHelper.getItemPerkLevel(perk, heldItem); @@ -234,13 +234,15 @@ public class GunEventHandler { projectile.beast(); } else if (perk == ModPerks.JHP_BULLET.get()) { int level = PerkHelper.getItemPerkLevel(perk, heldItem); - projectile.jhpBullet(); - projectile.jhpLevel(level); + projectile.jhpBullet(true, level); + } else if (perk == ModPerks.HE_BULLET.get()) { + int level = PerkHelper.getItemPerkLevel(perk, heldItem); + projectile.heBullet(true, level); } var dmgPerk = PerkHelper.getPerkByType(heldItem, Perk.Type.DAMAGE); if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) { - int level = PerkHelper.getItemPerkLevel(dmgPerk, heldItem); + int level = PerkHelper.getItemPerkLevel(perk, heldItem); projectile.monsterMultiple(0.1f + 0.1f * level); } diff --git a/src/main/java/net/mcreator/superbwarfare/init/ModPerks.java b/src/main/java/net/mcreator/superbwarfare/init/ModPerks.java index c1af1c69a..821f9733a 100644 --- a/src/main/java/net/mcreator/superbwarfare/init/ModPerks.java +++ b/src/main/java/net/mcreator/superbwarfare/init/ModPerks.java @@ -29,9 +29,11 @@ public class ModPerks { public static final DeferredRegister AMMO_PERKS = DeferredRegister.create(new ResourceLocation(ModUtils.MODID, "perk"), ModUtils.MODID); public static final RegistryObject AP_BULLET = AMMO_PERKS.register("ap_bullet", - () -> new AmmoPerk(new AmmoPerk.Builder("ap_bullet", Perk.Type.AMMO).bypassArmorRate(0.4f).rgb(230, 0, 0))); + () -> new AmmoPerk(new AmmoPerk.Builder("ap_bullet", Perk.Type.AMMO).bypassArmorRate(0.4f).rgb(230, 70, 35))); public static final RegistryObject JHP_BULLET = AMMO_PERKS.register("jhp_bullet", () -> new AmmoPerk(new AmmoPerk.Builder("jhp_bullet", Perk.Type.AMMO).bypassArmorRate(-0.2f).rgb(230, 131, 65))); + public static final RegistryObject HE_BULLET = AMMO_PERKS.register("he_bullet", + () -> new AmmoPerk(new AmmoPerk.Builder("he_bullet", Perk.Type.AMMO).bypassArmorRate(-0.3f).rgb(240, 20, 10))); public static final RegistryObject SILVER_BULLET = AMMO_PERKS.register("silver_bullet", () -> new AmmoPerk(new AmmoPerk.Builder("silver_bullet", Perk.Type.AMMO).bypassArmorRate(0.05f).rgb(87, 166, 219))); public static final RegistryObject POISONOUS_BULLET = AMMO_PERKS.register("poisonous_bullet", diff --git a/src/main/java/net/mcreator/superbwarfare/network/message/FireMessage.java b/src/main/java/net/mcreator/superbwarfare/network/message/FireMessage.java index c4090e98e..dfeb812e4 100644 --- a/src/main/java/net/mcreator/superbwarfare/network/message/FireMessage.java +++ b/src/main/java/net/mcreator/superbwarfare/network/message/FireMessage.java @@ -219,6 +219,12 @@ public class FireMessage { projectile.undeadMultiple(1.0f + 0.5f * level); } else if (perk == ModPerks.BEAST_BULLET.get()) { projectile.beast(); + } else if (perk == ModPerks.JHP_BULLET.get()) { + int level = PerkHelper.getItemPerkLevel(perk, heldItem); + projectile.jhpBullet(true, level); + } else if (perk == ModPerks.HE_BULLET.get()) { + int level = PerkHelper.getItemPerkLevel(perk, heldItem); + projectile.heBullet(true, level); } var dmgPerk = PerkHelper.getPerkByType(heldItem, Perk.Type.DAMAGE); @@ -253,7 +259,9 @@ public class FireMessage { } else { stack.getOrCreateTag().putBoolean("shoot", true); - for (int index0 = 0; index0 < 10; index0++) { + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + + for (int index0 = 0; index0 < (perk == ModPerks.HE_BULLET.get() ? 1 : 10); index0++) { spawnBullet(player); } @@ -334,6 +342,12 @@ public class FireMessage { projectile.undeadMultiple(1.0f + 0.5f * level); } else if (perk == ModPerks.BEAST_BULLET.get()) { projectile.beast(); + } else if (perk == ModPerks.JHP_BULLET.get()) { + int level = PerkHelper.getItemPerkLevel(perk, heldItem); + projectile.jhpBullet(true, level); + } else if (perk == ModPerks.HE_BULLET.get()) { + int level = PerkHelper.getItemPerkLevel(perk, heldItem); + projectile.heBullet(true, level); } var dmgPerk = PerkHelper.getPerkByType(heldItem, Perk.Type.DAMAGE); @@ -346,7 +360,7 @@ public class FireMessage { damage = 0.008333333 * tag.getDouble("damage") * tag.getDouble("speed") * tag.getDouble("levelDamageMultiple"); projectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, velocity, 2.5f); - projectile.damage((float) damage); + projectile.damage((float) (perk == ModPerks.HE_BULLET.get() ? 10 * damage : damage)); player.level().addFreshEntity(projectile); } diff --git a/src/main/java/net/mcreator/superbwarfare/network/message/ShootMessage.java b/src/main/java/net/mcreator/superbwarfare/network/message/ShootMessage.java index a9072fe1d..5c79e4601 100644 --- a/src/main/java/net/mcreator/superbwarfare/network/message/ShootMessage.java +++ b/src/main/java/net/mcreator/superbwarfare/network/message/ShootMessage.java @@ -152,9 +152,12 @@ public class ShootMessage { int cooldown = burstCooldown + singleInterval + customCoolDown; player.getCooldowns().addCooldown(stack.getItem(), cooldown); - for (int index0 = 0; index0 < (int) stack.getOrCreateTag().getDouble("projectile_amount"); index0++) { + var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + + for (int index0 = 0; index0 < (perk == ModPerks.HE_BULLET.get() ? 1 : (int) stack.getOrCreateTag().getDouble("projectile_amount")); index0++) { gunShoot(player, spared); } + playGunSounds(player); stack.getOrCreateTag().putBoolean("shoot", true); @@ -195,7 +198,7 @@ public class ShootMessage { stack.getOrCreateTag().putBoolean("shoot", true); - for (int index0 = 0; index0 < (int) stack.getOrCreateTag().getDouble("projectile_amount"); index0++) { + for (int index0 = 0; index0 < (perk == ModPerks.HE_BULLET.get() ? 1 : (int) stack.getOrCreateTag().getDouble("projectile_amount")); index0++) { gunShoot(player, spared); } diff --git a/src/main/java/net/mcreator/superbwarfare/tools/CustomExplosion.java b/src/main/java/net/mcreator/superbwarfare/tools/CustomExplosion.java index dee4f7ced..6120660f5 100644 --- a/src/main/java/net/mcreator/superbwarfare/tools/CustomExplosion.java +++ b/src/main/java/net/mcreator/superbwarfare/tools/CustomExplosion.java @@ -170,7 +170,7 @@ public class CustomExplosion extends Explosion { yDistance *= d11; zDistance *= d11; - Vec3 knockbackVec = new Vec3(xDistance, yDistance, zDistance); + Vec3 knockbackVec = new Vec3(0.2 * xDistance, 0.2 * yDistance, 0.2 * zDistance); entity.setDeltaMovement(entity.getDeltaMovement().add(knockbackVec)); if (entity instanceof Player player) { diff --git a/src/main/java/net/mcreator/superbwarfare/tools/ParticleTool.java b/src/main/java/net/mcreator/superbwarfare/tools/ParticleTool.java index eb3f1b33d..d951611cf 100644 --- a/src/main/java/net/mcreator/superbwarfare/tools/ParticleTool.java +++ b/src/main/java/net/mcreator/superbwarfare/tools/ParticleTool.java @@ -7,6 +7,7 @@ import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; @@ -25,6 +26,24 @@ public class ParticleTool { level.sendParticles(viewer, particle, force, x, y, z, count, xOffset, yOffset, zOffset, speed); } + public static void spawnSmallExplosionParticles(Level level, Vec3 pos) { + double x = pos.x; + double y = pos.y; + double z = pos.z; + + if (!level.isClientSide()) { + level.playSound(null, BlockPos.containing(x, y + 1, z), SoundEvents.FIREWORK_ROCKET_BLAST, SoundSource.BLOCKS, 4, 1); + } else { + level.playLocalSound(x, (y + 1), z, SoundEvents.FIREWORK_ROCKET_BLAST, SoundSource.BLOCKS, 2, 1, false); + } + + if (level instanceof ServerLevel serverLevel) { + sendParticle(serverLevel, ParticleTypes.CAMPFIRE_COSY_SMOKE, x, y, z, 3, 0.1, 0.1, 0.1, 0.02, true); + sendParticle(serverLevel, ParticleTypes.LARGE_SMOKE, x, y, z, 4, 0.2, 0.2, 0.2, 0.02, true); + sendParticle(serverLevel, ModParticleTypes.FIRE_STAR.get(), x, y, z, 6, 0, 0, 0, 0.2, true); + } + } + public static void spawnMediumExplosionParticles(Level level, Vec3 pos) { double x = pos.x; double y = pos.y; @@ -59,7 +78,6 @@ public class ParticleTool { sendParticle(serverLevel, ParticleTypes.CAMPFIRE_COSY_SMOKE, x, y, z, 20, 1, 0.001, 1, 0.01, true); sendParticle(serverLevel, ModParticleTypes.FIRE_STAR.get(), x, y, z, 30, 0, 0, 0, 0.2, true); } - } public static void spawnHugeExplosionParticles(Level level, Vec3 pos) {