Хостинг, который использует TopHope.RU более 2-х лет

Хостинг, который использует TopHope.RU более 2-х лет

Сайт для программистов

Сброс таргета через геодату

Тема в разделе "Пакетный уровень", создана пользователем Yoka, ноя 1, 2015.

  1. Yoka

    Yoka Заблокирован

    Сообщения:
    15
    Симпатии:
    24
    Баллы:
    3
    Уязвимость заключается в том, что при изменении координаты 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.
    --- Объединение сообщений, ноя 1, 2015, Дата оригинального сообщения: ноя 1, 2015 ---
    Переделал пакеты под 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.
     
    EclipsE нравится это.
  2. lifediary

    lifediary Адекват

    Сообщения:
    7
    Симпатии:
    5
    Баллы:
    608
    какая херня тут написана?.. это всё делается в 3 строчки...
    к тому же в масс пвп на хила например прилетают таргеты по 6 штук в секунду... клиент просто рухнет