#multiplayer

1 messages · Page 190 of 1

gloomy axle
#

I just used the 5.4 version tbh

sinful tree
#

This is a tough question to answer. Making your game multiplayer is more than just figuring out sessions and joining players together. The editor itself can allow you to simulate having two players in a game to begin with and should provide you with plenty to start with getting things working in a multiplayer environment without worrying about sessions and EOS yet. You may want to start with simpler ideas in a new project. Like, try getting a simple chat system working which teaches the basics about Server RPCs and multicasting. Next, once you know how to send data to the server, perhaps you want to use some stately variables to represent changing data, like a scoring system, or maybe changing character meshes using OnReps. From there, you start building more and more on those concepts into larger ideas, and once you're comfortable with that, then maybe start integrating what you've learned into your main project and ensure that things are replicated properly, and then maybe consider working out sessions and EOS.

gloomy axle
#

lol

gloomy axle
#

you gain great skills from that

#

that's me personally tho

amber vale
#

It is extremely difficult to make a game multiplayer when it was developed in singleplayer. I'd recommend learning the basics of multiplayer first, so you can decide what you'll need to change about your game (which variables you'll need to replicate, what functions you'll need to RPC, etc.). Then probably create a new project from scratch and re-program your game using that multiplayer knowledge.

EOS is a backend service that you won't need to worry about until much further down the line, when most of your game, or at least its framework, is already finished. Unreal makes it easy to program multiplayer games in a platform-agnostic way. Once you're ready to actually deal with things like lobbies and matchmaking, that's when you'll want to start learning about EOS and integrating an online subsystem.

gloomy axle
#

i would get into advanced steam sessions before EOS tbh

gleaming sequoia
amber vale
amber vale
# gleaming sequoia I need a guide, preferabbly one that shows the c++ method. Only guides i've foun...

https://www.youtube.com/watch?v=JOJP0CvpB8w

A few years old but still by far the best networking guide out there

An overview of the essential concepts for writing multiplayer game code in Unreal, in under 25
minutes or your money back.

Sample project: https://github.com/awforsythe/Repsi/
Patreon: https://patreon.com/alexforsythe
Twitter: https://twitter.com/alexforsythe

00:00 - Introduction
01:24 - Net Mode
03:33 - Replication System Basics
05:13 - Acto...

▶ Play video
gloomy axle
#

i wait for the day Epic develops an AI assist for blueprint nodes

#

and honestly that sounds really easy to do

amber vale
#

You mean like copilot?

gloomy axle
#

someone could just write a plugin for it

#

yea

#

copilot, but generates blueprint nodes

#

blueprint nodes can be represented in code already

amber vale
#

I've never used any autogen for programming besides intellisense so idk

gloomy axle
#

intellisense is pretty great by itself tbh

#

i use copilot for more vague stuff

#

or if i dont want to use google when im on a project lol

#

ok i think i decoupled the data and ui

neat prism
#

Does anyone have a really solid write-up, sample project, or git repo where I can check out how they make smooth server-client projectiles for third person games? I am focusing on listen server applications. This week I tried a bunch of things from google, but I keep ending up with laggy results. This is one of the last multiplayer things I'm struggling with in my game so I don't mind a long read.

gloomy axle
#

Lira?

amber vale
# neat prism Does anyone have a really solid write-up, sample project, or git repo where I ca...

You want client-side projectile prediction, which is pretty complicated. This is how Unreal Tournament does it: https://github.com/JimmieKJ/unrealTournament/blob/clean-master/UnrealTournament/Source/UnrealTournament/Public/UTProjectile.h

GitHub

unrealTournament game. Contribute to JimmieKJ/unrealTournament development by creating an account on GitHub.

#

That's the only sample project I know of that does predicted projectile movement.

neat prism
#

cheers

dry dove
#

do you bielive that paxdei made with UE can handle 7000 players in a single shard + mobs ?

sinful tree
dry dove
#

They say yes

#

A single zone server is a Dedicated Unreal Server that handles the simulation of a specific part of the world, e.g., one home valley.

gloomy axle
#

what's paxdei

dry dove
#

I think the server just calcul the position & actions from players, and other actions are calculated with another server

twin juniper
gloomy axle
#

yes i know google exists

twin juniper
#

google it then

#

tf

gloomy axle
#

next time you ask a question, im gonna turn on a notification on my phone to make sure to tell you to google it

sinful tree
# dry dove They say yes

What they define as a single "Shard" doesn't mean a single unreal game server based on their diagram. They'd be running multiple intstances of game servers that represent what that "shard" is. So it's not 7000 people running on an Unreal server. And while yes, this is a way of handling "massive" multiplayer games in Unreal, you won't be playing with all 7000 players at once. It's easier to break up the population into much smaller groups where you probably will only have 20-50 people in one server at a time, and they even mention there will be zone transitions which means there will be a loading screen of some kind, and they say a limit of 150 players in one server, but I think they are being very generous with that though it's not necessarily impossible. Any further communication outside of this one server is not happening within Unreal's networking system.

twin juniper
gloomy axle
#

that's enough coding for today

#

im gonna go buy a ribeye and chips

#

appreciate your help brother @sinful tree ❤️

woven basin
# neat prism Does anyone have a really solid write-up, sample project, or git repo where I ca...

This question comes up a few times on this channel. I'll give you the answer I've given previously; the way Fornite and other popular games is to actually have the client do the shoot local mechanics predictively (sound, animation, smoke etc), but the actual projectile is only spawned by the server and then replicated to all clients, including the original shooter.

So it "feels" instant, but its actually server only firing. The client does not spawn a projectile locally predictively, only the server does authoritatively.

If its good enough for Fortnite, then it is likely going to be good enough for your game too.

worthy oak
#

how about you google your inventory or use one thats working and has way more features than yours will have

twin juniper
worthy oak
twin juniper
#

sorry for that, you helped me a lot and I thank you a lot ❤️

worthy oak
#

of course thats what we try to do here help out

limber oak
#

Yo, my sdk for linux builds only fully supports centOS? the server will have no issues running on Ubuntu?

woven basin
#

You’ll get better answers there

gray blade
#

on client side, in order to have as little delay possible for example playing a sound. is there a difference picking RPC or rep notify

dark parcel
#

Eg foot steps, gun fire, yada2

#

Shouldn't involve networking

#

The only networking part is the movement, the foot step sound play whenever the feet touch the ground respective to each machine.

gray blade
#

ok i see, cause im trying to make it feel more responsive when an AI is hit with a meele attack, Im already doing something like you said for the blood splatters

sinful tree
#

You could probably get away with the audio and blood splatter be something that isn't networked and just handled locally when the client detects that the AI was hit.

neat prism
distant talon
#

Anyone know where the options in the game mode's PreLogin function get input by a connecting client? Trying to pass some arbitrary prelogin data when connecting to a steam session.

I'm using the JoinSession call at the moment when the clients connect, it has no options field. i figure it's logic that runs way later in the join process, however i'm having trouble finding where. I traced it back to UWorld recieving the options from some kind of URL in the connection request but, hmm

woven basin
# neat prism I’ve read that and I have tried setting up something extremely basic using the p...

The way it works is;

  • Player presses "shoot" on the client
  • Client checks if player has ammo etc, not dead etc
  • Client decides "yep, you can shoot", play sound, play smoke, do "shooting" animation, RPC to server "shoot". But no projectile actually spawned.
  • Server receives "shoot" from client a few ms later depending on ping.
  • Server confirms player has ammo etc and is not dead etc
  • Shoots does shoot logic - i.e. spawning projectile, which replicates to all clients, deducts ammo etc.
  • Server multicasts to all clients except original to "shoot" for the original player, to spawn the sound, smoke, etc
#

something like that

distant talon
#

Oh very nice find, thanks. i'll do some testing and see if it works.

#

that's a really nice site by the way, lots of good reference

twin juniper
#
bool UInventoryComponent::AddItem(FItem NewItem)
{
    for (int index = 0; index < ItemsArray.Num(); index++)
    {
        if (ItemsArray[index].ItemDataAsset && ItemsArray[index].ItemDataAsset->IsEmpty())
        {
            ItemsArray[index] = NewItem;
            return true;
        }
    }
    return false;
}
```This code doesn't work as expected, it's running fully on the server but it seems like the ItemsArray in the server isn't always correct
#

I initialize it (the size of the array (Num)) on begin play here in the HUD:

AGASTrainingCharacter* PlayerCharacter = Cast<AGASTrainingCharacter>(GetOwningPawn());
if (PlayerCharacter != nullptr)
{
    UInventoryComponent* InventoryComponent = PlayerCharacter->FindComponentByClass<UInventoryComponent>();
    if (InventoryComponent != nullptr)
    {
        InitilizeItemsArrayServer(InventoryComponent, inventoryWidgetObject->InventorySlots.Num());
    }
}```
#
void ACustomHUD::InitilizeItemsArrayServer_Implementation(UInventoryComponent* InventoryComponent, int8 num)
{
    InventoryComponent->InitializeItemsArraySize(num);
}```
@sinful tree @worthy oak
#

the initialize function is in a component in a the player, the bool is the PlayerCharacter.h (not replicated)

void UInventoryComponent::InitializeItemsArraySize(int number)
{
    ItemsArray.SetNum(number);
    ArrayHasBeenInitialized = true;
}
neat prism
twin juniper
#

I also didn't enable Networking in my HUD since it's only using a RPC which doesn't need it, I think

dark parcel
twin juniper
#

and #include "Net/UnrealNetwork.h"

summer rivet
#

... the HUD class?

dark parcel
#

is there a point to do that? HUD is not replicated object

twin juniper
#

since the size of the array in the pawn is in the HUD...

sinful tree
#

Why?

dark parcel
#

if you need to have data replicated, store in an object that is replicated

twin juniper
sinful tree
#

That's not modular at all.

summer rivet
#

👏 read 👏 the 👏 docs

twin juniper
sinful tree
#

If it's an inventory component the component should have an exposed variable that you can set directly on the component in your blueprints.

#

You shouldn't need anything telling the component what to do to initialize it.

twin juniper
#

then it's less modular

#

I'll try

#

becvause now, the player need to change 2 variable

#

in the HUD and the Pawn

sinful tree
#

1st Image: Character, doesn't have an inventory component.
2nd Image: I add one.
3rd Image: I have an exposed variable on the component that tells it what size it needs to be.
4th image: I make the component resize itself based on the value that can be set by any actor that has the inventory set to it.

So if I want an inventory that has 5 slots, I change its instance to have the inventory size at 5. I can dynamically add the inventory component to other actors placed in the scene all with varying sizes of inventories, all without them having to tell the inventory what size to be.

twin juniper
#

did you create it yourself?

sinful tree
#

Yes

twin juniper
#

I'm a noob

twin juniper
sinful tree
#

UI only needs to represent what is contained in the component.

twin juniper
#

yes but what did you do for that

sinful tree
#

Created UI that represnts the data within the component

twin juniper
#

but it must look good for all inventory size, what did you dop

sinful tree
#

How it looks is second to how the inventory functions. The UI only needs to read whatever data you want from within the component and display it however you want to display it.

twin juniper
#

how is that wrong:

ACustomHUD* UInventoryComponent::GetHUD()
{
    AGASTrainingCharacter* PlayerCharacter = Cast<AGASTrainingCharacter>(GetOwner());
    if (PlayerCharacter == nullptr) { return nullptr; }

    AGASTrainingPlayerController* PlayerController = Cast<AGASTrainingPlayerController>(PlayerCharacter->GetController());
    if (PlayerController == nullptr) { return nullptr; }

    return Cast<ACustomHUD>(PlayerController->GetHUD());
}
sinful tree
#

Why does the inventory component need to know about the HUD?

twin juniper
grizzled garnet
#

I've got an actor component which is attached onto the player state, I'm trying to replicate it yet the server isn't replicating to client and the client is creating its own named object instead, any possibility what might be going on? Setting SetNetAddressable() in the component makes the component refs nullptr on the client.

quasi tide
#

UI reads from the gameplay, gameplay shouldn't really ever know anything about the UI

sinful tree
twin juniper
#

the function should be in the HUD?

sinful tree
#

You don't need the inventory component to know about the HUD.
You can give your widgets references to the inventory components they need to read from, and read the data of that inventory component and display them as you need them to display.

twin juniper
#

I would only like to update the widget when an item update tho

sinful tree
#

So you want the player's inventory to look different from a chest? No problem, but the underlying code for how to read the data would be the exact same, you just need to be able to reference either the Player's inventory or the chests and display them as needed.

sinful tree
twin juniper
grizzled garnet
#

What happens to a player state when the player disconnects?

twin juniper
lusty aspen
#

so i have a hotseat local multiplayer game, where i spawn a player controller for each hotseat player. hotseat meaning only one player is playing at a time, so i'm toggling the visiblity of that players HUD to be true when they are taking a turn.

i'm running into the need for a shared UI, say a scoreboard, that i would like to instaniate outside of my players HUD class. so that if i have 3 hotseat players, they can each have their own HUD, but then there would also be a common HUD for things that are shared. how exactly should i do this?

woven basin
ruby lodge
#

Does anyone have any resources or knows discord servers where I can learn about how to develop and deploy an own backend for dedicated servers for my game? I am looking for alternatives for aws Gamelift and Microsoft Azure playfab.

sinful tree
willow adder
#

Does it work if i Package and try it with 2 Pc`s over the Network , because i read something are Different with the In build in (Play as Listener Server).Does Anyone know about ?

lusty aspen
#

highly recommend investing in it if you are early on in a project

willow adder
lusty aspen
willow adder
#

Ok thank you Holby i will watch it 👍

devout sonnet
#

On a scale of 1-10 how hard is making a multiplayer game? I'm starting to believe I'm a lot dumber than I previously thought.

summer rivet
#

1

#

Create a new project with one of the templates and hit play in it should be multiplayer. So that was easy.

willow adder
#

I think we are in the Same Boat (1) Junius , thank you Mathew your Tutorials help me a lot anytime

candid tinsel
#

i got a health system that runs on event tick to check the player health and when the player health is lower than 40 runs injured animation but its not replicating

#

i tried rpc and it didnt work and i tried rep notify the variable is injured and it doesnt work neither like in the video

#

does anyone know how i could solve this

dark parcel
#

Stop using multicast on anything that needs to be replicated or sync

candid tinsel
#

i tried without multicast nothing happened with replication

#

just normal custom event

quasi tide
#

Also - why are you checking this on tick?

dark parcel
#

Well it's not gonna magically fix your problem but using multicast for anything in sync is a sure fire way to fail

candid tinsel
#

i might change it later from event tick but i just wanna figure out how to replicate the injury variable to run the event

dark parcel
#

Try to replicate a bool first

summer rivet
#

SO MUCH WRONG

dark parcel
#

Step outside what you are doing rn, and make sure you know the basic

#

A few tips if you haven't read the pinned resource. Replication only work from server to client

#

So if you need client to change the value, it needs to ask the server to do it via server rpc. Otherwise the client will only change its own.

candid tinsel
#

so from that code what could i change to improve it

summer rivet
#

Are you running the rep notifies on a server event or specific. from something that only runs on the server?

dark parcel
willow adder
#

Does someone know why my Client Window Camera not working i spawn the same class 2 times ,Server Class shows correct , the Camera is a Component inside the Class

normal raven
#

Hey guys, in my project the terrain is procedural (Using RMC), and is spawned separately on client and server. Since it's not technically the same actor (even though it's in the same place) there are some weird warnings about the client's location.
Here's an example:
LogNetPlayerMovement: Warning: ClientAdjustPosition_Implementation could not resolve the new relative movement base actor, ignoring server correction! Client currently at world location X=235.000 Y=0.000 Z=-4159.850 on base RealtimeMeshComponent

Is there a setting I can change to fix this? This same issue also makes the clients see each other as constantly falling

candid tinsel
dark parcel
candid tinsel
#

yea i know but rep notify has replication option

dark parcel
summer rivet
#

@candid tinsel Keep them on none unless you know what you're doing.

grizzled garnet
#

Whenever SetNetAddressable() is set on for any object it no longer becomes referencable client side?????? (replicated pointers are breaking)

candid tinsel
neon summit
lusty aspen
#

the main feature of the character movement component is client side prediciton, so if your game is humanoid and you can get away with modify that, then your in luck. if your character is non humanoid or physics based your going to have a very challenging road ahead. big studios with top notch developers struggle to get client side prediction right

keen hound
#

is there any way to only get the player camera of the player shooting? it gets both cameras it seems.

willow adder
#

In my Case it is look like live in the wilderness alone is more easy, than build a Multiplayer Game alone 😂

woven basin
static charm
#

o do i disable all other than steam?

lusty aspen
thin stratus
#

Was there anyone here with NPP knowledge? I know some of you touched it and looked at it. Such as SirKai. I have no one to discuss complex shit with 🥲

woven basin
#

In my UMG - how do I tell it where/how to grab the VM? There seems to be something called resolvers - but I cant find much about it?

thin stratus
#

Iirc it just means you spawn the object yourself and set it by hand. It's been a while though and the last MVVM version of UE I looked at was broken

#

Also this is a #umg topic

woven basin
#

yep yep - was just replying to earlier topic - but I'll move it over there

thin stratus
#

Yeah I know

lusty aspen
thin stratus
woven basin
thin stratus
#

But in theory you use PlayerViewport vs GameViewport

woven basin
#

lets talk over in #umg

thin stratus
#

You can add player specific UI to that and game specific UI to the other

#

This is usually used for split screen but I don't see why it wouldn't work here

#

You just need to hide the ones that aren't current turn related

#

In BPs it's literally AddToViewport vs AddToPlayerScreen or something like that

lusty aspen
#

i'm tempted to modify the engine to only make player0's HUD and call it a day. surely someone has crossed this bridge before

lusty aspen
karmic briar
lusty aspen
#

speaking of complicated shit though, do you have any experience or know anyone doing async physics work on it's own thread? @thin stratus or anyone else

lusty aspen
#

@karmic briar in your experience what was the limiations of NPP

thin stratus
lusty aspen
#

ohhh just realizing Mover is using NPP. damn i need to look at all this again. any good resources you've found on NPP?

thin stratus
lusty aspen
#

but i totally feel that. that's how i wrapped my head around CMC in the end but there was deff a good playlist or 2 that helped

thin stratus
#

NPP and Mover is being worked on, slowly. There was a push by SirKai to add smoothing for FixedTick and there is a bunch of stuff that can be improved over all. I'm eager to also patch it up a bit, but I don't have the time at the moment. And the work I put into it at the moment is part of client work, so I would need to redo it at some point to be able to have a public repo of it.

#

They also added some new stuff for MotionWarping on ue5-main iirc, but nothing concrete.

There is a lot of stuff somewhat missing in Mover and NPP that CMC had, but it's "fine".
Examples are MoveCombinding, or handling BasedMovement in a better way (CMC has a lot of code to handle jumping on and off moving stuff).

distant talon
# distant talon Oh very nice find, thanks. i'll do some testing and see if it works.

it doesn't seem like prelogin options set here are ever forwarded to the server when using the sessions system, the GetGameLoginOptions function never gets called in my debugger. It appears the function is only called in two places, in lobby beacon client and in PendingNetGame, but after testing it seems like these paths are not used with sessions... Something somewhere else is getting called, and i can't find where. Wherver it is, it's populating with "SplitscreenCount" and "name" options but nothing i specify. Prelogin does run but of course the options field is empty. (Not testing in PIE)

I suppose there might not be a way to send my options to prelogin, in which case, anyone know alternative options for running a bit of pre join validation before allowing the client to connect? I'm very hesitant to do "allow it to join, wait for an RPC with the required data from the client, then decide whether to kick it".

So maybe there is something sessions/steam sessions specific i'm missing?

dry gust
#

When I do DrawDebugBox() it draws it fine. But when I detach the controller using F8 playing as Listen Server it stops rendering. Running in Standalone doesn't stop it and the box is visible even in the detached mode.
Is it possible to replicate a debugging geometry or something? I really need it to work in the detached mode

shadow geyser
#

Hey everyone, I'm really new to motion matching, and I'm wondering if it could work in an online multiplayer mode (if that's even possible).
If my understanding is correct, motion matching tries to find the best animation piece and predicts the future animation based on the player's current input and velocity.

This means that the player's movement is tied into the animation itself and not the game logic (again if I understand correctly).
I wonder if it's currently possible to make it replicated in a state that's good enough.

Usually, in host/server-client mode, the client predicts; there's the whole client-side prediction.
But with motion matching, in real networking scenarios, I could imagine there potentially being a lot of teleporting, changing animations quickly because it's not as straightforward as, for example, transitioning from idle to walk—just two states.

anyone has any thoughts on this?
thanks!

slim jay
#

I am firing a rifle in using a set time event. Even if I set the timer to 0.01, I still feel a slight delay when firing in the game. Is there any plugin or method you know of to make it react faster?

twin juniper
dark edge
#

Show your code between the input and the rifle firing

dark edge
#

That's a mess

slim jay
dark edge
#

currently you're relying on a round trip between the client and server before the shot happens

#

that's part of your delay

#

also why do you have a timer and delay and why is GetSurvivalCharRef an interface call?

rustic sable
#

Should a spell projectile be spawned both on server and client? Someone was doing it this was on YT but not sure that's the best way.
All the logic is happening on the server, on the clients I really just need the niagara system to replicate the movement.

#

I see the NS spawn on all the clients but even with the Movement Comp set to replicate in the projectile the vfx don't move on the clients

slim jay
dark edge
#

the only difference is how many bullets they fire if you don't let go of the trigger

#

1, many, or infinite for single shot, burst, or automatic

dark edge
slim jay
rustic sable
sinful tree
#

Is the niagara system attached to this actor?

rustic sable
# sinful tree Is the niagara system attached to this actor?

indeed, it is parented to the sphere component responsible for collision (collision only checked on server since the logic is there, on the client I only care about the visuals) . This all works in single player mode, probably one thing I'm missing.

Since the movement itself isn't replicating tried replicating the movement component itself and activating via MC. I know this is the wrong way to do it but just testing things. This however didn't work either

sinful tree
#

The actor is marked to replicate and is "replicates movement" enabled?

oak pond
#

whats the best/safest way to replicate something that needs to be updated constantly? for example the players aiming direction, an actor that doesnt have a built in movement component, anything that can move freely without something like that

#

my best guess is fire a server event every half second then lerp it or something but idk

gloomy axle
#

If I wanted to replicate the physics of an object, say disable simulate physics and transport to clients hand location, how should I replicate this?

#

cause currently this works perfectly on the host player

#

cients can see that

#

but the host cant see when the client does it and it doesnt go to the clients hand

oak pond
#

yeah I guess we got a similar question

sinful tree
# oak pond whats the best/safest way to replicate something that needs to be updated consta...

Aiming is already replicated through GetBaseAimRotation.
Actor location can already be replicated by the engine with a movement component, just tick "Replicate Movement" on the actor and you can set its location as you please on the server and it'll replicate the position to clients. It only gets tricky if you're wanting to handle client prediction which the engine does have built somewhat for you which is the character movement component.

oak pond
#

yeah Im specifically trying to avoid typical replication like that I essentially want like a ghost system

#

I cant have my player being rubberbanded all over the place every time they use a dash ability or something

gloomy axle
#

This might be better for help, here's my player controller's blueprint
https://blueprintue.com/blueprint/5240_jt-/

And the AddToInventoryData
https://blueprintue.com/blueprint/l4kvvfxk/

The flow I'm asking about starts at the IA_Interact

  • IA Interact Started
  • Is SlotEmpty
  • If so, OnServer Add to Inventory
  • Add to Inventory Data
  • Add to Inventory UI
#

idk why blueprintUE misaligned everything lol

#

But essentially, that flow works perfectly for the host and clients can see the host actions, but messes up when the client does that flow

#

any ideas?

gloomy axle
#

damn i killed the chat

twin juniper
#

what does IA mean? @gloomy axle

gloomy axle
#

input action

twin juniper
#

what doesn't work?

gloomy axle
#

essentially the attach actor to actor doesn't work as expected for the client

#

it doesn't teleport to the clients "HandSocket"

#

it does however for the host

twin juniper
#

is the actor replicated?

gloomy axle
#

yes

twin juniper
#

the actor is spawned on the server?

gloomy axle
#

yes

twin juniper
#

when you attach the actor to an actor, that's on the server, right?

gloomy axle
#

holy shit i got it

#

ok so i made two changes

#
  1. the On_ServerAddToInventory now has a input actor "item"
#
  1. AddToInventoryData takes in that item instead of CurrHitObject
#

I guess it's because before, CurrHitObject was entirely client side

#

and the server now knows what the "item" actually is

twin juniper
#

CurrHitObject would prob be 0

gloomy axle
#

yeah exactly

twin juniper
gloomy axle
#

huh?

#

i set the CurrHitObject as the server's item input

twin juniper
#

does it work

gloomy axle
#

these were the changes i made that made it work

twin juniper
#

that seems pretty good, I'm doing quite the same for my system

gloomy axle
#

now i need to do the same for dropping the item

twin juniper
#

Shouldn't the current slot empty check be on the server?

gloomy axle
#

well the client should know if its slot is empty, or if it has an inventory item there

sinful tree
# oak pond I cant have my player being rubberbanded all over the place every time they use ...

It's either you have client authoritative movement meaning the client can basically move wherever they want whenever they want (ie. allowing clients to teleport to any location), or you have server authoritative movement, which means there can be some latency involved as the client presses an input and must wait for the server to respond, or, you have server authoritative movement with client prediction, wherein the client attempts to move before the server would know about it but the movement itself is sent to the server and the server validates if the movement was ok and corrects it if not (and this is basically what the CMC does for basic movement). If you want something more complicated than basic movement, then you have to build it with one of these three ways of doing it, and if you opt for client prediction then you typically have to look into how the CMC handles predicted movement and build your new types of moves into it, or construct your own movement component from scratch that does something similar.

twin juniper
#

Datura, what do you think?

sinful tree
#

Not good. The inventory widget shouldn't automatically assume the item will be added. OnRep of the inventory will tell it if the item was added or not.

gloomy axle
#

oh that makes more sense

sinful tree
#

And yea, you'll want to check slot status on the server as well.

#

Nothing wrong with checking client side too to prevent unnecessary RPCs.

twin juniper
#

as he told me, the component shouldntr know about the widget

gloomy axle
#

so I should call AddToInventoryUI on InventoryItems rep notify

#

whenever the server makes changes to the invetory's data

sinful tree
#

Ideally you wouldn't be telling your UI to do anything. You'd use an event dispatcher and have your UI bind to it.

gloomy axle
#

I would make an event dispatcher on the player controller for the ui to bind to that?

twin juniper
gloomy axle
#

the ai wouldnt have a widget

#

or shouldn't i think

sinful tree
#

You'd have the event dispatcher in whatever is holding the inventory.

gloomy axle
#

hmm

#

let me test the item drop logic first

twin juniper
sinful tree
#

So if it's only your character, you can put the dispatcher on your character. Your widget can "Get Owning Player Pawn" > Cast to Custom Character Class > Bind to Evnet Dispatcher and that bound event can have it read the inventory as needed.

gloomy axle
#

ahh okay

#

so when the inventory updates, the ui will change each

twin juniper
sinful tree
# twin juniper what if we want to use it for multiple stuff and using it modular

In your case, you have an inventory component. When you want to see UI involving a specific component, you construct the UI and feed it a reference to the Inventory Component you want to look at. You would bind to the event dispatcher to the passed in inventory component, and then again, have the widget update itself based on the data in the inventory component.

sinful tree
#

So like.. Let's say I had a chest sitting on the ground that I want to look at.... I can interact with it and know it has an inventory through my Character, and that interaction can signal a dispatcher to "View Inventory" which passess a reference to the chest's inventory component. My HUD could be bound to that delegate and can then construct the appropriate widget and I feed it the reference to the component. The widget then sets itself up based on the data in the component.

#

It's all about passing references around @_@

#

And trying to keep responsibility with the things that are responsible for them.

twin juniper
#

delegates are for that.. I see

sinful tree
#

Yeah, they're so you can "listen" for things happening rather than something having to explicitly tell it that something happened.

gloomy axle
#

this is on the UI

#

this is on the player controller

sinful tree
#

Nope, don't need those dispatchers there.

#

Dispatchers are on the OnRep of the inventory

gloomy axle
#

Ah okay

sinful tree
#

You may also want to handle the false condition here to empty the contents of the widget.

#

Ie. Item was dropped, you don't want it showing in the slot still

gloomy axle
#

yeah i forgot lol, thank you

#

i should make this a function in the widget

ember vine
#

why did UE4 get rid of "simulated" for doing client/server stuff ?

#

seems kinda convenient ..

meager spade
#

What?

#

What you mean they got rid of simulated

shadow aurora
#

So we’re running into an issue recently where an object appears to be coming down in a previous packet, but the OnRep isn’t being triggered for like 0.3s or more in some cases…

Anyone know what’s up here?

balmy turret
#

I just got my dedicated server code working with my database. I'm wondering how I should go about spawning third person characters and assigning them to players based on things from the database.

Furthermore where should things like do damage functions etc live? In the game mode?

dark edge
oak pond
balmy turret
reef bison
balmy turret
oak pond
nova wasp
#

"had to check two checkboxes"

sinful tree
# oak pond yeah Im currently trying to do client authoritative but I just dont know how to ...

Just so you're aware, client movement prediction is not easy and it's fairly complicated to get it looking smooth. If you want to know how Unreal does it, you need to look into the Character Movement Component. You can't just arbitrarily move the client somewhere and then RPC to the server to tell the server that they moved if you're using the CMC. The move you're executing has to be built into the CMC's move list to ensure that everything syncs up correctly.

oak pond
#

but I cant just go and edit cmc itself

sinful tree
#

Yea, you can. You can override it and make your changes as needed to the CMC in C++ and then apply that to your own custom character class that utilizes it.

oak pond
#

c++...

ember vine
#

@meager spade nvm, i thought "simulated" in udk did something on client then auto-sent it to server. but i was lied to by mr gpt ..

sinful tree
# oak pond c++...

And if you're not doing that, then you're going to have to build your own movement system, and the CMC is probably the best example for as to how to approach it in Unreal. And if you don't want to follow what Unreal has, then you're probably not going to find much help on the subject as you're approaching something that is very complex and difficult to do well, let alone correctly and actually authoritatively without jamming up the network with too much data from trying to replicate movements.

oak pond
#

so am I right in thinking its basically like cmc is built the way it is so that it already works with replication but anything you make with blueprints is separate from that so cmc is all like noooo what are you doing youre supposed to be stood over here so the only way to tell it whats supposed to happen is actually coding it into cmc itself

gloomy axle
#

kek

reef bison
#

I mean that's literally what I had to do to get it working Shruge

nova wasp
#

I think someone made a plugin that can help make adding BP functionality a tad easier

gloomy axle
#

node graph assistent?

nova wasp
#

another small hack: turn off client corrections temporarilly during fast movements

#

stark changes in velocity that aren't accounted for in the cmc are just tough to get perfectly synced with the result the server got so that's an option

reef bison
sinful tree
# oak pond so am I right in thinking its basically like cmc is built the way it is so that ...

The CMC is a "good enough" approximation for the basics of replicated movement for most shooter style games - it allows you to walk around, has gravity, acceleration, friction, handles step heights and whether or not you should fall off ledges, and it allows you to jump and crouch. Basically, it gets you started and in the right direction for handling movement, but it must be customized if you want more from it and its set up is done in C++. This isn't a problem in single player games as you can get away with basically anything you want in terms of movement since the computer running the game is the authority always, so it's easy to make something responsive and look good without rubberbanding because it's not having to verify that data over the network which has latency involved.

The reality is, if you're trying to make a multiplayer game, you're going to go into C++ to properly make it on account that there's so many things made for multiplayer that isn't exposed to blueprints. It's not about that "blueprints is separate" it's just that the original design of the CMC wasn't made with the intent of fully supporting all possible movement one could do right out of the box, nor was it designed to be customized in blueprints and fully replicate everything.

You can ignore the CMC entirely, but then you're going to have to figure out everything else that is required to get movement right for your game, including all those other fun features I just mentioned the CMC already has.

oak pond
#

is that in 4?

sinful tree
#

And yes, those options are in UE4 as well.

oak pond
#

oh wow, Im sure I searched something like that but thanks

oak pond
reef bison
#

yeah its not server authoritative, but this is fine for certain type of games like coop where you don't care if players are teleporting everywhere

nova wasp
#

can also do

[/Script/Engine.GameNetworkManager]

ClientAuthorativePosition=true

in your game ini

#

woops, meant true

gloomy axle
#

💀

nova wasp
#

this is also where you tweak things like the client correction threshholds

rustic sable
#

having some issue doing SetRelativeRotation on a replicated component in a server call, should be reflected on the clients no?

gloomy axle
#

that is a long usename mr neuro

rustic sable
#

it's kind of like the current episode name, like 'Return of the Jedi'

nova wasp
dark edge
#

If you have to ask those questions you shouldn't be considering multiplayer right now.

#

or if you do insist on starting out with multiplayer, know that it'll be a long and painful road.

balmy turret
dark edge
#

possible though

oak pond
#

god I would never try pvp

oak pond
# reef bison unreal already has this built-in

what the hell, this seems to have fixed it completely. inputs are still delayed as expected but I was planning on doing them clientside as well as server anyway. I cant quite tell if the player is getting hit by projectiles that I dodged, but is that expected since the players movement is delayed on the other end? thanks though, couldnt find this when I searched client because I was looking in class settings and stuff

lusty aspen
# thin stratus NPP and Mover is being worked on, slowly. There was a push by SirKai to add smoo...

https://www.youtube.com/watch?v=g8_JyUdrOLs this guy has a fork where he's attempting to finish things. sounds like roughly the path you went down. i've heard that AGS has client prediction built in? i briefly evaulated AGS when it first came out and was pretty confused by what they were going for and figured it was only good for ability heavy games. but have you looked into it from the NP perspective? is there any good take aways there?

thin stratus
#

Oh I'm very well aware of him hehe

#

Also the person I literally mentioned in the message you answered to

#

Not sure what AGS is/was

lusty aspen
#

holy shit so it just hit me that i'm talking to the creator of the network compendium. back in the day that was my bible and i read every word many times. i still send it around to coworkers or anyone gettings tarted with MP. such an amazing doc

thin stratus
#

Hehe, glad it's helpful

lusty aspen
thin stratus
#

Right, well I used GAS a lot in the past, on The Ascent and on some MOBA. I don't reaaaally like its PredictionSystem, but it's also not terrible.
Getting NPP to work with GAS is probably quite the hard task. Re-writing GAS as an NPP simulation might be more realistic, but even then NPP might need to change.

lusty aspen
#

ohh so GAS is built on top of NPP?

#

or how does the GAS client prediciton relate to NPP? trying to decide what i should be keeping my eye on. i don't really see myself building any MOBAs, my interest is i guess sandbox/arena games like counterstrike/rocketleague

thin stratus
#

No

#

GAS is not using NPP

#

NPP is way newer

lusty aspen
#

also you should 100% update your compendium with your NPP knowledge that would be incredible

thin stratus
#

Yeah, if I ever find the time I will

quasi tide
#

back in the day that was my bible
What do you mean "was" - it still is

#

😅

#

Trust Cedric over Epic 🙏

thin stratus
#

I haven't had to open that thing in ages. Seems to be useless kappa

lusty aspen
#

haha these days i know basically everything in there by heart

quasi tide
#

That's just because you have ascended to not having to read your own stuff

lusty aspen
#

i need a compendium for the complicated stuff like client prediction and structuring large projects

quasi tide
#

I love it when I find some video I did or post and I'm just like, "sweet - thanks past me"

thin stratus
quasi tide
#

Client prediction is simple in theory

lusty aspen
#

haha i would disagree

#

even the theory is hard

rustic sable
#

do projectiles typically need a multicast destroy? just doing it on the server isn't doing the job, yes replication works

meager spade
#

no?

#

if its replicated, then server destroy will destroy it on all clients (unless its been torn off or had its replication turned off)

rustic sable
#

hmm, yeah something is strange, I do an authority check OnOverlap then even wrapped it in another server reliable just to be sure, must be something else

meager spade
#

eh?

#

maybe you spawned a copy on client also or w/e

#

show code or bp

rustic sable
#

ooph where to start

#

the spawn code is definitely server, have authority checks and logs everywhere

#

it might be one thing actually...

oak pond
#

how do I make an event only on the server but invisible to the player activating it? like if I play a sound effect clientside, but then also in a server event, (so it feels more responsive to the player) I dont want the player to hear it twice

sour dragon
#

Hello general question. I plan to use DataAssets for my weapon Classes with class references inside. Is it a good practice to put the firstperson (local player model, shooting logic, viewmodel, general spawn on server) AND the multicast equip logic etc. into one blueprint instead of two seperate classes? I saw some examples and people made one ActorBP for the Firstperson Equip Logic and another one for Thirdperson which handled the spawn on server and multicast, anims etc. I just feel its unecessary to seperate it if it can be done in one class. What are your thoughts?

meager spade
#

not sure what your really asking

static charm
#

hey guys im trynna find info from steam on how to enable marketplace drops for ur games any help?

rustic sable
meager spade
#

ask steam support @static charm

static charm
meager spade
#

ask steam support?

static charm
#

im looking for basic genral stuff

oak pond
sour dragon
#

I saw example project of Weapon systems. People used two seperate Equip Classes per Weapon Item. So for example if you had a Shotgun, the Thirdperson BP included the spawn logic, the thirdperson weapon model, the general weapon logic. Then they had another Class called Firstperson, which was basically just the Viewmodel and had a reference to the Equip Class (Enum). Im not sure if this was done because of networking (since the firstperson Class just exists on the client which ends rpcs to the server for calculation)

rustic sable
rustic sapphire
#

Tried to simplify this bit. But client only prints out SERVER--> and the server does not call MULTI_AddKoi at all. Did I miss a boolean somewhere?
the host client works fine.
trying to wrap my head around this.

meager spade
#

@rustic sapphire why you using multicast?

sinful tree
rustic sapphire
#

I was only using multi cast trying to grasp mentally what im supposed to do..
I guess the server owns the bank actor. the client probably doesnt

#

So I guess to answer. no idea.But the BP_SpaceBank actor is one of two bank actors in the scene. one for player 1 one for player 2. Their role is to help with showing captured pieces on a board game.
when player 1(host) captures, the piece moves to the bank and is shown on client 1 and 2. But when client 2 captures, it only shows on their own bank, but the host player doesnt see the capture. so I am trying to figure out how to get the server to perform the capture.

The logic is first called from the player controller and calls an interface "CapturePiece" function call implemented by the piece itself.
That piece then calls the Gamestate to run some extra logic before calling BP_SpaceBank.addKoi() to add the piece to the bank.

dark parcel
#

If you want to call rpc to an actor by the client , you need to set owner (from server,)

#

Either that or route your calls from what the player own. Eg player controller

#

And lastly don't use multicast for anything that needs to be in sync

rustic sapphire
#

luckily it was the first time i tried multicast.
if i ever do need something in sync, what is better to use? repnotify?

dark parcel
#

Replicated variable or rep notify

#

Depend on the need.

rustic sapphire
#

i think i understand. because the actor isnt "owned" by the client ( its owned by the level? server? no one?) the client cant actually communicate through it?

dark parcel
#

If you need something to happend when the variable update, use rep notify

dark parcel
#

But that's basically it.

rustic sapphire
#

i only know a surface idea that its a thing, but the actual scope I need to dive into further, ill go check it out

dark parcel
#

By default the client only owns their controller, pawn and player state afaik

#

Doing rpc call on actor they don't own will result in the rpc getting dropped.

#

It's probably not a good idea to set owner on shared actor either. Not only you can only set one owner but it opens window for cheating

rustic sapphire
#

Yeah thats a whole other can of worms I am worried about.
from a player's perspective, what entities does a person have actual access to?
I tried to keep most logic in gamestate assuming it wasnt directly acessible

#

as well as if someone hosts a game for someone else to connect to, is that even secure?

dark parcel
#

As a beginner my self I won't worry about cheating at all. Rather put all my energy and focus to finish the game.

#

I'm already loading save files from client machine.

rustic sapphire
#

cheating is fine imo, its network security id feel bad about 😛

#

this is more of me not knowing how hackers work

dark parcel
#

I think that we need to be aware that every player have their own instance of the game.

#

That is something you can't control imo. As long it's in their machine, they can do w.e they want with it.

#

Eg giving them self money. Simplest hack is with cheat engine

#

Find the memory address for the Gold and just change the value to 999999

twin juniper
#

Hi, I am using unreal 5.4, is GetServerWorldTimeSeconds still 'bad' and should be replaced?

dark parcel
#

But it will only change the value in their machine. So if you have the logic to purchase an item in the server, then server can reject the purchase regardless of how much gold the hacker has

rustic sapphire
#

Awesome. Thanks for the help @dark parcel

ember vine
#

whats the overhead of replicating a TArray? negligable right ? but just curious

twin juniper
#
class LASTDROPGAME_API UInventoryManager : public UActorComponent
{
    UFUNCTION(Server, Reliable)
    void Server_TryMorphItemToTile(int InItemID, const FItemTransform& TargetItemTransform);
}

void UInventoryManager::Server_TryMorphItemToTile_Implementation(int InItemID, const FItemTransform& TargetItemTransform)
{
    AQyItem* InItem = GetItemByID(InItemID);
    InItem->DebugInt += 1;
}

UCLASS(BlueprintType)
class LASTDROPGAME_API AQyItem : public AActor
{
    UPROPERTY(ReplicatedUsing=OnRep_Data, BlueprintReadWrite)
    int DebugInt = 0;
}

AQyItem::AQyItem()
{
    bReplicates = true;
    bNetUseOwnerRelevancy = true;
}

void AQyItem::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);
    DOREPLIFETIME(AQyItem, DebugInt);
}

void AQyItem::OnRep_Data()
{
    // My debug point is here
}

Guys, somehow my debug point at OnRep never fire like in the video. I did everything right, ReplicatedUsing=OnRep and DOREPLIFETIME

#

Now that i looked at the code, it could very be out of Relevancy..

#

is your OnRep_Data empty when debugging? if so could be compiler optimizations

#

wrap it with UE_DISABPLE_OPTIMIZATION and UE_ENABLE_OPTIMIZATION and try printing a string from it

#

Oh i found the bug, i called

Server_TryMorphItemToTile_Implementation();

instead of

Server_TryMorphItemToTile();

I wish Rider got some error warning for this..

tired current
#

How can I make a method that instantiates a player for each connected local gamepad at runtime

#

Currently I have this which spawns in the characters fine, but the controllers dont seem to be linked to the gamepads even though I pass in the Platform User ID.

#

It only works if i actually disconnect and reconnect the controller, but I dont want to have to do this everytime

tired current
#

Had to set a delay, I guess maybe there is some xinput initialization that happens if it is before beignplay

woven basin
#

Something just dawned on me - Random thought of the day - is client RPCs to server directly proportional to frame rate?

Lets imagine I have an RPC on tick for movement. So every movement of my pawn is RPC to the server.

So if someone is running at 20FPS because of their GPU, they are only sending RPCs 20 times per second? But if someone has a good GPU, they are running at 120FPS, they will be sending RPCs at 120 times per second?

And how does that work for the server, who might be runnign at 50FPS - some clients are sending sub-frame RPCs, and some are sending 2-3 RPCs inside the span of a single tick?

lusty aspen
#

this handles replicating the location for you, and i think might even smoothly interpolating between the positions

#

for reference, your NetUpdateFrequency is how variables will be checked if they changed and sent off across the network. that number should be a lot smaller than your FPS

woven basin
#

i.e. lets say we are replicating mouse movement for aiming or something

#

there are times that things are replicated on tick, unreliably, i was just curious for that

lusty aspen
#

you would put your player rotation on a variable and mark that for replication. variable replication isn't 100% reliable packets are allowed to drop

tender solar
#

Hello, I am moving my game to Multiplayer and I have a concern regarding events.. In my Subsystem I had a delegate like this for when a player comes near an actor: DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FActivationDelegate, AActor* , actor, bool, active);, it works very well but I noticed that when I run 3 players everyone is receiving he event...Then I had a d'oh moment and realized that it was multicast..However when removing multicast I cannot make it blueprintassignable or blueprint callable, so how I am supposed to handle events like this?

quasi tide
#

By keeping it dynamic multicast

tender solar
#

Then how do I prevent it to broadcast to everyone?

quasi tide
#

You can't. That's the entire point of a multicast delegate - to notify all of its subscribers that something happened.

tender solar
#

OKay, so hjow do I code bringing up a menu when a player comes close to an actor?

quasi tide
#

An overlap trigger

tender solar
#

I have this

#

this is what fires the event

quasi tide
#

Just call some method on the player. Use an interface if you want.

tender solar
#

Ah I see thanks

quasi tide
#

Depending on how you want the communication to go is how you would go about setting it up.

tender solar
#

Yeah I went for event driven everything, it's much cleaner but I didn't think about mp

woven basin
tender solar
#

I guess it depends if they are reliable or not

lusty aspen
thin stratus
#

The CMC is basically running at Independent Tick (instead of Fixed Tick)

#

So it has to handle the difference in RPCs

woven basin
#

so if it gets 2x RPCs inside one tick - does it combine them and process them as one move, or does it do both moves in the one frame?

#

i.e. if RPC frame 1 was "forward", and RPC frame2 was "left" - and both arrive inside one tick on the server?

#

does it move forward, then left? Or does it move diagonally forward+left as one? which is a different state?

thin stratus
#

They would be processed as individual moves in the same frame I would say

woven basin
#

so it buffers the RPCs and pulls them in FIFO style?

#

i'll have to find where it does that for my curiosity...

thin stratus
#

That's probably deep in UEs net code

woven basin
#

yeah... maybe for another day - just one of those things I was pondering while in the shower this morning.... I need to get out more...

#

the more I learn and get deep into some of this stuff, the more I realise the less I actually know 🙂

thin stratus
#

Dito

floral sail
#

Ok further down the testing I have finally figured out that RepNotify's are totally fine to Initialize Pawns. They are called AFTER the Pawn and all of its components are created, so no condition race.
The only thing that isn't created by the time I need it is the Widget. Not the Widget Component, but the Widget of that Component.

Which makes me wonder if Widget Components are even considered as a good practice for creating the "Pawn UI" (such as Health Bar, or in my case Name Above Head)?

tardy fossil
#

well unless you want to do some custom programming, widget components are the only option for displaying UI in world space

sinful tree
floral sail
#

Yes there are 2 possible solutions - Loop Timer in OnRep function (which realistically will only loop once) or do Init function in Widget Construct with the data from the Pawn (which is replicated by the time Widget is constructed).

#

Its just that it adds some work. I wonder why it is made that way. Why would Widgets initialize after its Widget Component, Pawn, OnRep and all that.

#

But at least I now know that OnRep functions are totally fine and work exactly as intended. Its just some race condition with Widgets of the Widgets Components that you have to know about.

tender solar
#

Hey again, I have players who open a widget to get the status of a board...when the status change i fire an event from server...from there I update the opened widgets...I'm still a bit confused but I managed to get something that works except that (and it bugs me XD) I need to add a delay before updating the widgets (5 seconds is exaggerated for debugging purpose)...I've read about repnotify but i have several variables that can change... so I have thought about a boolean called IsDirty, however would all the variables be updated on client after using repnotify on IsDirty? How would you handle this?

#

it bugs me because I did all that stuff to avoid adding a delay before updating the widget...

sinful tree
#

And that's the source of your problem - sending an RPC after changing a variable doesn't guarantee that the variable was replicated before the RPC is received on the client.

tender solar
#

So, how can I tell the clients to update their widgets?

#

One rep notify for each of the variables?

dark parcel
#

depends on your design

#

On Rep Notify -> if Widget Exist -> Update Widget Text

#

or for something like health, the widget can just read straight from the player's health

tender solar
#

I see thanks

dark parcel
#

since health is a replicated variable, it gets updated every NetUpdate

#

if you don't fancy binding/ticks you can also use delegates

#

but if you are doing multiplayer, you should already know how to use delegate

tender solar
#

Actually it is very simple (2 player names and their player id) but on the long run it will be very complicated with different cases

#

Yeah I'm starting MP can't say I'm mastering it

sinful tree
#

Is this "board" like the scoreboard or something?

tender solar
#

nah it's a chess board, it will handle timings, variants, starting position, stuff like that..I'm trying to keep it simple but by nature it will be complex

#

the widget will also be updated as the game goes

#

that's why i'd rather have 1 update event than following 10-20 variables

sinful tree
#

Your board should probably be an array of some kind.

#

Then you'd only have a single variable that gets changed and OnReps.

tender solar
#

you mean onrep the board itself?

violet sentinel
#

or just a single BoardData struct that replicated from server

tender solar
#

I see, so I move all the replicated stuff to one struct and replicate it? that could work

#

Thanks for help

real folio
#

hiii, does anybody know why find session can't find anything? It doesn't say fail or success. With console command open ip:port i can join

dark parcel
#

@real folio I don't know since I used steam but why not just use Steam Advanvce Session?

#

I don't think kids these days can tolerate port forwarding their router

twin juniper
#

Hey guys, any good starting point for making a lobby and matchmaking system?

I am just watching some youtube tutorial rn: https://www.youtube.com/watch?v=dQD_sPFXcBg

👨‍🏫 My Patreon link:
https://www.patreon.com/kekdot
Download Project Files | Premium Tutorials | Courses

💦 Get our Game on Steam | Kekdot Center:
https://store.steampowered.com/app/1487180/Kekdot_Center/


🧑🏻‍🚀Get the project files here on Patreon: https://www.patreon.com/posts/hosting-joining-66351331

In this video we take a look at how w...

▶ Play video
sinful tree
#

back in my day I had a HUB and some software running on the computer hooked up to the internet to share its internet access to other computers connected to the hub!

sinful tree
twin juniper
#

Where do i learn those things?

sinful tree
#

That's not something I'd be able to help you with...
If you're trying to build your own matchmaking and lobby system, you're effectively asking "How do I build a system that can manage queries to keep track of and find games" which is no small feat and way outside what Unreal handles.
If you want to use an existing matchmaking and lobby system, then you'd have to find one to use like Steam has an implementation of it, and I'm sure EOS does, and then find out what is needed to actually make calls to their specific systems and they'll usually have some documentation available that can let you know how to do it.

real folio
balmy turret
#

In a dedicated server enviroment, where should functions like "do damage" live? Documentation is scant and I've been told the game mode isn't appropriate?

sinful tree
rustic sable
#

if you have Niagara systems on a replicated projectile and you want to DestroySystem / ActivateSystem on them do you need to multicast? Setting them as replicated and in lifetimeRepProps and doing this in a server call doesn't seem to be enough

balmy turret
tender solar
#

In this video we take a look at the finished project and step through each of the features that will be covered in this series. We show our functional Main Menu and its options, a lobby where players can chat with one another and select their characters for the game, some server options such as changing the map or match time as well as the abili...

▶ Play video
rustic sable
dark edge
#

yes

#

Cat got your tongue keyboard?

sinful tree
#

Yep... lol

sinful tree
# balmy turret Right on, that approach sounds simple. The server will be authoritative in this ...

Authority of the server comes from not allowing clients to tell the server what is happening. If the server detects that the damage should be occuring then it can go ahead and apply it, and then replicate the values to the clients - that is where the authority comes from. If you did something like, the client tells the server they did 9999 damage to target A and you go ahead and trust the client and believe that to be true and apply the damage, then you're no longer having the server act as the authority as you let the client dictate what happened.

#

You at time have to trust clients to send the server some data, but it also boils down to what amount you want to trust them and with what particular data. Like, nothing wrong with a client wanting to request to pickup Actor A on the ground as that's something you can verify on the server they can do and then grant them the item if the actor is within range and they have inventory space, etc., but it's not good if you allow the client to request "Pick up Specific Godly item with +99999 Damage" as you don't really have anything to validate on other than maybe the properties of the item and thereby you're going to be letting them choose whatever it is they're picking up rather than telling them what they picked up.

clever hound
#

When I drop the sword it switches ON replicated movement on the sword. When I pick it up again I turn OFF replicated movement. But for some reason it is glued on the air for few seconds before the error correction happens for the CLIENT because of the location or rotation difference when the replicated movement is turned off.

#

Is there a way to refresh it somehow to make the movement client sided immediately after turning off replicated movement

#

I tried updating the location and rotation on multicast but that has no effect

proven pagoda
#

If it is, calling the activate deactivate would be multicast, but simply destroying the whole actor would replicate without a multicast. Destroy is called on all clients by default

#

Not destroy niagara component, destroy actor

#

The client isn't bound to the overlap, so it will never tell the niagara component to activate/deactivate

proven pagoda
clever hound
proven pagoda
#

Isn't there a setting in the physics somewhere for prediction? What engine version are you?

clever hound
#

5.3

proven pagoda
#

All my 5.3 got wiped off my harddrive I'll see if there's a project left I can boot up

#

My github was not as strong as I thought it was

clever hound
#

It works fine after picking up but there has always been that annoying bug in the beginning when you pick something up, it has to move a little before it goes into client sided mode or smth

proven pagoda
#

Well no nevermind because your sword is a simulated proxy at all times

#

it has no controller

#

idk if there's a setting for that on simulated proxies

#

I'm still trying to wrap my head around this tho a bit. When you drop it, it switches ON replicated movement because the server is now moving the sword, but when you grab it, you want to turn OFF replicated movement because it should be now locally predicted from standard replicated movement options in Unreal

#

I've just never used physics movement this is so fascinating

#

I just replicate the actor and it moves

clever hound
#

It is attached to the hand with physics constraints so i guess when the players character has replication turned on the sword moves with it

proven pagoda
clever hound
#

idk

#

There is not a lot of info on VR + multiplayer + physics combo

#

Its a lot of just trying things out

proven pagoda
#

Ohhh yeah this is VR as well I forgot about that part

#

Bro you're just like me I've been doing this for 8 months and I'm currently working on a coop shooter using GAS and RPG elements and stuff

#

Just go for the big games let's go

#

What happens if you only put the option bReplicates on and nothing else

clever hound
#

Like on what state? Grabbing? Dropping?

proven pagoda
#

This my weapon it doesn't have anything but this enum in lifetime props only thing I have is in the constructor I set bReplicates to true

#

Any components added to the actor I have to check replicated on those subobjects and components

#

I also don't drop or pick anything up using physics constraints at the same time

#

I just attach weapon to socket on the skeleton and set bReplicates and then like where my bullet flash is I set that in the wrong spot so I'll have to fix that now but the rest just goes with it. Have you thought maybe attaching via attachment to the skeleton?

clever hound
proven pagoda
#

Not exactly that but you get the idea

clever hound
proven pagoda
#

I lived on my Quest

proven pagoda
#

I wonder if that's why VR games have so much performance issues is because all the physics everywhere

clever hound
sinful tree
#

And at typically higher refresh rates.

clever hound
#

But on the quest maybe the physics can be a cause too, I have never used a standalone hmd tho

proven pagoda
proven pagoda
#

PCVR is just 100x these standalones

proven pagoda
clever hound
proven pagoda
#

Still for whatever it is at this point, it looks good

tender solar
#

I went for early access I naively thought that I would get feedback and beta testers XD

real folio
# real folio

Okay, so for each loop is somehow broken, it doesn't send output to the create widget and idk what to do with it

tender solar
#

Your create widget does not have a player connected?

real folio
#

Doesn't change anything, but odd is when i plug it to completed, it works for one session, but connecting is broken

tender solar
#

Do you set the player controller in create widget?

real folio
#

yes i tried, no luck with that

#

it's like sesion isn't saved properly

tender solar
#

you can still dump it with printstring+append

thin stratus
#

@real folio I assume you are trying this in the same LAN or even on the same PC, right?

real folio
#

same pc

rustic sable
# proven pagoda Not destroy niagara component, destroy actor

Ah ok, so the replicated instances do need the activate / deactivate locally then. Yes, the destroy itself is working as expected just on the server. Currently I just do an authority check OnOverlap but I suppose you checking for authority before doing the bind itself? That way actually seems a bit cleaner.

twin juniper
#

Hey, can i test Steam subsystem thing without paying 200$ to publish my game?

#

I am reading the document but it's so long

clever hound
twin juniper
#

Can it run 2 players lobby?

#

From different place

clever hound
tender solar
#

yes appId 480

#

and it's 100$ fwiw

proven pagoda
azure hull
#

Hi, have anyone tried to use FFastArraySerializerItem structs for DataTables? It seems that structs do not show up unless FTableRowBase is added, but it cannot be added together with FFastArraySerializerItem.
What would be best approach for this? Idea is to use FFastArraySerializerItem for inventory system, however I want to have a loot table defined as DataTable with those structs. But structs are not showing up.

thin stratus
#

Yeah you can't combine that. That's two different things. You can reference the Row, that is based on a different Struct, in the FastArray Item fwiw.

twin juniper
thin stratus
#

480 does not cost you anything

#

But you can't release with it

#

Ultimately you need your own, which does then again cost $100

twin juniper
#

100$ is for publishing on steam

#

with their tools

#

ok nice

thin stratus
#

You also don't get your own AppId without that

#

So again, if you want to release your game later down the line, with Steam, you gotta pay

#

For development, you can use 480, which mimics Steam's Spacewar game.

#

There is no way around paying the $100 dollars if you want to officially ship the game over Steam.

twin juniper
#

I'm fine with that. Just don't want to pay just for testing purpose

thin stratus
#

Yeah then you are fine for now

twin juniper
#

but if you test on steam, what are you going to use it for lol?

thin stratus
#

Well you might later down the line decide that you can't make the game, or that you ship on EGS or so

#

No need to buy an AppId early

twin juniper
#

it that possible?

#

with servers?

#

yeah if that's what connect players together

#

i mean, yes, no local host

#

steam doesn't give you free server (you have to pay servers yourself..)

thin stratus
#

You would still need to additionally pay for a Server Host and a Service to handle the Matchmaking (spin up and down Servers on demand).

#

Which is pretty juicy in pricing

twin juniper
#

Do we have free server hosting for small usage?

#

What if he uses virtual server? (idk what virtual server means but I'm curious)

thin stratus
# twin juniper Do we have free server hosting for small usage?

The point is that the Matchmaking System itself is not UE related, and also nothing Steam provides you with. A Matchmaking System where you can queue up for Games, even if just 1 vs 1, need a backend to handle that. Most people fall back to stuff like Playfab, but the truth is that this is all very expensive and not really something for a single developer or small studio.

twin juniper
thin stratus
#

Small Studios or Single Developers, that don't shit money, should stick with:

  • Singleplayer
  • Multiplayer ListenServer
  • Multiplayer Player-hosted DedicatedServer
twin juniper
#

Matchmaking is expensive..? I thought i'll just do an array and some if statement

twin juniper
thin stratus
twin juniper
#

an array of what?

twin juniper
twin juniper
thin stratus
#

I can't answer that.

solar stirrup
#

Yeaaaaah nah that's not gonna be that easy

thin stratus
#

Even if you code the Matchmaking System yourself (outside of UE of course), which would take you probably multiple weeks/months, you still need to host that crap, and the DedicatedServers somewhere, which is still expensive.

twin juniper
solar stirrup
#

Focus on making a 1v1 fighting game

#

You can tack on matchmaking on top in the future if it becomes worth it (i.e. you get funding, a player base, whatever)

#

In the meantime you can potentially fake matchmaking using Epic Online Services, you're not gonna have ELO but you'll be able to "matchmake"/find other players to play against.

twin juniper
twin juniper
#

10$/day for 1 server, idk... around that maybe

solar stirrup
#

Throwing random numbers won't help

thin stratus
#

Highly depends on where you host, and if you use a Linux Build

#

And on the game

twin juniper
#

Is a linux build cheaper?

thin stratus
#

Usually, yes

solar stirrup
#

Focus on being able to find other players to play with

twin juniper
#

mhm I see, another system that I gotta learn

solar stirrup
#

You can probably also use Steamworks for that anyway

#

I just know EOS makes that easy

twin juniper
#

So matchmaking is like x2 time harder than lobby ?

#

Or lobby is also hard?

solar stirrup
#

Depends on your knowledge

#

Lobbies aren't inherently hard depending on what you need in them

twin juniper
#

I think that the difference is the first should use server and the second can use hosting (the client is a server)

thin stratus
solar stirrup
#

That's not how lobbies work

thin stratus
#

These are really random numbers. Can be double the pricing.

#

And it's JUST the Server Hosting of PlayFab

#

Nothing else. The Storage, Requests, and what not all cost extra.

#

And that is if you can even host 10 Game Servers on one of them

twin juniper
solar stirrup
#

Online services like Steamworks and EOS have sessions

#

Lobbies are sessions

thin stratus
#

If you can only do 2-5, it already gets a lot more expensive.
On top this is probably the lowest tier, so you might need to generally take stronger machines. And it's only one area of the world, US East, you usually have multiple.

solar stirrup
#

They're hosted by Steam/Epic so you don't have to pay for those (well, outside of the Steam Direct fee)

twin juniper
#

there would be a host that invite people in his session

#

200$ a month lmao

thin stratus
#

Double the vCPUs and half the GameServers already puts you at 860

#

And no one here knows your game specifics and how that all works out

#

You usually have to figure that out by running stress tests when the game is further

#

And of course, "only" for 50 players

#

If you expect more, it will be more expensive. Depending on your monetization idea this will not work out anyway

twin juniper
#

this is some real business problem that i didn't thought of haha

solar stirrup
#

That's why most indie games stick to P2P or community hosted servers

thin stratus
#

You are not the only one that comes here, thinks this is all easy and free, and gets slapped by reality

twin juniper
#

i gotta figure those numbers out somehow

solar stirrup
#

Take a step back and reconsider your idea for your game

thin stratus
#

Also, I didn't even set the network egress a player might produce

solar stirrup
#

You can still do P2P for a competitive game, Dead by Daylight did it for a few years. It's not ideal but it worked okay. Once they got the money they switched to dedis.

thin stratus
#

Don't even have numbers on that

twin juniper
thin stratus
#

@chrome bay Explain yourself ^

twin juniper
solar stirrup
#

UObjects can have functions, structs cannot

twin juniper
solar stirrup
#

I use UObjects for inventories, structs for item instances

thin stratus
#

UObjects are a lot more powerful than e.g. structs

solar stirrup
#

USTRUCTs can't have UFUNCTIONs

#

And if your items are fully C++, my condolences

thin stratus
# twin juniper structs in C++ can

Structs suffer from e.g. object slicing if you ever want to bring this to BPs.
And James said already multiple times that using FInstancedStruct to counter that brings probably poor performance

twin juniper
#
USTRUCT(BlueprintType)
struct FItem
{
    GENERATED_BODY()

    UPROPERTY(EditAnywhere)
    TObjectPtr<UItemsDataAsset> ItemDataAsset = nullptr;

    UPROPERTY(EditAnywhere)
    int ValueChanging = 0;
    
    bool IsEmpty();

};
```that's my item struct
thin stratus
#

I'm sure her knows what he's talkinga bout

solar stirrup
#

I use FInstancedStruct for my item instances

twin juniper
#

uobject have self replication too, i have to recode my whole inventory item to uobject for that

solar stirrup
#

it goes something like this:

struct FItemInstance
{
  UItemAsset* ItemDataAsset;
  FGuid ItemGuid;
  TArray<FInstancedStruct> Data;
};
twin juniper
#

So I would have a UObject and where should I put it?

solar stirrup
#

I do have some optimizations in the net serialization, can't get too much into detail because that part was specific to an NDA project

#

but the gist of it is that I can determine the UScriptStruct of the instanced struct data and not have to keep writing it

#

shaves off a few bytes for each instanced struct, and I keep instanced structs lightweight

#

I still believe FInstancedStruct is awesome for items, but I do see the potential issues with bandwidth

#

With enough tinkering it's probably fine

thin stratus
#

Yeah but this might go beyond what a lot of peeps can do

#

Falling back to UObjects as a first step is probably okay

solar stirrup
#

I still use UObjects for inventories cause it makes stuff like backpacks super easy

#

Can just transfer the backpack from an item actor in the world to a player by switching the outer of the UObject

twin juniper
#

UObject->CustomUObject->UInventorySlot ?
ActorComponent->Player

#

What does the UInventorySlot do?

#

If you are lazy like me and don't wanna write any extra code, you can go for AActor. I coded all my item as AActor and the whole thing still work

#

I think I just don't understand why to use a UObject or AActor since I'm using an ActorComponent and some struct only..

#

Sure, you can go for it like me. Basically i re-code my inventory like 8 times already

#

Just keep coding with the current setup you have

#

If you never need to switch, then it's fine. If you need to switch, you would know the reasoning

#

I want it to be perfect tho, to sell it

#

what do you mean by perfect?

#

in what aspect?

#

in every aspect

#

idk about you but my code, if it run, it's perfect to me

#

lmao true, but I want to optimize it and understand what's going on with UObject

#

if you want to optimize it then you could profile

#

switch everything to uobject and check if it run any faster

solar stirrup
#

Actors for each items isn't a good idea if you're gonna have more than a handful

twin juniper
#

I dont get what UObject for slots do

twin juniper
solar stirrup
#

why slots

#

doesn't have to be 1 million to become an issue

twin juniper
#

yeah but how much though

thin stratus
#

There is a reason people don't do that

twin juniper
#

i tested it and not until 100k it have some perf problem

#

yeah i didnt test the channel thing

solar stirrup
#

Yeah if you test it in singleplayer, sure

#

(still don't believe that you had 100k item actors but okay)

twin juniper
twin juniper
#

I have an array of items in my InventoryComponent

#

You don't move your item around?

thin stratus
#

Have you considered the fact that James' inventory is not matching your requirements :P

twin juniper
#

like in minecraft?

hushed sierra
#

I'm trying to create a multiplayer compatible system where players have to use sensors to discover enemy targets & until they get enough information about an actor what they see may be different than what the actor is in truth. For example, if the real target has a cube mesh and 100 health, player A might see a sphere mesh and 50 health while player B sees 100 health and a cone mesh.

I'm struggling to get 2 clients to see different meshes and health values at the same time. If I replicate the mesh variable, all the clients see the same thing, but if I don't, only the server mesh changes. Any idea how I might accomplish that, or where I keywords I should be looking for?

twin juniper
twin juniper
#

why are you having questions

twin juniper
strong vapor
#

When using the custom flags in the CharacterMovementComponent.. is it possible to have them be assigned to something other than 0 or 1?

twin juniper
strong vapor
#

thanks!

twin juniper
thin stratus
#

You would need to grab locally frame the invidual player and then decide what they should see

normal raven
#

Can anyone shoot from the hip and guess why my player has no input when using "open [my IP]" and connecting to the dedicated server? It calls from the main menu and the server is on the game level

twin juniper
# twin juniper I want to do what pro do... idk

You don't need to micro-optimizing when you are not a pro. I have a bunch of bug fixing to do and all i wish is everything worked

You can focus on adding feature instead of optimizing them

thin stratus
normal raven
#

But it works if I do PIE and just launch the client and server in the game level

thin stratus
#

Then you are failing to set your InputMode properly

#

It's probably still InputOnly from the MainMenu

normal raven
#

Yeah maybe

thin stratus
#

CommonUI should in theory help with that

normal raven
#

KK thanks

#

Lemme look

#

Yeahhhhhhh that was it! I was enabling the input in the player controller "On Possess" function, moving to begin play helped. Thanks!!!

gloomy axle
#

Are there plugins that help you debug multiplayer replication for somewhat complex systems like inventory interaction?

#

I have three bugs I'm trying to debug:

  • Item hides for client, not host, on scroll selection
  • Host picks up item, client doesn't see attachment
  • Client picks up item, host sees attachment, client doesnt

The main flow for this test is:

  • Host picks up item, client can see

  • Client picks up item, host can see

  • When client is scrolling, the item hides for the client, but not for the host

  • Client drops item, host can see

  • Host drops item, client can see

  • Host picks up item, client doesn't see attachment, but host does

  • Client picks up item, host sees attachment, but client doesnt

  • The "item" is set when the player presses "E" on the item they are looking at, by a line trace

  • When the client is scrolling, when up and down scroll input, it deselects and selects the next slot depending on the input

  • The Host and Client some how see each other pickup an item the first time, but not the second time after one of them drops an item

#

the TLDR of this is basically, I am trying to let the players interact with the items they dropped for each other

gloomy axle
#

holy shit i got it working

#

the culprit? my dumb brain

#

the mesh on the item and the mesh on the player weren't replicated

#

but the actually actors were

#

which is hella confusing

#

if anyone has a similar issue in the future, check yo mesh components if they are also replicated

twin juniper
gloomy axle
#

dude its confusing

#

the actor itself can be checked as replicated

#

but that doesnt make the component mesh, which the actor contains, replicated

#

like what

sinful tree
#

Yeah you don't necessarily want everything to be replicated, you replicate what you need to.

#

That mesh for example.... You may not need it replicated. You could potentially use an OnRep to trigger the logic that makes it appear in their hands.

gloomy axle
lusty aspen
#

trying to settle a debate with a coworker. i know everything always depends on the use case, but in general, networking things within gameinstance is generally a bad practice right?

fossil spoke
#

I ask because the GameInstance is not replicated.

lusty aspen
#

having an repliated variable or RPCs

fossil spoke
#

Ok

#

So the GameInstance is not replicated, meaning it does not support those things.

#

Its not "bad practice"

#

Its just simply not possible.

lusty aspen
#

ahhh ok that settles it haha thank you

twin juniper
#

LMAO

#

who won?

lusty aspen
#

hahah me. i had never attempted to even try to do networking in game instance bc it felt bad to me

#

felt kinda silly asking here now that i know it was simply impossible

twin juniper
#

Hey, let's see if i got this right, so basically this 8 nodes is all unreal function related to session managing?
If i want some thing like matchmaking i got to use Playfab or Steam (does Steam even have it?)

twin juniper
#

Oh, i didnt know we have another multiplayer channel

lusty aspen
twin juniper
worthy oak
#

guess its a question do you value your time or money more XD

twin juniper
worthy oak
#

yeah i mean thats pretty easy

#

me personally I dont even need most of the steam sdk cause my backend is all in AWS

twin juniper
#

for sessions?

worthy oak
#

only thing steam might do for me is linking login and maybe MAYBE steam invites

worthy oak
#

and matchmaking

#

dynamically spinning up and down servers based on demand

twin juniper
#

you are a solo dev and have multiple dedicated server?

worthy oak
#

mhm

#

my day job is infrastructure

#

gives me a ton of access and knowledge to equipment

twin juniper
#

good to know, I'll be able to ask you if I need help with sessions infrastructure :3

worthy oak
#

yeah happy to help where I can

#

already have a few videos going over login in AWS

#

for unreal

twin juniper
#

you have a yt channel?

worthy oak
#

yeah

twin juniper
#

send

worthy oak
#

check my profile got it linked

#

attempting to combat the BS I keep seeing on youtube regarding AWS lol

twin juniper
#

what are those kits LPSP and FPS?

worthy oak
#

that was a much older video from a project im not doing anymore XD

#

LPSP is low poly shooter

#

its a framework and its honestly realyl sweet

#

but I dont feel like making a shooter anymore lol

fossil spoke
#

Lets move back ontopic please, if you want to continue move into #lounge. Thanks.

twin juniper
#

it looked really good

twin juniper
#

Sadly i only have 1 pc lol

worthy oak
#

Most just use the advanced sessions plugin

gloomy axle
tired current
#

Is there a way to place nav link proxy in a Blueprint?

#

or can you change the navlinkproxy position at runtime?

twin juniper
#

Is it just because it's broken in BP

worthy oak
#

that is yeah

#

and no if I recall its just an example and epic didnt bother updating it

#

since its not really on them to update thirdparty

twin juniper
#

is that the EOS?

worthy oak
#

no steam

twin juniper
#

ohh it's steam sessions? built in?

worthy oak
#

yes but most just use a plugin to either fully expose it

#

or get more features out of the sdk

twin juniper
#

(not sure if he installed the SDK for him to work)

worthy oak
#

its built in

#

its just very basic as you can see

twin juniper
#

the steam SDK comes with the Engine?

worthy oak
#

not the full or updated one no

#

well maybe it is the full one

#

but its not the most up to date one

twin juniper
#

How is it possible to take a part of the SDK but not all of it

worthy oak
#

because steam sdk has a lot of dlls and epic doesnt include all of them

twin juniper
#

normally you would install it

worthy oak
#

nah copy and paste

#

either engine level or project level

twin juniper
worthy oak
#

most of the other sdk stuff isnt for games its for other API stuff

#

I also dont recall how much I can actually share on this subject or if anyone actually cares

#

cause ya know NDA

twin juniper
#

NDA?

worthy oak
#

so I will error on the side of steam has an sdk it lets you do "things"

worthy oak
#

aka you cant talk about it

twin juniper
#

steam sdk is free of use

worthy oak
#

you need a steamworks account to make full use of it

#

there are examples of it yes like app id 480 that lets you test

#

before getting such an account

twin juniper
#

mhm I see, so C++ is required or an extern Plugin to make things work fully with Steam sessions and SDK?

worthy oak
#

yeah because its a third party sdk

#

but plenty of plugins exists that expose it to BP

#

like advanced sessions

twin juniper
worthy oak
#

app id 480 is a free one anyone can use

#

and test until you buy a steamworks license adn get your own app id

twin juniper
#

got it

gloomy axle
#

imo if you have $100 to spend on getting your own app on steamworks, id do so as soon as possible

#

you want the game to be visible as soon as possible

worthy oak
#

Yeah and it’s easier to test with in my experience

#

Exspecially with sessions

gloomy axle
#

yep

twin juniper
gloomy axle
#

no

twin juniper
#

Could it work like that

gloomy axle
#

you need the host and client to be on separate machines

#

separate steam accounts

worthy oak
#

Well steam does support dedicated servers

gloomy axle
#

(assuming its steam)

#

true

worthy oak
#

But the sessions are just yeah joining players together

gloomy axle
#

i guess im just talking from a P2P perspective

worthy oak
#

Where one player hosts

twin juniper
worthy oak
#

It’s listen servers basically

twin juniper
#

Listen server type..

gloomy axle
worthy oak
#

And then they do have support for finding and joining dedicated servers as well

twin juniper
worthy oak
#

Yes that’s what the sessions do

twin juniper
gloomy axle
#

if you want to use advanced steam sessions, the host and client need to be separate machines

#

oh okay

#

it's like a library from advanced sessions

#

but for steam apis

worthy oak
#

Other clients would join you

#

Which would be other steam accounts

gloomy axle
#

that's if its dedicated tho

twin juniper
#

no?

worthy oak
#

no that’s listen servers

gloomy axle
#

?

worthy oak
#

dedicated is server only no client

#

your all clients joining a server

twin juniper
#

there's P2P, Dedicated Server, Listen Server which is a fake P2P

worthy oak
#

listen server is one player hosts and has a client as well

#

And other clients join your computer

gloomy axle
#

im talking from a pure p2p i guess, where the player is the host

twin juniper
gloomy axle
#

you can do that with advanced steam sessions

#

just neesd to be seperate machines

#

for connecting two players

worthy oak
#

mhm each player needs their own steam account

#

and machine

gloomy axle
#

i have p2p set up atm on ue5

#

for my current game lol

twin juniper
#

the plugin doesn't matter, all UE replication stuff is based on that (Not P2P based)

worthy oak
gloomy axle
#

I mean, going off of what I know about p2p, I have the player become the host of the session. Then players join that player's session. The player is basically the server, with auth perms and stuff

#

imagine lethal company

worthy oak
#

I ask because unreal doesnt do p2p

#

you have listen servers, standalone, and dedicated servers

gloomy axle
#

isn't peer 2 peer just a player hosting and allowing other players to join

twin juniper
#

he's mixing P2P with listen server, which does work the same

gloomy axle
#

or is that listen

gloomy axle
#

bruh

worthy oak
#

its similiar

#

but in unreal world

gloomy axle
#

these youtube titles need to change then smh

worthy oak
#

its authority based listen server

#

no p2p

gloomy axle
#

i have seen many advanced steam session tutorials dedscribing this as p2p

#

smh smh

twin juniper
gloomy axle
#

lemme get my history

worthy oak
gloomy axle
#

this

worthy oak
#

oof XD

gloomy axle
#

kibibyte is really good tho fyi

worthy oak
#

the thumbnail

#

proves its not p2p lol

gloomy axle
#

IT SAYS PEER TO PEER IN THE TITLE