Not if you set everything up to be client/server performant.
“Pick up items” in the world should be small data simplified actors (mesh, interaction collision, identifier ID). You can use a data table to get the class of the real item.
On pickup you destroy the “simple” and spawn the “real item”…Gun, flashlight etc. Attach and hide, or equip to hand.
On drop you destroy the real item and spawn a simple in its place on the ground.
Servers load the entire map and ALL actors. Clients only load a small “relevant portion”. So thinking through this if all your actors in world are heavy…fully coded working guns, flashlights etc. Then the server will need a mega ton of memory. If they are simple actors (mesh, interaction collision, identifier ID), then that’s a lot less memory needed.
Same applies for a client and what it loads.
Also spawning and destroying items as you swap… wep 1 → wep 2 → wep 3 ->, back and forth, is a performance killer. Server has to spawn and attach, detach and destroy for the actions to be replicated. It’s multitudes more performant on both the client and server to simply hide/unhide and attach/detach.
You also gain responsiveness by maintaining the item actors. The client can now switch locally and let the server correct if need be. e.g. switch weapon → rpc server to switch
I’m working on a 100 player MMOFPS. My inventory (Actor Component) uses a “slot based” system for inventory management.
All 3 weapons the character can hold are attached to the body and visible at all times. If the item will be attached to the character I use an actor obj ref.
The weapon class has many structs to configure it. Here’s one for example.
I have others for recoil, sway, deviation, gravity curves, animations, IK offsets…AMMO (type, max mag, current mag etc)
When a weapon is equipped to use I set the current weapon var. This is then used to call events, pull data as far as ammo, firing mode etc.