Как проверить состояние игрока, зная его GUID?
Вот кусок кода:
Код:
if ((pPlayer->isInCombat()) || (pPlayer->isInFlight())) А именно что-то типа такого: Код:
if ((player(GUID)->isInCombat()) || (player(GUID)->isInFlight())) |
Код:
Player* plr = sObjectMgr.GetPlayer(guid); |
Нужна помощь.
Скрипт для предмета. При использовании предмета на игрока с заданным GUID вешается спелл 7933. Код:
#include "precompiled.h" Код:
1>------ Построение начато: проект: ScriptDev2, Конфигурация: Release Win32 ------ |
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); |
Не получилось....
Ошибка: Код:
1>------ Построение начато: проект: ScriptDev2, Конфигурация: Release Win32 ------ |
Кто-нибудь сможет объяснить смысл этой ошибки?
|
Ядро пересобрал после добавления MANGOS_DLL_SPEC?
|
Цитата:
Да. При сборке ядра получил такую ошибку: Код:
d:\wowserver\src\mangos\mangos\src\game\ObjectAccessor.h(110) : error C2059: синтаксическая ошибка: __declspec(dllexport) Ревизия - текущая на данный момент. |
Не проверял компиляцию до этого.
С Код:
static Player* MANGOS_DLL_DECL FindPlayer(ObjectGuid guid); |
Цитата:
Ок. Сейчас скачаю заново исходники и пересобиру все с нуля. А зачем добавлять MANGOS_DLL_DECL? |
Цитата:
|
Так. Стоп!
Где верно? Цитата:
или Цитата:
|
Не смотрел в чем разница между ними. Один из них должен работать :)
При экспорте из DLL используется MS-специфик атрибут __declspec(dllexport), при импорте соответственно __declspec(dllimport). Всю остальную необходимую информацию по DLL можно найти в гугле. |
Цитата:
Сейчас соберу SD2..... Ошибка........ Код:
Создается библиотека ..\..\..\..\bin\win32_release/mangosscript.lib и объект ..\..\..\..\bin\win32_release/mangosscript.exp |
Тема забыта, проблема решена?
В общем вдруг нужно будет кому-то ещё : т.к. это статик его нужно экспортировать явно... Код:
static _declspec(dllexport) Player* FindPlayer(ObjectGuid guid); |
Тема отложена... не решена....
Попробую твой вариант... о результате сообщу. |
Что за извращения... Как я понимаю нужно только для игрока в инсте - тогда
в Map есть полный набор функций по доступу к объектам в инсте (если они в загруженых частях карты естесвеено), в том числе и игроков. |
Решил вернуться к этому скрипту.
Разобрался, скрипт работает, но только если игрок на которого вешается спел находится в игре. Если игрока (target) в игре нет, то сервер падает с "Ошибка сегментирования" Код:
Player *target = sObjectMgr.GetPlayer(guidPlaTarget); Как получить target если игрок оффлайн? |
никак
|
Возможно я не правильно выразился.... но я сделал так:
Код:
if (!sObjectMgr.GetPlayer(guidPlaTarget)) |
Работает только если игрок онлайн.
|
Цитата:
Вот тут Код:
if (!sObjectMgr.GetPlayer(guidPlaTarget)) Если игрока нет, то Код:
return false; |
GetPlayer ищет только онлайн и in-world игроков.
Обычно делают так: Код:
target = GetXXX(guid); |
Не стал создавать новую тему, т.к. вопрос схожий.
За основу взял пример из SD2 example_gossip_codebox.cpp Код:
#include "precompiled.h" Почему так? |
if (!target) почему !
И какое отношение pPlayer имеет к target |
Цитата:
if (target == NULL) ? Цитата:
pPlayer - разговаривает с NPC и вводит codebox имя другого игрока (target ) target - игрок которого проверям, что он существует. |
а, т.е. там нужна проверка !target для ошибки.
Тогда должно работать, только sCode должно быть нормализованым: начинается с заглавнной и нижним регистром далее. |
Цитата:
а... ясно... понял.. да, скорее всего это оно.... Спасибо. |
Текущее время: 13:28. Часовой пояс GMT +3. |
ru-mangos.ru - Русское сообщество MaNGOS