mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-24 12:53:52 +00:00
7393e3def6
ESM::Cell's getDescription() method was modified by aa5161f99e
despite being used heavily by TES3MP. All instances of it in the TES3MP code have now been changed into the newly added getShortDescription() that is identical to the previous getDescription().
731 lines
22 KiB
C++
731 lines
22 KiB
C++
#include <components/openmw-mp/NetworkMessages.hpp>
|
|
#include <components/openmw-mp/Base/BaseActor.hpp>
|
|
|
|
#include <apps/openmw-mp/Networking.hpp>
|
|
#include <apps/openmw-mp/Player.hpp>
|
|
#include <apps/openmw-mp/Utils.hpp>
|
|
#include <apps/openmw-mp/Script/ScriptFunctions.hpp>
|
|
|
|
#include <components/esm/creaturestats.hpp>
|
|
|
|
#include "Actors.hpp"
|
|
|
|
using namespace mwmp;
|
|
|
|
BaseActorList *readActorList;
|
|
BaseActorList writeActorList;
|
|
|
|
BaseActor tempActor;
|
|
const BaseActor emptyActor = {};
|
|
std::vector<ESM::ActiveEffect> storedActorActiveEffects;
|
|
|
|
static std::string tempCellDescription;
|
|
|
|
void ActorFunctions::ReadReceivedActorList() noexcept
|
|
{
|
|
readActorList = mwmp::Networking::getPtr()->getReceivedActorList();
|
|
}
|
|
|
|
void ActorFunctions::ReadCellActorList(const char* cellDescription) noexcept
|
|
{
|
|
ESM::Cell esmCell = Utils::getCellFromDescription(cellDescription);
|
|
Cell *serverCell = CellController::get()->getCell(&esmCell);
|
|
|
|
if (serverCell != nullptr)
|
|
readActorList = serverCell->getActorList();
|
|
else
|
|
readActorList = {};
|
|
}
|
|
|
|
void ActorFunctions::ClearActorList() noexcept
|
|
{
|
|
writeActorList.cell.blank();
|
|
writeActorList.baseActors.clear();
|
|
}
|
|
|
|
void ActorFunctions::SetActorListPid(unsigned short pid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, );
|
|
|
|
writeActorList.guid = player->guid;
|
|
}
|
|
|
|
void ActorFunctions::CopyReceivedActorListToStore() noexcept
|
|
{
|
|
writeActorList = *readActorList;
|
|
}
|
|
|
|
unsigned int ActorFunctions::GetActorListSize() noexcept
|
|
{
|
|
if (readActorList == nullptr)
|
|
return 0;
|
|
|
|
return readActorList->count;
|
|
}
|
|
|
|
unsigned char ActorFunctions::GetActorListAction() noexcept
|
|
{
|
|
return readActorList->action;
|
|
}
|
|
|
|
const char *ActorFunctions::GetActorCell(unsigned int index) noexcept
|
|
{
|
|
tempCellDescription = readActorList->baseActors.at(index).cell.getShortDescription();
|
|
return tempCellDescription.c_str();
|
|
}
|
|
|
|
const char *ActorFunctions::GetActorRefId(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).refId.c_str();
|
|
}
|
|
|
|
unsigned int ActorFunctions::GetActorRefNum(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).refNum;
|
|
}
|
|
|
|
unsigned int ActorFunctions::GetActorMpNum(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).mpNum;
|
|
}
|
|
|
|
double ActorFunctions::GetActorPosX(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).position.pos[0];
|
|
}
|
|
|
|
double ActorFunctions::GetActorPosY(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).position.pos[1];
|
|
}
|
|
|
|
double ActorFunctions::GetActorPosZ(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).position.pos[2];
|
|
}
|
|
|
|
double ActorFunctions::GetActorRotX(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).position.rot[0];
|
|
}
|
|
|
|
double ActorFunctions::GetActorRotY(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).position.rot[1];
|
|
}
|
|
|
|
double ActorFunctions::GetActorRotZ(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).position.rot[2];
|
|
}
|
|
|
|
double ActorFunctions::GetActorHealthBase(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).creatureStats.mDynamic[0].mBase;
|
|
}
|
|
|
|
double ActorFunctions::GetActorHealthCurrent(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).creatureStats.mDynamic[0].mCurrent;
|
|
}
|
|
|
|
double ActorFunctions::GetActorHealthModified(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).creatureStats.mDynamic[0].mMod;
|
|
}
|
|
|
|
double ActorFunctions::GetActorMagickaBase(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).creatureStats.mDynamic[1].mBase;
|
|
}
|
|
|
|
double ActorFunctions::GetActorMagickaCurrent(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).creatureStats.mDynamic[1].mCurrent;
|
|
}
|
|
|
|
double ActorFunctions::GetActorMagickaModified(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).creatureStats.mDynamic[1].mMod;
|
|
}
|
|
|
|
double ActorFunctions::GetActorFatigueBase(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).creatureStats.mDynamic[2].mBase;
|
|
}
|
|
|
|
double ActorFunctions::GetActorFatigueCurrent(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).creatureStats.mDynamic[2].mCurrent;
|
|
}
|
|
|
|
double ActorFunctions::GetActorFatigueModified(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).creatureStats.mDynamic[2].mMod;
|
|
}
|
|
|
|
const char *ActorFunctions::GetActorEquipmentItemRefId(unsigned int index, unsigned short slot) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).equipmentItems[slot].refId.c_str();
|
|
}
|
|
|
|
int ActorFunctions::GetActorEquipmentItemCount(unsigned int index, unsigned short slot) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).equipmentItems[slot].count;
|
|
}
|
|
|
|
int ActorFunctions::GetActorEquipmentItemCharge(unsigned int index, unsigned short slot) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).equipmentItems[slot].charge;
|
|
}
|
|
|
|
double ActorFunctions::GetActorEquipmentItemEnchantmentCharge(unsigned int index, unsigned short slot) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).equipmentItems[slot].enchantmentCharge;
|
|
}
|
|
|
|
bool ActorFunctions::DoesActorHavePlayerKiller(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).killer.isPlayer;
|
|
}
|
|
|
|
int ActorFunctions::GetActorKillerPid(unsigned int index) noexcept
|
|
{
|
|
Player *player = Players::getPlayer(readActorList->baseActors.at(index).killer.guid);
|
|
|
|
if (player != nullptr)
|
|
return player->getId();
|
|
|
|
return -1;
|
|
}
|
|
|
|
const char *ActorFunctions::GetActorKillerRefId(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).killer.refId.c_str();
|
|
}
|
|
|
|
unsigned int ActorFunctions::GetActorKillerRefNum(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).killer.refNum;
|
|
}
|
|
|
|
unsigned int ActorFunctions::GetActorKillerMpNum(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).killer.mpNum;
|
|
}
|
|
|
|
const char *ActorFunctions::GetActorKillerName(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).killer.name.c_str();
|
|
}
|
|
|
|
unsigned int ActorFunctions::GetActorDeathState(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).deathState;
|
|
}
|
|
|
|
unsigned int ActorFunctions::GetActorSpellsActiveChangesSize(unsigned int actorIndex) noexcept
|
|
{
|
|
return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.size();
|
|
}
|
|
|
|
unsigned int ActorFunctions::GetActorSpellsActiveChangesAction(unsigned int actorIndex) noexcept
|
|
{
|
|
return readActorList->baseActors.at(actorIndex).spellsActiveChanges.action;
|
|
}
|
|
|
|
const char* ActorFunctions::GetActorSpellsActiveId(unsigned int actorIndex, unsigned int spellIndex) noexcept
|
|
{
|
|
return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).id.c_str();
|
|
}
|
|
|
|
const char* ActorFunctions::GetActorSpellsActiveDisplayName(unsigned int actorIndex, unsigned int spellIndex) noexcept
|
|
{
|
|
return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).params.mDisplayName.c_str();
|
|
}
|
|
|
|
bool ActorFunctions::GetActorSpellsActiveStackingState(unsigned int actorIndex, unsigned int spellIndex) noexcept
|
|
{
|
|
return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).isStackingSpell;
|
|
}
|
|
|
|
unsigned int ActorFunctions::GetActorSpellsActiveEffectCount(unsigned int actorIndex, unsigned int spellIndex) noexcept
|
|
{
|
|
return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).params.mEffects.size();
|
|
}
|
|
|
|
unsigned int ActorFunctions::GetActorSpellsActiveEffectId(unsigned int actorIndex, unsigned int spellIndex, unsigned int effectIndex) noexcept
|
|
{
|
|
return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).params.mEffects.at(effectIndex).mEffectId;
|
|
}
|
|
|
|
int ActorFunctions::GetActorSpellsActiveEffectArg(unsigned int actorIndex, unsigned int spellIndex, unsigned int effectIndex) noexcept
|
|
{
|
|
return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).params.mEffects.at(effectIndex).mArg;
|
|
}
|
|
|
|
double ActorFunctions::GetActorSpellsActiveEffectMagnitude(unsigned int actorIndex, unsigned int spellIndex, unsigned int effectIndex) noexcept
|
|
{
|
|
return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).params.mEffects.at(effectIndex).mMagnitude;
|
|
}
|
|
|
|
double ActorFunctions::GetActorSpellsActiveEffectDuration(unsigned int actorIndex, unsigned int spellIndex, unsigned int effectIndex) noexcept
|
|
{
|
|
return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).params.mEffects.at(effectIndex).mDuration;
|
|
}
|
|
|
|
double ActorFunctions::GetActorSpellsActiveEffectTimeLeft(unsigned int actorIndex, unsigned int spellIndex, unsigned int effectIndex) noexcept
|
|
{
|
|
return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).params.mEffects.at(effectIndex).mTimeLeft;
|
|
}
|
|
|
|
bool ActorFunctions::DoesActorSpellsActiveHavePlayerCaster(unsigned int actorIndex, unsigned int spellIndex) noexcept
|
|
{
|
|
return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).caster.isPlayer;
|
|
}
|
|
|
|
int ActorFunctions::GetActorSpellsActiveCasterPid(unsigned int actorIndex, unsigned int spellIndex) noexcept
|
|
{
|
|
Player* caster = Players::getPlayer(readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).caster.guid);
|
|
|
|
if (caster != nullptr)
|
|
return caster->getId();
|
|
|
|
return -1;
|
|
}
|
|
|
|
const char* ActorFunctions::GetActorSpellsActiveCasterRefId(unsigned int actorIndex, unsigned int spellIndex) noexcept
|
|
{
|
|
return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).caster.refId.c_str();
|
|
}
|
|
|
|
unsigned int ActorFunctions::GetActorSpellsActiveCasterRefNum(unsigned int actorIndex, unsigned int spellIndex) noexcept
|
|
{
|
|
return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).caster.refNum;
|
|
}
|
|
|
|
unsigned int ActorFunctions::GetActorSpellsActiveCasterMpNum(unsigned int actorIndex, unsigned int spellIndex) noexcept
|
|
{
|
|
return readActorList->baseActors.at(actorIndex).spellsActiveChanges.activeSpells.at(spellIndex).caster.mpNum;
|
|
}
|
|
|
|
bool ActorFunctions::DoesActorHavePosition(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).hasPositionData;
|
|
}
|
|
|
|
bool ActorFunctions::DoesActorHaveStatsDynamic(unsigned int index) noexcept
|
|
{
|
|
return readActorList->baseActors.at(index).hasStatsDynamicData;
|
|
}
|
|
|
|
void ActorFunctions::SetActorListCell(const char* cellDescription) noexcept
|
|
{
|
|
writeActorList.cell = Utils::getCellFromDescription(cellDescription);
|
|
}
|
|
|
|
void ActorFunctions::SetActorListAction(unsigned char action) noexcept
|
|
{
|
|
writeActorList.action = action;
|
|
}
|
|
|
|
void ActorFunctions::SetActorCell(const char* cellDescription) noexcept
|
|
{
|
|
tempActor.cell = Utils::getCellFromDescription(cellDescription);
|
|
}
|
|
|
|
void ActorFunctions::SetActorRefId(const char* refId) noexcept
|
|
{
|
|
tempActor.refId = refId;
|
|
}
|
|
|
|
void ActorFunctions::SetActorRefNum(int refNum) noexcept
|
|
{
|
|
tempActor.refNum = refNum;
|
|
}
|
|
|
|
void ActorFunctions::SetActorMpNum(int mpNum) noexcept
|
|
{
|
|
tempActor.mpNum = mpNum;
|
|
}
|
|
|
|
void ActorFunctions::SetActorPosition(double x, double y, double z) noexcept
|
|
{
|
|
tempActor.position.pos[0] = x;
|
|
tempActor.position.pos[1] = y;
|
|
tempActor.position.pos[2] = z;
|
|
}
|
|
|
|
void ActorFunctions::SetActorRotation(double x, double y, double z) noexcept
|
|
{
|
|
tempActor.position.rot[0] = x;
|
|
tempActor.position.rot[1] = y;
|
|
tempActor.position.rot[2] = z;
|
|
}
|
|
|
|
void ActorFunctions::SetActorHealthBase(double value) noexcept
|
|
{
|
|
tempActor.creatureStats.mDynamic[0].mBase = value;
|
|
}
|
|
|
|
void ActorFunctions::SetActorHealthCurrent(double value) noexcept
|
|
{
|
|
tempActor.creatureStats.mDynamic[0].mCurrent = value;
|
|
}
|
|
|
|
void ActorFunctions::SetActorHealthModified(double value) noexcept
|
|
{
|
|
tempActor.creatureStats.mDynamic[0].mMod = value;
|
|
}
|
|
|
|
void ActorFunctions::SetActorMagickaBase(double value) noexcept
|
|
{
|
|
tempActor.creatureStats.mDynamic[1].mBase = value;
|
|
}
|
|
|
|
void ActorFunctions::SetActorMagickaCurrent(double value) noexcept
|
|
{
|
|
tempActor.creatureStats.mDynamic[1].mCurrent = value;
|
|
}
|
|
|
|
void ActorFunctions::SetActorMagickaModified(double value) noexcept
|
|
{
|
|
tempActor.creatureStats.mDynamic[1].mMod = value;
|
|
}
|
|
|
|
void ActorFunctions::SetActorFatigueBase(double value) noexcept
|
|
{
|
|
tempActor.creatureStats.mDynamic[2].mBase = value;
|
|
}
|
|
|
|
void ActorFunctions::SetActorFatigueCurrent(double value) noexcept
|
|
{
|
|
tempActor.creatureStats.mDynamic[2].mCurrent = value;
|
|
}
|
|
|
|
void ActorFunctions::SetActorFatigueModified(double value) noexcept
|
|
{
|
|
tempActor.creatureStats.mDynamic[2].mMod = value;
|
|
}
|
|
|
|
void ActorFunctions::SetActorSound(const char* sound) noexcept
|
|
{
|
|
tempActor.sound = sound;
|
|
}
|
|
|
|
void ActorFunctions::SetActorDeathState(unsigned int deathState) noexcept
|
|
{
|
|
tempActor.deathState = deathState;
|
|
}
|
|
|
|
void ActorFunctions::SetActorDeathInstant(bool isInstant) noexcept
|
|
{
|
|
tempActor.isInstantDeath = isInstant;
|
|
}
|
|
|
|
void ActorFunctions::SetActorSpellsActiveAction(unsigned char action) noexcept
|
|
{
|
|
tempActor.spellsActiveChanges.action = action;
|
|
}
|
|
|
|
void ActorFunctions::SetActorAIAction(unsigned int action) noexcept
|
|
{
|
|
tempActor.aiAction = action;
|
|
}
|
|
|
|
void ActorFunctions::SetActorAITargetToPlayer(unsigned short pid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, );
|
|
|
|
tempActor.hasAiTarget = true;
|
|
tempActor.aiTarget.isPlayer = true;
|
|
|
|
tempActor.aiTarget.guid = player->guid;
|
|
}
|
|
|
|
void ActorFunctions::SetActorAITargetToObject(int refNum, int mpNum) noexcept
|
|
{
|
|
tempActor.hasAiTarget = true;
|
|
tempActor.aiTarget.isPlayer = false;
|
|
|
|
tempActor.aiTarget.refNum = refNum;
|
|
tempActor.aiTarget.mpNum = mpNum;
|
|
}
|
|
|
|
void ActorFunctions::SetActorAICoordinates(double x, double y, double z) noexcept
|
|
{
|
|
tempActor.aiCoordinates.pos[0] = x;
|
|
tempActor.aiCoordinates.pos[1] = y;
|
|
tempActor.aiCoordinates.pos[2] = z;
|
|
}
|
|
|
|
void ActorFunctions::SetActorAIDistance(unsigned int distance) noexcept
|
|
{
|
|
tempActor.aiDistance = distance;
|
|
}
|
|
|
|
void ActorFunctions::SetActorAIDuration(unsigned int duration) noexcept
|
|
{
|
|
tempActor.aiDuration = duration;
|
|
}
|
|
|
|
void ActorFunctions::SetActorAIRepetition(bool shouldRepeat) noexcept
|
|
{
|
|
tempActor.aiShouldRepeat = shouldRepeat;
|
|
}
|
|
|
|
void ActorFunctions::EquipActorItem(unsigned short slot, const char *refId, unsigned int count, int charge, double enchantmentCharge) noexcept
|
|
{
|
|
tempActor.equipmentItems[slot].refId = refId;
|
|
tempActor.equipmentItems[slot].count = count;
|
|
tempActor.equipmentItems[slot].charge = charge;
|
|
tempActor.equipmentItems[slot].enchantmentCharge = enchantmentCharge;
|
|
}
|
|
|
|
void ActorFunctions::UnequipActorItem(unsigned short slot) noexcept
|
|
{
|
|
ActorFunctions::EquipActorItem(slot, "", 0, -1, -1);
|
|
}
|
|
|
|
void ActorFunctions::AddActorSpellActive(const char* spellId, const char* displayName) noexcept
|
|
{
|
|
mwmp::ActiveSpell spell;
|
|
spell.id = spellId;
|
|
spell.params.mDisplayName = displayName;
|
|
spell.params.mEffects = storedActorActiveEffects;
|
|
|
|
tempActor.spellsActiveChanges.activeSpells.push_back(spell);
|
|
|
|
storedActorActiveEffects.clear();
|
|
}
|
|
|
|
void ActorFunctions::AddActorSpellActiveEffect(int effectId, double magnitude, double duration, double timeLeft, int arg) noexcept
|
|
{
|
|
ESM::ActiveEffect effect;
|
|
effect.mEffectId = effectId;
|
|
effect.mMagnitude = magnitude;
|
|
effect.mDuration = duration;
|
|
effect.mTimeLeft = timeLeft;
|
|
effect.mArg = arg;
|
|
|
|
storedActorActiveEffects.push_back(effect);
|
|
}
|
|
|
|
void ActorFunctions::AddActor() noexcept
|
|
{
|
|
writeActorList.baseActors.push_back(tempActor);
|
|
|
|
tempActor = emptyActor;
|
|
}
|
|
|
|
void ActorFunctions::SendActorList() noexcept
|
|
{
|
|
mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_LIST);
|
|
actorPacket->setActorList(&writeActorList);
|
|
actorPacket->Send(writeActorList.guid);
|
|
}
|
|
|
|
void ActorFunctions::SendActorAuthority() noexcept
|
|
{
|
|
Cell *serverCell = CellController::get()->getCell(&writeActorList.cell);
|
|
|
|
if (serverCell != nullptr)
|
|
{
|
|
serverCell->setAuthority(writeActorList.guid);
|
|
|
|
mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_AUTHORITY);
|
|
actorPacket->setActorList(&writeActorList);
|
|
|
|
// Always send the packet to everyone on the server, to reduce bugs caused by late-arriving packets
|
|
actorPacket->Send(false);
|
|
actorPacket->Send(true);
|
|
}
|
|
}
|
|
|
|
void ActorFunctions::SendActorPosition(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept
|
|
{
|
|
mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_POSITION);
|
|
actorPacket->setActorList(&writeActorList);
|
|
|
|
if (!skipAttachedPlayer)
|
|
actorPacket->Send(writeActorList.guid);
|
|
|
|
if (sendToOtherVisitors)
|
|
{
|
|
Cell *serverCell = CellController::get()->getCell(&writeActorList.cell);
|
|
|
|
if (serverCell != nullptr)
|
|
{
|
|
serverCell->sendToLoaded(actorPacket, &writeActorList);
|
|
}
|
|
}
|
|
}
|
|
|
|
void ActorFunctions::SendActorStatsDynamic(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept
|
|
{
|
|
mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_STATS_DYNAMIC);
|
|
actorPacket->setActorList(&writeActorList);
|
|
|
|
if (!skipAttachedPlayer)
|
|
actorPacket->Send(writeActorList.guid);
|
|
|
|
if (sendToOtherVisitors)
|
|
{
|
|
Cell *serverCell = CellController::get()->getCell(&writeActorList.cell);
|
|
|
|
if (serverCell != nullptr)
|
|
{
|
|
serverCell->sendToLoaded(actorPacket, &writeActorList);
|
|
}
|
|
}
|
|
}
|
|
|
|
void ActorFunctions::SendActorEquipment(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept
|
|
{
|
|
mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_EQUIPMENT);
|
|
actorPacket->setActorList(&writeActorList);
|
|
|
|
if (!skipAttachedPlayer)
|
|
actorPacket->Send(writeActorList.guid);
|
|
|
|
if (sendToOtherVisitors)
|
|
{
|
|
Cell *serverCell = CellController::get()->getCell(&writeActorList.cell);
|
|
|
|
if (serverCell != nullptr)
|
|
{
|
|
serverCell->sendToLoaded(actorPacket, &writeActorList);
|
|
}
|
|
}
|
|
}
|
|
|
|
void ActorFunctions::SendActorSpellsActiveChanges(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept
|
|
{
|
|
mwmp::ActorPacket* actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_SPELLS_ACTIVE);
|
|
actorPacket->setActorList(&writeActorList);
|
|
|
|
if (!skipAttachedPlayer)
|
|
actorPacket->Send(writeActorList.guid);
|
|
|
|
if (sendToOtherVisitors)
|
|
{
|
|
Cell* serverCell = CellController::get()->getCell(&writeActorList.cell);
|
|
|
|
if (serverCell != nullptr)
|
|
{
|
|
serverCell->sendToLoaded(actorPacket, &writeActorList);
|
|
}
|
|
}
|
|
}
|
|
|
|
void ActorFunctions::SendActorSpeech(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept
|
|
{
|
|
mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_SPEECH);
|
|
actorPacket->setActorList(&writeActorList);
|
|
|
|
if (!skipAttachedPlayer)
|
|
actorPacket->Send(writeActorList.guid);
|
|
|
|
if (sendToOtherVisitors)
|
|
{
|
|
Cell *serverCell = CellController::get()->getCell(&writeActorList.cell);
|
|
|
|
if (serverCell != nullptr)
|
|
{
|
|
serverCell->sendToLoaded(actorPacket, &writeActorList);
|
|
}
|
|
}
|
|
}
|
|
|
|
void ActorFunctions::SendActorDeath(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept
|
|
{
|
|
mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_DEATH);
|
|
actorPacket->setActorList(&writeActorList);
|
|
|
|
if (!skipAttachedPlayer)
|
|
actorPacket->Send(writeActorList.guid);
|
|
|
|
if (sendToOtherVisitors)
|
|
{
|
|
Cell *serverCell = CellController::get()->getCell(&writeActorList.cell);
|
|
|
|
if (serverCell != nullptr)
|
|
{
|
|
serverCell->sendToLoaded(actorPacket, &writeActorList);
|
|
}
|
|
}
|
|
}
|
|
|
|
void ActorFunctions::SendActorAI(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept
|
|
{
|
|
mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_AI);
|
|
actorPacket->setActorList(&writeActorList);
|
|
|
|
if (!skipAttachedPlayer)
|
|
actorPacket->Send(writeActorList.guid);
|
|
|
|
if (sendToOtherVisitors)
|
|
{
|
|
Cell *serverCell = CellController::get()->getCell(&writeActorList.cell);
|
|
|
|
if (serverCell != nullptr)
|
|
{
|
|
serverCell->sendToLoaded(actorPacket, &writeActorList);
|
|
}
|
|
}
|
|
}
|
|
|
|
void ActorFunctions::SendActorCellChange(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept
|
|
{
|
|
mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_CELL_CHANGE);
|
|
actorPacket->setActorList(&writeActorList);
|
|
|
|
if (!skipAttachedPlayer)
|
|
actorPacket->Send(writeActorList.guid);
|
|
|
|
if (sendToOtherVisitors)
|
|
{
|
|
Cell *serverCell = CellController::get()->getCell(&writeActorList.cell);
|
|
|
|
if (serverCell != nullptr)
|
|
{
|
|
serverCell->sendToLoaded(actorPacket, &writeActorList);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// All methods below are deprecated versions of methods from above
|
|
|
|
void ActorFunctions::ReadLastActorList() noexcept
|
|
{
|
|
ReadReceivedActorList();
|
|
}
|
|
|
|
void ActorFunctions::InitializeActorList(unsigned short pid) noexcept
|
|
{
|
|
ClearActorList();
|
|
SetActorListPid(pid);
|
|
}
|
|
|
|
void ActorFunctions::CopyLastActorListToStore() noexcept
|
|
{
|
|
CopyReceivedActorListToStore();
|
|
}
|
|
|
|
unsigned int ActorFunctions::GetActorRefNumIndex(unsigned int index) noexcept
|
|
{
|
|
return GetActorRefNum(index);
|
|
}
|
|
|
|
unsigned int ActorFunctions::GetActorKillerRefNumIndex(unsigned int index) noexcept
|
|
{
|
|
return GetActorKillerRefNum(index);
|
|
}
|
|
|
|
void ActorFunctions::SetActorRefNumIndex(int refNum) noexcept
|
|
{
|
|
tempActor.refNum = refNum;
|
|
}
|