Скачать последнюю версию библиотеки можно здесь
Для использования библиотеки необходимо положить ее в папку с стелсом а в скрипте импортировать необходимые функции.
Библиотека экспортирует следущие функции:
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 'GetTileData@StealthMUL.dll';
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.