gorlum пишет:

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

Если делать некрасиво, то external.Stop-Start smile

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

Не хватает инфы по одному пункту диалога для 100%-ой системки. А так, 100%-ая часть готова.
Добавил парсер оставшегося времени до молитвы.

Пофикшен баг при использовании фильтра. Обновлена шапка.

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

Что сделано:
Получение 100%ой системки у мусора при полностью открытом 2ом круге диалогов.
Что надо сделать:
Изменить диалоги 100%ой системки при не всех открытых диалогах.
Добавить алгоритм для не 100%ой системки.

Ребят, помогите, что здесь не так?

if, а не If

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

Задача: автоматическая покупка указанного количества товаров за зубы.
Установка: создать в папке Plugins файл BuyForTeeth.js и скопировать код, приведенных ниже, или скачать готовый файл в папку Plugins.
()
Работа плагина: в магазине включить плагин и обновить окно нажатием кнопки F5 или нажатием зеленой круглой кнопки в верхнем правом углу http://www.imageup.ru/img138/bezymyannyjj696651.jpg
Появится панель http://www.imageup.ru/img138/bezymyannyjj2696654.jpg.
Перейти в раздел, где находится нужный вам товар. Нажав кнопку Показать окно в открывшейся панели ввести название товара и количество.

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

Исправлена ошибка. Спасибо Mr Blanco.

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

Опиши работу плагина.

Да всё банально просто:
ищется название товара на текущей странице. Если найдено - запоминаем вес товара и его цену.
Затем начинает работать таймер раз в несколько секунд.
Если текущий свободный вес больше веса товара и кол-во имеющихся зубов больше стоимости товара - покупаем.
Иначе - будет соотв. ошибка и остановка плагина.

P.S. Если код будет одобрен на безопасность - сниму хайд.

Release candidate 1 smile

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

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

285

(18 ответов, оставленных в Торговля / Коммерческие дела)

gorlum пишет:

Так есть же по-моему плагин для молитв, или я что-то путаю?

Увы, нету.
Я написал только процесс юза иконы. Делать само общение не хватило времени, учеба настигла sad

Такс, парсер имеющихся кредов и стоимости за креды сделал. Надо тоже самое, только для зубов + нужна мессага при недостатке зубов.
Парсер текущей загруженности тоже готов, но опять же я не знаю как выглядит строка с ошибкой о перегрузе.

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

Долго пытался понять что делает questIsActive. Думал что баг какой-то) Только вот ещё понять как при questIsActive==true - запускать режим подземки. Анахроник, можно такое реализовать?

Это наработки по состоянию задания.
Когда берем задание - questIsActive==true. И пока оно - тру, ходим в пещеру. Как только сделали - фолс, и идем по своим делам.

Mr Blanco пишет:
Exile пишет:

Скиньте в личку код плагина, пожалуйста.
Из интереса глянуть хочется.

Скинул.

Данке

Скиньте в личку код плагина, пожалуйста.
Из интереса глянуть хочется.

С учетом замечаний:

SPOILER Show

var uspeh=false;
var questIsActive = 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);
    if(top.Battle.bInBattle) return;
    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 )
    {
        external.AddToChat("Задания не требуется");
        uspeh = true;
        questIsActive = false;
        return;
    }
    if(!temp_inf.toLowerCase().match(external.SCity.Text + " - "))
    {
        external.AddToChat("Требуется взять задание");
        uspeh = false;
    }
    else
    {
        external.AddToChat("Задания не требуется");
        uspeh = true;
        questIsActive = false;
    }
 
}
 
function zadanieHandler()
{
    try
    {
        if(top.Battle.bInBattle) return;
        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 || questIsActive)
        {       
            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(room == "Грибница" && uspeh == false)
            {
                var btn = top.frames[external.mainFrameIndex].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(top.frames[external.mainFrameIndex].document.getElementsByName("quest_name").length > 0 && uspeh == false)
            {
                if(top.frames[external.mainFrameIndex].document.getElementsByName("finishquest").length > 0)
                {
                    top.frames[external.mainFrameIndex].document.getElementsByName("finishquest")[0].click();
                    uspeh = false;
                    questIsActive = false;
                    external.AddToChat("Завершаем задание");
                }
                if(!top.frames[external.mainFrameIndex].document.all[0].innerHTML.match(/Репутация в Suncity: 0/))
                {
                    if(top.frames[external.mainFrameIndex].document.getElementsByName("getquest").length > 0)
                    {
                        top.frames[external.mainFrameIndex].document.getElementsByName("getquest")[0].click();
                        external.AddToChat("Работает взятие задания");
                    }
                    uspeh=true;
                    questIsActive = true;
                }
 
                if(top.frames[external.mainFrameIndex].document.all[0].innerHTML.match(/Вы получили новое задание/))
                {
                    uspeh=true;
                    questIsActive = true;
                }
                else if(top.frames[external.mainFrameIndex].document.all[0].innerHTML.match(/Для вас нет заданий/))
                    {
                        uspeh = true;
                        questIsActive = false;
                    }
 
                if(uspeh == true)
                {
                    external.AddToChat("Работает выход из комнаты");
                    btn = top.frames[external.mainFrameIndex].document.getElementsByTagName("INPUT");
                    for(i = 0;i<btn.length;i++)
                    {
                        if(btn[i].outerHTML.match(/Вернуться/) && btn[i].style.visibility!="hidden")
                        {
                            btn[i].click();
                            break;
                        }
                    }
                }           
            }     
        }
        if(!questIsActive && uspeh)
        {       
            if(room == "Грибница" && top.frames[external.mainFrameIndex].is_accessible)
            {
                var tmp = top.frames[external.mainFrameIndex].document.anchors;
                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)
    {
        external.AddToChat("Ошибка! Ебем гусей!");
    }
}
 
function Walk(name)
{
    var imgs = top.frames[external.mainFrameIndex].document.images;
    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)
        {
            external.AddToChat("Иду в " + 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;
}

В 9.1.3 эти два фэйлить не будут.
Да и остальные тоже не должны

А можно будет потом огласить список всех доступных external-ов?

anahronik пишет:

Не, ты не понял smile
Записи "get_mainframe()" и "top.frames[external.mainFrameIndex]" эквивалентны (правда в случае экстернала там руками определяется название главного фрэйма один раз при старте, а get_mainframe() - это функция используемая в БК).
Под "одновременно" я имел ввиду "в одном плагине разные записи одного и того же" smile

Эктерналы использовать можно, нужно и вобще полезно. Исключение - то, что должно изменяться оперативно.

Ну тут есть нормально работающие и херовоработающие.
Так, например, inBattle и room_name могут фэйлить, проверено лично (
По поводу get_mainframe и top.frames[external.mainFrameIndex]:
я копипастил некоторые строки из наработок по плагину молитв, вот и получалась каша.
А в целях экономии ресурсов конечно лучше использовать последнее.

var imgs = get_mainframe().document.images;
и
var tmp = get_mainframe().document.links;

Мое кунг-фу еще очень слабое smile

gorlum пишет:

После последнего изменения перестал брать задание(

Наверное, не ту последнюю версию смотришь. Последняя рабочая - на предыдущей странице под спойлером.

ZhEkA_BK пишет:

Чтобы плагин в бою не грузил бота.

if (external.inBattle)return;

Я б потестил, но ща в БК лень даже бота запускать smile

Забудьте про external.inBattle smile
100%-но рабочее решение -  if(top.Battle.bInBattle) return;

295

(13 ответов, оставленных в Торговля / Коммерческие дела)

Плять, научись ты на даты последних постов смотреть. Хватит поднимать мертвые темы.

SPOILER Show

var uspeh=false;
var questIsActive = 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);
    if(top.Battle.bInBattle) return;
    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;
        questIsActive = false;
        return;
    }
    if(!temp_inf.toLowerCase().match(external.SCity.Text + " - "))
    {
        top.Chat.Self.AddMessage("Требуется взять задание");
        uspeh = false;
    }
    else
    {
        top.Chat.Self.AddMessage("Задания не требуется");
        uspeh = true;
        questIsActive = false;
    }
 
}
 
function zadanieHandler()
{
    try
    {
        if(top.Battle.bInBattle) return;
        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 || questIsActive)
        {       
            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(room == "Грибница" && uspeh == false)
            {
                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;
                    }
                }               
            }
            else if(top.frames[external.mainFrameIndex].document.getElementsByName("quest_name").length > 0 && uspeh == false)
            {
                if(top.frames[external.mainFrameIndex].document.getElementsByName("finishquest").length > 0)
                {
                    top.frames[external.mainFrameIndex].document.getElementsByName("finishquest")[0].click();
                    uspeh = false;
                    questIsActive = false;
                    top.Chat.Self.AddMessage("Завершаем задание");
                }
                if(!get_mainframe().document.all[0].innerHTML.match(/Репутация в Suncity: 0/))
                {
                    if(top.frames[external.mainFrameIndex].document.getElementsByName("getquest").length > 0)
                    {
                        top.frames[external.mainFrameIndex].document.getElementsByName("getquest")[0].click();
                        top.Chat.Self.AddMessage("Работает взятие задания");
                    }
                    uspeh=true;
                    questIsActive = true;
                }
 
                if(get_mainframe().document.all[0].innerHTML.match(/Вы получили новое задание/))
                {
                    uspeh=true;
                    questIsActive = true;
                }
                else if(get_mainframe().document.all[0].innerHTML.match(/Для вас нет заданий/))
                    {
                        uspeh = true;
                        questIsActive = false;
                    }
 
                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;
                        }
                    }
                }           
            }     
        }
        if(!questIsActive && uspeh)
        {       
            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;
}


Небольшие наработки по взятию\завершению задания.

Почему не проверять по каким-то регуляркам в самом начале плагина?

Раньше был какой-то флаг среди external-ов, показывающий режим бота. Я об этом.

Или так

if(top.frames[external.mainFrameIndex].document.getElementsByName("finishquest").length > 0)
                {
                    top.frames[external.mainFrameIndex].document.getElementsByName("finishquest")[0].click();
                    top.Chat.Self.AddMessage("Работает завершение задания");
                }

?

Я вот так сделал, но и вариант с match пригоден.

hyppo пишет:

Запустил плагин прямо посреди подземки, в бою smile Сразу стресс — колбасит перса, не может "понять" что с ним lol
Пришлось отключить.

Надпись "Требуется взять задание" во фрейм чата выдал.

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

Я вот это не понял.

Ненене, именно так, как написано.
Суть записи в том, что идет одновременно и присваивание и проверка на null. Если в match совпадений нету, то в room ничего не попадет, значит в результат условия выдаст false.

Кто будет делать какой квест в пещере - гляньте в дебагбаре инфу о кнопке Завершить задание.
Нужно её имя, если оно есть.

hyppo пишет:
gorlum пишет:

Надо что бы кто-то потестил, есть желающие?

С рыцаркой Сана подойдёт?
Дайте инструкции, что куда вставить — сделаю, посмотрю.

Если 24999\24999 - то в идеале ничего не должно произойти.
Если меньше, то должен потопать за заданием

Не знаю как решить ситуацию правильно, но пока-что так:
если задержки на задание нету, но задание висит - бот протопает до пещеры, увидит, что задание взять низя и поставит флаг uspeh = true;