添加左轮扣扳机的过程

This commit is contained in:
Atsuihsio 2024-11-17 22:09:45 +08:00
parent 0c8dcba24f
commit 935d0c7e66
14 changed files with 183 additions and 10 deletions

View file

@ -100,6 +100,9 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
private int jhpLevel = 0; private int jhpLevel = 0;
private boolean heBullet = false; private boolean heBullet = false;
private int heLevel = 0; private int heLevel = 0;
private boolean fireBullet = false;
private int fireLevel = 0;
private boolean dragonBreath = false;
private Supplier<MobEffectInstance> mobEffect = () -> null; private Supplier<MobEffectInstance> mobEffect = () -> null;
public ProjectileEntity(EntityType<? extends ProjectileEntity> p_i50159_1_, Level p_i50159_2_) { public ProjectileEntity(EntityType<? extends ProjectileEntity> p_i50159_1_, Level p_i50159_2_) {
@ -294,9 +297,19 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
this.setDeltaMovement(vec.x, vec.y - 0.02, vec.z); this.setDeltaMovement(vec.x, vec.y - 0.02, vec.z);
if (this.tickCount > 40) { if (this.tickCount > (fireBullet ? 10 : 40)) {
this.discard(); this.discard();
} }
if (fireBullet && dragonBreath && this.level() instanceof ServerLevel serverLevel) {
for (int index0 = 0; index0 < 1; index0++) {
double randomPos = 2 * (Math.random() - 0.5);
ParticleTool.sendParticle(serverLevel, ParticleTypes.FLAME, this.getX(), this.getY(), this.getZ(),
1, randomPos, randomPos, randomPos, 0.001, true);
ParticleTool.sendParticle(serverLevel, ModParticleTypes.FIRE_STAR.get(), this.getX(), this.getY(), this.getZ(),
1, randomPos, randomPos, randomPos, 0.001, true);
}
}
} }
@Override @Override
@ -339,6 +352,10 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
if (heBullet) { if (heBullet) {
explosionBulletBlock(this, this.damage, heLevel, monsterMultiple + 1, hitVec); explosionBulletBlock(this, this.damage, heLevel, monsterMultiple + 1, hitVec);
} }
if (fireBullet && this.level() instanceof ServerLevel serverLevel) {
ParticleTool.sendParticle(serverLevel, ParticleTypes.LAVA, hitVec.x, hitVec.y, hitVec.z,
3, 0, 0, 0, 0.5, true);
}
} }
if (result instanceof ExtendedEntityRayTraceResult entityHitResult) { if (result instanceof ExtendedEntityRayTraceResult entityHitResult) {
@ -502,6 +519,12 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
explosionBulletEntity(this, entity, this.damage, heLevel, mMultiple); explosionBulletEntity(this, entity, this.damage, heLevel, mMultiple);
} }
if (fireBullet) {
if (!entity.level().isClientSide() && entity instanceof LivingEntity living) {
living.addEffect(new MobEffectInstance(ModMobEffects.BURN.get(), 60 + fireLevel * 20, fireLevel, false , false), this.shooter);
}
}
if (headshot) { if (headshot) {
if (!this.shooter.level().isClientSide() && this.shooter instanceof ServerPlayer player) { if (!this.shooter.level().isClientSide() && this.shooter instanceof ServerPlayer player) {
var holder = Holder.direct(ModSounds.HEADSHOT.get()); var holder = Holder.direct(ModSounds.HEADSHOT.get());
@ -802,6 +825,13 @@ public class ProjectileEntity extends Entity implements IEntityAdditionalSpawnDa
return this; return this;
} }
public ProjectileEntity fireBullet(boolean fireBullet, int fireLevel, boolean dragonBreath) {
this.fireBullet = true;
this.fireLevel = fireLevel;
this.dragonBreath = dragonBreath;
return this;
}
public ProjectileEntity zoom(boolean zoom) { public ProjectileEntity zoom(boolean zoom) {
this.zoom = zoom; this.zoom = zoom;
return this; return this;

View file

@ -219,6 +219,9 @@ public class GunEventHandler {
} else if (perk == ModPerks.HE_BULLET.get()) { } else if (perk == ModPerks.HE_BULLET.get()) {
int level = PerkHelper.getItemPerkLevel(perk, heldItem); int level = PerkHelper.getItemPerkLevel(perk, heldItem);
projectile.heBullet(true, level); projectile.heBullet(true, level);
} else if (perk == ModPerks.INCENDIARY_BULLET.get()) {
int level = PerkHelper.getItemPerkLevel(perk, heldItem);
projectile.fireBullet(true, level, heldItem.is(ModTags.Items.SHOTGUN));
} }
var dmgPerk = PerkHelper.getPerkByType(heldItem, Perk.Type.DAMAGE); var dmgPerk = PerkHelper.getPerkByType(heldItem, Perk.Type.DAMAGE);
@ -228,7 +231,7 @@ public class GunEventHandler {
} }
projectile.setPos(player.getX() - 0.1 * player.getLookAngle().x, player.getEyeY() - 0.1 - 0.1 * player.getLookAngle().y, player.getZ() + -0.1 * player.getLookAngle().z); projectile.setPos(player.getX() - 0.1 * player.getLookAngle().x, player.getEyeY() - 0.1 - 0.1 * player.getLookAngle().y, player.getZ() + -0.1 * player.getLookAngle().z);
projectile.shoot(player.getLookAngle().x, player.getLookAngle().y + 0.001f, player.getLookAngle().z, velocity, projectile.shoot(player.getLookAngle().x, player.getLookAngle().y + 0.001f, player.getLookAngle().z, heldItem.is(ModTags.Items.SHOTGUN) && perk == ModPerks.INCENDIARY_BULLET.get() ? 4.5f : velocity,
(float) spared); (float) spared);
player.level().addFreshEntity(projectile); player.level().addFreshEntity(projectile);
} }

View file

@ -1,6 +1,7 @@
package net.mcreator.superbwarfare.init; package net.mcreator.superbwarfare.init;
import net.mcreator.superbwarfare.ModUtils; import net.mcreator.superbwarfare.ModUtils;
import net.mcreator.superbwarfare.mobeffect.BurnMobEffect;
import net.mcreator.superbwarfare.mobeffect.ShockMobEffect; import net.mcreator.superbwarfare.mobeffect.ShockMobEffect;
import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffect;
import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.DeferredRegister;
@ -11,4 +12,5 @@ public class ModMobEffects {
public static final DeferredRegister<MobEffect> REGISTRY = DeferredRegister.create(ForgeRegistries.MOB_EFFECTS, ModUtils.MODID); public static final DeferredRegister<MobEffect> REGISTRY = DeferredRegister.create(ForgeRegistries.MOB_EFFECTS, ModUtils.MODID);
public static final RegistryObject<MobEffect> SHOCK = REGISTRY.register("shock", ShockMobEffect::new); public static final RegistryObject<MobEffect> SHOCK = REGISTRY.register("shock", ShockMobEffect::new);
public static final RegistryObject<MobEffect> BURN = REGISTRY.register("burn", BurnMobEffect::new);
} }

View file

@ -31,9 +31,9 @@ public class ModPerks {
public static final RegistryObject<Perk> AP_BULLET = AMMO_PERKS.register("ap_bullet", 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).damageRate(0.9f).speedRate(1.2f).slug(true).rgb(230, 70, 35))); () -> new AmmoPerk(new AmmoPerk.Builder("ap_bullet", Perk.Type.AMMO).bypassArmorRate(0.4f).damageRate(0.9f).speedRate(1.2f).slug(true).rgb(230, 70, 35)));
public static final RegistryObject<Perk> JHP_BULLET = AMMO_PERKS.register("jhp_bullet", 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).damageRate(1.1f).speedRate(0.9f).slug(true).rgb(230, 131, 65))); () -> new AmmoPerk(new AmmoPerk.Builder("jhp_bullet", Perk.Type.AMMO).bypassArmorRate(-0.2f).damageRate(1.1f).speedRate(0.95f).slug(true).rgb(230, 131, 65)));
public static final RegistryObject<Perk> HE_BULLET = AMMO_PERKS.register("he_bullet", 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).damageRate(0.5f).speedRate(0.6f).slug(true).rgb(240, 20, 10))); () -> new AmmoPerk(new AmmoPerk.Builder("he_bullet", Perk.Type.AMMO).bypassArmorRate(-0.3f).damageRate(0.5f).speedRate(0.85f).slug(true).rgb(240, 20, 10)));
public static final RegistryObject<Perk> SILVER_BULLET = AMMO_PERKS.register("silver_bullet", 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).damageRate(0.8f).speedRate(1.1f).rgb(87, 166, 219))); () -> new AmmoPerk(new AmmoPerk.Builder("silver_bullet", Perk.Type.AMMO).bypassArmorRate(0.05f).damageRate(0.8f).speedRate(1.1f).rgb(87, 166, 219)));
public static final RegistryObject<Perk> POISONOUS_BULLET = AMMO_PERKS.register("poisonous_bullet", public static final RegistryObject<Perk> POISONOUS_BULLET = AMMO_PERKS.register("poisonous_bullet",
@ -42,6 +42,8 @@ public class ModPerks {
public static final RegistryObject<Perk> BEAST_BULLET = AMMO_PERKS.register("beast_bullet", public static final RegistryObject<Perk> BEAST_BULLET = AMMO_PERKS.register("beast_bullet",
() -> new AmmoPerk(new AmmoPerk.Builder("beast_bullet", Perk.Type.AMMO).bypassArmorRate(0.0f).rgb(134, 65, 14))); () -> new AmmoPerk(new AmmoPerk.Builder("beast_bullet", Perk.Type.AMMO).bypassArmorRate(0.0f).rgb(134, 65, 14)));
public static final RegistryObject<Perk> LONGER_WIRE = AMMO_PERKS.register("longer_wire", () -> new Perk("longer_wire", Perk.Type.AMMO)); public static final RegistryObject<Perk> LONGER_WIRE = AMMO_PERKS.register("longer_wire", () -> new Perk("longer_wire", Perk.Type.AMMO));
public static final RegistryObject<Perk> INCENDIARY_BULLET = AMMO_PERKS.register("incendiary_bullet",
() -> new AmmoPerk(new AmmoPerk.Builder("incendiary_bullet", Perk.Type.AMMO).bypassArmorRate(-0.4f).damageRate(0.7f).speedRate(0.75f).slug(false).rgb(230, 131, 65)));
/** /**
* Functional Perks * Functional Perks

View file

@ -0,0 +1,106 @@
package net.mcreator.superbwarfare.mobeffect;
import net.mcreator.superbwarfare.ModUtils;
import net.mcreator.superbwarfare.init.ModMobEffects;
import net.mcreator.superbwarfare.init.ModSounds;
import net.mcreator.superbwarfare.network.message.ClientIndicatorMessage;
import net.minecraft.core.registries.Registries;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.damagesource.DamageTypes;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectCategory;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraftforge.event.entity.living.LivingEvent;
import net.minecraftforge.event.entity.living.MobEffectEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.network.PacketDistributor;
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE)
public class BurnMobEffect extends MobEffect {
public BurnMobEffect() {
super(MobEffectCategory.HARMFUL, -12708330);
}
@Override
public void applyEffectTick(LivingEntity entity, int amplifier) {
Entity attacker;
if (!entity.getPersistentData().contains("BurnAttacker")) {
attacker = null;
} else {
attacker = entity.level().getEntity(entity.getPersistentData().getInt("BurnAttacker"));
}
entity.hurt(new DamageSource(entity.level().registryAccess().registryOrThrow(Registries.DAMAGE_TYPE).getHolderOrThrow(DamageTypes.IN_FIRE), attacker), 0.6f + (0.3f * amplifier));
entity.invulnerableTime = 0;
if (attacker instanceof ServerPlayer player) {
player.level().playSound(null, player.blockPosition(), ModSounds.INDICATION.get(), SoundSource.VOICE, 1, 1);
ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> player), new ClientIndicatorMessage(0, 5));
}
}
@Override
public boolean isDurationEffectTick(int duration, int amplifier) {
return duration % 20 == 0;
}
@SubscribeEvent
public static void onEffectAdded(MobEffectEvent.Added event) {
LivingEntity living = event.getEntity();
MobEffectInstance instance = event.getEffectInstance();
if (!instance.getEffect().equals(ModMobEffects.BURN.get())) {
return;
}
living.hurt(new DamageSource(living.level().registryAccess().registryOrThrow(Registries.DAMAGE_TYPE).getHolderOrThrow(DamageTypes.IN_FIRE), event.getEffectSource()), 0.6f + (0.3f * instance.getAmplifier()));
living.invulnerableTime = 0;
if (event.getEffectSource() instanceof LivingEntity source) {
living.getPersistentData().putInt("BurnAttacker", source.getId());
}
}
@SubscribeEvent
public static void onEffectExpired(MobEffectEvent.Expired event) {
LivingEntity living = event.getEntity();
MobEffectInstance instance = event.getEffectInstance();
if (instance == null) {
return;
}
if (instance.getEffect().equals(ModMobEffects.BURN.get())) {
living.getPersistentData().remove("BurnAttacker");
}
}
@SubscribeEvent
public static void onEffectRemoved(MobEffectEvent.Remove event) {
LivingEntity living = event.getEntity();
MobEffectInstance instance = event.getEffectInstance();
if (instance == null) {
return;
}
if (instance.getEffect().equals(ModMobEffects.BURN.get())) {
living.getPersistentData().remove("BurnAttacker");
}
}
@SubscribeEvent
public static void onLivingTick(LivingEvent.LivingTickEvent event) {
LivingEntity living = event.getEntity();
if (living.hasEffect(ModMobEffects.BURN.get())) {
living.setSecondsOnFire(1);
}
}
}

View file

@ -247,6 +247,8 @@
"des.superbwarfare.jhp_bullet": "Increases damage against unarmored targets, but the damage decreases rapidly as the armor value rises", "des.superbwarfare.jhp_bullet": "Increases damage against unarmored targets, but the damage decreases rapidly as the armor value rises",
"item.superbwarfare.he_bullet": "Explosion Bullet", "item.superbwarfare.he_bullet": "Explosion Bullet",
"des.superbwarfare.he_bullet": "The bullet will explode after hitting the target", "des.superbwarfare.he_bullet": "The bullet will explode after hitting the target",
"item.superbwarfare.incendiary_bullet": "Incendiary Bullet",
"des.superbwarfare.incendiary_bullet": "The bullet will ignites the target after hitting the target",
"item.superbwarfare.heal_clip": "Heal Clip", "item.superbwarfare.heal_clip": "Heal Clip",
"des.superbwarfare.heal_clip": "Reloading after dealing a final blow will heal you and your nearby allies", "des.superbwarfare.heal_clip": "Reloading after dealing a final blow will heal you and your nearby allies",
@ -340,6 +342,7 @@
"key.superbwarfare.edit_grip": "Switch Grip", "key.superbwarfare.edit_grip": "Switch Grip",
"effect.superbwarfare.shock": "Shock", "effect.superbwarfare.shock": "Shock",
"effect.superbwarfare.burn": "Burn",
"item.minecraft.potion.effect.superbwarfare_shock": "Potion of Shock", "item.minecraft.potion.effect.superbwarfare_shock": "Potion of Shock",
"item.minecraft.splash_potion.effect.superbwarfare_shock": "Splash Potion of Shock", "item.minecraft.splash_potion.effect.superbwarfare_shock": "Splash Potion of Shock",
"item.minecraft.lingering_potion.effect.superbwarfare_shock": "Lingering Potion of Shock", "item.minecraft.lingering_potion.effect.superbwarfare_shock": "Lingering Potion of Shock",

View file

@ -247,6 +247,8 @@
"des.superbwarfare.jhp_bullet": "增加对无护甲目标的伤害,但伤害会随着护甲值上升而迅速降低", "des.superbwarfare.jhp_bullet": "增加对无护甲目标的伤害,但伤害会随着护甲值上升而迅速降低",
"item.superbwarfare.he_bullet": "爆炸子弹", "item.superbwarfare.he_bullet": "爆炸子弹",
"des.superbwarfare.he_bullet": "子弹在命中后会爆炸", "des.superbwarfare.he_bullet": "子弹在命中后会爆炸",
"item.superbwarfare.incendiary_bullet": "燃烧弹",
"des.superbwarfare.incendiary_bullet": "子弹在命中后点燃目标",
"item.superbwarfare.heal_clip": "治疗弹匣", "item.superbwarfare.heal_clip": "治疗弹匣",
"des.superbwarfare.heal_clip": "最后一击后短时间内填装,可治疗自身和附近队友", "des.superbwarfare.heal_clip": "最后一击后短时间内填装,可治疗自身和附近队友",
@ -340,6 +342,7 @@
"key.superbwarfare.edit_grip": "切换握把", "key.superbwarfare.edit_grip": "切换握把",
"effect.superbwarfare.shock": "电击", "effect.superbwarfare.shock": "电击",
"effect.superbwarfare.burn": "点燃",
"item.minecraft.potion.effect.superbwarfare_shock": "电击药水", "item.minecraft.potion.effect.superbwarfare_shock": "电击药水",
"item.minecraft.splash_potion.effect.superbwarfare_shock": "喷溅型电击药水", "item.minecraft.splash_potion.effect.superbwarfare_shock": "喷溅型电击药水",
"item.minecraft.lingering_potion.effect.superbwarfare_shock": "滞留型电击药水", "item.minecraft.lingering_potion.effect.superbwarfare_shock": "滞留型电击药水",

View file

@ -1,6 +0,0 @@
{
"parent": "item/generated",
"textures": {
"layer0": "superbwarfare:item/perk/dimension_magazine"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "superbwarfare:item/perk/incendiary_bullet"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 706 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 B

View file

@ -0,0 +1,24 @@
{
"type": "minecraft:crafting_shaped",
"category": "equipment",
"pattern": [
"bbb",
"cac",
"bbb"
],
"key": {
"a": {
"item": "superbwarfare:empty_perk"
},
"b": {
"item":"minecraft:blaze_powder"
},
"c": {
"item":"minecraft:dragon_breath"
}
},
"result": {
"item": "superbwarfare:incendiary_bullet",
"count": 1
}
}