添加高爆弹

This commit is contained in:
Atsuihsio 2024-09-27 00:51:58 +08:00
parent d7912793f9
commit ce65b14776
8 changed files with 101 additions and 19 deletions

View file

@ -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<MobEffectInstance> mobEffect = () -> null;
public ProjectileEntity(EntityType<? extends ProjectileEntity> 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;
}

View file

@ -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
))) {

View file

@ -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);
}

View file

@ -29,9 +29,11 @@ public class ModPerks {
public static final DeferredRegister<Perk> AMMO_PERKS = DeferredRegister.create(new ResourceLocation(ModUtils.MODID, "perk"), ModUtils.MODID);
public static final RegistryObject<Perk> 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<Perk> 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<Perk> 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<Perk> 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<Perk> POISONOUS_BULLET = AMMO_PERKS.register("poisonous_bullet",

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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) {

View file

@ -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) {