26

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

anahronik пишет:

Не знаю, где косяк.
Вот что-то вроде отладочной версии, чтоб понять, где стопорится всё smile

function PutKanalZayavka()
    {
        if(liderstvo==false && groupkanal==true){
         alert("Вы собираетесь искать существующую заявку с лидером"+provodnik);
                    xlength=top.frames[3].document.forms.length;
          alert("Если в этом окошке выведен этот текст и число, близкое к числу заявок на странице - это хорошо. Число заявок: "+xlength);
                    for(i=0;i<xlength;i++)
                    {
                        var z = top.frames[3].document.forms[ i ].innerHTML;
              alert("Происходит проверка заявки номер: "+i+".");
                        if(z.indexOf("fl(\""+provodnik+"\"")>0){
              alert("Заявка найденна. Пытаюсь ввести пароль");
                        top.frames[3].document.forms[ i ].pass.value=grouppass;
              alert("Ввел пароль - пытаюсь подтвердить заявку");
                        top.frames[3].document.forms[ i ].submit();
                        }
                    }
                   
                }else if(groupkanal==false || liderstvo==true){
            top.frames[3].document.all.mut_noblock.checked = false;
            top.frames[3].document.forms[top.frames[3].document.forms.length-1].pass.value = grouppass;
            top.frames[3].document.all.open.click();}
    }

Соответственно alert выводит ошибку с заданным текстом и единственной кнокой. Какие сообщения будут выведены, значит до них все пракрасно работает.(т.е. несколько ошибок подряд будут выводиться).
Это можно прописать только для ведомого, т.к. ведущего никак не затрагивает.

Я конечно же поэксперементирую. Но есть еще одна загвоздка, когда я химичил с предыдущим вариантом кода, я прописывал 3х человек (всего в команде), ведущий создал заявку и ждал, я вручную приконнектил двух других, но ведущий все равно не начинал поход( Страницу ведущего обновлял, все трое были в заявке=(

Ушел.

27

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

сегодня купил 8-ую версию.
в крайнем случае в воскресенье рабочий вариант будет(если он мне по силам, конечно) smile

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

28

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

Начал тестировать в 8-й версии.
1) Заменил функцию  PutKanalZayavka на
function PutKanalZayavka()
    {
        if(liderstvo==false && groupkanal==true){
         alert("Вы собираетесь искать существующую заявку с лидером"+provodnik);
                    xlength=top.frames[3].document.forms.length;
          alert("Если в этом окошке выведен этот текст и число, близкое к числу заявок на странице - это хорошо. Число заявок: "+xlength);
                    for(i=0;i<xlength;i++)
                    {
                        var z = top.frames[3].document.forms[ i ].innerHTML;
              alert("Происходит проверка заявки номер: "+i+".");
                        if(z.indexOf("fl(\""+provodnik+"\"")>0){
              alert("Заявка найденна. Пытаюсь ввести пароль");
                        top.frames[3].document.forms[ i ].pass.value=grouppass;
              alert("Ввел пароль - пытаюсь подтвердить заявку");
                        top.frames[3].document.forms[ i ].submit();
                        }
                    }
                   
                }else if(groupkanal==false || liderstvo==true){
            top.frames[3].document.all.mut_noblock.checked = false;
            top.frames[3].document.forms[top.frames[3].document.forms.length-1].pass.value = grouppass;
            top.frames[3].document.all.open.click();}
    }
и приписал вверху параметры
var groupkanal = true;            //Если идёте один - false
 
    if(groupkanal==true){
    ////////////////////        Групповой поход           ////////////////////
    //Если вы идете один, просто выставьте groupkanal = false и параметры ниже можно
    //не изменять.
    var liderstvo = false;                //true - вы лидер группы. false - не вы лидер.           
    var provodnik = "ИмяПроводника";            //Кто является проводником/лидером. Это обязательно надо указать и для самого проводника, и для прицепа.
    var grouppass = "321456";            //Пароль группы
    var partija = "2";                //Количество людей в партии, включая вас.
    }

Даже группу создавать не стал проводником.
Результат: выводились все ошибки, которые есть.
Вывод: скрипт работал в полном объеме без косяков.

2) Запустил проводника и создал им заявку. У ведомого закоментил alert'ы, чтоб не мешались и перезапустил его клиент.
Результат: за 2 секунды ведомый нашел заявку, вбил пасс и подтвердил её.
Вывод: ведомый цепляет заявку без проблем.
Даже и не знаю, что могло застопорить у тебя прием заявки...в голову лезет только неверный ник проводника hmm

Покачто протестирую часть от проводника.

3)Протестировал.
var groupkanal = true;            //Если идёте один - false
  alert("Группа запущенна");
    if(groupkanal==true){
    ////////////////////        Групповой поход           ////////////////////
    //Если вы идете один, просто выставьте groupkanal = false и параметры ниже можно
    //не изменять.
    var liderstvo = true;                //true - вы лидер группы. false - не вы лидер.           
    var provodnik = "ИмяПроводника";            //Кто является проводником/лидером. Это обязательно надо указать и для самого проводника, и для прицепа.
    var grouppass = "321456";            //Пароль группы
    var partija = "2";                //Количество людей в партии, включая вас.
    }

function StartKanalZayavka()
{
     if(liderstvo==true){
                xlength=top.frames[3].document.forms.length;
                for(i=0;i<xlength;i++)
                {
                    var z = top.frames[3].document.forms[ i ].innerHTML;
                    if(z.indexOf("fl(\""+provodnik+"\"")>0){
                        var count=0;
                        var pos = z.indexOf("drwfl");
                        while (pos != -1){
                                count++;
                                pos = z.indexOf("drwfl",pos+1);
                                }
                    }
                }
                if(count==partija){
      usedObjects = [];
      dungeonMovementCount = [];
      dungeonCoords = "";
        dungeonDirection = 0;
                var date = new Date();
             dungeonStartTime = parseInt(String(date.getTime()).substring(0,10));
      alert("Ща запущусь");                   
    //top.frames[3].document.all.start.click();
                        }
            }
        if(groupkanal==false){
        usedObjects = [];
          dungeonMovementCount = [];
         dungeonCoords = "";
        dungeonDirection = 0;
                var date = new Date();
             dungeonStartTime = parseInt(String(date.getTime()).substring(0,10));
      alert("Не включен групповой режим");
                //top.frames[3].document.all.start.click();
        }   
}
Проверка проходила так: Запустил ведомого на поиск заявки. Запустил проводника. Проводник создал заявку и встал со статусом "Начинаю поход"(или как там оно). Ведомый прицепился сразу, а вот проводник долго ждал, пока окно обновится(мне ждать надоело и я сам кнопку Обновить нажал).
Результат: всплыла выставленная мной ошибка "Ща запущусь", которая говорила о том, что скрипт доработал стабильно до момента запуска заявки(запуск был преднамеренно закомментирован, дабы он не начал сам поход и не пришлось ждать кучу времени для повтора эксперимента). Закомментированный запуск заявки был частью базового скрипта, такчто в его правильной работе я не сомниваюсь.

Вывод в целом: Скрипт работает корректно. Для 2-х точно корректно.

P.S.
В 8-й версии не удобно оказалось то, что скрипт Данжа сразу интегрируется в клиент и при внесении изменений в файл Dungeon.js необходимо полюбому этот клиент перезапустить. В 7-й было проще - галочку снял, внес изменения, вернул галочку и всё работает по-новому smile


P.P.S.
Чем раньше кто-нибудь проверит работоспособность и отпишется тут - тем раньше я начну развивать это до того уровня, чтоб можно было ходить не просто прицеп-проводник, но и полноценной партией.

Отредактировано anahronik (2009-08-14 22:18:19)

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

29

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

anahronik, блин, почему же ты не выложил свой файл Dungeon.js, я бы сейчас сравнил и выявил свои косяки) Как будешь на форуме, выложи, пожалуйста, куда нить файлик.

Ушел.

30

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

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


UPD: Разрази меня гром, из-за одной заглавной буквы, не принимало заявку=))

Отредактировано МунГ (2009-08-14 23:48:18)

Ушел.

31

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

МунГ пишет:

UPD: Разрази меня гром, из-за одной заглавной буквы, не принимало заявку=))

Вот поэтому я стараюсь ничего не набирать вручную. Copy/paste надёжнее wink

(Please log in or register to see this URL)

32

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

hyppopotam пишет:
МунГ пишет:

UPD: Разрази меня гром, из-за одной заглавной буквы, не принимало заявку=))

Вот поэтому я стараюсь ничего не набирать вручную. Copy/paste надёжнее wink

Но ник то свой, я вряд ли отсюда скопировал бы))))) big_smile


UPD: Блин, все здорово, все всё принимают и подают. Но теперь проводник не стартует поход после присоединения всех троих(((

Отредактировано МунГ (2009-08-15 00:29:16)

Ушел.

33

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

Хм.
Клиент перезапускал после внесения изменений о колличестве персонажей в партии?

Запусти и отпишиь, что на ошибке будет написано(А лучше отредактируй свое прошлое сообщение и вставь туда свою функцию function StartKanalZayavka()....персонального в ней нет ничего, такчто тупо копи-паст сюда)
function StartKanalZayavka()
{
     if(liderstvo==true){
                xlength=top.frames[3].document.forms.length;
                for(i=0;i<xlength;i++)
                {
                    var z = top.frames[3].document.forms[ i ].innerHTML;
                    if(z.indexOf("fl(\""+provodnik+"\"")>0){
                        var count=0;
                        var pos = z.indexOf("drwfl");
                        while (pos != -1){
                                count++;
                                pos = z.indexOf("drwfl",pos+1);
                                }
                    }
                }
alert("В партии сейчас "+count+" .А должно быть: "+partija);
                if(count==partija){
      usedObjects = [];
      dungeonMovementCount = [];
      dungeonCoords = "";
        dungeonDirection = 0;
                var date = new Date();
             dungeonStartTime = parseInt(String(date.getTime()).substring(0,10));
      alert("Ща запущусь");                   
    //top.frames[3].document.all.start.click();
                        }
            }
        if(groupkanal==false){
        usedObjects = [];
          dungeonMovementCount = [];
         dungeonCoords = "";
        dungeonDirection = 0;
                var date = new Date();
             dungeonStartTime = parseInt(String(date.getTime()).substring(0,10));
      alert("Не включен групповой режим");
                //top.frames[3].document.all.start.click();
        }   
}

Отредактировано anahronik (2009-08-15 00:44:14)

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

34

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

anahronik пишет:

Хм.
Клиент перезапускал после внесения изменений о колличестве персонажей в партии?

После редактирования, всех троих перезапустил.

function StartKanalZayavka()
{
     if(liderstvo==true){
                xlength=top.frames[3].document.forms.length;
                for(i=0;i<xlength;i++)
                {
                    var z = top.frames[3].document.forms[ i ].innerHTML;
                    if(z.indexOf("fl(\""+provodnik+"\"")>0){
                        var count=0;
                        var pos = z.indexOf("drwfl");
                        while (pos != -1){
                                count++;
                                pos = z.indexOf("drwfl",pos+1);
                                }
                    }
                }
                if(count==partija){
                        top.frames[4].location = top.frames[4].location;
       
                        top.frames[3].document.all.start.click();
                        }
            }
        if(groupkanal==false){
        usedObjects = [];
          dungeonMovementCount = [];
         dungeonCoords = "";
        dungeonDirection = 0;
                var date = new Date();
             dungeonStartTime = parseInt(String(date.getTime()).substring(0,10));
      alert("Не включен групповой режим");
                top.frames[3].document.all.start.click();
        }   
}

Отредактировано МунГ (2009-08-15 00:48:49)

Ушел.

35

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

Всё.
С МунГ'ом разобрались.
Всё работает.
Конечный файл Dungeon.js выглядит вот так для версии 8.1.

var s = "";
var dungName = "";
var dungeonCoords = "";
var dungeonDirection = 0;
var dungeonPosition = "";
var dungeonLastPosition = "";
var breakAction = false;
var _id = "";
var _object = null;
var groupkanal = false;            //Если идёте один - false
    if(groupkanal==true){
    ////////////////////        Групповой поход           ////////////////////
    //Если вы идете один, просто выставьте groupkanal = false и параметры ниже можно
    //не изменять.
    var liderstvo = true;                //true - вы лидер группы. false - не вы лидер.           
    var provodnik = "";            //Кто является проводником/лидером. Это обязательно надо указать и для самого проводника, и для прицепа.
    var grouppass = "321456";            //Пароль группы
    var partija = "2";                //Количество людей в партии, включая вас.
    }
 
function DungeonMain()
{
    s = top.frames[3].document.all[0].innerHTML;
 
    if(IsMapVisible())
    {
        dungName = top.frames[3].location.href.match(/combats.com\/(.+?)\?/)[1];
 
        var date = new Date();
        var currentTime = parseInt(String(date.getTime()).substring(0,10));
        if((external.SDungeonExitTime.Text != "0") && ((currentTime - dungeonStartTime)/60 >= parseInt(external.SDungeonExitTime.Text)))
        {
            top.frames[3].location = top.frames[3].document.links[0].href;
            return;
        }
 
        external.SetStatusLabel("Поздемелье");
 
        dungeonCoords = s.match(/arrMap = (\[\[.+?\]\])/)[1];
        dungeonDirection = top.frames[3].nMyDirection;
        dungeonPosition = external.MD5Hash(dungeonCoords + "," + dungeonDirection);
        if(dungeonMovementCount[dungeonPosition] == undefined)
            dungeonMovementCount[dungeonPosition] = 0;
 
        if(dungeonPosition != dungeonLastPosition)
        {
            if(dungeonMovementCount[dungeonLastPosition] != undefined)
                dungeonMovementCount[dungeonLastPosition]++;
            else
                dungeonMovementCount[dungeonLastPosition] = 1;
 
            dungeonLastPosition = dungeonPosition;
        }
 
        if(external.SDungeonPickUpObjects.Checked)
        {
            var drop = s.match(/\?get=(\d+)/g);
            if(drop != null)
            {
                if(s.indexOf("слишком много") > 0 || s.indexOf("У вас уже есть один такой предмет") > 0)
                    usedObjects[_id] = true;
 
                for(i = 0; i < drop.length; i++)
                {
                    _id = drop[i].match(/\d+/);
                    if(!usedObjects[_id])
                    {
                        top.frames[3].location = "http://" + external.SCity.Text + ".combats.com/" + dungName + drop[i];
                        return;
                    }
                }
            }
        }
 
        if(s.indexOf("'rollconfirm")>0)
        {
            var drop = s.match(/'rollconfirm\(.+?,.+?,\"\d+\"\)/g);
            if(drop != null)
            {
                if(s.indexOf("слишком много") > 0 || s.indexOf("У вас уже есть один такой предмет") > 0 || (s.indexOf("Вы уже сделали свой бросок") > 0 && !external.SDungeonPickUpObjects.Checked))
                    usedObjects[_id] = true;
 
                for(i = 0; i < drop.length; i++)
                {
                    _id = drop[i].match(/\"(\d+)\"/)[1];
                    if(!usedObjects[_id])
                    {
                        top.frames[3].location = "http://" + external.SCity.Text + ".combats.com/" + dungName + "?get=" + _id + (external.SDungeonPickUpObjects.Checked ? "&tmpname423=Да": "&pass=Нет");
                        return;
                    }
                }
            }
        }
 
        breakAction = false;
 
        eval(external.DungeonGetCodeForLocation(dungeonPosition));
    }
    else
    {
        if(s.indexOf("Создать группу") > 0)
        {
            external.SetStatusLabel("Создаю заявку");
            PutKanalZayavka();
        }
        else if(s.indexOf("Начать") > 0)
        {
            external.SetStatusLabel("Начинаю поход");
               StartKanalZayavka();
           }
           else
           {
               external.SetStatusLabel("Не видно карты, не в подземелье, или еще не истекла задержка");
               top.frames[3].location = "http://" + external.SCity.Text + ".combats.com/dungeon.pl";
        }
    }
}
 
function randomString()
{
    var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
    var string_length = 8;
    var randomstring = '';
    for (var i=0; i<string_length; i++)
    {
        var rnum = Math.floor(Math.random() * chars.length);
        randomstring += chars.substring(rnum,rnum+1);
    }
    return randomstring;
}
 
function PutKanalZayavka()
    {
        if(liderstvo==false && groupkanal==true){
         //alert("Вы собираетесь искать существующую заявку с лидером"+provodnik);
                    xlength=top.frames[3].document.forms.length;
          //alert("Если в этом окошке выведен этот текст и число, близкое к числу заявок на странице - это хорошо. Число заявок: "+xlength);
                    for(i=0;i<xlength;i++)
                    {
                        var z = top.frames[3].document.forms[ i ].innerHTML;
              //alert("Происходит проверка заявки номер: "+i+".");
                        if(z.indexOf("fl(\""+provodnik+"\"")>0){
             //alert("Заявка найденна. Пытаюсь ввести пароль");
                        top.frames[3].document.forms[ i ].pass.value=grouppass;
              //alert("Ввел пароль - пытаюсь подтвердить заявку");
                        top.frames[3].document.forms[ i ].submit();
                        }
                    }
 
                }else if(groupkanal==false || liderstvo==true){
            top.frames[3].document.all.mut_noblock.checked = false;
            top.frames[3].document.forms[top.frames[3].document.forms.length-1].pass.value = grouppass;
            top.frames[3].document.all.open.click();}
    }
 
 
 
function StartKanalZayavka()
{
     if(liderstvo==true){
                xlength=top.frames[3].document.forms.length;
                for(i=0;i<xlength;i++)
                {
                    var z = top.frames[3].document.forms[ i ].innerHTML;
                    if(z.indexOf("fl(\""+provodnik+"\"")>0){
                        var count=0;
                        var pos = z.indexOf("drwfl");
                        while (pos != -1){
                                count++;
                                pos = z.indexOf("drwfl",pos+1);
                                }
                    }
                }
                if(count==partija){
       usedObjects = [];
       dungeonMovementCount = [];
      dungeonCoords = "";
        dungeonDirection = 0;
                var date = new Date();
             dungeonStartTime = parseInt(String(date.getTime()).substring(0,10));
     // alert("Ща запущусь");                   
    top.frames[3].document.all.start.click();
                        }else{top.frames[3].window.location.reload();}
            }
        if(groupkanal==false){
        usedObjects = [];
          dungeonMovementCount = [];
         dungeonCoords = "";
        dungeonDirection = 0;
                var date = new Date();
             dungeonStartTime = parseInt(String(date.getTime()).substring(0,10));
      //alert("Не включен групповой режим");
                top.frames[3].document.all.start.click();
        }   
}
 
function IsMapVisible()
{
    if(s.match(/arrMap =/) != null)
        return true;
    else
        return false;
}
 
function IsWallPresent()
{
    var elements = top.frames[3].document.getElementsByTagName("*");   
    for(var i = 0;i < elements.length;i++)       
         if(elements[i].className == "LeftFront0_0")         
            return true;   
    return false;
}
 
function UseObjects()
{
    if(!IsWallPresent())
    {
        try
        {
            if(top.frames[3].arrLayers[1][0]["l"].arrObjects[0])
            {
                if(s.indexOf("получили")>0 || s.indexOf("У вас уже есть один такой предмет")>0 || s.indexOf("Попахивает")>0 || s.indexOf("Ничего не произошло")>0 || s.indexOf("нет необходимых ингредиентов")>0)
                    usedObjects["\"" + _object.id + "\""] = true;
 
                for(var i=0; i<top.frames[3].arrLayers[1][0]["l"].arrObjects.length; i++)
                {
                    _object = top.frames[3].arrLayers[1][0]["l"].arrObjects[i];
                    if(!usedObjects["\"" + _object.id + "\""])
                    {
                        external.SetStatusLabel("Копаюсь в хламе...");
                        top.frames[3].location = "http://" + external.SCity.Text + ".combats.com/" + dungName + "?useobj=" + _object.id;
                        breakAction = true;
                        return;
                    }
                }
            }
        }
        catch(err)
        {
 
        }
    }
}
 
function AttackMobs()
{
    if(!IsWallPresent())
    {
        try
        {
            if(top.frames[3].arrLayers[1][0]["l"].arrUnits[0])
            {
                if(top.frames[3].arrLayers[1][0]["l"].arrUnits[0].action != "")
                {
                    if(tkHP >= maxHP)
                    {
                        external.SetStatusLabel("Нападаю на мобов");
                        if(external.SDungeonAttackMobs.Checked)
                            top.frames[3].location = "http://" + external.SCity.Text +".combats.com/" + dungName + "?attack=1&use=" + top.frames[3].arrLayers[1][0]["l"].arrUnits[0].id;
                    }
                    breakAction = true;
                    return;
                }
            }
        }
        catch(err)
        {
 
        }
    }
}
 
function Exit()
{
    if(breakAction)
        return;
 
    top.frames[3].location = top.frames[3].document.links[0].href;
}
 
function Walk(step)
{
    if(breakAction)
        return;
 
    if(step == "rl" || step == "rr")
        top.frames[3].location = "http://" + external.SCity.Text + ".combats.com/" + dungName + "?rnd=" + Math.random() + "&path=" + step;
    else
    {
        if(top.frames[3].is_accessible)
            top.frames[3].location = "http://" + external.SCity.Text + ".combats.com/" + dungName + "?rnd=" + Math.random() + "&path=" + step;
    }
}

Не забываем вписать имя проводника(тут всё регистрочувствительное. Т.е. "Проводник" и "проводниК" - это два разных персонажа), включить/выключить параметр groupkanal....короче в комментах всё написано.

Отредактировано anahronik (2009-08-15 02:02:28)

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

36

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

Я просто счастлив) Сейчас пойду спатки, завтра отсчитаюсь о пройденых прохождениях) tongue

Ушел.

37

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

Жаль что с одного компа, с одной папки это не запустишь smile Настройки разных персов получаются в одном файле...

(Please log in or register to see this URL)

38

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

hyppopotam пишет:

Жаль что с одного компа, с одной папки это не запустишь smile Настройки разных персов получаются в одном файле...

А что мешает скопировать бота в разные папки, ну как у меня допостим их 3, и спокойненько копать сутками. Вот сейчас мои мультики осуществляют уже третий поход, а я только проснулся=)

Ушел.

39

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

Хм. Нет придела совершенству!!! smile
Для Гиппо персонально частично непроверенный вариант:)

if(groupkanal==true){
    ////////////////////        Групповой поход           ////////////////////
    //Если вы идете один, просто выставьте groupkanal = false и параметры ниже можно
    //не изменять.
    var provodnik = "";            //Кто является проводником/лидером.
   if(provodnik==mylogin){var liderstvo = true;}else{var liderstvo = false;}
    var grouppass = "321456";            //Пароль группы
    var partija = "2";                //Количество людей в партии, включая вас.
    }

Отредактировано anahronik (2009-08-15 11:48:36)

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

40

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

anahronik
Ай спасибо! smile Надеюсь это сработает, но я это не скоро смогу проверить wink

(Please log in or register to see this URL)

41

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

Если не сработает это - сделаю по-другому.
Сейчас думаю над такой интересной вещью, чтобы была возможность создавать отдельно для каждого персонажа файл настроек. И этот файл сам подгружался в Dungeon.js при запуске клиента с данным персонажем...
Должно получиться красиво в общем smile
вот только далеко не факт, что получится hmm

-------------------------------------------------------------------------------

Долго-долго искал, как эту идею реализовать smile
Таки нашел способ...а не было бы на компе 7-й версии установленной - так и не нашёл бы smile
Спасибо автору бота за файл Readme.txt в папке plugins в 7-й версии smile

Короче, что я имею на данный момент(Это не проверенная версия...ну т.е. для одного, конечно проверено всё....все параметры из дополнительного файла подгружаются...но двоих с одной копии бота я не пробовал запустить. По идее должно работать smile буду благодарен тому, кто проверит smile ):

var s = "";
var dungName = "";
var dungeonCoords = "";
var dungeonDirection = 0;
var dungeonPosition = "";
var dungeonLastPosition = "";
var breakAction = false;
var _id = "";
var _object = null;
 
var texting=external.LoadFile("Modules\\DungeonUsers\\"+mylogin+".txt"); //Обязательно полный путь(пробовал относительный - не работало)
eval(texting);  // эта функция выполняет строку texting как JavaScript.
 
//alert(texting);
// рекомендую в первый раз раскомментировать этот алерт. При запуске клиента и входе в игру выскочит ошибка с содержанием вышеподключаемого файла...т.е. можно проверить, правильно ли прописан путь
 
function DungeonMain()
{
    s = top.frames[3].document.all[0].innerHTML;
 
    if(IsMapVisible())
    {
        dungName = top.frames[3].location.href.match(/combats.com\/(.+?)\?/)[1];
 
        var date = new Date();
        var currentTime = parseInt(String(date.getTime()).substring(0,10));
        if((external.SDungeonExitTime.Text != "0") && ((currentTime - dungeonStartTime)/60 >= parseInt(external.SDungeonExitTime.Text)))
        {
            top.frames[3].location = top.frames[3].document.links[0].href;
            return;
        }
 
        external.SetStatusLabel("Поздемелье");
 
        dungeonCoords = s.match(/arrMap = (\[\[.+?\]\])/)[1];
        dungeonDirection = top.frames[3].nMyDirection;
        dungeonPosition = external.MD5Hash(dungeonCoords + "," + dungeonDirection);
        if(dungeonMovementCount[dungeonPosition] == undefined)
            dungeonMovementCount[dungeonPosition] = 0;
 
        if(dungeonPosition != dungeonLastPosition)
        {
            if(dungeonMovementCount[dungeonLastPosition] != undefined)
                dungeonMovementCount[dungeonLastPosition]++;
            else
                dungeonMovementCount[dungeonLastPosition] = 1;
 
            dungeonLastPosition = dungeonPosition;
        }
 
        if(external.SDungeonPickUpObjects.Checked)
        {
            var drop = s.match(/\?get=(\d+)/g);
            if(drop != null)
            {
                if(s.indexOf("слишком много") > 0 || s.indexOf("У вас уже есть один такой предмет") > 0)
                    usedObjects[_id] = true;
 
                for(i = 0; i < drop.length; i++)
                {
                    _id = drop[i].match(/\d+/);
                    if(!usedObjects[_id])
                    {
                        top.frames[3].location = "http://" + external.SCity.Text + ".combats.com/" + dungName + drop[i];
                        return;
                    }
                }
            }
        }
 
        if(s.indexOf("'rollconfirm")>0)
        {
            var drop = s.match(/'rollconfirm\(.+?,.+?,\"\d+\"\)/g);
            if(drop != null)
            {
                if(s.indexOf("слишком много") > 0 || s.indexOf("У вас уже есть один такой предмет") > 0 || (s.indexOf("Вы уже сделали свой бросок") > 0 && !external.SDungeonPickUpObjects.Checked))
                    usedObjects[_id] = true;
 
                for(i = 0; i < drop.length; i++)
                {
                    _id = drop[i].match(/\"(\d+)\"/)[1];
                    if(!usedObjects[_id])
                    {
                        top.frames[3].location = "http://" + external.SCity.Text + ".combats.com/" + dungName + "?get=" + _id + (external.SDungeonPickUpObjects.Checked ? "&tmpname423=Да": "&pass=Нет");
                        return;
                    }
                }
            }
        }
 
        breakAction = false;
 
        eval(external.DungeonGetCodeForLocation(dungeonPosition));
    }
    else
    {
        if(s.indexOf("Создать группу") > 0)
        {
            external.SetStatusLabel("Создаю заявку");
            PutKanalZayavka();
        }
        else if(s.indexOf("Начать") > 0)
        {
            external.SetStatusLabel("Начинаю поход");
               StartKanalZayavka();
           }
           else
           {
               external.SetStatusLabel("Не видно карты, не в подземелье, или еще не истекла задержка");
               top.frames[3].location = "http://" + external.SCity.Text + ".combats.com/dungeon.pl";
        }
    }
}
 
function randomString()
{
    var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
    var string_length = 8;
    var randomstring = '';
    for (var i=0; i<string_length; i++)
    {
        var rnum = Math.floor(Math.random() * chars.length);
        randomstring += chars.substring(rnum,rnum+1);
    }
    return randomstring;
}
 
function PutKanalZayavka()
    {
        if(liderstvo==false && groupkanal==true){
         //alert("Вы собираетесь искать существующую заявку с лидером"+provodnik);
                    xlength=top.frames[3].document.forms.length;
          //alert("Если в этом окошке выведен этот текст и число, близкое к числу заявок на странице - это хорошо. Число заявок: "+xlength);
                    for(i=0;i<xlength;i++)
                    {
                        var z = top.frames[3].document.forms[ i ].innerHTML;
              //alert("Происходит проверка заявки номер: "+i+".");
                        if(z.indexOf("fl(\""+provodnik+"\"")>0){
             //alert("Заявка найденна. Пытаюсь ввести пароль");
                        top.frames[3].document.forms[ i ].pass.value=grouppass;
              //alert("Ввел пароль - пытаюсь подтвердить заявку");
                        top.frames[3].document.forms[ i ].submit();
                        }
                    }
 
                }else if(groupkanal==false || liderstvo==true){
            top.frames[3].document.all.mut_noblock.checked = false;
            top.frames[3].document.forms[top.frames[3].document.forms.length-1].pass.value = grouppass;
            top.frames[3].document.all.open.click();}
    }
 
 
 
function StartKanalZayavka()
{
     if(liderstvo==true){
                xlength=top.frames[3].document.forms.length;
                for(i=0;i<xlength;i++)
                {
                    var z = top.frames[3].document.forms[ i ].innerHTML;
                    if(z.indexOf("fl(\""+provodnik+"\"")>0){
                        var count=0;
                        var pos = z.indexOf("drwfl");
                        while (pos != -1){
                                count++;
                                pos = z.indexOf("drwfl",pos+1);
                                }
                    }
                }
                if(count==partija){
       usedObjects = [];
       dungeonMovementCount = [];
      dungeonCoords = "";
        dungeonDirection = 0;
                var date = new Date();
             dungeonStartTime = parseInt(String(date.getTime()).substring(0,10));
     // alert("Ща запущусь");                   
    top.frames[3].document.all.start.click();
                        }else{top.frames[3].window.location.reload();}
            }
        if(groupkanal==false){
        usedObjects = [];
          dungeonMovementCount = [];
         dungeonCoords = "";
        dungeonDirection = 0;
                var date = new Date();
             dungeonStartTime = parseInt(String(date.getTime()).substring(0,10));
      //alert("Не включен групповой режим");
                top.frames[3].document.all.start.click();
        }   
}
 
function IsMapVisible()
{
    if(s.match(/arrMap =/) != null)
        return true;
    else
        return false;
}
 
function IsWallPresent()
{
    var elements = top.frames[3].document.getElementsByTagName("*");   
    for(var i = 0;i < elements.length;i++)       
         if(elements[i].className == "LeftFront0_0")         
            return true;   
    return false;
}
 
function UseObjects()
{
    if(!IsWallPresent())
    {
        try
        {
            if(top.frames[3].arrLayers[1][0]["l"].arrObjects[0])
            {
                if(s.indexOf("получили")>0 || s.indexOf("У вас уже есть один такой предмет")>0 || s.indexOf("Попахивает")>0 || s.indexOf("Ничего не произошло")>0 || s.indexOf("нет необходимых ингредиентов")>0)
                    usedObjects["\"" + _object.id + "\""] = true;
 
                for(var i=0; i<top.frames[3].arrLayers[1][0]["l"].arrObjects.length; i++)
                {
                    _object = top.frames[3].arrLayers[1][0]["l"].arrObjects[i];
                    if(!usedObjects["\"" + _object.id + "\""])
                    {
                        external.SetStatusLabel("Копаюсь в хламе...");
                        top.frames[3].location = "http://" + external.SCity.Text + ".combats.com/" + dungName + "?useobj=" + _object.id;
                        breakAction = true;
                        return;
                    }
                }
            }
        }
        catch(err)
        {
 
        }
    }
}
 
function AttackMobs()
{
    if(!IsWallPresent())
    {
        try
        {
            if(top.frames[3].arrLayers[1][0]["l"].arrUnits[0])
            {
                if(top.frames[3].arrLayers[1][0]["l"].arrUnits[0].action != "")
                {
                    if(tkHP >= (maxHP*koeff))
                    {
                        external.SetStatusLabel("Нападаю на мобов");
                        if(external.SDungeonAttackMobs.Checked)
                            top.frames[3].location = "http://" + external.SCity.Text +".combats.com/" + dungName + "?attack=1&use=" + top.frames[3].arrLayers[1][0]["l"].arrUnits[0].id;
                    }
                    breakAction = true;
                    return;
                }
            }
        }
        catch(err)
        {
 
        }
    }
}
 
function Exit()
{
    if(breakAction)
        return;
 
    top.frames[3].location = top.frames[3].document.links[0].href;
}
 
function Walk(step)
{
    if(breakAction)
        return;
 
    if(step == "rl" || step == "rr")
        top.frames[3].location = "http://" + external.SCity.Text + ".combats.com/" + dungName + "?rnd=" + Math.random() + "&path=" + step;
    else
    {
        if(top.frames[3].is_accessible)
            top.frames[3].location = "http://" + external.SCity.Text + ".combats.com/" + dungName + "?rnd=" + Math.random() + "&path=" + step;
    }
}

В папке Modules создать надо папку DungeonUsers. В ней создавать для всех персонажей файлы ТочныйНикПерсонажа.txt с содержанием

var koeff = 1.0;                      //проценты ХП, при которых вы будете нападать на мобов(1.0 = 100%, 0.75 = 75% и т.д.)
    var groupkanal = true;            //Если идёте один - false
    if(groupkanal==true){
        var provodnik = "";     //Кто является проводником/лидером. Это обязательно надо указать и для самого проводника, и для прицепа.
         if(provodnik==mylogin){var liderstvo = true;}else{var liderstvo = false;}
      var grouppass = "321456";            //Пароль группы
        var partija = "2";                //Количество людей в партии, включая вас.
    }

С одной стороны это менее удобно, чем версия выше...С другой стороны это даст дальше развивать возможности использования модуля подземелий за счет более гибкого разграничения параметров каждого своего персонажа(короче лишним не будет:) )

Отредактировано anahronik (2009-08-15 23:06:33)

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

42

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

результат работы скрипта:

За сегодня
• набрано опыта: 0
• одержано побед: 411
• проиграно битв: 0
• безрезультатно: 0


Вы отдали "Гайка" x 234
Вы получили Жетон x 146
Вы отдали "Болт" x 14
Вы отдали "Вентиль" x 18
Вы отдали "Чистая Гайка" x 105
Вы получили Серебряный Жетон x 117
Вы отдали "Длинный Болт" x 46
Вы отдали "Чистый Вентиль" x 12


*Я принял в этом участие, лишь когда запустил ботов вчера в 3 часа ночи . smile

Ушел.

43

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

щас возьму 1-м персом 9-ку и будем вдвоем ходить smile)

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

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

Как сделать чтобы бот не нападал:
Поставить коэффициент нападения больше 1.0
Жизней ведь у вас не может быть больше 100% wink

Отредактировано Петро (2009-08-17 05:49:03)

Ответы на большинство вопросов связанных с ботом, вы найдёте здесь: (Please log in or register to see this URL)
(Please log in or register to see this URL) - проверил лично! Подробнее (Please log in or register to see this URL)

44

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

У меня возникли 2 проблемки. Сначала вроде всё показалось отличным и я был на 7 небе от счастья, но потом выяснилось вот что:

1) Бот-прицеп не ходит по каналке, если прописать время выхода из пещеры. Если стоит 0, то ходит нормально. У проводника такой проблемы не заметил.

2) Прицеп не обновляет окно подачи заявок, а если и обновляет, то делает это оочень редко. Так у меня проводник подал заявку, а прицеп её просто не видел, потому что не обновлял.

Есть какие-то решения или советы по этим проблемам ?)

И пожелание: можно ли сделать так, чтобы если видно, что проводник не вытянет бой, то прицеп влезает к нему в бой ?)

roll

45

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

Cr0nos пишет:

1) Бот-прицеп не ходит по каналке, если прописать время выхода из пещеры. Если стоит 0, то ходит нормально. У проводника такой проблемы не заметил.

Ну убери выход по времени, у меня за 18 совместных походов, никто ниразу не подвис.

Cr0nos пишет:

2) Прицеп не обновляет окно подачи заявок, а если и обновляет, то делает это оочень редко. Так у меня проводник подал заявку, а прицеп её просто не видел, потому что не обновлял.

Обновляет примерно 1 раз в 10-15 минут, не критично.

Cr0nos пишет:

Есть какие-то решения или советы по этим проблемам ?)

И пожелание: можно ли сделать так, чтобы если видно, что проводник не вытянет бой, то прицеп влезает к нему в бой ?)

roll

ну если ты придумаешь мозг для бота, и научишь его "понимать", что он сливает, тогда все возможно)) как по мне, бредовое какое-то пожелание)

Ушел.

46

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

Мунг,

Ну у меня проводник ещё не полностью раскачан как надо и слил старожилу, в результате он ждал в заявке, а прицеп остался в каналке mad

А насчёт пожелания - можно залезать, если хп меньше 20%. что-нибудь в этом роде.

47

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

Cr0nos пишет:

Мунг,

Ну у меня проводник ещё не полностью раскачан как надо и слил старожилу, в результате он ждал в заявке, а прицеп остался в каналке mad

А насчёт пожелания - можно залезать, если хп меньше 20%. что-нибудь в этом роде.

неприятность) Ну тогда жди нашего самописца) Быть может, он тебе поможет)

Ушел.

48

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

Петро пишет:

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

Это, какбы, и не недоработка....
эти переменные выставляются в Настройки-Дополнительно и хранятся в файле вашего аккаунта в папке Accounts.
А раз они уже есть и настраиваются отдельно для каждого персонажа, так зачем их ещё раз создавать для тех же целей? smile

Решение слишком быстрого обновления верхнего фрэйма у проводника(проверенно):
В функцииStartKanalZayavka

была строка   }else{top.frames[3].window.location.reload();}
должна быть  }else{setTimeout(top.frames[3].window.location.reload(),3000);}
3000 - 3 секунды. 4000 - 4 секунды. Сами регулируйте скорость обновления для себя.

Решение для ускорения обновления верхнего фрэйма прицепом(частично проверенно):
замена функции:

function PutKanalZayavka()
    {
        var searched = false;
        if(liderstvo==false && groupkanal==true){
            xlength=top.frames[3].document.forms.length;
            for(i=0;i<xlength;i++)
                    {
                        var z = top.frames[3].document.forms[ i ].innerHTML;
                        if(z.indexOf("fl(\""+provodnik+"\"")>0){
                        top.frames[3].document.forms[ i ].pass.value=grouppass;
                        searched = true;
                        top.frames[3].document.forms[ i ].submit();
                        }
                    }
                   if(searched!=true){setTimeout(top.frames[3].window.location.reload(),3000);}
                }else if(groupkanal==false || liderstvo==true){
            top.frames[3].document.all.mut_noblock.checked = false;
            top.frames[3].document.forms[top.frames[3].document.forms.length-1].pass.value = grouppass;
            top.frames[3].document.all.open.click();}
    }

1) Бот-прицеп не ходит по каналке, если прописать время выхода из пещеры. Если стоит 0, то ходит нормально. У проводника такой проблемы не заметил.

Ужас какой...а почему не ходит то?
моя ведь часть только на вход в данж влияет, а дальше он по скрипту должен ходить hmm
Народ, проверьте кто-нибудь ещё эту проблему...

Отредактировано anahronik (2009-08-19 14:23:44)

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

49

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

Cr0nos пишет:

У меня возникли 2 проблемки. Сначала вроде всё показалось отличным и я был на 7 небе от счастья, но потом выяснилось вот что:

1) Бот-прицеп не ходит по каналке, если прописать время выхода из пещеры. Если стоит 0, то ходит нормально. У проводника такой проблемы не заметил.

(Please log in or register to see this URL)
у него тоже при выставлении времени выхода не ходит совсем.....видимо накрылась система автовыхода в каком-то месте надо будет почесать её, когда время будет... не могла же она изначально задумываться как зашел и стоишь, пока время идёт hmm
скорее всего там косяк с определением одной из используемых переменных - бот всегда встаёт, если встречает такую проблему.

Отредактировано anahronik (2009-08-19 19:44:11)

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

50

Re: Бот-проводник и бот-прицеп... Учим ботов ходить парой.

Всё, знаю, где косяк с выставлением времени выхода.
Он был в моей части.
Из-за того, что прицеп не начинает заявку, не происходит присвоение значения
dungeonStartTime = parseInt(String(date.getTime()).substring(0,10));

Покачто могу предложить не очень хорошее решение, но работать должно:

(это практически в самом верху Dungeon.js)
if(IsMapVisible())
{
dungName = top.frames[3].location.href.match(/combats.com\/(.+?)\?/)[1];
var date = new Date();
if(zag==0){
usedObjects = [];
dungeonMovementCount = [];
dungeonCoords = "";
dungeonDirection = 0;
dungeonStartTime = parseInt(String(date.getTime()).substring(0,10));
zag++;
}
 
ничего не удалять - только добавлять недостающее.

и ещё подправить

function PutKanalZayavka()
    {
                     var zag=0;

Не успеваю проверить уже. По логике всё верно...

Отредактировано anahronik (2009-08-21 03:30:22)

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