添加基本perk白名单

This commit is contained in:
17146 2024-09-09 00:09:55 +08:00
parent 5e2731f776
commit 442c0c5f66
7 changed files with 87 additions and 33 deletions

View file

@ -229,21 +229,21 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
ItemStack result = gun.copy(); ItemStack result = gun.copy();
if (!ammo.isEmpty() && ammo.getItem() instanceof PerkItem perkItem) { if (!ammo.isEmpty() && ammo.getItem() instanceof PerkItem perkItem) {
if (gunItem.canApplyPerk(result, perkItem.getPerk())) { if (gunItem.canApplyPerk(perkItem.getPerk())) {
PerkHelper.setPerk(result, perkItem.getPerk(), this.ammoPerkLevel.get()); PerkHelper.setPerk(result, perkItem.getPerk(), this.ammoPerkLevel.get());
this.container.setItem(AMMO_PERK_SLOT, ItemStack.EMPTY); this.container.setItem(AMMO_PERK_SLOT, ItemStack.EMPTY);
} }
} }
if (!func.isEmpty() && func.getItem() instanceof PerkItem perkItem) { if (!func.isEmpty() && func.getItem() instanceof PerkItem perkItem) {
if (gunItem.canApplyPerk(result, perkItem.getPerk())) { if (gunItem.canApplyPerk(perkItem.getPerk())) {
PerkHelper.setPerk(result, perkItem.getPerk(), this.funcPerkLevel.get()); PerkHelper.setPerk(result, perkItem.getPerk(), this.funcPerkLevel.get());
this.container.setItem(FUNC_PERK_SLOT, ItemStack.EMPTY); this.container.setItem(FUNC_PERK_SLOT, ItemStack.EMPTY);
} }
} }
if (!damage.isEmpty() && damage.getItem() instanceof PerkItem perkItem) { if (!damage.isEmpty() && damage.getItem() instanceof PerkItem perkItem) {
if (gunItem.canApplyPerk(result, perkItem.getPerk())) { if (gunItem.canApplyPerk(perkItem.getPerk())) {
PerkHelper.setPerk(result, perkItem.getPerk(), this.damagePerkLevel.get()); PerkHelper.setPerk(result, perkItem.getPerk(), this.damagePerkLevel.get());
this.container.setItem(DAMAGE_PERK_SLOT, ItemStack.EMPTY); this.container.setItem(DAMAGE_PERK_SLOT, ItemStack.EMPTY);
} }
@ -410,9 +410,9 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
ItemStack funcPerk = this.container.getItem(FUNC_PERK_SLOT); ItemStack funcPerk = this.container.getItem(FUNC_PERK_SLOT);
ItemStack damagePerk = this.container.getItem(DAMAGE_PERK_SLOT); ItemStack damagePerk = this.container.getItem(DAMAGE_PERK_SLOT);
boolean flag1 = ammoPerk.isEmpty() || (ammoPerk.getItem() instanceof PerkItem perkItem && gunItem.canApplyPerk(pStack, perkItem.getPerk())); boolean flag1 = ammoPerk.isEmpty() || (ammoPerk.getItem() instanceof PerkItem perkItem && gunItem.canApplyPerk(perkItem.getPerk()));
boolean flag2 = funcPerk.isEmpty() || (funcPerk.getItem() instanceof PerkItem perkItem && gunItem.canApplyPerk(pStack, perkItem.getPerk())); boolean flag2 = funcPerk.isEmpty() || (funcPerk.getItem() instanceof PerkItem perkItem && gunItem.canApplyPerk(perkItem.getPerk()));
boolean flag3 = damagePerk.isEmpty() || (damagePerk.getItem() instanceof PerkItem perkItem && gunItem.canApplyPerk(pStack, perkItem.getPerk())); boolean flag3 = damagePerk.isEmpty() || (damagePerk.getItem() instanceof PerkItem perkItem && gunItem.canApplyPerk(perkItem.getPerk()));
return flag1 && flag2 && flag3 && this.container.getItem(RESULT_SLOT).isEmpty(); return flag1 && flag2 && flag3 && this.container.getItem(RESULT_SLOT).isEmpty();
} }
@ -445,7 +445,9 @@ public class ReforgingTableMenu extends AbstractContainerMenu {
} }
public boolean mayPlace(ItemStack pStack) { public boolean mayPlace(ItemStack pStack) {
return pStack.getItem() instanceof PerkItem perkItem && perkItem.getPerk().type == type && !container.getItem(INPUT_SLOT).isEmpty(); return pStack.getItem() instanceof PerkItem perkItem && perkItem.getPerk().type == type
&& !container.getItem(INPUT_SLOT).isEmpty() && container.getItem(INPUT_SLOT).getItem() instanceof GunItem gunItem
&& gunItem.canApplyPerk(perkItem.getPerk());
} }
public int getMaxStackSize() { public int getMaxStackSize() {

View file

@ -8,6 +8,8 @@ import net.mcreator.superbwarfare.init.ModItems;
import net.mcreator.superbwarfare.init.ModSounds; import net.mcreator.superbwarfare.init.ModSounds;
import net.mcreator.superbwarfare.init.ModTags; import net.mcreator.superbwarfare.init.ModTags;
import net.mcreator.superbwarfare.item.AnimatedItem; import net.mcreator.superbwarfare.item.AnimatedItem;
import net.mcreator.superbwarfare.perk.Perk;
import net.mcreator.superbwarfare.perk.PerkHelper;
import net.mcreator.superbwarfare.tools.GunsTool; import net.mcreator.superbwarfare.tools.GunsTool;
import net.mcreator.superbwarfare.tools.PoseTool; import net.mcreator.superbwarfare.tools.PoseTool;
import net.mcreator.superbwarfare.tools.RarityTool; import net.mcreator.superbwarfare.tools.RarityTool;
@ -78,7 +80,7 @@ public class Aa12Item extends GunItem implements GeoItem, AnimatedItem {
transformType = type; transformType = type;
} }
private PlayState idlePredicate(AnimationState event) { private PlayState idlePredicate(AnimationState<Aa12Item> event) {
LocalPlayer player = Minecraft.getInstance().player; LocalPlayer player = Minecraft.getInstance().player;
if (player == null) return PlayState.STOP; if (player == null) return PlayState.STOP;
ItemStack stack = player.getMainHandItem(); ItemStack stack = player.getMainHandItem();
@ -123,7 +125,7 @@ public class Aa12Item extends GunItem implements GeoItem, AnimatedItem {
return PlayState.STOP; return PlayState.STOP;
} }
private PlayState procedurePredicate(AnimationState event) { private PlayState procedurePredicate(AnimationState<Aa12Item> event) {
if (transformType != null && transformType.firstPerson()) { if (transformType != null && transformType.firstPerson()) {
if (!this.animationProcedure.equals("empty") && event.getController().getAnimationState() == AnimationController.State.STOPPED) { if (!this.animationProcedure.equals("empty") && event.getController().getAnimationState() == AnimationController.State.STOPPED) {
event.getController().setAnimation(RawAnimation.begin().thenPlay(this.animationProcedure)); event.getController().setAnimation(RawAnimation.begin().thenPlay(this.animationProcedure));
@ -193,4 +195,9 @@ public class Aa12Item extends GunItem implements GeoItem, AnimatedItem {
public String getGunDisplayName() { public String getGunDisplayName() {
return " AA-12"; return " AA-12";
} }
@Override
public boolean canApplyPerk(Perk perk) {
return PerkHelper.SHOTGUN_PERKS.test(perk);
}
} }

View file

@ -8,6 +8,8 @@ import net.mcreator.superbwarfare.init.ModItems;
import net.mcreator.superbwarfare.init.ModSounds; import net.mcreator.superbwarfare.init.ModSounds;
import net.mcreator.superbwarfare.init.ModTags; import net.mcreator.superbwarfare.init.ModTags;
import net.mcreator.superbwarfare.item.AnimatedItem; import net.mcreator.superbwarfare.item.AnimatedItem;
import net.mcreator.superbwarfare.perk.Perk;
import net.mcreator.superbwarfare.perk.PerkHelper;
import net.mcreator.superbwarfare.tools.GunsTool; import net.mcreator.superbwarfare.tools.GunsTool;
import net.mcreator.superbwarfare.tools.PoseTool; import net.mcreator.superbwarfare.tools.PoseTool;
import net.mcreator.superbwarfare.tools.TooltipTool; import net.mcreator.superbwarfare.tools.TooltipTool;
@ -79,7 +81,7 @@ public class Abekiri extends GunItem implements GeoItem, AnimatedItem {
transformType = type; transformType = type;
} }
private PlayState idlePredicate(AnimationState event) { private PlayState idlePredicate(AnimationState<Abekiri> event) {
LocalPlayer player = Minecraft.getInstance().player; LocalPlayer player = Minecraft.getInstance().player;
if (player == null) return PlayState.STOP; if (player == null) return PlayState.STOP;
ItemStack stack = player.getMainHandItem(); ItemStack stack = player.getMainHandItem();
@ -116,7 +118,7 @@ public class Abekiri extends GunItem implements GeoItem, AnimatedItem {
return PlayState.STOP; return PlayState.STOP;
} }
private PlayState procedurePredicate(AnimationState event) { private PlayState procedurePredicate(AnimationState<Abekiri> event) {
if (transformType != null) { if (transformType != null) {
if (!(this.animationProcedure.equals("empty")) && event.getController().getAnimationState() == AnimationController.State.STOPPED) { if (!(this.animationProcedure.equals("empty")) && event.getController().getAnimationState() == AnimationController.State.STOPPED) {
event.getController().setAnimation(RawAnimation.begin().thenPlay(this.animationProcedure)); event.getController().setAnimation(RawAnimation.begin().thenPlay(this.animationProcedure));
@ -179,4 +181,9 @@ public class Abekiri extends GunItem implements GeoItem, AnimatedItem {
public String getGunDisplayName() { public String getGunDisplayName() {
return " Abekiri"; return " Abekiri";
} }
@Override
public boolean canApplyPerk(Perk perk) {
return PerkHelper.SHOTGUN_PERKS.test(perk);
}
} }

View file

@ -182,7 +182,7 @@ public abstract class GunItem extends Item {
} }
} }
public boolean canApplyPerk(ItemStack stack, Perk perk) { public boolean canApplyPerk(Perk perk) {
return true; return true;
} }
} }

View file

@ -8,14 +8,14 @@ import net.mcreator.superbwarfare.init.ModItems;
import net.mcreator.superbwarfare.init.ModSounds; import net.mcreator.superbwarfare.init.ModSounds;
import net.mcreator.superbwarfare.init.ModTags; import net.mcreator.superbwarfare.init.ModTags;
import net.mcreator.superbwarfare.item.AnimatedItem; import net.mcreator.superbwarfare.item.AnimatedItem;
import net.mcreator.superbwarfare.perk.Perk;
import net.mcreator.superbwarfare.perk.PerkHelper;
import net.mcreator.superbwarfare.tools.GunsTool; import net.mcreator.superbwarfare.tools.GunsTool;
import net.mcreator.superbwarfare.tools.PoseTool; import net.mcreator.superbwarfare.tools.PoseTool;
import net.mcreator.superbwarfare.tools.TooltipTool;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.player.LocalPlayer;
import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
@ -25,8 +25,10 @@ import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.Attribute;
import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.item.*; import net.minecraft.world.item.Item;
import net.minecraft.world.level.Level; import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Rarity;
import net.minecraftforge.client.extensions.common.IClientItemExtensions; import net.minecraftforge.client.extensions.common.IClientItemExtensions;
import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.animatable.GeoItem;
import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache;
@ -37,7 +39,6 @@ import software.bernie.geckolib.core.animation.RawAnimation;
import software.bernie.geckolib.core.object.PlayState; import software.bernie.geckolib.core.object.PlayState;
import software.bernie.geckolib.util.GeckoLibUtil; import software.bernie.geckolib.util.GeckoLibUtil;
import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -73,7 +74,7 @@ public class M4Item extends GunItem implements GeoItem, AnimatedItem {
transformType = type; transformType = type;
} }
private PlayState idlePredicate(AnimationState event) { private PlayState idlePredicate(AnimationState<M4Item> event) {
LocalPlayer player = Minecraft.getInstance().player; LocalPlayer player = Minecraft.getInstance().player;
if (player == null) return PlayState.STOP; if (player == null) return PlayState.STOP;
ItemStack stack = player.getMainHandItem(); ItemStack stack = player.getMainHandItem();
@ -118,7 +119,7 @@ public class M4Item extends GunItem implements GeoItem, AnimatedItem {
return PlayState.STOP; return PlayState.STOP;
} }
private PlayState procedurePredicate(AnimationState event) { private PlayState procedurePredicate(AnimationState<M4Item> event) {
if (transformType != null && transformType.firstPerson()) { if (transformType != null && transformType.firstPerson()) {
if (!this.animationProcedure.equals("empty") && event.getController().getAnimationState() == AnimationController.State.STOPPED) { if (!this.animationProcedure.equals("empty") && event.getController().getAnimationState() == AnimationController.State.STOPPED) {
event.getController().setAnimation(RawAnimation.begin().thenPlay(this.animationProcedure)); event.getController().setAnimation(RawAnimation.begin().thenPlay(this.animationProcedure));
@ -158,11 +159,6 @@ public class M4Item extends GunItem implements GeoItem, AnimatedItem {
return map; return map;
} }
@Override
public void appendHoverText(ItemStack stack, Level world, List<Component> list, TooltipFlag flag) {
TooltipTool.addGunTips(list, stack);
}
@Override @Override
public Set<SoundEvent> getReloadSound() { public Set<SoundEvent> getReloadSound() {
return Set.of(ModSounds.M_4_RELOAD_EMPTY.get(), ModSounds.M_4_RELOAD_NORMAL.get()); return Set.of(ModSounds.M_4_RELOAD_EMPTY.get(), ModSounds.M_4_RELOAD_NORMAL.get());
@ -188,4 +184,9 @@ public class M4Item extends GunItem implements GeoItem, AnimatedItem {
public String getGunDisplayName() { public String getGunDisplayName() {
return " M4A1"; return " M4A1";
} }
@Override
public boolean canApplyPerk(Perk perk) {
return PerkHelper.RIFLE_PERKS.test(perk);
}
} }

View file

@ -25,7 +25,6 @@ import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.network.NetworkEvent;
import net.minecraftforge.network.PacketDistributor; import net.minecraftforge.network.PacketDistributor;
import java.util.ArrayList;
import java.util.function.Supplier; import java.util.function.Supplier;
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
@ -42,8 +41,8 @@ public class ModVariables {
public static void onPlayerLoggedInSyncPlayerVariables(PlayerEvent.PlayerLoggedInEvent event) { public static void onPlayerLoggedInSyncPlayerVariables(PlayerEvent.PlayerLoggedInEvent event) {
if (event.getEntity().level().isClientSide()) return; if (event.getEntity().level().isClientSide()) return;
for (Entity entity : new ArrayList<>(event.getEntity().level().players())) { for (Player player : event.getEntity().level().players()) {
entity.getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables()).syncPlayerVariables(entity); player.getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables()).syncPlayerVariables(player);
} }
} }
@ -51,8 +50,8 @@ public class ModVariables {
public static void onPlayerRespawnedSyncPlayerVariables(PlayerEvent.PlayerRespawnEvent event) { public static void onPlayerRespawnedSyncPlayerVariables(PlayerEvent.PlayerRespawnEvent event) {
if (event.getEntity().level().isClientSide()) return; if (event.getEntity().level().isClientSide()) return;
for (Entity entity : new ArrayList<>(event.getEntity().level().players())) { for (Player player : event.getEntity().level().players()) {
entity.getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables()).syncPlayerVariables(entity); player.getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables()).syncPlayerVariables(player);
} }
} }
@ -60,8 +59,8 @@ public class ModVariables {
public static void onPlayerChangedDimensionSyncPlayerVariables(PlayerEvent.PlayerChangedDimensionEvent event) { public static void onPlayerChangedDimensionSyncPlayerVariables(PlayerEvent.PlayerChangedDimensionEvent event) {
if (event.getEntity().level().isClientSide()) return; if (event.getEntity().level().isClientSide()) return;
for (Entity entity : new ArrayList<>(event.getEntity().level().players())) { for (Player player : event.getEntity().level().players()) {
entity.getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables()).syncPlayerVariables(entity); player.getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables()).syncPlayerVariables(player);
} }
} }
@ -92,8 +91,8 @@ public class ModVariables {
if (event.getEntity().level().isClientSide()) return; if (event.getEntity().level().isClientSide()) return;
for (Entity entity : new ArrayList<>(event.getEntity().level().players())) { for (Player player : event.getEntity().level().players()) {
entity.getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables()).syncPlayerVariables(entity); player.getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables()).syncPlayerVariables(player);
} }
} }

View file

@ -12,6 +12,7 @@ import net.minecraftforge.registries.RegistryObject;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Optional; import java.util.Optional;
import java.util.function.Predicate;
public class PerkHelper { public class PerkHelper {
private static final String TAG_PERK_ID = "id"; private static final String TAG_PERK_ID = "id";
@ -178,4 +179,41 @@ public class PerkHelper {
return resourceLocation.getNamespace() + ":" + resourceLocation.getPath(); return resourceLocation.getNamespace() + ":" + resourceLocation.getPath();
} }
public static final Predicate<Perk> SHOTGUN_PERKS = perk -> {
switch (perk.type) {
case AMMO -> {
return true;
}
case FUNCTIONAL -> {
return perk == ModPerks.SUBSISTENCE.get();
}
case DAMAGE -> {
return perk == ModPerks.GUTSHOT_STRAIGHT.get() || perk == ModPerks.MONSTER_HUNTER.get();
}
default -> {
return false;
}
}
};
public static final Predicate<Perk> RIFLE_PERKS = perk -> {
switch (perk.type) {
case AMMO -> {
return true;
}
case FUNCTIONAL -> {
return perk == ModPerks.HEAL_CLIP.get() || perk == ModPerks.FIELD_DOCTOR.get() ||
perk == ModPerks.FOURTH_TIMES_CHARM.get() || perk == ModPerks.SUBSISTENCE.get();
}
case DAMAGE -> {
return perk == ModPerks.KILL_CLIP.get() || perk == ModPerks.GUTSHOT_STRAIGHT.get() ||
perk == ModPerks.MONSTER_HUNTER.get() || perk == ModPerks.HEAD_SEEKER.get();
}
default -> {
return false;
}
}
};
} }