重构治疗弹匣

This commit is contained in:
17146 2025-05-07 10:50:57 +08:00 committed by Light_Quanta
parent e0a148a30e
commit 32263ee5ff
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
5 changed files with 116 additions and 42 deletions

View file

@ -544,6 +544,14 @@ public class LivingEventHandler {
return; return;
} }
GunData data = GunData.from(stack);
for (Perk.Type type : Perk.Type.values()) {
var instance = data.perk.getInstance(type);
if (instance != null) {
instance.perk().onKill(data, instance, attacker, event.getEntity(), source);
}
}
if (DamageTypeTool.isGunDamage(source) || source.is(ModDamageTypes.PROJECTILE_BOOM)) { if (DamageTypeTool.isGunDamage(source) || source.is(ModDamageTypes.PROJECTILE_BOOM)) {
handleClipPerks(stack); handleClipPerks(stack);
} }
@ -560,15 +568,9 @@ public class LivingEventHandler {
private static void handleClipPerks(ItemStack stack) { private static void handleClipPerks(ItemStack stack) {
var data = GunData.from(stack); var data = GunData.from(stack);
int healClipLevel = data.perk.getLevel(ModPerks.HEAL_CLIP);
var tag = data.perk.getTag(ModPerks.HEAL_CLIP);
if (healClipLevel != 0) {
tag.putInt("HealClipTime", 80 + healClipLevel * 20);
}
int killClipLevel = data.perk.getLevel(ModPerks.KILL_CLIP); int killClipLevel = data.perk.getLevel(ModPerks.KILL_CLIP);
if (killClipLevel != 0) { if (killClipLevel != 0) {
tag.putInt("KillClipReloadTime", 80); data.perk.getTag(ModPerks.KILL_CLIP).putInt("KillClipReloadTime", 80);
} }
data.save(); data.save();
} }

View file

@ -4,14 +4,13 @@ import com.atsuishio.superbwarfare.api.event.ReloadEvent;
import com.atsuishio.superbwarfare.init.ModPerks; import com.atsuishio.superbwarfare.init.ModPerks;
import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.GunItem;
import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.item.gun.data.GunData;
import com.atsuishio.superbwarfare.perk.Perk;
import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.GunsTool;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.EventBusSubscriber;
import java.util.List;
@EventBusSubscriber @EventBusSubscriber
public class ReloadEventHandler { public class ReloadEventHandler {
@ -24,7 +23,14 @@ public class ReloadEventHandler {
|| player.level().isClientSide || player.level().isClientSide
) return; ) return;
handleHealClipPre(stack); GunData data = GunData.from(stack);
for (Perk.Type type : Perk.Type.values()) {
var instance = data.perk.getInstance(type);
if (instance != null) {
instance.perk().preReload(data, instance, player);
}
}
handleKillClipPre(stack); handleKillClipPre(stack);
handleKillingTallyPre(stack); handleKillingTallyPre(stack);
handleDesperadoPre(stack); handleDesperadoPre(stack);
@ -42,41 +48,18 @@ public class ReloadEventHandler {
return; return;
} }
handleHealClipPost(player, stack); GunData data = GunData.from(stack);
for (Perk.Type type : Perk.Type.values()) {
var instance = data.perk.getInstance(type);
if (instance != null) {
instance.perk().postReload(data, instance, player);
}
}
handleKillClipPost(stack); handleKillClipPost(stack);
handleDesperadoPost(stack); handleDesperadoPost(stack);
} }
private static void handleHealClipPre(ItemStack stack) {
var data = GunData.from(stack);
final var tag = data.tag();
int time = GunsTool.getPerkIntTag(tag, "HealClipTime");
if (time > 0) {
GunsTool.setPerkIntTag(tag, "HealClipTime", 0);
GunsTool.setPerkBooleanTag(tag, "HealClip", true);
} else {
GunsTool.setPerkBooleanTag(tag, "HealClip", false);
}
data.save();
}
private static void handleHealClipPost(Player player, ItemStack stack) {
var data = GunData.from(stack);
final var tag = data.tag();
if (!GunsTool.getPerkBooleanTag(tag, "HealClip")) return;
int healClipLevel = data.perk.getLevel(ModPerks.HEAL_CLIP);
if (healClipLevel == 0) {
healClipLevel = 1;
}
player.heal(12.0f * (0.8f + 0.2f * healClipLevel));
List<Player> players = player.level().getEntitiesOfClass(Player.class, player.getBoundingBox().inflate(5))
.stream().filter(p -> p.isAlliedTo(player)).toList();
int finalHealClipLevel = healClipLevel;
players.forEach(p -> p.heal(6.0f * (0.8f + 0.2f * finalHealClipLevel)));
}
private static void handleKillClipPre(ItemStack stack) { private static void handleKillClipPre(ItemStack stack) {
var data = GunData.from(stack); var data = GunData.from(stack);
final var tag = data.tag(); final var tag = data.tag();

View file

@ -3,6 +3,7 @@ package com.atsuishio.superbwarfare.init;
import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.Mod;
import com.atsuishio.superbwarfare.perk.AmmoPerk; import com.atsuishio.superbwarfare.perk.AmmoPerk;
import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.perk.Perk;
import com.atsuishio.superbwarfare.perk.functional.HealClip;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.world.effect.MobEffects; import net.minecraft.world.effect.MobEffects;
import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.IEventBus;
@ -52,7 +53,7 @@ public class ModPerks {
*/ */
public static final DeferredRegister<Perk> FUNC_PERKS = DeferredRegister.create(Mod.loc("perk"), Mod.MODID); public static final DeferredRegister<Perk> FUNC_PERKS = DeferredRegister.create(Mod.loc("perk"), Mod.MODID);
public static final DeferredHolder<Perk, Perk> HEAL_CLIP = FUNC_PERKS.register("heal_clip", () -> new Perk("heal_clip", Perk.Type.FUNCTIONAL)); public static final DeferredHolder<Perk, Perk> HEAL_CLIP = FUNC_PERKS.register("heal_clip", HealClip::new);
public static final DeferredHolder<Perk, Perk> FOURTH_TIMES_CHARM = FUNC_PERKS.register("fourth_times_charm", () -> new Perk("fourth_times_charm", Perk.Type.FUNCTIONAL)); public static final DeferredHolder<Perk, Perk> FOURTH_TIMES_CHARM = FUNC_PERKS.register("fourth_times_charm", () -> new Perk("fourth_times_charm", Perk.Type.FUNCTIONAL));
public static final DeferredHolder<Perk, Perk> SUBSISTENCE = FUNC_PERKS.register("subsistence", () -> new Perk("subsistence", Perk.Type.FUNCTIONAL)); public static final DeferredHolder<Perk, Perk> SUBSISTENCE = FUNC_PERKS.register("subsistence", () -> new Perk("subsistence", Perk.Type.FUNCTIONAL));
public static final DeferredHolder<Perk, Perk> FIELD_DOCTOR = FUNC_PERKS.register("field_doctor", () -> new Perk("field_doctor", Perk.Type.FUNCTIONAL)); public static final DeferredHolder<Perk, Perk> FIELD_DOCTOR = FUNC_PERKS.register("field_doctor", () -> new Perk("field_doctor", Perk.Type.FUNCTIONAL));

View file

@ -4,8 +4,12 @@ import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.item.PerkItem; import com.atsuishio.superbwarfare.item.PerkItem;
import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.item.gun.data.GunData;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredHolder;
import org.jetbrains.annotations.Nullable;
import java.util.function.BiFunction; import java.util.function.BiFunction;
@ -54,6 +58,21 @@ public class Perk {
return result.get(); return result.get();
} }
public void tick(GunData data, PerkInstance instance, @Nullable Player player) {
}
public void preReload(GunData data, PerkInstance instance, @Nullable Player player) {
}
public void postReload(GunData data, PerkInstance instance, @Nullable Player player) {
}
public void onKill(GunData data, PerkInstance instance, @Nullable Player player, LivingEntity target, DamageSource source) {
}
public void onShoot() {
}
public enum Type { public enum Type {
AMMO("Ammo", ChatFormatting.YELLOW), AMMO("Ammo", ChatFormatting.YELLOW),
FUNCTIONAL("Functional", ChatFormatting.GREEN), FUNCTIONAL("Functional", ChatFormatting.GREEN),

View file

@ -0,0 +1,69 @@
package com.atsuishio.superbwarfare.perk.functional;
import com.atsuishio.superbwarfare.init.ModDamageTypes;
import com.atsuishio.superbwarfare.item.gun.data.GunData;
import com.atsuishio.superbwarfare.perk.Perk;
import com.atsuishio.superbwarfare.perk.PerkInstance;
import com.atsuishio.superbwarfare.tools.DamageTypeTool;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.Nullable;
import java.util.List;
public class HealClip extends Perk {
public HealClip() {
super("heal_clip", Perk.Type.FUNCTIONAL);
}
@Override
public void onKill(GunData data, PerkInstance instance, @Nullable Player player, LivingEntity target, DamageSource source) {
super.onKill(data, instance, player, target, source);
if (DamageTypeTool.isGunDamage(source) || source.is(ModDamageTypes.PROJECTILE_BOOM)) {
int healClipLevel = instance.level();
if (healClipLevel != 0) {
data.perk.getTag(this).putInt("HealClipTime", 80 + healClipLevel * 20);
}
}
}
@Override
public void preReload(GunData data, PerkInstance instance, @Nullable Player player) {
super.preReload(data, instance, player);
ItemStack stack = data.stack;
int time = data.perk.getTag(this).getInt("HealClipTime");
if (time > 0) {
data.perk.getTag(this).putInt("HealClipTime", 0);
data.perk.getTag(this).putBoolean("HealClip", true);
} else {
data.perk.getTag(this).putBoolean("HealClip", false);
}
}
@Override
public void postReload(GunData data, PerkInstance instance, @Nullable Player player) {
super.postReload(data, instance, player);
if (player == null) return;
if (!data.perk.getTag(this).getBoolean("HealClip")) {
return;
}
int healClipLevel = instance.level();
if (healClipLevel == 0) {
healClipLevel = 1;
}
player.heal(12.0f * (0.8f + 0.2f * healClipLevel));
List<Player> players = player.level().getEntitiesOfClass(Player.class, player.getBoundingBox().inflate(5))
.stream().filter(p -> p.isAlliedTo(player)).toList();
int finalHealClipLevel = healClipLevel;
players.forEach(p -> p.heal(6.0f * (0.8f + 0.2f * finalHealClipLevel)));
}
}