#multiplayer

1 messages · Page 168 of 1

lament flax
#

well, depends of players and other moving stuff
but it will 100% change once or twice each travel

hoary spear
#

No prob at all

#

Getting them synced up etc might be but cant really see why

lament flax
#

so this means that i run the movement code

  • on each clients
  • on server

separately in parallel ?
this mean replication is set to off

hoary spear
#

The var would be replicated

#

Andnsome sort of smoothing would have to be implemented

lament flax
#

the logic is running a BT

hoary spear
#

So client catches up(or slows down) to sync with server

lament flax
#

making it replicated to somewhere would mean splitting me code more

hoary spear
#

Maybe im just incredibly naive and off the rails here

#

Never tried amything like this

lament flax
#

since its has ping

lament flax
#

i think the server is correcting the actor because it has a CMC

prisma snow
#

unless you modified it heavily

lament flax
#

i didnt modified it

#

well, this is causing lag on clients

#

idk why the CMC is correcting the client

#

the client isnt predicting anything since its replicating set location from server

prisma snow
#

that's what the CMC does by default - it handles replication of movement including prediction and smoothing etc.

lament flax
#

well, its following a (for now) static path
so idk how the client could error

rich crag
#

can anyone tell me why, when the server trace and the local trace land in the same location, that the server reports a hit on the other character while shooting over its head but the client does not. Why is the other character in the wrong place on the server?

thin stratus
#

Cause if not then the aim offset might not have an effect on the server

rich crag
outer sphinx
#

One question I want to create the same widget to make a small trading system between two clients, I am sending from the client to the server the creation of the widget by passing the player controllers of each one. The widget is only created when the client touches the server, but on the client it is not created and between clients it is not created directly because it has no reference to the widget. Do you have documentation and somewhere where you can learn about this well? thank you

twin juniper
#

if the cast to the character fails, what happen?

#

that might be the issue

outer sphinx
sinful tree
# outer sphinx One question I want to create the same widget to make a small trading system bet...

Controllers only exist on the server (which can also be the host's computer) and replicate to the owning client, so they cannot be referenced on other clients. Making a replicated variable trying to reference them will not produce anything usable on clients.

Widgets also do not replicate. Anything UI driven that needs to be replicated means you need to use a client owned actor to send data to the server, such as their player controller, playerstate, possessed pawn, or any replicated component attached to one of these actors, or any other client owned actor/replicated component.

limpid zealot
#

Hello,
Got a problem with the replication of my Widget.
https://streamable.com/145rq5
Here 2 screens where i put my replication :

Do you know what is the problem ?

#

As you can see, the widget only appears on the Server window, but not on the client window

#

Server on the left - Client on the right

fossil spoke
#

@limpid zealot Widgets do not support any form of replication.

#

Therefore, attempting to utilize RPCs within a Widget is futile.

#

If you examine your Logs, you will likely notice a Warning suggesting as much

#

You need to use a NetOwningConnection in order to call RPCs

#

A NetOwningConnection is any Actor that has an Owner chain that goes back to a PlayerController.

limpid zealot
#

i just dont want my widget s open for every player but just for the one called it

fossil spoke
#

So the easiest place to manage these RPCs would be in the PlayerController itself.

limpid zealot
#

oh

#

ok

#

i am going to try

#

thank you

limpid zealot
#

i explain :

#

there is an area with a trigger who detect the player character in the zone. and when the player enter the zone, the widget appears

#

i dont know what is the best solution to do it (i am beginner with UE)

fossil spoke
#

If you are new to Unreal and gamedev in general, I suggest that you dont start with Multiplayer.

limpid zealot
#

thank youfor your suggestion, but its my project

#

and that does not help me to say that

#

i just need some help to know more about this problem

fossil spoke
#

You can use the node IsLocalylControlled on the Pawn that overlapped the Trigger.

#

To only execute code for that Player.

limpid zealot
#

oh, i tryied this node, but that made the same 😢

#

when i use it, i dont have the message at all even on the server side

#

Here is my trigger box BP

#

more readable like it

fossil spoke
#

As I said earlier, in order to call RPCs the Actor needs to be a NetOwningConnection.

#

You also should not need any RPCs at all for this.

#

Check the pinned comments in this channel and read the Network Compendium.

#

It is the first pinned comment.

#

You are missing a lot of basic understanding about RPCs and replication.

limpid zealot
# fossil spoke You also should not need any RPCs at all for this.

oh, then why that doesnt work without rpc ? i searched on internet and i saw this video : https://www.youtube.com/watch?v=2GYicrkCElA&ab_channel=MattAspland . He explain how to solve this kind of porblem, thats why i decided to add rpc, but before i didnt apply rpc on it. So if you think that i dont need to use it for this, can you explain me how should i do to make it properly ?

Hey guys, in today's video, I'm going to be showing you how to replicate user widgets. This means you can display a widget on one players screen, or everyone's screen.

Blueprint Interfaces: https://youtu.be/m90ZkbtPA9s

#Ue4 #UnrealEngine4 #Ue4Tutorial


00:00 - Intro
00:...

▶ Play video
#

cause i already tryied with "IsLocalyControlled" and that doesnt work

sinful tree
limpid zealot
#

yes that's what I thought too, it reassures me in a sense to read that

#

but then why does it not work even if I don't use rpc, where does the problem come from in this case do you have any idea?

limpid zealot
sinful tree
#

This part right here is basically filtering your collision so that:

  1. Only BP_FirstPersonCharacters can trigger what happens next due to the casting. (The isvalid you have there is redundant as the cast would fail if it wasn't valid)
  2. Only allow BP_FirstPersonCharacters that are controlled by a player controller can trigger what happens next by getting the BP_FirstPersonCharacter's controller and casting to PlayerController. This would also prevent the trigger from happening on clients that do not own the BP_FirstPersonCharacter that is performing the overlap since PlayerControllers do not replicate, so it would return None on other clients.
  3. IsLocallyControlled ensures that the server itself can trigger what happens next but only in the case that it's their own player controller, while still allowing the client's player controller to trigger it on their end.
#

So, because you know that whatever is going to happen next is for sure being executed locally for the character that is performing the overlap, there is no need for any RPC after this part. Whoever needs to see the widget from this point should be able to create the widget locally.

#

If the below part happens shortly after the above, then what is probably happening is that you are getting a message in your log indicating something along the lines of "No owning client connection..." as you're attempting to call this Server RPC on something which doesn't sound like it would be owned by a client (BP Shoot Zone Trigger)

limpid zealot
#

Thank you for these explainations, so i try to understand. "IsValid" is not necessary after my character CAST ? then i delete the things about RPC

#

am i right ? or did i miss somthing ?

sinful tree
gilded vapor
#

Does using SteamAppDevID 480 work in packaged/shipping builds? (Just trying to test while I wait for the steam-page)

limpid zealot
limpid zealot
sinful tree
limpid zealot
#

ok, i try it right now

#

thank you

limpid zealot
#

here is my final blueprint :

#

thank you so much 🙂 guys

#

i learned things with your explanations

amber vale
#

Hey y'all, I have a function that I want to call when a player joins the game while it's in the "waiting to start" state. But the function requires a reference to the game state. When I call the function via a client RPC in PostLogin or HandleMatchHasStarted in the game mode, "GetGameState" returns a nullptr on the client, so I'm guessing the game state hasn't replicated yet. Does anyone know a way to do this to ensure the game state is valid on the client?

fossil spoke
#

There is no need for an RPC

amber vale
fossil spoke
#

Its been a very long time since ive looked at that code, so no, I couldnt tell you.

#

Sometimes Epic does things for strange reasons.

amber vale
#

Yeah, thanks!

twin juniper
#

Thing I learned doing local multiplayer #1001
When a map is re opened remove local players above index 0 so the game mode can create them again or else those local player ls will remain in the ether and mess up my logic based on local player indexing.

fierce egret
#

This works for server and owning client, but the other clients see the dead client fall from the world. If I stop disabling capsule collision, the problem is solved, but this time players can collide with capsule

#

Why is this happening?

fossil spoke
#

@fierce egret You likely need to disable Gravity on the CMC

#

You probably want to zero its Velocity as well.

fierce egret
fossil spoke
#

@fierce egret Calling DisableMovement might be enough

fierce egret
#

Disabling gravity or others didnt work

#

Thank you

summer orbit
#

I created a second controller in my level blueprint and used it to possess my second character; my "Print String" tells me the character is possessed. In the second character blueprint my "Print String" tells me the mapping context was added, but my other "Print String" tells me the Casting to the Player Controller failed. Even though I possess my second character and have assigned the Mapping Context for the input system, I am unable to move my character. Could someone help me, please? I've been struggling with this local player stuff for 4 days now!

UPDATE:
When I assign the character to P1 by possessing it using "Get Local Player Controller From ID” set to 0, it works fine. I can move it no big deal. However, when I assign it to P2 by possessing it using the 2nd controller I made, it no longer says the casting to PlayerController failed, which is weird, my print strings say everything's good, but I can't move my character.

uncut plank
#

Hello everyone, i wanted to ask a quick question, and i checked game BaaS spreadsheet but couldnt really get an answer

  • So we had our game backend ready and done on playfab and server hosted on it too
  • but once we started testing in closed alpha, we found that playfab servers might be very expensive for an indie game
  • so we decided to move the server hosting from playfab to another
  • but for our game system backend we haven't fully decided yet
    so my question is
  • if we have everything setup and ready on playfab, is there really another provider that would actually save us lots of money and we better start moving to it? if there is what would it be?
  • we are using cloudsripts/economy v1/ player profile
    any help is appreciated 🙂
mossy plank
#

Hi guys, I'm having an issue with the Net Dormancy of an actor. To improve performance by disabling the actor from replicating its properties, I set its Net Dormancy to Dormant All after a fixed period of time after spawning. When I need to destroy that actor, I set it back to Awake, and then destroy it. The problem is that Net Dormancy takes some time to take effect. And for that, I waited 10 seconds after setting it back to Awake before destroying it. Everything works fine when the server is good, but if there's a bad connection, the actor is destroyed on the server but may not be destroyed on some clients.

#

So how can I deal with that. Any help is really appreciated pikathumbsup

solar stirrup
#

However it should still destroy the actor even if it's dormant, sounds weird

mossy plank
#

The actor is actually destroyed on server, but it does not replicate back to client or something. It's still visible on client, but with no collision

lament flax
#

im having a hard time trying to figure out how to run an event only on client side when having a listen server

with a dedicated server i just had to get authority, but with a listen server the event is executed on server so it will impact other clients

thin stratus
#

You'd need to post the actual issue/code

snow trail
thin stratus
#

Without the actual issue at hand, you can suggest 50 things that would all work

snow trail
#

yeah thats true

lament flax
#

wait i didnt try owning actor

thin stratus
#

Who's "OtherActor"?

lament flax
thin stratus
#

Then yeah

#

Cast to Character -> Is Locally Controlled

#

Tada

lament flax
#

thats why i love asking questions

#

you get the answer while typing

thin stratus
#

Well you knew the answer. I already explained it to you last time (:

#

Bit of rubberducking helps yeah

lament flax
#

i never understood the meaning of rubberducking

#

for google it means debugging by talking or writing your code/issue

thin stratus
# lament flax i never understood the meaning of rubberducking

It can have different terms. But Rubber duck is the most common one.
It basically means that you debug something by explaining the problem and the current implementation to someone (the rubber duck).
One often finds a problem in the way one tried to solve the problem, simply by reiterating over what one has done so far.

#

Without the rubber duck even saying a word.

lament flax
#

yeah thats what i do when i go to the bathroom/cook/shower/sleep

thin stratus
#

It's a fun little concept that works more often than not. If you tried to do something and it's not working, going over it again, explaining exactly what you did, often makes you aware of why it's not working or makes you automatically talk about alternatives.

lament flax
#

or talking to my dad who is a software engineer

#

for my neighboor i might be a psycho talking alone

thin stratus
#

For me it's called Rubber Duck, cause I see it like people sit in the bathtub, talking to the yellow rubber duck that swims infront of them.

lament flax
#

yeah its a funny thing to visualize

#

well i have to cook rn, so i guess ill talk to my rice for debugging

thin stratus
#

It's a somewhat cool feeling when you realizes you solved the issue by just talking about it, without getting an answer fwiw

lament flax
#

or maybe the microwave

thin stratus
#

I heard the wooden spoon has some wisdom hidden

lament flax
#

because when you ask for help, you are forced to write all the process

thin stratus
#

Yus

chilly haven
#

Hi, is this summary accurate with respect to the server defines?

TargetTypes:
TargetType.Game - for single-player and listen server
UE_SERVER=0
WITH_SERVER_CODE=1
TargetType.Editor - for editor
UE_SERVER=0
WITH_SERVER_CODE=1
TargetType.Server - for dedicated server. Requires cooking.
UE_SERVER=1
WITH_SERVER_CODE=1
TargetType.Client - for standalone client (no listen server). Requires cooking.
UE_SERVER=0
WITH_SERVER_CODE=0

If so, it seems to me that using UE_SERVER=1 would make dev more painful because it only works on cooked content?
In my case I am not shipping a listen server, so plan to use WITH_SERVER_CODE, so that I can iterate without cooking, via the editor.
Makes sense?

meager spade
#

i use WITH_SERVER_CODE

#

or if stuff is dedicated server specific i use UE_SERVER

#

ie i use UE_SERVER to stop certain cosmetic stuff (that dedicated server doesn't need to do)

outer sphinx
prisma snow
young spoke
#

I'm getting segfaults when trying to do seamless travel in PIE in ue5.1. it works in packaged version but not PIE. seems like it's iterating over a stale world reference?

Unhandled Exception: SIGSEGV: invalid attempt to read memory at address 0x00000030002e0040

[2024.04.01-15.33.48:973][411]LogCore: Fatal error!

0x00007f8df58fdecd libUnrealEditor-UnrealEd.so!UEditorLevelUtils::ForEachWorlds(UWorld*, TFunctionRef<bool (UWorld*)>, bool, bool) [/UnrealEngine/Engine/Source/./Editor/UnrealEd/Private/EditorLevelUtils.cpp:1436]
0x00007f8df58fdfea libUnrealEditor-UnrealEd.so!UEditorLevelUtils::GetWorlds(UWorld*, TArray<UWorld*, TSizedDefaultAllocator<32> >&, bool, bool) [/UnrealEngine/Engine/Source/./Editor/UnrealEd/Private/EditorLevelUtils.cpp:1451]
0x00007f8df58b2745 libUnrealEditor-UnrealEd.so!UEditorEngine::CheckAndHandleStaleWorldObjectReferences(FWorldContext*) [/UnrealEngine/Engine/Source/./Editor/UnrealEd/Private/EditorEngine.cpp:7172]
0x00007f8dfd2f199e libUnrealEditor-Engine.so!FSeamlessTravelHandler::Tick() [/UnrealEngine/Engine/Source/./Runtime/Engine/Private/World.cpp:7231]
0x00007f8dfd0f911f libUnrealEditor-Engine.so!UEngine::TickWorldTravel(FWorldContext&, float) [/UnrealEngine/Engine/Source/./Runtime/Engine/Private/UnrealEngine.cpp:14176]
0x00007f8df588dd7e libUnrealEditor-UnrealEd.so!UEditorEngine::Tick(float, bool) [/UnrealEngine/Engine/Source/./Editor/UnrealEd/Private/EditorEngine.cpp:1773]


I'm calling ServerTravel() from my GMB.i have seamless travel enabled via cvar and transition map
any help appreciated

hoary spear
prisma snow
hoary spear
#

Guess youd need to check the parent class for that. Is it marked considered for replication/networking in the first place ? Can try to dig a little tonight ..

young spoke
#

you might need bNetLoadOnClient = true; in constructor

hoary spear
#

Not sure if APlayerController explicitly overrides this or not

#

Aicontrollers dont replicate so could be explicit..

#

Nvm its an actor so thats prob not it

prisma snow
prisma snow
young spoke
prisma snow
#

@young spoke Actually bNetLoadOnClient did the trick! Thank you very much, I was clueless hahah

young spoke
prisma snow
#

BTW is actor spawn location automatically replicated? My actor always spawns on 0,0 on client

young spoke
prisma snow
cursive steeple
sinful tree
# outer sphinx Thanks for answering, the client controllers are always 0, right? If I as a clie...

Actor references when passed across the network aren't referenced by those ID numbers. When something is first referenced across the network a unique net ID or something like it is used to associate future calls to that particular object allowing both the client and server to know exactly what object it is that you're attempting to reference.

The server would be able to determine which controller is yours by reference as typically all controllers exist on the server, but as the controllers are not replicated to other clients, other clients would not have a reference to your controller, so even if the server was trying to tell all clients "use this reference" of Client1, clients other than Client1 would basically respond with "I don't have it" and you would get "Accessed None" errors if you attempted to use it on those clients.

mossy plank
#

I also did some research and it seems like there's no callback when changing dormant value

#

except the one in UNetDriver

fossil dagger
#

Hello, this is my first time on this server.
I'm struggling on my animation blueprint. Is this normal that nothing seem to run on the client, but everything works fine on the server ?
Does the Event graph and the AnimGraph can even run on the client ? 😵‍💫

young spoke
prisma snow
young spoke
prisma snow
visual mountain
#

Just making sure I understand this premise correctly. If an item is added to an array, by default it fills the array index 0, 1, 2, 3 ect? And if so, does removing an item from an array work backwards in desceding order, 3, 2, 1, 0?

hoary spear
#

Yes to add

#

No to remove

#

Remove removes the first index that matches the argument/item

#

So if you have 0,1,2,3 and say remove(2) you now got 0,1,3 leftnin the array

#

3's index got shifted

frosty crag
#

I would like to have my pawn rotate facing my mouse and having it replicated. What is the good way to do it ?
I am having trouble to do it the client never really replicate correctly :/

dark edge
frosty crag
#

@dark edge character base class, the third person bp class you know

dark edge
#

what's the setup, 3rd person, top down, what?

frosty crag
#

@dark edge Not the top down just the regular third person I have just move the camera. If I do like you told me it work but my pawn always walk in the direction of my mouse, this is not something I waznt

#

I want to able to look forward and move backward you know

dark edge
frosty crag
#

@dark edge I am like this, so if I press S I always want to go down doesn't matter what my pawn rotation is

dark edge
frosty crag
#

no never

#

will always be like this

#

@dark edge oh ok I can unplug on the movement part ! But I can't manage to rotate the client I have done it like thuis

#

For the controller part :

#

OnrepNotify :

#

The bp of the pawn (the basic one, just renammed it baseclass)

#

the server does act correctly never the client 😦

valid chasm
#

Gus please do let me know if you have built some multiplayer games?

summer orbit
#

Can someone help me?

I created a Local Player with the Controller ID being 1.
I added Mapping Context with the Local Player as the Target.
I possessed my character using the created Player Controller.

The inputs don't work when PlayerController_0 is being used either.

Problem: My inputs don’t work and I can’t move my character.

keen condor
#

Hello , please i'm struggling with PlayMontageAndWait and Wait Gameplay Event , i've read tons of different sources but i can't manage to make them work,
I can do a properly replicated animation but the thing is that EventReceived is never triggered , if someone is up to tell mm few words that can unstuck me , it would be verry appreciated. Thank you again and sorry for bothering

bronze torrent
#

Hi, im currently working on a dash system using the launch character blueprint. All the code worked fine in singleplayer but no longer in multiplayer. The launch character bp is ran on multicast. When ran the game nudges the character forward and then back to the starting position. If any one has a solution please let me know

frosty crag
#

@dark edge Di you see what I did wrong ?

dark edge
frosty crag
#

@dark edge ok so what you mean by that ?

#

@dark edge you mean that I can't achieve to rotate pawn using player controller because remote client wont see it ?

ember prism
#

soooo im using this plugin called dynamic wall run and its not replicated so whenever player 2 falls in a client server theyre suspended in the air when they fall what do you think i should do to fix this bug should i replicate the plugin that allows this to happen or should i replicate the falling mechanic in alsv4 any idea helps dont be scared to chat i dont bite im just trying to fix the issue and im so dumb i cant figure it out

bright lynx
#

so i did a linux server target build, and the gameserver runs and boots up smoothly... and the clients can talk to the server. however the server cannot talk to the clients. All clients show no packets received.
For the sake of testing, the server has no firewall rules in place, and all ports are 1:1 mapped to the IP address.

[2024.04.01-23.12.25:849][805]LogNet: NotifyAcceptingConnection accepted from: player1ip:50262
[2024.04.01-23.12.25:849][805]LogNet: Server accepting post-challenge connection from: player1ip:50262
[2024.04.01-23.12.25:850][805]LogNet: IpConnection_2147482379 setting maximum channels to: 32767
[2024.04.01-23.12.25:850][805]PacketHandlerLog: Loaded PacketHandler component: Engine.EngineHandlerComponentFactory (StatelessConnectHandlerComponent)
[2024.04.01-23.12.25:851][805]LogNet: NotifyAcceptedConnection: Name: Arena, TimeStamp: 04/01/24 23:12:25, [UNetConnection] RemoteAddr: player1ip:50262, Name: IpConnection_2147482379, Driver: GameNetDriver IpNetDriver_2147482401, IsServer: YES, PC: NULL, Owner: NULL, UniqueId: INVALID
[2024.04.01-23.12.25:851][805]LogNet: AddClientConnection: Added client connection: [UNetConnection] RemoteAddr: player1ip:50262, Name: IpConnection_2147482379, Driver: GameNetDriver IpNetDriver_2147482401, IsServer: YES, PC: NULL, Owner: NULL, UniqueId: INVALID
[2024.04.01-23.13.24:756][567]LogNet: Warning: UNetConnection::Tick: Connection TIMED OUT. Closing connection.. Elapsed: 60.01, Real: 60.01, Good: 84.51, DriverTime: 85.85, Threshold: 60.00, [UNetConnection] RemoteAddr: player1ip:50262, Name: IpConnection_2147482379, Driver: GameNetDriver IpNetDriver_2147482401, IsServer: YES, PC: NULL, Owner: NULL, UniqueId: INVALID

I am at a loss for why. Does anyone have any pointers?

dark wing
#

does it happen?

bright lynx
chilly haven
young spoke
summer orbit
# summer orbit Can someone help me? I created a Local Player with the Controller ID being 1. I...

FINALLY I FIGURED IT OUT!! It took me 6 days for something so simple!! I overcomplicated the whole thing because for my game I didn't even need to use multiplayer and create a local player. I just used the Player Controller with index 0, two different Mapping Contexts and Inputs, then I called them and checked my Player Variables if P1 = 1 or P2 = 2 to excute the movement. I'm so relieved rn.

vagrant grail
#

is this event executed on client, server or both ? It's inside a player controller

fossil spoke
#

If you need an Event when the Pawn is possessed on the Client, use OnReceiveRestart

#

I think thats what its called

vagrant grail
fossil spoke
#

In the Pawn class

#

Not PLayerController

vagrant grail
fossil spoke
#

Search for restart

vagrant grail
fossil spoke
#

There you go

#

I was close

vagrant grail
#

I'm stuck for days about an issue where my client can't move but the server can, I have no clue why it behaves like that 🤔

#

Any ideas where to look for ?

fossil spoke
#

There isnt much to go on there.

vagrant grail
summer orbit
#

Question: Does the Player Index mean the controllers connected to the game? If I were to create a second player index (PlayerIndex_1), would that mean I would need to plug in to my pc a separate physical "xbox type" controller to use that player index?

vagrant grail
fossil spoke
#

There is a lot of bad practice here.

#

For example

#

Why is the GameMode, the PlayerController and the HUD all making changes to Inputs...

#

You are likely running into problems because you are confusing yourself, with all of the different places that you are making changes to functionality.

#

Multiplayer is not easy, you cant just throw things in random classes expecting it to work.

#

For example, you have in your GameMode a call to a function that is only executed Cosmetically.

#

You also have an RPC in the HUD class....

vagrant grail
vagrant grail
fossil spoke
fossil spoke
# vagrant grail Which one ?

SetInputModeGameOnly, the little Icons on nodes do mean things, you should be aware of their meanings and how they affect their operation.

fossil spoke
vagrant grail
vagrant grail
fossil spoke
#

Only PlayerControllers on the Client process Input.

#

The Server does not process input (unless its a Listen Server)

vagrant grail
fossil spoke
#

Therefore calling SetInputModeGameOnly on the Server, will only ever affect the Host.

#

Even then, you should not be calling that function from the GameMode

vagrant grail
vagrant grail
fossil spoke
#

Not where you are managing it isnt.

#

You should not be managing that in the GameMode

#

Separation of responsibilities.

#

Specific classes have specific roles.

vagrant grail
#

So all of these nodes should be deleted right ?

fossil spoke
#

Just because you CAN do something in a particular class, doesnt mean you SHOULD do it in that class.

fossil spoke
#

You really should be doing research and learning about proper OOP practices.

#

The GameMode class has a specific role, the PlayerController has a different specific role, just as the GameState and the HUD and the PlayerState all have different specific roles.

vagrant grail
#

And nobody is teaching things properly in the internet (tutorials)

fossil spoke
#

So instead of just randomly dumping things where it seems convenient, ask where the appropriate place to achieve X is.

#

Or search for resources that explain it.

vagrant grail
#

Then I will ask questions every 10 min 👀

fossil spoke
#

Nothing wrong with asking questions.

#

People dont do that enough.

#

There is also something to be said for trying to research it first yourself.

#

If you dont know what a class is for, go and find out.

#

There is plenty of documentation explaining the purposes of different classes.

vagrant grail
#

Does this need a server RPC to check if the player is the host or it's good like this in Client ? Because to me this code looks like it could be cheated but at the same time I don't know how a server RPC would be able to call Show / Hide Game Settings Menu which is in the HUD class which is set to Not Replicated and on the Client Only 🤔

fossil spoke
#

The Host of a Listen Server is a Server

#

So only the Host and a Dedicated Server would pass an IsServer check.

#

And since you are calling it from an Input Event, a Dedicated Server never fires Input Events because it isnt a Player.

#

So therefore only a Host would ever pass that check.

vagrant grail
#

but isn't the IA_GameSettingsMenu being called on the Client only ? As Server doesn't handle input ?

fossil spoke
#

If you want to be extra safe you can if(IsServer() && !IsDedicatedServer())

fossil spoke
#

The Host is not considered a Client

#

But input isnt processed on the basis of the network context being a Client

#

Its processed based on being a Player

vagrant grail
#

Here's how it's in my mind currently. For the host there will be no issue because he's the server. However, other players are clients and when they press that Input Action, it will go to the branch, there the Is Server will be checked and technically it will return false however I'm thinking that it's possible to cheat that as it's executed on the client making the game think that value return true and it opens that menu for them.

The only exception to that would be that the Input Event is executed both on server and client (and from my understanding there are 2 copies of the Player Controller, 1 on the client and 1 on the server and the checks is done both on client and server and the server one override the client one as it's authoritative but then that changes the first assumptions about InputActions handled only on the Client 🤔 )

fossil spoke
#

At your level I wouldnt concern myself with worrying about cheats

#

Focus on understanding how to build a multiplayer experience first

#

Getting sidetracked with whether or not your code is cheat proof, is just going to waste your time.

#

Focus on the fundamentals and getting those right first.

vagrant grail
#

Alright, so this is good now ?

fossil spoke
#

Sure, if you only want the Host of a Listen Server to execute that code, it looks good.

vagrant grail
#

Awesome, next thing to fix ?

fossil spoke
#

You need to totally rework all of the different places you are managing Inputs

#

They are a mess.

#

Funnel all input changes through the PlayerController from a single function.

#

That is fit for purpose.

vagrant grail
fossil spoke
#

One of the responsibilities of the PLayerController is processing and managing Inputs.

#

You should strive to maintain separation of responsibilities where possible.

#

Meaning, that if there is a class responsible for something specific, you should try to architect your code so that it adheres to that principle.

#

So if you need to manage inputs

#

And the PlayerControllers purpose is to do that

#

Pipe all input management code through the PlayerController

vagrant grail
#

Including the cosmetic ones ?

fossil spoke
#

The HUD is responsible for UserInterfaces

#

So the HUD should be managing those.

#

And offloading management of Inputs to the PlayerController

fossil spoke
#

User Interfaces and Inputs are all "Cosmetic", they only affect direct change on a Players machine.

vagrant grail
#

I'm so confused

fossil spoke
#

Opening a Menu, typing into a text box... etc etc

fossil spoke
#

Multiplayer is difficult.

#

Singleplayer you can just do whatever you like really...

vagrant grail
fossil spoke
vagrant grail
# fossil spoke Yes

Thanks 😄 So If I understand correctly, the Input should be detected in the player controller and that should modify the player inputs if needed then call events on the HUD if the thing is related to UI stuff

fossil spoke
#

UI should only ever react to changes in data. It should never change data directly outside of itself.

vagrant grail
#

Interesting

fossil spoke
#

It can inform other systems of desired changes.

#

Like, switching to a different Skin or something

#

But it shouldnt be the thing that manipulates whereever you store that Skin data

#

Thats probably a shitty example.

#

But hopefully that makes sense.

vagrant grail
#

Yeah a bit better

jolly nymph
#

I need your guide, it's recommended to use actors child for a multiplayer game? Because when I use the BP Actor my game runs well, but if I use a child, my game doesn't work well

mint stream
#

I'm running into an issue with trying to replicate a gameplay tag in a GA so that it triggers a state in my ABP.

if (GetAvatarActorFromActorInfo()->HasAuthority()) {
      LocalASC->AddLooseGameplayTag(ZSGameplayTags::Character_Rifle_Equipped);
      LocalASC->AddReplicatedLooseGameplayTag(ZSGameplayTags::Character_Rifle_Equipped);
    }

This was the only work around I could get working, which seems completely wrong. Initially, the replicated version has the animation working between clients, but the server sees none of the animations. Then when I add the non-replicated version, I see the animations for all clients and servers. I have the tags mapping to bools in this variable FGameplayTagBlueprintPropertyMap GameplayTagPropertyMap; that lives in the anim instance class. Any ideas why it acts this way and how I'd go about fixing it?

fossil spoke
#

Why not just setup test cases for both scenarios and profile them both?

#

If the team cant understand setting up tests to profile different approaches, how are you going to achieve a " Large open-world game on dedicated server, about 100 player server cap, complex movement and combat systems. Fast-paced. A huge amount of world objects can be interacted with" game?

#

Open world isnt easy.

#

100 Players isnt easy.

#

Perhaps you need to consider constraining your vision a little to match the skill set of the team?

#

My opinion is to limit your scope to what is achievable. You will have a much more enjoyable dev experience than taking on something you are highly unlikely to succeed at.

#

And when I say "you" I mean the entire team.

#

Fair enough. I cant make you do it lol

#

But it would make sense to profile these as test cases.

#

They shouldnt be hard to setup.

#

Assuming the Tracing is happening on the Client only, it will likely be the more performant solution. You can even async trace if you are concerned with Perf, if you can deal with a frame delay in the result.

#

As i said earlier though its always best to test performance on these types of things, especially in large projects, if you are targeting 100 Players you are going to need every bit of perf you can get.

hoary spear
#

Couldnt you just verify on the server ?

#

Client traces -> thinks it can interact

Client interacts -> server checks/verify with a trace or distance check or smth, then go with it if all is ok?

#

Lag could be an issue i guess

fossil spoke
#

Again, best to profile each case. Then you will know definitively which is more performant.

hoary spear
#

Personally id never touch an mmo project with an unexperienced team 😅

frosty crag
#

Guys I am trying to rotate my pawn facing my mouse and having it replicated, I am doing it with the control rotation in the player controller, it works only on the server I don't get why any ideas ?

lament flax
#

In my project, when player press the use key the server does a linetrace

On the focus system (that is looking for usables items) i am doing the linetraces on clients, since they are used for decorative gameplay

lament flax
#

Also, show the code that rotate the pawn

hoary spear
#

would be my thought anyway

#

wether it actually saves sorta depends

hoary spear
#

Not sure if it'd work seamlessly tho

lament flax
#

I thought it was 1 linetrace per "use" key or whatever

hoary spear
#

Im not sure how much it actually would matter tho

#

the user experience waiting for the RPC to return sounds rather bad

frosty crag
lament flax
hoary spear
#

I agree, it does sound weird

#

i havn't really given it much thought

#

personally i just linetrace on server

#

but then again im not ||((((currently))))|| aiming for 100 players

lament flax
frosty crag
#

@lament flax I thought if pawn is replicate I just had to set rotation in rpc server but doesn't work

nocturne fiber
#

Hello, I'm working on a multiplayer project and I'm struggling to learn how to manage the client/server logic.
someone have a good complete tutorial to understand this?

#

thanks in advance

hoary spear
#

Check the pins in this channel

#

Cedrics network compendium is a great start

#

Read it atleast 6 times

nocturne fiber
#

thanks

west kite
#

Does anyone know if the Unreal Water Plugin is replicated/if its able to be replicated semi simply? 🙂

nocturne iron
#

My client does not load large parts of the level (using world partition). Seems like the same problem from June 2021: https://forums.unrealengine.com/t/world-partition-still-makes-client-fall-through-tile-if-walks-far-enough-from-host-multiplayer/236283

Does anyone know why this might happen? How does world partition work with muliplayer?

Epic Developer Community Forums

In UE4 World Composition, if the listen-server and client are on tile 1, and the listen-server walks far enough away to unload tile 1, the client will fall through the tile. And this also happened in UE5 World Partition, but it took much more distance compared to UE4. How does a game like Valheim (Unity Engine) manage to make its client go far f...

hoary spear
#

sounds like some of the settings could be usefull

#

Havnt gotten to that part of our dev cycle yet so havnt had the need to dive into it yet

unique forge
#

Hi

#

Um i have the steam advanced session plug-in and I would like to know if I can only make steam friend list and invite by only using the steam overlay itself.

#

Like you click on the invite button and then steam pops up with the friend list

glass linden
#

Hey, I'm hoping someone can help me understand network ownership a bit more clearly - I get that actors can't send RPCs unless they are owned by something, so for example if a player picked up a gun then that player could then own the gun, and do it that way. But what I don't understand is what about actors that are just in the scene? Who is supposed to own them?

For example, lets say I make an obstacle which is a wall slamming down on the player if they run under it at the wrong time. Now I understand that this should be done on the server, however what if we wanted to make it so that the clients can press a button which changes the colour of the wall for all players. Who would own this? Would you set the owner of the object when setting the colour?

Surely if we take that approach and change the owner every time the colour is changed, then this wouldn't work as the owner has to be set on the server, and thus the server function to change the colour and set the owner wouldn't be processed.

Please could someone help me understand this?

hoary spear
#

Server owns the unowned

#

Its one of the 'gotchas' while doing multiplayer

#

So to run a server event on an unowned actor you would need to RPC to the server on a client owned actor (typically PlayerController or Pawn) and invoke the server owned actor from the 'server side'

glass linden
#

I see, so essentially pass through the player controller for example to reach the server?

hoary spear
#

One of my last takes on this was related to our dialogue

#

Shared a silly flowchart about it

glass linden
#

haha silly flowchart sounds good

hoary spear
glass linden
#

hmm okay

#

that is useful, thanks 🙂

hoary spear
#

Hope it helps 🙂

glass linden
shrewd ginkgo
#

when the game starts, I want to select one of the players as the killer and store it as a bool. how do I do this?

#

I want to use the is murderer? bool that I assign to the murderer as a prerequisite for using special skills

dark edge
#

You wouldn't have a bool IsPresident in USACitizen class, you'd have a variable of type USACitizen called CurrentPresident. Hopefully that explains the differences between the approaches.

hoary spear
#
bool IsPresident(const USACitizen* Citizen)
{
return Citizen == CurrentPresident;
}
frosty crag
#

@dark edge sorry to bother you, I'm still struggling with my rotate pawn 😅

serene furnace
#

hello I got a general question on "how multicast works"

If I multicast, it will just cast on all machines, no matter what, no matter the distance of the players, so even a player across the map will display a VFX for exemple and have performance impacted no matter what ?

Or is there a distance / visibility restriction when using it ?

dark edge
serene furnace
#

heh ?
What happens if it relevant or not ?

wintry vector
#

Anyone have any ideas why simply adding a branch to a multicast function stops it running for both server and client?

meager spade
#

show code?

serene furnace
#

error : access "none trying to get "variable" info" error ?

dark edge
#

Actor A is a replicated actor, and it's relevent to clients 1, 2, 3, but not 4

#

The serverside version of Actor A calls a multicast

#

The clientside version of Actor A will fire for clients 1, 2, 3 but not 4

#

since Actor A doesn't exist on 4

serene furnace
# dark edge The multicast won't happen because the actor doing it doesn't exist

okay, but then what happens when you do multicast, My question is just " does multi cast has any optimisation into it, or will it just cast on all machines no matter what and be garbage in terms of optimisation" ?

I'm assuming thing should exists on all clients if they are important enough to be replicated ? or should you make a system that makes it relevant only at a given distance ? but then how to recover the state of the actor when it becomes relevant ?

dark edge
#

the distance relevency thing is already built into the engine

serene furnace
#

oh i see, so the optimisation is not into the "multi cast" but into the revelancy code itself

dark edge
#

If grenade explodes next to me -> I see it
if grenade explodes on the other side of the map, -> I don't

#

unless I do

#

that's all up to the designer and the relevency criteria

serene furnace
#

where can we see those revelancy settings and stuff ? into the actors directly ?

dark edge
#

yes they are properties of actors

serene furnace
#

saved to favorite for further understanding, thanks

#

I dont need it like Right now, but I was wondering is Multi cast was actually a good Idea

unique forge
#

hellow there

#

somehow the other player sees it but the other not

serene furnace
#

I guess you could add a "revelancy switch depending on distance between the actor and the players into a collision sphere" to manually disable things, or just use the revelancy settings for VFX actor to dont display from super far

serene furnace
unique forge
#

server can see it

#

but client not

serene furnace
#

also 100% it's a replication issue

unique forge
#

if server uses too

#

server cant see

#

client can see

serene furnace
#

what are you using to replicate ?

#

something not appropriate or not properly replicated surely ^^

There is lots of ways to replicate things in unreal

dark edge
unique forge
#

but its strange

dark edge
#

it's state

unique forge
#

if its like that, i can see it everyone can see it

#

like flashlight isnt connected with camera, then it works nomrally

serene furnace
#

yeah the rep notify would be nice for that, rep notify the "On" variable, if ON, set visibility, if Off set visibility

#

to trigger a rep notify, and variable replicated need to change, not just be called BTW

unique forge
unique forge
#

with the camera

serene furnace
#

might be due to parenting to a camera, then ?
Have you tryed to just parent it to the charactere mesh ?

#

parent it to the same things than the camera is parented to ?

unique forge
#

yea

#

no success

#

never had that issue

serene furnace
#

i'm assuming when you parent, it's taking a replication of the parented thing, or, the light is into the mesh, and "Owner no see" makes it that the light goes trough the head on there own side

#

and you just need to move the light out of the body x)

unique forge
#

doenst make sense when the result is like that

unique forge
serene furnace
#

ah yeah i guess your right, I would try rep notify tho

#

way more appropriate for that

unique forge
#

is that a plugin?

serene furnace
#

less chances of weird issues as well, no it's a basic feature, you select a variable go into replication, and select "Rep notify" and then each time the varable changes, it's sending the info to all machines

unique forge
#

i made a new bp character and readded all the old stuff from the old bp character#

#

now it works

#

like bruh

serene furnace
#

there is no magic into unreal engine, only parameters that are not working the way you thought, thats what I learn about unreal engine in a few years lol

unique forge
#

xd

serene furnace
#

so the new BP probably has a default settings that lets you do what you want, and the customized one has an option, somewhere, somehow, that creates an issue x)

wintry vector
#

Anyone know a way around allowing a multicast function to call both server and client whilst the game is paused? (the server side only runs)

lament flax
#

well first, why would it not work by default ?

wintry vector
#

I have a multicast function, that I realised, doesn't have the client call when not pausing the game during server call. If I have the game pause during the server call, the client gets called

#

I have no idea why it wouldn't work by default but that's what I've found when debugging

hoary spear
#

Cant find anyone else mentioning this with my google-fu

frosty crag
#

I repost a question here cause I didn't figure it out :
I am trying to rotate the pawn I am controlling facing my mouse, and having it replicate on clients and server, I tried to do it from the controller by setting the control rotation but it didn't work on the client, any ideas guys ?

gloomy tiger
wintry vector
gloomy tiger
#

What's the actor in which you're calling this Multicast RPC from?

hoary spear
#

Trick is to never pause the game

#

Set global time dialation to 0.00001

wintry vector
gloomy tiger
wintry vector
gloomy tiger
#

You probably don't have anything ticking on the GameState, so you good - unless you have 481294814 billions trillions replicated properties that might compromise paused-game experience

#

But in general, whatever

wintry vector
#

Thanks for the info it's much appreciated! 👌

hollow bridge
#

How can I reduce "Consider Actor Time" in tick? Is it related to Net Update Frequency?

frosty crag
#

Does the rotation of pawn is replicated ?

heady pewter
#

i just got a basic 2d fighter game set up, most of the game mechanics are there and now i want to start to add in the multiplayer part, so far the plan is to do local play and i really dont know here to start any tips?

hoary spear
frosty crag
#

Ok I find something can someone explain me why if I do like this : its all replicated correctly, I don't even change the control rotation server side ? But if I put the RPC server side it doesn't work for the client

#

how is it possible ?

#

the thing I don't like but doing this is that I get the player pawn location client side which technically can't be trust no ?

dark edge
#

I think it's just yaw but I'm not 100% sure

dark edge
frosty crag
#

@dark edge I am trying to rotate the pawn I controll facing the mouse cursor

#

@dark edge And like I did it seems to work properly, I was just concerned about doing this client side and not server side

frosty crag
#

@dark edge Character

dark edge
#

look at the example projects

#

just adding controller yaw/pitch or setting control rotation on client should be enough

frosty crag
#

@dark edge That's what I do

#

@dark edge And like I said it worked

#

@dark edge Its just weird to do it client side

dark edge
frosty crag
#

@dark edge Of you mean the custom event part ? yes of course I was trying to do it on serveur that's why I got an rpc, but for the rest I have to keep my hit under channel and the look at rotation

gloomy tiger
#

I find it so funny they ping you in every message lol

lament flax
#

kinda abusif

#

at some point i would stop answering

shrewd ginkgo
hoary spear
#

Yes

#

You are wrong

#

Server has its ownnset of pawns

#

Clients may "own" them, but server also got them

visual mountain
#

I have a listen server running, and the client can join via another computer in the same house, but I can't seem to get it to work the same way through steam online with someone somewhere else. Anyone know of common things that may be preventing it from working online?

dark edge
vagrant grail
#

Anyone bought one of these pack and have some feedback on if it's good or not ?

fossil spoke
#

We use the EOS Online Subsystem product.

#

I recommend it to everyone.

solar stirrup
#

^

#

EOS Online Subsystem is golden

#

Haven't tried the rest but if they're as good as that one, they're awesome

#

lots of good support too

vagrant grail
#

@fossil spoke @solar stirrup But there are multiple and I'm not sure to understand what are the differences between all of them.
And also it looks a bit expensive, when will be there discounts ?
Is the documentation good, as the reviews on the product page talks about bad documentation 😬

solar stirrup
#

uh, depends on what you want to do?

#

Just grab whatever you need

#

Also: there's a free version of the EOS one

vagrant grail
solar stirrup
#

Yeah we figured DogKek

vagrant grail
#

Ask me questions it will be easier

solar stirrup
#

Do you need those packs?

vagrant grail
#

I need to make my game compatible with all platforms

solar stirrup
#

The EOS plugin is good then

#

there's a free edition just use that during development

fossil spoke
#

If you dont know whicj of those packs you need. You dont have the experience to use them.

#

I would hold off on buying any until you have a better understanding of multiplayer and sessions.

solar stirrup
#

^

fossil spoke
#

They dont just magically make it work. They still require some effort to utilize correctly

vagrant grail
fossil spoke
#

Trying to speed up the process when you dont even understand whats involved is actually going to make it take longer.

#

Learning these things doesnt happen overnight. You need to come to terms with that and take the time to correctly learn these things.

#

I believe there are free alternatives to the features these packs provide.

#

You maybe better off trying those first instead of buying something expensive you might not be able to take full advantage of.

vagrant grail
fossil spoke
#

Try the free alternatives first.

vagrant grail
fossil spoke
#

I dont know, do some research?

quasi tide
#

Based on your questions Diversity, you definitely need more experience. The way I did it was to just remake super small games in multiplayer. And each time focus on one aspect. Then I'd redo it all from scratch again and focus on something else, while also including the previous. Of course it wasn't the same small game each time.

What this made me do is have to wire everything up each time, through repetition. It isn't a one & done type thing.

fossil spoke
#

They do exist.

vagrant grail
quasi tide
#

I did upwards of like 20-30 little game prototypes. All while also constantly referring back to the network compendium

quasi tide
#

Make a collectable game

#

Just run around and collect coins

#

Make one where you have to run around and open doors in a specific sequence

#

Make one where you have to jump through hoops

#

Make one where you have to attack a wall

#

Make one where you have to run through different terrain

#

Make a wave based shooter

#

Make a tower defense

#

Literally anything

#

And just make it MP

sinful tree
#

~Make an MMO~

vagrant grail
#

but those are more like mechanics than a full small game 😬

quasi tide
#

So?

vagrant grail
quasi tide
#

The point isn't just to make a full game

#

You still have to set up replication

#

You still have to set up RPCs

vagrant grail
# quasi tide So?

I prefer making a small game than mechanics because it's not that fun to do mechanics only 😬

quasi tide
#

You still have to handle login

#

You still have to learn about all things multiplayer

#

It's just faster to do it than to do it once per game and that game takes like 4 months to make

vagrant grail
#

I already did the login thing in my game using sessions so that part is ok

quasi tide
#

Do it again in a different game

#

If you can't - then you didn't learn it

#

Doing things multiple times is what builds the understanding. Not once every X months.

vagrant grail
#

ah

#

I wanted to make an among us like but it looks that's already pretty difficult 🥲

quasi tide
#

Then you need to scale back

vagrant grail
#

yeah that's why I need ideas of smaller games 🥲

quasi tide
#

I just gave you a whole list of things you can do

#

If you wanna reject them, so be it

vagrant grail
#

but those are mechanics ideas and not games 😦

quasi tide
#

And all of these things are things I've seen you struggle with time and time again

vagrant grail
quasi tide
#

Not familiar with the game and not going to look it up.

#

But it'll probably take you too long to solidify concepts

#

Which goes completely against what I'm trying to tell you

#

Obviously do w/e you want.

maiden flame
#

Diversity, you could try using Advanced Steam Sessions for starters, to test out your listen server with someone. It's a fairly simple subsystem to use for multiplayer. You can try to make a small game as a project to learn from, even if if multiplayer will add a level of complexity.

vagrant grail
cursive steeple
dark edge
#

Functionality plugins are in a weird spot, because you either don't know enough to make them, implying you don't know enough to realize how bad they are or to adapt them to your needs, or you do know enough, not needing them.

vagrant grail
dark edge
#

ok so go do it

#

without functional asset packs

cursive steeple
#

I think where these plugins shine the best is where you'd know how to make them for the most part, but you'd have to throw shitton of time at it, so you'll just save time by having it ready made.

dark edge
#

If you get in a pinch, and you know WHAT you have to do, but don't have the time or technical expertise to really pull it off, then consider them.

vagrant grail
dark edge
#

I use the low entry library and other utility stuff like that sometimes but I'd never ever use a game mechanics pack

#

they are almost all ass and horrible to integrate with other mechanics

cursive steeple
# vagrant grail No, like in terms of fun and motivation I prefer having mechanics that would be ...

You got some random ideas cz you asked for some. You're free to come up with your own feature ideas that are interconnected. Noone can read your mind about what exact features you'd enjoy (or not), so this is where your effort comes to play. Sit down and think of some that sound fun. Maybe analyze your favourite games and see why exactly they are fun to play. The point is to divide the whole process into smaller chunks, simpler features, and go at it one at a time. See where you get stuck and need to spend more time.

cursive steeple
dark edge
#

And they are just code written by somebody, you have no idea if they're good or not

vagrant grail
quaint rain
#

Is there a way to make a server actor always relevant to a specific player?

fossil spoke
quaint rain
#

Thanks Matt. I'm a c++ newb, but how might that work? Based on the UE doc for IsNetRelevantFor, it just returns bool.

fossil spoke
#

What are you trying to achieve?

#

Why do you think you need an Actor only relevant to a specific Player?

quaint rain
#

My game is a persistent world survival; multi-unit management. I am using the server to manage all of the pawns to perform tasks while the player is offline.

The game world is large, and I'm wanting the player to assign pawns various tasks while the player is online; the pawns run off and do the things. I'd like the player to be able to snap to a desired pawn.

I have a GUID system tracking the pawns on the server. And I pass the player a list of units they "control" by GUID when the player logs in.

So the player has a GUID. Player can give server a GUID and the server can run a lookup on a unit array that I am keeping in the game mode,. The server retuns a location to the player, and moves the player's camera to that location.

But this feels messy.

fossil spoke
#

Do you know what Network Relevancy is?

#

Because given your description above it sounds like you are asking for something else.

#

That system you just described doesnt sound unreasonable.

#

The only thing I would probably change is instead of using a GUID, I would tag the Pawn with the UniqueNetId of the Player that owns it.

#

A UniqueNetId is a platform ID that uniquely identifies a Player. An example would be your Steam ID.

#

That way you are absolutely making sure they are unique.

#

How are you associating the GUIDs with a particular Player if they go offline?

quaint rain
#

Right. I've somewhat abstracted that. I use GUIDs for the pawns, and I use the UniqueNetId to determine which GUIDs belong to which player.

fossil spoke
#

Ok cool.

#

Why do you see that as messy?

quaint rain
#

Lack of confidence in my architecture. This is my first game.

fossil spoke
#

Fair enough, thats natural.

#

The idea is fine.

#

Maybe you might want to refactor it from scratch. This is a common process that systems go through.

#

Since you gain insight you might not have considered on a previous implementation, that you can then introduce to make the next iteration better.

#

It is very beneficial to practice this.

quaint rain
#

Haha, yeah - feels like every week I refactor something I did a few weeks before.

fossil spoke
#

Thats normal.

quaint rain
#

Really appreciate the help btw,

fossil spoke
#

As you gain experience (which doesnt happen overnight BTW) your designs, ideas and initial implementations will naturally become more robust.

#

Breaking down your systems into smaller parts that you can design and implement somewhat independently from the broader system is useful.

#

You can start asking questions like.

#

"What is the most achievable vs robust way for me to implement X".

#

Then you can ask.

#

"How does that implementation of X change how I need to deal with Y"

#

Etc etc

#

Taking them piece by piece.

quaint rain
#

That's really good advice.

fossil spoke
#

Instead of asking something like "How do I build an MMO".

#

Which people do more often than you would think.

#

If you run your previous described system above through that thought process, its not difficult to come to the same conclusion you did in your implementation.

#

"How do I uniquely associate Pawns to a Player that goes offline"

#

That leads to questions like.

#

"How do I uniquely identify an Offline Player".

#

"Can I use that to make an association with a Pawn while they are Offline"

#

UniqueNetId is the answer

#

And thats what you did.

#

What might feel messy is your implementation of that overall idea.

#

But the idea is sound.

quaint rain
#

I guess to jump back to my question on relevancy.

I should note that my camera is isometric fixed and I am using that to keep my net cull very low (I'm concerned about server costs).

I'm wanting to build a UI that reads data from the player's actors who might be outside cull. So if I could make the player's actors always relevant while the player is online; I'd be able to stream data faster (I think?).

I'm using GAS for attributes, but right now I am storing inventory and equipment as actor components. I'd like to be able to manage those components while the actor is outside of cull .. but maybe RPCs are the answer to that.

#

Funny how the solutions come while writing down the actual questions.

fossil spoke
fossil spoke
#

That sounds like something you would just have on a PlayerState?

#

If you are running a simulation while that Player is offline and you need to display that persistent information, you may need to come up with a concept of something like a "Persistent PlayerState"

#

Which shouldnt be difficult.

quaint rain
#

Hmm, what would that look like?

fossil spoke
#

Off the top of my head, that would probably be just extremely similar to how PlayerStates are managed as they are now.

quaint rain
#

Right now I am using pawns to hold all of the data and logic; as they are all server-owned anyway.

fossil spoke
#

Instead of a PlayerController owning them, it would just be a UniqueNetId that owns them.

quaint rain
#

Oh that's an interesting idea.

fossil spoke
#

That way the simulation can continue when the Player they belong to goes offline.

#

Leaving others to still view that changing data.

quaint rain
#

I have an ai controller managing a BT while the player is offline.

fossil spoke
#

Sure, thats just part of the broader concept of "simulation"

#

But yeah, sounds to me like you need something to the effect of a "persistent PlayerState"

#

As PlayerStates are destroyed when a Player leaves (not technically true, but the effect is the same).

quaint rain
#

And these "Persistent PlayerState" would all be relevant to each other, yeah?

fossil spoke
#

They would follow the same rules as a regular PlayerState, except they wouldnt be removed when the Player leaves (thats the persistent part, so the simulation can continue to contribute to them and others can view that data).

#

And they would be associated by a UniqueNetId instead of a PlayerController.

quaint rain
#

I suppose I don't really know what the player state can do or is for. Homework!

fossil spoke
#

Yeah you definitely need to know what the PlayerState is.

#

I feel like you are missing a lot of fundamental basics about Unreal.

#

Please read the Network Compendium, its the first link in the pinned messages on this channel.

#

Read it 3 times.

#

At least.

quaint rain
#

I've got that boookmarked. I know the basics of player state; I just don't understand why they would be better than using my pawns.

fossil spoke
#

Because the PlayerState is always relevant to every other Player

#

Pawns can move in and out of relevancy.

#

So if I was building a persistent RTS for example

#

Where a set list of Players can actively move in and out of that session over time.

#

And their "base" and all their "units" continue doing tasks while they are gone.

#

Information that I need other Players to know about, i would put on the PlayerState.

#

But because the PlayerState only sticks around while im inside the session

#

Thats a problem for the offline component

#

Where the simulation needs to continue

quaint rain
#

I see what you're saying. I've been avoiding the player state out of fear of overloading my server.

fossil spoke
#

There is no sense in optimizing an initial implementation

#

As its highly likely you are going to scrap at least 90% of it by the time you are done anyway

#

Optimizing something you are going to scrap is just wasted time and effort.

quaint rain
#

Well, I see it as time spent learning - not wasted. But I catch your point.

fossil spoke
#

Optimize when you are satisfied that the implementation is robust enough in features to carry you through production.

#

Wasted might be harsh for a beginner sure.

#

But when you know what you are doing, it does just become a waste

#

The point being, its less efficient

quaint rain
#

I know there are a lot of factors, but how many concurrent players would be a good target for a beginner's dedicated server?

fossil spoke
#

2

#

Yourself and someone to prove you can connect with on a dedi server 😛

quaint rain
#

haha, I've got that far already.

fossil spoke
#

Seriously though, thats hard to answer

#

As it depends a lot of the type of game you are going for, its features etc etc

#

Typically, most new people on here have very very very big dreams

quaint rain
#

I am one of those people.

fossil spoke
#

My usual advice to them is to take whatever scope of work you have, want to achieve or think you can achieve and cut 80% of it.

#

Be so realistic about your chances of achieving something that it feels like you are building barely anything

#

Limiting scope is one of the hardest things to do.

#

The reality of building something always takes at least twice as long as you think it will.

quaint rain
#

It is, I'm just working an a vertical slice. Only 4 months in, but dang proud of everything that I've managed to cobble together so far.

fossil spoke
#

The best feeling is finishing something you set out to achieve. The worst feeling is toiling away not being able to see the light at the end of the tunnel because you had rose colored glasses on.

quaint rain
#

Any thoughts on how I could test server capacity; without 20 friends? Would I just add a bunch of ai units running around and doing things?

icy jetty
#

That won’t do it, you need to simulate ping

fossil spoke
#

But I cant really give you an answer on that specifically.

quaint rain
#

Thanks Matt, appreciate you helping me out.

vagrant grail
#

@fossil spoke I modified the code from the BP_HUD handling input and handled all of the input stuff in the player controller like you suggested me to do yesterday, what do you think ? Is it good ? Or are there other things i should modify 🙂 ?

fossil spoke
supple junco
#

When creating a multiplayer lobby, is it common to have a custom controller just for the lobby level? (It's a UI only lobby). If you use the general player controller for the rest of the game isn't it much more messy?

vagrant grail
fossil spoke
vagrant grail
hoary spear
#

That doesnt really solve the core part of it

#

Theres gonna be new questions every time things start going south

#

And you're relying on others being able to help you out

#

Multiplayer is a pretty big endevour

vagrant grail
hoary spear
#

Solving them yourself is usually a much stronger learning experience

#

Theres also other ways to learn, like reaeing up on some of the avaliable material

vagrant grail
hoary spear
#

Network compendium, frameworks, unreal replication system

dark parcel
#

At best u will get answer for one line question for multiplayer

#

If u hit a wall on your system with something like u present just now, chances are no one will able to help you

hoary spear
#

The sooner you grasp it the better time you will have

hoary spear
#

Because it usually gets way to specific

vagrant grail
hoary spear
#

Only answers left to give is "you gotta debug"

dark parcel
#

It will be question after question as in after x, how do I do Y

hoary spear
#

Just my 2 cents, do with it as you wish

dark parcel
#

Me too

hoary spear
#

I can understand the urge not wanting to shelf or give up.

#

But there is a third option

dark parcel
#

I wish you all the best with your game ofc but if u haven't make a complete single player system, you are taking a leap of faith here

hoary spear
#

Parking it

vagrant grail
# dark parcel It will be a hand holding session and No one will do that

Depends, like yesterday I had an issue with Players not being able to move while others were able to, then Matt made me understand that Player controls should be handled exclusively in the Player Controller, and from that I learned an important information that I will remember for the rest of my projects, then I started refactoring my code to apply his advice and came back today with the new code and he said it's way better.

hoary spear
#

Take it from someone setting out with multiple overscoped projects under his belt

vagrant grail
hoary spear
#

Encapsulation

fossil spoke
#

You absolutely need to research OOP principles

hoary spear
#

Makes sense^

vagrant grail
hoary spear
#

Theres like 20-30 highly relevant core classes

vagrant grail
fossil spoke
#

If you believe that you are already way in over your head with your current scope.

#

Dial it back, work on your understanding of basic fundamentals.

hoary spear
#

Its advice made with the best intent

vagrant grail
#

Where can I look for those OOP Principles ?

hoary spear
#

Overscoping is super common, likely everyome has done it

vagrant grail
#

It's not like I want to do an MMO, I just want to make an among us like game 😦

hoary spear
dark parcel
#

It's probably gonna take a while, u won't learn them in a couple of weeks imo

hoary spear
#

I just wanted to make a multiplayer ShopKeeper

#

Should be simple enough. Except i had no clue what that entailed.

vagrant grail
hoary spear
#

Are you saying I have to put my name/rep on the line ? 😆

dark parcel
#

If I'm in your shoes I will just look at oop outside blueprint

hoary spear
#

Yeah its not UE stuff

#

Just general programming principles

dark parcel
#

I feel like blueprint tutorial might over stretched the concept

hoary spear
#

That applies to OOP

dark parcel
#

Where basic oop concept in any programming language should show you the simplest example

#

That's my opinion anyway

vagrant grail
fossil spoke
#

If you cant find OOP yourself, you have bigger problems...

#

Literally google the term

vagrant grail
#

The issue I have with Unreal isn't OOP in itself but just the fact that there are too many classes that you need to play with which increases possibilities of errors and placings stuff in the wrong classes.

vagrant grail
fossil spoke
#

If you truely understand OOP and its principles, looking at and understanding at a basic level the Gameframework classes should not be daunting.

latent heart
#

It's true that there can be some overlap in their function and their functions aren't all that well defined in the documentation, though.

latent heart
#

You can basically put anything anywhere and it'll sort of work (barring replication issues)

fossil spoke
#

Please dont give him excuses...

#

lol

latent heart
#

😄

fossil spoke
#

He is struggling as it is.

latent heart
#

Btu that's really a you problem. Take a look at the classes and understand what is implied by their names.

dark parcel
#

I am struggling lol, mp is hard

dark parcel
#

Not with replication stuff tho

latent heart
#

"Controller" -> deals with controls. "State" deals with state.

vagrant grail
latent heart
#

Yes

hoary spear
latent heart
#

But those aren't necessarily Player states, but controlled pawn states.

#

(the other way around)

vagrant grail
latent heart
#

The player state deals with persistent player data. Not specific character information, such as "is dead" or "health"

#

Unless those are persistent player states.

vagrant grail
#

how "health" is a state ?

latent heart
#

Generally all data is reset when a level is changed, barring game instance stuff. You can optionally carry over player state information during that switch.

#

It's not a binary state, for sure.

#

It's not on or off. Or one of 5 different values.

vagrant grail
latent heart
#

But then health isn't necessarily something you'd even have in a player state.

#

Generally your "health" would belong to the controlled pawn in the game, not the player state.

#

Depends on the game, sure, but yeah.

vagrant grail
latent heart
#

But all data doesn't belond to the player themselves.

#

That is a misconception you have.

vagrant grail
#

That's not what I said

#

Like Health, isDead, isAllowedToMove are all related to the player but they need to be in different classes which is something I deeply hate

latent heart
#

Well you said "instead of grouping as all are related to the player themselves" I mean, your network connection is technically "player information" but it doesn't really belong in the game framework.

vagrant grail
latent heart
#

The object that handles the network connection to the server in a #multiplayer game.

#

And the data related to taht connection.

vagrant grail
#

Mhhh on that one that's understandable and debatable, but for the ones I gave, to me they should all be in the same class but Unreal decided that no, and that's why it confuses me and confuses everyone who's new to this

latent heart
#

I would argue that they all could go in the same class.

#

Take a game where you spawn, go fight some people and then die - and you stay with your body in some sort of spectator mode.

#

You could put all 3 of those values in your character class and it would make perfect sense.

#

Take a game where you do teh same, but your body is destroyed and you can roam about, the "is dead" variable may then be on your player state because it is not bound to your character, but a more global state.

vagrant grail
#

To me instead of having different class to have different properies, like persistance between levels, server only, client only, etc.. To me there should be some properties on the variables to check / select to give the properties we want.

latent heart
#

Then UE is the wrong engine for you.

vagrant grail
latent heart
#

A state whose value persists for longer than the character you control.

#

I said "more global" not "global" meaning the scope of the value is not just on your 1 character.

#

Put your values in the scope they belong to. It's as simple as that. If it pertains to your player put it in a player state. If it pertains to the thing they control, put it in the pawn.

#

That isn't just how UE works - it's how OOP works as whole.

#

You don't just have a single class with a list of variables and decide what belongs to what.

vagrant grail
#

I don't understand why this keeps printing Is Not Server for the host, while this is a listen server and the code is executing in the Player Controller 🤔

hoary spear
#

A superClass

sinful tree
vagrant grail
hoary spear
#

Barely scratched the basic systems and there's been quite a few curveballs to catch already

#

And this is with purely editor testing, which definetly doesnt cover all the bases for MP stuff

dark parcel
#

I think I'm alright with sending and receiving data

#

What data should be send/ sync

#

What code should be in server what code should be in client

#

I'm struggling with validation and rewinding

hoary spear
#

Yeah thats another beast

dark parcel
#

Oh and I think I need fastarray for my item

hoary spear
#

Really?

dark parcel
#

Not sure

hoary spear
#

I prob should too, butnive minimized thebdata sent

dark parcel
#

Brb back to work unreal_dragon 😄

hoary spear
#

Now its mostly a DT handle and a value

latent heart
dark parcel
latent heart
#

You might just be able to copy it from 5.4 and use it

dark parcel
#

Still trying to scratch Gas atm

latent heart
#

Might work

dark parcel
#

Noted , ty.

dark parcel
hoary spear
#

I do a lot of client aide struct updates for ease of use

#

So my struct is like 25 props, with only. A few of them replicate. Rest is updated after replication

#

I should prob move to fastArray aswell as theres little downsides to it but... that'll be later

dark parcel
#

I will attempt to use fast array just for the sake of learning

hoary spear
#

That too

#

Same with Mover i guess

quasi tide
#

Hoping for a better API to be honest.

hoary spear
#

You'll be hoping for a while i bet😅

thin stratus
#

I had a very deep dive on NPP and Mover the last couple weeks for my current client.

latent heart
#

I'd love to hear the results of that!

thin stratus
#

Yeah I can write something down at some point

latent heart
#

Awesome. Thanks!

thin stratus
#

There is sadly a bug with NPP and Unreal Insights. It crashes very often. They are aware of it. Not sure how long a fix takes.

latent heart
#

Hmm

#

What causes it?

thin stratus
#

We ran into that when I tried adding reconciling of all Simulations under Independent Tick

#

Idk. It can't find recorded data matching the ModelID

#

NPP model that is

#

NPP only reconciles the Simulation that needs a correction if set to Independent Tick. And Fixed Tick is unusable atm imo

latent heart
#

Why's it unusable?

thin stratus
#

It's fully lacking the part that bridges the tick rate between simulation and game

latent heart
#

Ah heh

thin stratus
#

So if your sim is at 30hz and the game at 60hz, it won't have info for every second frame. And if you use it on e.g. Mover you'll see how terrible that looks

latent heart
#

I see

#

Sounds like it'd get very jittery.

thin stratus
#

We went back to Independent Tick. Which is what CMC does already. But there, only the current instance that has an error reconciles. Means if you have a second simulation, like a weapon one, that relies on Movements and other way round, you have a problem.

latent heart
#

I see.

thin stratus
#

And while trying to add that to the NPP I noticed the Insights crash, which happens without my changes too. That made it impossible for me to continue cause I had no data feedback to see if my implementation works

#

There is also a big ??? for performance and bandwidth with Mover and NPP which I don't have info about.

#

And an even bigger ??? for Epic even continuing with it cause they are visibly working on Chaos Physics prediction stuff

latent heart
#

Yeah, we kinda want to implement our stuff in mover and cmc and see which is more performant in various ways.

#

I can't imagine it's worse than the cmc, though.

thin stratus
#

At the current time I would say that even with 5.4. releasing, mover should only used by peeps who can use C++, can get a good understanding of NPP and Mover by reading the code and documenting it themselves, and who are comfortable fixing problems (potentially complex ones) without Epic's help

thin stratus
latent heart
#

We've got a couple of guys looking into it (who know c++)

lament flax
#

What is Mover and NPP

thin stratus
#

And the SyncState is always sent, even if there is no change to it. There is no MoveCombining in NPP.

#

I'm pretty sure it's less optimized than the CMC in that regard

#

The NPP structure is cache friendly, so at least there is that

latent heart
#

I'm sure it'll get better over time.

#

I doubt the cmc is going to see and drastic changes.

thin stratus
latent heart
#

Fair enough!

#

Thanks for the info!

thin stratus
# lament flax What is Mover and NPP

NPP is the Network Prediction Plugin. Basically something that supposedly allows making predictive multiplayer systems.

Mover is a CMC replacement fwiw. It's more modular and the prediction code is in the NPP instead of also in it, allowing other systems to maybe also predict alongside Mover.

Currently, with the CMC, there is barely any way to properly predict other systems in the same way without awkwardly hooking into the CMC

#

NPP requires C++ though. Mover is somewhat built to allow BP only usage. But we are working in C++ with it atm.

lament flax
#

Interesting

#

I might look at mover

#

Ty for explaining

latent heart
#

It's what the new "character physics movement" thing is based on, isn't it?

thin stratus
woven basin
#

Ugh… this is all so depressing. I just cannot understand how character movement, GAS, network prediction etc is all just not sorted by now. I appreciate it isn’t trivial, but it’s just so core to so much general game requirements…

#

I’ve got GMCv2, and even with that, GAS and movement doesn’t play nicely. No matter which path you go down, seems to have downsides…

fossil spoke
#

Game dev has always been about tradeoffs. I dont see that changing anytime soon.

#

NPP, Mover 2.0, GAS etc etc, wont solve every problem.

thin stratus
#

I think the problem is the current time/phase the Engine is in.

#

We started with a Sublicensed Engine that suddenly went free. A lot of the stuff in it was mostly just for what Epic needed it to be. fwiw mostly UT.

When it went free (I know there was a subscription phase), people started to use the Engine for a lot of different Games, and it's just not made for all of it. Paragon added some cool stuff and we got some updates on a lot of core features (RIP Paper2D), but as long as the Network Prediction part isn't as needed to Epic as it is to some of us, this won't change.

Fortnite somewhat needs it. They want predicted physics for their Vehicles.
And LEGO Fortnite did the first step in that direction by using Chaos, authority driven, to replicate none-controlled Phyiscs and properly smooth them.

They might push this further to allow local predicted physics, such as for Vehicles, at which point NPP might become redundant, because that would be yet another Prediction System. However, Chaos Prediction might also be shut off to the outside, not allowing other systems to use it (I haven't looked into it).

Stuff like NPP and Mover are somewhat "I want to make this." stuff of Epic Employees, that Epic themselves might not have that much interest and use in. With Dave Ratti not working on the Plugin anymore, it more or less stopped.

The people behind Mover probably though that it's gonna work nicely with NPP, but at this point I believe that resource-wise, NPP + Mover isn't really high priority.

#

I believe, at this point, that we (the community) would need to start working on Plugins that add some of those core features. NPP is great, but despite PR's, we can't really do much about its missing features.

#

We are somewhat lacking proper Open Source Plugins for this. The GMC stuff on the Marketplace is not it.

#

fwiw, that's also why I was and am very sad about the State of Unreal stuff. Cause it didn't show anything in that regard and only talked about MetaVerse, UEFN and Verse. +- some minutes about Animations. The Engine doesn't seem to progress into the direction that we need it to do.

thin stratus
#

We know Epic has the ability to create Systems that are fully functional, and awesome in terms of Editor Tools. Yet, their Unreal Insights version of Network Prediction just crashes.

fossil spoke
magic magnet
# woven basin Ugh… this is all so depressing. I just cannot understand how character movement,...

The thing is, I don't think it's "not sorted." There are solutions for every part of what you describe, after all! There's just not really a (good) entire single "here is all the hard stuff done, just make a game on top of it" solution. Which isn't that surprising to me; you can have little flexible building blocks, general solutions to things in isolation, but the more you start putting them together into a pre-made whole, the less flexible that overall whole will tend to be.

thin stratus
#

I would somewhat disagree with that.

woven basin
#

I guess more that I see very important building blocks - and they dont work together out of the box. But the whole point of an engine is to have compatible parts. Common scenarios like "GAS + stamaina" or "movement and rollback" - they are clearly the purpose of UE engine.

thin stratus
#

This isn't about a "here is all the hard stuff done" thing

#

The problem is that Epic releases "all theh ard stuff done" 5 times.

#

And none of the 5 work together

magic magnet
thin stratus
#

We don't need all of it done so we just have to move some building blocks.

#

Then we could just go over to UEFN and Verse and piggyback of Fortnite.

#

And who wants that..

#

The problem is that the things that UE/Epic offer aren't compatible but yet too integrated into the Engine to quickly create something better.

#

Like, look at the Overwatch Net Code video, where they show how their system works with Abilities, Movement, etc.

#

There is no reason that this is not properly possible in UE at the current point in time.

magic magnet
#

But I think the CMC itself is an example of what I mean. It made some choices, and now there's lots of things which depend on it (including certain animation modules which have no business integrating into the guts of the CMC when an abstraction layer would be enough). And if you need to do something in a slightly different way than the CMC does, you may need to accept you can't do it, or fight the CMC to make it do the things you want (but keep access to all the things that have put down roots into the CMC as a dependency)... or you can make your own solution, but at the the cost of extra work to retrofit or reinvent all those auxiliary wheels tied to the CMC. If that makes sense.

stone yacht
#

Hey guys has anyone experienced network related issues, actors not replicating some properties, etc, while using level instances ? the actors that have issues are children of the level instances.

magic magnet
#

@thin stratus - I would agree with your take as well, mind you. I think they're both problems.

hollow gate
# thin stratus There is no reason that this is not properly possible in UE at the current point...

I wanted to chime in on this, it is perfectly possible. NPP plugin is missing 2 features , Smoothing (both fixed tick and correction) and lag compensation. both of these features needs a minor changes to NPP to expose some stuff (adding 2 getter functions) so you can do it outside of the plugin (add it to mover for example). but you can make your own abilities, movement , etc.. and all in separate components , separate simulations and they would just work together perfectly. i understand your point of view that epic is just not invested in making something like GAS use NPP so we can have proper simulation and rollback.

thin stratus
#

But yes

woven basin
#

if it is truely that simple (exposing two functions) - we can just custom the engine to have those two exposed?

thin stratus
#

Sure

hollow gate
thin stratus
#

It's just annoying to work with cause as soon as you have a custom Engine, you gotta support that for the rest of the team

hollow gate
#

total of 5 plugins.

#

NPP , NPP extras , and the debugger. and mover plugins

thin stratus
#

The Smoothing issue is mostly a problem with Fixed Tick or?
Were Independent Tick Corrections also instant?

hollow gate
#

there is no smoothing at all now

thin stratus
#

Right

#

That should be easy enough to resolve

#

What we are still working on is reconciling multiple Simulation Instances in Independent Tick

#

Instead of just the one that had a correction

hollow gate
#

i believe Fixed tick in the way to go no matter what. that is the only way to guarantee multiple sims can step together. only thing is missing is smoothing, but Independent is no different, still needs correction smoothing.

#

as you can see the chaos one, only works in fixed tick

thin stratus
#

Pretty sure we decided against Fixed Tick. Possibly cause of the Smoothing.
I already have code for the Independent Tick reconciling multiple sims.

#

Just can't test it properly due to Insights crashing

hollow gate
#

you really went the long way. 😂

thin stratus
#

Well, I'm not sure anymore why we didn't want Fixed Tick, but from the discussions we had we figured it doesn't work for us.

#

And "the long way" took me 30 minutes or so.

#

From what I looked at it's pretty straight forward to add.

#

Might be that I run into a wall with it. But I can only tell once Epic fixes the Crash

hollow gate
#

i hope epic would make changes to NPP or its insights, anything 😂

thin stratus
#

They did push some stuff for Mover fwiw

#

Some fixes to BasedMovement

hollow gate
#

fixed tick is recommended in mover if you check the repo on main, but with engine fixed tick. deal breaker, not sure why they don't think smoothing is a must.