继续重制部分功能perk

This commit is contained in:
17146 2025-05-07 13:21:57 +08:00 committed by Light_Quanta
parent 90e76d7c92
commit 995a043731
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
9 changed files with 92 additions and 47 deletions

View file

@ -577,7 +577,6 @@ public class LivingEventHandler {
DamageSource source = event.getSource(); DamageSource source = event.getSource();
Entity sourceEntity = source.getEntity(); Entity sourceEntity = source.getEntity();
if (!(sourceEntity instanceof Player player)) return; if (!(sourceEntity instanceof Player player)) return;
ItemStack mainHandItem = player.getMainHandItem();
// 创生物收集掉落物 // 创生物收集掉落物
if (player.getVehicle() instanceof ContainerMobileVehicleEntity containerMobileVehicleEntity && source.is(ModDamageTypes.VEHICLE_STRIKE)) { if (player.getVehicle() instanceof ContainerMobileVehicleEntity containerMobileVehicleEntity && source.is(ModDamageTypes.VEHICLE_STRIKE)) {
@ -596,22 +595,6 @@ public class LivingEventHandler {
}); });
drops.removeAll(removed); drops.removeAll(removed);
return;
}
// 磁吸Perk
if (mainHandItem.getItem() instanceof GunItem
&& GunData.from(mainHandItem).perk.has(ModPerks.POWERFUL_ATTRACTION.get())
&& (DamageTypeTool.isGunDamage(source) || DamageTypeTool.isExplosionDamage(source))
) {
var drops = event.getDrops();
drops.forEach(itemEntity -> {
ItemStack item = itemEntity.getItem();
if (!player.addItem(item)) {
player.drop(item, false);
}
});
event.setCanceled(true);
} }
} }
@ -623,18 +606,6 @@ public class LivingEventHandler {
if (player.getVehicle() instanceof ArmedVehicleEntity) { if (player.getVehicle() instanceof ArmedVehicleEntity) {
player.giveExperiencePoints(event.getDroppedExperience()); player.giveExperiencePoints(event.getDroppedExperience());
event.setCanceled(true); event.setCanceled(true);
return;
}
ItemStack stack = player.getMainHandItem();
if (!(stack.getItem() instanceof GunItem)) return;
var data = GunData.from(stack);
int level = data.perk.getLevel(ModPerks.POWERFUL_ATTRACTION);
if (level > 0) {
player.giveExperiencePoints((int) (event.getDroppedExperience() * (0.8f + 0.2f * level)));
event.setCanceled(true);
} }
} }

View file

@ -4,10 +4,7 @@ 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.damage.*; import com.atsuishio.superbwarfare.perk.damage.*;
import com.atsuishio.superbwarfare.perk.functional.FieldDoctor; import com.atsuishio.superbwarfare.perk.functional.*;
import com.atsuishio.superbwarfare.perk.functional.FourthTimesCharm;
import com.atsuishio.superbwarfare.perk.functional.HealClip;
import com.atsuishio.superbwarfare.perk.functional.Subsistence;
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;
@ -61,9 +58,9 @@ public class ModPerks {
public static final DeferredHolder<Perk, Perk> FOURTH_TIMES_CHARM = FUNC_PERKS.register("fourth_times_charm", FourthTimesCharm::new); public static final DeferredHolder<Perk, Perk> FOURTH_TIMES_CHARM = FUNC_PERKS.register("fourth_times_charm", FourthTimesCharm::new);
public static final DeferredHolder<Perk, Perk> SUBSISTENCE = FUNC_PERKS.register("subsistence", Subsistence::new); public static final DeferredHolder<Perk, Perk> SUBSISTENCE = FUNC_PERKS.register("subsistence", Subsistence::new);
public static final DeferredHolder<Perk, Perk> FIELD_DOCTOR = FUNC_PERKS.register("field_doctor", FieldDoctor::new); public static final DeferredHolder<Perk, Perk> FIELD_DOCTOR = FUNC_PERKS.register("field_doctor", FieldDoctor::new);
public static final DeferredHolder<Perk, Perk> REGENERATION = FUNC_PERKS.register("regeneration", () -> new Perk("regeneration", Perk.Type.FUNCTIONAL)); public static final DeferredHolder<Perk, Perk> REGENERATION = FUNC_PERKS.register("regeneration", Regeneration::new);
public static final DeferredHolder<Perk, Perk> TURBO_CHARGER = FUNC_PERKS.register("turbo_charger", () -> new Perk("turbo_charger", Perk.Type.FUNCTIONAL)); public static final DeferredHolder<Perk, Perk> TURBO_CHARGER = FUNC_PERKS.register("turbo_charger", () -> new Perk("turbo_charger", Perk.Type.FUNCTIONAL));
public static final DeferredHolder<Perk, Perk> POWERFUL_ATTRACTION = FUNC_PERKS.register("powerful_attraction", () -> new Perk("powerful_attraction", Perk.Type.FUNCTIONAL)); public static final DeferredHolder<Perk, Perk> POWERFUL_ATTRACTION = FUNC_PERKS.register("powerful_attraction", PowerfulAttraction::new);
public static final DeferredHolder<Perk, Perk> INTELLIGENT_CHIP = FUNC_PERKS.register("intelligent_chip", () -> new Perk("intelligent_chip", Perk.Type.FUNCTIONAL)); public static final DeferredHolder<Perk, Perk> INTELLIGENT_CHIP = FUNC_PERKS.register("intelligent_chip", () -> new Perk("intelligent_chip", Perk.Type.FUNCTIONAL));
/** /**

View file

@ -188,7 +188,7 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, EnergyStorag
@Override @Override
public boolean canApplyPerk(Perk perk) { public boolean canApplyPerk(Perk perk) {
return PerkHelper.LAUNCHER_PERKS.test(perk) || perk == ModPerks.MICRO_MISSILE.get(); return PerkHelper.LAUNCHER_PERKS.test(perk) || perk == ModPerks.MICRO_MISSILE.get() || perk == ModPerks.REGENERATION.get();
} }
@Override @Override

View file

@ -5,6 +5,7 @@ import com.atsuishio.superbwarfare.client.renderer.item.SentinelItemRenderer;
import com.atsuishio.superbwarfare.client.tooltip.component.SentinelImageComponent; import com.atsuishio.superbwarfare.client.tooltip.component.SentinelImageComponent;
import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.event.ClientEventHandler;
import com.atsuishio.superbwarfare.init.ModEnumExtensions; import com.atsuishio.superbwarfare.init.ModEnumExtensions;
import com.atsuishio.superbwarfare.init.ModPerks;
import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.init.ModSounds;
import com.atsuishio.superbwarfare.item.EnergyStorageItem; import com.atsuishio.superbwarfare.item.EnergyStorageItem;
import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.GunItem;
@ -173,7 +174,7 @@ public class SentinelItem extends GunItem implements GeoItem, EnergyStorageItem
@Override @Override
public boolean canApplyPerk(Perk perk) { public boolean canApplyPerk(Perk perk) {
return PerkHelper.SNIPER_RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); return PerkHelper.SNIPER_RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk) || perk == ModPerks.REGENERATION.get();
} }
@Override @Override

View file

@ -116,18 +116,11 @@ public class TaserItem extends GunItem implements GeoItem, EnergyStorageItem {
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) {
super.inventoryTick(stack, world, entity, slot, selected); super.inventoryTick(stack, world, entity, slot, selected);
var data = GunData.from(stack);
int perkLevel = data.perk.getLevel(ModPerks.REGENERATION);
var stackStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM);
if (stackStorage != null) {
stackStorage.receiveEnergy(perkLevel, false);
}
if (entity instanceof Player player) { if (entity instanceof Player player) {
for (var cell : player.getInventory().items) { for (var cell : player.getInventory().items) {
if (cell.is(ModItems.CELL.get())) { if (cell.is(ModItems.CELL.get())) {
var stackStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM);
if (stackStorage == null) continue; if (stackStorage == null) continue;
int stackMaxEnergy = stackStorage.getMaxEnergyStored(); int stackMaxEnergy = stackStorage.getMaxEnergyStored();
int stackEnergy = stackStorage.getEnergyStored(); int stackEnergy = stackStorage.getEnergyStored();

View file

@ -0,0 +1,58 @@
package com.atsuishio.superbwarfare.perk.functional;
import com.atsuishio.superbwarfare.init.ModPerks;
import com.atsuishio.superbwarfare.item.gun.GunItem;
import com.atsuishio.superbwarfare.item.gun.data.GunData;
import com.atsuishio.superbwarfare.perk.Perk;
import com.atsuishio.superbwarfare.tools.DamageTypeTool;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.event.entity.living.LivingDropsEvent;
import net.neoforged.neoforge.event.entity.living.LivingExperienceDropEvent;
@EventBusSubscriber(bus = EventBusSubscriber.Bus.GAME)
public class PowerfulAttraction extends Perk {
public PowerfulAttraction() {
super("powerful_attraction", Perk.Type.FUNCTIONAL);
}
@SubscribeEvent
public static void onLivingDrops(LivingDropsEvent event) {
DamageSource source = event.getSource();
Entity sourceEntity = source.getEntity();
if (!(sourceEntity instanceof Player player)) return;
ItemStack stack = player.getMainHandItem();
if (stack.getItem() instanceof GunItem && GunData.from(stack).perk.getLevel(ModPerks.POWERFUL_ATTRACTION) > 0
&& (DamageTypeTool.isGunDamage(source) || DamageTypeTool.isExplosionDamage(source))) {
var drops = event.getDrops();
drops.forEach(itemEntity -> {
ItemStack item = itemEntity.getItem();
if (!player.addItem(item)) {
player.drop(item, false);
}
});
event.setCanceled(true);
}
}
@SubscribeEvent
public static void onLivingExperienceDrop(LivingExperienceDropEvent event) {
Player player = event.getAttackingPlayer();
if (player == null) return;
ItemStack stack = player.getMainHandItem();
if (!(stack.getItem() instanceof GunItem)) return;
int level = GunData.from(stack).perk.getLevel(ModPerks.POWERFUL_ATTRACTION);
if (level > 0) {
player.giveExperiencePoints((int) (event.getDroppedExperience() * (0.8f + 0.2f * level)));
event.setCanceled(true);
}
}
}

View file

@ -0,0 +1,25 @@
package com.atsuishio.superbwarfare.perk.functional;
import com.atsuishio.superbwarfare.item.gun.data.GunData;
import com.atsuishio.superbwarfare.perk.Perk;
import com.atsuishio.superbwarfare.perk.PerkInstance;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemStack;
import net.neoforged.neoforge.capabilities.Capabilities;
import org.jetbrains.annotations.Nullable;
public class Regeneration extends Perk {
public Regeneration() {
super("regeneration", Perk.Type.FUNCTIONAL);
}
@Override
public void tick(GunData data, PerkInstance instance, @Nullable LivingEntity living) {
ItemStack stack = data.stack;
var cap = stack.getCapability(Capabilities.EnergyStorage.ITEM);
if (cap != null) {
cap.receiveEnergy((int) (instance.level() * cap.getMaxEnergyStored() / 2000d), false);
}
}
}

View file

@ -331,7 +331,7 @@
"item.superbwarfare.field_doctor": "Field Doctor", "item.superbwarfare.field_doctor": "Field Doctor",
"des.superbwarfare.field_doctor": "Bullets will heal allies whilst firing from the hip.", "des.superbwarfare.field_doctor": "Bullets will heal allies whilst firing from the hip.",
"item.superbwarfare.regeneration": "Regeneration", "item.superbwarfare.regeneration": "Regeneration",
"des.superbwarfare.regeneration": "Taser will restore energy automatically.", "des.superbwarfare.regeneration": "Energy weapons will restore energy automatically.",
"item.superbwarfare.turbo_charger": "Turbocharger", "item.superbwarfare.turbo_charger": "Turbocharger",
"des.superbwarfare.turbo_charger": "Reduces wind-up time for compatible weapons", "des.superbwarfare.turbo_charger": "Reduces wind-up time for compatible weapons",
"item.superbwarfare.powerful_attraction": "Powerful Attraction", "item.superbwarfare.powerful_attraction": "Powerful Attraction",

View file

@ -330,7 +330,7 @@
"item.superbwarfare.field_doctor": "役医师", "item.superbwarfare.field_doctor": "役医师",
"des.superbwarfare.field_doctor": "腰射时发射的子弹可以治疗队友", "des.superbwarfare.field_doctor": "腰射时发射的子弹可以治疗队友",
"item.superbwarfare.regeneration": "再生", "item.superbwarfare.regeneration": "再生",
"des.superbwarfare.regeneration": "泰瑟枪会缓慢自动回复能量", "des.superbwarfare.regeneration": "能量武器会缓慢自动回复能量",
"item.superbwarfare.turbo_charger": "涡轮增压器", "item.superbwarfare.turbo_charger": "涡轮增压器",
"des.superbwarfare.turbo_charger": "装配后减少武器自动射击所需的缓冲时间", "des.superbwarfare.turbo_charger": "装配后减少武器自动射击所需的缓冲时间",
"item.superbwarfare.powerful_attraction": "强力吸引", "item.superbwarfare.powerful_attraction": "强力吸引",