
TallYate
Members-
Posts
141 -
Joined
-
Last visited
Everything posted by TallYate
-
My Armor Item doesn’t implement IEnergyStorage, I think that came from CapabilityEnergy.ENERGY
-
stack.getCapability(CapabilityEnergy.ENERGY, null).ifPresent(handler -> { handler is an IEnergyStorage, how would I add my own method to that?
-
I think I have to do something like handler.getEnergyStored()=nbt.getInt("Energy"); but getEnergyStored() returns a value and not a variable/reference, and I don't see any other methods to write to the capability.
-
@Override @Nullable public CompoundNBT getShareTag(ItemStack stack) { CompoundNBT tag = stack.getOrCreateTag(); stack.getCapability(CapabilityEnergy.ENERGY, null).ifPresent(handler -> {tag.putInt("Energy", handler.getEnergyStored());}); return tag; } @Override public void readShareTag(ItemStack stack, @Nullable CompoundNBT nbt) { stack.getCapability(CapabilityEnergy.ENERGY, null).ifPresent(handler -> {nbt.putInt("Energy", handler.getEnergyStored());}); } ok I've done this. I did the local variable thing because I thought it was a reference that I could change. What am I actually supposed to do in readShareTag?
-
@Override @Nullable public CompoundNBT getShareTag(ItemStack stack) { CompoundNBT tag = stack.getOrCreateTag(); stack.getCapability(CapabilityEnergy.ENERGY, null).ifPresent(handler -> {tag.putInt("Energy", stack.getCapability(CapabilityEnergy.ENERGY).orElseGet(null).getEnergyStored());}); return tag; } @Override public void readShareTag(ItemStack stack, @Nullable CompoundNBT nbt) { stack.setTag(nbt); int energy = stack.getCapability(CapabilityEnergy.ENERGY, null).orElse(null).getEnergyStored(); energy=nbt.getInt("Energy"); } I feel like I have done the readShareTag part wrong
-
Ok, so how do I sync it?
-
https://streamable.com/pi8evu
-
Thank you for that, it has stopped spam changing It is not charging in chargers though, but it does suck up power when it is taken out. You can see what I want to happen with the Industrial Foregoing Drill public class PowerArmor extends ArmorItem { public PowerArmor(IArmorMaterial materialIn, EquipmentSlotType slot, Properties builder) { super(materialIn, slot, builder); } private EnergyStorage newStorage() { return new EnergyStorage(10000, 1000, 1000); } @Override public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundNBT nbt) { return new ICapabilityProvider() { protected EnergyStorage storage = newStorage(); protected LazyOptional<EnergyStorage> storageHolder = LazyOptional.of(() -> storage); @Override public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) { if (cap == CapabilityEnergy.ENERGY) { return storageHolder.cast(); } return LazyOptional.empty(); } }; } @Override public void addInformation(ItemStack stack, @Nullable World worldIn, List<ITextComponent> tooltip, ITooltipFlag flagIn) { IEnergyStorage cap = stack.getCapability(CapabilityEnergy.ENERGY, null).orElseGet(null); String charge = Integer.toString(cap.getEnergyStored()); String capacity = Integer.toString(cap.getMaxEnergyStored()); tooltip.add(new TranslationTextComponent("Charge: " + charge + "/" + capacity)); } } Minecraft_ 1.15.2 - Singleplayer 2020-06-20 20-42-13.mp4 Minecraft_ 1.15.2 - Singleplayer 2020-06-20 20-42-13.mp4 Minecraft_ 1.15.2 - Singleplayer 2020-06-20 20-42-13.mp4
-
@Override public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundNBT nbt) { return new ICapabilityProvider() { EnergyStorage storage = new EnergyStorage(capacity, input, output); LazyOptional<EnergyStorage> storageHolder = LazyOptional.of(() -> storage); @Override public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) { if (cap == CapabilityEnergy.ENERGY) { return storageHolder.cast(); } return null; } }; } I moved it into ICapabilityProvider(), but it is still constantly changing this.initCapabilities(stack, stack.serializeNBT()).getCapability(CapabilityEnergy.ENERGY, null) and this.initCapabilities(stack, stack.serializeNBT()).getCapability(CapabilityEnergy.ENERGY, null).orElse(null) also I put this in public void addInformation(ItemStack stack, @Nullable World worldIn, List<ITextComponent> tooltip, ITooltipFlag flagIn) for testing
-
That returns a new instance each time, so I need to store it somewhere?
-
public class PowerArmor extends ArmorItem { //public EnergyStorage storage; private int capacity; private int input; private int output; public PowerArmor(IArmorMaterial materialIn, EquipmentSlotType slot, Properties builder) { super(materialIn, slot, builder); //this.storage = new EnergyStorage(10000, 1000, 1000); this.capacity = 10000; this.input = 1000; this.output = 1000; } @Override public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundNBT nbt) { return new ICapabilityProvider() { @Override public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) { if (cap == CapabilityEnergy.ENERGY) { EnergyStorage storage = new EnergyStorage(capacity, input, output); LazyOptional<EnergyStorage> storageHolder = LazyOptional.of(() -> storage); return storageHolder.cast(); } return null; } }; } } maybe like this?
-
public class PowerArmor extends ArmorItem { public EnergyStorage storage; public PowerArmor(IArmorMaterial materialIn, EquipmentSlotType slot, Properties builder) { super(materialIn, slot, builder); this.storage = new EnergyStorage(10000, 1000, 1000); } @Override public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundNBT nbt) { return new ICapabilityProvider() { @Override public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) { if (cap == CapabilityEnergy.ENERGY) { LazyOptional<EnergyStorage> storageHolder = LazyOptional.of(() -> storage); return storageHolder.cast(); } return null; } }; } @Override public void addInformation(ItemStack stack, @Nullable World worldIn, List<ITextComponent> tooltip, ITooltipFlag flagIn) { String something = "what do I put here"; tooltip.add(new TranslationTextComponent( "Charge: " + something)); } } Like this?
-
What are you referring to when you say capability provider?
-
-
How do I do that?
-
Ok I made my code like Draco18's public class PowerArmor extends ArmorItem { public EnergyStorage storage; public LazyOptional<EnergyStorage> storageHolder = LazyOptional.of(() -> storage); public PowerArmor(IArmorMaterial materialIn, EquipmentSlotType slot, Properties builder) { super(materialIn, slot, builder); this.storage = new EnergyStorage(10000, 1000, 1000, 123); // 123 is just a test } @Override public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundNBT nbt) { return new ICapabilityProvider() { @Override public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) { if (cap == CapabilityEnergy.ENERGY) { return storageHolder.cast(); } return null; } }; } @Override public void addInformation(ItemStack stack, @Nullable World worldIn, List<ITextComponent> tooltip, ITooltipFlag flagIn) { String something = "what do I put here"; tooltip.add(new TranslationTextComponent( "Charge: " + something)); } } Is this correct? Also, how do I get the charge?
-
Ok I tested it and get this: The game crashed whilst ticking block entity Error: java.lang.ClassCastException: java.lang.Class cannot be cast to net.minecraftforge.energy.IEnergyStorage
-
public class PowerArmor extends ArmorItem{ protected int energy; protected int capacity; protected int maxReceive; protected int maxExtract; public ICapabilityProvider capability; public PowerArmor(IArmorMaterial materialIn, EquipmentSlotType slot, Properties builder) { super(materialIn, slot, builder); this.capacity = 10000; this.maxReceive = 1000; this.maxExtract = 1000; this.energy = Math.max(0 , Math.min(capacity, energy)); this.capability = new ICapabilityProvider() { @Override public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) { return (LazyOptional<T>) LazyOptional.of(() -> IEnergyStorage.class); } }; } @Override public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundNBT nbt) { return this.capability; } } Is this good?
-
Like this? @Override public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundNBT nbt) { return new ICapabilityProvider() { @Override public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) { return (LazyOptional<T>) LazyOptional.of(() -> IEnergyStorage.class); } }; }
-
What do you mean by that?
-
public class PowerArmor extends ArmorItem implements IEnergyStorage{ protected int energy; protected int capacity; protected int maxReceive; protected int maxExtract; public PowerArmor(IArmorMaterial materialIn, EquipmentSlotType slot, Properties builder) { super(materialIn, slot, builder); this.capacity = 10000; this.maxReceive = 1000; this.maxExtract = 1000; this.energy = Math.max(0 , Math.min(capacity, energy)); } @Override public int receiveEnergy(int maxReceive, boolean simulate) { if (!canReceive()) return 0; int energyReceived = Math.min(capacity - energy, Math.min(this.maxReceive, maxReceive)); if (!simulate) energy += energyReceived; return energyReceived; } @Override public int extractEnergy(int maxExtract, boolean simulate) { if (!canExtract()) return 0; int energyExtracted = Math.min(energy, Math.min(this.maxExtract, maxExtract)); if (!simulate) energy -= energyExtracted; return energyExtracted; } @Override public int getEnergyStored() { return energy; } @Override public int getMaxEnergyStored() { return capacity; } @Override public boolean canExtract() { return this.maxExtract > 0; } @Override public boolean canReceive() { return this.maxReceive > 0; } } This is my code. I've heard that I need to use initCapabilities. How would I do that?
-
[1.15.2] Why does this not change my velocity?
TallYate replied to TallYate's topic in Modder Support
Apparently movement is client-side so that's why it doesn't move me -
public static void handle(key msg, Supplier<NetworkEvent.Context> ctx) { if (msg.key == 0 && ctx.get().getSender().getItemStackFromSlot(EquipmentSlotType.FEET) .getItem() == ModItems.KABOOTS.get()) { ctx.get().enqueueWork(() -> { ServerPlayerEntity sender = ctx.get().getSender(); Vec3d pos = sender.getPositionVec(); Vec3d look = sender.getLookVec(); double x = pos.getX() - (look.getX() / 2); double y = pos.getY() - 0.3; double z = pos.getZ() - (look.getZ() / 2); float size = 1.0F; sender.world.createExplosion(sender, (DamageSource) null, x, y, z, size, false, Explosion.Mode.BREAK); int k1 = MathHelper.floor(x - size - 1.0D); int l1 = MathHelper.floor(x + size + 1.0D); int i2 = MathHelper.floor(y - size - 1.0D); int i1 = MathHelper.floor(y + size + 1.0D); int j2 = MathHelper.floor(z - size - 1.0D); int j1 = MathHelper.floor(z + size + 1.0D); List<Entity> list = sender.getEntityWorld().getEntitiesWithinAABB(LivingEntity.class, new AxisAlignedBB((double) k1, (double) i2, (double) j2, (double) l1, (double) i1, (double) j1), Predicates.instanceOf(LivingEntity.class)); for (int i = 0; i < list.size(); i++) { list.get(i).setVelocity(0, 0, 25); CrudeTechMod.log(list.get(i).toString()); } }); } ctx.get().setPacketHandled(true); } I am logged, but my velocity doesn't change ServerPlayerEntity['Dev'/50, l='test', x=-299.80, y=3.25, z=433.91]
-
[1.15.2] Make server summon entity based on client
TallYate replied to TallYate's topic in Modder Support
The problem was that I made the array at the beginning, but then used keyExplosiveJump instead of array[0]