哨兵的充能机制改为FE
This commit is contained in:
parent
b5564e1986
commit
978d3c7ab0
8 changed files with 195 additions and 86 deletions
|
@ -8,10 +8,13 @@ import net.minecraft.resources.ResourceLocation;
|
|||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
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.animation.AnimationState;
|
||||
import software.bernie.geckolib.model.GeoModel;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
public class SentinelItemModel extends GeoModel<SentinelItem> {
|
||||
@Override
|
||||
public ResourceLocation getAnimationResource(SentinelItem animatable) {
|
||||
|
@ -95,7 +98,12 @@ public class SentinelItemModel extends GeoModel<SentinelItem> {
|
|||
|
||||
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.setScaleY(1);
|
||||
} else {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -15,11 +15,11 @@ import net.minecraft.server.level.ServerLevel;
|
|||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.sounds.SoundEvent;
|
||||
import net.minecraft.sounds.SoundSource;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.InteractionHand;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.enchantment.EnchantmentHelper;
|
||||
import net.minecraftforge.common.capabilities.ForgeCapabilities;
|
||||
import net.minecraftforge.event.TickEvent;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
|
@ -110,11 +110,11 @@ public class GunEventHandler {
|
|||
|
||||
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);
|
||||
}
|
||||
|
||||
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) {
|
||||
stack.getOrCreateTag().putDouble("fire_sequence", 0);
|
||||
} 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);
|
||||
}
|
||||
|
||||
if (player.getMainHandItem().getItem() == TargetModItems.ABEKIRI.get()) {
|
||||
if (stack.getItem() == TargetModItems.ABEKIRI.get()) {
|
||||
stack.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(InteractionHand.MAIN_HAND));
|
||||
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,
|
||||
|
@ -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);
|
||||
if (stack.getOrCreateTag().getDouble("power") > 3000) {
|
||||
stack.getOrCreateTag().putDouble("power", stack.getOrCreateTag().getDouble("power") - 3000);
|
||||
} else {
|
||||
stack.getOrCreateTag().putDouble("power", 0);
|
||||
}
|
||||
|
||||
stack.getCapability(ForgeCapabilities.ENERGY).ifPresent(
|
||||
iEnergyStorage -> iEnergyStorage.extractEnergy(3000, false)
|
||||
);
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
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) {
|
||||
zoom_add_cooldown = 5;
|
||||
stack.getOrCreateTag().putDouble("marlin_animation_time", 15);
|
||||
|
@ -781,7 +786,11 @@ public class GunEventHandler {
|
|||
}
|
||||
|
||||
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());
|
||||
}
|
||||
|
||||
|
|
|
@ -4,18 +4,21 @@ import com.google.common.collect.HashMultimap;
|
|||
import com.google.common.collect.Multimap;
|
||||
import net.mcreator.target.TargetMod;
|
||||
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.TargetModSounds;
|
||||
import net.mcreator.target.init.TargetModTags;
|
||||
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.model.HumanoidModel;
|
||||
import net.minecraft.client.player.LocalPlayer;
|
||||
import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.sounds.SoundEvent;
|
||||
import net.minecraft.world.InteractionHand;
|
||||
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.AttributeModifier;
|
||||
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.ItemDisplayContext;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.TooltipFlag;
|
||||
import net.minecraft.world.level.Level;
|
||||
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.core.animatable.instance.AnimatableInstanceCache;
|
||||
import software.bernie.geckolib.core.animation.AnimatableManager;
|
||||
|
@ -43,26 +47,49 @@ import software.bernie.geckolib.util.GeckoLibUtil;
|
|||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
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);
|
||||
public String animationProcedure = "empty";
|
||||
public static ItemDisplayContext transformType;
|
||||
|
||||
public SentinelItem() {
|
||||
super(new Item.Properties().stacksTo(1).rarity(RarityTool.LEGENDARY));
|
||||
|
||||
this.energyCapacity = () -> 240000;
|
||||
}
|
||||
|
||||
@Override
|
||||
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
|
||||
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
|
||||
|
@ -92,7 +119,7 @@ public class SentinelItem extends GunItem implements GeoItem, AnimatedItem {
|
|||
transformType = type;
|
||||
}
|
||||
|
||||
private PlayState idlePredicate(AnimationState event) {
|
||||
private PlayState idlePredicate(AnimationState<SentinelItem> event) {
|
||||
LocalPlayer player = Minecraft.getInstance().player;
|
||||
if (player == null) return PlayState.STOP;
|
||||
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"));
|
||||
}
|
||||
|
||||
|
||||
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"));
|
||||
}
|
||||
|
@ -138,7 +164,7 @@ public class SentinelItem extends GunItem implements GeoItem, AnimatedItem {
|
|||
return PlayState.STOP;
|
||||
}
|
||||
|
||||
private PlayState procedurePredicate(AnimationState event) {
|
||||
private PlayState procedurePredicate(AnimationState<SentinelItem> event) {
|
||||
if (transformType != null && transformType.firstPerson()) {
|
||||
if (!this.animationProcedure.equals("empty") && event.getController().getAnimationState() == AnimationController.State.STOPPED) {
|
||||
event.getController().setAnimation(RawAnimation.begin().thenPlay(this.animationProcedure));
|
||||
|
@ -171,36 +197,28 @@ public class SentinelItem extends GunItem implements GeoItem, AnimatedItem {
|
|||
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
|
||||
public void inventoryTick(ItemStack itemStack, Level world, Entity entity, int slot, boolean selected) {
|
||||
super.inventoryTick(itemStack, world, entity, slot, selected);
|
||||
|
||||
var tag = itemStack.getOrCreateTag();
|
||||
|
||||
if (entity instanceof Player player) {
|
||||
tag.putInt("cell_count", getCellCount(player));
|
||||
}
|
||||
itemStack.getCapability(ForgeCapabilities.ENERGY).ifPresent(
|
||||
energy -> {
|
||||
int energyStored = energy.getEnergyStored();
|
||||
|
||||
System.out.println("Client:" + world.isClientSide + " " + energyStored);
|
||||
|
||||
if (energyStored > 0) {
|
||||
energy.extractEnergy(5, false);
|
||||
|
||||
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) {
|
||||
tag.putDouble("crot", tag.getDouble("crot") - 1);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package net.mcreator.target.network.message;
|
||||
|
||||
import net.mcreator.target.TargetMod;
|
||||
import net.mcreator.target.entity.*;
|
||||
import net.mcreator.target.event.GunEventHandler;
|
||||
import net.mcreator.target.init.*;
|
||||
|
@ -49,8 +48,6 @@ public class FireMessage {
|
|||
context.setPacketHandled(true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void pressAction(Player player, int type) {
|
||||
Level world = player.level();
|
||||
|
||||
|
|
|
@ -104,11 +104,19 @@ public class FireModeMessage {
|
|||
&& !capability.zooming
|
||||
&& !(player.getCooldowns().isOnCooldown(mainHandItem.getItem()))
|
||||
&& mainHandItem.getOrCreateTag().getInt("gun_reloading_time") == 0
|
||||
&& !mainHandItem.getOrCreateTag().getBoolean("sentinel_is_charging")
|
||||
&& tag.getInt("cell_count") > 0) {
|
||||
&& !mainHandItem.getOrCreateTag().getBoolean("sentinel_is_charging")) {
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue