Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Принятые (http://mangos.ytdb.ru/forumdisplay.php?f=57)
-   -   [QUEST=5097,5098]Сторожевые башни (http://mangos.ytdb.ru/showthread.php?t=289)

virusav 14.03.2010 10:32

[QUEST=5097,5098]Сторожевые башни
 
Вложений: 1
Скрипт на указанные квесты, которые на моей памяти никогда не работали.:)

В репозитарий приняли мой патч, но измененный другим человеком.
На текущий момент квесты не работают, т.к. патч поправили на неправильный вариант.

Для базы после СД2 1815:
Код:

UPDATE `gameobject_template` SET `scriptname`='' WHERE `entry`=176093;
UPDATE `gameobject_template` SET `scriptname`='go_andorhal_tower' WHERE `entry` IN (176094,176095,176096,176097);

Дополнительные запросы будут включены в обновление YTDB 563:
http://ytdb.ru/showthread.php?p=26236

virusav 14.03.2010 12:14

Тема на форуме СД2:
http://www.scriptdev2.com/project.php?issueid=892

Решил создать на всякий случай, т.к. это долгая контора.:)

Gerald 16.03.2010 13:16

Собрал mangoszero с этим патчем.
Всплыли ошибки в игре:
Код:

2010-03-16 11:58:52 ERROR:Spell (ID: 17016) has effect EffectImplicitTargetA/EffectImplicitTargetB = TARGET_SCRIPT or TARGET_SCRIPT_COORDINATES, but does not have record in `spell_script_target`
Глянул в табличку spell_script_target, было проставлено для спела 17016 таргет ГО 300030(TEMP Andorhal Tower).
Проставил в таблице нужных НПС:
Код:

DELETE FROM `spell_script_target` WHERE `entry`=17016;
INSERT INTO `spell_script_target` SET `entry`=17016, `type`=1, `targetentry`=10902;
INSERT INTO `spell_script_target` SET `entry`=17016, `type`=1, `targetentry`=10903;
INSERT INTO `spell_script_target` SET `entry`=17016, `type`=1, `targetentry`=10904;
INSERT INTO `spell_script_target` SET `entry`=17016, `type`=1, `targetentry`=10905;

Ошибки в логе ушли, но квест по прежнему не засчитывается.
Подскажите куда копать дальше?

P.S. Только что глянул сам спелhttp://www.wowhead.com/?spell=17016, видать что-то не правильно, так как:
Effect 0: (50) Summon Object (176093)
Effect 1: (86) Activate Object (5)

virusav 16.03.2010 20:57

Как уже написал в конференции, есть такие варианты:
1. В `spell_script_target` прописать цель го.
2. В `spell_script_target` поставить целью 4 нпц, в условиях квеста проставить каст на 4 нпц, убрать скрипт из ядра.
3. В `spell_script_target`прописать го, в условиях квеста проставить каст на го, убрать скрипт из ядра.

Возможно, в МангосЗеро прокатят варианты 2 или 3, но в кеше стоит условие убийства 4 нпц.

PSZ 16.03.2010 22:52

Я думаю, все-таки есть еще какой-то спелл. Когда нажимаешь на факел, он создает и активирует гейм-объект, при активации гейм-объекта скриптом из базы должен кастоваться этот какой-то спелл, и условием выполнения квеста должен выступать каст этого спелла на требуемых кричеров. Но тут опять же - каст ГО...

P.S. В кеше не хранится ReqSpellCast.

virusav 17.03.2010 09:31

Спеллов с киллкредитами по 4-м нпц не нашел.
Точка должна засчитываться при установке факела, а не при нажатии на факел, если не ошибаюсь.

PSZ 17.03.2010 10:01

Цитата:

Сообщение от virusav (Сообщение 2380)
Точка должна засчитываться при установке факела, а не при нажатии на факел, если не ошибаюсь.

Вот, вот! Нажимаешь на факел, вызывается ГО. Этот ГО через 5 секунд активируется, при активации запускается скрипт, который кастует какой-то спелл.

Цитата:

Сообщение от virusav (Сообщение 2380)
Спеллов с киллкредитами по 4-м нпц не нашел.

Килл-кредит не нужен. В базе поставить какой-то ReqSpellCast нужно.

Ну, это рассуждения теоретические, как оно должно быть оффлайк. У нас такого не сделаешь, т.к. не заставишь кастовать ГО.

timmit 17.03.2010 11:38

Одно но, в мангосе до сих пор не работает activate, так что приходится выкручиваться :)

PSZ 17.03.2010 14:07

Цитата:

Сообщение от timmit (Сообщение 2395)
Одно но, в мангосе до сих пор не работает activate, так что приходится выкручиваться :)

Да ну? o_O

tempura 17.03.2010 17:29

Цитата:

Сообщение от PSZ (Сообщение 2406)
Да ну? o_O

Некоструктивно. Можно чуть более развернутый ответ?

virusav 17.03.2010 19:48

Видео у кого-нибудь есть для данного квеста + кеш?

PSZ 17.03.2010 20:57

Цитата:

Сообщение от tempura (Сообщение 2456)
Некоструктивно. Можно чуть более развернутый ответ?

Это клиентом реализуется.
Пример:
Спелл 46201. Там SPELL_EFFECT_ACTIVATE_OBJECT.
.go object 47123
.cast 46201
Смотрим, что получится.
(GUID объекта - из вашей базы. Нужная запись в spell_script_target в вашей базе есть.)

Цитата:

Сообщение от virusav (Сообщение 2486)
Видео у кого-нибудь есть для данного квеста + кеш?

Видео и кеш тут не поможет... Нужен снифф.

YuruY 17.03.2010 21:37

Цитата:

GUID объекта - из базы. Нужная запись в spell_script_target
ID объекта имеется ввиду?

PSZ 17.03.2010 21:58

Нет, именно GUID из таблицы creature.

YuruY 18.03.2010 08:59

Цитата:

Нужен снифф.
virusav
С Константином не говорил?
Или может есть еще желающие - сбегать по квесту со сниффером?

virusav 18.03.2010 09:00

Не говорил, со снифферами не работал.

YuruY 18.03.2010 09:03


virusav 18.03.2010 09:43

Как появится достоверная инфа, так можно будет уже править скрипт.

virusav 27.04.2010 21:57

Решил переделать скрипт через активацию го, как указано в спелле:
Код:

bool GOHello_go_andorhal_tower(Player* pPlayer, GameObject* pGo)
{
    if (pPlayer->GetQuestStatus(QUEST_ALL_ALONG_THE_WATCHTOWERS_ALLIANCE) == QUEST_STATUS_INCOMPLETE || pPlayer->GetQuestStatus(QUEST_ALL_ALONG_THE_WATCHTOWERS_HORDE) == QUEST_STATUS_INCOMPLETE)
    {

В этот блок попадаю только при нахождении практически на го, хотя в базе `data1`=10.
Если отойти подальше - не работает, хотя каст срабатывает на большом расстоянии.

1. Как заставить го активироваться в радиусе, указанном в базе?
2. Есть 4 кода нпц, проверка на них идет одинаково: если один из нужных кодов нпц, то засчитать киллкредит(код нпц). Как лучше и покомпактнее сделать проверку (массив и т.д.)?

virusav 27.04.2010 23:22

Вот, что получилось:
Код:

bool GOHello_go_andorhal_tower(Player* pPlayer, GameObject* pGo)
{
    if (pPlayer->GetQuestStatus(QUEST_ALL_ALONG_THE_WATCHTOWERS_ALLIANCE) == QUEST_STATUS_INCOMPLETE || pPlayer->GetQuestStatus(QUEST_ALL_ALONG_THE_WATCHTOWERS_HORDE) == QUEST_STATUS_INCOMPLETE)
    {
        std::list<Unit*> targets;
        MaNGOS::AnyUnitInObjectRangeCheck u_check(pPlayer, 1.0f);
        MaNGOS::UnitListSearcher<MaNGOS::AnyUnitInObjectRangeCheck> searcher(pPlayer, targets, u_check);
        Cell::VisitAllObjects(pPlayer, searcher, 1.0f);
        uint32 aEntry[] = {NPC_ANDORHAL_TOWER_ONE, NPC_ANDORHAL_TOWER_TWO, NPC_ANDORHAL_TOWER_THREE, NPC_ANDORHAL_TOWER_FOUR};
        int i;
        for(std::list<Unit *>::iterator tIter = targets.begin(); tIter != targets.end(); tIter++)
        {
            for(i = 0; i < 4; i++)
            {
                if((*tIter)->GetEntry() == aEntry[i])
                {
                    pPlayer->KilledMonsterCredit((*tIter)->GetEntry(), 0);
                }
            }
        }
    }
    return false;
}

Радиус поставил 1 метр, поэтому в текущем варианте не сработает.
Если поставить радиус 25, то проблем не будет, но кастовать надо в проходе.

Самый простой вариант - переставить го в точки к нпц, тогда должно работать без проблем.

1. Почему не отрабатывает активация го на расстоянии, а только в упор?
2. Как и где в ядре править ошибки при выходе игрока из игры:

Код:

ERROR:Delete Gameobject (Entry: 176093 Guid: 200005) with SpellId 17016 LinkedGO 0 that lost references to owner Player (Guid: 3176) GO list. Crash possible later.
3. Как еще можно оптимизировать скрипт?

GoldMan 29.04.2010 07:47

Я бы мог побегать по этому квесту и поснифать его
только скиньте снифер и расскажите как запустить )))

tempura 29.04.2010 08:10

Цитата:

Сообщение от GoldMan (Сообщение 5267)
Я бы мог побегать по этому квесту и поснифать его
только скиньте снифер и расскажите как запустить )))

Ты бы мог почитать форум, найти снифер, и научиться его запускать. Если ты этого не можешь - то смысла в твоем беганьи немного.

MaS0n 29.04.2010 10:24

Как я понимаю по коду работу эффекта 86 - Activate Object.
Работа фактически аналогична команде 13 в БД скриптах ГО
Пошагово как идет
Берем наш спелл - 17016
Код:

Effect: (086) SPELL_EFFECT_ACTIVATE_OBJECT
Base point = 0
Target A (TARGET_40), Target B (No target)
EffectMiscValue = 5

Код:

    if(!gameObjTarget)
        return;

    static ScriptInfo activateCommand = generateActivateCommand();

    int32 delay_secs = m_spellInfo->CalculateSimpleValue(eff_idx);

    gameObjTarget->GetMap()->ScriptCommandStart(activateCommand, delay_secs, m_caster, gameObjTarget);

activateCommand = 13 всегда
delay_secs = 0, с нашего спелла(Base point = 0)

передаем дальше в ScriptCommandStart

2. там вычисляются гуиды таргета и кастера, добавляется в лист скриптов, и если задержка(delay_secs) равна 0, то передается дальше в ScriptsProcess();

3. Эта функция ищет нужный скрипт, и в зависимости от команды(она у нас всегда 13), делает проверки на кастера и таргет, на их типы - юнит или ГО, там много
Если все проверки пройдены, активируется функция ГО на кастера go->Use(caster);

4. а это уже интересней, именно в этой функции ГО кастует на кастера некий спелл(спеллы)
НО если есть скрипт GOHello - то return;
Код:

    // by default spell caster is user
    Unit* spellCaster = user;
    uint32 spellId = 0;
    bool triggered = false;

    if (user->GetTypeId() == TYPEID_PLAYER && Script->GOHello((Player*)user, this))
        return;

    switch(GetGoType())

Но так как ГО не может кастовать спеллы, это делает сам кастер
Код:

    Spell *spell = new Spell(spellCaster, spellInfo, triggered,GetGUID());

    // spell target is user of GO
    SpellCastTargets targets;
    targets.setUnitTarget( user );

    spell->prepare(&targets);

user - он же caster в п.3

ГО факел - принадлежит к 5 типу, обработки которого нет в Use(), мб стоит добавить? И в этой функции можно не только кастовать спеллы, но и другие действия выполнять(см. весь код функции)
Код:

        default:
            sLog.outError("GameObject::Use unhandled GameObject type %u (entry %u).", GetGoType(), GetEntry());
            break;

Этим пока оканчивается попытка работать с 5 типом ГО

ПС : кстати, EffectMiscValue не используется в эффекте 86, но между тем, оно явно важно, т.к во всех спеллах оно разное, понять бы что это

Ответы на вопросы(по моему мнению)
1. GOHello активируется только вблизи обьекта(0 - 2 метра радиус)
2. Ошибка возникает здесь
Код:

        ObjectGuid owner_guid = GetOwnerGUID();
        if (!owner_guid.IsEmpty())
        {
            if (Unit* owner = ObjectAccessor::GetUnit(*this,owner_guid))
                owner->RemoveGameObject(this,false);
            else
            {
                sLog.outError("Delete %s with SpellId %u LinkedGO %u that lost references to owner %s GO list. Crash possible later.",
                    GetObjectGuid().GetString().c_str(), m_spellId, GetGOInfo()->GetLinkedGameObjectEntry(), owner_guid.GetString().c_str());
            }
        }

Преположу, что гуид owner'a не пустой, но сервер по гуиду не может сослатся на обьект Unit, по каким причинам - пока не знаю

3. Оптимизировать тут врятли что-то можно, только мб написать отдельный универсальный поисковичок, с подачей любого листа ентри или гуидов(он сам их переберет - найдет нужный и вернет обьект)

virusav 23.08.2010 20:49

Патч принят в СД2 1797 с изменениями.

virusav 02.09.2010 19:31

Патч с пояснениями обновлен в первом посте.

virusav 16.09.2010 22:05

Наконец-то патч полностью принят в СД2 в рабочем состоянии в 1819.:)


Текущее время: 04:39. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS