Скачать последнюю версию библиотеки можно здесь
Для использования библиотеки необходимо положить ее в папку с стелсом а в скрипте импортировать необходимые функции.
Библиотека экспортирует следущие функции:
Code: Select all
function InitMUL(path:PChar):integer; Code: Select all
function GetLayerCount(x, y:word; facet:byte; var LayerCount:byte):boolean;- Возвращает число доступных слоев в данной координате в аргумент LayerCount.
почва всегда слой 0. Остальные слои - статика. Например если это банк, то слои будут почва и крыша (если банк одноэтажный) или если дерево - то ствол и крона (листья)
Code: Select all
function GetTileData(x, y:word; facet:byte; layer:byte; var TileType:word; var z:shortint):boolean; Для нулевого слоя будет возвращена графика тайла почвы (группа 1), для остальных - статического объекта (группа 2).
Code: Select all
function GetTileDetailsA(buf:PChar;bc:integer;grp:byte;tile:word) : integer; grp - группа запрашиваемого объекта: 1 - тайлы,2 - объекты, 3 - анимация (неписи, плееры).
tile - тип объекта (то что обычно передается в инжу и стелс в функцию FindType)
Code: Select all
function GetTileDetailsR(var TileData:TTileData;grp:byte;tile:word) : integer; Code: Select all
    TTileData = record 
      Handle  :LongWord; 
      Tag     :LongWord; 
      Flags   :LongWord; 
      Graphic :word; 
      Weight  :byte; 
      Quality :byte; 
      Quantity:byte; 
      ExtraID :word; 
      Hue     :byte; 
      Height  :byte; 
      Name    :Array[0..19] of Char; 
    end;где:
Handle - внутренний индекс в муле (тиледата)
Tag - хз
Flags - флаги (в сыром виде, надо побитово разложить для актуальных флагов)
Graphic - тип (objecttype для объектов и тайлтайп для тайлов)
Weight - вес
Quality - качество
Quantity - кол-во
ExtraID - индекс доп ресурса (textureid для тайлов, animid для объектов)
Hue - цвет
Height - высота (вместимость контейнера)
Name - имя объекта/тайла
Code: Select all
function GetTileFlags(grp:byte;tile:word) : cardinal; Code: Select all
function ShowRadar():integer; Code: Select all
procedure SetRadarArea(l,t,w,h:integer); Для того чтобы отследить объекты на радаре, необходимо их добавить с помощью
Code: Select all
procedure AddObjects(a:array of TObjCell;n:integer); а - массив объектов типа
Code: Select all
  TObjCell = Record 
    OID:cardinal; 
    GID:word; 
    Quantity,x,y:word; 
    z,grp:byte; 
    tm:TDateTime; 
  end;где OID - ID объекта, GID - тип (графика) объекта, Quantity - для не статики (монстров, НПС, плееров) - цвет Notority (злобность), grp - группа объекта (см выше), tm - используется внутри библиотеки (временной штамп последней модификации, при добавлении игнорируется).
Code: Select all
procedure HideRadar(); Пример объявления библиотеки в скрипте:
Code: Select all
type 
  TTileData = record 
    Handle  :LongWord; 
    Tag     :LongWord; 
    Flags   :LongWord; 
    Graphic :word; 
    Weight  :byte; 
    Quality :byte; 
    Quantity:byte; 
    ExtraID :word; 
    Hue     :byte; 
    Height  :byte; 
    Name    :Array[0..19] of Char; 
  end;
  TObjCell = Record 
    OID:cardinal; 
    GID:word; 
    Quantity,x,y:word; 
    z,grp:byte; 
    tm:TDateTime; 
  end;
function InitMUL(path:PChar):integer; external '[email protected]'; 
function GetLayerCount(x, y:word; facet:byte; var LayerCount:byte):boolean; external '[email protected]'; 
function GetTileDetailsR(TileData:TTileData;grp:byte;tile:word) : integer; external '[email protected]'; 
function GetTileDetailsA(buf:PChar;bc:integer;grp:byte;tile:word) : integer; external '[email protected]'; 
function GetTileData(x, y:word; facet:byte; layer:byte; var TileType:word; var z:shortint):boolean; external '[email protected]'; 
function ShowRadar() : integer; external '[email protected]'; 
procedure SetRadarArea(t,l,w,h:integer); external '[email protected]'; 
procedure AddObjects(objs : Array of TObjCell;objnum:integer); external '[email protected]'; 
procedure HideRadar(); external '[email protected]'; Пример использования библиотеки :
Code: Select all
function MessageBox(hWnd: Longint; lpText, lpCaption: PChar; uType: Longint): Longint; external '[email protected] stdcall'; 
{$Include 'flow.inc'} 
{$Include 'misc.inc'} 
{$Include 'move.inc'} 
{$Include 'path.inc'} 
type 
  TTileData = record 
    Handle  :LongWord; 
    Tag     :LongWord; 
    Flags   :LongWord; 
    Graphic :word; 
    Weight  :byte; 
    Quality :byte; 
    Quantity:byte; 
    ExtraID :word; 
    Hue     :byte; 
    Height  :byte; 
    Name    :Array[0..19] of Char; 
  end;
function InitMUL(path:PChar):integer; external '[email protected]'; 
function GetLayerCount(x, y:word; facet:byte; var LayerCount:byte):boolean; external '[email protected]'; 
function GetTileDetailsR(TileData:TTileData;grp:byte;tile:word) : integer; external '[email protected]'; 
function GetTileDetailsA(buf:PChar;bc:integer;grp:byte;tile:word) : integer; external '[email protected]'; 
function GetTileData(x, y:word; facet:byte; layer:byte; var TileType:word; var z:shortint):boolean; external '[email protected]'; 
procedure SetRadarArea(t,l,w,h:integer); external '[email protected]'; 
procedure AddObjects(objs : Array of TObjCell;objnum:integer); external '[email protected]'; 
procedure error(func:string;err:integer); 
begin 
   MessageBox(0, func+': Error: '+IntToStr(err), 'ERROR!', 0); 
end; 
procedure msg(txt:string;num:integer); 
begin 
   MessageBox(0, txt+': '+IntToStr(num), 'Message!', 0); 
end; 
function CheckStep(x,y:word): boolean; 
var 
   ret,i:integer; 
   found:boolean; 
   Flags:cardinal; 
   tile:word; 
   LayerCount:byte; 
   z:shortint; 
begin 
   // If we cant do anything, assume we can step. 
   result := true; 
   // How much layers do we have here? 
   if not GetLayerCount(x,y,0,LayerCount) then 
      exit; 
   if LayerCount > 0 then // Something Static out there 
   begin 
      dlog('Complex tile test'); 
      i := 1; 
      found := false; 
      // Let's find our layer (near our z) 
      repeat 
         if not GetTileData(x,y,0,i,tile,z) then 
            exit 
         else 
            if abs(getZ(self) - z) < 10 then 
            begin 
               found:=true; 
               // Get Static Tile details (group 2) 
               Flags := GetTileFlags(2,tile); 
               // Check if the tile has Impassable flag 
               if (Flags AND $00000040 > 0) then 
                  result := false; 
            end; 
         i := i + 1; 
         dlog('Static at layer '+IntToStr(i)+' has '+IntToStr(z)+' altitude. We are at '+IntToStr(getz(self))); 
      until ((i>= LayerCount)); 
      if not found then 
      begin 
         // Get Land Tile details (group 1) 
         Flags := GetTileFlags(1,tile); 
         // Check if the tile has Impassable flag 
         if (Flags AND $00000040 > 0) then 
            result := false; 
      end; 
   end 
   else // We have pure ground 
   begin 
      dlog('Field tile test'); 
      // Get Land Tile details 
      Flags := GetTileFlags(1,tile); 
      // Check if the tile has Impassable flag 
      if (Flags AND $00000040 > 0) then 
         result := false; 
   end; 
end; 
procedure UpdateObject(oid:cardinal); 
var 
   o:Array[0..1] of TObjCell; 
begin 
   o[0].OID := oid; 
   o[0].GID := GetType(oid); 
   o[0].x := GetX(oid); 
   o[0].y := GetY(oid); 
   o[0].z := GetZ(oid); 
   o[0].grp := 3; 
   o[0].Quantity := $FFFF; 
   AddObjects(o,1); 
end; 
procedure Radar(); 
begin 
   UpdateObject(self); 
   if ShowRadar() then 
      SetRadarArea(GetX(self)-150,GetY(self)-150,300,300); 
end; 
procedure checklib(); 
var 
   ret:integer; 
   x,y:word; 
   lc:byte; 
begin 
   ret := InitMUL('C:\\Program Files\\Dragon World\\Ultima Online\\'); 
   if ret < 0 then 
   begin 
      error('Init',ret); 
      exit; 
   end; 
   Radar(); 
   x := getX(self); 
   y := getY(self)+1; 
   if checkstep(x,y) then 
      Raw_Move(2,true); 
   UpdateObject(self); 
end; 
BEGIN 
   checklib(); 
END.




 )
 )