Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Скрипты (http://mangos.ytdb.ru/forumdisplay.php?f=19)
-   -   Как проверить состояние игрока, зная его GUID? (http://mangos.ytdb.ru/showthread.php?t=1809)

tozter 17.07.2010 10:59

Как проверить состояние игрока, зная его GUID?
 
Вот кусок кода:

Код:

if ((pPlayer->isInCombat()) || (pPlayer->isInFlight()))
{
      pPlayer->SendEquipError(EQUIP_ERR_NONE, pItem, NULL);
        return false;
}

Тут все просто, но мне надо другое.
А именно что-то типа такого:

Код:

if ((player(GUID)->isInCombat()) || (player(GUID)->isInFlight()))
{
      pPlayer->SendEquipError(EQUIP_ERR_NONE, pItem, NULL);
        return false;
}


LordJZ 17.07.2010 11:01

Код:

Player* plr = sObjectMgr.GetPlayer(guid);

tozter 17.07.2010 17:43

Нужна помощь.
Скрипт для предмета.
При использовании предмета на игрока с заданным GUID вешается спелл 7933.

Код:

#include "precompiled.h"
#include "ObjectMgr.h"

bool ItemUse_item_test7933(Player* pPlayer, Item* pItem, const SpellCastTargets &pTargets)
{
        uint32 guidPlaTarget = 10;


    Player* targetpl = sObjectMgr.GetPlayer(guidPlaTarget);
        if (!targetpl->IsInWorld())
        {
                pPlayer->SendEquipError(EQUIP_ERR_NONE, pItem, NULL);
                return false;
        }
       
        pPlayer->RemoveSpellsCausingAura(SPELL_AURA_MOUNTED);
       
        {
                targetpl->CastSpell(targetpl, 7933, true);
                return true;
        }
}

void AddSC_item_test7933()
{
    Script *newscript;

      newscript = new Script;
    newscript->Name="item_test7933";
    newscript->pItemUse = &ItemUse_item_test7933;
    newscript->RegisterSelf();
}

При компиляции такая ошибка:
Код:

1>------ Построение начато: проект: ScriptDev2, Конфигурация: Release Win32 ------
1>  Extracting revision
1>  item_test7933.cpp
1>    Создается библиотека ..\..\..\..\bin\win32_release\mangosscript.lib и объект ..\..\..\..\bin\win32_release\mangosscript.exp
1>item_test7933.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: static class Player * __cdecl ObjectAccessor::FindPlayer(class ObjectGuid)" (?FindPlayer@ObjectAccessor@@SAPAVPlayer@@VObjectGuid@@@Z) в функции "public: class Player * __thiscall ObjectMgr::GetPlayer(class ObjectGuid)const " (?GetPlayer@ObjectMgr@@QBEPAVPlayer@@VObjectGuid@@@Z)
1>item_test7933.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall ObjectMgr::ObjectMgr(void)" (??0ObjectMgr@@QAE@XZ) в функции "public: static class ObjectMgr * __cdecl MaNGOS::OperatorNew<class ObjectMgr>::Create(void)" (?Create@?$OperatorNew@VObjectMgr@@@MaNGOS@@SAPAVObjectMgr@@XZ)
1>item_test7933.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall ObjectMgr::~ObjectMgr(void)" (??1ObjectMgr@@QAE@XZ) в функции "public: void * __thiscall ObjectMgr::`scalar deleting destructor'(unsigned int)" (??_GObjectMgr@@QAEPAXI@Z)
1>item_test7933.obj : error LNK2001: неразрешенный внешний символ ""private: static bool MaNGOS::Singleton<class ObjectMgr,class MaNGOS::SingleThreaded<class ObjectMgr>,class MaNGOS::OperatorNew<class ObjectMgr>,class MaNGOS::ObjectLifeTime<class ObjectMgr> >::si_destroyed" (?si_destroyed@?$Singleton@VObjectMgr@@V?$SingleThreaded@VObjectMgr@@@MaNGOS@@V?$OperatorNew@VObjectMgr@@@3@V?$ObjectLifeTime@VObjectMgr@@@3@@MaNGOS@@0_NA)"
1>item_test7933.obj : error LNK2001: неразрешенный внешний символ ""private: static class ObjectMgr * MaNGOS::Singleton<class ObjectMgr,class MaNGOS::SingleThreaded<class ObjectMgr>,class MaNGOS::OperatorNew<class ObjectMgr>,class MaNGOS::ObjectLifeTime<class ObjectMgr> >::si_instance" (?si_instance@?$Singleton@VObjectMgr@@V?$SingleThreaded@VObjectMgr@@@MaNGOS@@V?$OperatorNew@VObjectMgr@@@3@V?$ObjectLifeTime@VObjectMgr@@@3@@MaNGOS@@0PAVObjectMgr@@A)"
1>..\..\..\..\bin\win32_release\mangosscript.dll : fatal error LNK1120: 5 неразрешенных внешних элементов
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========


zergtmn 17.07.2010 18:09

1. sObjectMgr.GetPlayer замени на ObjectAccessor::FindPlayer
2. if (!targetpl->IsInWorld()) не нужно
3. в ObjectAccessor.h:
Код:

static Player* FindPlayer(ObjectGuid guid);
попробуй заменить на
Код:

static Player* MANGOS_DLL_SPEC FindPlayer(ObjectGuid guid);

tozter 18.07.2010 11:45

Не получилось....

Ошибка:

Код:

1>------ Построение начато: проект: ScriptDev2, Конфигурация: Release Win32 ------
1>  Extracting revision
1>  item_test7933.cpp
1>    Создается библиотека ..\..\..\..\bin\win32_release\mangosscript.lib и объект ..\..\..\..\bin\win32_release\mangosscript.exp
1>item_test7933.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: static class Player * __cdecl ObjectAccessor::FindPlayer(class ObjectGuid)" (?FindPlayer@ObjectAccessor@@SAPAVPlayer@@VObjectGuid@@@Z) в функции "bool __cdecl ItemUse_item_test7933(class Player *,class Item *,class SpellCastTargets const &)" (?ItemUse_item_test7933@@YA_NPAVPlayer@@PAVItem@@ABVSpellCastTargets@@@Z)
1>..\..\..\..\bin\win32_release\mangosscript.dll : fatal error LNK1120: 1 неразрешенных внешних элементов
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

Собираю в MS V C++ 2010

tozter 19.07.2010 10:47

Кто-нибудь сможет объяснить смысл этой ошибки?

zergtmn 19.07.2010 11:52

Ядро пересобрал после добавления MANGOS_DLL_SPEC?

tozter 19.07.2010 13:14

Цитата:

Сообщение от zergtmn (Сообщение 10943)
Ядро пересобрал после добавления MANGOS_DLL_SPEC?


Да.
При сборке ядра получил такую ошибку:

Код:

d:\wowserver\src\mangos\mangos\src\game\ObjectAccessor.h(110) : error C2059: синтаксическая ошибка: __declspec(dllexport)
d:\wowserver\src\mangos\mangos\src\game\ObjectAccessor.h(110) : error C2238: непредвиденные лексемы перед ";"
d:\wowserver\src\mangos\mangos\src\game\ObjectAccessor.h(171) : error C3861: FindPlayer: идентификатор не найден
d:\wowserver\src\mangos\mangos\src\bindings\universal\../../game/ObjectMgr.h(471) : error C2039: FindPlayer: не является членом "ObjectAccessor"
        d:\wowserver\src\mangos\mangos\src\game\ObjectAccessor.h(87): см. объявление 'ObjectAccessor'
d:\wowserver\src\mangos\mangos\src\bindings\universal\../../game/ObjectMgr.h(471) : error C3861: FindPlayer: идентификатор не найден

Исходники чистые.
Ревизия - текущая на данный момент.

zergtmn 19.07.2010 15:15

Не проверял компиляцию до этого.
С
Код:

static Player* MANGOS_DLL_DECL FindPlayer(ObjectGuid guid);
скомпилировалось.

tozter 19.07.2010 15:33

Цитата:

Сообщение от zergtmn (Сообщение 10947)
Не проверял компиляцию до этого.
С
Код:

static Player* MANGOS_DLL_DECL FindPlayer(ObjectGuid guid);
скомпилировалось.


Ок.
Сейчас скачаю заново исходники и пересобиру все с нуля.

А зачем добавлять MANGOS_DLL_DECL?

zergtmn 19.07.2010 16:05

Цитата:

Сообщение от tozter (Сообщение 10948)
Ок.
Сейчас скачаю заново исходники и пересобиру все с нуля.

А зачем добавлять MANGOS_DLL_DECL?

Чтобы функция экспортировалась при сборке mangosd.exe (и импортировалась извне).

tozter 19.07.2010 16:09

Так. Стоп!

Где верно?

Цитата:

Сообщение от zergtmn (Сообщение 10835)
Код:

static Player* FindPlayer(ObjectGuid guid);
попробуй заменить на
Код:

static Player* MANGOS_DLL_SPEC FindPlayer(ObjectGuid guid);


или

Цитата:

Сообщение от zergtmn (Сообщение 10947)
Код:

static Player* MANGOS_DLL_DECL FindPlayer(ObjectGuid guid);


zergtmn 19.07.2010 16:23

Не смотрел в чем разница между ними. Один из них должен работать :)
При экспорте из DLL используется MS-специфик атрибут __declspec(dllexport), при импорте соответственно __declspec(dllimport). Всю остальную необходимую информацию по DLL можно найти в гугле.

tozter 19.07.2010 16:55

Цитата:

Сообщение от zergtmn (Сообщение 10954)
Не смотрел в чем разница между ними. Один из них должен работать :)
При экспорте из DLL используется MS-специфик атрибут __declspec(dllexport), при импорте соответственно __declspec(dllimport). Всю остальную необходимую информацию по DLL можно найти в гугле.

Ядро собралось с MANGOS_DLL_DECL

Сейчас соберу SD2.....

Ошибка........

Код:

  Создается библиотека ..\..\..\..\bin\win32_release/mangosscript.lib и объект ..\..\..\..\bin\win32_release/mangosscript.exp
item_test7933.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: static class Player * __cdecl ObjectAccessor::FindPlayer(class ObjectGuid)" (?FindPlayer@ObjectAccessor@@SAPAVPlayer@@VObjectGuid@@@Z) в функции "bool __cdecl ItemUse_item_test7933(class Player *,class Item *,class SpellCastTargets const &)" (?ItemUse_item_test7933@@YA_NPAVPlayer@@PAVItem@@ABVSpellCastTargets@@@Z)
..\..\..\..\bin\win32_release/mangosscript.dll : fatal error LNK1120: 1 неразрешенных внешних элементов
Журнал построения был сохранен в "file://d:\wowserver\src\mangos\mangos\src\bindings\Scriptdev2\VC90\ScriptDev2__Win32_Release\BuildLog.htm"
ScriptDev2 - ошибок 2, предупреждений 0
========== Перестроение всех: успешно: 0, с ошибками: 1, пропущено: 0 ==========


Prefect 14.08.2010 18:27

Тема забыта, проблема решена?
В общем вдруг нужно будет кому-то ещё :

т.к. это статик его нужно экспортировать явно...
Код:

        static _declspec(dllexport) Player* FindPlayer(ObjectGuid guid);

tozter 14.08.2010 22:27

Тема отложена... не решена....

Попробую твой вариант... о результате сообщу.

Vladimir 14.08.2010 23:53

Что за извращения... Как я понимаю нужно только для игрока в инсте - тогда
в Map есть полный набор функций по доступу к объектам в инсте (если они в загруженых частях карты естесвеено), в том числе и игроков.

tozter 22.09.2010 11:45

Решил вернуться к этому скрипту.

Разобрался, скрипт работает, но только если игрок на которого вешается спел находится в игре. Если игрока (target) в игре нет, то сервер падает с "Ошибка сегментирования"

Код:

Player *target = sObjectMgr.GetPlayer(guidPlaTarget);
Вот тут и падает.

Как получить target если игрок оффлайн?

Vladimir 22.09.2010 12:16

никак

tozter 22.09.2010 14:25

Возможно я не правильно выразился.... но я сделал так:

Код:

        if (!sObjectMgr.GetPlayer(guidPlaTarget))

        {
              pPlayer->SendEquipError(EQUIP_ERR_NONE, pItem, NULL);

              return false;

        }


        Player *target = sObjectMgr.GetPlayer(guidPlaTarget);

Работает.

zergtmn 22.09.2010 16:52

Работает только если игрок онлайн.

tozter 22.09.2010 17:58

Цитата:

Сообщение от zergtmn (Сообщение 14326)
Работает только если игрок онлайн.

Нет.

Вот тут
Код:

if (!sObjectMgr.GetPlayer(guidPlaTarget))
проверяем игрок онлайн или нет.

Если игрока нет, то
Код:

return false;

zergtmn 22.09.2010 18:25

GetPlayer ищет только онлайн и in-world игроков.

Обычно делают так:
Код:

target = GetXXX(guid);
if(!target)
{
    ...
    return false;
}

На случай, если GetXXX медленная операция.

tozter 08.11.2010 17:42

Не стал создавать новую тему, т.к. вопрос схожий.

За основу взял пример из SD2 example_gossip_codebox.cpp
Код:

#include "precompiled.h"
#include <cstring>
#include "Object.h"
#include "ObjectGuid.h"
#include "ObjectMgr.h"

bool GossipSelectWithCode_npc_weeding(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction, const char* sCode)
{
// поскипано...


uint64 guidTarget = sObjectMgr.GetPlayerGUIDByName(sCode);
Player *target = sObjectMgr.GetPlayer(guidTarget);
// если игрока с именем sCode нет, то target = NULL

            if (!target)
            {
            pCreature->MonsterWhisper(SAY_WRONG, pPlayer->GetGUID());
            pPlayer->CLOSE_GOSSIP_MENU();
            return false;
            }

// поскипано...
}

Но у меня всегда возвращает NULL, даже когда игрок с именем sCode существует.
Почему так?

Vladimir 08.11.2010 18:11

if (!target) почему !

И какое отношение pPlayer имеет к target

tozter 08.11.2010 18:22

Цитата:

Сообщение от Vladimir (Сообщение 15953)
if (!target) почему !

Хмм... Может вот так:
if (target == NULL)
?


Цитата:

Сообщение от Vladimir (Сообщение 15953)
И какое отношение pPlayer имеет к target

Ни какого. Это 2-а разных игрока.
pPlayer - разговаривает с NPC и вводит codebox имя другого игрока (target )
target - игрок которого проверям, что он существует.

Vladimir 08.11.2010 18:38

а, т.е. там нужна проверка !target для ошибки.

Тогда должно работать, только sCode должно быть нормализованым: начинается с заглавнной и нижним регистром далее.

tozter 08.11.2010 18:50

Цитата:

Сообщение от Vladimir (Сообщение 15957)
а, т.е. там нужна проверка !target для ошибки.

Тогда должно работать, только sCode должно быть нормализованым: начинается с заглавнной и нижним регистром далее.


а... ясно... понял.. да, скорее всего это оно....
Спасибо.


Текущее время: 13:28. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS