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

Народ подскажите по скрипту наCamping.

тут можно задать вопрос по скриптингу
Post Reply
Daimond
Neophyte
Neophyte
Posts: 10
Joined: 15.03.2017 13:12

Народ подскажите по скрипту наCamping.

Post by Daimond »

Code: Select all

Program camping;

 {$Include 'all.inc'}
/// Настройки ///
const
RadiusX=20;
RadiusY=20;
Axe=$0F51;//кинжал
StartXY=true;
StartX=3615;// Обязательно заполните эти значения
StartY=2389;// .where вам в помощь
//Remake of lumber script by Rabies by Daimond


type
TreeRecord = Record
  t,x,y: integer;
  end;

var
TreeTile: array[0..50] of integer;
TreePlace: array[0..500] of TreeRecord;
TreeCount: integer;
x,y,c,a,s: integer;


procedure CheckCon;
begin
if Connected=False then
  begin;
   repeat
    Wait(1000);
   until Connected=True;
   Wait(5000);
  end;
end;

function CheckTool: boolean;
begin
CheckCon;
FindType(Axe, backpack);
  if (dead=false) and (FindCount = 0) and (ObjAtLayer(LHandLayer) = 0) then
   begin
    AddToSystemJournal('Нет кинжала');//что было бы странно впрочем
    s:=0;
    result:=false;
   end
  else
    result:=true;      
end;


procedure CheckTree;
var
LCount: integer;
t,i: integer;
TTile: TStaticCell;

begin
TTile:=ReadStaticsXY(x, y, worldnum);
LCount:=GetLayerCount(x, y, worldnum);
i:=0;
  while i < LCount do
   begin
    for t:=0 to 227 do
     begin
      if TTile.Statics[i].Tile=TreeTile[t] then
       begin
        TreePlace[c].t:=TTile.Statics[i].Tile;
        TreePlace[c].x:=x;
        TreePlace[c].y:=y;
        c:=c+1;
       end;
     end;
    i:=i+1;
   end;  
end;


procedure FindTree;
begin
for x:=GetX(self)-RadiusX to GetX(self)+RadiusX do
  if x mod 2 = 0 then
   begin
    for y:=GetY(self)-RadiusY to GetY(self)+RadiusY do
     CheckTree;
   end
  else
   begin
    for y:=GetY(self)+RadiusY downto GetY(self)-RadiusY do
     CheckTree;
   end;  
TreeCount:=c-1;
end;  


procedure DropKindle;
begin
wait(500);
FindType($0DE1,Backpack);
if FindCount > 0 then Drophere(finditem);  
end;

procedure BurnKindle;
begin
wait(500);
FindType($0DE1,Ground);
while (FindCount > 0) and (not Dead) do 
begin
  FindType($0DE1,Ground);
  if FindCount > 0 then     
    begin 
     useobject(finditem); 
     wait(500); 
    end;
end;
end;

  
procedure Lumber;
var
t: TDateTime;
i:integer;

begin
for a:=0 to TreeCount do
  begin  
  Hungry(1,backpack);
   CheckCon;
   t:=now;
   newMoveXY(TreePlace[a].x, TreePlace[a].y, true, 1, false);
   if TargetPresent then CancelTarget;
   if ObjAtLayer(LHandLayer) = 0 then
    Wait(2000);  
   if (CheckTool=true) and (Dead=false) then
    begin
     for i:= 0 to 5 do //надо бы парсить журнал, но мне в лом =) так что просто 30 раз будем ковырять дерево.
      begin
       WaitTargetTile(TreePlace[a].t, TreePlace[a].x, TreePlace[a].y, 0);
       UseType(Axe, $FFFF);
       wait(5000);
      end;
     DropKindle;
     BurnKindle; 
    end
   else break;    
  end;
end;


begin
c:=0;
s:=1;
TreeTile[0]:=3230;
TreeTile[1]:=3240;
TreeTile[2]:=3242;
TreeTile[3]:=3243;
TreeTile[4]:=3225;
TreeTile[5]:=3226;
TreeTile[6]:=3227;
TreeTile[7]:=3228;
TreeTile[8]:=3229;
TreeTile[9]:=3230;
TreeTile[10]:=3231;
TreeTile[11]:=3232;
TreeTile[12]:=3233;
TreeTile[13]:=3234;
TreeTile[14]:=3235;
TreeTile[15]:=3236;
TreeTile[16]:=3237;
TreeTile[17]:=3238;
TreeTile[18]:=3239;
TreeTile[19]:=3240;
TreeTile[20]:=3241;
TreeTile[21]:=3242;
TreeTile[22]:=3243;
TreeTile[23]:=3244;
TreeTile[24]:=3245;
TreeTile[25]:=3246;
TreeTile[26]:=3247;
TreeTile[27]:=3248;
TreeTile[28]:=3249;
TreeTile[29]:=3250;
TreeTile[30]:=3251;
TreeTile[31]:=3252;
TreeTile[32]:=3253;
TreeTile[33]:=3254;
TreeTile[34]:=3255;
TreeTile[35]:=3256;
TreeTile[36]:=3257;
TreeTile[37]:=3258;
TreeTile[38]:=3259;
TreeTile[39]:=3260;
TreeTile[40]:=3261;
TreeTile[41]:=3262;
TreeTile[42]:=3263;
TreeTile[43]:=3264;
TreeTile[44]:=3265;
TreeTile[45]:=3266;
TreeTile[46]:=3267;
TreeTile[47]:=3268;
TreeTile[48]:=3269;
TreeTile[49]:=3270;
TreeTile[50]:=3271;
TreeTile[51]:=3272;
TreeTile[52]:=3273;
TreeTile[53]:=3274;
TreeTile[54]:=3275;
TreeTile[55]:=3276;
TreeTile[56]:=3277;
TreeTile[57]:=3278;
TreeTile[58]:=3279;
TreeTile[59]:=3280;
TreeTile[60]:=3281;
TreeTile[61]:=3282;
TreeTile[62]:=3283;
TreeTile[63]:=3284;
TreeTile[64]:=3285;
TreeTile[65]:=3286;
TreeTile[66]:=3287;
TreeTile[67]:=3288;
TreeTile[68]:=3289;
TreeTile[69]:=3290;
TreeTile[70]:=3291;
TreeTile[71]:=3292;
TreeTile[72]:=3293;
TreeTile[73]:=3294;
TreeTile[74]:=3295;
TreeTile[75]:=3296;
TreeTile[76]:=3297;
TreeTile[77]:=3298;
TreeTile[78]:=3299;
TreeTile[79]:=3300;
TreeTile[80]:=3301;
TreeTile[81]:=3302;
TreeTile[82]:=3303;
TreeTile[83]:=3304;
TreeTile[84]:=3305;
TreeTile[85]:=3306;
TreeTile[86]:=3315;
TreeTile[87]:=3316;
TreeTile[88]:=3317;
TreeTile[89]:=3318;
TreeTile[90]:=3319;
TreeTile[91]:=3320;
TreeTile[92]:=3321;
TreeTile[93]:=3322;
TreeTile[94]:=3323;
TreeTile[95]:=3324;
TreeTile[96]:=3325;
TreeTile[97]:=3326;
TreeTile[98]:=3327;
TreeTile[99]:=3328;
TreeTile[100]:=3329;
TreeTile[101]:=3330;
TreeTile[102]:=3331;
TreeTile[103]:=3393;
TreeTile[104]:=3394;
TreeTile[105]:=3395;
TreeTile[106]:=3396;
TreeTile[107]:=3397;
TreeTile[108]:=3398;
TreeTile[109]:=3399;
TreeTile[110]:=3400;
TreeTile[111]:=3401;
TreeTile[112]:=3402;
TreeTile[113]:=3403;
TreeTile[114]:=3404;
TreeTile[115]:=3405;
TreeTile[116]:=3406;
TreeTile[117]:=3407;
TreeTile[118]:=3408;
TreeTile[119]:=3409;
TreeTile[120]:=3410;
TreeTile[121]:=3411;
TreeTile[122]:=3412;
TreeTile[123]:=3413;
TreeTile[124]:=3414;
TreeTile[125]:=3415;
TreeTile[126]:=3416;
TreeTile[127]:=3417;
TreeTile[128]:=3418;
TreeTile[129]:=3419;
TreeTile[130]:=3420;
TreeTile[131]:=3421;
TreeTile[132]:=3422;
TreeTile[133]:=3423;
TreeTile[134]:=3424;
TreeTile[135]:=3425;
TreeTile[136]:=3426;
TreeTile[137]:=3427;
TreeTile[138]:=3428;
TreeTile[139]:=3429;
TreeTile[140]:=3430;
TreeTile[141]:=3431;
TreeTile[142]:=3432;
TreeTile[143]:=3433;
TreeTile[144]:=3434;
TreeTile[145]:=3435;
TreeTile[146]:=3436;
TreeTile[147]:=3437;
TreeTile[148]:=3438;
TreeTile[149]:=3439;
TreeTile[150]:=3440;
TreeTile[151]:=3441;
TreeTile[152]:=3442;
TreeTile[153]:=3443;
TreeTile[154]:=3444;
TreeTile[155]:=3445;
TreeTile[156]:=3446;
TreeTile[157]:=3447;
TreeTile[158]:=3448;
TreeTile[159]:=3449;
TreeTile[160]:=3450;
TreeTile[161]:=3451;
TreeTile[162]:=3452;
TreeTile[163]:=3453;
TreeTile[164]:=3454;
TreeTile[165]:=3455;
TreeTile[166]:=3456;
TreeTile[167]:=3457;
TreeTile[168]:=3458;
TreeTile[169]:=3459;
TreeTile[170]:=3460;
TreeTile[171]:=3461;
TreeTile[172]:=3462;
TreeTile[173]:=3463;
TreeTile[174]:=3464;
TreeTile[175]:=3465;
TreeTile[176]:=3466;
TreeTile[177]:=3467;
TreeTile[178]:=3468;
TreeTile[179]:=3469;
TreeTile[180]:=3470;
TreeTile[181]:=3471;
TreeTile[182]:=3472;
TreeTile[183]:=3473;
TreeTile[184]:=3474;
TreeTile[185]:=3475;
TreeTile[186]:=3476;
TreeTile[187]:=3477;
TreeTile[188]:=3478;
TreeTile[189]:=3479;
TreeTile[190]:=3480;
TreeTile[191]:=3481;
TreeTile[192]:=3482;
TreeTile[193]:=3483;
TreeTile[194]:=3484;
TreeTile[195]:=3485;
TreeTile[196]:=3486;
TreeTile[197]:=3487;
TreeTile[198]:=3488;
TreeTile[199]:=3489;
TreeTile[200]:=3490;
TreeTile[201]:=3491;
TreeTile[202]:=3492;
TreeTile[203]:=3493;
TreeTile[204]:=3494;
TreeTile[205]:=3495;
TreeTile[206]:=3496;
TreeTile[207]:=3497;
TreeTile[208]:=3498;
TreeTile[209]:=3499;
TreeTile[210]:=4790;
TreeTile[211]:=4791;
TreeTile[212]:=4792;
TreeTile[213]:=4793;
TreeTile[214]:=4794;
TreeTile[215]:=4795;
TreeTile[216]:=4796;
TreeTile[217]:=4797;
TreeTile[218]:=4798;
TreeTile[219]:=4799;
TreeTile[220]:=4800;
TreeTile[221]:=4801;
TreeTile[222]:=4802;
TreeTile[223]:=4803;
TreeTile[224]:=4804;
TreeTile[225]:=4805;
TreeTile[226]:=4806;
TreeTile[227]:=4807;


CheckCon;

if StartXY=true then
  MoveXY(StartX, StartY, true, 0, false);

FindTree;
AddToSystemJournal('Найдено деревьев: '+IntToStr(TreeCount));

while (s=1) and (CheckTool=true) do
begin
  if StartXY=true then if Dead then 
   begin
    wait(20000); 
    uosay('Сдох');
    wait(10000);
    if (not Dead) then MoveXY(StartX, StartY, true, 0, false);
   end;
  Lumber;
end;
SetARStatus(false);
Disconnect;
  
end.
Народ выдает вот такую ошибку : Out Of Range at 0.1009

Если ставлю меньше тайлов то начинает ходить и пытаться рубить ветки рубит только на некоторых деревьях.
и можно как не будь добавить чтоб видел текст в журнале при котором будет переходить к другому дереву и удалять журнал чтоб не видел повторно в журнале эту надпись при перепроверке, а не по количеству тыков
Gauhar
Novice
Novice
Posts: 87
Joined: 08.07.2008 17:40

Re: Народ подскажите по скрипту наCamping.

Post by Gauhar »

Ну так твой TreeTile ограничен 50, а используется 227.
TreeTile: array[0..50] of integer;
заменить на
TreeTile: array[0..227] of integer;
Daimond
Neophyte
Neophyte
Posts: 10
Joined: 15.03.2017 13:12

Re: Народ подскажите по скрипту наCamping.

Post by Daimond »

во спасибо огромное а то я голову ломаю
Daimond
Neophyte
Neophyte
Posts: 10
Joined: 15.03.2017 13:12

Re: Народ подскажите по скрипту наCamping.

Post by Daimond »

Блин не пойму тайл есть дерева, а рубить не хочет к дереву подходит и не рубит. Если тыркнуть руками на дагер а потом на дерево то режет щепу. В чем может быть проблема ?
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Народ подскажите по скрипту наCamping.

Post by nah nah »

с виду всё нормально, кроме проверяемого слоя. двуручный топор находится в левой руке, а вот дагер - одноручная штука, он будет в правой руке.
Daimond
Neophyte
Neophyte
Posts: 10
Joined: 15.03.2017 13:12

Re: Народ подскажите по скрипту наCamping.

Post by Daimond »

Пробовал даже вот на таком скрипте:


Code: Select all

Program Lumber;

type
TreeRecord = Record
t,x,y: integer;
end;

var
TreeTile: array[0..50] of integer;
TreePlace: array[0..500] of TreeRecord;
TreeCount: integer;
x,y,c,a,s: integer;

/// Настройки ///
const
RadiusX=10;
RadiusY=10;
Axe=$0F51;
StartXY=false;
StartX=3614;
StartY=2390;
////////////////////


procedure CheckCon;
begin
if Connected=False then
begin;
repeat
Wait(1000);
until Connected=True;
Wait(5000);
end;
end;

function CheckTool: boolean;
begin
CheckCon;
FindType(Axe, backpack);
Wait(1000);
if (dead=false) and (FindQuantity = 0) and (ObjAtLayer(RhandLayer) = 0) then
begin
AddToSystemJournal('Нет топора');
s:=0;
result:=false;
SetARStatus(false);
Disconnect;
end
else
result:=true;
end;


procedure CheckTree;
var
LCount: integer;
t,i: integer;
TTile: TStaticCell;

begin
TTile:=ReadStaticsXY(x, y, WorldNum);
LCount:=GetLayerCount(x, y, WorldNum);
i:=0;
while i < LCount do
begin
for t:=0 to 28 do
begin
if TTile.Statics[i].Tile=TreeTile[t] then
begin
TreePlace[c].t:=TTile.Statics[i].Tile;
TreePlace[c].x:=x;
TreePlace[c].y:=y;
c:=c+1;
end;
end;
i:=i+1;
end;
end;

procedure DropKindle;
begin
wait(500);
FindType($0DE1,Backpack);
if FindCount > 0 then Drophere(finditem);  
end;

procedure BurnKindle;
begin
wait(500);
FindType($0DE1,Ground);
while (FindCount > 0) and (not Dead) do 
begin
  FindType($0DE1,Ground);
  if FindCount > 0 then     
    begin 
     useobject(finditem); 
     wait(500); 
    end;
end;
end;

procedure FindTree;
begin
for x:=GetX(self)-RadiusX to GetX(self)+RadiusX do
if x mod 2 = 0 then
begin
for y:=GetY(self)-RadiusY to GetY(self)+RadiusY do
CheckTree;
end
else
begin
for y:=GetY(self)+RadiusY to GetY(self)-RadiusY do
CheckTree;
end;
TreeCount:=c-1;
end;

procedure Lumber;
var
t: TDateTime;
begin
for a:=0 to TreeCount do
begin
CheckCon;
t:=now;
NewMoveXY(TreePlace[a].x, TreePlace[a].y, true, 1, false);
Wait(1000);
if CheckTool=true then
begin
Equipt(RhandLayer,Axe);
Wait(1000);
UseObject(ObjAtLayerEx(RhandLayer, Axe));
Wait(1000);
UseType(Axe, $FFFF);
Wait(500);
WaitTargetTile(TreePlace[a].t, TreePlace[a].x, TreePlace[a].y, 0);
repeat
Wait(1000);
until (InJournalBetweenTimes('tool|far|no wood|know how', t, now) > 0) or (Connected=False) or (dead);
end
else break;
end;
end;

begin
c:=0;
s:=1;
TreeTile[0]:=3240;
TreeTile[1]:=3242;
TreeTile[2]:=3277;
TreeTile[3]:=3283;
TreeTile[4]:=3286;
TreeTile[5]:=3288;
TreeTile[6]:=3289;
TreeTile[7]:=3290;
TreeTile[8]:=3291;
TreeTile[9]:=3294;
TreeTile[10]:=3296;
TreeTile[11]:=3299;
TreeTile[12]:=3302;
TreeTile[13]:=3393;
TreeTile[14]:=3394;
TreeTile[15]:=3395;
TreeTile[16]:=3396;
TreeTile[17]:=3415;
TreeTile[18]:=3416;
TreeTile[19]:=3417;
TreeTile[20]:=3418;
TreeTile[21]:=3419;
TreeTile[22]:=3438;
TreeTile[23]:=3439;
TreeTile[24]:=3440;
TreeTile[25]:=3441;
TreeTile[26]:=3442;
TreeTile[27]:=3460;
TreeTile[28]:=3461;
TreeTile[29]:=3462;
TreeTile[30]:=3480;
TreeTile[31]:=3482;
TreeTile[32]:=3488;

CheckCon;

if StartXY=true then
NewMoveXY(StartX, StartY, true, 0, false);

FindTree;
AddToSystemJournal('Найдено деревьев: '+IntToStr(TreeCount));

while (s=1) and (not dead) do
Lumber;

end.
менял руки и дагер брал в руку переделал чуть в другом скрипте даже, но все равно не бьет по тайлу по какой-то причине.
вот другой тип скрипта переделывал который выше. появляется таргет и исчезает но пишет надпись в игре:
[22:14:32:229] System: What would you like to use that on?
[22:14:32:760] System: You have lost your tool! It has been broked!
[22:14:32:838] System: You don't know how to use those items together.

Хотя руками все работает. А вот скрипт если руку меняешь подойдет к дереву рубанет и и вырубает клиент.
GeeZeR
Apprentice
Apprentice
Posts: 226
Joined: 28.01.2012 19:48

Re: Народ подскажите по скрипту наCamping.

Post by GeeZeR »

короче вынеси саму рубку в отдельный скрипт и потести, такие простыни трудно читать.
Проверь тайл в котором рубишь, если увидишь "Тайл не имеет слоёв", то нельзя в нём рубить/копать и если в нём копнуть то клиент может вылететь, да.
Скрипт на статистику тайла:

Code: Select all

Program Statistics;
var
    X0,Y0,Z0,Tile: Word;
    TileStatics: TStaticCell;
    C, W0: Byte;
begin

      // X0:=GetX(Self)+2;
      // Y0:=GetY(Self);
      // Z0:=GetZ(Self);
      W0:=WorldNum;

     ClientPrintEx(0, 70, 0, 'Кликни на тайл');

      ClientRequestObjectTarget;
      repeat
        if ClientTargetResponsePresent then begin
          X0:=ClientTargetResponse.X;
          Y0:=ClientTargetResponse.Y;
          Z0:=ClientTargetResponse.Z;
        end;
        wait(500);
      until X0 > 0;

      TileStatics:=ReadStaticsXY(X0,Y0,W0);      
      C:=GetLayerCount(X0,Y0,WorldNum);
      Addtosystemjournal('------------------------------------------------');
      Addtosystemjournal('GetLayerCount = '+IntToStr(c)+' | X = ' +IntToStr(X0)+' | Y = ' +IntToStr(Y0)+' | Z = '+IntToStr(Z0)+' | World = ' +IntToStr(W0));
      If C > 0 then begin
      Addtosystemjournal('Layers = '+IntToStr(TileStatics.StaticCount)+' | Tile = ' +IntToStr(TileStatics.Statics[0].Tile)+' | X = ' +IntToStr(TileStatics.Statics[0].X)+' | Y = ' +IntToStr(TileStatics.Statics[0].Y)+' | Z = ' +IntToStr(TileStatics.Statics[0].Z)+' | Color = ' +IntToStr(TileStatics.Statics[0].Color));
      end else begin
      Addtosystemjournal('Тайл не имеет слоёв (как чёрные тайлы в пещере для мининга), поэтому массив Statics[0] пуст.');
      Addtosystemjournal('и данных "TileStatics.StaticCount", "TileStatics.Statics[0].Tile", "TileStatics.Statics[0].X", "TileStatics.Statics[0].Y)", "TileStatics.Statics[0].Z", "TileStatics.Statics[0].Color" - не существует.');
      end;
      Addtosystemjournal('Tile = ' +IntToStr(GetMapCell(X0,Y0,WorldNum).Tile)+' | Z = ' +IntToStr(GetMapCell(X0,Y0,WorldNum).Z));
      Tile:= (GetMapCell(X0,Y0,WorldNum).Tile);
      Addtosystemjournal('GetTileFlags: ' + IntToStr(GetTileFlags(8,Tile)));
      Addtosystemjournal('Flags = '+IntToHex(GetLandTileData(Tile).Flags,8)+' | TextureID = ' +IntToStr(GetLandTileData(Tile).TextureID));
      Addtosystemjournal('Flags = '+IntToHex(GetStaticTileData(Tile).Flags,8)+' | Weight = ' +IntToStr(GetStaticTileData(Tile).Weight)+' | Height = ' +IntToStr(GetStaticTileData(Tile).Height));

end. 
Покороче вариант, функция возвратит тебе 0 если нельзя копать/рубить, или тип тайла - в нём можно:

Code: Select all

Function ValidTile(X,Y: word):word;
var 
i : word;
TType : TStaticCell;
begin
	TType:=ReadStaticsXY(X,Y,WorldNum);
	if TType.StaticCount > 0 then begin
		for i:=0 to Length(CaveTiles)-1 do begin
			if TType.Statics[0].Tile = CaveTiles[i] then begin
				Result := TType.Statics[0].Tile;
				Exit;
			end;
		end;
	end;
	Result := 0;
end;
Stealth 8.10.2 | Клиент: 7.0.13.4
Post Reply