|
Скрипты ScriptDev2 |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
17.07.2010, 10:59 | #1 |
Пользователь
Регистрация: 07.03.2010
Сообщений: 32
Сказал(а) спасибо: 9
Поблагодарили 0 раз(а) в 0 сообщениях
|
Как проверить состояние игрока, зная его 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; } |
17.07.2010, 17:43 | #3 |
Пользователь
Регистрация: 07.03.2010
Сообщений: 32
Сказал(а) спасибо: 9
Поблагодарили 0 раз(а) в 0 сообщениях
|
Нужна помощь.
Скрипт для предмета. При использовании предмета на игрока с заданным 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 ========== |
17.07.2010, 18:09 | #4 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
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); Последний раз редактировалось zergtmn; 17.07.2010 в 18:16. |
Пользователь сказал cпасибо: | Foks (18.07.2010) |
18.07.2010, 11:45 | #5 |
Пользователь
Регистрация: 07.03.2010
Сообщений: 32
Сказал(а) спасибо: 9
Поблагодарили 0 раз(а) в 0 сообщениях
|
Не получилось....
Ошибка: Код:
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 ========== |
19.07.2010, 10:47 | #6 |
Пользователь
Регистрация: 07.03.2010
Сообщений: 32
Сказал(а) спасибо: 9
Поблагодарили 0 раз(а) в 0 сообщениях
|
Кто-нибудь сможет объяснить смысл этой ошибки?
|
19.07.2010, 11:52 | #7 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
Ядро пересобрал после добавления MANGOS_DLL_SPEC?
|
19.07.2010, 13:14 | #8 |
Пользователь
Регистрация: 07.03.2010
Сообщений: 32
Сказал(а) спасибо: 9
Поблагодарили 0 раз(а) в 0 сообщениях
|
Да. При сборке ядра получил такую ошибку: Код:
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: идентификатор не найден Ревизия - текущая на данный момент. |
19.07.2010, 15:15 | #9 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
Не проверял компиляцию до этого.
С Код:
static Player* MANGOS_DLL_DECL FindPlayer(ObjectGuid guid); |
19.07.2010, 15:33 | #10 |
Пользователь
Регистрация: 07.03.2010
Сообщений: 32
Сказал(а) спасибо: 9
Поблагодарили 0 раз(а) в 0 сообщениях
|
|
19.07.2010, 16:05 | #11 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
|
19.07.2010, 16:09 | #12 | |
Пользователь
Регистрация: 07.03.2010
Сообщений: 32
Сказал(а) спасибо: 9
Поблагодарили 0 раз(а) в 0 сообщениях
|
Так. Стоп!
Где верно? Цитата:
или Последний раз редактировалось tozter; 19.07.2010 в 16:12. |
|
19.07.2010, 16:23 | #13 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
Не смотрел в чем разница между ними. Один из них должен работать
При экспорте из DLL используется MS-специфик атрибут __declspec(dllexport), при импорте соответственно __declspec(dllimport). Всю остальную необходимую информацию по DLL можно найти в гугле. |
19.07.2010, 16:55 | #14 | |
Пользователь
Регистрация: 07.03.2010
Сообщений: 32
Сказал(а) спасибо: 9
Поблагодарили 0 раз(а) в 0 сообщениях
|
Цитата:
Сейчас соберу 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 ========== |
|
14.08.2010, 18:27 | #15 |
Гость
Сообщений: n/a
|
Тема забыта, проблема решена?
В общем вдруг нужно будет кому-то ещё : т.к. это статик его нужно экспортировать явно... Код:
static _declspec(dllexport) Player* FindPlayer(ObjectGuid guid); Последний раз редактировалось Prefect; 14.08.2010 в 19:01. |
14.08.2010, 22:27 | #16 |
Пользователь
Регистрация: 07.03.2010
Сообщений: 32
Сказал(а) спасибо: 9
Поблагодарили 0 раз(а) в 0 сообщениях
|
Тема отложена... не решена....
Попробую твой вариант... о результате сообщу. |
14.08.2010, 23:53 | #17 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
Что за извращения... Как я понимаю нужно только для игрока в инсте - тогда
в Map есть полный набор функций по доступу к объектам в инсте (если они в загруженых частях карты естесвеено), в том числе и игроков.
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
22.09.2010, 11:45 | #18 |
Пользователь
Регистрация: 07.03.2010
Сообщений: 32
Сказал(а) спасибо: 9
Поблагодарили 0 раз(а) в 0 сообщениях
|
Решил вернуться к этому скрипту.
Разобрался, скрипт работает, но только если игрок на которого вешается спел находится в игре. Если игрока (target) в игре нет, то сервер падает с "Ошибка сегментирования" Код:
Player *target = sObjectMgr.GetPlayer(guidPlaTarget); Как получить target если игрок оффлайн? |
22.09.2010, 12:16 | #19 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
никак
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
22.09.2010, 14:25 | #20 |
Пользователь
Регистрация: 07.03.2010
Сообщений: 32
Сказал(а) спасибо: 9
Поблагодарили 0 раз(а) в 0 сообщениях
|
Возможно я не правильно выразился.... но я сделал так:
Код:
if (!sObjectMgr.GetPlayer(guidPlaTarget)) { pPlayer->SendEquipError(EQUIP_ERR_NONE, pItem, NULL); return false; } Player *target = sObjectMgr.GetPlayer(guidPlaTarget); |
22.09.2010, 16:52 | #21 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
Работает только если игрок онлайн.
|
22.09.2010, 17:58 | #22 |
Пользователь
Регистрация: 07.03.2010
Сообщений: 32
Сказал(а) спасибо: 9
Поблагодарили 0 раз(а) в 0 сообщениях
|
|
22.09.2010, 18:25 | #23 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
GetPlayer ищет только онлайн и in-world игроков.
Обычно делают так: Код:
target = GetXXX(guid); if(!target) { ... return false; } |
Пользователь сказал cпасибо: | tozter (24.09.2010) |
08.11.2010, 17:42 | #24 |
Пользователь
Регистрация: 07.03.2010
Сообщений: 32
Сказал(а) спасибо: 9
Поблагодарили 0 раз(а) в 0 сообщениях
|
Не стал создавать новую тему, т.к. вопрос схожий.
За основу взял пример из 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; } // поскипано... } Почему так? |
08.11.2010, 18:11 | #25 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
if (!target) почему !
И какое отношение pPlayer имеет к target
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
08.11.2010, 18:22 | #26 |
Пользователь
Регистрация: 07.03.2010
Сообщений: 32
Сказал(а) спасибо: 9
Поблагодарили 0 раз(а) в 0 сообщениях
|
Хмм... Может вот так:
if (target == NULL) ? Ни какого. Это 2-а разных игрока. pPlayer - разговаривает с NPC и вводит codebox имя другого игрока (target ) target - игрок которого проверям, что он существует. |
08.11.2010, 18:38 | #27 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
а, т.е. там нужна проверка !target для ошибки.
Тогда должно работать, только sCode должно быть нормализованым: начинается с заглавнной и нижним регистром далее.
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
Пользователь сказал cпасибо: | tozter (08.11.2010) |
08.11.2010, 18:50 | #28 |
Пользователь
Регистрация: 07.03.2010
Сообщений: 32
Сказал(а) спасибо: 9
Поблагодарили 0 раз(а) в 0 сообщениях
|
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
DataBase GUID sorter | Sid | Tools | 16 | 20.12.2010 10:06 |
[10812] Use ObjectGuid for corpse owner guid. | newsbot | CMaNGOS Commits | 0 | 02.12.2010 07:19 |
Передвижения мобов в отсутствие игрока | brainreaver | Корзина | 3 | 05.08.2010 14:22 |
[10100] Fixed some cases assign low guid to full guid update field. | newsbot | CMaNGOS Commits | 0 | 23.06.2010 10:20 |
Как проверить наличие предмета у игрока? | tozter | Скрипты | 6 | 25.03.2010 09:05 |