1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-04-01 18:36:43 +00:00

[General] Use different compromise for summoning

Revert 9502d84a9cb99028f76f7fd2e05f9193ca66561 because the creature graveyard solves more problems than it causes. Only have the authority of a cell send deletion packets when a summon despawns.

Summoning is one of the least multiplayer-friendly systems in OpenMW and really needs to be redone serverside.
This commit is contained in:
David Cernat 2019-12-02 20:48:52 +02:00
parent 753e310dd4
commit 9792a5256f
2 changed files with 10 additions and 31 deletions

View file

@ -2082,20 +2082,21 @@ namespace MWMechanics
MWWorld::Ptr ptr = MWBase::Environment::get().getWorld()->searchPtrViaActorId(creatureActorId); MWWorld::Ptr ptr = MWBase::Environment::get().getWorld()->searchPtrViaActorId(creatureActorId);
if (!ptr.isEmpty()) if (!ptr.isEmpty())
{ {
MWBase::Environment::get().getWorld()->deleteObject(ptr);
/* /*
Start of tes3mp addition Start of tes3mp change (major)
Send an ID_OBJECT_DELETE packet every time a summoned creature despawns Send an ID_OBJECT_DELETE packet every time a summoned creature despawns
*/ */
mwmp::ObjectList *objectList = mwmp::Main::get().getNetworking()->getObjectList(); if (mwmp::Main::get().getCellController()->hasLocalAuthority(*ptr.getCell()->getCell()))
objectList->reset(); {
objectList->packetOrigin = mwmp::CLIENT_GAMEPLAY; mwmp::ObjectList *objectList = mwmp::Main::get().getNetworking()->getObjectList();
objectList->addObjectDelete(ptr); objectList->reset();
objectList->sendObjectDelete(); objectList->packetOrigin = mwmp::CLIENT_GAMEPLAY;
objectList->addObjectDelete(ptr);
objectList->sendObjectDelete();
}
/* /*
End of tes3mp addition End of tes3mp change (major)
*/ */
const ESM::Static* fx = MWBase::Environment::get().getWorld()->getStore().get<ESM::Static>() const ESM::Static* fx = MWBase::Environment::get().getWorld()->getStore().get<ESM::Static>()
@ -2111,13 +2112,6 @@ namespace MWMechanics
cleanupSummonedCreature(stats, creature.second); cleanupSummonedCreature(stats, creature.second);
creatureMap.clear(); creatureMap.clear();
} }
/*
Start of tes3mp change (major)
Don't use a clientside creature graveyard in multiplayer and expect the server
to handle summon deletions instead
*/
/*
else if (creatureActorId != -1) else if (creatureActorId != -1)
{ {
// We didn't find the creature. It's probably in an inactive cell. // We didn't find the creature. It's probably in an inactive cell.
@ -2125,10 +2119,6 @@ namespace MWMechanics
std::vector<int>& graveyard = casterStats.getSummonedCreatureGraveyard(); std::vector<int>& graveyard = casterStats.getSummonedCreatureGraveyard();
graveyard.push_back(creatureActorId); graveyard.push_back(creatureActorId);
} }
*/
/*
End of tes3mp change (major)
*/
purgeSpellEffects(creatureActorId); purgeSpellEffects(creatureActorId);
} }

View file

@ -148,22 +148,11 @@ namespace MWMechanics
++it; ++it;
} }
/*
Start of tes3mp change (major)
Don't use a clientside creature graveyard in multiplayer and expect the server
to handle summon deletions instead
*/
/*
std::vector<int> graveyard = creatureStats.getSummonedCreatureGraveyard(); std::vector<int> graveyard = creatureStats.getSummonedCreatureGraveyard();
creatureStats.getSummonedCreatureGraveyard().clear(); creatureStats.getSummonedCreatureGraveyard().clear();
for (const int creature : graveyard) for (const int creature : graveyard)
MWBase::Environment::get().getMechanicsManager()->cleanupSummonedCreature(mActor, creature); MWBase::Environment::get().getMechanicsManager()->cleanupSummonedCreature(mActor, creature);
*/
/*
End of tes3mp change (major)
*/
if (!cleanup) if (!cleanup)
return; return;