修改projectile的effect逻辑
This commit is contained in:
parent
86ab10b40d
commit
72da5c171e
4 changed files with 33 additions and 17 deletions
|
@ -1,16 +1,16 @@
|
|||
package com.atsuishio.superbwarfare.entity.projectile;
|
||||
|
||||
import com.atsuishio.superbwarfare.entity.*;
|
||||
import com.atsuishio.superbwarfare.init.*;
|
||||
import com.atsuishio.superbwarfare.tools.ParticleTool;
|
||||
import com.atsuishio.superbwarfare.ModUtils;
|
||||
import com.atsuishio.superbwarfare.block.BarbedWireBlock;
|
||||
import com.atsuishio.superbwarfare.entity.*;
|
||||
import com.atsuishio.superbwarfare.init.*;
|
||||
import com.atsuishio.superbwarfare.item.Transcript;
|
||||
import com.atsuishio.superbwarfare.network.message.ClientIndicatorMessage;
|
||||
import com.atsuishio.superbwarfare.network.message.PlayerGunKillMessage;
|
||||
import com.atsuishio.superbwarfare.tools.CustomExplosion;
|
||||
import com.atsuishio.superbwarfare.tools.ExtendedEntityRayTraceResult;
|
||||
import com.atsuishio.superbwarfare.tools.HitboxHelper;
|
||||
import com.atsuishio.superbwarfare.tools.ParticleTool;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.core.Holder;
|
||||
|
@ -64,7 +64,6 @@ import java.util.*;
|
|||
import java.util.function.BiFunction;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
@SuppressWarnings({"unused", "UnusedReturnValue", "SuspiciousNameCombination"})
|
||||
public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnData, GeoEntity, AnimatedEntity {
|
||||
|
@ -101,7 +100,7 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
|
|||
private boolean fireBullet = false;
|
||||
private int fireLevel = 0;
|
||||
private boolean dragonBreath = false;
|
||||
private Supplier<MobEffectInstance> mobEffect = () -> null;
|
||||
private final ArrayList<MobEffectInstance> mobEffects = new ArrayList<>();
|
||||
|
||||
public ProjectileEntity(EntityType<? extends ProjectileEntity> p_i50159_1_, Level p_i50159_2_) {
|
||||
super(p_i50159_1_, p_i50159_2_);
|
||||
|
@ -554,8 +553,10 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
|
|||
performDamage(entity, this.damage, false);
|
||||
}
|
||||
|
||||
if (this.mobEffect.get() != null && entity instanceof LivingEntity living) {
|
||||
living.addEffect(this.mobEffect.get(), this.shooter);
|
||||
if (!this.mobEffects.isEmpty() && entity instanceof LivingEntity living) {
|
||||
for (MobEffectInstance instance : this.mobEffects) {
|
||||
living.addEffect(instance, this.shooter);
|
||||
}
|
||||
}
|
||||
|
||||
this.discard();
|
||||
|
@ -847,8 +848,8 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
|
|||
return this;
|
||||
}
|
||||
|
||||
public ProjectileEntity effect(Supplier<MobEffectInstance> supplier) {
|
||||
this.mobEffect = supplier;
|
||||
public ProjectileEntity effect(ArrayList<MobEffectInstance> mobEffectInstances) {
|
||||
this.mobEffects.addAll(mobEffectInstances);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@ import net.minecraft.resources.ResourceLocation;
|
|||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.sounds.SoundEvent;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.effect.MobEffect;
|
||||
import net.minecraft.world.effect.MobEffectInstance;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.entity.projectile.Projectile;
|
||||
|
@ -33,6 +34,7 @@ import net.minecraftforge.eventbus.api.SubscribeEvent;
|
|||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.registries.ForgeRegistries;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
@Mod.EventBusSubscriber
|
||||
|
@ -205,7 +207,7 @@ public class GunEventHandler {
|
|||
bypassArmorRate += ammoPerk.bypassArmorRate + (perk == ModPerks.AP_BULLET.get() ? 0.05f * (level - 1) : 0);
|
||||
projectile.setRGB(ammoPerk.rgb);
|
||||
|
||||
if (ammoPerk.mobEffect.get() != null) {
|
||||
if (!ammoPerk.mobEffects.get().isEmpty()) {
|
||||
int amplifier;
|
||||
if (perk.descriptionId.equals("blade_bullet")) {
|
||||
amplifier = level / 3;
|
||||
|
@ -213,7 +215,11 @@ public class GunEventHandler {
|
|||
amplifier = level - 1;
|
||||
}
|
||||
|
||||
projectile.effect(() -> new MobEffectInstance(ammoPerk.mobEffect.get(), 70 + 30 * level, amplifier));
|
||||
ArrayList<MobEffectInstance> mobEffectInstances = new ArrayList<>();
|
||||
for (MobEffect effect : ammoPerk.mobEffects.get()) {
|
||||
mobEffectInstances.add(new MobEffectInstance(effect, 70 + 30 * level, amplifier));
|
||||
}
|
||||
projectile.effect(mobEffectInstances);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ import net.minecraft.server.level.ServerLevel;
|
|||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.sounds.SoundSource;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.effect.MobEffect;
|
||||
import net.minecraft.world.effect.MobEffectInstance;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
|
@ -35,6 +36,7 @@ import net.minecraftforge.network.NetworkEvent;
|
|||
import net.minecraftforge.network.PacketDistributor;
|
||||
import org.joml.Vector3d;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
|
@ -266,8 +268,12 @@ public class FireMessage {
|
|||
bypassArmorRate += ammoPerk.bypassArmorRate + (perk == ModPerks.AP_BULLET.get() ? 0.05f * (level - 1) : 0);
|
||||
projectile.setRGB(ammoPerk.rgb);
|
||||
|
||||
if (ammoPerk.mobEffect.get() != null) {
|
||||
projectile.effect(() -> new MobEffectInstance(ammoPerk.mobEffect.get(), 70 + 30 * level, level - 1));
|
||||
if (!ammoPerk.mobEffects.get().isEmpty()) {
|
||||
ArrayList<MobEffectInstance> mobEffectInstances = new ArrayList<>();
|
||||
for (MobEffect effect : ammoPerk.mobEffects.get()) {
|
||||
mobEffectInstances.add(new MobEffectInstance(effect, 70 + 30 * level, level - 1));
|
||||
}
|
||||
projectile.effect(mobEffectInstances);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3,15 +3,17 @@ package com.atsuishio.superbwarfare.perk;
|
|||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.effect.MobEffect;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class AmmoPerk extends Perk {
|
||||
|
||||
public float bypassArmorRate;
|
||||
public float damageRate;
|
||||
public float speedRate;
|
||||
public boolean slug;
|
||||
public float[] rgb;
|
||||
public Supplier<MobEffect> mobEffect;
|
||||
public Supplier<ArrayList<MobEffect>> mobEffects;
|
||||
|
||||
public AmmoPerk(AmmoPerk.Builder builder) {
|
||||
super(builder.descriptionId, builder.type);
|
||||
|
@ -20,10 +22,11 @@ public class AmmoPerk extends Perk {
|
|||
this.speedRate = builder.speedRate;
|
||||
this.slug = builder.slug;
|
||||
this.rgb = builder.rgb;
|
||||
this.mobEffect = builder.mobEffect;
|
||||
this.mobEffects = () -> builder.mobEffects;
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
|
||||
String descriptionId;
|
||||
Type type;
|
||||
float bypassArmorRate = 0.0f;
|
||||
|
@ -31,7 +34,7 @@ public class AmmoPerk extends Perk {
|
|||
float speedRate = 1.0f;
|
||||
boolean slug = false;
|
||||
float[] rgb = {1, 222 / 255f, 39 / 255f};
|
||||
public Supplier<MobEffect> mobEffect = () -> null;
|
||||
public ArrayList<MobEffect> mobEffects = new ArrayList<>();
|
||||
|
||||
public Builder(String descriptionId, Type type) {
|
||||
this.descriptionId = descriptionId;
|
||||
|
@ -66,7 +69,7 @@ public class AmmoPerk extends Perk {
|
|||
}
|
||||
|
||||
public AmmoPerk.Builder mobEffect(Supplier<MobEffect> mobEffect) {
|
||||
this.mobEffect = mobEffect;
|
||||
this.mobEffects.add(mobEffect.get());
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue