#multiplayer
1 messages · Page 244 of 1
So, there is one thing that might not be so clear when dealing with this stuff, due to how the CMC does it.
When dealing with prediction and reconciliation, you usually always want to do the same stuff, not matter what property changed.
If you take the NPP and Mover as an example, no matter which property causes the Rollback there, it will override the local data with the Auth Data and then re simulated all the saved moves.
The only difference is that NPP is more set up for "any data" and CMC is very specific on its Location.
The Location itself is being applied in the Super call you commented out. And then it wants to replay the SavedMoves. It has to, otherwise it will teleport the Client back.
I think the problem here is that you want to partially accept auth state.
This is usually one and the same thing.
- Accept full Auth State
- Re-run the Simulation that is still predicted
I can't fully recall what the problem was you tried to solve. You want to only accept the Stamina?
@grand kestrel
I want to accept everything including Stamina, except specifically not the location
This here I think?
Yep
I think what you want to do is actually quite simple.
You should not disable the Resimulation.
Your problem is that the Server sends back its Location either way, and applies it.
But you want it to be Client Auth at that point.
So you should override the ClientAdjustPosition_Implementation and instead of setting the Location to the current Location of the Client, you need to set it to the one the Client had during that Timestamp.
Then it would replay the moves but based on the same location it was already using
Which should just result in the same
you need to set it to the one the Client had during that Timestamp.
Hmm where do I get that tho
Ah found it
Reposting this
Can anyone confirm if a FNetworkGUID, specifically the FNetworkGUID.ObjectID, is the same for a given replicated object on every client? Since FNetworkGUID can't be a UProperty I'd like to pass around the ObjectID int64 knowing it will refer to the corresponding UObject.
I assume it’s the same; but wanted to get some confirmation
void UPredMovement::ClientAdjustPosition_Implementation(...)
{
/// Will apply Server Location and Ack Move etc.
Super::ClientAdjustPosition_Implementation(...);
FNetworkPredictionData_Client_Character* ClientData = GetPredictionData_Client_Character();
check(ClientData);
UpdatedComponent->SetWorldLocationAndRotation(ClientData->LastAckedMove->SavedLocation, ClientData->LastAckedMove->SavedRotation, false, nullptr, ETeleportType::TeleportPhysics);
}
Something like this maybe @grand kestrel
Puuuh, could be that it maps to a different ID on each Client.
Not entirely sure. The PackageMap is what holds that iirc.
Yeah it'll likely be different on every client
Yeah… I’m desperate to find some way to uniquely identify each object.
PackageMapClient to be more precise
Whatcha trying to do
There are sub-objects that need to be manually synced by an external actor. This external actor has pointers to the sub-objects. Put simply, I just need some kind of replicable “ID” for each actor
It’s for a custom physics solution
Hm. Given the NetGuid is what is sent when sending some replicated Actor/Object, I assume there is a way to communicate that between Server and Clients, even if the ID is not the same across all.
Just probably nothing that can go Client <-> Client
This yoinks it backwards which is certainly a different result
Wrong order though
Yeah that’s no problem. Only server-client communication is needed
Ah my code did produce a different result, woops, this is with yours
Puh, I will need to think about that tomorrow a bit. Can you leave me a DM once more explaining what you are trying to accomplish.
I kinda lost it halfway through, even with the old messages.
Yeah I'll try 😄
Cheers
Through some testing, I think I’ve confirmed that FNetworkGUID.ObjectId are the same on server and client. This will make it easier to work with actors across the network
err, why though? The pointer to the object is itself translated to a consistent identifier.
or FObjectKey/TObjectKey if you want to be safe about it.
you should rarely if ever need to interact with a netguid directly - the engine already translates pointers to the object across the network.
That’s interesting… my attempts at sending AActor*s over RPCs seemed to give invalid pointers
then those actors aren't replicated
or they hadn't been replicated by the time the RPC was sent
or you sent the pointer in some other representation (like a uint64) which the engine can't translate for you because it doesn't know it's a pointer to an actor.
^
i would be very interested in what situation a objectid would be valid on client and server but the actor isnt replicated yet...
I can’t think of a scenario where it would be.
This simplifies my codebase significantly, thank you lmao. Can’t believe I missed something that fundamental
How does the gamemode work in a replay playback? I'm having an issue likely caused by the gamemode, I think the default gamemode that's needed to initialize the game isn't being used in the replay
It doesn't is the short answer, just like a client
Wasn't there this string / var that you could check during debug to recognize if you are debugging client or server? Can't seem to find it now, slowly I'm starting to believe I'm was jsut imagining things 😱
Be aware that if you're not breaking in the game thread (or a thread that's in lockstep with it), it is not accurate 
RIP spammer
Any reason why FFastArraySerializer::OwningObject is not being tagged as UPROPERTY(Transient)? My program crashes under MarkArrayDirty() and then under IncrementArrayReplicationKey() because OwningObject is not nullptr but has been garbage collected.
I use voip voice chat, but if I don't put the microphone in my mouth, my voice doesn't sound right. treshold 0
and I think something is wrong with the replication. in our tests on different computers, sometimes the doors cannot be opened by the clients, but if I come as a server and interact with the door, the client can also open it. this problem rarely happens, but I want to know how to solve it.
it does not have uproperty because it is guarded with preprocessor define other than WITH_EDITORONLY_DATA
that is quite concerting that owner of container is being gc'd.
but you can technically locally override GetReferencedObjects in type that has FFastArraySerializer member to expose it for gc
It's for PushModel only, you're not really supposed to access it directly. Classic awful encapsulation decisions from Epic
Just create your own property IMO
If I want to attach a player pawn to another moving player pawn (a turret and a ship, respectively), what would be the best way to keep the camera from the turret stable when the ship is moving and the turret is rotating? I don't care about cheating or server check as long as it matches roughly what's happening.
Making the turret follow the ship position result in the ship jittering, but I'm not sure at this point if its a camera tick problem or a network problem 😦
I'm writing a c++ pawn. It has bReplicates set to true, *GetController()->GetName() returns a valid controller name, but client->server RPCs are being dropped. Strangely, even though the pawn is spawned on start, GetOwner() returns a nullptr until I set it manually to the player controller. If I could get a second pair of eyes on this that would be amazing https://pastebin.com/3vkXQrxP
Just guessing here but usually ownership is set on possession, idk who does it though. I'd probably add a parent call to PossessedBy
honestly having a bIsPossessed is redundant, you can just check Controller
why have 2 bit of information when 1 bit do trick
especially if they disagree, then which is true?
True true
What bothers me is that the owner is apparently null on spawn, and the pawn can’t even call rpcs on itself
that's probably correctish
what are you actually trying to do that requires an RPC right off the bat
BeginPlay is generally too early for any of this.
I’m waiting a few seconds and calling the rpc via button press
just add parent calls for those APawn methods you're overriding
you're skipping a bunch of boilerplate
If you spawn the Replicated Pawn and Posses it on the Server, then waiting a few seconds an calling a ServerRPC via Button Press should work just fine.
Also, are you using the old Input System? Or are you still on UE4?
Old input system, UE5; the inputs come in just fine
he's overriding possession stuff without parent calls.
@mild sonnetYou're bypassing all this stuff, that's why you don't have ownership etc
https://github.com/EpicGames/UnrealEngine/blob/2d53fcab0066b1f16dd956b227720841cad0f6f7/Engine/Source/Runtime/Engine/Private/Pawn.cpp#L643
just call Super::PossessedBy and the others after your code
Wow, that worked. Thanks a bunch
Hm hm. Still absolutely deprecated :P
If you're overriding stuff from parent framework classes, make sure to check that they aren't doing a bunch of work that you need.
True, will change it when I have time haha. I may be wrong/inexperienced but legacy inputs seem simpler and more manageable to me
Possible, not gonna argue about them being simpler. Just be wary of them being fully removed eventually.
Hello, I'm using the online subsystem for STEAM right now but everytime I create a session, nobody can't seem to join it. Is there detailed tutorial on how networking works? I'm following this tutorial right now https://www.youtube.com/watch?v=_U0BK0olC-I&list=PLNb7FZ2Nw2HTBgWggHGaMtHAOygKcXIyW&index=8
👨🏫 My Patreon link:
https://www.patreon.com/kekdot
Download Project Files | Premium Tutorials | Courses
🕹️ Get our Game on Steam | The Anomaly Project:
https://store.steampowered.com/app/2960770/The_Anomaly_Project/
In this tutorial we implement/setup Steam for our game. We take a look at the Steam Advanced Sessions plugin and set it up f...
I can create a session and host and stuff but it's just not stable for some reason
Can they see the session?
yes
And when joining it simply fails?
You'd need to check the log files of server and client then.
Potentially enable more logging to figure out why
oh that's a great idea! Where can we find log files for server and client? I know there are crash logs and fatal errors
Assuming you aren't packing for Shipping, they should be in the folder of the project (the packaged one) under Saved/Logs
got it thanks
would it be okay if I shared the log file on here?
I'm having some trouble understanding it
Yeah you can share it here. Just make sure you don't have any sensible data in it that you don't want to share
I am a bit perplexed by an Unreal error.
LogNet: Error: UEngine::BroadcastNetworkFailure: FailureType = OutdatedClient, ErrorString = The match you are trying to join is running an incompatible version of the game. Please try upgrading your game version., Driver = PendingNetDriver IpNetDriver_8```
I totally understand the idea of 'server and client aren't same version', but I literally just built both with the Project Launcher
For further context: I'm using PlayFab's Local Multiplayer Agent which starts up a .zip version of the server (which I did re-zip after building) and joining via ip-127.0.0.1 (which I've been doing for a while now)
I feel like there must be some common gotcha or my development somehow caused it to not recognize as compatible?
Like is there possibly some cacheing behavior going on here?
Hypothesis: I had a headless server running in the background and it was trying to connect to that over the new builds.
**Solved:** Rebooted and that resolved it
(Nonsarcastic) Thanks for the help. Explaining the problem led me to find the solution.
has anyone tried using level instancing (load level instance) in multiplayer?
I plan to have the server load all the sub levels, but the client will stream based on distance
Are there anyway to create A C++ class inherited from GASP character? I implemented GAS to my project to create multiplayer attributes etc. But I was using GASP character as blueprint. I also need C++ Character class, but IDK what to do in that case. Or for example, using TPS character as C++. This is an existing project that started from TPS template.
I'm not familiar with GASP (also, hate that people try to acronymize everything) but of course there is. GAS itself has no relation on something being a specific class. So just inherit from the GASP character.
If your GASP character is in BP, then make it in C++.
You can only inherit in this direction C++ -> C++ -> C++ -> BP -> BP -> BP
If GASP Character is a C++ class, you can inherit from it in C++, or via BPs.
If it's a BP class, then you can only inherit via BPs.
If the GASP Character is a BP Class, then you could make that inherit from your own C++ class, in case that helps.
I think GASP is BP class, in the project itself. Yeah, I might try this, What if GASP is BP, but inheriting from C++ class by his version of it? Like GaspCharacter.h? Can we edit it and inherit from it? Isnt it IL code or smth? which is immutable?
If GASP has C++ code and they are shipping it without the Source code, then you can't edit it.
Alright, I will check it out ❤️ Thanks for information. I think i will go pure C++ way for my character, and implement everything on my own, which means i will have more control over as first place. Like animations etc.
Just to ensure you don't mean "No BPs at all" with "pure C++". You should utilize both in theory.
Yeah, I meant using C++ as base classes for game framework, thank for reminding me ❤️
I successfully changed CBP_SandboxCharacter's parent to my c++ class.
I use voip voice chat, but if I don't put the microphone in my mouth, my voice doesn't sound right. treshold 0
and I think something is wrong with the replication. in our tests on different computers, sometimes the doors cannot be opened by the clients, but if I come as a server and interact with the door, the client can also open it. this problem rarely happens, but I want to know how to solve it.
Hi uhm, im having trouble with changing the emmessive material to switch on/off like a flashlight. Somehow i cant figure out for hours what the problem is, any tips or suggestions?
i thought its like a flashlight replication, but idk sometimes my brain says its the material to change and not the sphere
One thing I would suggest is to not have 2 Variables describing the same state.
You shouldn't have bLightOn and bLightOff.
bLightOn is already covering both states by being either True (On) or False (Off).
And then you are left with just one OnRep function in which you can BRANCH on bLightOn to set the Material and print your little debug string.
Don't use multicast for stateful behaviour.
hi having some noob troubles with generating railtracks, i am not sure how to replicate spline points being added
the client gets the data and i did a repnotify for each spline point
but the client cant create the points so im not sure how to replicate the tracks being created
(the values are fine just not sure how to add spline points)
i found the issue nvm :D
wasnt updating the spline correctly
what about bLightOff? set material too?
you can have one replicated bool variable
if its true that means its on, if its false then its off
so wait my brain is thinking
normally the sphere has a material called LightOff, so bascially at lightoff i dont have to setup anything?
well, if the light is off by default then set that material
then when the variable is set to true or false, handle that in OnRep
and thats it i think
nvm
lightOn Material is there but LightOff not
so i have to add it
what should i use ( on the clients )
OnRep
the method will be called if the variable value is changed by the server
from there you can handle logic for both server and clients
like that ?
but keep in mind OnRep won't be automatically called in C++
you can have one method
Server_ToggleLight
with no params
and get "Flashlight" variable then "Not"
so that if its true, the returned value is false, and vice versa
so OnServer is nothing to change i guess
so onRep i have to work with it
delete the OnClient above and others
server-side you'll have to change the value of the variable, so that it gets replicated on clients
once the value is replicated, the OnRep will be called
OnRep_YourVarName

no need to be rude to beginners
remove these
on server set the var to whatevr you want
if its different, the OnRep function will be called on server AND clients
aha koay
show me the logic in
OnRep_flashlight
How am I being rude?
.
Relax, it was just an emoji.. not an insult. If you can’t handle a simple facepalm, maybe the internet isn’t for you
you can drag from the material pin and write "Select"
want me to rename it to LightOn?
Whatever’s convenient for you, LightOn works if it makes things clearer
a or b
a
in the future replace the flip flop node with a branch reading the flashlight var.
flip flop are rarely useful outside prototyping
hm okaay
if flash light on -> set it off
if flash light off -> set it on
there is no need for the branch, they can just call the RPC and the server will set the !bLightOn value
you got your toggle back
also that
you arent changing it
idk what you want, but if you want to change the mat depending on the flash light bool var, use a select node
Multiplayer is too early for you if you are new to blueprint.
doki
material pin
this is the pin
ah lol
put the boolean there
okay
it will change to False, true
the repnotify variable?
I'm trying to do character selection, in front end. What's the best place to store those variables in regard to persistence? The PlayerState persists seeless travel (or rather get's copied to the new one) as far as i know. But can i count on the travel from UI map to playable map be seemless?
I'm having an issue where the host's music seems to loop over and start again once another player joins or when the music is changed so it is essentially playing twice at different points. I'm using an audio manager just to handle the functions for setting and playing sounds but it is passed an audio component from the player pawn bp.
Sounds like you need to move it somewhere more player centric like their Controller, or HUD. AHUD would be better since music is local only kind of like UI.
I had tried moving all the audio playing logic to the player controller but still got the doubled audio. I hadn't considered putting it in the hud I will have to give that a shot
Showing the code would be a start.
Moving it to the player hud has solved the doubling audio. I was wondering about having different music playing for players, when a player enters a district it would play that districts music for that player.
The overlap will happend in every machine when it happens. So if player 3 enter the region, all other players will also execute the overlap.
Imo what you have shouldn't work either.
What you can do if you want to play the music only for the player that overlap it.
You can get the actor that overlap it. Check if it's the player character, if it is then check if it's locally controlled. If true then play the music
So in the District BP off of its ActorBeginOverlap cast it to the player bp, check if locally controlled, then call the HUD to change its music?
Thst should work though I'm not sure what music got to do with HUD
I would probably make a component for this
Actor component*
Someone else had suggested handling the audio in the HUD since its local only
an Actor Component in the District BP?
You dont even need communicate any of this. Just check if the actor overlapping is the actor you are possessing.
And that's done with OnOverlap-> get actor -> is locally controlled.
Saying hud is local in this context doesn't make much sense. Everything is local.
The overlap happend locally too
Everyone running their own instance
The component exist on every single machine.
It triggers when it triggers for that instance.
You will use rpc to communicate between machines but for playing music, why do you need to tell anyone that hey I am in this region?
Simply overlap, is the overlapping character the character i am possessing? If yes then play music
okay that makes sense
thank you for your help, getting use to networking and what to rpc and what not to rpc has definitely been challenging
anyone know where i can find the documention for the advanced steam sessions i have been looking and i cant find it. i want to look over it instead of watching people just show you how to do it
Hello, I am working on a multiplayer FPS game and I have the weapon as a separate actor and am trying to make it so only the player can see the arms and weapons but I cant figure out how to set the owner to the player. I am using the actor with an child actor component attached to the camera. Can anyone tell me what I am doing wrong?
Is there a properer way of handling the initial travel to server and the map change that comes with it? I'm currently gathering the players in a lobby for the waiting for players state which is just a different UI on the same level, so the standalone and networked levels are the same. Although it's like a fraction of a second it still is understandable as the animations and particles on the background reset, I'd ideally not have the visible discontinuity on the scene.
I feel like beacons could be the way but I would still need to travel at some point when game is about to start and server travelling while having everyone connected feels more secure than travelling with server only and having a second waiting for players state as well as needing to return the lobby back to main menu if an expected player have issues with initial travel or something. Is this an empty concern from my end?
Replay and server/authority
I would not use the ChildActorComponent. You are better off just spawning the Weapon Actor by hand and attaching it.
Just override the Possessed Event in your Pawn/Character, which should be Server-only, and spawn the replicated Weapon Actor and attach it to the Component that your ChildActorComponent was attached to before. Then you can pass in the Controller as the Owner on the Spawn Node. (don't use GetPlayerController0!).
Pretty sure the OwnerOnlySee stuff on Components only works for the Actor that is the current ViewTarget. Which means your Pawn/Character.
So you can only really set this on the Arms Mesh Component. Not sure if it hides attached Components/Actors too, but that would be my first test.
Hi, should I replicate SkeletonMeshComponent using RepNotify? as I have to spawn the SkeletonMeshComponent on server and then replicate to individual client, or is there a better way to do this?
Hello! I'm working on an AI that basically just "grabs" the player, moves to a location, and then drops the player. The issue is that, after grabbing the player, the AI keeps having a jittery movement on the client side, while on server works fine.
The set up is:
- The client that gets grabbed it gets granted and activated an ability by the grabber (so run on server since it's AI)
- This ability disables collisions of the owner, sets the owner's movement mode to None, disables the tick on the CharacterMovementComponent of the owner, and finally attaches the owner (the grabbed) to the instigator (the grabbing)
The ability gets executed by the client. Am I missing something? I got one improvement by setting the Network Smoothing Mode to Linear instead of Exponential but still didn't solve the issue
If you spawn it as a replicated component it will naturally replicate (assuming the actor also replicates). However, I'm fairly sure that none of the actual properties of a skeletal mesh component are themselves replicated, so it won't have a mesh or anything.
Yep okay, I will store the meshes and after component is replicated to client, I will set the meshes again
would it be sane to disable correction entirely on Autonomous actor and instead correct by smoothing out the transform?
I want to not apply correction when the delta is too small. Looking at the settings though, smoothing seems to only be for Proxies not autonomous character.
When an A.I comes charging at me and the client pushed it self toward the target, there's always a mini correction. Which isn't noticeable but it stops my montage from playing 😦 because the client being corrected regardless.
to be exact it stops PlayMontageAndWait from GAS.
my test seems to point that it must be the NetCorrection that caused the animation to stop midway. When disabling correction, there will not be an instance where the anim get stopped mid way.
You don't smooth autonomous characters because you are typically moving them ahead of the Server, they are predicting, so inherently "smoothed".
It's virtually impossibly to avoid corrections when two players come into contact with each other because they are in different temporal regions. Local character is ahead of server by ping / 2, everything not being predicted is behind the server by ping / 2.
from what I understand correction only happened if the difference is significant right? I mean there's always a rounding error. If that's the case, where can I edit the threshold?
AGameNetworkManager has the tolerances IIRC
It's extremely small, like 3cm, maybe not even that
But larger tolerances will mean more divergence
will check it out, thanks!
/** MAXPOSITIONERRORSQUARED is the square of the max position error that is accepted (not corrected) in net play */
UPROPERTY(GlobalConfig)
float MAXPOSITIONERRORSQUARED;
/** MAXNEARZEROVELOCITYSQUARED is the square of the max velocity that is considered zero (not corrected) in net play */
UPROPERTY(GlobalConfig)
float MAXNEARZEROVELOCITYSQUARED;
Just gotta find where the config is
I guess this goes on DefaultEditor and DefaultGame?
nvm I see it in BaseGame.ini. Wonder if that effect both editor and packaged or not though.
I use voip voice chat, but if I don't put the microphone in my mouth, my voice doesn't sound right. treshold 0
and I think something is wrong with the replication. in our tests on different computers, sometimes the doors cannot be opened by the clients, but if I come as a server and interact with the door, the client can also open it. this problem rarely happens, but I want to know how to solve it.
Do i need to replicate procedural animations? Because right now the animations only apply on the clients screen to that clients character only.
You don't replicate any animations
Animations are a representation of the game
Which is already replicated
Non scientific answer ? 😛
Hello, I have a question about if I attach an actor to character can I make the actors rotation seperate from character? I tried to change rotation method on attach function but didnt effected. What can I do different for it? I want this because I m using set actor rotation to turn character, not using relative or world because project is listen server and I couldnt make them work well so If u have a solution for rotation method too it can be another solve. extra: rotation system just rotates character to mouse point in 3d
hi all im struggling with how to replicate a widget component i have a radar dish
it only runs on server and idk how to as widgets are client specific
widgets cant replicate so calculate everything on server and keep what u need for variables in server -example object location or eg- and send them to clients with an solver and rewriter widgets Event for all clients @rare wharf
that what i was thinking to do ima try calculate all thing snad call it from the radar itself rather than widget
ok so what u wanted to ask then 🤔
i just htought of it after i sent it and wasnt sure if it was the right solution cuz im a noob
worked thank you
@karmic trellis xoxo
what does this do? AGameNetworkManager?
Late reply but I unchecked lots of things Always Relevant to off -mainly chars bAlwaysRelevant false rn- and now network traffic looks better thanx but still the 80ms problem didnt changed.
new profiler result is on attach. I think all looks good but what can be the really problem.. I dont have any extra high value replications and everything I designed simple -I think-, but still movements takes the highest heaviness 🤔
What was the issue again? That the players have 80ms ping?
How is your framerate usually looking like?
sadly yes and I cant understand why, I asked this to AI and it said check CPU using but project already in higher fps so I think it shouldnt be problem but I dont have any other option left too now checking it 😕 😕 😕
server is 80 90 fps around
and clients higher normally
What's with the player thath as the higher ping?
Was this hosted somewhere and a player from a different location connected, or is this on the same PC or LAN?
on the profiler it looks like replicated movement, relative rotation and relative movement but they re already the unreal engines default things
steam connected test with different internets
I have 2 pc with me rn and testing with them
not lan
You could try hosting an empty level that just has a widget with a text showing the ping.
And see if connecting to that shows something else.
empty level -> fresh/empty gamemode -> no character etc.
Basically as bare bones as possible.
If that's still a high ping that it's probably not UE related.
How are you currently printing the ping?
ohk got it I will try rn, btw is it helps if I check the UnrealInsights screen?
looks so complex but should I try to analyze it too is it worth?
Eh, not sure. You can do some traces on Server and Client for CPU and Network fwiw. Can't generally hurt.
should be done on a packaged build though, preferably testing, but if you have no source build then just development.
Could you show me how you are currently determining/printing the ping?
like this @thin stratus
btw I should ask again, for the characters the net update frequency I m using 60, may is it high? but whe I decrease this the characters movement looks laggy -on same computer editor test with 0 ms-. 🤔
Updating 60 times per second could be a bit much, yeah.
But you are probably trying to fix Clients looking laggy on the ListenServer.
Everything else shouldn't really look laggy.
tried to decrease it to 10 and interestingly didnt happen anything new and all results same 🤔 .. but in Blueprint insight says the game usually drops to 3fps and it makes the ping but I dont feel any fps drop in testing
hmmm
The FPS/ms of the GameThread can indeed affect the ping.
Expecially low FPS can cause updates to be send and received less often, causing the ping to be higher.
That's why I asked for the FPS
I know but in the real testing I always see 80 90 fps but in blueprintinsight record says game drops to 3fps
if it drops this much then how I cant see it in the game
look says 10fps for a huge time
I will check this I think thanx for helps, I will give more information if I found somethings more. and I will try to run an empty map too @thin stratus
You'd need to actually check below the graph what the higher areas are.
The majority looks to be around 60 to 30 FPS.
More 60 than 30, so that should be fine-ish
Warning LogTemp RoundTrip: 0.216667, Half: 0.108333, clock set to: 7.491666, was 7.475000
I made a simple clock sync algorithm that sync's the world's TimeSeconds to that of the server. It seems pretty accurate. I worry, though, that I'm not doing this "the right way" and TimeSeconds wasn't meant to be touched manually. Also the time values look truncated to 1/60 (which is fine for my use case)
Hey guys, so i am trying to fix my spectator system issue here it is:
Since my map is big when a player dies and starts spectating someone else and he goes far away and triggers rpcs, those rpcs doesn't trigger for the client that's spectating due to network relevancy. So to fix that i made a spectator Pawn class and when the player dies i possess it and set its position to the currently spectated player every couple of seconds, the thing is i added a cube to the actor to visualise its position and it works it teleports properly for everyone, but the rpcs that are far away still don't work, any ideas?
That's my pc code:
There is something pinned like this. Just in case you want to compare.
I FIXED IT! So the problem was i was making it on a pawn but when i switched it to a character it worked!
fwiw, you usually just need to set the player you are spectating as the ViewTarget.
There is no need to spawn a Spectator Pawn if you aren't letting the player control it anyway
I was inspired by that blog post, in fact I'm using the same algorithm
Though for my own sanity, I like a small codebase over doing it the optimal way 🙂
How do I make this smoother on client it jitters a bit sorry it looks like a mess, I want it to function before making it look all pretty lol
Don't set the RPC as reliable
It'll overload the server
and what is this velocity for?
.
Moving my char has no gravity it's a space movement type thing
First off, why are you dividing by 2 then normalising it? The normalisation negates any affect to the scalar component of your vector
Second, clamping the normalised vector size to 800 does not get you a mapped range between 0-800, I'd use the x component of your input to map a range between 0-800 and multiply the normalised vector by that amount. That should give you a smoother progression in your velocity.
Third, all of this logic should be done on the server. You should send the input data raw through a UNRELIABLE RPC, and in your server implementation perform the math logic. The cardinal rule of multiplayer, never trust the client. Being able to set the velocity of your client directly through an RPC is not a good idea
also once you introduce ping, movement is gonna be delayed and not feel very good. i'd highly suggest looking into the character movement component. theres a flying movement mode
That is another good point, the CMC has a lot of nice built in functionality for exactly this
Has anyone tried out the MultiServerReplication plugin? I can't find any resources on it, apart from api reference 
https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Plugins/MultiServerReplication
@thin stratus Hi again, news here I checked the bpInsighter and games fps is stabile at 60fps -sure clipped on editor to 60 defaultly- the shown 3fps sections we checked yesterday was all just players joining and world generation frames soo in frames the game is lookin well. andd another news I tried what u said yesterday "test on a fresh world with fresh GameMode and egs" andd the results are, fresh games blank pawn gives 8ms and in the same world with my gamemode and pawn the pawns ping is around 30..
When I checks the details just the replicated movements/locations/rotations are looking high but they re already all default too. sooo Idk what should I do now 😕 😕
How many Characters and AI Characters are in your Game in the normal map you play?
How many clients?
Your own Pawns probably have a way too high update rate then
Check if it gets better if you reduce the values a bit.
but I reduced them already and wait I will show u too may I misunderstand somethings
all this right? for a pawn with character movement.. I typed Replicat and Network and all showns are here
in the network tab all the values was like 0.1 or 0.01 per second and I increased them to make less repeat per second
soo actually this is less repeating for a default pawn
and btw my components not all replicated too just capsule comp and 2 meshes are component replicated enable
Higher number in frequency means it's more often tested
I know I know but netupdate frequency already decreased from 100-default-
and I decreased it with checking so If I make it lower the character starts teleporting
humm lemme try
If it does then there are other issues.
btw I curious why this low values are while ok then why defaultly the engine is too high like 100? why did they do this 🤔 is it have a reason do u know?
now the ms decreased to 18 but movement looks laggy on editor monitoring

@thin stratus
Hi Doing stuff on an Actor component
it not "counted as owning client doing it " ?
i mean components cant speak to server ?
where and how do you replicate rotation?
Im guessing it's the issue
Clients can't call Server RPCs (Run on Owning Client) if they are not the owner of that actor
for details the average size of rotation is very low but if u wanna know here @dire cradle
sadly no :L the going movement package is too high it shown but cant decreasing because makes pawn teleporting but all used base movement so..
You're trying to interpolate on the network
Even if the server wasn't overloaded this will look jittery on clients
I just setting actors rotation so how can be different this event?
Plus this is a reliable RPC running on tick
Doesn't matter, it's still sending rotation data every tick with a reliable rpc
that's the issue overloading the server
if the players remotely owner the next progress going
eh bro I know this is not a good solution but when I disable the rotation, the lag doesnt solve 😄 the movements still laggy and ping is still high
I tested it already before
thanx but solution is not about rotation rn
whatever you do you shouldnt send on tick reliable RPCs
doesnt matter if you fix or not, because yont wont keep it
I will change it thanx
i dont know what you are trying to do, but the minimum would be sending unreliable rpcs
And don't interpolate on the network, it will always look jittery
Interpolate locally
oh I do just turn to players pawn to mouse point
but didnt found a better way
how can I do it and will be better for network 🤔
I think it would be better if you used a simple replicated float variable for yaw
and set it to skip owner
Set the value both on local and send it to server at the same time
Then interpolate the rotation locally on everyone
but it isnt same as send with event like what I do?
no
No
ohhh got it
Firstly the replicated variable only sends deltas, meaning it will only send the last value when it's changed, and only the changes
An RPC will always send the full variable regardless if it has changed or not
and if it's a reliable RPC it can't be dropped, meaning it can overwhelm the server if you send it on tick
it checks if mouse moved and if yes then trigger event
That's a good thing to have
hmmm am I get right, I need change to event from "to server" to "to locally"
or just making an variable is enough?
I just realised you weren't multicasting the rotation
Try the current setup with 2 clients
They won't see each other's rotations
yea because its actor rotation so server enough to show them to client
ah then yeah if replicate movement is on, but since it's trying to interpolate on the server it might still look jittery
eh yes u ra right but this is a listen server project so already its shouldnt see anything if not a server around
🤔
still a good idea to keep scalability in mind
hummm I wanna talk this more detailed can I direct message u?
You still need to send the yaw to the server
sure
I m there in 10 min
guys i am trying to use Web auth for Epic account login using javascript , the problem is i am able to generate a 2FA code(sent to my email) , but unable to use the 2FA to get an asses token
https://pastebin.com/rd4mGTj0 Here is the code i am trying now
Pastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
Hi, i have a question for creating lobby. I wanna make lobby something like the OG MW2 style, and I'm using Lyra sample, I made a new experience that would load GameLobby map, and it will show character and open a widget of the lobby, but when I try to create session it opens the level, but other player cant find it, but if I start any other session it will find that session. Does anyone know, how I can or what I have to change so that I can see that lobby session in the browser. FYI, if I switch experience it will show in the browser, and I tried adding those in my lobby experience but that one could not be seen. Any ideas?
Hi whats the best way to replicate orient roattion to movement
in this case the player is standing still but u can rotate him with mouse,
it need to be rpcd
Ok, Thanks for the response I did your recommendations. How do I make it smooth on client? its kind of choppy and that's playing in editor too so I can only imaging how laggy it is on stand alone.
you just have to call a server RPC for orient rotation to movement that will work .
hey all i have a widget component that im trying to only appear on the client that is near it but it appears on the server and all clients any help
How are you checking who is near it
Use is locally controlled for the actor/pawn
If locally controlled then call the event dispatcher
@quiet snowwow that was to easy xD
I have a component that lives on the character. This component controls the weapon in terms of recoil, sway, etc. The values that drive this is stored in a data asset that is attached to the weapon. When I switch weapons, does it make sense to read the data asset off of the weapon and update the values that control the weapon? Or should it be done a different way? If done this way does it make it easy for cheaters to change these values?
As long as the server controls the bullet trajectories it's ok
Don't pass trajectory data to the server to execute
Let the server calculate the trajectory itself
So if I did that, lets say the client cheated and made it have no recoil. So the barrel is always at position X. On the server, it has the recoil and now the barrel is at position Y. The server will calculate based on the servers barrel position correct? And the client will just have no recoil but it will never hit. It will be like shooting with sights that are not dialed in.
Yes exactly
Ok thanks
You can't really stop the players from messing with their local camera, that they can just cheat and control
That's why there are kernel level anti cheat software
like Easy Anti-Cheat etc
But you can put measures in so they can't control the server-side logic
Ok good to know. Thank you!
The phrase to keep in mind to keep things snappy but authentic is "trust, but verify"
The client can say where they were shooting or who they hit, but you should verify or sanity check it before affecting any canonical state of the game
Yeah makes sense
i need some help with a pickup, im not sure if doing this right cuz im a noob
(player controller)
item pickup
the server works but client never interacts with the item with breakpoints
im doing something wrong but not sure what
5.5.4 just got updated for me, i remember someone talking about how they updated the sessions code to "work" now for this version. Anyone have any info on the notes for it?
Do I add destroy session when host is leaving his party/lobby
Its my player state class, One thing I didnt understand is, is this replicated directly, shouıld i call RPC? For example, Client will also call that method, then what will happen?
Double decrease on client etc, because we have server instance of it, and client instance of it. How things work in GAS?
Im done, its been nearly 2 years and I still cant even share a single variable over multiplayer. DM me if you think you can help me, im offering a reward.
I keep thinking chatgpt could at least guide me with the logic but everyone on here was right, it really is useless.
The ServerRPC inside the Item won't work. The Item isn't owned by the Client. You can only perform the ServerRPC before you call the interact interface function inside the PlayerController or similar.
It's generally a good idea to destroy the session after leaving it, in all cases, cause it can otherwise fail to create or join a new session.
Iirc GameplayEffects are not predictively added outside of GameplayAbilities. Not quite sure what would happen in your example. You probably want to test it. Could be that the local client ends up with 2 instances of the GE, similar to spawning a replicated actor on everyone instead of just the server. Probably better to ask in #gameplay-ability-system
If that reward is money then why don't you try to find a tutor for some 1 on 1 sessions? That can clear up a lot in 2h.
For the sake of not spamming your question away.
No clue, maybe check the forums. There should be patch notes. In theory Nick also posts them here on the announcement channels.
🫡 thanks!!
Hotfix 5.5.4 is coming your way - check out this latest version with over 80 new fixes and updates! Please feel free to share feedback and discuss the current version in the release topic, Unreal Engine 5.5 Released. If you experience a bug with the 5.5.4 Hotfix, please follow the How to Report a Bug guide to report it on the Bug Submission F...
.
Idk how to find a tutor
Can't find anything about sessions. But either I'm blind or they don't list things that aren't in the issue tracker
You could post such an offer to the job board or look if someone is offering
@thin stratus hi , I want to login to eos using device id grant
That's great. How about you try it and post to #epic-online-services if you fail, without randomly pinging me :D
I never used eos, despite putting Evershire on the EGS.
I have already kept the problem in #epic-online-services
Got no answer , thought you could help .
@remote tusk Predicition Thread stuff.
Hi peoples! I already asked about this in #gameplay-ability-system , but was instructed to also ask here as I didn't get it solved yet. I'm developing a multiplayer turn-based tactics game as a hobby project. My game allows multiple characters to be assigned to and controlled by players. I'm using GAS and it seems to be designed to only support single character possessed by the player as the abilities are not replicated to simulated proxies. In my game, players are possessing a top-down camera pawns and only indirectly controlling the character pawns, which makes them simulated proxies.
How should the proper setup for this kind of game be? I have tried setting characters to autonomous proxy without possessing them, by calling SetAutonomousProxy(true) on them. I also tried to setting static boolean bReplicateAbilitiesToSimulatedProxies found in AbilitySystemComponent.cpp to true. None of this made the replication work though. As soon as I directly possessed one of the characters, the replication worked. But as I said, this really isn't an option for me. The goal is, that players would be able to control the camera, switch between their assigned characters and access their abilities—similar to Baldur’s Gate 3 or other squad-based RPGs.
I'm also pondering about giving the AbilitySystemComponent only to PlayerState and storing GameplayTags corresponding abilities to characters and refresh the abilities of the ASC each time selected character changes. This is a bit of a hack though, as each character is supposed to have their own abilities.
If anyone has insights on how to solve this or best practices for implementing such a system, I'd really appreciate the help! Even a high-level overview of the correct approach and reasoning would be invaluable.
Why do you need the ability to be called on Simulated proxy
I can't think of an instance where you want to do that.
Simualted proxy should just simulate the visual stuff, like playing the animation.
How can we prevent cheat for something like auto parrying? The client would know the enemy is attacking anyway, so it can just inject some script to be in a parry state.
It wouldn't matter if we are listening to client input either at certain time stamp if that's the case?
This isn't really something you can prevent.
That goes in line with any other client side cheat.
Gotcha, not important but I got very curious 😛
The whole thing is client input driven. And the Client needs the info for the visual queue.
Reckon this would be something that client side anti-cheat do I suppose?
So you can't really know if they pr essed it by hand or via a third party help
Here is the visualization of my current setup. My thought process has been that as each character is supposed to have their own abilities, I should put the ASC:s to characters. And if I put the ASC to PlayerState instead, I would still need to refresh the available abilities each time selected character changes.
Also, if I put the ASC to PlayerState, the characters wouldn't be able to have abilities active when they are not selected as only the selected character's abilities would exist in ASC, right? I don't know if this is a problem in the end, but it would at least prevent calling an ability and selecting another character before the ability has completed.
If you got ideas on how this should be done properly, I'm all ears! 🙂
Most likely. You could check how Dead By Daylight handle their generator events.
Idk if there is anything written about that.
But I coul imagine you could cheat that if wanted.
Yup, deffinitly not something someone on my level should worry about.
I think it's already hard enough to make sure the Client parries based on their visuals and it feels good for them.
cause of all the ping involved.
hmm I thought it would be as simple as the server not doing instant damage but allow some window for the client to respond back.
that window would have to be quite generous
and what happens when it reaches the edge? does it wait to apply damage?
I was thingking after 50 - 75 ms (adjustable value)
just apply damage anyway if client doesn't respond back.
It's not a bad idea though I think... Trusting the client here to respond in a set window is far easier than alternatives imo
well the A.I attack would come from the future for them so I guess we kinda have to wait?
if the client side has to do parry then I suppose so
another factor could be offsetting the timing of the attack or the parry window/ windup by their ping a bit
right
but that's a bit wishy washy in context when ping is fickle
Either you trust the client fully or you need to take ping etc. into account.
it can be a combination I think where the server says "respond to this damage event in a way that I agree with or get bonked"
Server needs to know the exact Timestamp Window the Client can parry in.
Client has to tell the Server when it tried to Parry.
Server has to math out if that Timestamp, compared to its own, given the Ping, is valid.
Of course they can cheat by reading the local memory
that's just reality unfortunately
This isn't really fixable tbh. You'd probably ban those on a case by case thing.
At least if you are a small game.
true and tested method 🙂 ban the players.
Can also start installing Kernel level anti cheat and get hated
flag all the parry god.
There could be some idea of a rule where you can't possible have parried an attack given the situation but even that is going to be tough to nail down
reading the convo, I decide to just let the client cheat and let report system do the work
Only games that sells need to worry about people cheating anyway :P.
you ever find out why im getting the same error
my bad
to answer anyways: you can see in that screenshot that it doesn't respond with an overlap
Hello
When it comes to cheating, for Singleplayer games we don't care, because they bought the game, they are not harming anyone, let them do in game what they want.
For Dedicated Server Multiplayer games it is not particularly hard to implement sanity checks and other Anti-Cheating measures.
But what about Singleplayer games, with Online Leaderboards? Implementing Anticheat without a Dedicated Server is practically impossible, because as long as the player is the server (or Standalone), they can do with the game what they want, disable or bypass your anticheat. How do you deal with this?
A good example is Speedrunners From Hell. It is a Singleplayer Parkour game, and Global Online Leaderboards are a huge part of it, they are what makes the game competitive and interesting. In such a game, how can you ensure that there is no cheating, which would completely ruin the Leaderboards.
Removing "Unrealistic" stats from the leaderboards is not an option, because as long as someone doesn't go completely nuts, they can cheat while keeping the stats within reasonable limits that you can't be sure that it's impossible.
Since we talk about Server can destroy item, Even if I call this inside the Interact method, would this still be synced and destroyed on all clients? Since we dont own the item, and "Call" destroy actor, would this be still count as "The interactor" is destroying the item?
tldr, if server destroy replicated actor, the client copies will eventually be deleted too (when the instruction arrived on the client's machine)
@dire cradle just pinged you as you helped me with this too 🙂
@dark edge you told me to "make a struct my guy"... I have done this now for Equipment on a character. So
Struct_Equipment
- Head
- Chest
- Gloves
now when I change the gloves with "Set members in struct_Equipment"(Screenshot 1) I get a OnRep_Equipment.
Is there a way to know WICH variable was changed inside the struct? like "if Head was changed,do this, but if Chest was changed,do something else"?
Because otherwise I would have to call the Update_GearVisuals for EVERY item each time ONE is changed, i hope I explained that good enough 😄
I doubt it, at least in blueprint. Imo just use what you already have. Just add an extra check before setting the skeletal mesh.
If the mesh is the same as the one from the struct then don't change the asset.
I mean I can do that, but it feels wrong 😄 I have to "Update_Visuals" for, as you can see, 14variables(if we ignore amulet and rings as they wont be represent in a mesh its down to 11) especially as I have to do that then in the EquipmentUI as well and update every Icon/Tooltip for all 11 items again. I could do that, because I mean how often do you REALLY update your gear anyway, but wanted to check if im not missing something xD
Not sure if you understand. If you are not setting the mesh that has the same value, you will only update the one that has new value.
So if you just change the chest,
When the struct replicated to client, if chest isn't the same value then you will use the set skeletal mesh asset node.
That's just one call to do necessary update.
hi btw 🙂 game going good? dunno if you remember but we talked here like 4-5months back a couple times ^^
yeah good addition, but does it matter if the mesh gets updated or not? ..............nvm
ohhhh i see, sec i think I get what you mean, ill replace the Branch of "is valid class" with is Mesh == Mesh
Say for chest
Get player chest if mesh == mesh from struct then do nothing
Else set chest to mesh from struct.
Yeah looks better
this way i dont even need the "true" part of the branch. as if None=None then there is no item equipped,so no Mesh update needed,and if its not the same, then when we either unequipped something wich then will write "None" into the mesh or we equipped something wich then is Mesh = MeshFromEquippedItem and it puts that mesh in.
hm, i just remembered... isnt there a "OldValue" and "NewValue" you get OnRep?
I could
OldValue_Chest == NewValue_Chest
OldValue_Helmet == NewValue_Helmet
and depending on that I could execute the code..... isnt that viable too?
imma finish a video and then imma test this way with all possible outcomes, imma tag you with the result,but for now i cant see a reason why it wont work 🙂 so both prolly will work, just gotta figure out what makes more sense 😄
@ruby parrot you don't even have access to OldValue on blueprint
that's available in C++ OnRep but I don't even know how that helps with the struct delta
ah, didnt even know that, well then screw it LOL screenshot 3 way it is
How should we replicate Adding item to a character's inventory? This is called on Server, but since its on server, client wont add item to "inventory", but item will be destroyed since its called on server. I can simply call *MultiCast RPC *here. But i am not sure what would be advantages and disadvantages of it. How we could replicate picking up items, adding inventory in proper way? Should I simply replicate Inventory array?
If i replicate variable of Array Items, adding, removing would call OnRepNotify in blueprints? If so, i can follow that way. When I replicate Array, Adding/Removing (editing struct) items wont call OnRep_Notify.
Someoneknow how to make public/privat lobby and 0/4 players using steamadvacedsession plugin?
Check Kekdot's Battle Royale playlist in youtube.
Probably the same like Trackmania handles it.
Deterministic game and you gotta upload the replay. Didn't stop Riolu from cheating for years, by turning down the speed at which the game runs, but well. Even that was caught in 2021.
Should i be copying my array first, then add item to that, and set that copy to original to replicate properly? How things work in Array Replication with Notify?
Or I can simply add a bool like InventoryUpdated? with repNotify, and change it wherever i update my inventory, then it will locally update my inventory.
Or hacky solutions like this. How do you guys handle array's Set Element function to replicated?
I've solved it with RepNotify bool, whever I update my Inventory, i set it to true, then as soon as i do stuff, I set it to false. OOOR I didnt, even if I call RepNotify, it will update its inventory, but we still didnt call Add Item in the server.. Mmh.
i am pretty new myself, so dont take it as a guaranee, but your way is WAY too complicated imo 🙂
Do you know what event dispatchers are?
yeap
okay, so currently my approach is the following:
Actor Component that does all the variables+adding/removing/stacking items etc....
PLUS has a Event dispatcher wich is called on the REP NOTIFY variable array of InventoryItems
then in the WidgetBlueprint Inventory you BIND said event dispatcher to something like Update_Inventory wich "recreates" your inventory from scratch.
and yes, for an array to RepNotify you have to SET the array(i could be wrong,but i think Array.Add() or .Remove() DOES NOT trigger RepNotify by itself)
ill give you "my code" for the entire thing, but as mentioned im "pretty new" too so there might be non-"best practice" in there, but at least it works 😄
I actually did this, I am adding the Item to inventory in Server, and re-setting Inventory array again.
And this is calling this method. But even if I log this, It wont updating my inventory on the client after it picks up item.
In WB_Inventory:
Widget is subscribed to On Inventory Updated method, and rebuilds inventory again.
AddItem in AC_Inventory wich is Attached to BP_playerCharacter:
The Inventory Length is also coming right, but it prints from "Server:"
And OnRep_Inventory ....this Update_Inventory is, as mentioned before, just bound OnBeginPlay to the Update_Inventory function inside WB_Inventory
I call Interaction on the Server:
Then pickup Item calls that in the server, via Interact method.
Then as soon as i add item to my inventory, I set notify my array, to itself so it it calls RepNotify.
jesus, I am at the brink of giving up on multiplayer again
And inside RepNotify, I check if i am local, if so, I am calling Updating Inventory event, which bind by widget to update its UI.
where is that WB_Inventory bind?
One thing I didnt understand this, Why OnRep_Method prints from Server only? Shouldnt it call from client also?
might be because you're getting the player controller by index
Its inside the UIManager Component. UIManager passes my Inventory successfully.
And when Inventory Updated calls, it calls Build Inventory Grid.
yeah,but where is the BIND call?
and yes it does call it on client and server.
yeah,i wanted to address that later after fixing the first issue 😄
But print will be only by the server right?
nope
It will call on both for BP OnRep
if you are only playing as listen server and no additional player it will just print server
Hmm. Then something is wrong here for me.
because there's only the server
I am playing 2 player, with listen server and client
again,i dont see the BIND call anywhere 😄
As you see on the left, I triggered the item to add
On Rep Notify worked, and printed by Server?!
I will check it out. This is working on the server btw, for example if I play on the right, it succesffully updates the UI
OnRep gets called for both server and client in blueprint.
OnRep in cpp only gets called by client.
in BP it's more like variable change listener
Yes, But should this print from Server only? Thats where I am confused. On left client, I send RPC to server, then I added item to Server Instance of the client which my array is replicated, then repNotify is called.
depend on the instance that execute the OnRep
the picture doesn't give enough context.
- Send RPC to Interact method.
- Add Item to Inventory in the Server in Interact method which is called by the server.
- Update Inventory Items Array (replicated arrray) to get Notify after adding item.
- Notify gets called, and in the server only.
put a PRINT here on false
it might have to do,that youre doing your get player controller wrong 🙂
Nah, it doesnt print anything
I add item in the server, and re-set my array, to get notify. But shouldnt that notify should be also called in Client? Which means i needed a client print?
i wanted to fix this later, as i didnt want to distract with another fix first.
cause he only wants to update his UI on the client..i did it his way like 6months ago too 🙂 i know exactly what hes trying there ^^
i did the same logical mistake as he did ^^
Alright, I did this. Print is coming from server only. I think I should create an empty project and check RepNotify prints where do they from etc. I cant seem to understand if this is the problem.
last time i ask this.. where is your BIND call?
somewhere in WB_Inventory you need to BIND-> OnInventoryUpdated
yes, I found it now, going screenshot to not messy look. 😄
Here in the picture, On Start, I call Build Inventory Grid.. It will create empty grids. Then after complete, I bind for Inventory Updated event here in the Item Container.
So as soon as I create my grid, I also bind for Inventory Updated event. I first unbind, so that it wont bind multiple times
ah...when i fix an issue,doesnt matter if it looks messy.... making it look nice is second step, we are step 1 😄
As i said Its working on server, when item picked up by the server. 😄 I'm pretty sure i am picking item in the Server Instance of the client, too.
I think On Inventory Updated is not called in the client.
okay,this is way too complicated... each time you create your inventory, you unbind the call and then bind it again? what? 😄
Here in the Server, after i pick item, It calls the Inventory Length print, and Inventory Updated print, which I printed after bind.
In client though;
Its not printing..
Its to secure multiple bindings. For example in Unity, its like
updateCall -= DoThing;
updateCall += DoThing;
So what i am sure now is, This OnRepNotify is somehow not executed in client.
@remote tusk where do you add item?
yeah,as mentioned, lets make this easier first.... this is (ignore the parent call) this is EventConstruct on WB_Inventory no need to bind and unbind.
Yeah, I can do that in the Construct before building the widget, creating slots. But i dont think this error is where derives from. The problem is my client is not calling OnInventoryUpdated, even if its called in Rep_Notify.
if you are using dedicated server the User interface classes will not be on the server , if it is of any significance
show where you add / remove item.
he did 🙂
I don't see it,.
nah,he has 2 clients, one both as server and client
Can you check this Sequence @dark parcel
Is it good practice to create an enum that will be responsible for indicating the material for the client from the server (the server sets the enum and replicates it to the client, and then the client sets the appropriate material according to the enum)? (Dedicated Server)
but given that OnRep is called, it should work 🙂
This Add Item is called in PickupItem's Interact method, And I call Interact method via Send RPC.
show Populate Item By Tag
The rep notify have to be called by server , are you sure the RepNotify is getting triggered by server
Since my Add Item is called in Server, Maybe thats why its Rep_Notify is called in server only.
Yes
he showed screenshots for that,and yes
no, if the client receive the replicated value the onrep will be called on client too.
stupid question maybe...but both characters are in the same world,yes? 😄
aka they see each other?
You can use a client RPC as alternative solution
personally i would just replicate the material asset and not bother with an enum
like one character is blue and another is red?
Like use a server RPC to let the server trigger a client RPC on owning clinet , pass the inventory value to the client
Can you do a simple test on that.
When a keyboard key pressed, send and RPC, and set a replicated bool value.
And in Rep_notify, check if its called on the client too. (I mean it should print from Client: ) too.
don't do this.
I am not doing this because of actor relevancy
why
because RPC is not stateful
And why he needs to have states in inventory replication .
because inventory is stateful and needs to be in sync,.
What i am not sure is, If we Send RPC to Server, and set a "replicated variable" there. Then OnRep_Notify print on Server, Or server and client?
if you see people updating values on clients using RPC, you probably learn that from youtube
like MattAspald tutorial
shockingly bad
i told you yes already: Client,server,OnRep
What i meant is;
Two logs.
Server: Updated Inventory
Client: Updated Inventory
@dark parcel So you have not learnt from Youtube
yes,thats what i am showing you 🙂
yep, enum is just int instead of replicate the whole material
Correct, almost every single multiplayer youtube tutorial makes me want to punch my monitor,.
so idk
For now, When i take item on the Client, Only the print is "Server: 1".
Then how did you learn
- Screenshot is Client, 2nd screenshot is server
docs and pinned material in this channel.
i run a dedicated,so it doesnt say "Server" or "Client" infront 😄
also if you are looking for video tutorial, Stepehn Ulbardi is pretty good imo.
95% of bp youtube MP tutorial is flat out wrong.
yeah,its better to learn it "on the fly" and with this therapy session called #multiplayer here 😄
Bro i have already gone through every thing , if something is not working do not stick to principles , that way you will get stuck
getting off topic anyway.
All I'm saying is don't do what you suggested just then about using RPC to update values on client.
Maybe i am mis-explained myself. Now tell me;
What print we would wait here in the client;
- Interact via Server RPC.
- Add Item to Replicated Array and re-set it.
- Notify called, Inventory updated called there and also a print of Inventory length.
In game, we play as client (2 instance is open), then I pick up item.
And thats the picture itself.
Its time to re-watch 10. times RepNotify for me. 😄
you could just have an INT, given that the you never change the values and then SWITCH ON INT:
when you replicate a data asset, like a material, it only sends FNetworkGUID over the network which is also just an int
oh,nice to know!
What would happen if you didnt check Has AUthority?
RepNotify is kind of straight forward.
If you change a variable in BP - the OnRep will fire off. Inside of the OnRep, the variable will have the updated value. If you change it in C++, it will only fire off on the client. On the server, you will have to manually call it.
Use OnReps to handle stateful things. Such as a flashlight being on or off. Or your currently equipped weapon. All it is, is a method that gets ran when a variable is changed. @remote tusk
wdym? I am just filtering on whos calling.
A client changing value will only apply for it self as communication goes from Server to Client.
The only way for Client to communicate to server is through server RPC.
nono, you explained yourself perfectly,and i am telling you that i get the print ON BOTH the client AND the server..... you have host+client so it shows "Server:1" and "Client:1"....I have dedicated server, so it only shows log for Server on command line,and client only on client, so yes OnRep shows BOTH on client AND server. so something is wrong with your code 😄
And also there is a limitation on how much you can replicate , if you are trying to replicate a large object which does not meet the quota the rep notify will fail
Its a small game for now, I have 8 slot in my inventory, and slots are only struct with GameplayTag and quantity.
yea its a good way to replicate a bunch of info for cheap if you don't need that info to be dynamic. can just create a data asset with multiple variables and replicate the pointer of that data asset
is it possible to replicate primary data asset?
Yes
Yes. Then something is wrong with my RepNotify.
This is my Inventory array which is replicated.
my code doesnt work for client-server currently, thats why i didnt want to confuse you with it..but here it is you see server and client both show 312312
#multiplayer message
don't know what else to add.
I call that Add Item inside the BP_PickupItem, when interacted via Server. (maybe this is the problem, since its not the authority object.)
Then my OnRepNotify is called.
If your Inventory struct changes in value, BP OnRep should be called for server and client
But OnRepNotify is not called for client. Maybe because Array is not changed or smth in Set /w Notify in the client.
check the array before and after adding.
you can just go live with the code , if it is not of sensitive nature in a screen share , and invite people
afaik replication get pushed only when there is delta between old and new value
This is my Populate method. It simple while loops until it doesnt find existying item and slot.
Add Item is setting the Set Array Element simply.
yeah but we have established,that it IS called on the server ? 😄
Maybe because I add my Item in Server, and not in client, My client doesnt get Rep_Notify??!
that's not the reason
And this is my PickupItem which is replicated.
Replication works Server to Client anyway
All "Has Authority" does is checks who has the network authority. In an overwhelming majority of cases, it will be the server. Another way to think of it (to an extent that is) is "who spawned this actor?". The reason I say to a lesser extent is because you can change who has network authority. So, assuming you don't do that, that thought process works.
The reason Cold has it set up this way is because a player can be the server. So, if they are - they'll go through the "Authority" branch. Setting the variable. If they are a client, they have to do a server rpc to tell the server that they want to change a variable value. Server changes it and then it replicates back down to the client.
Now, admittingly - they don't even need that check. Running a server RPC on the server doesn't actually do a rpc across the wire. But, it is up to you.
no,thats exactly why RepNotify EXISTS in the first place 😄
And this is how I interact in Interaction Component, which is replicated.
And what is the class this is getting called from
Here is whats happening, Right is sever, Left is client.
Its my interaction component with Event Tick -> Trace
Input E -> Interact Success
is the component it self replicates
Its correctly happening in the server side
is the destroyed actor a replicated actor?
Go to your can and tick Replicates in the detail panel
Yes, My Pickup items are replicated
maybe just make a new array of ints, rep notify call the dispatcher and bind it to a function OnConsctruct, then make a keybind that Adds to that array and check it with the bare bone minimum code... and see if that works?
destroying a replicated actor as server should propagate the action to client
Yes it does, Its actually destroying it
Here i colelcted all the items on the server
Is there any case like OnRep_Notify works on Server and not in Client?
Like Server has a change and OnRep is called, but client didnt have a change on itself smth like that?
not that im aware of
Because when I collect from client, It calls the Print inside the OnRep_ like "Server: etc."
Video explains it all for me. 😦
cause it would defeat the purpose of OnRep
Anyway, I'm pretty sure I made something wrong because i am trying to replicate my whole full system of inventory. 😄
nah the approach is correct, but imo some things are too complicated for no reason 😄
So i am pretty sure the item is "ADDED" on my server instance of the client.
If I simply add item to my inventory, and print that, it will print by the Server the correct item.
But i am pretty sure it needs to log "client: Item_rawMaterial.food: 3". too. so that we can be sure the client also updated.
I think this might be related to ownership or smth. IDK. How can I be sure that in Server, this item is added the "client" version the Server Instance, so the other player in my Server (when played in client version)
We cant check in the editor like this yeah? 😄
you can choose the world
F... I didnt drink water like 2 hours trying to solve that. 😄
Usually when I have such issues, i break it down to as easy as possible... Make a fresh new array of int, make it RepNotify, make a key-press event wich calles "AddToArray" etc. maybe that helps finding the issue?
Yes, I will check that out man! Thanks for helping me on the way. I am much more clear on this, and gonig to fix it.
Should we suppose to replicate components if added on the Character?
Inventory and Hotbar Component is on Character.
Also Interaction, And I can also call Interaction RPC in the component itself. So I assume its replicated.
It also correctly prints correct Component names in the server. So its calling correct hotbar in the server.
So i am pretty sure something is kinda strange here. 😄
depends on if you want anything on the components to replicate 🙂 stuff like inventory needs to be replicated,as the InventoryArray variable gotta be synced 🙂
I am setting Inventory again to itself, because to get notify. It is working too.
OMG.
i have the same 🙂
Yeah.. I didnt check Replicates component.. Because i thought its already working. Because RPC's are working in interaction component for example even though its not ticked?!!
Gosh finally!
So one thing I learned is, even though RPC's work without "replicates component". Replicated variables doesnt work!?
Yes the component have to be replicated if you are using it in network
correct
But how this is working then?! My Interaction Component is not replicated.
Is that because Enhanced Input?
Because I call this Interact success via EnhancedInput_Interact
LMAO. EVERYTHING WAS CORRECT.. BUT ONLY ONE TICK.
because it is "ignoring" the replication stuff for that Component only 🙂
What do you mean by that?
but yes, when i had that revelation months ago I thought the same .... UE should make it so that you get errors if you use RPCs on a non replicating component 😄
Now lets not forget to notify, when removing item. 😄
the RPCs may be getting called on the owner , not sure !!!
Correct! Its done in the Unity. 😦
but anyway, if it was non-replicating, then how my client is sending Server RPC in the Interaction Component?! 😄
ye,maybe but still weird it doesnt give errors 😄
well cause it its sending the command to the server..the server does whatever the RPC tells it to but DOES NOT replicate the results
ah, so you mean "sending Server RPc" is not networking stuff, its after that.
replicated basically just means "do i send results to the client or not?"
So an actor can send Server RPC, without being replicated?!
Thats what i like in multiplayer.. One question, and everyone thinks different way. 😄
could be my inexperience though, im still quite new, like 1year 3months is nothing xD
Unless the actor is replicated it is actually local to the Machine itself
Correct. 1 month multiplayer learner is h ere.
And there is no network relevancy
Okay, now I should understand this. My Interaction component is %100 "is unticked" Replicates component.
But i call Server RPC on Interaction Success.
And its sending to server from client.
i think he meant ActorComponent,not actor 😄 we were talking about AC ^^
anyway,gotta go afk, gl @remote tusk 😄
ty for your time mate.
May be if the component is using the network relevancy of the owner
it is possible that we have a successful RPC
Yeah, I think yes. Interaction Component is on the Player Character.
But Inventory is also is on Player character, but OnRepNotify wasnt working on the client. Before I ticked one fucking "replicates component." 😄
maybe RPC's work on Components that owned by replicated actors.
But not replicated variables.
May be on a deployed game the RPC will fail , with out replication
Anyway, I am happy that All I do wrong is not ticking "Replicates Component"
it might work locally
Yeah. Thats another possibility. I will be sure anyway to tick it 😄
as both clients are pointing to the same object
Ha:)
Guys anyone here can help me with EOS integreation in a VR project i am working on .
Hello again, im trying like when the host is creating a lobby, that the server name will be his steamname, but somehow when i play standalon and the net mode is 2 listen server, somehow i cant see the server. like when i hit refresh i dont see it. but when i make new editor window, then i can see the lobby
The notion of replicating widget is already wrong.
I think he means to say he wants to see it gets triggered in Client as he want.
PLEASE tag me if you found a solution for that, I would need that too in the future 😄
Yeah yeah, I wont replicate Widget since its client only. 😂 I will make sure to give-take and update recordingly for both.
Finally managed to fully replicate add item, drop item and take it back etc.
Now i spawn instantly, I want to apply force but Mr. Cedric didnt recommend it ,so maybe do a projectile movement to fake it.
Could someone explain to me why, if I have a timer on the server that calls a function with one parameter (a pointer to the PlayerController that was passed earlier), and then I disconnect the player, the PlayerController is neither nullptr nor valid?
So on rep called on client too right? What was the problem.
😄 Dont laugh please OK?
And I will ask a question regarding to that.
I'm pulling my hair at my own misfortune
It was because My Inventory component wasnt ticked as "Replicates Component". I thought It would be automatically replicated by the owner since its a character.
I thought this because My Interaction Component was not ticked to Replicates Component, but still can call Server RPC.
Yeah nah. Anything that replicate something or call rpc should be marked as replicate
Yes, I will do that in best practice. But how this interaction component was working
I could call from Client,the server PC
Here its not replicated.
Maybe it wont work on Deployed Build, or only the RPC calls are working since its a request. Thats what we said here. 😂
So what about that?
One f****g tick was the solution.
😄
🙂
Now that I realize Widgets are client only;
I made an Server RPC event in the Inventory Component, and call it directly. So that it updates my removal item, and spawn for the clients etc.
I think you still need to remove or nullptr manually after disconnecting.
Is that so?
GC marked it as PendingKill, because it lost connection, right?
update: i packaged it and the name is blank, i tried it with my friend.
So if I spawn those with Server RPC, would clients that is far can see them when come in our base? Is Spawning is always relevant? I spawn this in the Inventory Component where I drop item. Also Should I be setting my item's collision preset to Block All and simulate to true for lootable items? Is that expensive for Multiplayer? I am throwing this item with physics and doing these when dropped the item : Set Simulat Physics to True -> Set Collision Enables to Query and Physics > Set Collision Profile Name to Block All.
Anybody have a clue why this would work for the server but not for the client? Server gets teleported fine, the client if you watch from the server does a little hop in place and does not move. Clientside nothing happens.
Prints only on server as it should, executes the code, Teleport does not hit the fail branch. Destination is correct, doublechecked.
Code is in gamemode
what is a portal , if you are getting location of t in server , is it giving you correct response
Event try teleport to is getting called from which class??
??
see if the portal is valid in server , if it is giving a false then the teleport might not be happening , if the teleport is happening for the server player , and it is not happening for client try to trigger a client rpc in the player for teleportation . if this is fixing your issue then you can move ahead with this .
yes , if the item is replicated when you spawn it in server a client from far can see it depends on your netculldistace i suppose
but your net cull distace by default is really high in unreal , so yes .
yes, I even printed the destination location and the character location
difference of 500 units on the x axis at least
so the response is correct, the location is correct, it does not teleport in place
The client rpc did the trick??????
why
what the hell
the client also has authority to call the teleport???
Teleport is not a server bound function
seems crazy to me?
you will see a wierd computer symbol on top of the function slate for server functions
you're right now that I think about it
but that is absolute nonsense?
like why, wouldn't this enable cheats pretty much?
and why can't the server teleport the player, i am 100% confused
I think it is because of the movement component of the player
it might be setting the teleportation back to it's current location as the movement component is replicated and always replicates players location and rotation
So there might be a possibility of overwritting the server teleportation by the client himself after the server teleports the client .
because of this you might see a hop in client
Yeah I get it, so it was just doing a net correction on the prediction
seems crazy to me it's not default implemented since the CMC has "was teleported" as a variable
I think it's just somebody messed something up in our CMC for the project...
as the client should not have authority over it's position by default..
I have my login system by Aws cognito, and after logging in, i set a cloud variable in aws that loggedin=true. Now, when i press exit game, this value is again set to false. I m doing these by http requests. But now, if the game crashes, loggedin=true stays. How can i send a http request on game crash?
I mean, there is a event for OnActorDestroyed etc, so is there an event for onGameCrash or sth like that
i can run a function frm cognito as well to handle these instead of the game doing it. But is there a way in UE to do it?
Have you deployed a dedicated server
Yea but i only join it for a match
So you have a gamemode that is handling all join and leave sessions Right
Yea but thats in the match. Mainmenu is totally offline, and i only communicate to server by http requests
Yeh so let's say in between your game play your application crashed
You can use your server to detect this
As your player controller is going to leave the match
Yes but only, if the game crashes from the match, if the game crashes from the mainmenu, or alt+f4 or power down, this is what i want to know
Understood
noo, thank u, atleast i can add a code in the server gamemode to logout frm cognito
I have to do this for the mainmenu as well
If you want to do that then there is no direct way in ue to do this
Mm, so custom game launcher is the only option from client end?
What you can rather do is write a task watcher in python , or any automation language , and detect the closing of application/task .
And send a request to cognito to sign out
Got it. Thanks!
<@&213101288538374145>
rip to that guy
What happened guys
update: i packaged it and the servername is blank, i tried it with my friend.
why is in default character movement MaxWalkSpeed is not a replicated value?
I mean so server can set it for clients...
/** The maximum ground speed when walking. Also determines maximum lateral speed when falling. */
UPROPERTY(Category="Character Movement: Walking", EditAnywhere, BlueprintReadWrite, meta=(ClampMin="0", UIMin="0", ForceUnits="cm/s"))
float MaxWalkSpeed;
Maybe a timer that will toggle the value if it doesn't receive a frequent respond.
Cause it's meant to be a Setting, not something that changes during gameplay.
Changing it will most likely cause a correction when you change it.
You can of course still do that via your own OnRep.
Yeah, I need it to change during gameplay depending on different states...
was getting the same thing of correction which results a smal glitch and feels a tiny gameplay lag.
than i work around with it using cached prediction, not sure if this is a good practice but seems fine to me and working fine too
void AArmaCharacter::ServerHandleForwardGroundMovement_Implementation(const float Value)
{
if (!IsEnableMove) {
return;
}
const float VelocitySize = GetCharacterMovement()->Velocity.Size() + 5.0f;
const float PredictedCharacterSpeed = UpdateOtherMovementSpeed();
const float MaxCharacterWalkSpeed = (VelocitySize <= PredictedCharacterSpeed) ? VelocitySize : PredictedCharacterSpeed;
Client_RecieveForwardGroundMovement(Value, PredictedCharacterSpeed);
}
bool AArmaCharacter::ServerHandleForwardGroundMovement_Validate(const float Value)
{
return true; //temp return true for testing
}
void AArmaCharacter::Client_RecieveForwardGroundMovement_Implementation(const float Value, const float MovementSpeed)
{
GetCharacterMovement()->MaxWalkSpeed = MovementSpeed;
AddMovementInput(FRotationMatrix(FRotator(0, PC->GetControllerRotation().Yaw, 0)).GetUnitAxis(EAxis::X), Value);
}
OPTIMIZATION:
void AArmaCharacter::ServerHandleForwardGroundMovement_Implementation(const float Value)
{
if (!IsEnableMove) {
return;
}
const float VelocitySize = GetCharacterMovement()->Velocity.Size() + 5.0f;
const float PredictedCharacterSpeed = UpdateOtherMovementSpeed();
const bool bNeedToUpdateSpeed = (GetCharacterMovement()->MaxWalkSpeed != PredictedCharacterSpeed) ? 1 : 0;
const float MaxCharacterWalkSpeed = (VelocitySize <= PredictedCharacterSpeed) ? VelocitySize : PredictedCharacterSpeed;
if (bNeedToUpdateSpeed)
{
GetCharacterMovement()->MaxWalkSpeed = MaxCharacterWalkSpeed;
}
Client_RecieveForwardGroundMovement(bNeedToUpdateSpeed, Value, MaxCharacterWalkSpeed);
}
bool AArmaCharacter::ServerHandleForwardGroundMovement_Validate(const float Value)
{
return true;
}
void AArmaCharacter::Client_RecieveForwardGroundMovement_Implementation(const bool bShouldUpdateSpeed, const float Value, const float MovementSpeed)
{
if (bShouldUpdateSpeed)
{
GetCharacterMovement()->MaxWalkSpeed = MovementSpeed;
}
AddMovementInput(FRotationMatrix(FRotator(0, PC->GetControllerRotation().Yaw, 0)).GetUnitAxis(EAxis::X), Value);
}
@dark parcel Please don't crossprost (:
I have added Camera Up and Down for my character in animations by modifying bones of spine. Now i am replicating it.
Do you think is that a good way of replicating my pitch, or should i be using Rep_Notify?
If the bone are driven based on where the player is looking at then there is already replicated variable for it.
GetBaseAimRotation
I wouldn't use RPC, just set the replicated variable on tick for proxies with some interpolation.
avoid using RPCs to change state on clients. almost always best to use a replicated property with notify
This is how I set up Rotator, and appy to the spine bones. Character's Pitch is replicated variable.
Hmm, so should I use Get Base Aim Rotation on the graph directly?
Like this?
Yes, this is working succesfully. Thanks ColdSummer. I hate most of the Youtube Tutorials actually again and again.
void AAGPlayerCharacter::AimOffset(float DeltaTime)
{
if (IsLocallyControlled())
AO_Pitch = GetBaseAimRotation().Pitch;
/** Gets proxies characters in server that server don't control. */
if (GetBaseAimRotation().Pitch > 90.f && !IsLocallyControlled())
{ /** map pitch from [270, 360] to [-90, 0] because of compression */
const FVector2D InRange(270.f, 360.f);
const FVector2d OutRange(-90.f, 0.f);
float L_AO_Pitch = FMath::GetMappedRangeValueClamped(InRange, OutRange, GetBaseAimRotation().Pitch);
AO_Pitch = FMath::FInterpTo(AO_Pitch, L_AO_Pitch, DeltaTime, 15.0f);
}
else
{
AO_Pitch = FMath::FInterpTo(AO_Pitch, GetBaseAimRotation().Pitch, DeltaTime, 15.0f);
}
}
lmao
looking for tutour now as my last stand.
Are you using it to AIM with your character?
What i am afraid is now I will equip some stuffs like Axe, Pickaxe, and i think i need custom animations or smth. IT needs to both look good in FPS and TPS. Because user is FPs but others see it as TPS..
And should also be replicated.. Do you think this setup would break my equipping etc. because arm will be playing a lot of role in here.
no idea, sorry.
❤️ Good luck on your journey mate. Maybe its to time to rest before thinking to give up mp journey, need clean mindset
What about gas do you need a tutor for?
Mostly looking for practices to use gas in the context of multiplayer.
I keep getting correction for not knowing what to do. E.g. hit react that is iniated by server.
I know this is a little obvious but have you seen how lyra makes use of GAS? I have a little bit of experience with it but I don't really have any projects that needs it so I am rusty. Wouldn't a hit reaction be some kind of gameplay cue locally an not a networked thing?
I need knockback with the hit react 😦
So server picks the montage to play and the resolve the location where hit actor should be
Sort of, I already have knock back "working" but for single player.
Unsure how to pass the parameter I need for client from server when using gameplay ability.
why do you want to use a GA for that ?
couldnt you just multicast the data to play the montage ?
Because I would assume the knockback is from some ability which is from GAS hence wanting to keep it all within the same replication framework
The video I linked uses a gameplay ability for the knockback so I would assume it works fine in networked context since they have replication policies and what not, as for the param thing you're talking about I assume you mean just extra data related to said ability right?
If so that is FGameplayEventData isn't it? (again I am super rusty though)
Maybe someone here would know for sure
damage is server side, I execute a hit react through Gameplay ability and Gameplay cue for the visual.
but when working with GAS, I don't think we are suppose to do our own RPCs?
they got a lot of things that already made for multiplayer but I am just too dumb for this.
I think I should just make single player game =(, today is soo demotivating.
Make a blank project where you can go ham on one feature without everything else distracting you. You'll get it, its just time
And yeah RPCs aren't supposed to be mixed and matched with GAS specific logic
Serious, a blank project might help a lot. You can break and fix things without worrying
Perhaps FGameplayAbilityTargetData might be better, read the comment if you haven't already @dark parcel
There are child classes to look at for examples of using it like FGameplayAbilityTargetData_SingleTargetHit
really appreciate the help.
so been trying to setup dedicated servers for my game i have the server being listed in my search box on mainmenu but when i go to join it i have my server crash.
so people say state changes should be done by repnotifys, but how do people work around relevancy then, if an actor is not relevant to a player , for example a ui update
is it then ok to just do a owning client rpc?
and the ui update is on the client not the actual actor itself
can you give an example
so for example when a building has finished build and the actor is not relevant updating the player controllers ui
so switchting from non build to build, and then it will display a category list
they have to be relevant for you to receive update accross the network.