Jump to content

ItemStack capabilities behaving oddly when playing on server


Jay Avery

Recommended Posts

I have some items which I give a 'decay' capability. It stores the time the item was created, and compares that against the current time and a predefined shelf-life to give different effects. All of these things are working exactly as expected when I play in single player.

  • The item's durability bar is coloured in a shade between green and red representing its decay level (more red = more rotten).
  • When the item is fully rotten:
    • The player can't eat it
    • The model changes to a 'rot' texture using a property override
    • The display name of the stack becomes "Rotten ____"

 

But some weird things are happening when I run a server and connect to it, and I have no idea why:

  • When a decayable item is a dropped entity in the world, it always renders as rotten - whether it actually is or not. (In singleplayer, they render correctly when they're dropped entities).
  • Decayable items in my inventory have their durability bar completely green until fully rotten (In singleplayer they fade progressively from green to red).
  • When I click on an item in a slot of my inventory, it immediately 'becomes' rotten (displays the rot texture, name, and red durability bar). It stays that way when I put it down into a slot. But, these stacks will revert back to their correct state when:
    • I eat one from a stack of items (and if they were truly rotten I wouldn't be able to eat them in the first place)
    • I drop part or all of the stack using Q or clicking outside the inventory GUI.

These problems are so weirdly specific, and I have no idea how they can be different between singleplayer and connected to a server. Can anyone help?

 

My code is all on github. Probably-relevant classes:

Edited by Jay Avery
Link to comment
Share on other sites

Item capabilities are hard to sync properly, as discussed here and in the referenced issues.

 

The best option at the moment may be overriding Item#getNBTShareTag to include the capability data required for display purposes. If you're attaching your capability to external items (from vanilla or other mods), you may have to put the capability data directly in the ItemStack's compound tag.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

9 hours ago, Choonster said:

Item capabilities are hard to sync properly, as discussed here and in the referenced issues.

 

The best option at the moment may be overriding Item#getNBTShareTag to include the capability data required for display purposes. If you're attaching your capability to external items (from vanilla or other mods), you may have to put the capability data directly in the ItemStack's compound tag.

The confusing thing is that the data stored in my capability should never change - once it's initialised it just stores its birth time, and I don't see why it should be getting reset or lost somehow (especially why it's getting lost while connected to a server but not singleplayer - surely if data is mistakenly getting deleted or overwritten at a certain point it would happen regardless?).

 

If I add the capability data to getNBTShareTag, do I need to override something else to make sure it gets read correctly? I am only using internal items from my mod, so at least that simplifies it slightly.

Link to comment
Share on other sites

2 minutes ago, Jay Avery said:

If I add the capability data to getNBTShareTag, do I need to override something else to make sure it gets read correctly? I am only using internal items from my mod, so at least that simplifies it slightly.

 

Your client-side code will need to get its data from the ItemStack's compound tag instead of the capability instance.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

22 minutes ago, Jay Avery said:

I just remembered the reason I hadn't used stackTagCompound before is because the doc comments say it can only be used for non-stackable items - whereas mine are stackable. Is that going to cause problems if I try it?

 

I think the doc comment is outdated or just incorrect, ItemFireworkCharge and ItemMonsterPlacer are both stackable items that use NBT.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Hello. I'm using IntelliJ IDEA and making a mod for Forge 1.20.1 and I'm trying to make a GUI. I found that the Minecraft-related codes are all obfuscated and when setting up the workspace, Gradle did not execute Deobfuscation tasks like createMcpToSrg. Is this normal or a bug? Can anyone help me with this?
    • Hello! I'm trying to get a list of all entries registered in the infusion upgrade registry. Code can be found in github: https://github.com/ChamoisEST/MiningMadness/tree/1.20.1 Registry in common/registries/MMRegistries.java Event that calls the registry is in MiningMadness.java List of registered entries should be called in common/capabilities/infusion/InfusionCapabilityImplementation.java:getActiveInfusions() in the for loop. Is there any way to accomplish that? Thanks in advance!  
    • So, I am trying to create and add tags to my custom damage type, but looks like I made something wrong, since it crashing with error that "cannot register" damage type. Im trying to register it, and in datagen add tags, but it everytime crashing due to not register "grimtales:entropy". Full code there - https://github.com/undertakerJ/Grim-Tales-Forge ModDamageTypes class public class ModDamageTypes { public static final DeferredRegister<DamageType> DAMAGE_TYPES = DeferredRegister.create(Registries.DAMAGE_TYPE, GrimTales.MOD_ID); public static final ResourceKey<DamageType> ENTROPY_KEY = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(GrimTales.MOD_ID, "entropy")); public static final RegistryObject<DamageType> ENTROPY = DAMAGE_TYPES.register( "entropy", () -> new DamageType("entropy_effect", DamageScaling.ALWAYS, 1f, DamageEffects.HURT)); // // public static final DamageSource ENTROPY_SOURCE = new DamageSource(Holder.direct(ENTROPY.get())); public static void register(IEventBus eventBus) { DAMAGE_TYPES.register(eventBus); } } Datagen for damageTags public class ModDamageTagsProvider extends DamageTypeTagsProvider { public ModDamageTagsProvider( PackOutput p_270719_, CompletableFuture<HolderLookup.Provider> p_270256_, @Nullable ExistingFileHelper existingFileHelper) { super(p_270719_, p_270256_, GrimTales.MOD_ID, existingFileHelper); } @Override protected void addTags(HolderLookup.Provider pProvider) { this.tag(DamageTypeTags.BYPASSES_INVULNERABILITY).add(ModDamageTypes.ENTROPY_KEY); } } Datagen class it self   @Mod.EventBusSubscriber(modid = GrimTales.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) public class DataGenerators { @SubscribeEvent public static void gatherData(GatherDataEvent event){ DataGenerator generator = event.getGenerator(); PackOutput packOutput = generator.getPackOutput(); ExistingFileHelper helper = event.getExistingFileHelper(); CompletableFuture<HolderLookup.Provider> lookupProvider = event.getLookupProvider(); generator.addProvider(event.includeServer(), new ModDamageTagsProvider(packOutput, lookupProvider, helper)); } } And register class in main class public GrimTales() { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); ModDamageTypes.register(modEventBus); modEventBus.addListener(this::commonSetup); MinecraftForge.EVENT_BUS.register(this); modEventBus.addListener(this::addCreative); }  
    • Looking for a semi-vanilla Minecraft server? Maybe one with keep inventory and land claims? I have one for you! Let me introduce you to Safe Survival! Come on and join us at mc.safesurvival.net. It is bedrock supported too!
    • Hi. I'm trying to play RLCraft with Optifine but my game keeps crashing on startup with Exit Code 1. The modpack was working fine yesterday, not sure what changed to make it not wanna work anymore. I was hoping someone here could help me figure out what's going wrong. If I remove Optifine, nothing changes, I still get the same errors. Thanks in advance. Crash Report (I only included the errors+fatal, I’m not sure if more is needed, please let me know): https://pastebin.ai/66ivknz0f4  
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.