mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-15 17:19:56 +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().
296 lines
7.4 KiB
C++
296 lines
7.4 KiB
C++
#include "Mechanics.hpp"
|
|
|
|
#include <components/openmw-mp/NetworkMessages.hpp>
|
|
#include <components/openmw-mp/TimedLog.hpp>
|
|
|
|
#include <apps/openmw-mp/Script/ScriptFunctions.hpp>
|
|
#include <apps/openmw-mp/Networking.hpp>
|
|
|
|
#include <iostream>
|
|
|
|
static std::string tempCellDescription;
|
|
|
|
void MechanicsFunctions::ClearAlliedPlayersForPlayer(unsigned short pid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, );
|
|
|
|
player->alliedPlayers.clear();
|
|
}
|
|
|
|
unsigned char MechanicsFunctions::GetMiscellaneousChangeType(unsigned short pid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, 0);
|
|
|
|
return player->miscellaneousChangeType;
|
|
}
|
|
|
|
const char *MechanicsFunctions::GetMarkCell(unsigned short pid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, 0);
|
|
|
|
tempCellDescription = player->cell.getShortDescription().c_str();
|
|
return tempCellDescription.c_str();
|
|
}
|
|
|
|
double MechanicsFunctions::GetMarkPosX(unsigned short pid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, 0.0f);
|
|
|
|
return player->markPosition.pos[0];
|
|
}
|
|
|
|
double MechanicsFunctions::GetMarkPosY(unsigned short pid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, 0.0f);
|
|
|
|
return player->markPosition.pos[1];
|
|
}
|
|
|
|
double MechanicsFunctions::GetMarkPosZ(unsigned short pid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, 0.0f);
|
|
|
|
return player->markPosition.pos[2];
|
|
}
|
|
|
|
double MechanicsFunctions::GetMarkRotX(unsigned short pid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, 0.0f);
|
|
|
|
return player->markPosition.rot[0];
|
|
}
|
|
|
|
double MechanicsFunctions::GetMarkRotZ(unsigned short pid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, 0.0f);
|
|
|
|
return player->markPosition.rot[2];
|
|
}
|
|
|
|
bool MechanicsFunctions::DoesPlayerHavePlayerKiller(unsigned short pid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, false);
|
|
|
|
return player->killer.isPlayer;
|
|
}
|
|
|
|
int MechanicsFunctions::GetPlayerKillerPid(unsigned short pid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, 0);
|
|
|
|
Player *killer = Players::getPlayer(player->killer.guid);
|
|
|
|
if (killer != nullptr)
|
|
return killer->getId();
|
|
|
|
return -1;
|
|
}
|
|
|
|
const char *MechanicsFunctions::GetPlayerKillerRefId(unsigned short pid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, "");
|
|
|
|
return player->killer.refId.c_str();
|
|
}
|
|
|
|
unsigned int MechanicsFunctions::GetPlayerKillerRefNum(unsigned short pid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, 0);
|
|
|
|
return player->killer.refNum;
|
|
}
|
|
|
|
unsigned int MechanicsFunctions::GetPlayerKillerMpNum(unsigned short pid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, 0);
|
|
|
|
return player->killer.mpNum;
|
|
}
|
|
|
|
const char *MechanicsFunctions::GetPlayerKillerName(unsigned short pid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, "");
|
|
|
|
return player->killer.name.c_str();
|
|
}
|
|
|
|
const char *MechanicsFunctions::GetSelectedSpellId(unsigned short pid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, 0);
|
|
|
|
return player->selectedSpellId.c_str();
|
|
}
|
|
|
|
unsigned int MechanicsFunctions::GetDrawState(unsigned short pid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, false);
|
|
|
|
return player->drawState;
|
|
}
|
|
|
|
bool MechanicsFunctions::GetSneakState(unsigned short pid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, false);
|
|
|
|
// TODO: Avoid having to use a magic number here
|
|
return (player->movementFlags & 8) != 0;
|
|
}
|
|
|
|
void MechanicsFunctions::SetMarkCell(unsigned short pid, const char *cellDescription) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, );
|
|
|
|
player->markCell = Utils::getCellFromDescription(cellDescription);
|
|
}
|
|
|
|
void MechanicsFunctions::SetMarkPos(unsigned short pid, double x, double y, double z) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, );
|
|
|
|
player->markPosition.pos[0] = x;
|
|
player->markPosition.pos[1] = y;
|
|
player->markPosition.pos[2] = z;
|
|
}
|
|
|
|
void MechanicsFunctions::SetMarkRot(unsigned short pid, double x, double z) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, );
|
|
|
|
player->markPosition.rot[0] = x;
|
|
player->markPosition.rot[2] = z;
|
|
}
|
|
|
|
void MechanicsFunctions::SetSelectedSpellId(unsigned short pid, const char *spellId) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, );
|
|
|
|
player->selectedSpellId = spellId;
|
|
}
|
|
|
|
void MechanicsFunctions::AddAlliedPlayerForPlayer(unsigned short pid, unsigned short alliedPlayerPid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, );
|
|
|
|
Player *alliedPlayer;
|
|
GET_PLAYER(alliedPlayerPid, alliedPlayer, );
|
|
|
|
player->alliedPlayers.push_back(alliedPlayer->guid);
|
|
}
|
|
|
|
void MechanicsFunctions::SendMarkLocation(unsigned short pid)
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, );
|
|
|
|
player->miscellaneousChangeType = mwmp::MISCELLANEOUS_CHANGE_TYPE::MARK_LOCATION;
|
|
|
|
mwmp::PlayerPacket *packet = mwmp::Networking::get().getPlayerPacketController()->GetPacket(ID_PLAYER_MISCELLANEOUS);
|
|
packet->setPlayer(player);
|
|
|
|
packet->Send(false);
|
|
}
|
|
|
|
void MechanicsFunctions::SendSelectedSpell(unsigned short pid)
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, );
|
|
|
|
player->miscellaneousChangeType = mwmp::MISCELLANEOUS_CHANGE_TYPE::SELECTED_SPELL;
|
|
|
|
mwmp::PlayerPacket *packet = mwmp::Networking::get().getPlayerPacketController()->GetPacket(ID_PLAYER_MISCELLANEOUS);
|
|
packet->setPlayer(player);
|
|
|
|
packet->Send(false);
|
|
}
|
|
|
|
void MechanicsFunctions::SendAlliedPlayers(unsigned short pid, bool sendToOtherPlayers)
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, );
|
|
|
|
mwmp::PlayerPacket *packet = mwmp::Networking::get().getPlayerPacketController()->GetPacket(ID_PLAYER_ALLY);
|
|
packet->setPlayer(player);
|
|
|
|
packet->Send(false);
|
|
if (sendToOtherPlayers)
|
|
packet->Send(true);
|
|
}
|
|
|
|
void MechanicsFunctions::Jail(unsigned short pid, int jailDays, bool ignoreJailTeleportation, bool ignoreJailSkillIncreases,
|
|
const char* jailProgressText, const char* jailEndText) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, );
|
|
|
|
player->jailDays = jailDays;
|
|
player->ignoreJailTeleportation = ignoreJailTeleportation;
|
|
player->ignoreJailSkillIncreases = ignoreJailSkillIncreases;
|
|
player->jailProgressText = jailProgressText;
|
|
player->jailEndText = jailEndText;
|
|
|
|
mwmp::PlayerPacket *packet = mwmp::Networking::get().getPlayerPacketController()->GetPacket(ID_PLAYER_JAIL);
|
|
packet->setPlayer(player);
|
|
|
|
packet->Send(false);
|
|
}
|
|
|
|
void MechanicsFunctions::Resurrect(unsigned short pid, unsigned int type) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, );
|
|
|
|
player->resurrectType = type;
|
|
|
|
mwmp::PlayerPacket *packet = mwmp::Networking::get().getPlayerPacketController()->GetPacket(ID_PLAYER_RESURRECT);
|
|
packet->setPlayer(player);
|
|
|
|
packet->Send(false);
|
|
packet->Send(true);
|
|
}
|
|
|
|
// All methods below are deprecated versions of methods from above
|
|
|
|
const char *MechanicsFunctions::GetDeathReason(unsigned short pid) noexcept
|
|
{
|
|
Player *player;
|
|
GET_PLAYER(pid, player, 0);
|
|
|
|
if (player->killer.isPlayer)
|
|
{
|
|
Player *killerPlayer = Players::getPlayer(player->killer.guid);
|
|
|
|
if (killerPlayer != nullptr)
|
|
return killerPlayer->npc.mName.c_str();
|
|
}
|
|
else if (!player->killer.name.empty())
|
|
return player->killer.name.c_str();
|
|
|
|
return "suicide";
|
|
}
|
|
|
|
unsigned int MechanicsFunctions::GetPlayerKillerRefNumIndex(unsigned short pid) noexcept
|
|
{
|
|
return GetPlayerKillerRefNum(pid);
|
|
}
|