А очень просто на самом деле. На ПТСе строится ломаная в функцииВот тебе более сложная задача, рассказать дыбилам как работает теорема отскока.
Посмотреть вложение 84478
Как игроки могут на ПТСе стрелять со стен и атакующие с земли нарушая твое описание NWSE
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; //Если же нет, то это фейл и цель не видно.
}
Идея близка к реальности, но нет, лучи формируются в две стороны. У тебя нарушена логика и перенасыщена.А очень просто на самом деле. На ПТСе строится ломаная в функции
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; //Если же нет, то это фейл и цель не видно. }
Претензии к корейцам, у меня просто порт.У тебя нарушега логика и перенасыщена.
//----- (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Пошел вникать) Спасибо за помощь)
У меня полный реверс всего геодвижка, мувинга, пасфинда со всеми ответвлениями и моими оптимизациями. Мне если честно, просто очень лень расписывать уже сегодня, сверх того, что я расписал. Можешь написать мне в личку в ТГ, если у тебя будут какие-то вопросы. В паблик я более чем сейчас кода сливать не стану.Это не призыв идти куда-то, я просто попросил простым языком объяснить людям! Что же это такое и как это работает, вот как простой рубаха парень, рубануть с плеча, сесть за стол! Разлить пару стопок и дать суть! Вот алгебра брат, ну математика неизвестных, выпили, утром спрашиваешь, а он тебе такой 3x2−5x−2=0
а ты ему такой!
x=2a−b±b2−4ac
где a=3a = 3a=3, b=−5b = -5b=−5, c=−2c = -2c=−2.
Спасибо БРАТ!
Идея близка к реальности, но нет, лучи формируются в две стороны. У тебя нарушена логика и перенасыщена.
Это часть логики, ты видимо не вник в полную структуру.
Мне бы очень было интересно овладеть такой информацией )))У меня полный реверс всего геодвижка, мувинга, пасфинда со всеми ответвлениями и моими оптимизациями. Мне если честно, просто очень лень расписывать уже сегодня, сверх того, что я расписал. Можешь написать мне в личку в ТГ, если у тебя будут какие-то вопросы. В паблик я более чем сейчас кода сливать не стану.
$20.000 и я вам ее даже в сервер интегрирую.Мне бы очень было интересно овладеть такой информацией )))
Так она доступна в .pdb от 162 протокола, иди и смотри.Мне бы очень было интересно овладеть такой информацией )))
Ты сам только и пшикаешь в каждой теме, не понимая вообще о чем речьОчень хочется услышать вторую часть логики, и в чем именно перенасыщена логика у Аристо. Ну чтобы это не было очередным пшиком без смысла в тему, и последующим сливом из нее.
Так ты не угрожай, а делай, а там будет видно с кого будут ржать)если ты не перестанешь срать в теме, я не поленюсь, и сделаю тему, где так макну тебя в очевидные твои косяки, что даже от такого дурака и бомжа это будет просто в хлам разнос и конец репы.
А я думал данных с реверса не осталось) а тут дело в $$$$20.000 и я вам ее даже в сервер интегрирую.
есть такое дело, где то лежит. Нужно глянуть. Кстати Aristo мне и подсказал от туда брать AI. Что закончилось благополучно.Так она доступна в .pdb от 162 протокола, иди и смотри.
Речь не про данные реверса. Речь про итоговый продукт на Java.А я думал данных с реверса не осталось) а тут дело в $$$
Вот тебе более сложная задача, рассказать дыбилам как работает теорема отскока.
Посмотреть вложение 84478
Как игроки могут на ПТСе стрелять со стен находясь прямо в притык к непроходимости/не видимости и атакующие с земли нарушая твое описание NWSE. Можешь стать ровно так же и попробовать атаковать.
Sarcasm: |
надеюсь после переосмысления логики работы геодаты у мобов хп в 2 раза не поднимется? |
В моём сообщении овладеть информацией не было и речи о покупке чего либо ) Тоже прямоходящий с двумя руками и головой, что бы попробовать свои силы. Нужна была всего лишь информация которая предлагалась Анатолию (Deazer).Речь не про данные реверса. Речь про итоговый продукт на Java.
ненужная штукакто то делал на яве что б можно было ходить с клавиатуры? - так с этим всё понятно, работает везде и независимо от сервера
а вот как определять столкновения не понятно - принятие / не принятие команд bump type
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?