|
|
Модератор форума: Dimitro |
Форум TrinityCore [TrinityCore] Help Закрытие окна лута (С++) |
Закрытие окна лута |
Приветствую
Возникла проблема: Есть ГО - объект У него с 25% вероятностью срабатывает спелл отталкивающий игрока, но у объекта так же есть лут Так вот при ударе отталкивающим спеллом окно лута не закрывается и если игрок кликает по луту в этом окне в момент полёта после удара - объект переклинивает и уже его юзать нельзя Подскажите как сделать чтобы окно лута закрывалось? GoState и SendLootRelease не предлагать - не срабатывает
Если помог, ставь плюсик в репу :)
Сообщение # 1 написано 18.04.2017 в 18:36
|
не помогло
окно лута осталось открытым у игрока и при клике объект опять перекосило теперь при попытке заюзать выдаётся "That is already being used" - тоесть как будто его всё ещё кто-то лутает при чём я сделал так: /*###### ## go_obj ######*/ #define SPELL_EXPLODE xxxxx bool GOHello_go_obj(Player* pPlayer, GameObject* pGO) { if (urand(0, 100) <= 25) { pGO->SetLootState(GO_JUST_DEACTIVATED); pGO->ToGameObject()->ResetDoorOrButton(); pPlayer->CastSpell(pPlayer, SPELL_EXPLODE, true); return false; } else return false; } если в первом условии поставить return true игрока вообще заклинивает в сидячем положении.... Добавлено (19.04.2017, 10:35)
Если помог, ставь плюсик в репу :)
Сообщение # 3 написано 19.04.2017 в 10:35
|
по сути мне нужно чтобы окно лута или вообще не открывалось или открылось но пустым Код if ((pProto->Flags2 & ITEM_FLAG2_FACTION_HORDE) && player->GetTeam() != HORDE) return false; if ((pProto->Flags2 & ITEM_FLAG2_FACTION_ALLIANCE) && player->GetTeam() != ALLIANCE) return false; или не покатит?
Сообщение # 4 написано 19.04.2017 в 11:25
|
А классы при чём? мне надо чтобы лут не показывался если объект даёт игроку пинка спеллом тоесть if (пендаль спеллом) NO LOOT else (показать лут) Можно попробывать заливать в ГО напрямую лут, в случае, если каст не срабатывает, но как поведет себя ядро. Может крашнуть. Нужно проверять, есть ли лут в ГО. Но я не знаю этих методов, не сталкивался, но идею решил подкинуть. |
GO_JUST_DEACTIVATED; не помогает
Добавлено (19.04.2017, 12:30)
Если помог, ставь плюсик в репу :)
Сообщение # 9 написано 19.04.2017 в 12:30
|
Ты вешаешь скрипт на случай открытия, то есть заведомо известно, что открытие состоялось. Если это не нужно, зачем тогда это делать?
Верным решением будет обрабатывание нажатия на объект, а именно в этот метод вставить свои 25% и если они не срабатывают, то оставить код таким, каким и является сейчас, а в случае срабатывания - прерывать выполнения кода далее и дать пинок. В результате никакое ГО не откроется, никакой скрипт hello не выполнится и будет всё как нужно. Единственное, что нужно обрабатывать сам метод, а не дописывать "патч" в отдельном файле - этот gossiphello. Вообще же не логично открывать объект, а потом думать может быть его не нужно было открывать. Правильнее изначально решить, стоит ли его вообще открывать или нет.
Сообщение # 10 написано 19.04.2017 в 15:06
|
как это сделать?
как обработать НАЖАТИЕ? у меня нет ни 1 примера почему нелогично? ты открываешь например сундук с ловушкой открываешь и либо он рванёт откинув тебя либо даст лут - по-моему логично всё Добавлено (19.04.2017, 17:12) --------------------------------------------- Даже так не пашет Всё равно объект зависает что типа он кем-то уже используется Loot* loot = &pGO->loot; uint32 lootid = pGO->GetGOInfo()->GetLootId(); pPlayer->SendLootRelease(lootid); pGO->CastSpell(pPlayer, SPELL_EXPLODE, true); pPlayer->SendLoot(pGO->GetGUID(), LOOT_NONE); pPlayer->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_LOOTING); pGO->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); loot->RemoveLooter(pPlayer->GetGUID()); pGO->SetUInt32Value(GAMEOBJECT_FLAGS, (pGO->GetGOInfo()->flags & ~(GO_FLAG_LOCKED | GO_FLAG_INTERACT_COND | GO_FLAG_NOT_SELECTABLE))); Добавлено (19.04.2017, 18:59) --------------------------------------------- И так не прокатило uint32 guid = pGO->GetGUID(); pGO->CastSpell(pPlayer, SPELL_EXPLODE, true); pPlayer->SendLootRelease(guid); pPlayer->GetSession()->DoLootRelease(pPlayer->GetLootGUID()); pGO->ToGameObject()->ResetDoorOrButton();
Если помог, ставь плюсик в репу :)
|
Не понимаю зачем тебе какие-либо примеры, берёшь и сам ищешь необходимое в коде, ты вроде достаточно разбираешься, чтобы с этим справиться. Объясню - ты вешаешь свой "патч", переопределяя функции(вроде), а именно GOHello_go_obj, в коде же чем-то она вызывается? Находишь это место и обрабатываешь, логично что это место находится в Gameobject.cpp, в классе ГО. Если тебе не известно в каком месте это обрабатывается, то можно идти по логической цепочки - ставишь вывод какой пакет приходит в ядро, в файле Worldsession.cpp и смотришь что приходит по нажатию на объект, а затем смотришь в каком месте этот пакет обрабатывается(общий алгоритм как искать в целом).
С таким же успехом можно и сделать по другому. Игрок подходит к объекту, нажимает на него, там твой urand и если ловушка, то кастуешь какой-то спел взрыва, типа подорвался или ещё что-то + спел откидывания, считай полез в сундук, попался в ловушку и подорвался и никакого открытия нет и закрывать ничего не нужно. Твоя проблема в том, что ты открываешь объект, а потом спрашиваешь - а как его закрыть? Повторяю - зачем тебе его открывать, если ты его хочешь сразу закрыть? Создать эффект взрыва и отталкивания? Так ты можешь это сделать без открытия объекта. Если происходит откидывания, т.е срабатывает твой urand, то делаешь нужные тебе действия и return; из метода и никакого открытия объекта не будет, собственно в чём у тебя и заключается проблема.
Сообщение # 12 написано 19.04.2017 в 21:06
|
Не приходило в голову создать два разных, внешне неотличимых сундука (один - с добычей, другой - с сюрпризом), и настроить их шанс появления при помощи этого, ограничившись таким образом работой в базе?.. Абсурдно же за таким в ядро лезть.
|
pool_gameobject это интересно и я думал над этим
но честно говоря я что-то туплю и не пойму как сделать так чтобы рандомно в одном и том же месте появлялся то один то другой сундук да да вот такой я тормоз я не понимаю как с этой базой работать а объяснение на английском меня ещё больше в ступор вгоняет просто указываю в одном и том же пуле разные гуиды от разных объектов и они там сами разберутся по шансу? но в таком случае какой из объектов ставить в мир изначально на нужную точку? фальшивый или настоящий? или оба сразу в одно место?
Если помог, ставь плюсик в репу :)
|
просто указываю в одном и том же пуле разные гуиды от разных объектов и они там сами разберутся по шансу? Именно так. Две записи с двумя разными GUID'ами и общим Entry pool'а. Шансы - 25/75 соответственно. Можно поставить 25/0, тоже сработает скорее всего. но в таком случае какой из объектов ставить в мир изначально на нужную точку? фальшивый или настоящий? или оба сразу в одно место? В мире, разумеется, должны стоять оба, ибо GUID'ы - это ключи записей в таблице `gameobject`. Если там запись есть - объект есть в мире, если нет - у него и нет GUID'а. В игре полно примеров использования `pool_gameobject`. Например ноды собирательных профессий. |
| |||
| |||