Follow along with the video below to see how to install our site as a web app on your home screen.
Примечание: This feature may not be available in some browsers.
Ну он хотя бы поедет) сейчас ближайшие целиНовый велосипед будет лучше ? Терпения в начинаниях ))
НетНовый велосипед будет лучше ? Терпения в начинаниях ))
А в какой плоскости это синус и косинус?Вектор монет для тестов)
Естественно, с добавлением модификаторов скорость бега, и скорость шага - либо увеличиваются, либо уменьшаются, либо вовсе может выдать сообщение( вы не можете двигаться).Есть ли формула для walk speed ? (baseWalkSpd)
Или он всегда 80 для Human Fighter?
С увеличением скорости бега. Скорость шага как-то меняется?
moving_speed_begin
FFighter={80; 115; 122; 122; 0; 0; 0; 0}
MFighter={80; 115; 122; 122; 0; 0; 0; 0}
FMagic={78; 120; 122; 122; 0; 0; 0; 0}
MMagic={78; 120; 122; 122; 0; 0; 0; 0}
FElfFighter={90; 125; 122; 122; 0; 0; 0; 0}
MElfFighter={90; 125; 122; 122; 0; 0; 0; 0}
FElfMagic={85; 122; 122; 122; 0; 0; 0; 0}
MElfMagic={85; 122; 122; 122; 0; 0; 0; 0}
FDarkelfFighter={85; 122; 122; 122; 0; 0; 0; 0}
MDarkelfFighter={85; 122; 122; 122; 0; 0; 0; 0}
FDarkelfMagic={85; 122; 122; 122; 0; 0; 0; 0}
MDarkelfMagic={85; 122; 122; 122; 0; 0; 0; 0}
FOrcFighter={70; 117; 122; 122; 0; 0; 0; 0}
MOrcFighter={70; 117; 122; 122; 0; 0; 0; 0}
FShaman={70; 121; 122; 122; 0; 0; 0; 0}
MShaman={70; 121; 122; 122; 0; 0; 0; 0}
FDwarfFighter={80; 115; 122; 122; 0; 0; 0; 0}
MDwarfFighter={80; 115; 122; 122; 0; 0; 0; 0}
moving_speed_end
else if ( !wcscmp(this->parsing_context, L"moving_speed") )
{
if ( this->DoubleVector._Mypair._Myval2._Mylast - this->DoubleVector._Mypair._Myval2._Myfirst != 8 )
CLog::Add(
&Log,
LOG_ERROR,
(wchar_t *)L"%s line[%d], moving_speed int counter is different",
g_DataScriptFile_106[56],
this->m_lexer.line);
v25 = this->DoubleVector._Mypair._Myval2._Myfirst;
LODWORD(v4_8) = (int)v25[4];
LODWORD(v4) = (int)v25[3];
LODWORD(v3) = (int)v25[2];
LODWORD(value_8) = (int)v25[1];
LODWORD(field) = 32;
CPCParamDB::SetValueBySRC(
&g_PCParamDB,
v86.sex,
v86.race,
v86.cls,
field,
(int)*v25,
value_8,
v3,
v4,
v4_8,
(int)v25[5],
(int)v25[6],
(int)v25[7]);
}
void __fastcall CPCParamDB::SetValueBySRC(
CPCParamDB *this,
int sex,
int race,
int fm,
__int64 field,
int v1,
__int64 v2,
__int64 v3,
__int64 v4,
__int64 v5,
int v6,
int v7,
int v8)
{
double *v13; // rdx
wchar_t *v1a; // [rsp+30h] [rbp+30h]
if ( (_DWORD)field == 32 )
{
v13 = (double *)((fm + 2 * (race + 30i64 * sex)) << 6);
v13[58680664] = (double)v1;
v13[58680668] = (double)(int)v2;
v13[58680665] = (double)(int)v3;
v13[58680669] = (double)(int)v4;
v13[58680666] = (double)(int)v5;
v13[58680670] = (double)v6;
v13[58680667] = (double)v7;
v13[58680671] = (double)v8;
}
else
{
v1a = _PCParamFieldBySRC[(int)field];
LODWORD(field) = 1513;
CLog::Add(
&Log,
LOG_ERROR,
(wchar_t *)L"[%s][%d] Unknown field[%s] setting",
L"pc_param.cpp",
field,
v1a,
v2,
v3,
v4,
v5);
}
}
wchar_t *_PCParamFieldBySRC[37] =
{
L"PC_INT_DEFAULT",
L"PC_INT_MIN",
L"PC_INT_MAX",
L"PC_STR_DEFAULT",
L"PC_STR_MIN",
L"PC_STR_MAX",
L"PC_CON_DEFAULT",
L"PC_CON_MIN",
L"PC_CON_MAX",
L"PC_MEN_DEFAULT",
L"PC_MEN_MIN",
L"PC_MEN_MAX",
L"PC_DEX_DEFAULT",
L"PC_DEX_MIN",
L"PC_DEX_MAX",
L"PC_WIT_DEFAULT",
L"PC_WIT_MIN",
L"PC_WIT_MAX",
L"PC_BASE_PATTACK",
L"PC_BASE_CRITICAL",
L"PC_BASE_ATTACK_TYPE",
L"PC_BASE_ATTACK_SPEED",
L"PC_BASE_PDEFEND",
L"PC_BASE_MATTACK",
L"PC_BASE_MDEFEND",
L"PC_BASE_CAN_PENETRATE",
L"PC_BASE_ATTACK_RANGE",
L"PC_BASE_DAMAGE_RANGE",
L"PC_BASE_RAND_DAM",
L"PC_ORG_HP_REGEN",
L"PC_ORG_MP_REGEN",
L"PC_ORG_CP_REGEN",
L"PC_MOVING_SPEED",
L"PC_ORG_JUMP",
L"PC_BREATH_BONUS",
L"PC_SAFE_FALL_HEIGHT",
L"PC_COLLISION_BOX"
}; // idb
По поводу движения, рекомендовал бы ознакомиться с такими видеоUpdate
* Перемещение через tasks (создается задача на перемещение по вектору до конечных координат. Персонаж не телепортируется для сервера а идет по шагам.)
* Атака. Проверка на дистанцию. Перемещение. (В работе. Есть моменты, когда не до конца доходит)
Это уже следующие этапы(pathfind)По поводу движения, рекомендовал бы ознакомиться с такими видео
, для node js должно быть проще такое реализовывать, соответственно и сервера могут быть специфичные .
Есть подозрение, что пакетхак ответит на твои вопросы как минимум быстрее и качественнее.Как рассчитывается перемещение на сервере? Атака при перемещении.
Само перемещение работает корректно. А если с атакой то есть расхождение.
Я сделал так
* RequestAttack
* Делаю задачу на перемещение. При скорости Human Fighter 126 время между тиками ~900mc
Каждые 900mc идет изменение координат на сервере.
* MoveToLocation (x1... => x2...)
* Когда дистанция 0 (пришли в точку) задача останавливается.
* sendPacket(Attack)
Но на больших или очень малых расстояниях идет рассинхронизация.
То чар ждет перед npc и начинает атаковать через какое-то время то начинает атаку не добегая. Понятно, что время 900mc я сделал путем подбора. Можно конечно привязаться к ValidatePosition (надо копать но вроде он отправляется не только по таймеру но и в момент старта и в момент прихода в конечный пункт)
А как быть с NPC?
1) Как рассчитать время между тиками в ходьбе?
2) Или как иначе синхронизировать ходьбу на клиенте и сервере?
Да не нужно брать Яву или лезть в птс. Восстанавливать алгоритмы пакетного обмена наугад, это просто очень тяжело, т.к там очень много ньюансов. Поэтому, если взять тот же пакетхак, то с ним проще намного какие-то вещи определять, т.к там буквально открыл лог и посмотрел.Человеку нравится страдать, не мешай) разумно было бы найти как сделано в хороших явах, найти в декомпиле птс, и выбрать лучшее решение из найденых. Но тут нет задачи сделать лучше, а надо просто изобрести велосипед ))
Да не нужно брать Яву или лезть в птс. Восстанавливать алгоритмы пакетного обмена наугад, это просто очень тяжело, т.к там очень много ньюансов. Поэтому, если взять тот же пакетхак, то с ним проще намного какие-то вещи определять, т.к там буквально открыл лог и посмотрел.
Нашёл в чем проблема. Задача по времени отрабатывает идеально. Осталось формулу подогнать (я так понимаю она линейна)Есть подозрение, что пакетхак ответит на твои вопросы как минимум быстрее и качественнее.
Наверное лучше снифануть какие пакеты отправляет птс и сразу все будет проще. Даже наверное по нормальному нужно создавать блок схемы, какие и сколько пакетов шлет птс и в какое время, а дальше просто повторятьUPD
Нашел идеальную формулу для бега
125000
125000 / 126 (126 human figther минимальный бег) ~ 992mc
125000 / 500 = 250mc
Даже если взять 125000 / 1000 = 125мс (Такой бег невозможен но синхронизация с аденой(DropItem) *идеальная)
*На старте. Потом происходит лаг пакета. Думаю такое фиксить через validate position чтобы корректировать позицию игрока.