А зачем в начале темы ты пишешь что используешь Finish fly
Если по сути этот метод не как не обрабатывает скилы с багом ?
Тут весь глюк в неверных расчетах или точнее заглушках,
вот зачем присваивать loc = applyOffset(target.getLoc(), (int) target.getColRadius()+40); с левым радиусом, от 8-20+40 ?
а потом снова присваивать Loc от цели , если она "чем то закрыта" , получается что присваивание Offset не как не влияет .
как по мне это та самая проблема, и она возможно глубжке( в самом canMoveToCoord) .
P.S.
Вот честно зачем делать отдельный метод SetLocOnFly , если все что он делает это перемещает по XYZ .И я бы глянул что из себя представляет этот XYZ у тебя!
Да и пихать в getFlyLocation проверки которые в большенстве дублируют те что в обычном getLocation, на мой взгляд не стоит .
И как вот это понимать ?
/**
* проверка проходимости по прямой
*/
private static boolean canMove(int __x, int __y, int _z, int __tx, int __ty, int _tz, boolean withCollision, int geoIndex)
{
int _x = __x - World.MAP_MIN_X >> 4;
int _y = __y - World.MAP_MIN_Y >> 4;
int _tx = __tx - World.MAP_MIN_X >> 4;
int _ty = __ty - World.MAP_MIN_Y >> 4;
int diff_x = _tx - _x, diff_y = _ty - _y;
int incx = sign(diff_x), incy = sign(diff_y);
final boolean overRegionEdge = ((_x >> 11) != (_tx >> 11) || (_y >> 11) != (_ty >> 11));
if(diff_x < 0)
diff_x = -diff_x;
if(diff_y < 0)
diff_y = -diff_y;
int pdx, pdy, es, el;
if(diff_x > diff_y)
{
pdx = incx;
pdy = 0;
es = diff_y;
el = diff_x;
}
else
{
pdx = 0;
pdy = incy;
es = diff_x;
el = diff_y;
}
int err = el / 2;
int curr_x = _x, curr_y = _y, curr_z = _z;
int next_x = curr_x, next_y = curr_y, next_z = curr_z;
short[] next_layers = new short[MAX_LAYERS + 1];
short[] temp_layers = new short[MAX_LAYERS + 1];
short[] curr_layers = new short[MAX_LAYERS + 1];
NGetLayers(curr_x, curr_y, curr_layers, geoIndex);
if(curr_layers[0] == 0)
return true;
for(int i = 0; i < el; i++)
{
err -= es;
if(err < 0)
{
err += el;
next_x += incx;
next_y += incy;
}
else
{
next_x += pdx;
next_y += pdy;
}
boolean regionEdge = overRegionEdge && ((next_x >> 11) != (curr_x >> 11) || (next_y >> 11) != (curr_y >> 11));
NGetLayers(next_x, next_y, next_layers, geoIndex);
if((next_z = NcanMoveNext(curr_x, curr_y, curr_z, curr_layers, next_x, next_y, next_layers, temp_layers, withCollision, regionEdge, geoIndex)) == Integer.MIN_VALUE)
return false;
short[] t = curr_layers;
curr_layers = next_layers;
next_layers = t;
curr_x = next_x;
curr_y = next_y;
curr_z = next_z;
}
int diff_z = curr_z - _tz;
if(Config.ALLOW_FALL_FROM_WALLS) // Разрешить падать со стен ?
return diff_z < Config.MAX_Z_DIFF ? true : false;
if(diff_z < 0)
diff_z = -diff_z;
return diff_z > Config.MAX_Z_DIFF ? false : true; // Проверка на максимальное отклонение по координате Z
}
public void setXYZ(int x, int y, int z)
{
_x = World.validCoordX(x);
_y = World.validCoordY(y);
_z = World.validCoordZ(z);
World.addVisibleObject(this, null);
}
Желательно тебе это все в режиме дебага проследить . В качестве теста выпили offset из getflyloc и проверь как будет. Если так же выпиливай SetLocOnFly и FinishFly. И я так понял то что ты скидывал это не оригинал , а обрезаное ? Тебе тогда проще глянуть в лыжу где этого бага нету , или в декомпил л2сервера, а так это все пальцем в небо.
// Before start AI Cast Broadcast Fly Effect is Need
if (skill.getFlyType() != null)
{
ThreadPoolManager.getInstance().scheduleEffect(new FlyToLocationTask(this, target, skill), 50);
}
if (_character != null)
{
_character.broadcastPacket(new FlyToLocation(_character, _target, _skill.getFlyType()));
_character.setXYZ(_target.getX(), _target.getY(), _target.getZ());
}
Всмысле копать глубже ? Тебе же раз в 50мс кастует пакет( с локой моба), моб дохнет и отправляет null , сделай if target null, finishMovement( остановись там где надо)
Посмотри что у тебя за значения в локе , когда моб здох, они скорее всего левые, а те 50 мс похоже не на задержку , а на повторное в потоке раз в 50 мс , но опять же я не вижу всего кода ! И брейк ты должен ставить в пул менеджерscheduleEffect проигрывается один раз грубо говоря, поставил на всякий условие на null, но дело опять же не в нем, null он не возвращает (это бы сразу вылезло в консоль сервера)
Можно попробовать обернуть бродкаст пакета в try {} catch {}.
Мне кажется нужно смотреть в сторону пакета Die, возможно фукнции по типу onDeath и смежные выставляют лишние переменные или опять же содержат заглушки
Посмотри что у тебя за значения в локе , когда моб здох, они скорее всего левые, а те 50 мс похоже не на задержку , а на повторное в потоке раз в 50 мс , но опять же я не вижу всего кода ! И брейк ты должен ставить в пул менеджер
case CHARGE:
//_flyLoc = getFlyLocation(target, skill);
if(_flyLoc != null) {
//broadcastPacket(new FlyToLocation(this, _flyLoc, skill.getFlyType()));
setPrevLoc(getLoc());
_newFlyTask = ThreadPoolManager.getInstance().scheduleEffect(new NewRushTask(this, target, skill), 50);
}
else
{
sendPacket(SystemMsg.CANNOT_SEE_TARGET);
return;
}
public static class NewRushTask extends RunnableImpl
{
public Creature _character;
public GameObject _target;
public Skill _skill;
public NewRushTask(Creature character, GameObject target, Skill skill)
{
_character = character;
_target = target;
_skill = skill;
}
@Override
public void runImpl()
{
if(_target == null)
return;
if(_character.isPlayer())
_character.getPlayer().sendMessage("Target log: "+_target.getLoc());
if(!_character.isCastingNow()){
_character.clearFlyTask();
return;
}
_character.broadcastPacket(new FlyToLocation(_character, _target.getLoc(), _skill.getFlyType()));
_character.setXYZ(_target.getX(), _target.getY(), _target.getZ());
}
}
public void clearFlyTask() {
_newFlyTask = null;
}
Мувинг не трогал за исключением глупых заглушек, в самом мувинге никаких явных проблем не заметил по дебагу, весь путь корректно просчитывается. Смысл его трогать? Мне нужно найти причину отброса к позиции FlyToLocation-пакета. Дело в том что перемещает даже не SetLoc а что-то иное.@TheMads, т.е хочешь сказать ты за день переписал весь мувинг? А то и меньше
Не читал с начала, но все равно напишу:Мувинг не трогал за исключением глупых заглушек, в самом мувинге никаких явных проблем не заметил по дебагу, весь путь корректно просчитывается. Смысл его трогать? Мне нужно найти причину отброса к позиции FlyToLocation-пакета. Дело в том что перемещает даже не SetLoc а что-то иное.
Не читал с начала, но все равно напишу:
После отправки пакета FlyToLocation всегда серверу шлется пакет ValidatePosition. Вы уверены, что вас кидает не этот пакет?
И еще: для правильной работы полетных скиллов необходимо сначала установить координаты, а потом только отправить пакет FlyToLocation.
кидает из-за пакета ValidateLocation который приходит после использования скила
Давно этим не занимался, но валидейтПозишн отправляется только от клиента, если я правильно помню, валидейтЛокейшн отправляется при определенном не совпадении координат и каждый определенный промежуток времени конкретно клиенту, в птс валидейЛокейшн не отправляется клиенту после чаржа, тут же отправляется, что и является проблемой, поправьте если я не правСпорный момент, я переписал мувинг на основе текущего более оффлайк, т.е ValidateLocation используется только при выделении на таргет, при слишком большой разнице клиент-серверных координат и еще паре моментов.
Сам пакет после юза прописывался в finishFly(), он для чардж скилов у меня не используется (только для DUMMY и других типов полетов)
При этом после использования скила ValidateLocation не приходит, приходит ValidatePosition, но пакет ValidatePosition в моем случае не обрабатывает ничего во время юза и после юза скила в течении некоторого времени разницы в координатах
При этом сам баг не число клиентский, персонажа так же кидает и для игроков со стороны, при первом же передвижении ValidatePosition отрабатывает и возвращает большой diff что либо с помощью пакета ValidateLocation резко переместит персонажа или даже телепортирует в локацию где он по идее должен быть
Все верно, на данный момент (у меня) чардж скил перемещает к противнику (ближайшей точке) а не за спину. На ПТС валидейтлокейшен отправляется вообще в редких случаях (не знаю почему в яве он на каждом шагу). На данный момент после скила он не отправляется (отправляется только клиентский пакет). Более того - для теста я вообще вырезал полностью функционал ValidatePosition и комментил все отправки ValidateLocation. Это не помогает.п.с. Кстати, сам чарж работает не правильно, он с любой позиции перемещает игрока за спину противнику, но это не блинк ножа, это чарж, этот скил должен приближать к врагу на минимальное расстояние, а не за спину
Сурсы какие? Лосты? Потому что я заблокировав в пакетнике ValidateLocation избавился от данного бага, потому и думаю что нужно копать в эту же сторону
fandc или как то так? те сырки что на забугорном форуме зашарили?На основе ребы, форкнутая с лостом
Не, такое г***о я бы в жизни за основу не взял)fandc или как то так? те сырки что на забугорном форуме зашарили?
хезе, судя по видосикам с лайва и вообще отзывам, не такое и говно, хотя вообще хз, не смотрел что они из себя представляютНе, такое г***о я бы в жизни за основу не взял)
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?