PDA

Просмотр полной версии : Вот решил поделиться бафером


Noise
21.03.2012, 11:40
Не нашел удобного для себя скрипта, решил наваять его сам.
Кое что, конечно подсмотрел у других :)
Сильно не пинайте это мой первый скрипт для l2phx:

Значит что оно делает:
- Саппорт принимает пати от основы (автоматом).
- Бегает за основой
- Бафает
- При необходимости лечит (можно отключить)

Для удобства управления добавил команды:
* Все команды начинаются с точки.
.on - собственно включает бафера.
.off - собственно выключает бафера.
.go - Саппорт просто прицепится за основой (удобно для транспортировки на место кача)
.sit или .stand - Саппорт садится на жопу.
Все команды пишутся осн. персонажем в общий чат (на сервер они не проходят).

// Тестировал скрипт в связке с локомотивом Alexus для нормальной работы пришлось переименовать свои таймеры... так что не удивляйтесь такому названию :)

// PP Support by Noise;
const
zero = '00 00 00 00 00 00 00 ';
aheal = '2F F3 03 ' + zero; // Heal
bheal = '2F F7 03 ' + zero; // Battle Heal

Main = 'Main';
Support = 'Support';

Healing = true; // true - ПП будет лечить основу, false - соответсвтенно выключает.
HPLevel = 60; // Кол-во процентов для того что бы ПП использовал Heal
HPLevelB = 40; // Кол-во процентов для того что бы ПП использовал Battle Heal


Greater_Shield = true;
Greater_Might = false;

var
nTimer1, nTimer2, nTimer3: TTimer;
tmp: String;
MainID, MainX, MainY, MainZ, SupportID, SupportX, SupportY, SupportZ, CountBuff, range,
MainMaxHP, MainCurHP, MainMaxMP, MainCurMP, int_tmp, HPlevelProcent, HPlevelProcentB: Integer;
BuFFArray: array [1..50] of String;
SelfBuff: Boolean;

function say(text: string): Boolean;
begin
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS(text);
SendToClient;
end;

function SupportMove: Boolean;
begin
TargetLeader;
TargetLeader;
end;

function TargetLeader: Boolean;
begin
buf:=#$04;
WriteD(MainID);
WriteD(MainX);
WriteD(MainY);
WriteD(MainZ);
WriteD(0);
SendToServerEX(Support);
end;

function TargetSelf: Boolean;
begin
buf:=#$04;
WriteD(SupportID);
WriteD(SupportX);
WriteD(SupportY);
WriteD(SupportZ);
WriteD(0);
SendToServerEX(Support);
end;

procedure OnTimer1n(Sender: TObject);
begin
Buff;
end;

procedure OnTimer2n(Sender: TObject);
var
Count: Integer;
rx, ry, range: integer;
begin
CheckRange;
if range > 480 then SupportMove
else
begin
Count := Count + 1;
buf:=hstr(BuFFArray[Count]);
SendToServerEx(Support);
end;
if Count = CountBuff then
begin
ntimer2.enabled := false;
SelfBuff := false;
Count := nil;
SupportMove;
end;
end;

procedure OnTimer3n(Sender: TObject);
var
Count: Integer;
begin
Count := Count + 1;
buf:=hstr(BuFFArray[Count + 20]);
SendToServerEx(Support);
if Count = 5 then
begin
ntimer3.enabled := false;
SelfBuff := true;
Count := nil;
Buff;
end;
end;

procedure MainStatusUpdate; // обновление данных о себе
var
i:integer;
begin
for i:=0 to ReadD(6)-1 do
case pck[i*8+10] of
#$09: MainCurHP:=ReadD(i*8+14);
#$0A: MainMaxHP:=ReadD(i*8+14);
#$0B: MainCurMP:=ReadD(i*8+14);
#$0C: MainMaxMP:=ReadD(i*8+14);
end;
if Healing then
begin
if MainMaxHP > 0 then HPlevelProcent := Round((MainMaxHP/100)*HPLevel);
if MainMaxHP > 0 then HPlevelProcentB := Round((MainMaxHP/100)*HPLevelB);
if HPlevelProcent > MainCurHP then
if HPlevelProcentB > MainCurHP then BattleHeal else Heal;

End;
end;

procedure Heal;
begin
TargetLeader;
buf := hstr(aheal);
SendToServerEx(Support);
SupportMove;
end;

procedure BattleHeal;
begin
TargetLeader;
buf := hstr(bheal);
SendToServerEx(Support);
SupportMove;
end;

procedure SupportInfo; // обновление данных о саппорте
begin
if (SupportID = 0 ) then
begin
SupportID := ReadD(18);
say('Саппорт готов к работе!');
end;
SupportX := ReadD(2);
SupportY := ReadD(6);
SupportZ := ReadD(10);
end;

procedure MainInfo; // обновление данных о себе
var
i:word;
begin
if (MainID = 0 ) then
begin
MainID := ReadD(18);
say('Главный персонаж готов к работе!');
end;
MainX := ReadD(2);
MainY := ReadD(6);
MainZ := ReadD(10);
i:=22;
ReadS(i);
i:=i+48 ;
MainMaxHP := ReadD(i);
MainCurHP := ReadD(i);
end;

procedure Buff;
var
i: Integer;
begin
if SelfBuff then
begin
TargetLeader;
ntimer2.enabled := true;
end
else
begin
TargetSelf;
ntimer3.enabled := true;
end;
end;

procedure Init;
begin
buf:= #$0F;
SendToServerEx(Main);
SendToServerEx(Support);

BuFFArray[1] := '2F 2C 04 ' + zero; // Might
BuFFArray[2] := '2F 0C 04 ' + zero; // Magic Barrier
BuFFArray[3] := '2F 0B 04 ' + zero; // Mental Shield
BuFFArray[4] := '2F 10 04 ' + zero; // Shield
BuFFArray[5] := '2F D8 04 ' + zero; // Guidance
BuFFArray[6] := '2F 35 04 ' + zero; // Focus
BuFFArray[7] := '2F DA 04 ' + zero; // Death Whisper
BuFFArray[8] := '2F 3E 04 ' + zero; // Haste
BuFFArray[9] := '2F B4 04 ' + zero; // Wind Walk
BuFFArray[10] := '2F 15 04 ' + zero; // Blessed Body
BuFFArray[11] := '2F 18 04 ' + zero; // Blessed Soul
BuFFArray[12] := '2F 14 04 ' + zero; // Regeneration
BuFFArray[13] := '2F DB 04 ' + zero; // Blessed Shield

if Greater_Shield then BuFFArray[14] := '2F 6D 05 ' + zero; // Greater Shield
if Greater_Might then BuFFArray[14] := '2F 6C 05 ' + zero; // Greater Might

if Greater_Shield or Greater_Might then CountBuff := 14 else CountBuff := 13;

BuFFArray[21] := '2F 15 04 ' + zero;
BuFFArray[22] := '2F 18 04 ' + zero;
BuFFArray[23] := '2F 3D 04 ' + zero;
BuFFArray[24] := '2F 26 04 ' + zero;
BuFFArray[25] := '2F B4 04 ' + zero;

ntimer1:=TTimer.Create(nil);
ntimer1.OnTimer:=@OnTimer1n;
ntimer1.enabled:=False;
ntimer1.interval:=1080000;

ntimer2:=TTimer.Create(nil);
ntimer2.OnTimer:=@OnTimer2n;
ntimer2.enabled:=False;
ntimer2.interval:=2100;

ntimer3:=TTimer.Create(nil);
ntimer3.OnTimer:=@OnTimer3n;
ntimer3.enabled:=False;
ntimer3.interval:=2500;

end;

procedure Free;
begin
ntimer1.Free;
ntimer2.Free;
ntimer3.Free;
end;

procedure UpdateMainInfo;

begin
MainX := ReadD(18);
MainY := ReadD(22);
MainZ := ReadD(26);
end;

procedure UpdateSupportInfo;
begin
SupportX := ReadD(18);
SupportY := ReadD(22);
SupportZ := ReadD(26);
end;

procedure CheckRange;
var
rx, ry: Integer;
begin
rx := MainX - SupportX;
ry := MainY - SupportY;
range := round(sqrt(rx * rx + ry * ry));
end;





//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен

begin
if (ConnectName = Support) and (pck[1]=#$39) then
begin
tmp := ReadS(2);
if (tmp = Main) then
begin
buf := HStr('2A 01 00 00 00');
SendToServerEx(Support);
SupportMove;
end;
end;

if (ConnectName = Support) and (pck[1]=#$04) then SupportInfo;
if (ConnectName = Main) and (pck[1]=#$04) then MainInfo;
if (ConnectName = Main) and (pck[1]=#$0E) and (MainID=ReadD(2)) then MainStatusUpdate;
if (pck[1]=#$01) and (MainID=ReadD(2)) then UpdateMainInfo;
if (pck[1]=#$01) and (SupportID=ReadD(2)) then UpdateSupportInfo;

if (ConnectName = Main) and (pck[1]=#$38) and FromClient then
Begin
if (ReadS(2) = '.on') then
begin
pck := '';
Buff;
ntimer1.enabled := true;
end;
if (ReadS(2) = '.off') then
begin
pck := '';
Buff;
ntimer1.enabled := false;
ntimer2.enabled := false;
ntimer3.enabled := false;
end;
if (ReadS(2) = '.go') then
begin
pck := '';
SupportMove;
end;
if (ReadS(2) = '.sit') or (ReadS(2) = '.stand') then
begin
pck := '';
buf := HStr('45 00 00 00 00 00 00 00 00 00 ');
SendToServerEx(Support);
end;
End;
end.


Да чуть не забыл, скрипт для Intelude.