Jump to content

Recommended Posts

Posted

I have a very strange issue with capabilities losing their state on client side when connected to dedicated server. They basically default to the default value that's set when they are initialized for the given ItemStack. However what's even more strange is the fact that if I put breakpoint in to check for the default value and it stops there when I try to retrieve the capabilities again (ItemStack.capabilities) they have the correct state (not the default one that it just evaluated to in breakpoint)

 

I was trying to debug the issue and stopped when I was in EntityPlayer onUpdate (looking at itemstack.capabilities):

       
if (!ItemStack.areItemStacksEqual(this.itemStackMainHand, itemstack))
        {
            if (!ItemStack.areItemsEqualIgnoreDurability(this.itemStackMainHand, itemstack))
            {
                this.resetCooldown();
            }

            this.itemStackMainHand = itemstack == null ? null : itemstack.copy();
        }

 

It's always the same - breakpoint set to stop on default value which it does and even if I have watches set to show me the capabilities value they would show the default, but the moment I start editing them and just hit enter they would show the correct state.

 

It almost seems as if there was some async call happening which wouldn't be done when the caps are queried by breakpoint, but is done immediately after. But I don't believe there is anything like that in there.

 

Any thoughts on what could be causing this?

 

The primary issue that I have with this is that I use the caps to store charge of staff of flight (Rending Gale) and thus it needs to understand client side if there is a charge and player can still fly. However as it stands it breaks mid air quite a bit.

The same code doesn't seem to have any issues in 1.9 so I suspect some 1.9.4 change.

Posted

So I have figured out what's going on here.

 

Basically it relates to packets and a recent forge change. When I start using the flight stuff capabilities get modified and because there was a change to forge which made capabilities part of ItemStack.areItemStackTagsEqual comparison it figures out that stacks are different. https://github.com/MinecraftForge/MinecraftForge/commit/9df1e4b11e0d2d0fbf938cedae2da130d40cca89

 

Which then triggers SPacketSetSlot to be sent to client, which would be ok if this actually included capabilities. However that is not the case and it only syncs stackTagCompound. Which means that deserialized itemstack on client gets capabilities set to default value.

 

I have my own packet that syncs the capability I need, however packets based on what I have seen seem to be treated async, which means that I am not guaranteed that the capability value gets synced before client starts using it. Thus client a lot of the times suddenly sees 0 in the Staff's charge and stops flying.

 

Now the question is what should be the solution here.

Should forge make a change and sync capabilities in SetStackInSlot given that it uses capability value to see if the packet needs to be sent?

Or should it start ignoring capability comparison in this case again to avoid sending slots that delete capability data on client?

 

Or is the solution really for my case to save capability data on player to avoid this issue? That would seem like an awkward one to me, but at the moment seems like the only solution on the mod side apart from reverting to looking at just charge at the start minus ItemUseDuration and approximating how much charge is still remaining.

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

    • I haven't tested it but under https://minecraft.wiki/w/Items_model_definition it says now:   So I guess the resource location must have changed with 1.24.4, which means you need to move your models/item/ to the new source. But as I said I haven't tested this so it also may be that this wont work. Nevertheless give it a try      EDIT (important) So now I tested it and found out how it works   Let the model files (e.g. the .json from blockbench) within "assets/<your_mod_id>/models/item" In addition to that do the following: Every model you added will need a new file under "assets/<your_mod_id>/items" That file is also a JSON and looks like this: { "model": { "type": "minecraft:model", "model": "your_mod_id:item/custom_item" } } - "type" can be minecraft:model, minecraft:composite, minecraft:condition, minecraft:select, minecraft:range_dispatch, minecraft:empty, minecraft:bundle/selected_item or minecraft:special. (In most cases you would need minecraft:model) - "model" is the path to your actual model for this item. For example the value above would point to "assets/your_mod_id/models/item/custom_item"
    • On version 1.20.1 there is a build with the AE2 mod, and when opening the reference book for this mod inside Minecraft, it just freezes and closes
    • public ExampleMod(FMLJavaModLoadingContext context) { var modEventBus = context.getModEventBus(); } Refer to the javadocs and MDK for more pointers and examples.
    • Does it work without Cobblemon GTS?
    • I recently updated my mod from 1.21 to 1.21.4. Didn't change anything on the data generation code (even though methods are now marked as deprecated) and had to change the block and item registration to explicitly add the id to avoid the "null pointer exception no id supplied" error The problem is that the block models work fine, as they did before, textures and all, but not the item ones. Is it because of this registration change? Did something in the datapack structure change on minecraft itself?   Here is one of the registration lines im using as reference:   RegistryObject<Item> CUSTOMITEM = ITEMS.register("item", () -> new RawMaterial(new Item.Properties().useItemDescriptionPrefix().setId(ResourceKey.create(Registries.ITEM, ResourceLocation.fromNamespaceAndPath(MOD_ID, "item"))))));   and same for blocks:   private static <T extends Block> RegistryObject<Item> registerBlockItem(String name, RegistryObject<T> block) {     //T is the block type. It will register the block and the block item.     return ModItems.ITEMS.register(name, () -> new BlockItem(block.get(), new Item.Properties().useBlockDescriptionPrefix().setId(ResourceKey.create(Registries.ITEM, ResourceLocation.fromNamespaceAndPath(MOD_ID, name))))); } RegistryObject<Block> CUSTOMORE = registerBlock("ore", () -> new CustomOre(Block.Properties.ofFullCopy(Blocks.STONE).setId(ResourceKey.create(Registries.BLOCK, ResourceLocation.fromNamespaceAndPath(MOD_ID,"ore"))))));   Note that this made the translation keys i had pre 1.21.4 correctly show the translatable component, so im guessing that is okay, but just in case.  
  • Topics

×
×
  • Create New...

Important Information

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