mirror of
				https://github.com/TES3MP/openmw-tes3mp.git
				synced 2025-11-03 23:56:47 +00:00 
			
		
		
		
	[General] Move creature disguises for players to PlayerShapeshift packet
Additionally, make associated variables clearer, and move associated server script functions next to other shapeshifting functions.
This commit is contained in:
		
							parent
							
								
									34be9383e5
								
							
						
					
					
						commit
						c8abd11f5d
					
				
					 8 changed files with 77 additions and 47 deletions
				
			
		| 
						 | 
				
			
			@ -92,6 +92,22 @@ bool MechanicsFunctions::IsWerewolf(unsigned short pid) noexcept
 | 
			
		|||
    return player->isWerewolf;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char *MechanicsFunctions::GetCreatureRefId(unsigned short pid) noexcept
 | 
			
		||||
{
 | 
			
		||||
    Player *player;
 | 
			
		||||
    GET_PLAYER(pid, player, 0);
 | 
			
		||||
 | 
			
		||||
    return player->creatureRefId.c_str();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool MechanicsFunctions::DisplaysCreatureName(unsigned short pid) noexcept
 | 
			
		||||
{
 | 
			
		||||
    Player *player;
 | 
			
		||||
    GET_PLAYER(pid, player, 0);
 | 
			
		||||
 | 
			
		||||
    return player->displayCreatureName;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MechanicsFunctions::SetMarkCell(unsigned short pid, const char *cellDescription) noexcept
 | 
			
		||||
{
 | 
			
		||||
    Player *player;
 | 
			
		||||
| 
						 | 
				
			
			@ -143,6 +159,15 @@ void MechanicsFunctions::SetWerewolfState(unsigned short pid, bool isWerewolf) n
 | 
			
		|||
    player->isWerewolf = isWerewolf;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MechanicsFunctions::SetCreatureRefId(unsigned short pid, const char *refId, bool displayCreatureName) noexcept
 | 
			
		||||
{
 | 
			
		||||
    Player *player;
 | 
			
		||||
    GET_PLAYER(pid, player, );
 | 
			
		||||
 | 
			
		||||
    player->creatureRefId = refId;
 | 
			
		||||
    player->displayCreatureName = displayCreatureName;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MechanicsFunctions::SendMarkLocation(unsigned short pid)
 | 
			
		||||
{
 | 
			
		||||
    Player *player;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,6 +16,8 @@
 | 
			
		|||
    \
 | 
			
		||||
    {"GetScale",                   MechanicsFunctions::GetScale},\
 | 
			
		||||
    {"IsWerewolf",                 MechanicsFunctions::IsWerewolf},\
 | 
			
		||||
    {"GetCreatureRefId",           MechanicsFunctions::GetCreatureRefId},\
 | 
			
		||||
    {"DisplaysCreatureName",       MechanicsFunctions::DisplaysCreatureName},\
 | 
			
		||||
    \
 | 
			
		||||
    {"SetMarkCell",                MechanicsFunctions::SetMarkCell},\
 | 
			
		||||
    {"SetMarkPos",                 MechanicsFunctions::SetMarkPos},\
 | 
			
		||||
| 
						 | 
				
			
			@ -24,6 +26,7 @@
 | 
			
		|||
    \
 | 
			
		||||
    {"SetScale",                   MechanicsFunctions::SetScale},\
 | 
			
		||||
    {"SetWerewolfState",           MechanicsFunctions::SetWerewolfState},\
 | 
			
		||||
    {"SetCreatureRefId",           MechanicsFunctions::SetCreatureRefId},\
 | 
			
		||||
    \
 | 
			
		||||
    {"SendMarkLocation",           MechanicsFunctions::SendMarkLocation},\
 | 
			
		||||
    {"SendSelectedSpell",          MechanicsFunctions::SendSelectedSpell},\
 | 
			
		||||
| 
						 | 
				
			
			@ -118,6 +121,25 @@ public:
 | 
			
		|||
    */
 | 
			
		||||
    static bool IsWerewolf(unsigned short pid) noexcept;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
    * \brief Get the refId of the creature the player is disguised as.
 | 
			
		||||
    *
 | 
			
		||||
    * \param pid The player ID.
 | 
			
		||||
    * \return The creature refId.
 | 
			
		||||
    */
 | 
			
		||||
    static const char *GetCreatureRefId(unsigned short pid) noexcept;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
    * \brief Check whether a player's name is replaced by that of the creature they are
 | 
			
		||||
    *        disguised as when other players hover over them.
 | 
			
		||||
    *
 | 
			
		||||
    * This is based on the last PlayerShapeshift packet received or sent for that player.
 | 
			
		||||
    *
 | 
			
		||||
    * \param pid The player ID.
 | 
			
		||||
    * \return The creature name display state.
 | 
			
		||||
    */
 | 
			
		||||
    static bool DisplaysCreatureName(unsigned short pid) noexcept;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
    * \brief Set the Mark cell of a player.
 | 
			
		||||
    *
 | 
			
		||||
| 
						 | 
				
			
			@ -196,6 +218,20 @@ public:
 | 
			
		|||
    */
 | 
			
		||||
    static void SetWerewolfState(unsigned short pid, bool isWerewolf) noexcept;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
    * \brief Set the refId of the creature a player is disguised as.
 | 
			
		||||
    *
 | 
			
		||||
    * This changes the creature refId recorded for that player in the server memory, but
 | 
			
		||||
    * does not by itself send a packet.
 | 
			
		||||
    *
 | 
			
		||||
    * \param pid The player ID.
 | 
			
		||||
    * \param refId The creature refId.
 | 
			
		||||
    * \param displaysCreatureName Whether the player's name appears as that of the creature
 | 
			
		||||
    *                             when hovered over by others.
 | 
			
		||||
    * \return void
 | 
			
		||||
    */
 | 
			
		||||
    static void SetCreatureRefId(unsigned short pid, const char *refId, bool displayCreatureName) noexcept;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
    * \brief Send a PlayerMiscellaneous packet with a Mark location to a player.
 | 
			
		||||
    *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -118,22 +118,6 @@ const char *StatsFunctions::GetBirthsign(unsigned short pid) noexcept
 | 
			
		|||
    return player->birthsign.c_str();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char *StatsFunctions::GetCreatureModel(unsigned short pid) noexcept
 | 
			
		||||
{
 | 
			
		||||
    Player *player;
 | 
			
		||||
    GET_PLAYER(pid, player, 0);
 | 
			
		||||
 | 
			
		||||
    return player->creatureModel.c_str();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool StatsFunctions::IsCreatureName(unsigned short pid) noexcept
 | 
			
		||||
{
 | 
			
		||||
    Player *player;
 | 
			
		||||
    GET_PLAYER(pid, player, 0);
 | 
			
		||||
 | 
			
		||||
    return player->useCreatureName;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char *StatsFunctions::GetDeathReason(unsigned short pid) noexcept
 | 
			
		||||
{
 | 
			
		||||
    Player *player;
 | 
			
		||||
| 
						 | 
				
			
			@ -346,16 +330,6 @@ void StatsFunctions::SetBirthsign(unsigned short pid, const char *sign) noexcept
 | 
			
		|||
    player->birthsign = sign;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void StatsFunctions::SetCreatureModel(unsigned short pid, const char *name, bool useCreatureName) noexcept
 | 
			
		||||
{
 | 
			
		||||
    Player *player;
 | 
			
		||||
    GET_PLAYER(pid, player, );
 | 
			
		||||
 | 
			
		||||
    player->creatureModel = name;
 | 
			
		||||
    player->useCreatureName = useCreatureName;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void StatsFunctions::SetLevel(unsigned short pid, int value) noexcept
 | 
			
		||||
{
 | 
			
		||||
    Player *player;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,8 +19,6 @@
 | 
			
		|||
    {"GetHair",                 StatsFunctions::GetHairstyle},\
 | 
			
		||||
    {"GetIsMale",               StatsFunctions::GetIsMale},\
 | 
			
		||||
    {"GetBirthsign",            StatsFunctions::GetBirthsign},\
 | 
			
		||||
    {"GetCreatureModel",        StatsFunctions::GetCreatureModel},\
 | 
			
		||||
    {"IsCreatureName",          StatsFunctions::IsCreatureName},\
 | 
			
		||||
    {"GetDeathReason",          StatsFunctions::GetDeathReason},\
 | 
			
		||||
    \
 | 
			
		||||
    {"GetLevel",                StatsFunctions::GetLevel},\
 | 
			
		||||
| 
						 | 
				
			
			@ -51,7 +49,6 @@
 | 
			
		|||
    {"SetHair",                 StatsFunctions::SetHairstyle},\
 | 
			
		||||
    {"SetIsMale",               StatsFunctions::SetIsMale},\
 | 
			
		||||
    {"SetBirthsign",            StatsFunctions::SetBirthsign},\
 | 
			
		||||
    {"SetCreatureModel",        StatsFunctions::SetCreatureModel},\
 | 
			
		||||
    \
 | 
			
		||||
    {"SetLevel",                StatsFunctions::SetLevel},\
 | 
			
		||||
    {"SetLevelProgress",        StatsFunctions::SetLevelProgress},\
 | 
			
		||||
| 
						 | 
				
			
			@ -98,8 +95,6 @@ public:
 | 
			
		|||
    static const char *GetHairstyle(unsigned short pid) noexcept;
 | 
			
		||||
    static int GetIsMale(unsigned short pid) noexcept;
 | 
			
		||||
    static const char *GetBirthsign(unsigned short pid) noexcept;
 | 
			
		||||
    static const char *GetCreatureModel(unsigned short pid) noexcept;
 | 
			
		||||
    static bool IsCreatureName(unsigned short pid) noexcept;
 | 
			
		||||
    static const char *GetDeathReason(unsigned short pid) noexcept;
 | 
			
		||||
 | 
			
		||||
    static int GetLevel(unsigned short pid) noexcept;
 | 
			
		||||
| 
						 | 
				
			
			@ -128,7 +123,6 @@ public:
 | 
			
		|||
    static void SetHairstyle(unsigned short pid, const char *style) noexcept;
 | 
			
		||||
    static void SetIsMale(unsigned short pid, int male) noexcept;
 | 
			
		||||
    static void SetBirthsign(unsigned short pid, const char *name) noexcept;
 | 
			
		||||
    static void SetCreatureModel(unsigned short pid, const char *name, bool useCreatureName) noexcept;
 | 
			
		||||
    
 | 
			
		||||
    static void SetLevel(unsigned short pid, int value) noexcept;
 | 
			
		||||
    static void SetLevelProgress(unsigned short pid, int value) noexcept;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -44,21 +44,21 @@ void PlayerList::createPlayer(RakNet::RakNetGUID guid)
 | 
			
		|||
 | 
			
		||||
    ESM::Creature creature;
 | 
			
		||||
    ESM::NPC npc;
 | 
			
		||||
    if (!dedicPlayer->creatureModel.empty())
 | 
			
		||||
    if (!dedicPlayer->creatureRefId.empty())
 | 
			
		||||
    {
 | 
			
		||||
        const ESM::Creature *tmpCreature = world->getStore().get<ESM::Creature>().search(dedicPlayer->creatureModel);
 | 
			
		||||
        const ESM::Creature *tmpCreature = world->getStore().get<ESM::Creature>().search(dedicPlayer->creatureRefId);
 | 
			
		||||
        if (tmpCreature == 0)
 | 
			
		||||
        {
 | 
			
		||||
            dedicPlayer->creatureModel = "";
 | 
			
		||||
            dedicPlayer->creatureRefId = "";
 | 
			
		||||
            createPlayer(guid);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        creature = *tmpCreature;
 | 
			
		||||
        creature.mScript = "";
 | 
			
		||||
        if (!dedicPlayer->useCreatureName)
 | 
			
		||||
        if (!dedicPlayer->displayCreatureName)
 | 
			
		||||
            creature.mName = dedicPlayer->npc.mName;
 | 
			
		||||
        LOG_APPEND(Log::LOG_INFO, "Player %s looks like %s", dedicPlayer->npc.mName.c_str(),
 | 
			
		||||
                   dedicPlayer->creatureModel.c_str());
 | 
			
		||||
                   dedicPlayer->creatureRefId.c_str());
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -82,8 +82,8 @@ void PlayerList::createPlayer(RakNet::RakNetGUID guid)
 | 
			
		|||
    if (dedicPlayer->reference)
 | 
			
		||||
    {
 | 
			
		||||
        bool isNPC = dedicPlayer->reference->getPtr().getTypeName() == typeid(ESM::NPC).name();
 | 
			
		||||
        if ((!dedicPlayer->creatureModel.empty() && isNPC) ||
 | 
			
		||||
            (dedicPlayer->creatureModel.empty() && !isNPC))
 | 
			
		||||
        if ((!dedicPlayer->creatureRefId.empty() && isNPC) ||
 | 
			
		||||
            (dedicPlayer->creatureRefId.empty() && !isNPC))
 | 
			
		||||
        {
 | 
			
		||||
            if (dedicPlayer->reference)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -106,7 +106,7 @@ void PlayerList::createPlayer(RakNet::RakNetGUID guid)
 | 
			
		|||
    if (dedicPlayer->state == 0)
 | 
			
		||||
    {
 | 
			
		||||
        string recid;
 | 
			
		||||
        if (dedicPlayer->creatureModel.empty())
 | 
			
		||||
        if (dedicPlayer->creatureRefId.empty())
 | 
			
		||||
        {
 | 
			
		||||
            LOG_APPEND(Log::LOG_INFO, "- Creating new NPC record");
 | 
			
		||||
            npc.mId = "Dedicated Player";
 | 
			
		||||
| 
						 | 
				
			
			@ -158,7 +158,7 @@ void PlayerList::createPlayer(RakNet::RakNetGUID guid)
 | 
			
		|||
        MWWorld::Store<ESM::Creature> *creature_store = const_cast<MWWorld::Store<ESM::Creature> *> (&store->get<ESM::Creature>());
 | 
			
		||||
        MWWorld::Store<ESM::NPC> *npc_store = const_cast<MWWorld::Store<ESM::NPC> *> (&store->get<ESM::NPC>());
 | 
			
		||||
 | 
			
		||||
        if (!dedicPlayer->creatureModel.empty())
 | 
			
		||||
        if (!dedicPlayer->creatureRefId.empty())
 | 
			
		||||
        {
 | 
			
		||||
            if (!npc.mId.empty() || npc.mId != "Dedicated Player")
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -224,7 +224,7 @@ namespace mwmp
 | 
			
		|||
            inventoryChanges.count = 0;
 | 
			
		||||
            spellbookChanges.action = 0;
 | 
			
		||||
            spellbookChanges.count = 0;
 | 
			
		||||
            useCreatureName = false;
 | 
			
		||||
            displayCreatureName = false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        BasePlayer()
 | 
			
		||||
| 
						 | 
				
			
			@ -287,8 +287,9 @@ namespace mwmp
 | 
			
		|||
 | 
			
		||||
        float scale;
 | 
			
		||||
        bool isWerewolf;
 | 
			
		||||
        std::string creatureModel;
 | 
			
		||||
        bool useCreatureName;
 | 
			
		||||
 | 
			
		||||
        bool displayCreatureName;
 | 
			
		||||
        std::string creatureRefId;
 | 
			
		||||
 | 
			
		||||
        bool isChangingRegion;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,7 +25,4 @@ void PacketPlayerBaseInfo::Packet(RakNet::BitStream *bs, bool send)
 | 
			
		|||
    RW(player->npc.mFlags, send);
 | 
			
		||||
 | 
			
		||||
    RW(player->birthsign, send, 1);
 | 
			
		||||
 | 
			
		||||
    RW(player->creatureModel, send, 1);
 | 
			
		||||
    RW(player->useCreatureName, send);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,4 +14,7 @@ void PacketPlayerShapeshift::Packet(RakNet::BitStream *bs, bool send)
 | 
			
		|||
 | 
			
		||||
    RW(player->scale, send);
 | 
			
		||||
    RW(player->isWerewolf, send);
 | 
			
		||||
 | 
			
		||||
    RW(player->displayCreatureName, send);
 | 
			
		||||
    RW(player->creatureRefId, send, 1);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue