Вроде починил.

var uspeh=false;
var room ='';
var randomValue;
var min = 360000;
var max = 400000;
 
function zadanie(enabled)
{
    if(enabled)
    {
        zadanieTimer = setInterval("zadanieHandler()",2000);
        proverkaTimer = setInterval("proverkaHandler()",1000);
    }
    else
    {
        clearInterval(zadanieTimer);
        clearInterval(proverkaTimer);
    }
}
 
function proverkaHandler()
{   
    clearInterval(proverkaTimer);
    randomValue = Math.floor(Math.random()*(max - min) + min);
    proverkaTimer = setInterval("proverkaHandler()", randomValue);
    var tempstr = '';
    var temp_inf = doLoad("http://" + external.SCity.Text + ".combats.com/main.pl?skills=1&rand=" + Math.random());
    if(external.SCity.Text == "suncity")
        tempstr = "Suncity - Рыцарь первого круга, 24999 / 24999";
    if(external.SCity.Text == "sandcity")
        tempstr = "Sandcity - Рыцарь первого круга, 10000 / 24999";
    if(external.SCity.Text == "angelscity")
        tempstr = "Angels city - Рыцарь первого круга, 10000 / 24999";
    if(external.SCity.Text == "demonscity")
        tempstr = "Demons city - Рыцарь первого круга, 24999 / 24999";
    if(external.SCity.Text == "mooncity")
        tempstr = "Mooncity - Рыцарь первого круга, 24999 / 24999";
    if(temp_inf.indexOf(tempstr) > -1 )
    {
        top.Chat.Self.AddMessage("Задания не требуется");
        uspeh = true;
        return;
    }
    if(!temp_inf.toLowerCase().match(external.SCity.Text + " - "))
    {
        top.Chat.Self.AddMessage("Требуется взять задание");
        uspeh = false;
    }
    else
    {
        top.Chat.Self.AddMessage("Задания не требуется");
        uspeh = true;
    }
 
}
 
function zadanieHandler()
{
    try
    {
        var temp_p = top.frames[external.mainFrameIndex].document.all[0].innerHTML;
        if(room = temp_p.match(/<nobr>([^<]+)<\/nobr>/))
            room = String(room[1])
        external.battleWeared = false;
        if(uspeh==false)
        {       
            if (room == "Центральная грибница" && top.frames[external.mainFrameIndex].is_accessible)
                Walk("Грибная лужайка");
            else if(room == "Грибная лужайка" && top.frames[external.mainFrameIndex].is_accessible)
                Walk("Странное Место");
            else if(room == "Странное Место" && top.frames[external.mainFrameIndex].is_accessible)
                Walk("Грибная поляна");
            else if(room == "Грибная поляна" && top.frames[external.mainFrameIndex].is_accessible)
                Walk("Грибница");
            else if(room == "Бойцовский Клуб" && top.frames[external.mainFrameIndex].is_accessible)
                Walk("Центральная грибница");
            else if(room == "Зал воинов" && top.frames[external.mainFrameIndex].is_accessible)
                Walk("Бойцовский Клуб");
            else if(room == "Зал воинов 2" && top.frames[external.mainFrameIndex].is_accessible)
                Walk("Бойцовский Клуб");
            else if(room == "Зал воинов 3" && top.frames[external.mainFrameIndex].is_accessible)
                Walk("Бойцовский Клуб");
            else if(top.frames[external.mainFrameIndex].document.getElementsByName("pass").length > 0 && uspeh == false)
            {
                if(!top.frames[external.mainFrameIndex].location.toString().match(/ql=/))
                {
                    var btn = get_mainframe().document.getElementsByTagName("INPUT");
                    for(i = 0;i<btn.length;i++)
                    {
                        if(btn[i].outerHTML.match(/Задания/) && btn[i].style.visibility!="hidden")
                        {
                            btn[i].click();
                            break;
                        }
                    }
                }
 
                top.Chat.Self.AddMessage("Проверяю условие");
                if(!get_mainframe().document.all[0].innerHTML.match(/Репутация в Suncity: 0/) && top.frames[external.mainFrameIndex].document.getElementsByName("getquest").length > 0)
                {                   
                    top.frames[external.mainFrameIndex].document.getElementsByName("getquest")[0].click();
                    uspeh=true;
                    top.Chat.Self.AddMessage("Работает взятие задания");
                }
                else uspeh = true;
                if(get_mainframe().document.all[0].innerHTML.match(/Вы получили новое задание/)) uspeh=true;
                if(uspeh == true)
                {
                    top.Chat.Self.AddMessage("Работает выход из комнаты");
                    btn = get_mainframe().document.getElementsByTagName("INPUT");
                    for(i = 0;i<btn.length;i++)
                    {
                        if(btn[i].outerHTML.match(/Вернуться/) && btn[i].style.visibility!="hidden")
                        {
                            btn[i].click();
                            break;
                        }
                    }
                }           
            }     
        }
        else
        {       
            if(room == "Грибница" && top.frames[external.mainFrameIndex].is_accessible)
            {
                var tmp = get_mainframe().document.getElementsByTagName("a");
                for(i = 0;i<tmp.length;i++)
                {
                    if(tmp[i].outerHTML.match(/Грибная поляна/) && tmp[i].style.visibility!="hidden" && tmp[i].onclick)
                    {
                        tmp[i].click();
                        break;
                    }
                }
            }
            else if(room == "Грибная поляна" && top.frames[external.mainFrameIndex].is_accessible)
                Walk("Странное Место");
            else if(room == "Странное Место" && top.frames[external.mainFrameIndex].is_accessible)
                Walk("Грибная лужайка");
            else if(room == "Грибная лужайка" && top.frames[external.mainFrameIndex].is_accessible)
                Walk("Центральная грибница");
            else if(room == "Центральная грибница" && top.frames[external.mainFrameIndex].is_accessible)
                Walk("Бойцовский Клуб");
            else if(room == "Бойцовский Клуб" && top.frames[external.mainFrameIndex].is_accessible)
                Walk("Зал воинов");
        }
    }
    catch(err)
    {
        top.Chat.Self.AddMessage("Ошибка! Ебем гусей!");
    }
}
 
function Walk(name)
{
    var imgs = get_mainframe().document.getElementsByTagName("IMG");
    for(i = 0;i<imgs.length;i++)
    {
        if(imgs[i].outerHTML.match(name) && imgs[i].style.visibility != "hidden" && imgs[i].onclick && (imgs[i].height*imgs[i].width)>60)
        {
            top.Chat.Self.AddMessage("Иду в " + name);
            imgs[i].click();
            break;
        }
    }
}
 
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;
}

Добавил проверку на кол-во репы. Не тестил.
Оказывается, на странице задания нету имени комнаты.

Может быть потому что эта фунция вызывается  zadanieHandler()-м, где уже прописан интервал в 5 сек?

Именно поэтому.

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

Я его и тестил. Он рабочий до тех пор, пока бот нормально обновляет 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("Работает выход из комнаты");
}

306

(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";

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

307

(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

314

(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 в дебагбаре? Я чегойто найти не могу, где так сделать)
А то приходится тестить всё через плагины бота и алертами проверять работу)

323

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

Плюсую.

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

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

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

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

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

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

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