哨兵的充能机制改为FE

This commit is contained in:
17146 2024-07-14 23:23:34 +08:00
parent b5564e1986
commit 978d3c7ab0
8 changed files with 195 additions and 86 deletions

View file

@ -8,10 +8,13 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
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.minecraftforge.common.capabilities.ForgeCapabilities;
import software.bernie.geckolib.core.animatable.model.CoreGeoBone; import software.bernie.geckolib.core.animatable.model.CoreGeoBone;
import software.bernie.geckolib.core.animation.AnimationState; import software.bernie.geckolib.core.animation.AnimationState;
import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.GeoModel;
import java.util.concurrent.atomic.AtomicBoolean;
public class SentinelItemModel extends GeoModel<SentinelItem> { public class SentinelItemModel extends GeoModel<SentinelItem> {
@Override @Override
public ResourceLocation getAnimationResource(SentinelItem animatable) { public ResourceLocation getAnimationResource(SentinelItem animatable) {
@ -89,13 +92,18 @@ public class SentinelItemModel extends GeoModel<SentinelItem> {
shen.setRotX(0.15f * (float) (0.18f * fp + fr)); shen.setRotX(0.15f * (float) (0.18f * fp + fr));
shen.setRotZ(-0.01f * (float) (fp + 1.3 * fr)); shen.setRotZ(-0.01f * (float) (fp + 1.3 * fr));
} }
shen.setPosX(0.5f * (float)fr * (float)((player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new TargetModVariables.PlayerVariables())).recoilHorizon * fp)); shen.setPosX(0.5f * (float) fr * (float) ((player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new TargetModVariables.PlayerVariables())).recoilHorizon * fp));
CoreGeoBone charge = getAnimationProcessor().getBone("charge"); CoreGeoBone charge = getAnimationProcessor().getBone("charge");
charge.setRotZ(charge.getRotZ() + times * 0.05f); charge.setRotZ(charge.getRotZ() + times * 0.05f);
if ((stack.getOrCreateTag().getDouble("power") > 0)) { AtomicBoolean flag = new AtomicBoolean(false);
stack.getCapability(ForgeCapabilities.ENERGY).ifPresent(
iEnergyStorage -> flag.set(iEnergyStorage.getEnergyStored() > 0)
);
if (flag.get()) {
charge.setScaleX(1); charge.setScaleX(1);
charge.setScaleY(1); charge.setScaleY(1);
} else { } else {
@ -105,8 +113,8 @@ public class SentinelItemModel extends GeoModel<SentinelItem> {
CoreGeoBone root = getAnimationProcessor().getBone("root"); CoreGeoBone root = getAnimationProcessor().getBone("root");
float PosX = (float)player.getPersistentData().getDouble("gun_move_posX"); float PosX = (float) player.getPersistentData().getDouble("gun_move_posX");
float PosY = (float)player.getPersistentData().getDouble("gun_move_posY"); float PosY = (float) player.getPersistentData().getDouble("gun_move_posY");
double y = player.getPersistentData().getDouble("y"); double y = player.getPersistentData().getDouble("y");
double x = player.getPersistentData().getDouble("x"); double x = player.getPersistentData().getDouble("x");

View file

@ -0,0 +1,30 @@
package net.mcreator.target.energy;
import net.minecraft.core.Direction;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ForgeCapabilities;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.energy.IEnergyStorage;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class ItemEnergyProvider implements ICapabilityProvider {
private final LazyOptional<IEnergyStorage> capability;
public ItemEnergyProvider(ItemStack stack, int energyCapacity) {
this.capability = LazyOptional.of(() -> new ItemEnergyStorage(stack, energyCapacity));
}
@Nonnull
@Override
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction dire) {
if (cap == ForgeCapabilities.ENERGY) {
return capability.cast();
}
return LazyOptional.empty();
}
}

View file

@ -0,0 +1,39 @@
package net.mcreator.target.energy;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.energy.EnergyStorage;
public class ItemEnergyStorage extends EnergyStorage {
private static final String NBT_ENERGY = "Energy";
private final ItemStack stack;
public ItemEnergyStorage(ItemStack stack, int capacity) {
super(capacity, Integer.MAX_VALUE, Integer.MAX_VALUE);
this.stack = stack;
this.energy = stack.hasTag() && stack.getTag().contains(NBT_ENERGY) ? stack.getTag().getInt(NBT_ENERGY) : 0;
}
@Override
public int receiveEnergy(int maxReceive, boolean simulate) {
int received = super.receiveEnergy(maxReceive, simulate);
if (received > 0 && !simulate) {
stack.getOrCreateTag().putInt(NBT_ENERGY, getEnergyStored());
}
return received;
}
@Override
public int extractEnergy(int maxExtract, boolean simulate) {
int extracted = super.extractEnergy(maxExtract, simulate);
if (extracted > 0 && !simulate) {
stack.getOrCreateTag().putInt(NBT_ENERGY, getEnergyStored());
}
return extracted;
}
}

View file

@ -15,11 +15,11 @@ import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundSource; import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Mth;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
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.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.EnchantmentHelper;
import net.minecraftforge.common.capabilities.ForgeCapabilities;
import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
@ -110,11 +110,11 @@ public class GunEventHandler {
stack.getOrCreateTag().putDouble("empty", 1); stack.getOrCreateTag().putDouble("empty", 1);
if (player.getMainHandItem().getItem() == TargetModItems.M_60.get()) { if (stack.getItem() == TargetModItems.M_60.get()) {
stack.getOrCreateTag().putBoolean("bullet_chain", true); stack.getOrCreateTag().putBoolean("bullet_chain", true);
} }
if (player.getMainHandItem().getItem() == TargetModItems.M_4.get() || player.getMainHandItem().getItem() == TargetModItems.HK_416.get()) { if (stack.getItem() == TargetModItems.M_4.get() || player.getMainHandItem().getItem() == TargetModItems.HK_416.get()) {
if (stack.getOrCreateTag().getDouble("fire_sequence") == 1) { if (stack.getOrCreateTag().getDouble("fire_sequence") == 1) {
stack.getOrCreateTag().putDouble("fire_sequence", 0); stack.getOrCreateTag().putDouble("fire_sequence", 0);
} else { } else {
@ -122,11 +122,11 @@ public class GunEventHandler {
} }
} }
if (player.getMainHandItem().getItem() == TargetModItems.DEVOTION.get()) { if (stack.getItem() == TargetModItems.DEVOTION.get()) {
stack.getOrCreateTag().putDouble("fire_increase", stack.getOrCreateTag().getDouble("fire_increase") + 0.334); stack.getOrCreateTag().putDouble("fire_increase", stack.getOrCreateTag().getDouble("fire_increase") + 0.334);
} }
if (player.getMainHandItem().getItem() == TargetModItems.ABEKIRI.get()) { if (stack.getItem() == TargetModItems.ABEKIRI.get()) {
stack.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(InteractionHand.MAIN_HAND)); stack.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(InteractionHand.MAIN_HAND));
if (player instanceof ServerPlayer serverPlayer && player.level() instanceof ServerLevel serverLevel) { if (player instanceof ServerPlayer serverPlayer && player.level() instanceof ServerLevel serverLevel) {
ParticleTool.sendParticle(serverLevel, ParticleTypes.CLOUD, player.getX() + 1.8 * player.getLookAngle().x, player.getY() + player.getBbHeight() - 0.1 + 1.8 * player.getLookAngle().y, ParticleTool.sendParticle(serverLevel, ParticleTypes.CLOUD, player.getX() + 1.8 * player.getLookAngle().x, player.getY() + player.getBbHeight() - 0.1 + 1.8 * player.getLookAngle().y,
@ -134,18 +134,23 @@ public class GunEventHandler {
} }
} }
if (player.getMainHandItem().getItem() == TargetModItems.SENTINEL.get()) { if (stack.getItem() == TargetModItems.SENTINEL.get()) {
stack.getOrCreateTag().putBoolean("zoom_fire", (player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new TargetModVariables.PlayerVariables())).zooming); stack.getOrCreateTag().putBoolean("zoom_fire", (player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new TargetModVariables.PlayerVariables())).zooming);
if (stack.getOrCreateTag().getDouble("power") > 3000) {
stack.getOrCreateTag().putDouble("power", stack.getOrCreateTag().getDouble("power") - 3000); stack.getCapability(ForgeCapabilities.ENERGY).ifPresent(
} else { iEnergyStorage -> iEnergyStorage.extractEnergy(3000, false)
stack.getOrCreateTag().putDouble("power", 0); );
}
// if (stack.getOrCreateTag().getDouble("power") > 3000) {
// stack.getOrCreateTag().putDouble("power", stack.getOrCreateTag().getDouble("power") - 3000);
// } else {
// stack.getOrCreateTag().putDouble("power", 0);
// }
stack.getOrCreateTag().putDouble("crot", 20); stack.getOrCreateTag().putDouble("crot", 20);
} }
int zoom_add_cooldown = 0; int zoom_add_cooldown = 0;
if (player.getMainHandItem().getItem() == TargetModItems.MARLIN.get()) { if (stack.getItem() == TargetModItems.MARLIN.get()) {
if ((player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new TargetModVariables.PlayerVariables())).zooming) { if ((player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new TargetModVariables.PlayerVariables())).zooming) {
zoom_add_cooldown = 5; zoom_add_cooldown = 5;
stack.getOrCreateTag().putDouble("marlin_animation_time", 15); stack.getOrCreateTag().putDouble("marlin_animation_time", 15);
@ -163,7 +168,7 @@ public class GunEventHandler {
gunShoot(player); gunShoot(player);
} }
stack.getOrCreateTag().putBoolean("shoot",true); stack.getOrCreateTag().putBoolean("shoot", true);
} }
@ -234,7 +239,7 @@ public class GunEventHandler {
} }
} }
stack.getOrCreateTag().putBoolean("shoot",true); stack.getOrCreateTag().putBoolean("shoot", true);
for (int index0 = 0; index0 < (int) stack.getOrCreateTag().getDouble("projectile_amount"); index0++) { for (int index0 = 0; index0 < (int) stack.getOrCreateTag().getDouble("projectile_amount"); index0++) {
gunShoot(player); gunShoot(player);
@ -533,18 +538,18 @@ public class GunEventHandler {
//此处判断空仓换弹的时候是否在准备阶段就需要装填一发如M870 //此处判断空仓换弹的时候是否在准备阶段就需要装填一发如M870
if (tag.getDouble("prepare_load_time") != 0 && tag.getInt("ammo") == 0) { if (tag.getDouble("prepare_load_time") != 0 && tag.getInt("ammo") == 0) {
playGunPrepareLoadReloadSounds(player); playGunPrepareLoadReloadSounds(player);
tag.putInt("prepare_load",(int)tag.getDouble("prepare_load_time")); tag.putInt("prepare_load", (int) tag.getDouble("prepare_load_time"));
player.getCooldowns().addCooldown(stack.getItem(), (int)tag.getDouble("prepare_load_time")); player.getCooldowns().addCooldown(stack.getItem(), (int) tag.getDouble("prepare_load_time"));
} else { } else {
playGunPrepareReloadSounds(player); playGunPrepareReloadSounds(player);
tag.putInt("prepare",(int)tag.getDouble("prepare_time")); tag.putInt("prepare", (int) tag.getDouble("prepare_time"));
player.getCooldowns().addCooldown(stack.getItem(), (int)tag.getDouble("prepare_time")); player.getCooldowns().addCooldown(stack.getItem(), (int) tag.getDouble("prepare_time"));
} }
tag.putBoolean("force_stop", false); tag.putBoolean("force_stop", false);
tag.putBoolean("stop", false); tag.putBoolean("stop", false);
tag.putInt("reload_stage",1); tag.putInt("reload_stage", 1);
tag.putBoolean("reloading", true); tag.putBoolean("reloading", true);
tag.putBoolean("start_single_reload", false); tag.putBoolean("start_single_reload", false);
@ -564,21 +569,21 @@ public class GunEventHandler {
//检查备弹 //检查备弹
var capability = player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new TargetModVariables.PlayerVariables()); var capability = player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new TargetModVariables.PlayerVariables());
if (stack.is(TargetModTags.Items.SHOTGUN) && capability.shotgunAmmo == 0) { if (stack.is(TargetModTags.Items.SHOTGUN) && capability.shotgunAmmo == 0) {
tag.putBoolean("force_stage3_start",true); tag.putBoolean("force_stage3_start", true);
} else if (stack.is(TargetModTags.Items.SNIPER_RIFLE) && capability.sniperAmmo == 0) { } else if (stack.is(TargetModTags.Items.SNIPER_RIFLE) && capability.sniperAmmo == 0) {
tag.putBoolean("force_stage3_start",true); tag.putBoolean("force_stage3_start", true);
} else if ((stack.is(TargetModTags.Items.HANDGUN) || stack.is(TargetModTags.Items.SMG)) && capability.handgunAmmo == 0) { } else if ((stack.is(TargetModTags.Items.HANDGUN) || stack.is(TargetModTags.Items.SMG)) && capability.handgunAmmo == 0) {
tag.putBoolean("force_stage3_start",true); tag.putBoolean("force_stage3_start", true);
} else if (stack.is(TargetModTags.Items.RIFLE) && capability.rifleAmmo == 0) { } else if (stack.is(TargetModTags.Items.RIFLE) && capability.rifleAmmo == 0) {
tag.putBoolean("force_stage3_start",true); tag.putBoolean("force_stage3_start", true);
} else { } else {
tag.putInt("reload_stage",2); tag.putInt("reload_stage", 2);
} }
} }
//强制停止换弹进入三阶段 //强制停止换弹进入三阶段
if (tag.getBoolean("force_stop")) { if (tag.getBoolean("force_stop")) {
tag.putBoolean("stop",true); tag.putBoolean("stop", true);
} }
//二阶段 //二阶段
@ -587,11 +592,11 @@ public class GunEventHandler {
&& tag.getInt("reload_stage") == 2 && tag.getInt("reload_stage") == 2
&& tag.getInt("iterative") == 0 && tag.getInt("iterative") == 0
&& !tag.getBoolean("stop") && !tag.getBoolean("stop")
&& tag.getInt("ammo") < (int)tag.getDouble("mag")) { && tag.getInt("ammo") < (int) tag.getDouble("mag")) {
playGunLoopReloadSounds(player); playGunLoopReloadSounds(player);
tag.putDouble("iterative", (int)tag.getDouble("iterative_time")); tag.putDouble("iterative", (int) tag.getDouble("iterative_time"));
player.getCooldowns().addCooldown(stack.getItem(), (int)tag.getDouble("iterative_time")); player.getCooldowns().addCooldown(stack.getItem(), (int) tag.getDouble("iterative_time"));
//动画播放nbt //动画播放nbt
if (tag.getDouble("load_index") == 1) { if (tag.getDouble("load_index") == 1) {
tag.putDouble("load_index", 0); tag.putDouble("load_index", 0);
@ -618,25 +623,25 @@ public class GunEventHandler {
if (tag.getInt("iterative") == 1) { if (tag.getInt("iterative") == 1) {
//装满结束 //装满结束
if (tag.getInt("ammo") >= (int)tag.getDouble("mag")) { if (tag.getInt("ammo") >= (int) tag.getDouble("mag")) {
tag.putInt("reload_stage",3); tag.putInt("reload_stage", 3);
} }
//备弹耗尽结束 //备弹耗尽结束
var capability = player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new TargetModVariables.PlayerVariables()); var capability = player.getCapability(TargetModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new TargetModVariables.PlayerVariables());
if (stack.is(TargetModTags.Items.SHOTGUN) && capability.shotgunAmmo == 0) { if (stack.is(TargetModTags.Items.SHOTGUN) && capability.shotgunAmmo == 0) {
tag.putInt("reload_stage",3); tag.putInt("reload_stage", 3);
} else if (stack.is(TargetModTags.Items.SNIPER_RIFLE) && capability.sniperAmmo == 0) { } else if (stack.is(TargetModTags.Items.SNIPER_RIFLE) && capability.sniperAmmo == 0) {
tag.putInt("reload_stage",3); tag.putInt("reload_stage", 3);
} else if ((stack.is(TargetModTags.Items.HANDGUN) || stack.is(TargetModTags.Items.SMG)) && capability.handgunAmmo == 0) { } else if ((stack.is(TargetModTags.Items.HANDGUN) || stack.is(TargetModTags.Items.SMG)) && capability.handgunAmmo == 0) {
tag.putInt("reload_stage",3); tag.putInt("reload_stage", 3);
} else if (stack.is(TargetModTags.Items.RIFLE) && capability.rifleAmmo == 0) { } else if (stack.is(TargetModTags.Items.RIFLE) && capability.rifleAmmo == 0) {
tag.putInt("reload_stage",3); tag.putInt("reload_stage", 3);
} }
//强制结束 //强制结束
if (tag.getBoolean("stop")) { if (tag.getBoolean("stop")) {
tag.putInt("reload_stage",3); tag.putInt("reload_stage", 3);
tag.putBoolean("force_stop", false); tag.putBoolean("force_stop", false);
tag.putBoolean("stop", false); tag.putBoolean("stop", false);
} }
@ -646,15 +651,15 @@ public class GunEventHandler {
if ((tag.getInt("iterative") == 1 && tag.getInt("reload_stage") == 3) || tag.getBoolean("force_stage3_start")) { if ((tag.getInt("iterative") == 1 && tag.getInt("reload_stage") == 3) || tag.getBoolean("force_stage3_start")) {
tag.putBoolean("force_stage3_start", false); tag.putBoolean("force_stage3_start", false);
tag.putDouble("finish", (int)tag.getDouble("finish_time")); tag.putDouble("finish", (int) tag.getDouble("finish_time"));
player.getCooldowns().addCooldown(stack.getItem(), (int)tag.getDouble("finish_time")); player.getCooldowns().addCooldown(stack.getItem(), (int) tag.getDouble("finish_time"));
playGunEndReloadSounds(player); playGunEndReloadSounds(player);
} }
//三阶段结束 //三阶段结束
if (tag.getInt("finish") == 1) { if (tag.getInt("finish") == 1) {
tag.putInt("reload_stage",0); tag.putInt("reload_stage", 0);
tag.putBoolean("reloading", false); tag.putBoolean("reloading", false);
} }
} }
@ -781,7 +786,11 @@ public class GunEventHandler {
} }
if (tag.getInt("sentinel_charge_time") == 17) { if (tag.getInt("sentinel_charge_time") == 17) {
tag.putDouble("power", Mth.clamp(tag.getDouble("power") + 24000,0,240000)); stack.getCapability(ForgeCapabilities.ENERGY).ifPresent(
iEnergyStorage -> iEnergyStorage.receiveEnergy(24000, false)
);
// tag.putDouble("power", Mth.clamp(tag.getDouble("power") + 24000,0,240000));
player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == TargetModItems.SHIELD_CELL.get(), 1, player.inventoryMenu.getCraftSlots()); player.getInventory().clearOrCountMatchingItems(p -> p.getItem() == TargetModItems.SHIELD_CELL.get(), 1, player.inventoryMenu.getCraftSlots());
} }

View file

@ -4,18 +4,21 @@ import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import net.mcreator.target.TargetMod; import net.mcreator.target.TargetMod;
import net.mcreator.target.client.renderer.item.SentinelItemRenderer; import net.mcreator.target.client.renderer.item.SentinelItemRenderer;
import net.mcreator.target.energy.ItemEnergyProvider;
import net.mcreator.target.init.TargetModItems; import net.mcreator.target.init.TargetModItems;
import net.mcreator.target.init.TargetModSounds; import net.mcreator.target.init.TargetModSounds;
import net.mcreator.target.init.TargetModTags; import net.mcreator.target.init.TargetModTags;
import net.mcreator.target.item.AnimatedItem; import net.mcreator.target.item.AnimatedItem;
import net.mcreator.target.tools.*; import net.mcreator.target.tools.GunsTool;
import net.mcreator.target.tools.RarityTool;
import net.mcreator.target.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.nbt.CompoundTag;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
@ -24,13 +27,14 @@ 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.entity.player.Player;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraftforge.client.extensions.common.IClientItemExtensions; import net.minecraftforge.client.extensions.common.IClientItemExtensions;
import net.minecraftforge.common.capabilities.ForgeCapabilities;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
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;
import software.bernie.geckolib.core.animation.AnimatableManager; import software.bernie.geckolib.core.animation.AnimatableManager;
@ -43,26 +47,49 @@ import software.bernie.geckolib.util.GeckoLibUtil;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Supplier;
public class SentinelItem extends GunItem implements GeoItem, AnimatedItem { public class SentinelItem extends GunItem implements GeoItem, AnimatedItem {
private static final String TAG_POWER = "power"; private final Supplier<Integer> energyCapacity;
private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this);
public String animationProcedure = "empty"; public String animationProcedure = "empty";
public static ItemDisplayContext transformType; public static ItemDisplayContext transformType;
public SentinelItem() { public SentinelItem() {
super(new Item.Properties().stacksTo(1).rarity(RarityTool.LEGENDARY)); super(new Item.Properties().stacksTo(1).rarity(RarityTool.LEGENDARY));
this.energyCapacity = () -> 240000;
} }
@Override @Override
public boolean isBarVisible(ItemStack pStack) { public boolean isBarVisible(ItemStack pStack) {
return ItemNBTTool.getInt(pStack, TAG_POWER, 0) != 0; if (!pStack.getCapability(ForgeCapabilities.ENERGY).isPresent()) {
return false;
}
AtomicInteger energy = new AtomicInteger(0);
pStack.getCapability(ForgeCapabilities.ENERGY).ifPresent(
e -> energy.set(e.getEnergyStored())
);
return energy.get() != 0;
} }
@Override @Override
public int getBarWidth(ItemStack pStack) { public int getBarWidth(ItemStack pStack) {
return Math.round((float) ItemNBTTool.getInt(pStack, TAG_POWER, 0) * 13.0F / 240000F); AtomicInteger energy = new AtomicInteger(0);
pStack.getCapability(ForgeCapabilities.ENERGY).ifPresent(
e -> energy.set(e.getEnergyStored())
);
return Math.round((float) energy.get() * 13.0F / 240000F);
}
@Override
public ICapabilityProvider initCapabilities(ItemStack stack, CompoundTag tag) {
return new ItemEnergyProvider(stack, energyCapacity.get());
} }
@Override @Override
@ -92,7 +119,7 @@ public class SentinelItem extends GunItem implements GeoItem, AnimatedItem {
transformType = type; transformType = type;
} }
private PlayState idlePredicate(AnimationState event) { private PlayState idlePredicate(AnimationState<SentinelItem> 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();
@ -124,7 +151,6 @@ public class SentinelItem extends GunItem implements GeoItem, AnimatedItem {
return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sentinel.reload_normal")); return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sentinel.reload_normal"));
} }
if (stack.getOrCreateTag().getDouble("sentinel_charge_time") < 127 && stack.getOrCreateTag().getDouble("sentinel_charge_time") > 0 && stack.getOrCreateTag().getBoolean("sentinel_is_charging")) { if (stack.getOrCreateTag().getDouble("sentinel_charge_time") < 127 && stack.getOrCreateTag().getDouble("sentinel_charge_time") > 0 && stack.getOrCreateTag().getBoolean("sentinel_is_charging")) {
return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sentinel.charge")); return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sentinel.charge"));
} }
@ -138,7 +164,7 @@ public class SentinelItem extends GunItem implements GeoItem, AnimatedItem {
return PlayState.STOP; return PlayState.STOP;
} }
private PlayState procedurePredicate(AnimationState event) { private PlayState procedurePredicate(AnimationState<SentinelItem> 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));
@ -171,36 +197,28 @@ public class SentinelItem extends GunItem implements GeoItem, AnimatedItem {
TooltipTool.addSentinelTips(list, stack); TooltipTool.addSentinelTips(list, stack);
} }
public static int getCellCount(Player player) {
int sum = 0;
for (int i = 0; i < player.getInventory().getContainerSize(); ++i) {
ItemStack itemstack = player.getInventory().getItem(i);
if (check(itemstack)) {
sum += itemstack.getCount();
}
}
return sum;
}
protected static boolean check(ItemStack stack) {
return stack.getItem() == TargetModItems.SHIELD_CELL.get();
}
@Override @Override
public void inventoryTick(ItemStack itemStack, Level world, Entity entity, int slot, boolean selected) { public void inventoryTick(ItemStack itemStack, Level world, Entity entity, int slot, boolean selected) {
super.inventoryTick(itemStack, world, entity, slot, selected); super.inventoryTick(itemStack, world, entity, slot, selected);
var tag = itemStack.getOrCreateTag(); var tag = itemStack.getOrCreateTag();
if (entity instanceof Player player) { itemStack.getCapability(ForgeCapabilities.ENERGY).ifPresent(
tag.putInt("cell_count", getCellCount(player)); energy -> {
} int energyStored = energy.getEnergyStored();
System.out.println("Client:" + world.isClientSide + " " + energyStored);
if (energyStored > 0) {
energy.extractEnergy(5, false);
tag.putDouble("add_damage", 0.2857142857142857 * tag.getDouble("damage") * tag.getDouble("damageadd"));
} else {
tag.putDouble("add_damage", 0);
}
}
);
if (tag.getDouble("power") > 0) {
tag.putDouble("add_damage", 0.2857142857142857 * tag.getDouble("damage") * tag.getDouble("damageadd"));
tag.putDouble("power", tag.getDouble("power") - 5);
} else {
tag.putDouble("add_damage", 0);
}
if (tag.getDouble("crot") > 0) { if (tag.getDouble("crot") > 0) {
tag.putDouble("crot", tag.getDouble("crot") - 1); tag.putDouble("crot", tag.getDouble("crot") - 1);
} }

View file

@ -1,6 +1,5 @@
package net.mcreator.target.network.message; package net.mcreator.target.network.message;
import net.mcreator.target.TargetMod;
import net.mcreator.target.entity.*; import net.mcreator.target.entity.*;
import net.mcreator.target.event.GunEventHandler; import net.mcreator.target.event.GunEventHandler;
import net.mcreator.target.init.*; import net.mcreator.target.init.*;
@ -49,8 +48,6 @@ public class FireMessage {
context.setPacketHandled(true); context.setPacketHandled(true);
} }
public static void pressAction(Player player, int type) { public static void pressAction(Player player, int type) {
Level world = player.level(); Level world = player.level();
@ -173,7 +170,7 @@ public class FireMessage {
} }
} else { } else {
stack.getOrCreateTag().putBoolean("shoot",true); stack.getOrCreateTag().putBoolean("shoot", true);
for (int index0 = 0; index0 < 10; index0++) { for (int index0 = 0; index0 < 10; index0++) {
spawnBullet(player); spawnBullet(player);
@ -258,7 +255,7 @@ public class FireMessage {
level.addFreshEntity(taserBulletProjectile); level.addFreshEntity(taserBulletProjectile);
} }
stack.getOrCreateTag().putBoolean("shoot",true); stack.getOrCreateTag().putBoolean("shoot", true);
stack.getOrCreateTag().putInt("fire_animation", 4); stack.getOrCreateTag().putInt("fire_animation", 4);
stack.getOrCreateTag().putInt("ammo", (stack.getOrCreateTag().getInt("ammo") - 1)); stack.getOrCreateTag().putInt("ammo", (stack.getOrCreateTag().getInt("ammo") - 1));
@ -302,7 +299,7 @@ public class FireMessage {
serverPlayer.level().playSound(null, serverPlayer.getOnPos(), TargetModSounds.M_79_VERYFAR.get(), SoundSource.PLAYERS, 12, 1); serverPlayer.level().playSound(null, serverPlayer.getOnPos(), TargetModSounds.M_79_VERYFAR.get(), SoundSource.PLAYERS, 12, 1);
} }
stack.getOrCreateTag().putBoolean("shoot",true); stack.getOrCreateTag().putBoolean("shoot", true);
stack.getOrCreateTag().putInt("fire_animation", 2); stack.getOrCreateTag().putInt("fire_animation", 2);
stack.getOrCreateTag().putInt("ammo", (stack.getOrCreateTag().getInt("ammo") - 1)); stack.getOrCreateTag().putInt("ammo", (stack.getOrCreateTag().getInt("ammo") - 1));
@ -351,7 +348,7 @@ public class FireMessage {
serverPlayer.level().playSound(null, serverPlayer.getOnPos(), TargetModSounds.RPG_VERYFAR.get(), SoundSource.PLAYERS, 16, 1); serverPlayer.level().playSound(null, serverPlayer.getOnPos(), TargetModSounds.RPG_VERYFAR.get(), SoundSource.PLAYERS, 16, 1);
} }
tag.putBoolean("shoot",true); tag.putBoolean("shoot", true);
tag.putInt("fire_animation", 2); tag.putInt("fire_animation", 2);
tag.putInt("ammo", tag.getInt("ammo") - 1); tag.putInt("ammo", tag.getInt("ammo") - 1);

View file

@ -104,10 +104,18 @@ public class FireModeMessage {
&& !capability.zooming && !capability.zooming
&& !(player.getCooldowns().isOnCooldown(mainHandItem.getItem())) && !(player.getCooldowns().isOnCooldown(mainHandItem.getItem()))
&& mainHandItem.getOrCreateTag().getInt("gun_reloading_time") == 0 && mainHandItem.getOrCreateTag().getInt("gun_reloading_time") == 0
&& !mainHandItem.getOrCreateTag().getBoolean("sentinel_is_charging") && !mainHandItem.getOrCreateTag().getBoolean("sentinel_is_charging")) {
&& tag.getInt("cell_count") > 0) {
tag.putBoolean("start_sentinel_charge", true); int count = 0;
for (var inv : player.getInventory().items) {
if (inv.is(TargetModItems.SHIELD_CELL.get())) {
count++;
}
}
if (count > 0) {
tag.putBoolean("start_sentinel_charge", true);
}
} }
} }
} }