|
|
Модератор форума: Dimitro |
Форум TrinityCore [TrinityCore] Help Проблема в квесте Intercepting The Mana Cells (ядро Oregon) |
Проблема в квесте Intercepting The Mana Cells (ядро Oregon) |
Всем привет
Требуется помощь Выяснилась проблема с квестом Intercepting The Mana Cells (ядро Oregon) GO Smuggled Mana Cells (187039) видны постоянно всем игрокам а должны быть видны только тому игроку который имеет на себе ауру Bash'ir Phasing Device 44856 Подозреваю что проблема в GameObject.cpp - раньше там был bool isVisibleForInState а сейчас его нет как теперь исправлять данную проблему не представляю Помогите плиз
Если помог, ставь плюсик в репу :)
Сообщение # 1 написано 02.08.2016 в 16:56
|
Чё правда всего-то почитать историю коммитов?
Во-первых коммитов гигантское количество и поиском я уже искал когда могли удалить данный кусок кода - ноль результатов Во-вторых ну увижу я что этот кусок стёрли - дальше что? Я и так знаю что его стёрли В-третьих hube у тебя в зеркале
Если помог, ставь плюсик в репу :)
Сообщение # 3 написано 04.08.2016 в 19:18
|
Реву ядра скажи.
Добавлено (04.08.2016, 23:03)
Сообщение # 4 написано 04.08.2016 в 23:03
|
Повторяю для тех кто реально считает себя самым умным - Я ИСКАЛ В КОММИТАХ
Найти тот в котором удалили этот кусок не удалось и даже если бы нашёл это бы ничего не дало p.s слово ХАБ по англ пишется без Е на конце - отсюда и непонимание
Если помог, ставь плюсик в репу :)
|
Я конечно понимаю - ты хочешь помочь - но честное слово ты читаешь мои ответы?
Я 4 года копаюсь с серверами WOW BC и 2 года из них с Орегоном Я знаю как отслеживать коммиты но в данной ситуации нахождение коммита в котором удалили этот кусок кода ничего не даст Мне нужно не пытаться вернуть то что было - мне нужно понять что делать в ТЕКУЩЕМ состоянии ядра чтобы исправить проблему Откатывать коммиты не вариант так как явно удалён этот кусок был давно и явно вместе с ним улетело в помойку ещё много чего - возвращать всё это слишком трудозатратно а выигрыш будет копеечным
Если помог, ставь плюсик в репу :)
Сообщение # 7 написано 05.08.2016 в 09:09
|
Попытался посмотреть как это работает, насколько понял - объект удаляется для игрока и он его не видит(если он не должен его видеть), если же должен, то объект добавляется куда-то.
Это нужно разбираться, тестить, писать кучу кода и долго тестить, по крайней мере для меня так) https://github.com/mangosR2/mangos/blob/98ce5099a7b28cffed1f08423db36a9fa6972143/src/game/Player.cpp#L21157 Ну а вообще думаю нужно смотреть как оно работало ранее и делать что-то такое же. Ещё как вариант попробовать фазы, только не сильно понимаю как они работают и как написать так, чтобы смена фазы для игрока не помешала ему в остальном игровом мире..
Сообщение # 8 написано 05.08.2016 в 10:34
|
К сожалению в 2.4.3 не было фазирования как такового
Изначально всё было прописано в bool isVisibleForInState Там была строка что если игрок обладает особым инвиз статусом (который давался квестовым предметом) то он может видеть объекты прописанные в этом bool Сейчас так не выйдет :( В коде ниже обратите внимание на строки под // Smuggled Mana Cell required 10 invisibility type detection/state Код bool GameObject::isVisibleForInState(Player const* u, bool inVisibleList) const { // Not in world if (!IsInWorld() || !u->IsInWorld()) return false; // Transport always visible at this step implementation if (IsTransport() && IsInMap(u)) return true; // quick check visibility false cases for non-GM-mode if (!u->isGameMaster()) { // despawned and then not visible for non-GM in GM-mode if (!isSpawned()) return false; // special invisibility cases if (GetGOInfo()->type == GAMEOBJECT_TYPE_TRAP && GetGOInfo()->trap.stealthed) { Unit *owner = GetOwner(); if (owner && u->IsHostileTo(owner) && !canDetectTrap(u, GetDistance(u))) return false; } // Smuggled Mana Cell required 10 invisibility type detection/state if (GetEntry() == 187039 && ((u->m_detectInvisibilityMask | u->m_invisibilityMask) & (1<<10)) == 0) return false; }
Если помог, ставь плюсик в репу :)
|
Ну тут два поля класса соединяются оператором или в одно значение, а проверяется существование в новом значении только одного 11 бита (если считать с единицы), не совсем понимаю зачем объединять, но думаю в них хранятся такие значения, в которых этот бит важен, если бы знал еще какие значения принимают эти поля)
Ну а по сути не важно что выполняет этот метод.. я так думаю. Важнее то, что показал я, а именно то, что будет если он вернет истину или ложь. Нужно пробовать ревлизовывать этот метод и действия, которые после него выполняются.. это геморой вникать в это, тем более ради чего-то одного, может стоить подумать о каких-то костылях, хаках.. но они могут быть также не очень подходящими и приносить какие-то проблемы игрокам в игровом мире (
Сообщение # 10 написано 05.08.2016 в 23:40
|
Можно поступить следующим образом - объекты же для чего-то нужны? Нажать на объект, подойти к объекту, любые действия и игрок что-то получает, засчитывает кв, получает предмет, что угодно, не суть. Так вот давать ему это только в том случае если у игрока есть необходимая аура. К примеру добавить 2 меню:1) аура есть - выводить получить что-то, 2) нет ауры - на тебе нет ауры. Если же объект ищет рядом игроков - тоже выводить раз в какое-то время сообщение или же выводить один раз его, если же есть аура давать что-то, ну в общем мысль думаю понятно. Да, объект не пропадает и не появляется, это сделать не просто, а добавлять и убирать те же меню в госсипе проблем не составляет.. вот такой вот костыль, зато кв работать будет
Сообщение # 12 написано 10.08.2016 в 12:24
|
Квест и так работает - дело не в квесте как таковом
Дело в том чтобы заставить объект быть невидимым для всех кроме игрока имеющего соответствующую ауру в ядре есть такой вот bool делающий объекты невидимыми, однако я не знаю как прикрутить указатель на игрока с аурой: Код bool GameObject::IsNeverVisible() const { if (WorldObject::IsNeverVisible()) return true; if (GetGoType() == GAMEOBJECT_TYPE_SPELL_FOCUS && GetGOInfo()->spellFocus.serverOnly == 1) return true; return false; } if (GetEntry() == 187039) return true; - делает нужны объект невидимым но как прикрутить сюда проверку игрока с аурой?
Если помог, ставь плюсик в репу :)
|
Объект в самом игровом мире он один для всех игроков, если ты его и сделаешь невидимым, то его все не увидят. А делать для некоторых - это тоже самое, что и делать фазы или восстанавливать то, что было в ядре ранее(что ты говорил убралось).
Если же ты поставишь объект в подземелье, то при каждой инициализации подземелья будет создаваться новый объект и видеть его будут в каждом подземелье по-разному. К примеру, сделать максимальное кол-во в каком-либо подземелье - 1 человек. Написать скрипт Код Map* map = go->GetMap(); Map::PlayerList const &PlayerList = map->GetPlayers(); if (!PlayerList.isEmpty()) { for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) { if (((i->getSource()))->IsInRange((go),0,200)) { if(i->getSource()->HaseAura(ID)) go->IsNeverVisible(); else видим; } } } или же Код Player *targ = go>FindNearestPlayer(80.0f, true); if(i->getSource()->HaseAura(ID)) go->IsNeverVisible(); else видим; В одном подземелье объект может быть виден игроку, а во втором нет. У каждого игрока свой объект и своя видимость, что не скажешь о глобальном мире(не подземелье), там один объект для всех. Функции, конечно, сам будешь свои подбирать, это с 3.3.5, но не суть, не факт, что поможет, но как вариант.. или же делать то(isVisibleForInState)+действия при возвращении true и false, или фазы..
Сообщение # 14 написано 10.08.2016 в 14:19
|
Это ни разу не поможет по 2 причинам
1) в TBC не было ещё скриптов для GO связанных с чем-то кроме GossipHELLO 2) Объект как раз в мире а не в подземелье и его не должен видеть никто кроме игроков с аурой по квесту - отсюда и вопрос как в приведёттый выше bool добавить ссылку на игрока Добавлено (10.08.2016, 17:55)
Если помог, ставь плюсик в репу :)
Сообщение # 15 написано 10.08.2016 в 17:55
|
Сообщение # 16 написано 13.08.2016 в 17:26
|
| |||
| |||