添加高爆弹
This commit is contained in:
parent
d7912793f9
commit
ce65b14776
8 changed files with 101 additions and 19 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
))) {
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Reference in a new issue