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

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

AlhimN1

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

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


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 отрезках ломаной.
 
Идея близка к реальности, но нет, лучи формируются в две стороны. У тебя нарушена логика и перенасыщена.
 
У тебя нарушега логика и перенасыщена.
Претензии к корейцам, у меня просто порт.

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.
Спасибо БРАТ!
 
У меня полный реверс всего геодвижка, мувинга, пасфинда со всеми ответвлениями и моими оптимизациями. Мне если честно, просто очень лень расписывать уже сегодня, сверх того, что я расписал. Можешь написать мне в личку в ТГ, если у тебя будут какие-то вопросы. В паблик я более чем сейчас кода сливать не стану.
 

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

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

    BladeRunner

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

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

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

p.s прекращаю демагогию разводит. Благодарен и за малое.
 
ненужная штука
 
Данный сайт использует cookie. Вы должны принять их для продолжения использования. Узнать больше…