moved the NetworkEntityManager into the backend code.
This commit is contained in:
parent
f6c02d459d
commit
a938e9c66c
7 changed files with 186 additions and 183 deletions
|
|
@ -622,3 +622,164 @@ void *DObject::ScriptVar(FName field, PType *type)
|
|||
// This is only for internal use so I_Error is fine.
|
||||
I_Error("Variable %s not found in %s\n", field.GetChars(), cls->TypeName.GetChars());
|
||||
}
|
||||
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
//
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
void NetworkEntityManager::InitializeNetworkEntities()
|
||||
{
|
||||
if (!s_netEntities.Size())
|
||||
s_netEntities.AppendFill(nullptr, NetIDStart); // Allocate the first 0-8 slots for the world and clients.
|
||||
}
|
||||
|
||||
// Clients need special handling since they always go in slots 1 - MAXPLAYERS.
|
||||
void NetworkEntityManager::SetClientNetworkEntity(DObject* mo, const uint32_t id)
|
||||
{
|
||||
// If resurrecting, we need to swap the corpse's position with the new pawn's
|
||||
// position so it's no longer considered the client's body.
|
||||
DObject* const oldBody = s_netEntities[id];
|
||||
if (oldBody != nullptr)
|
||||
{
|
||||
if (oldBody == mo)
|
||||
return;
|
||||
|
||||
const uint32_t curID = mo->GetNetworkID();
|
||||
|
||||
s_netEntities[curID] = oldBody;
|
||||
oldBody->ClearNetworkID();
|
||||
oldBody->SetNetworkID(curID);
|
||||
|
||||
mo->ClearNetworkID();
|
||||
}
|
||||
else
|
||||
{
|
||||
RemoveNetworkEntity(mo); // Free up its current id.
|
||||
}
|
||||
|
||||
s_netEntities[id] = mo;
|
||||
mo->SetNetworkID(ClientNetIDStart + id);
|
||||
}
|
||||
|
||||
void NetworkEntityManager::AddNetworkEntity(DObject* const ent)
|
||||
{
|
||||
if (ent->IsNetworked())
|
||||
return;
|
||||
|
||||
// Slot 0 is reserved for the world.
|
||||
// Clients go in the first 1 - MAXPLAYERS slots
|
||||
// Everything else is first come first serve.
|
||||
uint32_t id = WorldNetID;
|
||||
if (s_openNetIDs.Size())
|
||||
{
|
||||
s_openNetIDs.Pop(id);
|
||||
s_netEntities[id] = ent;
|
||||
}
|
||||
else
|
||||
{
|
||||
id = s_netEntities.Push(ent);
|
||||
}
|
||||
|
||||
ent->SetNetworkID(id);
|
||||
}
|
||||
|
||||
void NetworkEntityManager::RemoveNetworkEntity(DObject* const ent)
|
||||
{
|
||||
if (!ent->IsNetworked())
|
||||
return;
|
||||
|
||||
const uint32_t id = ent->GetNetworkID();
|
||||
if (id == WorldNetID)
|
||||
return;
|
||||
|
||||
assert(s_netEntities[id] == ent);
|
||||
if (id >= NetIDStart)
|
||||
s_openNetIDs.Push(id);
|
||||
s_netEntities[id] = nullptr;
|
||||
ent->ClearNetworkID();
|
||||
}
|
||||
|
||||
DObject* NetworkEntityManager::GetNetworkEntity(const uint32_t id)
|
||||
{
|
||||
if (id == WorldNetID || id >= s_netEntities.Size())
|
||||
return nullptr;
|
||||
|
||||
return s_netEntities[id];
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
//
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
void DObject::SetNetworkID(const uint32_t id)
|
||||
{
|
||||
if (!IsNetworked())
|
||||
{
|
||||
ObjectFlags |= OF_Networked;
|
||||
_networkID = id;
|
||||
}
|
||||
}
|
||||
|
||||
void DObject::ClearNetworkID()
|
||||
{
|
||||
ObjectFlags &= ~OF_Networked;
|
||||
_networkID = NetworkEntityManager::WorldNetID;
|
||||
}
|
||||
|
||||
void DObject::EnableNetworking(const bool enable)
|
||||
{
|
||||
if (enable)
|
||||
NetworkEntityManager::AddNetworkEntity(this);
|
||||
else
|
||||
NetworkEntityManager::RemoveNetworkEntity(this);
|
||||
}
|
||||
|
||||
void DObject::RemoveFromNetwork()
|
||||
{
|
||||
NetworkEntityManager::RemoveNetworkEntity(this);
|
||||
}
|
||||
|
||||
static unsigned int GetNetworkID(DObject* const self)
|
||||
{
|
||||
return self->GetNetworkID();
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION_NATIVE(DObject, GetNetworkID, GetNetworkID)
|
||||
{
|
||||
PARAM_SELF_PROLOGUE(DObject);
|
||||
|
||||
ACTION_RETURN_INT(self->GetNetworkID());
|
||||
}
|
||||
|
||||
static void EnableNetworking(DObject* const self, const bool enable)
|
||||
{
|
||||
self->EnableNetworking(enable);
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION_NATIVE(DObject, EnableNetworking, EnableNetworking)
|
||||
{
|
||||
PARAM_SELF_PROLOGUE(DObject);
|
||||
PARAM_BOOL(enable);
|
||||
|
||||
self->EnableNetworking(enable);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static DObject* GetNetworkEntity(const unsigned int id)
|
||||
{
|
||||
return NetworkEntityManager::GetNetworkEntity(id);
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION_NATIVE(DObject, GetNetworkEntity, GetNetworkEntity)
|
||||
{
|
||||
PARAM_PROLOGUE;
|
||||
PARAM_UINT(id);
|
||||
|
||||
ACTION_RETURN_OBJECT(NetworkEntityManager::GetNetworkEntity(id));
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue