#multiplayer
1 messages Β· Page 17 of 1
I'll be honest, I'm currently storing player equipment on it, and also some information about progression
but it feels like it is the wrong place for this kind of thing, maybe creating a component and keep it on the player character is better?
progression maybe makes sense on the instance, but equipment probably should be on the player?
any reason why its not being stored on playerstate or player controller?
Is it online multiplayer? Or is their progress just tracked online / on a dedicated server?
no reason at all, just thought having movement and equipment info and stats, combat system everything on the player controller probably would get messy
online multiplayer
Is the data related to the character or the player ?
that's a good question, it is about the character, its equipments that changes movement and combat variables, but every player has their different equipments
That can be different for different containers. E.g. a player's inventory might be account-wide, but their character's inventory might be just what they're currently wearing, etc.
And there might be overlap.
A character's items are still in the player inventory, for example.
Hey everyone! Could I get a critique/sanity check of this Design to "Delegate" events from Game State to all Player States, I'm trying to eliminate Hard refs:
Game Mode and Game State communicate via Interface
Game State has an ActorComponent, lets call it "EventDelegatorComponent", and an interface to access it
Player States Add themselves to an Array of PlayerStates in the EventDelegatorComponent to "Subscribe" to those events. When Game Mode messages via interface to Game State, EventDelegatorComponent will loop through all "Subscribed" PlayerStates, calling the appropriate Interface call on the PlayerState which can call the interfaces on the Character or Player Controller
Either way, store the data on what the data relates to. If it's cahracter specific, store it on the character somewhere. Player ,you could put it on the player state - you can specify whether each variable replicates to all players or just the owning player, too, so it's safe to put private player information there.
I see, I'll try to do that then! Thank you Daekesh. :)
Why do you subscribe to events on the game state when the game state already has a list of player states?
Do you want hte ability to opt out?
seizing the matter, about where to keep things, is it okay to create components to separate parts of the player system? I'm a very OCD person, so for example I created a component to focus on the player combat system, leaving the player controller only for movement, is that a bad thing?
that's good to read haha
Hmm, good point!
Hey sorry to bug you guys. I can't find any info online. How do I get my game able to be hosted by a 3rd party like g portal, and how do I allow other people to host servers on my game through g portal
Putting the component on the game state and the combat controls in the game mode would be a serious issue, but separating stuff out into components on the player chvaracter or controller isn't really an issue.
yeah I'm separating everything inside the player itself, not outside, but tbh for now I only separated Movement and Combat
these two can have a lot of variables and functions, so everything together was killing me
You might find some overlap with movement and combat, so make sure they're accessible.
that is a very good point, I'll be cautious
I have successfully fixed this issue. I would like to congratulate Unreal Engine for giving me a fucking headache
I would also like to continue and detail my issue
My child actors had 'Replicates' OFF (the actors I was spawning) [I do not mean child actor components]
But for some reason, they worked in the editor, even when simulating a dedicated server, but not in packaged on a dedicated server. For this reason, I kept trying out different things and packaging every time to test it, forcing me to wait so long between tests, because there was no other way I could figure out if my fix worked.
I don't know if I want to cry or laugh but it's finally fixed congratulations me and fuck unreal at least for today
Did you have "run in one process" checked?
If you don't, it will actually spin up multiple game instances and you will get better results.
Contact g-portal about it. They have a link on their site labelled "Game Studios" through there you should be able to find out more.
Alternatively, if you distribute your dedicated server build, then players can just host their own wherever and however they want.
you know what
couldnt you have mentioned that earlier
Lol
also pretty sure it just didn't work when I tried, or maybe it worked and the issue wasn't there, I don't know. and I don't really care anymore
Btw, by "child actors", do you mean with child actor components?
no
Oh so through whatever 3rd party they want instead of only g portal? How do I go about that?
just regular child actors
the parent had 'replicates' on
mightve been something to do with the bug IDFK
"You distribute your dedicated server build"
ie. Let players download it.
Oh okay, I'm sorry I don't know anything about the online stuff. But if they just download it then they can't host through 3rd party websites like g portal right? Since I have to ask g portal if I can host my game
Generally you would have to set that up for them and then pay for it. There are companies that sell dedicated servers to end users to run games on, but, yeah, I think that business model isn't so great any more.
So I have to pay for other people to host servers of my game??
I plan on having 3 official servers, that I pay for, then people can host servers that anyone can join
Just release the server files and let them figure it out.
They can use their own machines or rent an internet based one.
So I'd just have to go to each 3rd party I want them to use, and contact them about allowing my game, then boom they can host to any of the ones I have permission from?
If you give them the server files, you don't have to do anything.
If you want to pre-arrange hosting which player's can rent (without giving them server files) then that's down to you.
My point is though, they can't just host from a file, if I have to contact the service to even put my game on there to be hosted. They just have a file
Sure they can host from a file. Why wouldn't they be able to?
You give them the files needed to run the dedicated servers and off they go.
The point is, the players tehmselves will arrange where to put stuff if you give them the ability to do it (by giving them the server files).
you need to create a tool for your steam game for the dedicated server, that's the best way to do it
Dedicated servers don't even need to be on dedicated game hosting servers. They can go on anything. Random Amazon server or whatever.
A tool?
it's just a type of steam application
before contacting these companies, make sure u have some following or something to show that they should care about putting their time into adding ur game (and include info about that) , or they will straight up ignore u
That too. If your game has 5 players, it doesn't matter who you contact.
I don't want to add up, instead I'm leaving you with thisπ https://wizardcell.com/unreal/persistent-data/
hello sometimes after I update only the server and the client needs to update it kicks me out right after I try to login, is there a way to get this as a blueprint event somewhere so I can tell the player to update the client?
I checked this but it has no reason variable
I find it unlikely bp has that level of depth.
well if it's not too complex, I'd accept a c++ solution π
Look at UNetConnection - the class is right there π
I'm like really clueless on c++ tho, what am I supposed to do with that? π
There's a PreLogin event too where you can check the versioning between Server and Client and reject the connection if different, so give a message in return which would be the error message
Not sure if it's exposed to BP tho
I have a widget that calls a function in my engine subsystem when its created, that function takes in Widget pointer and calls a delegate which also takes in widget pointer, the thing is, i create the widget on client, bind an event to the delegate both on server and client on my character but only server side delegate fires when i create the widget and the weird thing to me is the event returns a valid pointer to the widget on the server
Is engine subsystem only on the server or something? and shouldnt the pointer to the widget be null on server side even if the widget is created on the server?
Are you using HASAUTHORITY or ISDEDICATEDSERVER
because a non-dedicated server can have widgets
Im using HASAUTHORITY
I now understand i can create the widget on server if its not dedicated, my other remaining issue is im creating the widget on client and the delegate is only firing on server side with a valid pointer to the widget, im creating the widget after "Remote" pin on "Has Authority" node
@ancient adderWhat exactly are you trying to do?
Atm im trying to store widget data in engine subsystem with events/delegates such as on widget creation and destruction
There is no rpc, The widget just calls a function in the subsystem when its created
That function has Widget pointer input paramater, when the widget is created it executes that function and connects "self" to the input paramater
That function calls a delegate with Widget pointer as an input
I bind an event to that delegate in the character, both on server and client for testing purposes, but the delegate only executes on server side
even tho i created the widget on client side
hi, can anyone help me understand what kind of technology stack does UE use for multiplayer games?
by technology, I mean webRTC, gRPC or any other api along with the protocols used like TCP/UDP
afaik the delegate should only execute on client side because the widget is created on the client, there is no replicated properties/rpcs involved
So you're saying you do widget input on client and something happens on server with no RPC?
I create the widget on client side, and the delegate is executed on server for some reason
it even returns a valid pointer to the widget from the delegate
Here is the widget creation
Add process where the widget executes the function from the subsystem happens in c++ at NativeOnInitialized, i do not use authority check or anything because im working in a widget
Or should i use authority check in the widget?
Or atleast "Is dedicated server"
Listen server or dedicated?
I run the game with NetMode "Play as client"
I suppose it runs a dedicated server in the background
I would switch on local controller, more robust to single player or listen server situations
If you're using single process there's fucky stuff there
Great to know, it was initially on Local but changed it to authority to troubleshoot why its happening on the server
I doubt it's actually happening unless it's some fuckery with the shared process PIE
I'll try to run in "Standalone Game" mode
Delegate is not executing at all in Standalone game mode
i'll go do some checks
I went back to play in viewport and added 1 sec delay before widget creation, the delegate on client now executes
But still no idea why it executes on server
In Standalone it doesnt execute in both server or client
Got to execute on client too in viewport mode, i was creating the widget first before binding to the deledate, but it still executes on the server aswell for some reason
Okay its working now in standalone, only executes on client as it should, in viewport it executes on both, i guess using single process is fked up as u said
How are you checking if it executes on both anyway?
might NOT be, just the log is visible on both
if you're just printing a string
Yea im using print string, it prints 2 times, one with Server and one with Client
The function also stores the widget in an array inside the subsystem, in viewport mode the array has elements on server side, none in standalone mode as it should be
does anyone have experience setting up a dedicated server in a docker container?
Hey, is there a way to 'set owner no see' a light component?
No,it does not work, you have to do a client event that sets it invisible
ok for the owning client, but how for everyone except for the owning client?
If u just set it invisible through a owning client event then it will stay visible for othrrs
So I have set my player character bp to replicate, it has an inventory component which also replicates, the component has an array of objects of a bp that inherits from object (uobject) that is also set to replicate (the array not the objects), but when the client joins the server the array of the client is empty, even though I am initializing it with items. It still has the same length as it should, but instead of having objects it has none on all indexes. Also this is an error I'm receiving
objects don't replicate
inventory systems should use structs
That might be a problem cause I need to call events/functions on each item
put it as a class not an object
and then when u need to call a function get the object
u can also use get default object class instead of creating an object then (c++ only)
hmm, that sounds promising
Hello, is it still required to include UnrealNetwork.h in classes with replicated variables/RPCs? I've just noticed that it compiles regardless. (4.27)
If you have Unity Build enabled (which you would as its on by default) then its likely its been included as part of the coalesced build unit.
Is it good practice to store all the usernames on the server's game instance?
And if not, where would I store them to have them persist throughout levels?
Thanks, where can I check it?
PlayerState. There is already a UniqueId for you in that class and it already persists travels. Might want to check:
I have tried this, the problem with the playerstate is that I'm letting players set their own username through a widget. For all I know, the playerstate only returns the name of your computer and doesn't have any functions to change the default username
does such a node exist in the playerstate?
You can if you have an OSS implemented which is the case in any real world application
Otherwise it's null subsystem and you get that effing long pc name
I'm creating a marketplace product. So I'd prefer to work with the default oss
and have people implement their own preferred oss
Then you would have to either play your way through the null subsystem source code and change it to your liking.
Or make your own UniqueId which seems to me like a pain in the arse as it's used in a bunch of different places in the engine
So you have to take care of that functionalities
hmm, that goes beyond my knowledge sadly
I think I have managed to find a way by storing the values on the server's gameinstance with a map variable containing the playercontroller and its corresponding username. However I'm not sure if this is the right way to go about it
Well you said it's a marketplace product.
I don't think you need to mess with the UniqueId at all
Not by the sounds of it at least
Let games implement their oss
PlayerState will know to fetch that UniqueId from the implemented oss
So if I get the username from the playerstate right now, when someone implements steam's subsystem for example, it will automatically fetch their steam username?
No problem, thanks for the help!
alright thanks a lot
Wizard flying over to Vori to make sure it's all fine π
π
by checking the version you mean the build version (the one from the project launcher?)
- package a development build
- use visual studio attach debugger
it's like
in the VS menu there is an option to do that
try to find it my VS is closed rn
not that
it's like in the higher menu
press debug
then look for 'attach'
or somtehing
mayb4e windows section ?
oh
it's there
attach to process
yes

I was suggested this by someone else here
in the Project Launcher, is there a way to package for both Windows and WindowsServer in one run?
When I select both, it just does one of them..
It does both for me
You maybe does not have the Target Server config installed for your engine (if it's a source build)
also, #packaging
oh I forget about that channel, let's move there
The server can create a host and enter the game, but when I click the client host button, the game engine crashes?
don't u need to add
?listen
at the end of the map name
also go to Saved/Logs
and show us the crash error
Saved/Logs this file?
@oak prawn can u post the last part that's useful pls instead of the whole file
just checked, r u sure this is the logs from the crash?
or did u run it again after it crashed without crashing?
I don't see a crash here
Which one should I throw at you?
Game didn't crash when I ran it with standalone game @past totem
they are ment to run in just standalone
even using EOS features editor will crash if run anything but standalone
how you create multiple sessions to show up there
@oak prawn your max results is set to 0
make it 10
blueprint is fine
It worked fine the first time I did it.
the session list stopped showing when i did it the second time
you are using any source control?
no
you really should
if any time you mess up
its good to have a
go back in time button π
:d
I added it the second time I ran this, maybe that's what happened? then i deleted it but it didn't fix it.
well if you are clearing before find session then it should work
really hard to understand π
cant argue with that π sure it is
EOS subsystem is even more buggier in UE4
I'm in the last part of my game now and it's annoying that I can't write the right code and get results π
Where is the problem, why can't the lobby that was set up be found?
Host button
Find button
why cant i pass an object reference to a server RPC?
skilltreeskillwidget is null when it runs on the server
everything else is fine
Because you can't.
use structs or something instead
In order for object references to be passed through an RPC, a replicated copy of that object must exist that both the server and client know about. Widgets only ever exist on the client they were created on and cannot replicate.
i have a replicated property on the widget itself but i need a reference to the widget to update the respective property
i dont think structs will work
nvm, i got it
Replicated properties on widgets don't do anything. Replication of properties only happens one way Server->Client and even if you mark those properties as replicated, the widget itself would need to be replicated which even if you did, widgets don't actually support. There is no connectivity available within widgets at all.
sometimes it doesn't show the established lobby, what do you think is the reason?
does the Attach actor to component node have special rules?
I have the location set to snap
and on the server side the actor snaps to the component perfectly
but on the client side
the actor snaps then seems to be released right afterward
I have this blueprint which spawns a player when a players joins the game, however when I package the game, it doesnt seem to work
only in editor
bottom 2 pictures are the Spawn Player function from the first picture
You shouldn't need your player controller to tell the server to spawn the character. There's OnPostLogin that can handle that directly on the server itself without the client needing to tell the server to do it.
The rest of it seems like it should be ok. The only questionable thing is the "Find Available Player Start" function and the Collision Handling Override which you may want to change so the player always spawns.
the bp itself seems to work just fine atm however. As long as I test in editor
any idea why it breaks when I package the game?
Reminds me of the multiplayer series from epic which has a ton of replicated variables in widgets
I gave you three.
The RPC on begin play may not be going through on the server due to the player controller not being net addressable when you're calling it - move the logic to the game mode's OnPostLogin.
Find Available Player Start you haven't shown, so I can't directly comment on it, but it's a place where something could fail depending on what it contains.
The collision setting being set to "default" means that you're not really controlling the spawning behavior and on the server the location may be getting registered as blocked somehow. Set to one of the "Always Spawn" options.
My instinct tells me it's the RPC that's the problem as everything else seems like a stretch that it would cause a problem.
I remember reading about this but I can't remember too well, events can be replicated, functions are not, but what if my event runs a function, will that be replicated? Can I call a replicated event that runs through various functions?
Also, things from BeginPlay apply on the server?
how do I make a client side movement replication in C++? in UE5?
i tried this:
bServerAcceptClientAuthoritativePosition
``` but it doesnt work
To replicate FROM the client to the the/other clients?
to make client set the position
it allows people to cheat in game
they can set the movement and it will replicate to the server
Where is that variable?
Event's aren't replicated either. You're making remote procedure calls (RPCs) that are asking the server/client(s) to execute what comes next. Whatever you call on those events (including functions) will attempt to be executed on the server/client(s).
If true, and server does not detect client position error, server will copy the client movement location/velocity/etc after simulating the move.
Oh the CMC. Runs far away.
So I should set reliable only VERY important stuff, right?
Reliable should technically only be gameplay important stuff. Stuff that must happen. Unreliable for things like sound effects or vfx.
Also use unreliable for something that is happening constantly (like on tick), otherwise you'll flood the network.
Okay! Thank you so much again, you guys here on the server are always saving me with things I forget, I appreciate it
I wish I had more time to play with networking
Yes
the CMC has client side prediction built into it for basic movement stuff.
So when you use "Add Movement Input" the client proceeds with moving the character and sends the move to the server with a timestamp. The server "rewinds" the game to the timestamp provided to verify if the client could move to the desired position. If it can, it allows it, if it cannot, it corrects it.
ahhh ok. so that CMC was related to me
Can paperZD be used in multiplayer games?
does UE have any sort of query protocol that allows querying dedicated servers for server info? really wanted to avoid setting up a another udp server just for that
You mean query before connecting?
Take a look at Online Beacons.
Beacons allow you to perform a connection to a Server without actually connecting as a Player.
So you can do things like make queries or to make a slot reservation in the case of Party Beacons.
yea exactly, before connecting
looking to report some basic stuff like, number of players inside the server, ping, etc...
Yeah you want Online Beacons
thanks, gonna look into it
Alternatively you could setup some sort of master server that aggregates all that information, then use some sort of API Gateway to do a query of the master server for a list of that type of info.
The dedi servers would just regularly make updates to the master server with their new info
yea I thought about that too, but it might get a bit expensive when scaling for many servers
I'm hoping to report a full player list (nicknames) too of players inside the server
so it might be alot of data to store, which would be temporary anyway
It would actually be better than having potentially thousands of players making beacon connections to every server.
Are you using Steam?
yea but then they'll be making all those connections to my gateway/backend instead π
yea but thats my point about it possibly getting expensive
not using steam
using a standalone dedicated server
planning to distribute the server binary and allow players to self host, like minecraft for example
for this you can just use advanced sessions plugin
can you link it? I'm not finding it on the marketplace
it's on the forums just google it
@mordentral Hey just wanted to say thanks again for letting me know why I couldnβt connect properly. Turns out I didnβt successfully download the updated 4.27 plugins, but once I did that and checked bSearchLobbies everything worked great. I was stuck for a very long time and Iβm glad I was finally able to figure it out with your help. I know i...
doesn't seem to be related with my needs but thanks for the suggestion anyway
when is OnPostLogin raised? I wanted to raise it manually after I have logged in using my login panel so I can process server-side blueprint
#online-subsystems which does relate to sessions, which does relate to having lists of servers being made available to players so they can find a third party hosted server to play on.
yea that is probably a better channel for my questions
was just talking about that plugin itself
PostLogin is the first place that the player controller can RPC to the server. If you want to have a login system within the game when the player has connected to the server, then I'd think you'd need to build it after PostLogin has fired.
Anyone know of any seamless join in progress examples or talks? Mainly looking to JIP into a world hosted on a DS. Form the client's perspective they should not notice a server travel occurred and they are now "match-make'd" with 8-16 other players into this shared world. ATM, I'm hitting some major hitches and client pawn is teleported to a player start.
You can't seamless join a new server, so you'd need to look at some serious engine changes
yep, prepared to do that. Any GDC talks of teams having done that or exp thats been blogged about?
haha, depends on the game. destiney would be a very different game if their every 2-5min jip triggered a loading screen.
Destiny literally does have loading screens all the time
It's just that the UI is still responsive
And in some instances, its really noticable when it loads.
I'm not sure if you are unaware, but you in the map itself they are jip and host migrating every 2-5 mins right?
I've got about 2500h of that game so yeah I'm aware
Your ship is a loading screen
(and a really annoying one!)
yea of courese, but when you drop into an area...
that isn't a fixed set of players.
Destiny does have loading screens, any time you join a new activity, any time you start or join a match or a raid or whatever
fuck me, thats not what i'm saying.
Destiny, is an example of where a ton of seamless jip occurs,
It's not seamless at all
Ok thanks for your input
For when you're on a planet almost all "transitions" to new servers occur in crooked parts of the map where you can't really see what is going on in another part of the level, and they're fairly spread out so it gives the game time to actually load the stuff it needs to and make the connection.
this assumes that I've connected to the server map? or not necessarily?
Destiny has a microservice architecture where you're routinely talking to 50 servers
So trying to talk in Unreal terms about that is just not gonna work
Sounds like he wants to keep the world loaded while joining into a new server
So that it appears seamless
Even though there would be different players etc
Yep, thats it. totaly understand atm ue makes this a blocking travel. trying to understand why.
Well the "why" is "because no one cares about the initial loading screen and it makes for way simpler code"
Yes, but in some way, you're going to need to send data to a server for it to verify login details, otherwise someone will figure out how to spoof it and log in as anyone.
The initial connection would always be a hard travel
But because you are making a new connection to a new server
For a new area
They would always be hard travels
This is just how UE is out of the box
OP is asking how to not do that
I know there was a talk about how destiny did it, but obviously they didn't really give specific programming details, just the matter in which they did it.
I know
Destiny simply has a completely unrelated architecture
Yep
Do you know what aspect of the connection aspect makes hard travels necessary?
seamless server streaming is such a topic x'D you will need to write your own stuff
When connected to a server the server has full ownership of every actor
yes, very well understood
The server also controls level streaming, which level is currently loaded, etc
And since Unreal is level-based, it gets messy real quick
"messy real quick" is what I'm trying to udnerstand. if you dont want to explain, why do you keep participating?
One Unreal exemple that's close is how Sea of Thieves does loading screens like everyone but can host migrate between servers to merge players
SoT is a good example. Doesn't look like much has been published on it. But indications are along the lines of what I'd like to do.
https://comicbook.com/gaming/news/sea-of-thieves-how-matchmaking-works/
SoT still uses hard travels afaik.
If I have a client-side component, for which it is unnecessary to tick on the server, it this ok or too dirty solution?
"migration" is only fancy from a services point of view. Clients are doing normal travels to a new server, that new server just spawns you, your shop, and items on it in the same place as the old one.
So SoT is not doing "seamless" server travel. It's just saving your data to some backend service and then restoring it on a new server.
you can make it seamlessler
by preloading your inventory and data
so you skip some loading
you can do that with a : π₯
client side tho, I dont notice a hitch or anything of the sort
You do though
on the sea?
Yes
i gotta play it again then...
You get a Fullscreen message about the migration as it happens. It's a poem or something to make it pirate themed
It's connecting to a new server when it does that. It's not actually seamless.
It isn't possible to do true destiny-style seamless server travel in unreal without a custom networking solution or major engine changes that amount to a custom networking solution.
you are telling me the 4-8 other ships I'm going to encounter are fixed when i load into the map then?
Huh?
SoT isn't a seamless grid of servers of that's what you're asking
You're connected to a single server and so are a bunch of other people
Migration is the only time you connect to a new server, and that only happens when the current server shuts down
The entire world is a single server with 8ish ships allowed in it.
know of any other games on UE that pulled off seamless server migration?
None
if you want to transfer data about players to your old server without actually connect to it you can do it through beacons right before u load into the server
Again, unreal doesn't support it
That won't make it seamless
yea not built in. But hearing about what teams have to do at least gives what whats the major issue.
Not really
Anyone doing it is using custom networking or has made massive mods to the engine
Or has given up and faked it like vori says, but that still involves a hard load
yep, no question. I did that for astroneer. will do it again.
tbh I can't think of many games that even have that sort of requirement... Basically just MMOs
engine mods that is.
yes its a mmo thing
native vanilla and seeing players from other servers before loading... beacons it is and a little hitch u eat
xD
thats the best i can think of vanilla
Destiny is the obvious example but their networking model is beyond ridiculous. Hybrid P2P/dedicated server "bubbles" with a quick matchmaker that gives you a brand new instance if you move too fast.
i wonder if epic would offer any vanilla solution to seamless server streaming in the future
Has Division talked about their approach?
Improbable is the other "off the shelf" solution (have not heard great things about their middleware tho).
yea!
I dont have too many details on how it works, but the idea is a mesh of servers where authority of objects are migrated as you move from cell to cell
It basically spins up servers on demand where each manages a section of the world. Their stuff also handles communication between servers, and I believe it's all custom networking which is how it's seamless.
It's seriously impressive to build something like that as a generic system, though I don't know how well it actually works.
From the client prespective, i assume they would mark objects as autonomous_proxy as another server takes over it.
thanks I'll look em up ^^
Like really, one could make a client that doesn't use any of unreal's networking but it connects to a server through UDP or TCP and then it just streams whatever data it needs to through those connections. Then you have something that's seamless π
Well I dont see any titles on the market and its been 6+ years, so that may be an indication of their approach.
Heh
yes indeed but... i think they are trying to see if the engine could remotely offer something built in that would ease this
the answer is likely no, (only low level connection stuff)
I think you'd have to dig pretty deep. And have a set of middleman services to deal with the handoff.
yea, for context, i worked for epic for ~5 years, we made arbitrary decisions all the time and many times a feature was just a bit of work away but if FN didnt need it we didn't do it.
Fortnite being a forever game is a blessing and a curse
I've looked at some of the level loading code. I don't think this is one of the simple ones.
Once i understand the requirements of hard travel, it may be impossible task or simple few weeks of work... doing the investigation now.
Good luck, you'll need it digging into that part of the engine
yea level load is lots of old code for sure that assumed single threaded blocking loads.
It's a lot of spaghetti too
"attempts at refactor" π
So many different functions involved across multiple frames so you can't even easily follow the path it takes
i added to the chaos for XB loading π¦
I just wanted to know how to preload a sublevel when doing a hard load to a new level and spent like 2 hours trying to figure out how tf level loading even worked ;_;
I'm still beating my head against level editor loading gc issues lol
The world info is a partial culprit
World info tab that is
in theory...
if the level you are loading is the same one you are on
it should be possible to do some divergence onto another code path
XD
lol
The Day Before trailer implies there is some Division style shared world going on, but that game may be all vaporware.
it can
however as you say
streaming in players in overlapping server areas
will be something you'll need to do regardless
so look onto proxying aswell
in my head you are remaking sea of thieves but with this set of requirements so correct me if in your use case this wouldn't be the case
well I thought SoT, but as siliex was saying, it may not actually be seamless server travel. So closer to Division/Destiney where players are matchmade onto different servers and world feels continous.
ye i mention sot cause boats are big
x'D
having a boat traverse between servers sounds exciting
e.g. the hard traveling requirement of first join may simply arise from the fact UE does not have a way to stably name dynamically spawned objects.
a hard travel allows a consistent point at which to start naming objects, thus subsequent travels can be seamless travels.
do you know this for sure? or you are pure guessing? I mean, it makes sense
so then in order to get seamless travels between servers working it may be simple as :
- Use beacons (or something else) to inform to be joined server what the client world expects
- Server to be joined spawns/collects those names and sends down to to be joined client the names.
- Client renames said objects.
- Joining server now works as usual since name stability has been established.
guessing
I see
This is based on the client side prediction system we just wrapped up. Normally you must spawn actor on server and replicate down to clients is cause built in you cannot gurantee how server and client generate Name/NetGUID. So we built a stable/predictable naming mechanism, so now client can spawn and when server replicates down, it finds the already spawned object.
movement for the object is interpolated to the auth data from the server, but until server replicates its client simulated.
yes stably named in a deterministically manner
but
im not sure if... the object names are implied at all in the travelling flow
if they are not then its likely what you are saying
well its the only reason I can think of why connecting to a new server has to be a hard travel. shrug but thats the investigation atm.
The only real difference between seamless and non-seamless is that seamless means you already have a connection. In both cases, a new world is spooled up
yes we are speaking about making seamless the travel, not the concept of seamless traveling haha
Do you know what then necessitates a hard travel for a new server?
The transition level exists so you can dump the old level, switch to a low-memory transition level, then load the next large level in the background
What if I loaded both at the same time π
Not specifically, but there are so many aspects to seamless travel that depend on the connection being established and the player already being in the server instance
so e.g. being in the same map and travel to the same map without any hitch at all
What it sounds like is that you just want a non-blocking load of the level you're transitioning to?
yes
correct + net travelling implications
hard or seamless... the requirement is to make it "seamless" omg the word is not convenient
Not seamed π
// if we're already in the default map, skip loading it and just go to the destination
if (DefaultMapFinalName == CurrentMapName ||
DefaultMapFinalName == DestinationMapName)
{
UE_LOG(LogWorld, Log, TEXT("Already in default map or the default map is the destination, continuing to destination"));
// ...
else
{
StartLoadingDestination();
}
}
Yea loading to the same level world currently is is well handled.
Thats the UE travel, right at entry.
so this is hitchless already?
I guess you'd just have to load it in the background in the same way "seamless" works. But in fairness, even seamless isn't hitch-free.
not sure about hitchless. I am likely not doing everything right atm, so we are still hitching.
You can fool people into thinking it's seamless by having an animated loading screen and continuing music. That's what Paragon did
@chrome bay my goal is to allow for server migration while in game world. Ideally client should not know any sort of server migration occured.
GL;HF π
yep thats why we speaking about making the hard travel "seamless"
I don't see that being remotely possible
Everything seems that way until you do it.
Apart from anything, object GUID's etc. are per-connection not per-server, so you would have real trouble syncing that up
Granted I was not the only one working on it, but literally everyone told us Nanite was impossible, and then we did it.
I'm also not sure how platforms handle this. You can't for example on Steam, connect to a different server while you're already authenticated with another
no you wouldn't, you would do a hard travel
but "seamlessly"
so... occluding the fact you are travelling
avoiding hitches doing non blocking loads
- some proxying with beacons
not speaking about making hard travels seamless... which by definition might require loads of low level work
just speaking about making it seem seamless
so you can move
dance and stuff
while server travelling
Yea this is why I'm thinking that new server connections are blocking. It forces clients to load only stably named objects and then server replicated down all the dynamically spawned ones.
so, lets say we can gurantee or prime the server/client with stable names, what prevents traveling to a new server and server just replicates to that connection as it always does?
but ZabirH I think that's just one issue
yep, likely. what else are you thinking?
Stables names isn't the issue - it's the actual GUID's of objects. The server contains a lot of information about what state client objects are in etc. How would you even begin to transition that to another machine
which by default can be sorted by having one sync-ed point... the research i think should be oriented towards exploring everything that can cause a blocking travel, because maybe that's not even the bottleneck
yes
Out of interest, what's the requirement for this? Is it just a desire to have a seamless server migration or something more?
yes, correct, I just refer to the NetID and Name as stable name, per UE API "IsStablyNamed()"
yess seamless server streaming
Yes!
Want to be able to migrate servers without hitch/loading screen.
imagine sea of thieves, a ship traversing through a grid of servers
Something like what SpatialOS does then I guess. I have no idea how that works tbh
But it took an entire company and many many $$$ to make that work π
Presumably they have some of their own infrastructure
yep, totally agree.
but even in seamless travels, I mean
Yea, I would break it down to levels of "success" actually having a spatial grid of servers maybe being a very high tier goal
I think the real trouble here is transitioning the complete state of one server to another. Concepts like relevancy really means that just creating objects with the same name is not enough, servers presumably need to be able to talk to other servers and transitions the complete client state from one place to another
And now it's just a vehicle for web3 nonsense π
Does Improbable even do that? I thought it was more of a planetside style system where switching server meant a "travel" of some kind
They tried to lean into that recently
AFAIK, the marketing box says yes, but I have not used the API.
well you just need to hard travel to a running server
thats the theory, you dont need to transition the full state to one server to another
In fairness they do push the number of players running around pretty far. A lot more of a real actually interesting thing than most web3 efforts
But that new server needs to know that clients' object state too
for overlapping areas beacons are fine
A super simple first step, 4 clients load into single player maps, run to differnt positions, then match makin into a shared world owned by a DS. Clients were interactive whole time and visual pop is acceptable at first.
Destiny 2 has an intermediate period where players reappear
The transition generally happens in a cleverly hidden corridor
visual popping can be mitigated with beacons in a smart way
With no enemies etc
tbh even level streaming isn't hitch-free
I don't think it's just the networking layer that's a barrier
thats true
Someone in Blueprint was having that problem with level streaming just the other day, no networking involved.
but what are the possible blockers when doing a hard travel to the same map? what can possibly create hitches? thats i guess the research line
Level streaming in BP is too simplified, it should be a bit fancier imo
Even hard-travelling to the same map in UE has problems π
Engine gets very confused
Caused us endless headaches in HLL for a while
I've suffered that π€£
Or was that seamless.. I forget
Probably Seamless
Memeless server travel
well ignoring all the loading hitches. Looks like with hard travel:
- Server & Client resets all state via map load (server could execute save file load code to get into some kind of specific state)
- Clients loads via map load and everything replicates down.
- I dont see a way to persist actors between maps/levels.
this goes back to my theory why new server connections are hard blocking is so server can establish consistent net name/guids.
Seamless travel allows persisting actors since they have already been stably named.
Am i mistaken that hard travel does not allow persisting actors?
Well Seamless travel doesn't technically allow persisting actors, apart from one or two very specially handled cases, all actors are new
And there's a very tightly handled hand-off process between old and new
APlayerController:GetSeamlessTravelActorList can be overriden and all kinds of actors can be added. in fact I seem to be able to add anything to that list so long as that object was server spawned and "bReplicates" is enabled...
That call exists twice
And yes, you can persist other actors with that
I usually persist ATeamState : AInfo actors with it
Just have to find them afterwards
Cause the GameState (where we hold an array of them) is recreated, so the pointers are wiped
Yea, so I'm now 90% confident that hard travel requirement for new connection to new server is solely to enforce the stable name/GUID for net addressing.
Am i mistaken that hard travel does not allow persisting actors?
Hard Travel does NOT allow persisting actors.
Seamless Travel does.
Just so you are clear on that end
Seamless Travel, as a concept, makes no sense for Connecting/Disconnecting
No matter what the fineprint actually says
Not sure I follow what you mean
Also, seamless travel isn't seamless π
There's a very noticeable hitch when you do finally transition to the loaded level
Depending on how large and populated that level is
Yeah sure, but they call it seamless :D
But yeah, networking aside - I don't think that's the first barrier to the end goal here
It's probably also coming from BeginPlay being overloaded in larger levels
Networking team vs Core system team π
Network team's test level I bet are very seamless π
Seamless Travel is meant to keep the connection with the Client alive, parking them on a Transition Level while loading the Main Level on the Server etc.
While Hard Travel actively disconnects the Clients and causes them to reconnect, which for example Steam really doesn't like.
But that concept makes no sense for Connecting. The Client is not connected, there is no Transition Level, no Connection to be kept alive. No Actors that might persist. So Connecting and Disconnecting only really makes sense with a Hard Travel.
For context, goals is to perform server migration and from clients perspective ideally no hitch or loading screen. Similar to Division/Destiny/Sea of Thieves.
Obviously this isn't supporte out of box. Current investigation was whats differnt between hard travels vs seamless travels.
Yeah your main deal breaker is that it's entirely unsupported to do this without loading with UE's servers
Yea we can have multiple DS up and running read for clients to join.
Seamless requires the same Host to be present, so it's not gonna give you much info I guess
Yeah but moving from DS to DS is Disconnect -> Connect
yep
As long as you stick with UE's network layer
we will likely need to build something (maybe using Beacons) for a server to prime another server with world/client state. And a bunch of async loading to keep client view responsive.
When I modify replicated ustruct, do I need to mark it as dirty somehow or will it replicate automagically?
Thanks
But if I change only 1 value inside the ustruct (containing 100 floats), it will still serialise and send the the whole struct, right?
No
Damn, ustruct are smart
Same as UObject, only changes will be sent
One last silly question, is it in theory possible that server changes 2 values in struct, and they end up in different packets, resulting in client receiving update for value 1 and few frames after update for value 2?
If you change them in different frames yes
Yes
Not even sure that a same-frame change guarantees same packet
That should be what Atomic is for
yeah I'm not sure at least in highly strained situations
I've never found a definitive answer for whether actor updates can be split into different packets or not
My strategy has been slapping Atomic on structs I really want this for
Probably FHitResult would be interesting reading
IIRC it has partial replication support
yeah they use NetSerialize for a lot of atomic structs so the per-property changes become moot
FHitResult uses that also IIRC
(NetSerialize that is)
Thanks guys for the clarification, it is hard to work around these edge cases. Atomic it is then π
Just bear in mind Atomic does IIRC mean that the entire struct will be sent, but worth checking
But any struct with 100 floats is pretty absurd to replicate anyway π
Yeah, that was just a dumb example, I am serialising the struct to very small footprint, so sending the whole thing is totally fine (preferable). It's not 100 floats Thanks
I got slightly lost in Serializing ustruct variable.
Basically I need to serialize the PropData only if the bIsProp is true, othewise PropData should be the default values.
Since FPH_PropData doesn't have custom NetSerializer and I cannot use <<, what is the correct way to include PropData struct in an FArchive?
The first thing you do is change your font π
Default settings gang rise!
You could serialise each member individually.
I guess changing the struct isn't possible?
Which struct?
The propdata one.
It is definitely possible
That is true, but that is a lot of boilerplate for enabling a default functionality.
I want to avoid using custom NetSerialize for FPH_PropData because there are no bits I can save in clever serialization, all data is needed from there.
I just want to serialize it as it would be serialised by the engine if I just wanted to replicate it by itself
The reason why I use custom serialization in the FPH_ClientPropData (wrapper around FPH_PropData) is because I don't need to package PropData if bIsProp is false, thus saving 99% of serialised size in that specific case.
I figured that. π
I'm not sure if ustructs get their own default serialisation like that, though.
Hey guys, shouting for help with bp instanced static mesh per instance custom data replication. Thr instanced static mesh component is dynamically created, the actor owning it is spawned on server, both are replicated. I'm trying to change custom data and these changes must be replicated to everyone, but they're not. Only the owning client can see these changes. I tired everything I guess. I'm trying to create building construction system for RTS, and thr building upgrades are designed to be visually represented by per instance custom data. I'm taking the hit results under cursor and trying to pass the hit component, but it's not working. I tried to print string the display name for instanced static mesh component and this name is different for server and clients.
Sorry for over-explaining, I sometimes can be rubbish at explaining what I want to do. Thanks for the suggestions with custom serialisation anyways!
I am pretty sure the PerInstanceSMData is not replicated at all. You will most likely need a custom Fast TArray replication and update the PerInstanceSMData when your replicated array is updated. Not something that can be done in BP though.
Oh man, maybe there's a workaround as for example changing custom data using game state and calling the event for all player-possesed pawns changing the custom data.
Yeah, doing multiplayer in BP only limits you greatly.
Also, it's not really about custom data, the instanced static mesh component is not replicated, I tried to destroy the component and could not do it either
Just recalled that
Hello!
I haven't attempted this yet but I'm wondering if it's possible to NOT return clients to the default map if a ListenServer closes?
At the end of a match I want to display the results etc with a button to return the player to the menu. However if the ListenServer returns to the menu at this stage, all clients will most likely also get booted due to network error when they may not have finished looking at the results. Ideally each player, Including the listen server can return to the menu freely without disrupting others.
Is there anyway around this or advice on how to solve this problem?
hey all
is there a way I can tell an autonomous client to stop trying to predict it's rotation and just accept whatever the server sends? And turn this behavior on-off at runtime?
like I have a gameplay ability during which, I want to tell the client "stop trying to predict your rotation and just follow along with whatever the server tells you"
did you mean simulated proxy or remote proxy? An autonomous proxy isn't being predicted (at least not when looking at the stock CharacterMovementComponent). What "prediction" or unintended interpolation are you seeing?
I'm confused. I thought autonomous proxy did prediciton?
as in
if I tell the player to move forward, my player will move forward locally, send the move packet to the server, which then validates. And if the server tells "no, you shouldn't move forward", it sends back to client to it can "revert" the move forward, isn't that how it happens?
yep, thats right
I miss understood the terminology.
so you are wanting to prevent the local movement and just wait for the server ack?
while not predicting, is the pawn moved via user input? or driven via animation?
if no user input is involved then I'd consider turning the autonomous proxy into a simulated proxy while you want this behavior and turning it back to auto proxy when done.
If user input is involved, then would look into deriving the movement component and implementing a custom movement mode. see EMovementMode::MOVE_Custom
What triggers the SetActorRotation?
a gameplay ability
no user input is involved
I can just manually change an actors role like that? Didn't know that
but I'm afraid there might be so many unintended consequences doing that
well you have to coordinate with the server
Hi. In a racing game, I have an actor with a spline that keeps track of where players are. It works fine on server, but how can I send the map result to the clients widget?
I've been struggling with this all day.. Any help is greatly appreciated.
you would need to notify the server or the server "understands" this pawn should become sim proxy now based on gamestate.
easier is using an array and rely on replication, rather than a map
maps won't replicate
now.. why can't you replicate the target rotation and do it server initiated
rather than messing with the role system π
That's just how he roles.
Thanks for replying.
Do you know any tutorials/youtube videos, that shows how to do that multiplayer? I've seen a few, but they're only single player.
is LaunchCharacter jsut disabled in multiplayer?
it doesnt work at all
I cannot set velocity, launch character, how do I make the character dash?
launch character works
but, you gotta do it predictively on the client and then on the server
for these style of tasks GAS is recommended
- root motion tasks - how lyra does the dashing
I don't think it does. Apparently I can't find any information about this.
I guess it's not possible for me to make something like that then. Thank you for your time.
no it is, but
array replication is a topic by itself
so... let me explain you
how much do you know about unreal's replication system?
and their differences between C++ and BPs?
@trim plume
I've been trying to understand replication for some months now, and honestly feel like smashing something hard against the wall..
okay, I can give you an introduction if you'd like
Single player is no problem, I can easily make it work server side, but I have no idea how to parse the data to the clients.
I'm familiar with has authority check, then call server, then call multicast and such.
And recently learned about repnotify
that's just tools for your toolset nothing you must rely on all of the time
so far, you know RPCs, and replicated variables, right?
so the concept of this starts by... let's have our data in a class that is replicated down to our clients
like the gamestate
It's all very confusing. Without doubt the most confusing I've ever tried to understand
yes the thing is that you need to not pretend to solve problems at a go
with replication you need to understand its implications
and why we do things in a certain way
so as I said, player positions is something we can have in an actor is replicated down to our clients, like the gamestate
or in your case a replicated actor that contains a spline in which u do ur logic
Yea ok
so in the server, we do the position tracking under a has authority check, possibly on tick
and we populate an array
that's just a heuristic that will give you a resulting array given the "game state"
The spline actor is placed in the world in editor, and it's already there from begin play, so all clients and the server can find it.
On spawning the pawn for players in the player controller, I then add the newly spawned pawn in a pawn-to-float map in the spline actor
your actor with the spline
should be replicated
because we want the position array to be replicated down to our clients right when it updates
I have an auth check on the tick in the spline actor
that's not enough
an auth check will simply ensure that you are executing logic on authority -> the server
what you need is ensuring this actor is marked for replication
bReplicates to true in its defaults
I didn't have the replicates checkbox checked, so I checked it now will try see it that does something
no
that won't do anything unless
you replicate the positions array
so remember, replication goes from server to client
in this case we are updating the array in the server
and we are relying on replication to give us a mirror on our client
for that you have to tell unreal that you want to replicate said array
if you are using blueprints, its a boolean in the property
Ok, so if I understand correctly, and please correct me if I'm wrong. In the spline actor, I check Replicates, and then make 2 arrays, one for the pawns, and the second one for distance in float. Then I choose Replicated in both arrays property details?
And from there I should be able to get the arrays from the widgets that is created by the clients?
why two arrays?
just one no need for two, right?
just an array of structs might be enough
I need the distance so I can place their player icons on a line, similar to mario kart and such
I can make an array of struct with vehicle pawn and a float for the distance, and then replicate that?
mhm π
Is that a yes?
yup
no probs, ^^ we here if shit hits the fan
I will try it out later when I've gotten something to eat
It might well be.. All day I've been pulling my hair..
π
it's hard, so.... welp
Hey Im working on replicated movement with blueprints but I have a problem. I made it so sprinting is replicated and I also made that player cant sprint backwards and sideways but client Can sprint even back and sideways. Anyone know how to make it so client wouldnt be able to sprint sideways and backwards?
I'm working on a replicated chunk loader system. My chunks are currently actors with a mesh. Now I actually want to spawn the actors only on the clients in a specific cull distance (and thus limit the updates as for example players not in distance should not get mesh updates). Would NetCulling be sufficient enough or is the preferred method a custom replicationgraph?
UE already has distance culling built in. You should probably use that?
Yeah I'll give that a shot and perhaps in the future depending on scalability I might change it
I spawned my weapon but when player level it's still visible
I'm using the replicated movement that comes with Unreal but it has a lot of stuttering. First gif is the server.
Second gif is the client.
I'm not sure if it's visible on the gifs though.
Here are my settings. Any idea of what could be causing this problem?
Thank you so much! I did what you said, and now I got player track position, laps and checkpoints working. Thanks again, really appreciated βΊοΈ
Also, had to increase cull distance with a lot as well.
you can make this tracking actor always relevant π
just look for bAlwaysRelevant in the class defaults @trim plume
Also, congrats! π₯³
what does bAlwaysRelevant even do
makes the actor always relevant
meaning that it will matter for replication to all its connections always
no shit
lol
but for real what does it really do?
does it make the replication distance not matter or something?
I don't get it
I always just enable it for important actors that I want it to always replicate
yes, it makes the replication distance not matter
Hey so...I have something I haven't seen before. Anyone know where to start looking? I have Actor A and Actor B. Both have working collision. Actor B has a Begin Overlap event that fires. If I am on the client, the overlap ONLY works on the client. If I am on the server, the overlap happens on both client and server. Both Actors are set to replicate, and I know collision is working because well...it works fine. It just seems that whenever a client starts this process (the server handles all actor spawning) the server's BeginOverlap function doesn't even attempt to fire
anyone know a different way i can do this? im not so good at networking but i swear there was another way to replicate this simple movement instead of having a client and server event (btw all of these are in an actor component)
I'm so confused
why is pitch and roll multicast
but yaw is server only
when they should all be server only
or atcually I mean
this is just so weird
oh i forgot to change it
honestly i just kept changing the replication until smth worked
show everything u r trying to do and only 1 part of it not 3 duplicated parts
I have a c++ function to rotate an actor, so I can have 6 DOF movement, I want this to be server replicated, all the code you see is in an actor component. The Roll Pitch and Yaw are called when the player presses down the keys, server roll, pitch, and yaw have the same code as client pitch, roll, and yaw, as seen in the image. The only difference between the two is the replication on the event. The replication works fine, I just thought there was a simpler way to do it.
Thanks! Yea, I set it to always relevant when it was acting weird, but it turned out cull distance did the trick. The issue was that it worked a little while, but then it didn't. The map is huge, so makes sense π
However, I just left the always relevant checked.
if its always relevant it ignores the distance culling
is this on the player controller? why not use 1 multicast event instead of 2 events
anyways Zzz time
its in an actor component
literally no clue what u r trying to do
rotate the player
Hmm to me it didn't. I tried always relevant, but that didn't help. Then when I multiplied cull distance by some ridiculous amount, then it worked.
Sleep tight. And thanks once again βΊοΈ
input is in the player
wtf is this ??
the player pawn blueprint
you're killing me
i dont understand whats wrong
does this actually work?
or at least on a listen server
Multicast events only work when called from a server, and you are calling it from a client here (client input event)
ye it will only work on the listen server player, not other clients
ohhhh thats what they do
and the other issue is, u can't just call these events every frame
how should i do it then?
it will kill the network
it should be something else prior to this setup, always relevant means... always relevant, gn!
I literally have no clue what u want to do
Yea makes sense. But maybe I wasn't doing it properly then. That could might well be π
so basically, the input axes, Roll, Pitch, and Yaw, are meant to add Roll, Pitch and Yaw to the players rotation
the Roll Pitch and Yaw are controlled in the actor component via C++
because movement component doesnt allow for 6 DOF movement
what's 6 dof movement
this is a floating pawn character, I am using 6 dof to bypass the gimball lock
rotate 360 degrees in all directions
I'm pretty sure it does supportit
yea it does support it
I have it in my game a flying bird
u just have to enable something
no if you try to rotate pitch 360 degrees it will get stuck looking up
this is what the pawn actor looks like
i used the flying pawn template to start
what is this component based on?
UActorComponent something something
I don't get what u mean, it works fine for me with a bird I can fly any direction up down left right
based on? it has no parent, I made an empty actor component
and where is the movement component ?
yea, what's that based on
Movement components don't need to be scene components.
it has no parent
yes, this
so u made a custom movement component
why ?
flying works iwth the regular movement component
because 6 DOF wasnt working for me
and try again with the regular component
it will be too much effort to create ur own custom repliacted movement component as far as I know
and it works so just try harder to get it to work lol , it works for me
just tested as client, replication seems to work fine there as well with a dedicated server
and now enable network emulation in the play in editor project preferences
u r going about this all wrong
overcompliacted it and u will run into so many issues
u just have to use the eregular movement component cuz it works
gtg to eat
i did. it works fine
doesn't make sense, at least this shouldve broke
doesnt seem to
well then Idk what u r doing
neither do i
what does a multicast do?
i thought it meant that it cast to both server and client
Sends an RPC from the server to every net relevant client.
ok so why shouldnt it be working here
and why does it anyways
If youβre referring to the screenshot from earlier, input comes from clients. A multicast canβt be directly called from a client, you RPC from the client to the server and then the server can do a multicast.
ok so should I change the event to server?
Iβm still extremely confused about this entire discussion so not sure honestly. What is it youβre trying to achieve?
A multicast from a client will just execute locally.
If you want to broadcast to evreyone, single-rpc to the server and have the server rpc broadcast it.
Bearing in mind that that will send the broadcast back to the original client.
i dont understand what this means
just delete everything
u can't run this on tick 3 times
no thank you
try to make the movement component work
show me why it won't work for u
I will help u
not with the other thing that's a lost cause

in your editor, when you are previewing the level, can you rotate 360 degrees along the pitch?
wait I will record it
ok
yes see you cant rotate 360 degrees along the pitch
I literally have no idea what u mean
Idk how it can be more 360 degrees than that
lol
do a loop in the air
I did it in the vid
here i upload video
You mean he's gimbal locked, MAN?
finally something useful
ah
thats the point of the c++
Quaternions ftw.
i said that earlier
Idk if this is possible with the movement compone then
also im glad the video caught another issue, sometimes it doesnt spawn the second client, i dont understand why
at first i thought it was collision issue, but both player starts are set to ignore collisions and spawn anyways
Are you looking at it from the server PoV?
in play the network emulation is enabled, and both players are client, if thats what you mean
where do i set this?
It's in the PIE menu in the 3 dot thing.
That might be it. Turn it off.
ah yes this stops the issue
btw the replication still works in this mode as well
well actually not exactly the same as before, i changed the input events to server
though, do i need the 2 events, one to replicate on client and one on the server?
Sure you can.
seems to be working fine
should i add a branch to make sure the input isnt 0 just in case?
wouldnt it throttle it with so many network calls?
like the normal mveoemnt component works in a better way somehow I think maybe
If they're unreliable it really doesn't matter.
ok done
i havent set any of them to reliable
i dont know what that means, and it seems to work fine without it
should I?
mm ok interesting
unreliable means that it';s ok to skip it if the network lags or something
also i noticed that when the two actors collide, and then move away, the server location of the actor is different than how the client sees it
why does this happen?
u need to add movement correction
like in the normal movement component
I guess
where if the client is not at the position of the server, it corrects it
how do i do that
well u could just setup another server event to tell the server the location of the client
but Idk, these things need to be performant
this whole idea to make a cpp replicated movement component sounds too much
i just want 6 DOF movement thats network replicated
is there any tutorial anywhere?
usually for MP games I would just not take on ideas that require complicated stuff like that that arent supported already
I'm guessing no tutorials on this, too niche
maybe search the discord server
i searched for correction and wasnt able to find any results
do you think there is anyone on this server with an in depth knowledge of networking I could ask about this?
Sure there is probably a dozen people on this server that could help you. I would not recommend messaging everyone to find out though. Try posting in the job channels
so what you mean is ill finish this by next year at best
like I said u shouild try to take on projects that are more fit to what you think you are able to do
and u also are just being weird about it like, I told u what u need to add next, client correction, but just asked who can tell u how to do the whole thing which is too generic and won't get u anywhere
but just this whole thing is too complicated
can't u come up with different gameplay
if thats how you want to interpret that. like Tbjbu2 said, you can always choose to either not do this, or you can shelve this idea for later. maybe one day you will figure it out, or you will be in a position to have someone else do it
yeah i get it, thanks anyways
The only Code Class that gives you this is the CMC.
Forget about custom Network Movement of that degree if you can't either extend or write your own CMC.
Also iirc CMC is very much in love with Z-UP. When I wrote the Hoverdrone Movement Code with 6DOF, "driving" on walls and what not, I basically wrote my own CMC.
This is the precisely the stuff where Blueprints are just a small shitty tool that can't do what you want, where you gotta realize that it was never meant to become this big and can't replace C++.
I'm trying to change the material of meshes on my clients. I've tried repnotify and and multicasts and they are being executed on clients but they aren't changing the material.
Also checked the material name on the mesh and it is changing but it's not displaying
u printed the material name on the client and it changed but it still shows the old material?
Yes
weird
Actually I was wrong. Apperently that print was from the server
So the server is going off and setting the rep notify. But rep notify isn't triggering on clients
Are your clients net-relevant?
show all your graphs
show all your replication settings on each bp
and wdym being executed on the client and not changing the material
that doesn't make sense
if it is executing the set material with the material u provided then it should work no reason it won't
I was wrong about that part. It's just printing on the server but it's not triggering the repnotify for the clients. mb.
Trying to figure out why it's not notifying the clients now
Ayyy apparently the actor wasn't set to replicate. Thanks for pointing out the basic stuff I somehow always manage to forget. Haha
LOL
How can I lower the ping?