Новичок
Регистрация: 01.07.2008
Адрес: Пермь
Сообщений: 21
Сказал Спасибо: 0
Имеет 37 спасибок в 10 сообщенях
|
Map 1.0 Final
Форма: на ней перс по центру, показываеться куда направлена голова, и рядом лежащие айтемы и их иды. Для поисковых ивентов...
При клике по форме перс в игре бежит в эту точку (Z не меняеться).
Лог(прописываеться Drop (кинули)/Spawn (лежало)/Delete (удалили)/Move to (при клике на мапе, x/y относительные), прописываеться айди и название вещи из ItemsID.ini).
delphi Код:
const
Name='Mamy';
max=100;
size=320; //размер
ratio=20; // zoom: 100% - size/16; 200% - size/16/2
// настройки отображения внизу.
var
Form: TForm;
Memo: TMemo;
ItemBase: TStrings;
ItemsPlace: array[0..max,0..1] of integer;
ItemsID: array[0..max,0..1] of integer;
ItemsName: array[0..max] of string;
MyX,MyY,MyZ,MyH,ii: integer;
procedure Init;
var i: integer;
begin
Form:=TForm.Create(nil);
// //default postion
// Form.Position:=poDesigned;
// Form.Top:=0;
// Form.Left:=0;
Form.Caption:='Map by raid | '+Name;
Form.BorderStyle:=bsToolWindow;
Form.ClientWidth:=size;
Form.ClientHeight:=2*size;
Form.OnMouseDown:=@FormMouseDown;
Form.Show;
Memo:=TMemo.Create(Form);
Memo.Parent:=Form;
Memo.Left:=0;
Memo.Top:=size;
Memo.Width:=size;
Memo.Height:=size;
Memo.ReadOnly:=True;
Memo.ScrollBars:=ssVertical;
Memo.Visible:=True;
ItemBase:=TStringList.Create;
ItemBase.LoadFromFile('ItemsID.ini');
Log('ItemBase='+inttostr(ItemBase.Count));
for i:=0 to max do begin
ItemsPlace[i,0]:=0;
ItemsPlace[i,1]:=0;
ItemsID[i,0]:=0;
ItemsID[i,1]:=0;
ItemsName[i]:='';
end;
ii:=0;
ShowMap;
end;
procedure Free;
var i:integer;
begin
Memo.Free;
ItemBase.Free;
Form.Free;
MyX:=0;
MyY:=0;
MyZ:=0;
MyH:=0;
ii:=0;
for i:=0 to max do begin
ItemsPlace[i,0]:=0;
ItemsPlace[i,1]:=0;
ItemsID[i,0]:=0;
ItemsID[i,1]:=0;
ItemsName[i]:='';
end;
end;
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
x:=MyX+(x-size div 2)*ratio;
y:=MyY+(y-size div 2)*ratio;
buf:=#$01;
WriteD(x);
WriteD(y);
WriteD(MyZ);
WriteD(MyX);
WriteD(MyY);
WriteD(MyZ);
WriteD(1);
SendToServerEx(Name);
Log('Move to: x='+inttostr(x)+', y='+inttostr(y));
end;
procedure Dot(x,y:integer;text:string);
begin
Form.Canvas.Ellipse(x-1,y-1,x+2,y+2);
Form.Canvas.TextOut(x+2,y+2,text);
end;
procedure ShowMap;
var i,x,y,x1,y1,p:integer;
begin
Form.Caption:='Map by raid | '+Name+' | Items: '+inttostr(ii);
Form.Canvas.Rectangle(0,0,size,size);
p:=MyH-15;
x:=round((size div 2)*(cos(p*pi/180)+1));
y:=round((size div 2)*(1-sin(p*pi/180)));
p:=MyH+15;
x1:=round((size div 2)*(cos(p*pi/180)+1));
y1:=round((size div 2)*(1-sin(p*pi/180)));
Form.Canvas.MoveTo(size div 2,size div 2);
Form.Canvas.LineTo(x,y);
Form.Canvas.LineTo(x1,y1);
Form.Canvas.LineTo(size div 2,size div 2);
Dot(size div 2,size div 2,Name);
x:=MyX div ratio-size div 2;
y:=MyY div ratio-size div 2;
for i:=0 to ii-1 do
Dot(ItemsPlace[i,0]-x,ItemsPlace[i,1]-y,ItemsName[i]);
end;
procedure Log(text:string;const name:string='');
begin
if name<>'' then
Memo.Lines.Add(TimeToStr(Time)+': '+text+' '+name)
else
Memo.Lines.Add(TimeToStr(Time)+': '+text);
end;
procedure SetMy(x,y,z,h:integer);
begin
MyH:=360-(h div 190);
MyX:=x;
MyY:=y;
MyZ:=z;
ShowMap;
end;
procedure AddItem(x,y,oid,id:integer;const name:string='');
var i:integer;
begin
if ii=max then begin Log('Warning: max items!');exit;end;
for i:=0 to ii-1 do
if ItemsID[i,0]=oid then
exit;
if name='' then begin
i:=ItemBase.IndexOfName(inttostr(id));
if i>-1 then
name:=ItemBase.Strings[i]
else
name:=inttostr(id);
end;
ItemsPlace[ii,0]:=x div ratio;
ItemsPlace[ii,1]:=y div ratio;
ItemsID[ii,0]:=oid;
ItemsID[ii,1]:=id;
ItemsName[ii]:=name;
inc(ii);
case pck[1] of
#$0B: Log('Spawn',name);
#$0C: Log('Drop',name);
#$03: Log('Char',name);
#$16: Log('NPC',name);
end;
ShowMap;
end;
procedure DelItem(oid:integer);
var i,k:integer;
begin
k:=-1;
for i:=0 to ii-1 do
if ItemsID[i,0]=oid then
k:=i;
if k>-1 then begin
Log('Delete',ItemsName[k]);
for i:=k to ii-2 do begin
ItemsPlace[i,0]:=ItemsPlace[i+1,0];
ItemsPlace[i,1]:=ItemsPlace[i+1,1];
ItemsID[i,0]:=ItemsID[i+1,0];
ItemsID[i,1]:=ItemsID[i+1,1];
ItemsName[i]:=ItemsName[i+1];
end;
ItemsPlace[ii,0]:=0;
ItemsPlace[ii,1]:=0;
ItemsID[ii,0]:=0;
ItemsID[ii,1]:=0;
ItemsName[ii]:='';
dec(ii);
ShowMap;
end;
end;
begin
if (ConnectName=Name) and FromClient then
if (pck[1]=#$48) then
SetMy(ReadD(2),ReadD(6),ReadD(10),ReadD(14));
if (ConnectName=Name) and FromClient and (pck[1]=#$46) then begin
for ii:=0 to max do begin
ItemsPlace[ii,0]:=0;
ItemsPlace[ii,1]:=0;
ItemsID[ii,0]:=0;
ItemsID[ii,1]:=0;
ItemsName[ii]:='';
end;
ii:=0;
Log('Delete all items');
end;
if (ConnectName=Name) and FromServer then case pck[1] of
//**********************************************************
//Комментируем не нужные пакеты
//**********************************************************
//03=CharInfo
#$03: AddItem(ReadD(2),ReadD(6),ReadD(18),0,ReadS(22));
//16=NpcInfo
#$16: AddItem(ReadD(14),ReadD(18),ReadD(2),ReadD(6),ReadS(123));
//0B=SpawnItem
#$0B: AddItem(ReadD(10),ReadD(14),ReadD(2),ReadD(6));
//0C=DropItem
#$0C: AddItem(ReadD(14),ReadD(18),ReadD(6),ReadD(10));
//**********************************************************
//**********************************************************
#$04: SetMy(ReadD(2),ReadD(6),ReadD(10),ReadD(14));
#$12: DelItem(ReadD(2));
end;
end.
Maybe Cooming Soon: Map 2.0 Dll Edition (Beta)
__________________
Emo-chan style.
Последний раз редактировалось raid, 08.07.2008 в 11:29.
|