хотя последний кусок кода, который я написал - рабочий.

Я его и тестил. Он рабочий до тех пор, пока бот нормально обновляет external.room_name

Нашел у тебя недочет:
ты ставишь обновление страницы скилов раз в 6 мин. только вот страница эта у тебя обновляется каждые 5сек из zadanieHandler().

Gorlum, надо менять логику на проверку текущий комнаты.
external.room_name не катит. Только что проверял, почему у тебя не сработал переход за заданием. У меня он не заработал тоже. А потому, что external.room_name выдал мне ЗВ1.
Посему, надо вернуться к методу, парсинга из сорцов страницы, а именно так, как это делал анахроник в своем плагине:

var room ='';
        var temp_p = top.frames[external.mainFrameIndex].document.all[0].innerHTML;
        if(room = temp_p.match(/<nobr>([^<]+)<\/nobr>/))
            room = String(room[1])

Затем, наклепал вот такой вот безопасный кусочек кода нажатия кнопки Задания.

var buttnos = get_mainframe().document.getElementsByTagName("INPUT");
for(i = 0;i<buttnos.length;i++)
{
    if(buttnos[i].outerHTML.match(/Задания/) && buttnos[i].style.visibility!="hidden")
        {
            buttnos[i].click();
            break;
        }
}

Это так, для наглядности. Ибо прямые адреса перехода по улицам палевны.

gorlum пишет:

Значит должно быть как-то так:

else if(external.room_name == "Грибница" && uspeh==false){
 
            top.frames[external.mainFrameIndex].location = "http://" + external.SCity.Text + ".combats.com/dungeon.pl?ql=" + Math.random();         
    if(!get_mainframe().document.all[0].innerHTML.match(/Задания отсюда недоступны/) && get_mainframe().document.all[0].innerHTML.match(/Репутация в Suncity/))
            {
            get_mainframe().document.getElementsByName("getquest")[0].click();
            top.Chat.Self.AddMessage("Работает взятие задания");
            }
    var temp_inf = doLoad("http://" + external.SCity.Text + ".combats.com/main.pl?skills=1&rand=" + Math.random());
    if(temp_inf.match(/Время до смены задания:/))
    uspeh=true;
    top.Chat.Self.AddMessage("Проверяю наличие задания");
    if(get_mainframe().document.all[0].innerHTML.match(/Для вас нет заданий в этом подземелье.../))
             //Для вас нет заданий в этом подземелье...Задания отсюда недоступны///// пока что поставил 1-й вариант, чтобы проверить работоспособность
            {
            top.frames[external.mainFrameIndex].location = "http://" + external.SCity.Text + ".combats.com/dungeon.pl?" + Math.random();
            top.Chat.Self.AddMessage("Работает выход из комнаты");
            }
 
       }

Добавил ещё одну проверку, именно после клацанья на получение. Правда протестить не могу, нету чаров с возможностью взятия задания в сане.

Тогда уж лучше так:

else if(external.room_name == "Грибница" && uspeh==false)
{
    top.frames[external.mainFrameIndex].location = "http://" + external.SCity.Text + ".combats.com/dungeon.pl?ql=" + Math.random();         
    if(get_mainframe().document.all[0].innerHTML.match(/Репутация в Suncity/) && !get_mainframe().document.all[0].innerHTML.match(/24999/))
    {
        get_mainframe().document.getElementsByName("getquest")[0].click();
        uspeh=true;
        top.Chat.Self.AddMessage("Работает взятие задания");
    }
    if(get_mainframe().document.all[0].innerHTML.match(/Вы получили новое задание/)) uspeh=true;
    top.frames[external.mainFrameIndex].location = "http://" + external.SCity.Text + ".combats.com/dungeon.pl?" + Math.random();
    top.Chat.Self.AddMessage("Работает выход из комнаты");
}

279

(20 ответов, оставленных в Настройки / Плагины)

descalui пишет:

да, и еще, если их осталось только 2 , только эти 2 особи(ну может и одна), как сделать так чтоб юзал только волю к победе?

if(EnemiesCount == 1 && (top.Battle.oBattle.sEnemyLogin.indexOf("Монстр 1") > -1 || top.Battle.oBattle.sEnemyLogin.indexOf("Монстр 2") > -1))
    _name = "hit_willpower";
else if (EnemiesCount == 2)
{
    var enemies = top.Battle.oBattle.oGroupsLayer.getElementsByTagName("IMG")[1].sList.split(", ");
    if(((enemies[0].indexOf("Монстр 1") > -1) || (enemies[0].indexOf("Монстр 2") > -1)) && ((enemies[1].indexOf("Монстр 1") > -1) || (enemies[1].indexOf("Монстр 2") > -1)))
        _name = "hit_willpower";
}
else if(top.Battle.oBattle.sEnemyLogin.indexOf("Монстр 1") > -1 || top.Battle.oBattle.sEnemyLogin.indexOf("Монстр 2") > -1)
        _name = "hit_empower";
    else
        _name = "hit_willpower";

Что-то типа такого

280

(20 ответов, оставленных в Настройки / Плагины)

descalui пишет:

определенная группа монстров, и среди них 2 моба по-сильнее остальних, как сделать так что при размене с этими 2-мя особями по-сильнее бот юзал усиленные удары, а при размене с остальными - волю к победе! ну или наоборот!

if(top.Battle.oBattle.sEnemyLogin.indexOf("Монстр 1") > -1 || top.Battle.oBattle.sEnemyLogin.indexOf("Монстр 2") > -1)
_name = "hit_empower";
else
_name = "hit_willpower";

Если в любом случае нужно 6 мечей, тогда так.

if(parseInt(top.Battle.oBattle.arrRes["spirit"].innerHTML) > 1 && (top.Battle.oBattle.oMySlot.nHP * 100 / top.Battle.oBattle.oMySlot.nMaxHP) < 33)
    _name = "hit_willpower";
    else if(parseInt(top.Battle.oBattle.arrRes["hit"].innerHTML) >= 6) _name = "hit_luck";
malrom пишет:

Кстати [0-9] надо заменить на "любая цифра", не знаю просто как это в яваскрипте делается.. но как горлум написал, там будет искать текст [0-9]..

А зачем, пардон, ебаться с цифрами? smile
Если в текущем городе будет задержка на задание, то достаточно будет взять

if(!get_mainframe().document.all[0].innerHTML.toLowerCase().match(external.SCity.Text + " - "))
uspeh = false;
gorlum пишет:

Вставил это

else if(external.room_name == "Грибница" && uspeh==false){
 
            top.frames[external.mainFrameIndex].location = "http://" + external.SCity.Text + ".combats.com/dungeon.pl?ql=" + Math.random();         
    if(!get_mainframe().document.all[0].innerHTML.match(/Задания отсюда недоступны/) && get_mainframe().document.all[0].innerHTML.match(/Репутация в Suncity/))
            {
            get_mainframe().document.getElementsByName("getquest")[0].click();
            top.Chat.Self.AddMessage("Работает взятие задания");
            }
    if(get_mainframe().document.all[0].innerHTML.match(/Для вас нет заданий в этом подземелье.../))
             //Для вас нет заданий в этом подземелье...Задания отсюда недоступны///// пока что поставил 1-й вариант, чтобы проверить работоспособность
            {
            top.frames[external.mainFrameIndex].location = "http://" + external.SCity.Text + ".combats.com/dungeon.pl?" + Math.random();
            uspeh=true;
            top.Chat.Self.AddMessage("Работает выход из комнаты");
            }
 
       }

но теперь в грибнице после взятия задания не меняет успех в тру, то есть не идёт обратно.

Так, хорошо. А где именно ты после взятия задания изменяешь значение переменной?
Я вижу только в месте, где стоит проверка  на то, что задания нельзя взять)
Кстати, я бы на твоем месте переделал проверку для "Для вас нет заданий в этом подземелье" след образом:
регуляркой выдирал бы значение Suncity: xxx репы.
И if(xxx == 24999) - выходим

malrom пишет:

Тогда уж лучше считывать не "Время до смены задания", а:
1) "<ТЕКУЩИЙ_ГОРОД> city - [0-9] ч. [0-9] мин."
2) "<ТЕКУЩИЙ_ГОРОД> city - [0-9] мин."
3) "<ТЕКУЩИЙ_ГОРОД> city - [0-9] сек."

Т.к. получается что если делаешь задания на несколько городов, то бот не будет брать задание!

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

если uspeh==false, то выполняется строка

Так. Во первых ты не написал проверку, есть ли уже задание в Умениях.
Во вторых, нужна еще проверка на выполнение задания. А то выполнив, задание всё еще будет висеть, и бот всё еще будет ломиться его выполнять.

gorlum пишет:

Да, и кста, что делает

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;
}

?

Я её не первый раз вижу в плагинах, но не могу понять для чего она.

Загружает указанный урл и возвращает исходник загруженной страницы

Потому что лепишь таймер в одну переменную + setTimeout - однократное выполнение. Для твоих целей нужен setInterval

var uspeh=false;
 
function zadanie(enabled)
{
    if(enabled)
    {
     zadanieTimer = setInterval("zadanieHandler()",5000);// тут ставил разный интервал что бы проверить, 5-10 секунд
     proverkaTimer = setInterval("proverkaHandler()",360000);
    }
    else
    {
     clearInterval(zadanieTimer);
     clearInterval(proverkaTimer);
    }
}

И зачем передавать в proverkaHandler() переменную, если она у тебя глобальная?

Да, и для функции проверки, м.б. лучше сделать так:

function proverkaHandler()
{
    var temp_inf = doLoad("http://" + external.SCity.Text + ".combats.com/main.pl?skills=1&rand=" + Math.random());
    if(!temp_inf.match(/Время до смены задания:/)) uspeh=false;
    top.Chat.Self.AddMessage("Проверяю наличие задания");
}
 
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;
}

Два вопроса:
1.что именно показывает переменная uspeh
2.что делает external.battleWeared

287

(48 ответов, оставленных в Общий)

Кровавое месиво пишет:

Ребят, лучник не использует приемы "Занять позицию от защиты", "Занять позицию от атаки". Проблема только у меня или есть ещё?

Покажи код твоих приемов.

gorlum пишет:
Exile пишет:
gorlum пишет:

Как-то так?

тут запуск этой функции каждые полчаса
            if(!get_mainframe().document.all[0].innerHTML.match(/Время до смены задания: /))
            uspeh=true;

Да, только вот в регулярке убери последний пробел после двоеточия. А то реагирует неправильно.

Кстати, вручную можно включить режим данжа?


Это как "вручную"?

Бот взял задание. Надо включить данж, чтобы он начал выполнять его. Программно это как-то можно сделать?

gorlum пишет:

Как-то так?

тут запуск этой функции каждые полчаса
            if(!get_mainframe().document.all[0].innerHTML.match(/Время до смены задания: /))
            uspeh=true;

Да, только вот в регулярке убери последний пробел после двоеточия. А то реагирует неправильно.

Кстати, вручную можно включить режим данжа?

gorlum пишет:
Exile пишет:
gorlum пишет:

Посмотрел через дебагбар закладку "Репутация", у неё есть id, которые равно L6, значит её можно нажать как-то так?

get_mainframe().document.getElementsById("L6")[0].click();

Зачем её нажимать?
Это лишь закладка цельной страницы, которая уже подгружена в documents.all[0]

То есть, можно сразу искать фразу "Время до смены задания: ", и по ней уже ориентироваться?

Конечно. Закладки - лишь для визуального удобства.

gorlum пишет:

Посмотрел через дебагбар закладку "Репутация", у неё есть id, которые равно L6, значит её можно нажать как-то так?

get_mainframe().document.getElementsById("L6")[0].click();

Зачем её нажимать?
Это лишь закладка цельной страницы, которая уже подгружена в documents.all[0]

if((top.Battle.oBattle.oMySlot.nHP * 100 / top.Battle.oBattle.oMySlot.nMaxHP) > 33)
_name = "hit_luck";
else if(parseInt(top.Battle.oBattle.arrRes["spirit"].innerHTML) > 1)
    _name = "hit_willpower";
    else if(parseInt(top.Battle.oBattle.arrRes["hit"].innerHTML) >= 6) _name = "hit_luck";

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

Хреново( Ладно, будем по старинке.
Кстати, есть какой способ вывода всего текста, скажем, из document.all[0].innerHTML?
Через алерт выводит, но там скроллбара нету(

if(external.room_name == "Грибница") 
{
    if(!top.frames[external.mainFrameIndex].location.toString().match(/dungeon.pl?ql=/))
    {
        top.frames[external.mainFrameIndex].location = "http://" + external.SCity.Text + ".combats.com/dungeon.pl?ql=" + Math.random();         
    }
    if(!get_mainframe().document.all[0].innerHTML.match(/Задания отсюда недоступны/) && get_mainframe().document.all[0].innerHTML.match(/Репутация в Suncity/))
        get_mainframe().document.getElementsByName("getquest")[0].click();
}

Вот так будет правильнее

if(!get_mainframe().document.all[0].innerHTML.match(/Задания отсюда недоступны/) && get_mainframe().document.all[0].innerHTML.match(/Репутация в Suncity/))
get_mainframe().document.getElementsByName("getquest")[0].click();

Проверил этот кусок кода на боте. Работает.

ZhEkA_BK, как ты тестишь js в дебагбаре? Я чегойто найти не могу, где так сделать)
А то приходится тестить всё через плагины бота и алертами проверять работу)

296

(17 ответов, оставленных в Флейм)

Плюсую.

Точно всё скопировал? или в коде забыл написать закрывающую скобку первого условия?

Но там нереальные бока с названиями комнат у меня были.

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

попробуешь там ссылку найти.

Ссылки нету. Зато есть имя кнопки == getquest
нажатие будет через

get_mainframe().document.getElementsByName("getquest")[0].click()

как-то так, я не проверял)

как сделать проверку на задание в умениях

Например так:
через

combats.com/main.pl?skills=1&r=...

в innerHTML ж будет содержаться вся инфа со страницы.
Так вот через регулярку выдрать значение по строке "Текущие задания ["вот это значение надо выдрать" /]"
И если выдранное значение == 0 - берем задание
иначе, какое-то задание уже есть, идем делать дальше.
Минус такого способа - в разделе заданий кроме задания из пещеры никаких квестов быть не должно

А каким образом плагин уменьшает нагрузку на комп?
Ведь на какой вкладке бы ни находился нижний фрейм, лог боя всё равно подгружается при обновлении верхнего.