Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

Скрипт на Lumber. Шард Forest Wars.

Only working scripts
Edred
Moderator
Moderator
Posts: 559
Joined: 28.03.2006 21:29

Скрипт на Lumber. Шард Forest Wars.

Post by Edred »

Edred
Posted: Fri Feb 09, 2007 1:44 Post subject: Скрипт на Lumber. Шард Forest Wars.


Файл маршрута выглядит так:

Code: Select all

 
3232 2760 0 0 0 0 
3237 2765 3283 3237 2766 5 
3237 2763 3283 3237 2762 5 
3238 2763 0 0 0 0 
3238 2760 3277 3239 2759 5 
3240 2762 0 0 0 0 
3244 2762 3277 3245 2762 10 
3244 2768 0 0 0 0 
3245 2769 3280 3245 2770 10 
3245 2769 3299 3246 2770 10 
3247 2769 0 0 0 0 
... 
3232 2760 0 0 0 0 
Первые два числа - координаты чара в узловой точке (либо точка поворота, либо точка рубки), далее тип и три координаты дерева. Если это не точка рубки, а точка поворота на маршруте - последние 4 числа = 0. Первая и последняя точка в маршруте - координаты точки разгрузки у сундука.

Сам скрипт:

Code: Select all

program LambIsengard101; 
// В папке D:\Games\Railes есть файл имя_чара.txt и файл res.txt 
// Первый - это маршрут перемещения чара по лесу от сундука и обратно к 
// сундуку. При килле чар идет дальше по маршруту вплоть до сундука. 
// Второй файл - маршрут от сундука до креста для реса. 
// Вырубленные логи скидывать в сундук. Топоры брать из мешка оттуда же. 
// В общем, как в мининге. 
// 
// v.1.01 (c) Edred 

{$Include 'all.inc'} 

const 
MyMaxWeight = 350; 
Msg1 = 'You put the'; 
Msg2 = 'не смогли вырубить ничего'; 
Msg3 = 'fail to'; 
Msg4 = 'You decide not to chop wood'; 
Msg5 = 'There is nothing'; 
Hatchet1 = $0F43; 
Hatchet2 = $0F44; 
AnkhID = $40002DFE; 
Sunduk = $400549E1; 
BagHatchets = $4003FF49; 
DeadLife = 40; 
Logs = $1BDD; 
WoodType = $0F90; 

type LumbRecord = Record 
   x,y,tt,tx,ty,tz : integer; 
   end; 

var 
LumberDim : array [0..5000] of LumbRecord; 
ResDim : array [0..5000] of  LumbRecord; 
Regs : array [1..3] of Cardinal; 
MaxPosL, MaxPosR, k : integer;               // длины соответствующих массивов 
CharRail, ResRail : String; 
LumberFlag : Boolean;      // true - работаем, false - нет (разгрузка или смерть) 
ctime : TDateTime; 
  

   procedure GetLumberRail(s : String; WPos : Integer; flag : Boolean); 
   // flag - true - маршрут для ламбера, false - маршрут для реса 
   begin 
      s := s + ' '; 
      if flag then 
      begin 
         LumberDim[WPos].x := StrToInt(Copy(s,1,Pos(' ',s)-1)); 
         Delete(s,1,Pos(' ',s)); 
         LumberDim[WPos].y := StrToInt(Copy(s,1,Pos(' ',s)-1)); 
         Delete(s,1,Pos(' ',s)); 
         LumberDim[WPos].tt := StrToInt(Copy(s,1,Pos(' ',s)-1)); 
         Delete(s,1,Pos(' ',s)); 
         LumberDim[WPos].tx := StrToInt(Copy(s,1,Pos(' ',s)-1)); 
         Delete(s,1,Pos(' ',s)); 
         LumberDim[WPos].ty := StrToInt(Copy(s,1,Pos(' ',s)-1)); 
         Delete(s,1,Pos(' ',s)); 
         LumberDim[WPos].tz := StrToInt(Copy(s,1,Pos(' ',s)-1)); 
         Delete(s,1,Pos(' ',s)); 
      end 
      else 
      begin 
         ResDim[WPos].x := StrToInt(Copy(s,1,Pos(' ',s)-1)); 
         Delete(s,1,Pos(' ',s)); 
         ResDim[WPos].y := StrToInt(Copy(s,1,Pos(' ',s)-1)); 
         Delete(s,1,Pos(' ',s)); 
         ResDim[WPos].tt := StrToInt(Copy(s,1,Pos(' ',s)-1)); 
         Delete(s,1,Pos(' ',s)); 
         ResDim[WPos].tx := StrToInt(Copy(s,1,Pos(' ',s)-1)); 
         Delete(s,1,Pos(' ',s)); 
         ResDim[WPos].ty := StrToInt(Copy(s,1,Pos(' ',s)-1)); 
         Delete(s,1,Pos(' ',s)); 
         ResDim[WPos].tz := StrToInt(Copy(s,1,Pos(' ',s)-1)); 
         Delete(s,1,Pos(' ',s)); 
      end; 
   end; 

   procedure GetRail(FileNam : String; Flagoffile : boolean); 
   var 
   List : TStringList; 
   i : integer; 
   begin 
      List := TStringList.Create; 
      List.LoadFromFile(FileNam); 
      for i := 0 to List.Count-1 do GetLumberRail(List.strings[i],i,FlagOfFile); 
      if Flagoffile then MaxPosL := i 
      else MaxPosR := i; 
   end; 

   procedure CheckDead; 
   begin 
      if Dead then exit; 
      if HP < 40 then 
      begin 
         Disconnect; 
         wait(5000); 
         Connect; 
         repeat 
            wait(100); 
         until Connected; 
      end; 
   end; 


   procedure RestoreStamina; 
   // если стамины мало, восстанавливаем ее чару до полной 
   begin 
      if Stam < 20 then 
      begin 
         repeat 
            waitconnection(3000); 
            wait(1000); 
         until Stam = MaxStam; 
      end; 
   end; 

   function CheckHatchet : Boolean; 
   // проверяем, есть ли топор у чара в паке или на нужном слое. 
   // если ее нет - открываем сундук и мешок, берем топор. Если топора нет 
   // в мешке - выход. 
   var tmpser : Cardinal; 
   begin 
      Result := true; 
      waitconnection(3000); 
      if (ObjAtLayerEx(RhandLayer,self) <> 0) or (count(Hatchet1)<>0) or (count(Hatchet2)<>0) then exit; 
      // нет у чара топора 
      repeat 
         UseObject(Sunduk); 
         wait(1000); 
         checksave; 
         UseObject(BagHatchets); 
         wait(1000); 
         checksave; 
         tmpser := findtype(Hatchet1,BagHatchets); 
         if tmpser = 0 then tmpser := findtype(Hatchet2,BagHatchets); 
         if tmpser <> 0 then 
         begin 
            Grab(tmpser,1); 
            wait(1000); 
            checksave; 
         end; 
      until (count(Hatchet1)<>0) or (count(Hatchet2)<>0); 
   end; 

   procedure ResChar; 
   // идем по маршруту на рес, ресаем чара, восстанавливаем здоровье, возвращаемся 
   // по тому же маршруту в обратную сторону 
   var 
   n : integer; 
   tmptime : TDateTime; 
   begin 
AddToSystemJournal('TEST: нужен рес чара'); 
      For n := 0 to MaxPosR-1 do 
      begin 
         repeat 
            NewMoveXY(ResDim[n].x,ResDim[n].y,False,0,true); 
            wait(300); 
         until (GetX(self)=ResDim[n].x) and (GetY(self)=ResDim[n].y); 
      end; 
      // чар у креста 
AddToSystemJournal('TEST: чар у креста'); 
      WaitConnection(5000); 
      if WarMode = true then SetWarMode(false); 
      repeat 
         UseObject(AnkhID); 
         wait(2000); 
         checksave; 
      until not Dead; 
      // лечим чара 
AddToSystemJournal('TEST: лечим чара'); 
      while (HP<MaxHP) do 
      begin 
         waitconnection(3000); 
         tmptime := Now; 
         n := 0 
         UseSkill('Spirit Speak'); 
         repeat 
            wait(100); 
            n := n + 1; 
         until (InJournalBetweenTimes('You fail|You channel|You lack|You establish', tmptime, Now)<>-1) or (Mana < (MaxMana - 50)) or (n > 300); 
         wait(500); 
         if Mana < 30 then 
         begin 
            tmptime := Now; 
            n := 0; 
            repeat 
               waitconnection(3000); 
               useskill('meditation'); 
               wait(2000); 
               n := n + 1; 
               checksave; 
            until (InJournalBetweenTimes('reached full mana', tmptime, Now)<>-1) or (n = 100); 
         end; 
      end; 
      // пойдем обратно 
AddToSystemJournal('TEST: идем обратно к сундуку'); 
      For n := 0 to MaxPosR-1 do 
      begin 
         repeat 
            NewMoveXY(ResDim[MaxPosR-1-n].x,ResDim[MaxPosR-1-n].y,False,0,true); 
            wait(300); 
         until (GetX(self)=ResDim[MaxPosR-1-n].x) and (GetY(self)=ResDim[MaxPosR-1-n].y); 
      end; 
   end; 

   procedure Discharge; 
   // разгружаем нарубленное в сундук 
   // нарубленное - реги в массиве Regs[1..3] 
   // логи - константа Logs 
   var m, tmpcnt : integer; 
      tmpid, tmpstack, tmpcolor : Cardinal; 
      tmpname : String; 
   begin 
AddToSystemJournal('TEST: разгрузка'); 
      waitconnection(3000); 
      CheckDead; 
      if Dead then exit; 
      UseObject(Sunduk); 
      wait(1000); 
      checksave; 
      // выложим реги 
      for m := 1 to 3 do 
      begin 
         tmpcnt := 0; 
         Repeat 
            tmpid := Findtype(Regs[m],backpack); 
            if tmpid = 0 then break; 
            addtosystemjournal( 'Отладка: найдено ' + inttostr(GetQuantity(tmpid)) + ' regs'); 
            tmpcnt := tmpcnt + 1; 
            if tmpcnt > 10 then 
            begin 
               addtosystemjournal('Ошибка: не могу переместить regs!'); 
               wait(15000); 
            end; 
            tmpstack := Findtype(Regs[m],Sunduk); 
            // Если не найден в банке - тогда просто в контейнер 
            if tmpstack = 0 then tmpstack := Sunduk; 
            MoveItem(tmpid,GetQuantity(tmpid),tmpstack,0,0,0); 
            wait(1000); 
            CheckSave; 
         until tmpid = 0; 
      end; 
      // выложим дид вуды 
      tmpcnt := 0; 
      Repeat 
         tmpid := Findtype(WoodType,backpack); 
         if tmpid = 0 then break; 
         addtosystemjournal( 'Отладка: найдено ' + inttostr(GetQuantity(tmpid)) + ' dead woods'); 
         tmpcnt := tmpcnt + 1; 
         if tmpcnt > 10 then 
         begin 
            addtosystemjournal('Ошибка: не могу переместить dead woods!'); 
            wait(15000); 
         end; 
         tmpstack := Findtype(WoodType,Sunduk); 
         // Если не найден в банке - тогда просто в контейнер 
         if tmpstack = 0 then tmpstack := Sunduk; 
         MoveItem(tmpid,GetQuantity(tmpid),tmpstack,0,0,0); 
         wait(1000); 
         CheckSave; 
      until tmpid = 0; 
      // выложим логи 
      tmpcnt := 0; 
      Repeat 
         tmpid := Findtype(Logs,backpack); 
         if tmpid = 0 then break; 
         tmpcolor := GetColor(tmpid); 
         tmpname := ' unknown logs'; 
         case tmpcolor of 
            $0000 : tmpname := ' logs'; 
            $037F : tmpname := ' Grave logs'; 
            $0039 : tmpname := ' Willow logs'; 
            $0026 : tmpname := ' Maple logs'; 
            $0405 : tmpname := ' Oak logs'; 
            $0994 : tmpname := ' Bloody logs'; 
            $048A : tmpname := ' Nature logs'; 
            $0898 : tmpname := ' Spirits logs'; 
         end; 
         addtosystemjournal( 'Отладка: найдено ' + inttostr(GetQuantity(tmpid)) + tmpname); 
         tmpcnt := tmpcnt + 1; 
         if tmpcnt > 10 then 
         begin 
            addtosystemjournal('Ошибка: не могу переместить логи'); 
            wait(15000); 
         end; 
         repeat 
            tmpstack := FindtypeEx(Logs,tmpcolor,Sunduk,False); 
            if GetQuantity(tmpstack) >= 65000 then Ignore(tmpstack); 
         until (tmpstack = 0) OR (GetQuantity(tmpstack) < 65000); 
         // Если не найден в сундуке - тогда просто в контейнер 
         if tmpstack = 0 then tmpstack := Sunduk; 
         MoveItem(tmpid,GetQuantity(tmpid),tmpstack,0,0,0); 
         wait(1000); 
         CheckSave; 
      until tmpid = 0; 
      IgnoreReset; 
AddToSystemJournal('TEST: разгрузка закончена'); 
   end; 

   function LumbCurTree(tile,x,y,z : Integer) : Boolean; 
   // рубим указанный тайл. Возвращаем false если перевес или чар мертв. 
   var q, m1, m2, m3, m4, m5, CountFizzle : integer; 
   begin 
      Result := true; 
      CountFizzle := 0; 
      repeat 
         if WarMode = true then SetWarMode(false); 
         if TargetPresent then CancelTarget; 
         ctime := Now; 
         if Dead then begin Result := false; exit; end; 
         if UseType(Hatchet1,$FFFF) = 0 then 
         begin 
            if UseType(Hatchet2,$FFFF) = 0 then 
            begin 
               Result := false; 
               exit; 
            end; 
         end; 
         WaitForTarget(5000); 
         If TargetPresent then TargetToTile(tile, x, y, z); 
         q := 0; 
         repeat 
            wait(100); 
            q := q + 1; 
            checksave; 
            m1 := InJournalBetweenTimes(Msg1, ctime, Now); 
            m2 := InJournalBetweenTimes(Msg2, ctime, Now); 
            m3 := InJournalBetweenTimes(Msg3, ctime, Now); 
            m4 := InJournalBetweenTimes(Msg4, ctime, Now); 
            m5 := InJournalBetweenTimes(Msg5, ctime, Now); 
         until (m1<>-1) or (m2<>-1) or (m3<>-1) or (m4<>-1) or (m5<>-1) or Dead or (q > 300); 
         if (m2<>-1) or (m3<>-1) or (m4<>-1) then CountFizzle := CountFizzle + 1; 
         if Dead or (Weight > MyMaxWeight) then begin Result := false; exit; end; 
      until (m5<>-1) OR (CountFizzle = 10); 
   end; 

Begin 
   Regs[1] := $0F85;      // ginseng 
   Regs[2] := $0F88;      // Nightshade 
   Regs[3] := $0F86;      // Mandrake Roots 
   CharRail := 'D:\Games\Railes\' + GetName(self) + '.txt'; 
   ResRail := 'D:\Games\Railes\res.txt'; 
   GetRail(CharRail,true); 
   AddToSystemJournal('Маршрут ' + CharRail + ' загружен'); 
   GetRail(ResRail,false); 
   AddToSystemJournal('Маршрут ' + ResRail + ' загружен'); 
   // Стартуем от сундука 
   repeat 
      CheckDead; 
      if Dead then LumberFlag := false else LumberFlag := true; 
      if LumberFlag then 
      begin 
         if not CheckHatchet then exit; 
         For k := 0 to MaxPosL-1 do 
         begin 
            // идем по маршруту 
            repeat 
               RestoreStamina; 
               NewMoveXY(LumberDim[k].x,LumberDim[k].y,False,0,true); 
               wait(300); 
            until (GetX(self)=LumberDim[k].x) and (GetY(self)=LumberDim[k].y); 
AddToSystemJournal('TEST (' + inttostr(k) + ' of ' + inttostr(MaxPosL-1) + '): пришел в координаты ' + inttostr(LumberDim[k].x) + ',' + inttostr(LumberDim[k].y)); 
            if LumberFlag and (LumberDim[k].tt <> 0) then 
               // Будем рубить 
               LumberFlag := LumbCurTree(LumberDim[k].tt,LumberDim[k].tx,LumberDim[k].ty,LumberDim[k].tz); 
         end; 
      end; 
      // мы снова у сундука 
      if not Dead then Discharge else ResChar; 
      if ((GetX(self) = 3231) AND (GetY(self) = 2759)) then NewMoveXY(3232,2759,False,0,true);       
   until False; 
End. 
Edred
Moderator
Moderator
Posts: 559
Joined: 28.03.2006 21:29

Post by Edred »

User
Posted: Tue Apr 17, 2007 11:59 Post subject:


Вопрос:
Можно ли вписать в этот ламбер еду? Т.е. что бы чар, к примеру после сброса логов кушал из сундука.
Просто я уже вписывал , backpack и , ground. Вопрос в том, можно ли как то написать, типа Hungry(1, box_id) или че-то в этом роде? + Желательно подскажите как.

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

User
Posted: Tue Apr 17, 2007 12:08 Post subject:


+ вопрос:

Code: Select all

if not Dead then Discharge else ResChar; 
if ((GetX(self) = 3231) AND (GetY(self) = 2759)) then GotoXY(3232,2759,0,true); 
Что это за координаты?

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

Acronym
Posted: Tue Apr 17, 2007 14:55 Post subject:


User wrote:
Вопрос:
Можно ли вписать в этот ламбер еду? Т.е. что бы чар, к примеру после сброса логов кушал из сундука.
Просто я уже вписывал , backpack и , ground. Вопрос в том, можно ли как то написать, типа Hungry(1, box_id) или че-то в этом роде? + Желательно подскажите как.
Список инклюдов
Hungry есть 2-видов:
- с заданием контейнера( backpack, ground или твой контенер);
и потом появилась другая версия:
- автономный (ищет в паке или на земле);

тебе нужен 1-й вариант, обьявляешь

Code: Select all

const 
box_id = $123456;

и потом используешь Hungry(1, box_id)

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

User
Posted: Tue Apr 17, 2007 19:35 Post subject:


Огромное спасибо за ответ. Просто думал что hungry работает только с 2мя леерами, или как там биш их, т.е. бекпаком и землей.

ПС: вопрос по тем 2м строчкам остается в силе.

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

Edred
Posted: Wed Apr 18, 2007 19:30 Post subject:


User wrote:
+ вопрос:
if ((GetX(self) = 3231) AND (GetY(self) = 2759)) then GotoXY(3232,2759,0,true);
Что это за координаты?
Убери эту строку на фиг. У меня один из чаров иногда запинался за край сундука, огибая его. И оставался сбоку от сундука, вместо того, чтобы подойти к нему спереди. Мне лень было переписывать маршрут и я просто вбил проверку, если координаты сбоку- отдельно подойти.

А может, это другая ситуация: после возвращения с реса чар не доходил до сундука на одну клетку и я вставил доп проверку с подходом.

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

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

User
Posted: Thu Apr 19, 2007 9:02 Post subject:


К счастью ламбер работает как часы. Просто сердце радуется. Огромное спасибо. Если доведется - с радостью выставлю пиво.

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

Edred
Posted: Fri Apr 20, 2007 0:47 Post subject:


Пиво выставляй автору программы. А скрипт написать - дело нехитрое.

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

Democratiks
Posted: Sat Jun 23, 2007 18:32 Post subject:


Очень извеняюсь, но пытался настроить скрипт, не вышло, пишет:

Code: Select all

18:24:24 [Utop-Bruno]: Compiling 
18:24:24 [Utop-Bruno]: Compiler: [Error] (lumber.txt at 16:15):  Semicolon (';') expected 
18:24:24 [Utop-Bruno]: Compiling failed 
18:24:24 [Utop-Bruno]: Script lumber.txt stoped successfuly 
Вообщем сделал файл Bruno.txt в директории D:\Games\Railes , а так же файл res.txt с путём до креста.

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

Что тут вводить честно говоря не понял....

Code: Select all

MaxPosL, MaxPosR, k : integer;               // длины соответствующих массивов 
CharRail, ResRail : String; 
LumberFlag : Boolean;      // true - работаем, false - нет (разгрузка или смерть) 
Эдред, подскажи.

насчёт вот этого ещё не понял:

Code: Select all

 
 procedure GetLumberRail(s : String; WPos : Integer; flag : Boolean); 
   // flag - true - маршрут для ламбера, false - маршрут для реса 
ещё:

Code: Select all

   procedure GotoXY(x,y,prec : integer; runflag : boolean); 
   // x,y - координаты, в которые идем 
   // prec - точность подхода 
   // runflag - бежать или идти 
   // v. 1.04 (с) Edred, скрипт портирован с инжекта 
   // оригинальная версия Yoko с доработкой AGRS и Edred. 
Вроде всё.
Долго смотрел скрипт, разбирал, но вроде кроме того что не ввёл нужные айди и вот то что выше написал, сделал всё верно.

Буду очень благодарен за помощь.

З.ы, пытался найти способ добычи id путём поиска и информации на сайте, не нашёл..

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

CFA
Posted: Sat Jun 23, 2007 19:33 Post subject:


18:24:24 [Utop-Bruno]: Compiler: [Error] (lumber.txt at 16:15): Semicolon (';') expected [/qoute]

видимо в процессе настройки похерил ; в конце 16 строки.
кстати [Utop-Bruno] это то, что я думаю?

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

Democratiks
Posted: Sat Jun 23, 2007 20:44 Post subject:

Code: Select all

18:24:24 [Utop-Bruno]: Compiler: [Error] (lumber.txt at 16:15): Semicolon (';') expected 
видимо в процессе настройки похерил ; в конце 16 строки.
кстати [Utop-Bruno] это то, что я думаю?


ты прав, накосячил, во фразе был знак '.
я тоже подумал что 16:15 это строки, но посмотрел ничего не нашёл, а вот сейчас после того как вздремнул понял что строка и номер символа.

На данный момент не находит сунднук, видимо нужен правельный ID, как его найти я незнаю... подскажите пожалуйста.

Code: Select all

20:57:04 [Jaga-Jaga]: UseObject error: Object not finded. 
--------------------------------------------------------------------------------

SaNeK
Posted: Sat Jun 23, 2007 21:30 Post subject:


инжект команда ,info

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

Democratiks
Posted: Sat Jun 23, 2007 22:02 Post subject:

SaNeK wrote:
инжект команда ,info
я пробовал )
вот из инфо что выходит, id сундука : "0x6CEC783E"

а у Эдреда id сундука вот в таком виде: "400549E1"
к сожалению я не изучал сильно программирование, и те знания что у меня есть не могут мне разъяснить как из вида "0x6CEC783E" сделать вид "400549E1"

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

CFA
Posted: Sat Jun 23, 2007 22:23 Post subject:


Вместо 0x поставить $ остальные цифры и буквы останутся такие-же

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

Democratiks
Posted: Sat Jun 23, 2007 22:44 Post subject:

Вместо 0x поставить $ остальные цифры и буквы останутся такие-же
спасибо, теперь работает.
просто уж не похожесть айдишников меня смутила.

Работает, но как то неправильно мне кажется, потому что он подходит, ждёт около 2-х(!) минут а потом рубит, опять ждёт около 2-х(!) и вот так.

кажется мне что я где-то чего то не поставил.

вот тут ничего не надо ставить?

Code: Select all

 
var 
LumberDim : array [0..5000] of LumbRecord; 
ResDim : array [0..5000] of  LumbRecord; 
Regs : array [1..3] of Cardinal; 
MaxPosL, MaxPosR, k : integer;               // длины соответствующих массивов 
CharRail, ResRail : String; 
LumberFlag : Boolean;      // true - работаем, false - нет (разгрузка или смерть) 
ctime : TDateTime;
Edred
Moderator
Moderator
Posts: 559
Joined: 28.03.2006 21:29

Post by Edred »

Edred
Posted: Sun Jun 24, 2007 9:17 Post subject:


Democratiks wrote:
Работает, но как то неправильно мне кажется, потому что он подходит, ждёт около 2-х(!) минут а потом рубит, опять ждёт около 2-х(!) и вот так.

Цикл рубки прерывается по таймеру. Это значит, что у тебя скрипт не ловит сообщение о успешности рубки. Проверить все сообщения, которые чар может получить при рубке (проверить в обычном клиенте и записать), сверить их с теми, что заданы в скрипте. В скрипте:

Code: Select all

Msg1 = 'You put the'; 
Msg2 = 'не смогли вырубить ничего'; 
Msg3 = 'fail to'; 
Msg4 = 'You decide not to chop wood'; 
Msg5 = 'There is nothing'; 
Первое сообщение - успешная рубка, второе-третье - физл, остальные - нет ничего и надо идти дальше.

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

Democratiks
Posted: Sun Jun 24, 2007 10:50 Post subject:


Edred wrote:
Цикл рубки прерывается по таймеру. Это значит, что у тебя скрипт не ловит сообщение о успешности рубки. Проверить все сообщения, которые чар может получить при рубке (проверить в обычном клиенте и записать), сверить их с теми, что заданы в скрипте. В скрипте:

Code:
Msg1 = 'You put the';
Msg2 = 'не смогли вырубить ничего';
Msg3 = 'fail to';
Msg4 = 'You decide not to chop wood';
Msg5 = 'There is nothing';


Первое сообщение - успешная рубка, второе-третье - физл, остальные - нет ничего и надо идти дальше.



Так, трижды всё перепроверил, всё равно долго у девера стоит. правда когда ничего нету он быстро переходит к другому.
у меня стоит:

Code: Select all

Msg1 = 'You place'; 
Msg2 = 'ничего не вырубили'; 
Msg3 = 'fail to'; 
Msg4 = 'not enough wood here to chop'; 
Msg5 = 'There is nothing'; 


Msg1 : You place * logs in your backpack 
Msg2 : нету аналога, служит как заглушка. 
Msg3 : You fail to get any usable wood. 
Msg4 : There's not enough wood here to chop. (пришлось убрать There's, потому что апостроф мешает скрипту) 
Msg5 : нету аналога, служит как заглушка. 
вот :\

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

Acronym
Posted: Mon Jun 25, 2007 12:57 Post subject:

Msg4 : There's not enough wood here to chop. (пришлось убрать There's, потому что апостроф мешает скрипту)


Достаточно будет любого фрагмента строки, как ты и сделал, а если хочешь чтобы было с апострофом используй удвоенный апостроф:

Code: Select all

Msg4 = 'There''s not enough wood here to chop.';
Msg5 : нету аналога, служит как заглушка.
Это самое главное.
Аналог должен быть - сообщение после которого рубить абсолютно нечего.

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

Edred
Posted: Mon Jun 25, 2007 13:35 Post subject:



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

В общем, тебе рыть тут:

Code: Select all

   until (m1<>-1) or (m2<>-1) or (m3<>-1) or (m4<>-1) or (m5<>-1) or Dead or (q > 300); 
   if (m2<>-1) or (m3<>-1) or (m4<>-1) then CountFizzle := CountFizzle + 1; 
   if Dead or (Weight > MyMaxWeight) then begin Result := false; exit; end; 
until (m5<>-1) OR (CountFizzle = 10);
Если нет сообщений, попытка прерывается по таймеру q через 30 сек. Максимум десять физлов (CountFizzle). Счас с ходу не сообразить, спешу, но, похоже, если нет сообщений заданных, то это будет считаться физлом. Тогда чар будет один-два раза рубить дерево, потом на дереве ничего нет, а он десять раз подряд по 30 сек физлит. Вот тебе и 300 сек, то есть 5 мин.

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

Democratiks
Posted: Mon Jun 25, 2007 18:43 Post subject:


Сообщение есть, я вставил его в мсг4:
There's not enough wood here to chop.
Msg5 : нету аналога, служит как заглушка.
Это самое главное.
Аналог должен быть - сообщение после которого рубить абсолютно нечего.


Что-то я сглупил, и не разобрал что 5-ое самое главное, и что на его месте надо было поставить "There's not enough wood here to chop."

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

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

Acronym
Posted: Tue Jun 26, 2007 10:24 Post subject:


Добывающие скилы бывают двух(?) видов:
- рубанул/копнул ОДИН раз и процесс идет дальше САМ, пока не исчерпаем источник;
- рубим/копаем все время (а системные сообщения указывают нам когда нужно рубить снова) пока не исчерпаем источник;

У Эдреда в скрипте заточка под шард со вторым вариантом. По идее при попытке еще раз рубить/копать в первом варианте было бы сказано, что ты уже perfoming another action.., значит у тебя на шарде второй вариант. А задержки и выход по таймауту означают, что все еще плохо прописаны фейлы (2,3,4 сообщения)

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

Edred
Posted: Tue Jun 26, 2007 11:39 Post subject:



Democratiks wrote:
Что-то я сглупил, и не разобрал что 5-ое самое главное, и что на его месте надо было поставить "There's not enough wood here to chop."


Надо же читать скрипт:

Code: Select all

until (m5<>-1) OR (CountFizzle = 10);
Выход из цикла производится либо по сообщению N 5, либо если физлов 10. Именно пятое сообщение отвечает за окончание рубки дерева.

Я просто в спешке ошибся - четвертое сообщение - это тоже сообщение о физле. Об этом свидетельствует следующая строка:

Code: Select all

if (m2<>-1) or (m3<>-1) or (m4<>-1) then CountFizzle := CountFizzle + 1;
То есть, если одно из этих трех сообщений - то нарастить счетчик физлов.

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

Dimage
Posted: Tue Aug 21, 2007 16:53 Post subject:


Шард ДРВ

Повисает иногда так:

Code: Select all

[16:50:19] System: What do you want to use this on? 
[16:50:20] System: There are no logs here to chop. 
[16:50:20] System: What do you want to use this on? 
[16:50:20] System: There are no logs here to chop. 
[16:50:20] System: What do you want to use this on? 
[16:50:20] System: There are no logs here to chop. 
[16:50:20] System: What do you want to use this on? 
[16:50:20] System: There are no logs here to chop. 
[16:50:20] System: What do you want to use this on? 
[16:50:20] System: There are no logs here to chop. 
[16:50:21] System: What do you want to use this on? 
[16:50:21] System: There are no logs here to chop. 
[16:50:21] System: What do you want to use this on? 
[16:50:21] System: There are no logs here to chop. 
[16:50:21] System: What do you want to use this on? 
[16:50:21] System: There are no logs here to chop. 
[16:50:21] System: What do you want to use this on? 
[16:50:21] System: There are no logs here to chop. 
[16:50:21] System: What do you want to use this on? 
[16:50:21] System: There are no logs here to chop. 
[16:50:25] System: What do you want to use this on?

А бывает и вот так:

Code: Select all

[16:50:47] System: What do you want to use this on? 
[16:50:47] System: What do you want to use this on? 
[16:51:20] System: What do you want to use this on? 


вот что выставил:

Code: Select all

Msg1 = 'You put the'; 
Msg2 = 'не смогли вырубить ничего'; 
Msg3 = 'fail to'; 
Msg4 = 'to chop'; 
Msg5 = 'There is nothing'; 


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

-=JoKeR=-
Posted: Thu Sep 06, 2007 14:45 Post subject:


На RC3 отказывается работать.
В системном журнале пишет : Cannot open file "D:\Games\Railes\NoName.txt". Не удается найти указанный файл at 33.80

На RC1 отлично работает.

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

-=JoKeR=-
Posted: Fri Sep 07, 2007 15:08 Post subject:


Я переименовал файл с маршрутом который был имя_чара.txt (ну имя чара конешно было нормальное) в NoName.txt и скрипт запустился. Но чёта немогу понять, скрипт значит немог определить имя чара?

CharRail := 'D:\Games\Railes\' + GetName(self) + '.txt'; Гдето тут он дуплит ?

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

Edred
Posted: Fri Sep 07, 2007 17:03 Post subject:


Не пробовал применить тот же способ, что и в скрипте на мининг? Быстрее всего, GetName(self) в RC3 возвращает имя не в такой форме, как в RC1. Для этого надо сделать скрипт из одной строки, в которой выводить в системный журнал результат GetName(self) и все вопросы сразу снимутся.

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

ЗЫ: Счас глянул, в объявлении о выходе RC3 Миралекс писал:
Переделаны ф-ции определения собственного имени
--------------------------------------------------------------------------------

-=JoKeR=-
Posted: Fri Sep 07, 2007 23:10 Post subject:


Так как мой мега-моск ниасилил написать скрипт из одной строки, в которой выводить в системный журнал результат GetName(self), по совету моего друга, чтоб я не парился, я поставил вместо GetName(self) --> CharName. Для меня так подходит, я запускаю только одного чара на ламбер.

Может кто-то выложит это чудо чтоб я всё-таки проверил имя своего чара и зделал всё как надо.

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

Edred
Posted: Sat Sep 08, 2007 1:36 Post subject:


Мдя уж...

Code: Select all

program TestName; 
begin 
   AddToSystemJournal(GetName(self)); 
end.
И такое не осилил?

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

-=JoKeR=-
Posted: Sat Sep 08, 2007 20:17 Post subject:


гЫ..я так и предпологал шо оно так и должно быть..но сомневался..т.к не силён в программировании...ещё и в институте прогуливал пары программирования ЁмаЁ аж стыдно стало

Edit: Почему оно выдаёт имя как NoName ?

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

Edred
Posted: Sun Sep 09, 2007 0:03 Post subject:


А ты уверен, что твоего чара зовут по-другому? :lol:

Наверное, функция GetName работает неправильно. Попробуй кликнуть на себя перед взятием имени.

Code: Select all

program TestName; 
begin 
   ClickOnObject(self); 
   wait(500); 
   AddToSystemJournal(GetName(self)); 
end.
Last edited by Edred on 05.02.2008 14:36, edited 1 time in total.
Edred
Moderator
Moderator
Posts: 559
Joined: 28.03.2006 21:29

Post by Edred »

-=JoKeR=-
Posted: Sun Sep 09, 2007 3:22 Post subject:

Edred wrote:А ты уверен, что твоего чара зовут по-другому?

Уверен =))

То же самое выдаёт Кстати уже не один я с такой проблемой, ещё один чел который со мной играет тоже столкнулся с ней. Ему тоже выдаёт NoName .

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

Edred
Posted: Sun Sep 09, 2007 11:56 Post subject:


Значит, GetName не работает. Ну что ж, делай обходным путем. Через тот способ, который был в мининге закомментарен. То есть в начале скрипта прописывай серийники чаров в константы, а в автоопределении чара сравнивай сериал текущего чара (self) c этими константами и загружай соответствующий файл.

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

-=JoKeR=-
Posted: Mon Sep 17, 2007 15:35 Post subject:


Ещё трабл =( После сэйва выдаёт такое в сисжурнале Error Server_MoveRequest: MoveRequest = Nil
Подхожу левым чаром к этому лесорубу когда он спокойно себе рубит деревья....говорю World save has been initiated. и наблюдаю картину....чар добегает сначала до дерева, а потом уже только ждёт пока закончиться сэйв.

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

Edred
Posted: Mon Sep 17, 2007 19:49 Post subject:


Наверное. Счас плохо помню, но, кажется, в этой версии я не делал защиты от приколистов. Просто не надо было - на FW если кто подходил к чару в лесу - он просто килял его, а не прикалывался над ним.

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

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

-=JoKeR=-
Posted: Tue Sep 18, 2007 0:57 Post subject:


Дело не в приколистах =) У нас и щас если кто увидит бота на макросе сразу киляет его. Дело в том, что при сэйве скрипт збивается....чар тупо упёрся в дерево и никуда не хочет идти...то есть проверка на сэйв идёт после того как чар дойдёт до какой-либо точки.
Объясняю ситуацию:
Во время сэйва, в тот момент, когда чар идёт к другому дереву чтоб порубить, чар не останавливается чтобы подождать пока закончиться сэйв, он хочет сначала дойти до дерева и уже возле него подождать конца сэйва. А когда сэйв заканчивается, чар упирается в какое-либо дерево, стоящее у него на пути, и не хочет больше ничё делать.

Это как-то лечиться?

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

Edred
Posted: Tue Sep 18, 2007 1:43 Post subject:


В процедуру GotoXY вставь в начало CheckSave вот так:

Code: Select all

procedure GotoXY(x,y,prec : integer; runflag : boolean); 
// x,y - координаты, в которые идем 
// prec - точность подхода 
// runflag - бежать или идти 
// v. 1.04 (с) Edred, скрипт портирован с инжекта 
// оригинальная версия Yoko с доработкой AGRS и Edred. 
var ld, ldc, dx, dy, mx, my : Integer; 
begin 
   ld := 0; ldc := 0; 
   while true do 
   begin 
      CheckSave; 
      dx := GetX(self) - x; if dx < 0 then dx := 0 - dx; 
      dy := GetY(self) - y; if dy < 0 then dy := 0 - dy; 
И попробуй. Напиши о результатах, если поможет - поправлю скрипт в первом посте.

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

-=JoKeR=-
Posted: Tue Sep 18, 2007 23:09 Post subject:


Вставил...посмотрел на два сэйва и не заметил пока что фтыкания в дерево.....вробе проблема решена, если что отпишусь что не так.
Спасиба
MeLFiS
Novice
Novice
Posts: 147
Joined: 02.02.2008 12:21

Post by MeLFiS »

а можна ли будет его настроить под пол ??Или слижком много нада убирать и менять потомушо например умирать я не буду реги мне тоже не нужны просто ходил рубил и складывал все в сундук
Edred
Moderator
Moderator
Posts: 559
Joined: 28.03.2006 21:29

Post by Edred »

Возможно все. Но только без меня - я уже больше года не играю и не пишу скриптов. Но если тебя не интересует только смерть - так тут проблем нет, ничего перенастраивать не надо. Ведь к кресту чар идет только если умирает, а если он умирать не собирается - то эта ветка мешать не будет.
Chepka
Neophyte
Neophyte
Posts: 40
Joined: 04.12.2005 23:19
Contact:

Post by Chepka »

а как зделать чтобі чар подходя к дереву перед тем как рубить становился в хайд?
+ при запуске выдаёт

Code: Select all

11:42:35 [chep]: Compiler: [Error] (lumber.sc at 1:1):  Syntax error
11:42:35 [chep]: Compiling failed
11:42:35 [chep]: Script lumber.sc stoped successfuly
имя програмы менял на более простое всёравно выбивает:(
Acronym
Novice
Novice
Posts: 114
Joined: 10.05.2005 18:42
Location: Odessa, NDW
Contact:

Post by Acronym »

1)В папке Demo есть простейший скрипт на Hiding.
Да и в поиске навалом информации.
простейший вариант:

Code: Select all

UseSkill('Hiding');
wait(10000);
2)
Покажи первую строчку файла lumber.sc который ты запускаешь и в котором вылазит ошибка.
aka Trickster [YGG]
current version: 1.0 [RC3]
Edred
Moderator
Moderator
Posts: 559
Joined: 28.03.2006 21:29

Post by Edred »

Только что в разделе хелп обсуждалась точно такая же ситуация (с ошибкой в первой строке ламбера) и был дан способ успешного решения проблемы.
Chepka
Neophyte
Neophyte
Posts: 40
Joined: 04.12.2005 23:19
Contact:

Post by Chepka »

ту тему я создал) хайд выдрал из скрипта на майнинг и вставил по аналогии:) работает просто супер:)
Insomnia
Posts: 3
Joined: 06.04.2008 7:48

Post by Insomnia »

Exception: '' is not a valid integer
Не могу понять в чем проблема.
Передовала этой проблеме трабла с распознаванием имени.
-=JoKeR=-
Novice
Novice
Posts: 153
Joined: 10.02.2008 11:19
Location: [Forest Wars] Ode$$a

Post by -=JoKeR=- »

Insomnia
так покажи кусочек скрипта где ошибка
Insomnia
Posts: 3
Joined: 06.04.2008 7:48

Post by Insomnia »

Фишка в том, что я пробовал запускать не измененный скрипт, т.е. тот, который выложен тут. Получил ту же ошибку.
Insomnia
Posts: 3
Joined: 06.04.2008 7:48

Post by Insomnia »

Поспал, попил кофе, покурил, попробовал:
Очистить файлы маршрута и реса, т.е. сделать их пустыми.
Скрипт загрузился.

Вот мои файлы маршрута:

Code: Select all

1430 1401 0 0 0 0
1429 1418 0 0 0 0
1428 1418 3283 1428 1419 0
1424 1418 3277 1424 1419 0
1420 1418 3290 1420 1419 0
1416 1418 3296 1416 1419 0 
1404 1418 3293 1404 1419 0
1404 1414 3293 1404 1413 0
1408 1414 3277 1408 1413 0
1412 1414 3283 1412 1413 0
1414 1414 0 0 0 0
1413 1415 0 0 0 0
1416 1415 0 0 0 0
1416 1414 3296 1416 1413 0
1420 1414 3283 1420 1413 0
1428 1414 0 0 0 0
1428 1415 3277 1428 1416 0
1429 1415 0 0 0 0
1429 1408 0 0 0 0
1428 1408 3283 1428 1407 0
1420 1408 3290 1420 1407 0
1416 1408 3277 1416 1407 0
1412 1407 3283 1412 1407 0
1401 1408 0 0 0 0
1401 1410 3277 1400 1410 0
1401 1407 3280 1400 1407 0
1401 1405 0 0 0 0
1396 1405 3296 1396 1404 0
1408 1405 3296 1408 1404 0
1412 1405 3280 1412 1404 0
1416 1405 3290 1416 1404 0
1424 1405 3277 1424 1404 0
1429 1405 0 0 0 0 
1430 1401 0 0 0 0
Рес

Code: Select all

1397 1424 1 0 0 0
1397 1472 10 0 0 0
1392 1472 10 0 0 0
1394 1496 10 0 0 0
1388 1495 10 0 0 0
1434 1495 28 0 0 0
1434 1444 0 0 0 0
1433 1444 0 0 0 0
1433 1406 0 0 0 0 
1430 1406 0 0 0 0
1430 1401 0 0 0 0
С пустыми файлами маршрута и реса скрипт запустился, т.е. бока в них. Вопрос - в чем?
scf
Neophyte
Neophyte
Posts: 20
Joined: 06.02.2008 11:56

Post by scf »

Скорее всего не убраны пробелы в конце строк
Post Reply