• Recently Browsing

    No registered users viewing this page.

  • Posts

    • Hi! I'm building a simple sword where it should count to 5 once every hit and once it hits five starts a cooldown! that logic is still not implemented because I'm having problems saving data inside the ItemStack of the sword in the form of a capability! here's my code, All it does is give me this error Execution failed for task ':runClient', but if I remove the initCapability function inside DickSword.java it doesn't give any error!   DickMod.java @Mod(MOD_ID) public class DickMod { public static final String MOD_ID = "dick_mod"; public static final Logger LOGGER = LogManager.getLogger(MOD_ID); public DickMod() { final IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); modEventBus.addListener(this::onCommonSetup); } private void onCommonSetup(FMLCommonSetupEvent event) { CoolDownProvider.register(); } } DickSword.java package com.example.DickMod.objects.items; import com.example.DickMod.capabilities.CoolDownProvider; import com.example.DickMod.util.helpers.KeyboardHelper; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.LivingEntity; import net.minecraft.inventory.EquipmentSlotType; import net.minecraft.item.BucketItem; import net.minecraft.item.IItemTier; import net.minecraft.item.ItemStack; import net.minecraft.item.SwordItem; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.SoundEvent; import net.minecraft.util.SoundEvents; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.ICapabilityProvider; import javax.annotation.Nullable; import java.util.List; public class DickSword extends SwordItem { public DickSword(IItemTier tier, int attackDamageIn, float attackSpeedIn, Properties builder) { super(tier, attackDamageIn, attackSpeedIn, builder); } @Override public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { if (CoolDownProvider.CAPABILITY_COOLDOWN != null) { stack.getCapability(CoolDownProvider.CAPABILITY_COOLDOWN).ifPresent(cap -> { if (cap.getCoolDown() > 0) { if (cap.getCount() <= 5) { cap.setCount(cap.getCount() + 1); } else { cap.setCoolDown(5); } } else { getAttributeModifiers(EquipmentSlotType.MAINHAND).forEach((s, attributeModifier) -> { System.out.println(s); }); } System.out.println(cap.getCount()); }); } return super.hitEntity(stack, target, attacker); } @Override public boolean hasEffect(ItemStack stack) { return true; } @Override public void addInformation(ItemStack stack, @Nullable World worldIn, List<ITextComponent> tooltip, ITooltipFlag flagIn) { if (KeyboardHelper.isHoldingShift()) { tooltip.add(new StringTextComponent("CoolDown: " + 5)); tooltip.add(new StringTextComponent("Hold SHIFT to read More")); } super.addInformation(stack, worldIn, tooltip, flagIn); } @Override public SoundEvent func_225519_S__() { return SoundEvents.BLOCK_ANVIL_BREAK; } @Override public SoundEvent func_225520_U__() { return SoundEvents.BLOCK_ANVIL_BREAK; } @Nullable @Override public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundNBT nbt) { return new CoolDownProvider(); } } ICoolDown.java public interface ICoolDown { public void setCoolDown(int cooldown); public void setCount(int count); public int getCoolDown(); public int getCount(); } CoolDownProvider.java public class CoolDownProvider implements ICapabilitySerializable<CompoundNBT> { @CapabilityInject(ICoolDown.class) public static final Capability<ICoolDown> CAPABILITY_COOLDOWN = null; LazyOptional<ICoolDown> instance = LazyOptional.of(CAPABILITY_COOLDOWN::getDefaultInstance); public static void register() { CapabilityManager.INSTANCE.register(ICoolDown.class, new CoolDown.Storage(), CoolDown::new); } @Override public CompoundNBT serializeNBT() { return (CompoundNBT) CAPABILITY_COOLDOWN.getStorage().writeNBT(CAPABILITY_COOLDOWN, instance.orElseThrow(() -> new IllegalArgumentException("LazyOptional cannot be empty!")), null); } @Override public void deserializeNBT(CompoundNBT nbt) { CAPABILITY_COOLDOWN.getStorage().readNBT(CAPABILITY_COOLDOWN, instance.orElseThrow(() -> new IllegalArgumentException("LazyOptional cannot be empty!")), null, nbt); } @Nonnull @Override public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) { return CAPABILITY_COOLDOWN.orEmpty(cap, instance); } } CoolDown.java public class CoolDown implements ICoolDown { private int cooldown; private int count; public CoolDown() { this.cooldown = 0; } @Override public void setCoolDown(int cooldown) { this.cooldown = cooldown; } @Override public void setCount(int count) { this.count = count; } @Override public int getCoolDown() { return cooldown; } @Override public int getCount() { return count; } public static class Storage implements Capability.IStorage<ICoolDown> { @Nullable @Override public INBT writeNBT(Capability<ICoolDown> capability, ICoolDown instance, Direction side) { CompoundNBT tag = new CompoundNBT(); tag.put("cooldown", IntNBT.func_229692_a_(instance.getCoolDown())); tag.put("count", IntNBT.func_229692_a_(instance.getCount())); return tag; } @Override public void readNBT(Capability<ICoolDown> capability, ICoolDown instance, Direction side, INBT nbt) { CompoundNBT tag = (CompoundNBT) nbt; instance.setCoolDown(tag.getInt("cooldown")); instance.setCount(tag.getInt("count")); } } }  
    • It is not comfortable. I need to log some actions into a separate file. And Forge is stopping me from doing this.
    • @diesieben07 Thanks, that helped.   It turns out that that annotation needed to be added to the entity class: @OnlyIn( value = Dist.CLIENT, _interface = IRendersAsItem.class ) public class EntityExplosivePotion extends ThrowableEntity implements IRendersAsItem { // ... }  
    • Why not just apply a marker when you log things and Ctrl + F for the marker?
    • Look at the @OnlyIn annotation on vanilla implementations of this interface.
  • Topics

  • Who's Online (See full list)