Firstly i’d like to say thanks to Pirate for creating this system and the question im asking below is to ask for help in what we might have done wrong rather than something not working as it should in the inventory system . I should mention now that we have compared function by function, macro by macro, event by event between our current development version of the inventory system and a clean project version of the inventory system and they are both the same. I’m making this point for 2 reasons, first that there isnt anything wrong with this system…its brilliant in fact…secondly to highlight that we haven’t touched the core functionality of the system. This bug has us stumped at the moment.
okay…now the odd problem…
We created our crafting system with all new functions so as not to alter the core RPG system as it handles everything we needed. We just noticed however that when moving items between inventory and containers something goes pear shaped . i will try and lay it out so it’s easy to understand as its an odd one.
2 clients
Client 1 → adds item to container while Client 2 viewing - Everything works as it should, the item gets removed from Client 1 inventory and added to the container and also replicates to Client 2…so all good there
Client 1 → adds item to container while Client 2 viewing, then (Client 1) closes the container and re-opens it (Client 2 STILL has the container open) - Both clients still show the item as being in the container… so all good there
the problem
Client 1 -> adds item to container while Client 2 viewing (still hasnt closed its view), then (Client 1) closes the container and re-opens it then moves the item out into his inventory - result - item appears in inventory however the Icon for the item is still showing in the container. This cant be a valid item as when hovering over it the tooltip doesnt display either. Through all this the server knows exactly where the item is/should be.
It appears that the problem is either when closing or opening the container that the reference to the container is lost or that something odd is happening in the playerstate.
TLDR
when a container is opened,closed and re-opened it appears to lose sync on the clients to the server. client to server is fine as server knows the correct information all the time its just the replication / updating of each of the clients as the clients go out of sync.
The video will explain it far far better than i can here.
Just to be safe I double checked this on the ARPGIS in 4.12 to make sure it wasn’t a bug with 4.12 and everything worked as expected.
After reading what you wrote and watching the video you are correct in that the server is updated properly and is moving the item into the right place and it’s seems to be just the clients container window getting out of sync after reopening the container. Not sure what you have changed in your own project but I can point you to the places where this logic happens and with a few print strings and breakpoint debugging it should hopefully be a simple fix.
If you look in the InventoryManagerComponent on the Event Graph there is a Green Comment Box called Client: Container UI Events
Each of these events calls a similar named function to run as the client. Sometimes these functions are ran in other functions that are already running on the client and by pass these initial event calls. (Note: there is also a type and the Red Comment Box is also labeled as the Client: Container Events and should read Server: Container Events. I will fix this typo in the next version)
Client: Container UI Events Client_OpenContainer is triggered by the server when the client has “used” a container and when the server has validated the action it triggers this event on the client which called the LoadContainerSlots() function.
This function removes all the slots on the “hidden” container UI window and then recreates the slots based on the number of loot items or if it’s a container the container size. After it recreates the Container Slots it loads the ItemUI data that was sent from the server in the LocalItemInformation struct array and loops through each Item calling the **SetContainerSlotItem() **function to set the item to the Container Slot.
I would create a print string during the loop and output the array index and item number and see if this changes between when it works the first time and when the player opens the container again. Make sure the server isn’t sending different ItemInformation Struct Array data the 2nd time. (If you put a print string in the SetContainerSlotItem(); and Clear ContainerSlotItem(); you will get debug feedback when you move the item around as well) I have no idea why that would happen but there are a lot of struct bugs with unreal and sometimes deleting the struct variables and adding them back in helps fix things so try that if this is the issue .
Client_CloseContainer
This simply hides the Container Window and clears and ToolTips if you were hovering at the time. I don’t see it being the cause.
Client_SetContainerSlotItem
This event is what is triggered when the server wants to tell a client what slot the UIInventoryItem (Icon/client data for tooltip) should be placed in.
Client_ClearContainerSlotItem
This event is what is triggered when the server wants to tell a client what slot the UIInventoryItem (Icon/client data for tooltip) should be placed in.
Let me know if the server is or isn’t sending the exact same data to the client when he opens it the 2nd time and has issues.
This will let us know if it’s a Server issue or if something with the UI is causing the bug when reopening the container window.
It may also be better to send me an email at support@vanguardinteractive.com as it’s easier for me to help you work through issues in your own project this way as often I am out and about and I can get alerts and reply on my phone faster
Using the SpawnActorFromClass node, I can spawn an item in the game world, but I cannot interact (E - pickup) with it.
I perused the example of DropItem and have set the class to WorldActor and the ID to the Item ID. For testing purposes I used various included items such as the Food_Hambone.
What step am I missing here?
Is it necessary to make a call to the server? I am not taking the item from inventory but rather creating a new item in the world.
I’ve made some great progress on my side with all the support you guys have provided previously ! One thing I’m encountering at the moment, is when I set player characters to be usable, and add the usable actor interface, for some reason I’m not able to see any of their items when the container window to their inventory opens. The window appears, but there’s however no items in it.
Doing a print string on ‘Get Inventory Item Count’ from my PlayerInventoryComponent in the interface ’ GetContainerProperties’ also happens to return 0, even though players have items both equipped and in their inventory.
Maybe a cast is failing on the use of the WorldActor. I would suggest putting in some print strings and breakpoints to make sure things are firing correctly in your project. Only other thing I can think of is maybe the raycast isn’t working, but it should be if it’s showing the Interact text but that happens client side. When you press E the Server does the same raycast and then calls the use fuction of the bp interactable interface.
hrmm, that looks odd. My first thoughts are that it’s calling it client side so it’s not properly showing the items as they exist on the servers inventory of the character.
I would double check your code against the NPC examples in the ARPG Inventory System as they achieve the same behavior as you are trying to add.
That was it. I failed to make a call to the parent Event Tick function with an Event Tick that I had added for another feature in my player controller child class. Back on track now.
Upgraded to 4.12.5 but Still having trouble with adding new variables to InventoryItems and Tooltipitems structs…
if I add a new variable such as “price” to the struct and then compile and run… it works great… but if I try to package the game… then I get these errors.
I fixed it previously by setting Inventory variable to a bool(or anything else) and then switching it back to inventoryitems struct and relinking all the nodes
but obviously that is a lot of work to do each time I want to add a new var…expecially since I have to do it all over again for the “tooltipinfo” struct also
Someone mentioned simply “recompiling all the functions” that use those structs… but that doesn’t seem to be working for me (unless I am doing it wrong)
I am doing a search for “InventoryItems” struct variable and then re-compiling each Blueprint that has that variable in it (even though it already has a Green checkmark as if it’s already compliled - so not sure if that’s actually re-compiling the function)
i am almost ready with customizing Pirate’s Inventory System to my needs. I really appreciate his great support and this system saves me at least several months of time for learning and making such a reliable system on my own.
However, i still have some minor issues i couldn’t solve.
How can you prevent dragging the inventory/equipment windows off screen?
I have some backpacks in my game. If i pick one up i increase the inventory slots and on drop i decrease it again and it all works fine. But, if i move the inventory window the slots are not getting updated. The number of the slots is correct. But the displayed slots are not getting updated.
Thats actually a engine bug that got introduced in 4.11 the bug report can be found here, the only option for now is to disable the drag on the container window or do what i did when i remade my inventory was to create a UI which didn’t need to be dragged.
This is what i have done with my inventory system this isn’t draggable, its based on the ARPG Inventory’s logic and as a learning experience i recreated the whole inventory on a clean project on 4.12 to understand every element of the system and also to keep it as clean as possible and focused on a survival game inventory system, still in the process of working on the crafting UI.
@OverRated_AU: Wow, thats really nice work you did there with your Iventory! And thank you for straighten things up with the Drag Issue^^ So i just have to disable the Drag Function and adjust my inventory design.
Thanks, Yeah just bypass the widget drag for the container until the bugs fixed my guess it wont be fixed any time soon as its not a high priority issue.
To stop the dragging windows off screen you need to override OnDragCancelled inside the widget and add the following nodes.
My game is based on the controller switching out characters. I have been playing with your inventory system trying to have the UI display the inventory based on who is currently possessed. My initial attempt was to add a few muppets around with cam components. Then I would just keep the InventoryManager component on the player controller.
However this is not working well. I can bounce between the characters and the inventory and equipment updates correctly in the UI, but the gold and inventory size do not. I see this is because gold and inventory size are stored in the InventoryManager component. Is that the intended location for this? It seems more appropriate that they should be tied a specific inventory. If this is intended, should I be adding an InventoryManager to each possessable character instead of the single one in my PC? Just want to understand thought process and open to suggestions.
Working on a save system for all clients…(each client saves locally using a MySaveGame type variable)
Everything seems to save/load correctly for each client (level, gold, skills, etc.) … except the inventory (it seems to only load the Server’s Inventory)
All I am doing is creating a “SaveInv” variable of type “InventoryItem” in my SaveGame blueprint
and then setting SaveInv = PlayerInventoryComponent>Inventory
But it seems to only be loading the Server/Host Inventory
EDIT: I think its saving correctly but for some reason when I load… its loading the Server’s Inventory (instead of client’s)
Is this a good way to load a previously saved inventory? (please see below)