ходьба с wdsa на яве и птс и bump type

  • Автор темы Автор темы AlhimN1
  • Дата начала Дата начала

AlhimN1

Свой человек
Хроники
  1. Interlude
Исходники
Отсутствуют
Сборка
L2JTD
кто то делал на яве что б можно было ходить с клавиатуры? - так с этим всё понятно, работает везде и независимо от сервера

а вот как определять столкновения не понятно - принятие / не принятие команд bump type
 
Последнее редактирование:
Вот тебе более сложная задача, рассказать дыбилам как работает теорема отскока.

Посмотреть вложение 84478

Как игроки могут на ПТСе стрелять со стен и атакующие с земли нарушая твое описание NWSE
А очень просто на самом деле. На ПТСе строится ломаная в функции
SingleLineCheckForProjectile, которая представляет из себя вот такое:
1739744379882.webp

Java:
    public static boolean SingleLineCheckForProjectile(@NotNull Vector vector, int x, int y, int z, int dest_x, int dest_y, int dest_z) {
        long time = System.nanoTime();

        boolean r1 = false;
        boolean r2 = false;
        boolean r3 = false;
        boolean r4 = false;
        try {
            if (IPoint.isEmptyPoint(x, y, World.WORLD_MAP_MIN_X, World.WORLD_MAP_MAX_X, World.WORLD_MAP_MIN_Y, World.WORLD_MAP_MAX_Y)) {
                return false;
            }

            if (IPoint.isEmptyPoint(dest_x, dest_y, World.WORLD_MAP_MIN_X, World.WORLD_MAP_MAX_X, World.WORLD_MAP_MIN_Y, World.WORLD_MAP_MAX_Y)) {
                return false;
            }

            IPoint pos;
            IPoint vTo;

            boolean direct = dest_z < z;

            //Смещение на верх применяется для самой высокой точки.
            if (direct) {
                pos = new Location(x, y, z);
                vTo = new Location(dest_x, dest_y, dest_z);
            } else {
                pos = new Location(dest_x, dest_y, dest_z);
                vTo = new Location(x, y, z);
            }

            //Вычисление разницы координат
            double deltaX = vTo.getX() - pos.getX();
            double deltaY = vTo.getY() - pos.getY();
            double deltaZ = vTo.getZ() - pos.getZ();
            double xyLengthSquared = deltaX * deltaX + deltaY * deltaY;

            //Если расстояние между точками слишком мало, возвращаем true
            if (deltaZ * deltaZ + xyLengthSquared < 0.5) {
                return true;
            }

            double lengthXY = Math.sqrt(xyLengthSquared);
            double v10 = 64.0;

            if (lengthXY < 64.0) {
                v10 = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ);
            }

            if (DebugConfig.DEBUG_SIGHT) {
                Debug.getInstance().newPrimitive("CAN_SEE");
            }

            pos.setZ(GetVerticalLimit(pos));
            vTo.setZ(GetVerticalLimit(vTo));

            if (DebugConfig.DEBUG_SIGHT) {
                Debug.getInstance().getPrimitive("CAN_SEE").addPoint("", Color.MAGENTA, true, pos);

            }

            double length2D = Math.sqrt((deltaX * deltaX) +    (deltaY * deltaY));
            if (length2D > 0.0) {
                deltaX = deltaX / length2D;
                deltaY = deltaY / length2D;
                deltaZ = deltaZ / length2D;
            }

            Location v = new Location((int) (deltaX * v10) + pos.getX(), (int) (deltaY * v10) + pos.getY(), pos.getZ() + 16);

            //Проверка видимости по прямым линиям
            //Проверка досягаемости точки v от pos(например, чтобы над персонажем не было потолка)
            r1 = SingleLineCheckWithFlyTopDown(vector.change3DWithoutCollision(v, pos, IGeoCell.SIZE), 0);
            r2 = SingleLineCheckWithFlyTopDown(vector.change3DWithoutCollision(pos, v, IGeoCell.SIZE), 0);
            //Проверка видимости удаленной точки vTo от v(если direct, то это проверка видимости цели, если нет, то это обратная проверка от цели к смотрящему)
            r3 = !direct && !GeoDataConfig.REQUIRE_VISIBILITY_BOTH_FOR_SUCCESS || SingleLineCheckWithFlyTopDown(vector.change3DWithoutCollision(v, vTo, IGeoCell.SIZE), 0);
            //Проверка видимости удаленной точки v от vTo(если direct, то это обратная проверка видимости, от цели к смотрящему, а если нет, то это проверка видимости цели)
            r4 = direct && !GeoDataConfig.REQUIRE_VISIBILITY_BOTH_FOR_SUCCESS || SingleLineCheckWithFlyTopDown(vector.change3DWithoutCollision(vTo, v, IGeoCell.SIZE), 0);

            if (DebugConfig.DEBUG_SIGHT) {
                Debug.getInstance().getPrimitive("CAN_SEE").addLine("", r1 & r2 ? Color.GREEN : Color.RED, true, v, pos);
                Debug.getInstance().getPrimitive("CAN_SEE").addArrow("", r3 & r4 ? Color.GREEN : Color.RED, r3 ? Color.GREEN : Color.RED, r3 ? Color.GREEN : Color.RED, true, vTo, v, direct ? 0 : 8, direct ? 8 : 0);
                Debug.getInstance().getPrimitive("CAN_SEE").addArrow("", r3 & r4 ? Color.GREEN : Color.RED, r4 ? Color.GREEN : Color.RED, r4 ? Color.GREEN : Color.RED, true, v, vTo, direct ? 8 : 0, direct ? 0 : 8);
            }

            return r1 && r2 && r3 && r4;
        } catch (Exception e) {
            log.warn("Error while CanSee()", e);
        } finally {
            if (DebugConfig.DEBUG_SIGHT) {
                boolean success = r1 && r2 && r3 && r4;
                Debug.getInstance().chat("CanSeeTime: " + (r1 ? "T" : "F") + (r2 ? "T" : "F") + (r3 ? "T" : "F") + (r4 ? "T " : "F ") + (System.nanoTime() - time) / 1_000_000. + "ms", success ? ESayPacketType.PARTY : ESayPacketType.TELL);
                Debug.getInstance().sendPrimitive("CAN_SEE");
            }
        }
        return false; //Если же нет, то это фейл и цель не видно.
    }


И как видно из кода, проверяется видимость на всех 4 отрезках ломаной.
 

А очень просто на самом деле. На ПТСе строится ломаная в функции
SingleLineCheckForProjectile, которая представляет из себя вот такое:
Посмотреть вложение 84479

Java:
    public static boolean SingleLineCheckForProjectile(@NotNull Vector vector, int x, int y, int z, int dest_x, int dest_y, int dest_z) {
        long time = System.nanoTime();

        boolean r1 = false;
        boolean r2 = false;
        boolean r3 = false;
        boolean r4 = false;
        try {
            if (IPoint.isEmptyPoint(x, y, World.WORLD_MAP_MIN_X, World.WORLD_MAP_MAX_X, World.WORLD_MAP_MIN_Y, World.WORLD_MAP_MAX_Y)) {
                return false;
            }

            if (IPoint.isEmptyPoint(dest_x, dest_y, World.WORLD_MAP_MIN_X, World.WORLD_MAP_MAX_X, World.WORLD_MAP_MIN_Y, World.WORLD_MAP_MAX_Y)) {
                return false;
            }

            IPoint pos;
            IPoint vTo;

            boolean direct = dest_z < z;

            //Смещение на верх применяется для самой высокой точки.
            if (direct) {
                pos = new Location(x, y, z);
                vTo = new Location(dest_x, dest_y, dest_z);
            } else {
                pos = new Location(dest_x, dest_y, dest_z);
                vTo = new Location(x, y, z);
            }

            //Вычисление разницы координат
            double deltaX = vTo.getX() - pos.getX();
            double deltaY = vTo.getY() - pos.getY();
            double deltaZ = vTo.getZ() - pos.getZ();
            double xyLengthSquared = deltaX * deltaX + deltaY * deltaY;

            //Если расстояние между точками слишком мало, возвращаем true
            if (deltaZ * deltaZ + xyLengthSquared < 0.5) {
                return true;
            }

            double lengthXY = Math.sqrt(xyLengthSquared);
            double v10 = 64.0;

            if (lengthXY < 64.0) {
                v10 = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ);
            }

            if (DebugConfig.DEBUG_SIGHT) {
                Debug.getInstance().newPrimitive("CAN_SEE");
            }

            pos.setZ(GetVerticalLimit(pos));
            vTo.setZ(GetVerticalLimit(vTo));

            if (DebugConfig.DEBUG_SIGHT) {
                Debug.getInstance().getPrimitive("CAN_SEE").addPoint("", Color.MAGENTA, true, pos);

            }

            double length2D = Math.sqrt((deltaX * deltaX) +    (deltaY * deltaY));
            if (length2D > 0.0) {
                deltaX = deltaX / length2D;
                deltaY = deltaY / length2D;
                deltaZ = deltaZ / length2D;
            }

            Location v = new Location((int) (deltaX * v10) + pos.getX(), (int) (deltaY * v10) + pos.getY(), pos.getZ() + 16);

            //Проверка видимости по прямым линиям
            //Проверка досягаемости точки v от pos(например, чтобы над персонажем не было потолка)
            r1 = SingleLineCheckWithFlyTopDown(vector.change3DWithoutCollision(v, pos, IGeoCell.SIZE), 0);
            r2 = SingleLineCheckWithFlyTopDown(vector.change3DWithoutCollision(pos, v, IGeoCell.SIZE), 0);
            //Проверка видимости удаленной точки vTo от v(если direct, то это проверка видимости цели, если нет, то это обратная проверка от цели к смотрящему)
            r3 = !direct && !GeoDataConfig.REQUIRE_VISIBILITY_BOTH_FOR_SUCCESS || SingleLineCheckWithFlyTopDown(vector.change3DWithoutCollision(v, vTo, IGeoCell.SIZE), 0);
            //Проверка видимости удаленной точки v от vTo(если direct, то это обратная проверка видимости, от цели к смотрящему, а если нет, то это проверка видимости цели)
            r4 = direct && !GeoDataConfig.REQUIRE_VISIBILITY_BOTH_FOR_SUCCESS || SingleLineCheckWithFlyTopDown(vector.change3DWithoutCollision(vTo, v, IGeoCell.SIZE), 0);

            if (DebugConfig.DEBUG_SIGHT) {
                Debug.getInstance().getPrimitive("CAN_SEE").addLine("", r1 & r2 ? Color.GREEN : Color.RED, true, v, pos);
                Debug.getInstance().getPrimitive("CAN_SEE").addArrow("", r3 & r4 ? Color.GREEN : Color.RED, r3 ? Color.GREEN : Color.RED, r3 ? Color.GREEN : Color.RED, true, vTo, v, direct ? 0 : 8, direct ? 8 : 0);
                Debug.getInstance().getPrimitive("CAN_SEE").addArrow("", r3 & r4 ? Color.GREEN : Color.RED, r4 ? Color.GREEN : Color.RED, r4 ? Color.GREEN : Color.RED, true, v, vTo, direct ? 8 : 0, direct ? 0 : 8);
            }

            return r1 && r2 && r3 && r4;
        } catch (Exception e) {
            log.warn("Error while CanSee()", e);
        } finally {
            if (DebugConfig.DEBUG_SIGHT) {
                boolean success = r1 && r2 && r3 && r4;
                Debug.getInstance().chat("CanSeeTime: " + (r1 ? "T" : "F") + (r2 ? "T" : "F") + (r3 ? "T" : "F") + (r4 ? "T " : "F ") + (System.nanoTime() - time) / 1_000_000. + "ms", success ? ESayPacketType.PARTY : ESayPacketType.TELL);
                Debug.getInstance().sendPrimitive("CAN_SEE");
            }
        }
        return false; //Если же нет, то это фейл и цель не видно.
    }
Идея близка к реальности, но нет, лучи формируются в две стороны. У тебя нарушена логика и перенасыщена.
 
У тебя нарушега логика и перенасыщена.
Претензии к корейцам, у меня просто порт.

C++:
//----- (00000000006D63AC) ----------------------------------------------------
bool __fastcall CGeoData::SingleLineCheckForProjectile(CGeoData *this, const FVector *vFromPos, const FVector *vToPos)
{
  bool v4; // cf
  const FVector *v7; // rdx
  double v8; // xmm2_8
  __m128d v10; // xmm6
  __m128d v11; // xmm0
  __m128d v12; // xmm6
  FVector *v13; // rax
  __m128d v14; // xmm0
  FVector pos; // [rsp+28h] [rbp-19h] BYREF
  FVector vTo; // [rsp+40h] [rbp-1h] BYREF
  FVector v17; // [rsp+58h] [rbp+17h] BYREF
  FVector v; // [rsp+70h] [rbp+2Fh] BYREF

  v4 = vToPos->z < vFromPos->z;
  memset(&pos, 0, sizeof(pos));
  memset(&vTo, 0, sizeof(vTo));
  if ( v4 )
  {
    FVector::operator=(&pos, vFromPos);
    v7 = vToPos;
  }
  else
  {
    FVector::operator=(&pos, vToPos);
    v7 = vFromPos;
  }
  FVector::operator=(&vTo, v7);
  v17.x = vTo.x - pos.x;
  v17.y = vTo.y - pos.y;
  v8 = v17.y * v17.y + v17.x * v17.x;
  if ( (vTo.z - pos.z) * (vTo.z - pos.z) + v8 < 0.5 )
    return 1;
  v17.z = 0.0;
  v10 = (__m128d)*(unsigned __int64 *)&DOUBLE_64_0;
  if ( sqrt(v8 + 0.0) < 64.0 )
  {
    v11 = (__m128d)*(unsigned __int64 *)&v17.y;
    v11.m128d_f64[0] = sqrt(v11.m128d_f64[0] * v11.m128d_f64[0] + v17.x * v17.x + v17.z * v17.z);
    v10 = v11;
  }
  v12 = _mm_unpacklo_pd(v10, v10);
  pos.z = CGeoData::GetVerticalLimit(this, &pos);
  vTo.z = CGeoData::GetVerticalLimit(this, &vTo);
  v13 = FVector::NormalizeSquare(&v17);
  v14 = _mm_mul_pd(*(__m128d *)&v13->y, v12);
  v12.m128d_f64[0] = v12.m128d_f64[0] * v13->x;
  *(__m128d *)&v.y = v14;
  v.x = v12.m128d_f64[0];
  FVector::operator=(&v17, &v);
  v17.z = DOUBLE_16_0;
  v.x = v17.x + pos.x;
  v.y = v17.y + pos.y;
  v.z = pos.z + 16.0;
  return CGeoData::SingleLineCheckWithFlyTopDown(this, &v, &pos)
      && CGeoData::SingleLineCheckWithFlyTopDown(this, &pos, &v)
      && CGeoData::SingleLineCheckWithFlyTopDown(this, &v, &vTo)
      && CGeoData::SingleLineCheckWithFlyTopDown(this, &vTo, &v);
}
 
Пошел вникать) Спасибо за помощь)
Это не призыв идти куда-то, я просто попросил простым языком объяснить людям! Что же это такое и как это работает, вот как простой рубаха парень, рубануть с плеча, сесть за стол! Разлить пару стопок и дать суть! Вот алгебра брат, ну математика неизвестных, выпили, утром спрашиваешь, а он тебе такой 3x2−5x−2=0
а ты ему такой!
x=2a−b±b2−4ac
где a=3a = 3a=3, b=−5b = -5b=−5, c=−2c = -2c=−2.
Спасибо БРАТ!
 
Это не призыв идти куда-то, я просто попросил простым языком объяснить людям! Что же это такое и как это работает, вот как простой рубаха парень, рубануть с плеча, сесть за стол! Разлить пару стопок и дать суть! Вот алгебра брат, ну математика неизвестных, выпили, утром спрашиваешь, а он тебе такой 3x2−5x−2=0
а ты ему такой!
x=2a−b±b2−4ac
где a=3a = 3a=3, b=−5b = -5b=−5, c=−2c = -2c=−2.
Спасибо БРАТ!
У меня полный реверс всего геодвижка, мувинга, пасфинда со всеми ответвлениями и моими оптимизациями. Мне если честно, просто очень лень расписывать уже сегодня, сверх того, что я расписал. Можешь написать мне в личку в ТГ, если у тебя будут какие-то вопросы. В паблик я более чем сейчас кода сливать не стану.
 
Идея близка к реальности, но нет, лучи формируются в две стороны. У тебя нарушена логика и перенасыщена.

Это часть логики, ты видимо не вник в полную структуру.

Очень хочется услышать вторую часть логики, и в чем именно перенасыщена логика у Аристо. Ну чтобы это не было очередным пшиком без смысла в тему, и последующим сливом из нее.
 
У меня полный реверс всего геодвижка, мувинга, пасфинда со всеми ответвлениями и моими оптимизациями. Мне если честно, просто очень лень расписывать уже сегодня, сверх того, что я расписал. Можешь написать мне в личку в ТГ, если у тебя будут какие-то вопросы. В паблик я более чем сейчас кода сливать не стану.
Мне бы очень было интересно овладеть такой информацией )))
 
Очень хочется услышать вторую часть логики, и в чем именно перенасыщена логика у Аристо. Ну чтобы это не было очередным пшиком без смысла в тему, и последующим сливом из нее.
Ты сам только и пшикаешь в каждой теме, не понимая вообще о чем речь
 

    BladeRunner

    Баллов: -7
    Так вот и докажите, что лучше меня. а то высер был, а пруфов нет. Но мне хоть по статусу нуба позволено. А вы же не нули, да да да???
если ты не перестанешь срать в теме, я не поленюсь, и сделаю тему, где так макну тебя в очевидные твои косяки, что даже от такого дурака и бомжа это будет просто в хлам разнос и конец репы.
Так ты не угрожай, а делай, а там будет видно с кого будут ржать)
 
$20.000 и я вам ее даже в сервер интегрирую.
А я думал данных с реверса не осталось) а тут дело в $$$

Так она доступна в .pdb от 162 протокола, иди и смотри.
есть такое дело, где то лежит. Нужно глянуть. Кстати Aristo мне и подсказал от туда брать AI. Что закончилось благополучно.
 
Вот тебе более сложная задача, рассказать дыбилам как работает теорема отскока.

Посмотреть вложение 84478

Как игроки могут на ПТСе стрелять со стен находясь прямо в притык к непроходимости/не видимости и атакующие с земли нарушая твое описание NWSE. Можешь стать ровно так же и попробовать атаковать.
Sarcasm:

надеюсь после переосмысления логики работы геодаты у мобов хп в 2 раза не поднимется?
 
Речь не про данные реверса. Речь про итоговый продукт на Java.
В моём сообщении овладеть информацией не было и речи о покупке чего либо ) Тоже прямоходящий с двумя руками и головой, что бы попробовать свои силы. Нужна была всего лишь информация которая предлагалась Анатолию (Deazer).

p.s прекращаю демагогию разводит. Благодарен и за малое.
 
кто то делал на яве что б можно было ходить с клавиатуры? - так с этим всё понятно, работает везде и независимо от сервера

а вот как определять столкновения не понятно - принятие / не принятие команд bump type
ненужная штука
 
Назад
Сверху