mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-04-01 20:36:42 +00:00
Fix race-related graphical glitches when players spawn
This commit is contained in:
parent
a840d84b39
commit
aa69c156c7
1 changed files with 17 additions and 8 deletions
|
@ -54,7 +54,6 @@ void Players::CreatePlayer(RakNet::RakNetGUID id)
|
||||||
dedic_pl.mName = _player->Npc()->mName;
|
dedic_pl.mName = _player->Npc()->mName;
|
||||||
dedic_pl.mFlags = _player->Npc()->mFlags;
|
dedic_pl.mFlags = _player->Npc()->mFlags;
|
||||||
|
|
||||||
|
|
||||||
if (_player->state == 0)
|
if (_player->state == 0)
|
||||||
{
|
{
|
||||||
dedic_pl.mId = "Dedicated Player";
|
dedic_pl.mId = "Dedicated Player";
|
||||||
|
@ -63,33 +62,41 @@ void Players::CreatePlayer(RakNet::RakNetGUID id)
|
||||||
|
|
||||||
|
|
||||||
_player->reference = new MWWorld::ManualRef(world->getStore(), recid, 1);
|
_player->reference = new MWWorld::ManualRef(world->getStore(), recid, 1);
|
||||||
|
}
|
||||||
|
|
||||||
// temporary spawn character in ToddTest cell
|
// Temporarily spawn or move player to ToddTest whenever setting base info
|
||||||
ESM::Position _pos;
|
ESM::Position _pos;
|
||||||
world->findInteriorPosition("ToddTest", _pos);
|
world->findInteriorPosition("ToddTest", _pos);
|
||||||
MWWorld::CellStore *store = world->getInterior("ToddTest");
|
MWWorld::CellStore *cellStore = world->getInterior("ToddTest");
|
||||||
|
|
||||||
MWWorld::Ptr tmp = world->placeObject(_player->reference->getPtr(), store, _pos);
|
if (_player->state == 0)
|
||||||
|
{
|
||||||
|
MWWorld::Ptr tmp = world->placeObject(_player->reference->getPtr(), cellStore, _pos);
|
||||||
|
|
||||||
_player->ptr.mCell = tmp.mCell;
|
_player->ptr.mCell = tmp.mCell;
|
||||||
_player->ptr.mRef = tmp.mRef;
|
_player->ptr.mRef = tmp.mRef;
|
||||||
|
|
||||||
|
_player->cell = *_player->ptr.getCell()->getCell();
|
||||||
|
_player->pos = _player->ptr.getRefData().getPosition();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
_player->ptr.getBase()->canChangeCell = true;
|
||||||
|
_player->UpdatePtr(world->moveObject(_player->ptr, cellStore, _pos.pos[0], _pos.pos[1], _pos.pos[2]));
|
||||||
|
|
||||||
dedic_pl.mId = players[id]->ptr.get<ESM::NPC>()->mBase->mId;
|
dedic_pl.mId = players[id]->ptr.get<ESM::NPC>()->mBase->mId;
|
||||||
|
|
||||||
MWWorld::ESMStore *store = const_cast<MWWorld::ESMStore *>(&world->getStore());
|
MWWorld::ESMStore *store = const_cast<MWWorld::ESMStore *>(&world->getStore());
|
||||||
MWWorld::Store<ESM::NPC> *esm_store = const_cast<MWWorld::Store<ESM::NPC> *> (&store->get<ESM::NPC>());
|
MWWorld::Store<ESM::NPC> *esm_store = const_cast<MWWorld::Store<ESM::NPC> *> (&store->get<ESM::NPC>());
|
||||||
|
|
||||||
esm_store->insert(dedic_pl);
|
esm_store->insert(dedic_pl);
|
||||||
|
|
||||||
|
_player->updateCell();
|
||||||
}
|
}
|
||||||
|
|
||||||
_player->guid = id;
|
_player->guid = id;
|
||||||
_player->state = 2;
|
_player->state = 2;
|
||||||
|
|
||||||
_player->cell = *_player->ptr.getCell()->getCell();
|
|
||||||
_player->pos = _player->ptr.getRefData().getPosition();
|
|
||||||
world->enable(players[id]->ptr);
|
world->enable(players[id]->ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,6 +120,7 @@ void Players::DisconnectPlayer(RakNet::RakNetGUID id)
|
||||||
world->findInteriorPosition("ToddTest", _pos);
|
world->findInteriorPosition("ToddTest", _pos);
|
||||||
MWWorld::CellStore *store = world->getInterior("ToddTest");
|
MWWorld::CellStore *store = world->getInterior("ToddTest");
|
||||||
|
|
||||||
|
players[id]->getPtr().getBase()->canChangeCell = true;
|
||||||
world->moveObject(players[id]->getPtr(), store, _pos.pos[0], _pos.pos[1], _pos.pos[2]);
|
world->moveObject(players[id]->getPtr(), store, _pos.pos[0], _pos.pos[1], _pos.pos[2]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -398,6 +406,7 @@ void DedicatedPlayer::UpdateDrawState()
|
||||||
|
|
||||||
void DedicatedPlayer::updateCell()
|
void DedicatedPlayer::updateCell()
|
||||||
{
|
{
|
||||||
|
|
||||||
MWBase::World *world = MWBase::Environment::get().getWorld();
|
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
MWWorld::CellStore *cellStore;
|
MWWorld::CellStore *cellStore;
|
||||||
if (cell.isExterior() == 1)
|
if (cell.isExterior() == 1)
|
||||||
|
|
Loading…
Reference in a new issue