Уязвимость заключается в том, что при изменении координаты Z можно чаром "взлететь" в небо или "провалиться" сквозь землю. При этом у самого такого чара пропадают все игроки и нпц, а так же с него сбрасывается таргет. Баг был обнаружен, когда в городе была мирная зона и нажимая в небо чар переходил в General Field с пропажей всех объектов (чаров, нпц) в городе.
Под этот баг я написал скрипт для пакетника, который автоматически сбрасывает таргет. Описание принципа работы: после включения скрипта необходимо вызвать пакет от сервера UserInfo, в котором содержится ObjectID вашего чара. Для вызова UserInfo можно снять/одеть пуху, шмот, использовать баф на себя, сесть на продажу, сделать тп и т.д. После того как будет запомнен ObjectID, скрипту необходимо поймать от клиента пакет ValidatePosition, в котором хранятся координаты и Heading чара. Для этого достаточно сделать шаг или побежать. Клиент отправит MoveBackwardToLocation с последующими ValidatePosition. После этого скрипт автоматически отсылает ValidatePosition с измененной координатой Z, что сбрасывает таргет, если вас выделили, или при нажатии социального действия Victory. Для возврата нормальной координаты Z - социальное действие Greeting.
Вкратце:
1. Запустить скрипт.
2. Одеть/снять оружие или шмот.
3. Сдвинуться с места.
4. Включить социальным действием Victory.
Сам скрипт для хроник Gracia Final:
Код:
const
// FromClient
mv = #$0F; // MoveBackwardToLocation
vp = #$59; // ValidatePosition
sa = #$56; // RequestActionUse
// FromServer
cs = #$4A; // CreatureSay
ts = #$23; // TargetSelected
ui = #$32; // UserInfo
vl = #$79; // ValidateLocation
high = 5000;
// Name='nick';
var
ObjectID,act,ToX,ToY,ToZ,OriginX,OriginY,OriginZ,MoveMovement: integer;
X,Y,Z,Heading,Data: integer;
IsHidden: boolean;
procedure SendMsg2(msg:string);
begin
buf := cs;
WriteD(0);
WriteD(15);
WriteS('');
WriteS(msg);
//SendToClientEx(Name);
SendToClient;
end;
procedure Init; //Вызывается при включении скрипта
begin
act := 0;
ObjectID := 0;
IsHidden := false;
SendMsg2('Снимите или оденьте пуху и сдвиньтесь с места');
end;
procedure Hide;
begin
buf := vp;
WriteD(X);
WriteD(Y);
if act=1 then
WriteD(Z - high)
else if act=2 then
WriteD(Z + high)
else
WriteD(Z);
WriteD(Heading);
WriteD(Data);
SendToServer;
pck := '';
if act=0 then
IsHidden := false
else
IsHidden := true;
end;
begin
// If got targeted
if FromServer and (pck[1]=ts) and (ReadD(6)=ObjectID) then
begin
if ReadD(2)<>ObjectID then
begin
act := 1;
SendMsg2('Antitarget ON');
Hide;
end;
end;
// Get ObjectID from UserInfo packet
if FromServer and (pck[1]=ui) and (ObjectID=0) then
begin
ObjectID := ReadD($12);
SendMsg2('Запомнен ObjectID = '+IntToStr(ObjectID));
end
;
// New MoveBackwardToLocation
if FromClient and (pck[1]=mv) and (act>0) then
begin
// Reading values
ToX := ReadD(2);
ToY := ReadD(6);
ToZ := ReadD(10);
OriginX := ReadD(14);
OriginY := ReadD(18);
OriginZ := ReadD(22);
MoveMovement := ReadD(26);
// Making packet
buf := mv;
WriteD(ToX);
WriteD(ToY);
if act=1 then
WriteD(ToZ - high)
else if act=2 then
WriteD(ToZ + high)
else
WriteD(ToZ);
WriteD(OriginX);
WriteD(OriginY);
if act=1 then
WriteD(OriginZ - high)
else if act=2 then
WriteD(OriginZ + high)
else
WriteD(OriginZ);
WriteD(MoveMovement);
//SendToServerEx(Name);
SendToServer;
pck := '';
end;
// New ValidatePosition
if FromClient and (pck[1]=vp) then
begin
// Always keep coordinates
X := ReadD(2);
Y := ReadD(6);
Z := ReadD(10);
Heading := ReadD(14);
Data := ReadD(18);
if act>0 then
begin
Hide;
end;
end;
// Block ValidateLocation
if FromServer and (pck[1]=vl) then
begin
pck := '';
end;
// Social action check
if FromClient and (pck[1]=sa) then
begin
case pck[2] of
#$0C:
begin
act := 0;
SendMsg2('OFF');
if IsHidden then Hide;
end;
#$0D:
begin
act := 1;
SendMsg2('Antitarget ON');
Hide;
end;
#$0E:
begin
act := 2;
SendMsg2('Air ON');
Hide;
end;
end;
pck := '';
end;
end.
Последний раз редактировалось cavern; 05.07.2014 в 16:06.
Причина: указание хроник
Переделал пакеты под Interlude.
Проверить работоспособность можно на [Ссылки могут видеть только зарегистрированные пользователи. ]
Код:
const
// FromClient
mv = #$01; // MoveBackwardToLocation
vp = #$48; // ValidatePosition
sa = #$1B; // RequestActionUse
// FromServer
cs = #$4A; // CreatureSay
ts = #$29; // TargetSelected
ui = #$04; // UserInfo
vl = #$61; // ValidateLocation
high = 5000;
// Name='nick';
var
ObjectID,act,ToX,ToY,ToZ,OriginX,OriginY,OriginZ,MoveMovement: integer;
X,Y,Z,Heading,Data: integer;
IsHidden: boolean;
procedure SendMsg2(msg:string);
begin
buf := cs;
WriteD(0);
WriteD(15);
WriteS('');
WriteS(msg);
//SendToClientEx(Name);
SendToClient;
end;
procedure Init; //Вызывается при включении скрипта
begin
act := 0;
ObjectID := 0;
IsHidden := false;
SendMsg2('Снимите или оденьте пуху и сдвиньтесь с места');
end;
procedure Hide;
begin
buf := vp;
WriteD(X);
WriteD(Y);
if act=1 then
WriteD(Z - high)
else if act=2 then
WriteD(Z + high)
else
WriteD(Z);
WriteD(Heading);
WriteD(Data);
SendToServer;
pck := '';
if act=0 then
IsHidden := false
else
IsHidden := true;
end;
begin
// If got targeted
if FromServer and (pck[1]=ts) and (ReadD(6)=ObjectID) then
begin
if ReadD(2)<>ObjectID then
begin
act := 1;
SendMsg2('Antitarget ON');
Hide;
end;
end;
// Get ObjectID from UserInfo packet
if FromServer and (pck[1]=ui) and (ObjectID=0) then
begin
ObjectID := ReadD($12);
SendMsg2('Запомнен ObjectID = '+IntToStr(ObjectID));
end
;
// New MoveBackwardToLocation
if FromClient and (pck[1]=mv) and (act>0) then
begin
// Reading values
ToX := ReadD(2);
ToY := ReadD(6);
ToZ := ReadD(10);
OriginX := ReadD(14);
OriginY := ReadD(18);
OriginZ := ReadD(22);
MoveMovement := ReadD(26);
// Making packet
buf := mv;
WriteD(ToX);
WriteD(ToY);
if act=1 then
WriteD(ToZ - high)
else if act=2 then
WriteD(ToZ + high)
else
WriteD(ToZ);
WriteD(OriginX);
WriteD(OriginY);
if act=1 then
WriteD(OriginZ - high)
else if act=2 then
WriteD(OriginZ + high)
else
WriteD(OriginZ);
WriteD(MoveMovement);
//SendToServerEx(Name);
SendToServer;
pck := '';
end;
// New ValidatePosition
if FromClient and (pck[1]=vp) then
begin
// Always keep coordinates
X := ReadD(2);
Y := ReadD(6);
Z := ReadD(10);
Heading := ReadD(14);
Data := ReadD(18);
if act>0 then
begin
Hide;
end;
end;
// Block ValidateLocation
if FromServer and (pck[1]=vl) then
begin
pck := '';
end;
// Social action check
if FromClient and (pck[1]=sa) then
begin
case pck[2] of
#$02:
begin
act := 0;
SendMsg2('OFF');
if IsHidden then Hide;
end;
#$03:
begin
act := 1;
SendMsg2('Antitarget ON');
Hide;
end;
#$04:
begin
act := 2;
SendMsg2('Air ON');
Hide;
end;
end;
pck := '';
end;
end.
Что бы не было лишних вопросов - скрипты активируются, через l2phx. Вопросы по программе лучше задавать на официальном форуме - coderx.ru
По теме, есть вопрос. Раньше был скрипт, который позволял делать ТП в любую точку карты (баловались на с3-с4 так). Возможно ли этот скрип подогнать под GF (или выше)?
Подправить скрипт всегда можно, отличия будут в первых байтах пакетов. Структура конкретно пакетов на перемещение и тп не менялась с течением хроник. Другое дело, что работать такой скрипт уже вряд ли будет - почти везде фиксы стоят.
а не проще опустить камеру в ноги, что б было видно ник и потыкать на него, та же ситуация будет....
из этого следует целый ряд багов
1) при падении - 0 ХП (там где снимает хп при падении) как следствие возможность использовать скилы на кхаватари и титане к примеру на олимпе
2)так же можно прятаться на олимпе к примеру отресторить МП
3)таким образом можно бегать через стены даже со сравнительно рабочей геодатой
ну и еще целый ряд вытекающих из этого событий, баг древний как какашки мамонта, пользую уже года 3 - 4