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

TargetToTile для рубки деревьев

тут можно задать вопрос по скриптингу
Fullmetal8ender
Neophyte
Neophyte
Posts: 20
Joined: 27.07.2009 17:11

TargetToTile для рубки деревьев

Post by Fullmetal8ender »

Хотелось бы использовать ТargetToTile(TileModel: Word; X,Y,Z: Integer) для рубки дерева.
Идея такая. Юзаю топор - появляеться прицел.
Вот теперь надо определить куда им тыкнуть.
Координаты тайла определяю как x=GetX, y=GetY+1 (соседний тайл от того, на котором я стою), z=GetZ
Не могу понять что надо подставить вместо TileModel: Word?
Или как можна определить дерево?
Mirage
Novice
Novice
Posts: 90
Joined: 18.07.2009 19:41

Re: TargetToTile для рубки деревьев

Post by Mirage »

Fullmetal8ender wrote:Хотелось бы использовать ТargetToTile(TileModel: Word; X,Y,Z: Integer) для рубки дерева.
Идея такая. Юзаю топор - появляеться прицел.
Вот теперь надо определить куда им тыкнуть.
Координаты тайла определяю как x=GetX, y=GetY+1 (соседний тайл от того, на котором я стою), z=GetZ
Не могу понять что надо подставить вместо TileModel: Word?
Или как можна определить дерево?
Если не изменяет память то в инжекте есть команда
,infotile
при кликанье выдающее следующее

3286 5996 1501 1

дерево х у z
тайл дерева первое число.
grundick
Developer
Developer
Posts: 272
Joined: 31.01.2008 21:16

Post by grundick »

пурги какой то понаписал )
Last edited by grundick on 16.08.2009 21:21, edited 2 times in total.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

я ни на что не намекаю, но исследование таких стелсовых команд, как

Code: Select all

function ReadStaticsXY(X,Y: Word; WorldNum: Byte): TStaticCell; // Возвращает слои статики по координатам

TStaticCell = packed record 
Statics : Array of TStaticItem; 
StaticCount : Byte; 
end; 

TStaticItem = record 
Tile : Word; 
X : Byte; 
Y : Byte; 
Z : ShortInt; 
Color : Word; 
end; 

function GetStaticTileData(Tile: Word): TStaticTileData; // Возвращает информацию по типу тайла 

TStaticTileData = record 
Flags : LongWord; 
Weight : Byte; 
Quality : Byte; 
wUnknown: Word; 
bUnknown: Byte; 
Quantity: Byte; 
AnimID : Word; 
bSpacer : Byte; 
Hue : Byte; 
wSpacer : Word; 
Height : Byte; 
Name : Array[0..19] of Char; 
end;
могло бы навести на некоторые интересные мысли...
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
grundick
Developer
Developer
Posts: 272
Joined: 31.01.2008 21:16

Post by grundick »

навело )
Избавляемся от инжекта )

Следующий скрипт предназначен для автоматического поиска и пометки деревьев. Зона поиска - квадрат, размером 180х180 тайлов , центр которого - координаты чара при запуске скрипта. Ищите поляну с неоходимым кол-вом деревьев, ставите чара примерно посреди этой поляны и запускаете скрипт. По спирали, начиная от координат чара, проверяются тайлы и если найдено дерево, чар идёт у нему. Если смог дойти- дерево сохраняется в файл. Сохраняется в виде
Type X Y Z в файле C:/StealthTrees.dat . Собвсвенно , от Вас требуется настроить параметр MaxTreesNumber. И ещё. Скрипт писался на коленке, тольком не проверялся. Вполне возможно, что какие то типы тайлов я упустил, а какие то вписал лишние. Поэтому, если какие то типы Ваш чар не сможет рубить (сообщение типа It appears immune to blow), попытайтесь обнаружить этот тип и сообщите об этом общественности )

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

Code: Select all

Program FindTreesAndSaveTheyInFile;

var
treeTile: array [0 .. 34] of word;
myX, myY :    word;
x, y     :    word;
treesNumber , Range : integer;
List : TStringList; 


Const
   MaxTreesNumber=200;         // Максимальное кол-во деревьев, которое нам нужно пометить. ))) Пометить :)   
   
   MaxRange=180;                  // зона поиска деревьев. 
   TypesCount = 34;            // Количество типов деревьев в нашем массиве.

// checks tile. if that what we need, it save file parameters in text file.
function CheckTile(x,y : word): boolean;
var
   Tile0: TStaticCell;
   LayersCount: word;
   i,j: integer;
      
Begin
Result:=false;
Tile0:=ReadStaticsXY(X,Y,WorldNum); 
LayersCount:=GetLayerCount(X,Y,WorldNum);

i:=0;
While i < LayersCount Do
   begin
   For j:=0 to TypesCount do
       If Tile0.Statics[i].Tile=TreeTile[j] then
           begin
	   //AddToSystemJournal('Tree founded!');
           If moveXY(X,Y,false,1,true) then 
	      begin
	         List.Add(IntToStr(Tile0.Statics[i].Tile)+' '+IntToStr(X)+' '+IntToStr(Y)+' '+IntToStr(Tile0.Statics[i].Z));
                 List.SaveToFile('C:/StealthTrees.dat');
		 treesNumber:= treesNumber+1;
                 If (treesNumber >= MaxTreesNumber)  then 
		    begin  
		    AddToSystemJournal('Пометили достаточное количество деревьев!');  
		    Result:= true; 
		    Exit; 
		    end;
	      end;
	   end;
   i := i+1;
   end;
End;

BEGIN
TreeTile[0]:=3274; 
TreeTile[1]:=3275; 
TreeTile[2]:=3276; 
TreeTile[3]:=3277;

TreeTile[4]:=3280; 
TreeTile[5]:=3283; 
TreeTile[6]:=3286; 
TreeTile[7]:=3288;

TreeTile[8]:=3290; 
TreeTile[9]:=3293; 
TreeTile[10]:=3296; 
TreeTile[11]:=3299;

TreeTile[12]:=3302; 
TreeTile[13]:=3320; 
TreeTile[14]:=3323; 
TreeTile[15]:=3326; 
TreeTile[16]:=3329;
TreeTile[17]:=3393;
TreeTile[18]:=3394; 
TreeTile[19]:=3395; 
TreeTile[20]:=3396;

TreeTile[22]:=3438; 
TreeTile[23]:=3439; 
TreeTile[24]:=3440; 
TreeTile[25]:=3441; 
TreeTile[26]:=3442; 
TreeTile[27]:=3460; 
TreeTile[28]:=3462; 
TreeTile[29]:=3476;
TreeTile[30]:=3480;
TreeTile[31]:=3484;
TreeTile[32]:=3488;
TreeTile[33]:=3492;
TreeTile[34]:=3496;

List := TStringList.Create;

Range:=1;
TreesNumber:=0;
myX:=getX(self);
myY:=getY(self);

While Range < maxRange do
   begin
   y:= myY-range;
   For x:= myX-range to myX+range do begin If CheckTile(x,y) then break ; end; 
   If treesNumber >= MaxTreesNumber  then break;

   x:= myX+range;
   For y:= myY-range+1 to myY+range  do begin If CheckTile(x,y) then break ; end; 
   If treesNumber >= MaxTreesNumber  then break;

   y:= myY+range;
   For x:= myX+range-1 downTo myX-range do begin If CheckTile(x,y) then break ; end; 
   If treesNumber >= MaxTreesNumber then break;

   x:=myX-range;
   For y:= myY+range-1 downTo myY-range+1 do begin If CheckTile(x,y) then break ; end; 
   If treesNumber >= MaxTreesNumber then break;

   Range:= Range+1;
   end;

List.Clear;
END.
Last edited by grundick on 16.08.2009 9:40, edited 2 times in total.
Mirage
Novice
Novice
Posts: 90
Joined: 18.07.2009 19:41

Post by Mirage »

Странно У меня тайлов деревьев тоже 34 но они другие:

Code: Select all

R[1] = 3274;
R[2] = 3275;
R[3] = 3276;
R[4] = 3277;
R[5] = 3280;
R[6] = 3283;
R[7] = 3286;
R[8] = 3288;
R[9] = 3290;
R[10] = 3293;
R[11] = 3296;
R[12] = 3299;
R[13] = 3302;
R[14] = 3320;
R[15] = 3323;
R[16] = 3326;
R[17] = 3329;
R[18] = 3393;
R[19] = 3394;
R[20] = 3395;
R[21] = 3396;
R[22] = 3415;
R[23] = 3416;
R[24] = 3417;
R[25] = 3418;
R[26] = 3419;
R[27] = 3438;
R[28] = 3439;
R[29] = 3440;
R[30] = 3441;
R[31] = 3442;
R[32] = 3460;
R[33] = 3461;
R[34] = 3462;
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

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

Code: Select all

	if (theobj == 0x0c95 or theobj == 0x0c96 or theobj == 0x0c9e)
		return 1;
	elseif (theobj == 0x0ca8 or theobj == 0x0caa or theobj == 0x0cab)
		return 1;
	elseif (theobj >= 0x0cc8 and theobj <= 0x0cea)
		return 1;
	elseif (theobj >= 0x0cf8 and theobj <= 0x0d03)
		return 1;
	elseif (theobj == 0x0d37 or theobj == 0x0d38)
		return 1;
	elseif (theobj >= 0x0d41 and theobj <= 0x0dab)
		return 1;
	elseif (theobj >= 0x12b6 and theobj <= 0x12c7)
		return 1;
а уж в какую графику будут закутаны эти деревья - это дело такое...
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
grundick
Developer
Developer
Posts: 272
Joined: 31.01.2008 21:16

Post by grundick »

А нам плевать что серверу наплевать )
Главное чтоб деревья рубились )
ЧТо, никто даже не удосужился потесттиь? Ужас!
Mirage
Novice
Novice
Posts: 90
Joined: 18.07.2009 19:41

Post by Mirage »

grundick wrote:А нам плевать что серверу наплевать )
Главное чтоб деревья рубились )
ЧТо, никто даже не удосужился потесттиь? Ужас!
:shock: Это не скорипт это писец. Чар как угорелый метается от дерева к дереву... Клево :lol: Вроде работает.
Tomers
Novice
Novice
Posts: 99
Joined: 06.08.2009 11:51

Re: TargetToTile для рубки деревьев

Post by Tomers »

Fullmetal8ender wrote:Хотелось бы использовать ТargetToTile(TileModel: Word; X,Y,Z: Integer) для рубки дерева.
Идея такая. Юзаю топор - появляеться прицел.
Вот теперь надо определить куда им тыкнуть.
Координаты тайла определяю как x=GetX, y=GetY+1 (соседний тайл от того, на котором я стою), z=GetZ
Не могу понять что надо подставить вместо TileModel: Word?
Или как можна определить дерево?
На вопрос ответили четко и конкретно. Вобщем как всегда тут :?
Mirage
Novice
Novice
Posts: 90
Joined: 18.07.2009 19:41

Re: TargetToTile для рубки деревьев

Post by Mirage »

Tomers wrote:На вопрос ответили четко и конкретно. Вобщем как всегда тут :?
Это к чему? :?
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: TargetToTile для рубки деревьев

Post by Vizit0r »

Tomers wrote:
Fullmetal8ender wrote:Хотелось бы использовать ТargetToTile(TileModel: Word; X,Y,Z: Integer) для рубки дерева.
Идея такая. Юзаю топор - появляеться прицел.
Вот теперь надо определить куда им тыкнуть.
Координаты тайла определяю как x=GetX, y=GetY+1 (соседний тайл от того, на котором я стою), z=GetZ
Не могу понять что надо подставить вместо TileModel: Word?
Или как можна определить дерево?
На вопрос ответили четко и конкретно. Вобщем как всегда тут :?
ответили. а то что именно для тебя не расписали на страницу - увы и ах.
да, тут всегда так. все злюки и жадины.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
WladL
Apprentice
Apprentice
Posts: 240
Joined: 27.07.2009 17:21
Location: DRW
Contact:

Re: TargetToTile для рубки деревьев

Post by WladL »

Mirage wrote:
Fullmetal8ender wrote:Хотелось бы использовать ТargetToTile(TileModel: Word; X,Y,Z: Integer) для рубки дерева.
Идея такая. Юзаю топор - появляеться прицел.
Вот теперь надо определить куда им тыкнуть.
Координаты тайла определяю как x=GetX, y=GetY+1 (соседний тайл от того, на котором я стою), z=GetZ
Не могу понять что надо подставить вместо TileModel: Word?
Или как можна определить дерево?
Если не изменяет память то в инжекте есть команда
,infotile
при кликанье выдающее следующее

3286 5996 1501 1

дерево х у z
тайл дерева первое число.
Вот же тебе ответили, четко и ясно.
Для тех кто в танке последние строки могу переписать так:

Code: Select all

тайл_модель х у z
тайл_модель(модель дерева) - это первое число, его и подставляй.
лио для динамического получения модели вот тебе написал Grundick
function CheckTile(x,y : word): boolean;
Tomers
Novice
Novice
Posts: 99
Joined: 06.08.2009 11:51

Re: TargetToTile для рубки деревьев

Post by Tomers »

Vizit0r wrote: ответили. а то что именно для тебя не расписали на страницу - увы и ах.
да, тут всегда так. все злюки и жадины.
Дело не в том, что не ответили. Ответить то ответили, но вопрос задается, например, как получить тип тайла, а начинают рассказывать про то, как ходить по лесу, записывать маршруты ... и т.д., советуют использовать инжекты, всякую прочую хрень, но только не то, что конкретно спросили.
Вобщем ладно, не обращайте внимания. Это просто я такой тупой, мне почему-то полсотни строк труднее понять, чем одну две строки.
Fullmetal8ender
Neophyte
Neophyte
Posts: 20
Joined: 27.07.2009 17:11

Post by Fullmetal8ender »

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

Поправте если ошибаюсь где-то
Деревко можна определить с помощью

Code: Select all

function ReadStaticsXY(X,Y: Word; WorldNum: Byte): TStaticCell; // Возвращает тип тайла с координатами и цветом, а так же количество слоев
TStaticCell = packed record 
Statics : Array of TStaticItem; 
StaticCount : Byte; 
end; 

TStaticItem = record 
Tile : Word; 
X : Byte; 
Y : Byte; 
Z : ShortInt; 
Color : Word; 
end;
Где
x=GetX,
y=GetY+1.
WorldNum=0
Запускаю функцию, и получаю все о тайле...осталось вытянуть это все из записи.
Если я записывал

Code: Select all

a := ReadStaticsXY(X,Y: Word; WorldNum: Byte): TStaticCell;
то a.Statics[0].X, a.Statics[0].Y, a.Statics[0].Z, a.Statics[0].Tile это те значения которые нужно подставить в
ТargetToTile(TileModel: Word; X,Y,Z: Integer)?

В ходе столкнулся с тем, что не совсем умею работать с записями типа TStaticCell.
Вот в даном случае Statics : Array of TStaticItem; - это часть TStaticCell? Сколькомерный это массив? x y z tile colr это его элементы? Что еще за тогда?
Post Reply