1

Тема: Морковка от Exile

anahronik, сдаюсь. Был бы чар, годный для пещер, то может быть и нашел ошибку, посмотрев бы работу кода в действии. А так идей нету.
Малость уменьшил код, добавил юз маны (надеюсь, правильно) и изменил принцип проверки на текущую закладку инвентаря.

var temp_inf = "";
function Morkovka(enabled)
{
    if(enabled)
    {
        PluginsOnLoad["Morkovka"] = "MorkovkaHandler";
    }
    else
    {
        PluginsOnLoad["Morkovka"] = "";
    }
}
 
function MorkovkaHandler(url)
{
    try
    {
        if(top.Battle.bInBattle) return;
 
        var hpRemain = parseInt(maxHP - tkHP);
        var manaRemain = 0;
        var morkovkaName = [];
 
        if(window.tkMana)
        {
            manaRemain = parseInt(maxMana - tkMana);
 
            if(manaRemain > 2000)
            {
                morkovkaName[morkovkaName.length] = new Array ("Бутылек маны",3);                 //Раздел инвентаря, где лежит элексир. 3- раздел "Элексиры", 4 - "Прочее"
            }
 
            if(manaRemain > 1500)
            {
                morkovkaName[morkovkaName.length] = new Array ("Флакончик маны",3);                   //Раздел инвентаря, где лежит элексир. 3- раздел "Элексиры", 4 - "Прочее"
            }
        }       
 
        if(external.room_name=='Грибница' && top.frames[external.mainFrameIndex].document.all[0].innerHTML.match(/(?:Слабость к (?:Воде|Огню|Воздуху))|(?:Дрожь в коленях)/i))
        {
            morkovkaName[morkovkaName.length] = new Array ("Печень Гусеница",3);
        }
 
        if(hpRemain > 300)
        {
            morkovkaName[morkovkaName.length] = new Array ("Заживляющий Эликсир",3);                  //Раздел инвентаря, где лежит элексир. 3- раздел "Элексиры", 4 - "Прочее"
        }
 
        if(hpRemain > 200)
        {
            morkovkaName[morkovkaName.length] = new Array ("Сосуд жизненных сил",4);                  //Раздел инвентаря, где лежит элексир. 2- раздел "Элексиры", 3 - "Прочее"
        }       
 
        if(hpRemain > 150)
        {
            morkovkaName[morkovkaName.length] = new Array ("Заживляющая Настойка",3);               //Раздел инвентаря, где лежит элексир. 3- раздел "Элексиры", 4 - "Прочее"
        }
 
        for(x = 0; x < morkovkaName.length; x++)
        {
            if(Morkovka2Handler(morkovkaName[x][0],morkovkaName[x][1])) break;
        }
    }
    catch(err)
    {
        alert("We've got some error!");
    }
}
 
function Morkovka2Handler(elikName,razdel)
{
    try
    {
        var str = "edit="+razdel;
        if(top.frames[external.mainFrameIndex].location.toString().match(str) == false)
        {
            temp_inf = doLoad("http://" + external.SCity.Text + ".combats.com/main.pl?edit="+razdel+"&rnd=" + Math.random());
        }
 
        var m = elikName + "(\\s\\(x\\d+\\))?','main.pl',\\s'(.+?)',\\s'.*?',\\s(\\d+)";
        var found = temp_inf.match(m);
 
        if(found != null)
        {
            external.AddToChat("Выпиваю эликсир <b>\\\"" + elikName + "\\\"</b>");
            top.frames[external.mainFrameIndex].location = "http://" + external.SCity.Text + ".combats.com/main.pl?use=" + found[2] + "&n=" + found[3];
            temp_inf = top.frames[external.mainFrameIndex].document.all[0].innerHTML;
            return true;
        }
        return false;
    }
    catch(err)
    {
        alert("We've got some error!");
    }
}
 
function doLoad(url)
{
    if (window.XMLHttpRequest)
        req = new XMLHttpRequest();
    else
        req = new ActiveXObject("Microsoft.XMLHTTP");
 
       req.open("GET", url, false); // задать параметры методу open
       req.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"); //чтоб не кэшировались GET запросы
       req.send(null); // отправить запрос     
    return req.responseText;
}

Отредактировано Exile (2011-06-20 22:27:02)

Оставь надежду всяк сюда входящий ©

2

Re: Морковка от Exile

Собственно Exile правильно указал строку external.inBattle и даже то, на что её надо заменить.
Точнее строку указал uniken1, а Exile на что заменить smile
Экстернал банально не успевал изменить значение, т.к. он привязан к действию бота по времени.

Данную строку заменил в первом посте и теперь там самый рабочий вариант.


Exile, по поводу твоей версии плагина:
+ Сократил код с 3-х строк до одной при добавлении в массив элексиров на выпивание

morkovkaName[morkovkaName.length] = new Array ("Флакончик маны",3);

Безусловно это красивее выглядит, но я оставил 3 строки, чтобы сохранить комментарий о том, что в этой строке именно название эликсира, а в этой имено номер раздела.

- Ситуация: у тебя разница в 500 ХП. У тебя по условию добавляется в массив, допустим, на 500ХП, на 200ХП, на 150ХП абстрактные морковки. И он выпъет их всех, т.е. на 850ХП.
Причина: нету стопора после первого выпитого (раньше стопором работала переменная healed, сейчас я сделал по-другому).

- Если вдруг пропустил слабость/дрожь и они уже висят - он не снимит их.

- Нарушение в логике работы с temp_inf в Morkovka2Handler. Ты обнуляешь temp_inf всегда, но вставляешь новое значение только если не в инвентаре... что-то тут явно не то

+- Алерт(ерр.дескриптион) лучше убирать smile

+- относительно моей версии: у меня меньше запросов на поиск морковок, если подряд забивались в массив морковки из одного раздела инвентаря, т.к. сохраняется полученная о разделе информация. Если они вразнобой - то от моего алгоритма толка мало smile

Software is like sex: it's better when it's free! © LinusTorvalds

3

Re: Морковка от Exile

- Ситуация: у тебя разница в 500 ХП. У тебя по условию добавляется в массив, допустим, на 500ХП, на 200ХП, на 150ХП абстрактные морковки. И он выпъет их всех, т.е. на 850ХП.
Причина: нету стопора после первого выпитого (раньше стопором работала переменная healed, сейчас я сделал по-другому).

Да, ошибку понял.
Лечится вот так:

for(x = 0; x < morkovkaName.length; x++)
        {
            Morkovka2Handler(morkovkaName[x][0],morkovkaName[x][1]);
            break;
        }

Нарушение в логике работы с temp_inf в Morkovka2Handler. Ты обнуляешь temp_inf всегда, но вставляешь новое значение только если не в инвентаре... что-то тут явно не то

И тут ты прав.

Если вдруг пропустил слабость/дрожь и они уже висят - он не снимит их.

Вот тут не понял)

Вроде поправил.
Только остается вопрос: а что будет если произойдет ситуация, когда всего остался один глоток?
У тебя ведь нету обновления temp_info при глотке.

Отредактировано Exile (2011-06-20 20:12:01)

Оставь надежду всяк сюда входящий ©

4

Re: Морковка от Exile

Лечится вот так:

не, так оно не лечится. Он может выпить, а может не найти элексир, а брейку пофигу будет smile

Вот тут не понял)

Ты проверяешь только момент получения дрожи/ослабления.

top.frames[external.mainFrameIndex].document.all[0].innerHTML.match(/(?:Слабость к (?:Воде|Огню|Воздуху))|(?:Дрожь в коленях)/i)

Хоть я и не уверен в том, что он может пропустить данный фрэйм, но всёже как-то опасно smile
В том плане, что неплохо бы ещё контролировать в информации о персонаже наличия данных вредных эффектов.

У тебя ведь нету обновления temp_info при глотке.

Какрас у меня обновление temp_info только при выпивании чего-либо, или если надо проверить другой раздел, относительно прошлого элексира.

Software is like sex: it's better when it's free! © LinusTorvalds

5

Re: Морковка от Exile

Он может выпить, а может не найти элексир, а брейку пофигу будет

Ахтыжепт, точно(

Ты проверяешь только момент получения дрожи/ослабления.

Не совсем.
Если по какой-то причине ослабление не отхелится в момент получения, то отхелится при первом же юзе морковки, т.к. в html инвентаря тоже засветится

(?:Слабость к (?:Воде|Огню|Воздуху))|(?:Дрожь в коленях)...
Оставь надежду всяк сюда входящий ©

6

Re: Морковка от Exile

Да, ты прав smile
Что-то я замкнулся в том, как написал сам - вот и не додумал твою реализацию.

Ситуация: Массив с двумя эликсирами из 3-го раздела. Первый не найден - твой плагин снова загружает страницу 3 раздела вместо того, чтобы использовать temp_inf с содержанием прошлого запроса. Либо это дополнять, либо temp_inf сделать не глобальной переменной, если она каждый раз вычисляется и используется в одной функции smile

Ситуация 2: Тот же массив, но точно нужно выпить оба эликсира будет. Выпивается первый, фрэйм обновляется
и бот снова себе загружает через doLoad эту же страницу 3-го раздела, вместо использования открытой. Причина: при выпивании эликсира location содержит не razdel=, а main.pl?use=" + found[2] + "&n=" + found[3].

Сомнительным выглядит местоположение строки

temp_inf = top.frames[external.mainFrameIndex].document.all[0].innerHTML;

И это сразу после перехода по ссылке. Я бы сделал это примерно на том же уровне, где doLoad написан.

Software is like sex: it's better when it's free! © LinusTorvalds