• Страница 1 из 1
  • 1
Модератор форума: Dimitro  
Форум » TrinityCore » [TrinityCore] Help » Закрытие окна лута (С++)
Закрытие окна лута
Stormtrooper
Командир
Приветствую
Возникла проблема:
Есть ГО - объект
У него с 25% вероятностью срабатывает спелл отталкивающий игрока, но у объекта так же есть лут
Так вот при ударе отталкивающим спеллом окно лута не закрывается и если игрок кликает по луту в этом окне в момент полёта после удара - объект переклинивает и уже его юзать нельзя
Подскажите как сделать чтобы окно лута закрывалось?
GoState и SendLootRelease не предлагать - не срабатывает
Если помог, ставь плюсик в репу :)

Сообщение # 1 написано 18.04.2017 в 18:36
ServerStar
Скаут
Закрытие необходимо всунуть в часть кода, где ты высчитываешь рандом каста спелла
Код
if(roll_chance_f)

С подобным не сталкивался, но попробуй
Код
SetStateLoot(GO_JUST_DEACTIVATED);
Сообщение # 2 отредактировано ServerStar - Вторник, 18.04.2017, 22:13
Stormtrooper
Командир
не помогло
окно лута осталось открытым у игрока и при клике объект опять перекосило
теперь при попытке заюзать выдаётся "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
Funtomas
Рыцарь
Цитата Stormtrooper ()
по сути мне нужно чтобы окно лута или вообще не открывалось или открылось но пустым
А если как вариант не показывать лут для классов?

Код
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
Stormtrooper
Командир
А классы при чём?
мне надо чтобы лут не показывался если объект даёт игроку пинка спеллом
тоесть
if (пендаль спеллом)
NO LOOT
else
(показать лут)
Если помог, ставь плюсик в репу :)

Сообщение # 5 написано 19.04.2017 в 11:35
ServerStar
Скаут
Цитата Stormtrooper ()
А классы при чём?
мне надо чтобы лут не показывался если объект даёт игроку пинка спеллом
тоесть
if (пендаль спеллом)
NO LOOT
else
(показать лут)

Можно попробывать заливать в ГО напрямую лут, в случае, если каст не срабатывает, но как поведет себя ядро. Может крашнуть. Нужно проверять, есть ли лут в ГО. Но я не знаю этих методов, не сталкивался, но идею решил подкинуть.
Сообщение # 6 отредактировано ServerStar - Среда, 19.04.2017, 11:56
Funtomas
Рыцарь
На это обращал внимание?
Код
m_lootState = GO_JUST_DEACTIVATED;
Сообщение # 7 написано 19.04.2017 в 11:57
ServerStar
Скаут
Цитата Funtomas ()
На это обращал внимание?

Не для этого случая
Сообщение # 8 написано 19.04.2017 в 12:28
Stormtrooper
Командир
GO_JUST_DEACTIVATED; не помогает

Добавлено (19.04.2017, 12:30)
---------------------------------------------
Даже так попробовал

Loot* loot = &pGO->loot;
loot->empty();
loot->RemoveLooter(pPlayer->GetGUID());
pGO->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
pPlayer->CastSpell(pPlayer, SPELL_EXPLODE, true);

не помогает

Если помог, ставь плюсик в репу :)

Сообщение # 9 написано 19.04.2017 в 12:30
Ranege
Чемпион
Ты вешаешь скрипт на случай открытия, то есть заведомо известно, что открытие состоялось. Если это не нужно, зачем тогда это делать?

Верным решением будет обрабатывание нажатия на объект, а именно в этот метод вставить свои 25% и если они не срабатывают, то оставить код таким, каким и является сейчас, а в случае срабатывания - прерывать выполнения кода далее и дать пинок. В результате никакое ГО не откроется, никакой скрипт hello не выполнится и будет всё как нужно. Единственное, что нужно обрабатывать сам метод, а не дописывать "патч" в отдельном файле - этот gossiphello.

Вообще же не логично открывать объект, а потом думать может быть его не нужно было открывать. Правильнее изначально решить, стоит ли его вообще открывать или нет.
Сообщение # 10 написано 19.04.2017 в 15:06
Stormtrooper
Командир
как это сделать?
как обработать НАЖАТИЕ?
у меня нет ни 1 примера

почему нелогично?
ты открываешь например сундук с ловушкой
открываешь и либо он рванёт откинув тебя либо даст лут - по-моему логично всё

Добавлено (19.04.2017, 17:12)
---------------------------------------------
Даже так не пашет
Всё равно объект зависает что типа он кем-то уже используется sad

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();
Если помог, ставь плюсик в репу :)

Сообщение # 11 отредактировано Stormtrooper - Среда, 19.04.2017, 18:59
Ranege
Чемпион
Не понимаю зачем тебе какие-либо примеры, берёшь и сам ищешь необходимое в коде, ты вроде достаточно разбираешься, чтобы с этим справиться. Объясню - ты вешаешь свой "патч", переопределяя функции(вроде), а именно GOHello_go_obj, в коде же чем-то она вызывается? Находишь это место и обрабатываешь, логично что это место находится в Gameobject.cpp, в классе ГО. Если тебе не известно в каком месте это обрабатывается, то можно идти по логической цепочки - ставишь вывод какой пакет приходит в ядро, в файле Worldsession.cpp и смотришь что приходит по нажатию на объект, а затем смотришь в каком месте этот пакет обрабатывается(общий алгоритм как искать в целом).

С таким же успехом можно и сделать по другому. Игрок подходит к объекту, нажимает на него, там твой urand и если ловушка, то кастуешь какой-то спел взрыва, типа подорвался или ещё что-то + спел откидывания, считай полез в сундук, попался в ловушку и подорвался и никакого открытия нет и закрывать ничего не нужно. Твоя проблема в том, что ты открываешь объект, а потом спрашиваешь - а как его закрыть? Повторяю - зачем тебе его открывать, если ты его хочешь сразу закрыть? Создать эффект взрыва и отталкивания? Так ты можешь это сделать без открытия объекта. Если происходит откидывания, т.е срабатывает твой urand, то делаешь нужные тебе действия и return; из метода и никакого открытия объекта не будет, собственно в чём у тебя и заключается проблема.
Сообщение # 12 написано 19.04.2017 в 21:06
p620
Маршал
Не приходило в голову создать два разных, внешне неотличимых сундука (один - с добычей, другой - с сюрпризом), и настроить их шанс появления при помощи этого, ограничившись таким образом работой в базе?.. Абсурдно же за таким в ядро лезть.
Сообщение # 13 отредактировано p620 - Четверг, 20.04.2017, 01:34
Stormtrooper
Командир
pool_gameobject это интересно и я думал над этим
но честно говоря я что-то туплю и не пойму как сделать так чтобы рандомно в одном и том же месте появлялся то один то другой сундук sad
да да вот такой я тормоз
я не понимаю как с этой базой работать а объяснение на английском меня ещё больше в ступор вгоняет

просто указываю в одном и том же пуле разные гуиды от разных объектов и они там сами разберутся по шансу?
но в таком случае какой из объектов ставить в мир изначально на нужную точку? фальшивый или настоящий? или оба сразу в одно место?
Если помог, ставь плюсик в репу :)

Сообщение # 14 отредактировано Stormtrooper - Четверг, 20.04.2017, 09:19
grasicco
Сержант
Омг, время спауна ящика ставишь 1. Ставишь диспаун при срабатывании спелла. Все.
Сообщение # 15 отредактировано grasicco - Четверг, 20.04.2017, 10:55
p620
Маршал
Цитата Stormtrooper ()
просто указываю в одном и том же пуле разные гуиды от разных объектов и они там сами разберутся по шансу?

Именно так. Две записи с двумя разными GUID'ами и общим Entry pool'а. Шансы - 25/75 соответственно. Можно поставить 25/0, тоже сработает скорее всего.
Цитата Stormtrooper ()
но в таком случае какой из объектов ставить в мир изначально на нужную точку? фальшивый или настоящий? или оба сразу в одно место?

В мире, разумеется, должны стоять оба, ибо GUID'ы - это ключи записей в таблице `gameobject`. Если там запись есть - объект есть в мире, если нет - у него и нет GUID'а. В игре полно примеров использования `pool_gameobject`. Например ноды собирательных профессий.
Сообщение # 16 отредактировано p620 - Четверг, 20.04.2017, 13:29
Форум » TrinityCore » [TrinityCore] Help » Закрытие окна лута (С++)
  • Страница 1 из 1
  • 1
Поиск: