[1.6.4] Игрок и его передвижение / Антиспидхак

675
2
Доброго времени суток.

Как можно из PlayerEvent получить скорость игрока? Либо я найти не могу, либо у Entity таки нет чего-нибудь на подобие getMoveSpeed и придется ручками относительно изменения координат измерять.

Как можно откатить движение игрока, не прибегая к сохранению его координат и последующей телепортации его на них? Мб есть какой-нибудь эвент?
 
1,990
18
105
Про скорость:

Код:
entityPlayer.capabilities.getWalkSpeed();

EDIT:
Но это статичная скорость, лал. Скажем, максимальная для ходьбы.
Для данной скорости используется motionX\Y\Z.
Как заметил laz, тебе легче посчитать вектор перемещения, составленного из нужных векторов скорости и откатить на него перемещение.
 
905
5
1) Блин, у тебя есть целая энтити со всеми открытыми переменными. Если искать лень, возьми motion* и посчитай через теорему Пифагора.
2) Никак.
 
675
2
f1rSt1k написал(а):
А как через теорему Пифагора?
Вроде оно



Как-то так:
Код:
double playerSpeed =  Math.abs(Math.pow((event.entityPlayer.posX - event.entityPlayer.lastTickPosX), 2) + (Math.pow((event.entityPlayer.posY - event.entityPlayer.lastTickPosY), 2) + (Math.pow((event.entityPlayer.posZ - event.entityPlayer.lastTickPosZ), 2))));

Но я едва могу получить скорость, отличную от 0.(изредка проскакивает что-то на подобие 0.15791038486732595)

Позже попробую каждые 20 тиков писать свой lastPos*.
 
1,990
18
105
Эммм. Нет ._.
Геометрия уровня /b 7 класса.
C = V(A^2 + B^2), V - корень, ^2 - возведение в степень.
В коде так:

Код:
double playerSpeed = Math.hypot(motionX, motionZ); - это через встроенную
double playerSpeed = Math.sqrt(motionX*motionX + motionZ*motionZ); - это ручками.
Откуда ты вообще взял этот код? Откуда там модуль? |AB| - обозначение длины вектора. А длина находится по Пифагору.
 
675
2
Oldestkon написал(а):
Эммм. Нет ._.
Геометрия уровня /b 7 класса.
C = V(A^2 + B^2), V - корень, ^2 - возведение в степень.
В коде так:

Код:
double playerSpeed = Math.hypot(motionX, motionZ); - это через встроенную
double playerSpeed = Math.sqrt(motionX*motionX + motionZ*motionZ); - это ручками.
Откуда ты вообще взял этот код? Откуда там модуль? |AB| - обозначение длины вектора. А длина находится по Пифагору.
Выходит, что на том сайте ошибка:
Код:
|AB| = √(ABx² + ABy² + ABz²) = √((x – x0)² + (y – y0)² + (z – z0)²) // Тут корень забыли дописать
[merge_posts_bbcode]Добавлено: 12.05.2014 23:50:20[/merge_posts_bbcode]

А я же хотел сделать что-то в это духе:
Код:
double myPlayerSpeed = Math.sqrt(Math.pow((11 - 1), 2) + (Math.pow((11 - 1), 2)));
(11 - 1) - в данном случае motion*. Воот.

В случае с вашим кодом получается похожая картина: изредка проскакивают всякие 0.06109056141203311.
Значит мне все таки стоит сделать свои "последние координаты" раз в секунду?
Код:
double playerSpeed = Math.hypot(event.entityPlayer.motionX, event.entityPlayer.motionZ);
 
1,990
18
105
Мм, координаты игрока не изменяются ровно по закону x += motionX, z += motionZ, там не ПРУД. Там куча своих операций, учитываются зелья и прочее.
Вообще да, тебе надо найти разницу между координатами и привести в векторную форму.

Код:
deltaX = posX - lastTickPosX;
deltaZ = posZ - lastTickPosZ;
double momentSpeed = Math.hypot(posX, posZ);

P.S. Корень там написан, даже в твоей цитате его видно:
Код:
|AB| = √
Код:
 
675
2
Я имел в виду вот это место:
Код:
√((x – x0)² + (y – y0)² + (z – z0)²) // В оригинале тут нет корня
 
Зачем такие сложности? Что там автор то пишет?.. Интересно прям стало.
 
1,990
18
105
> Теорема Пифагора
> Сложности
Не ну это совсем. Реализацию кватерниона для скелетной анимации, пожалуй можно назвать сложной (да и то не со стороны кода), но тут совсем зашквар, такого не знать.
А потом говорят, что математика программистам не нужна.
 
675
2
laz2727 написал(а):
Неа.
[merge_posts_bbcode]Добавлено: 13.05.2014 15:07:23[/merge_posts_bbcode]

Кстати да. Пока я не начал городить костыли...

Разумно ли реализовывать серверный античит на Forge'е?
Я руководствуюсь тем, что так будет легче заточить его под моды. Т.е. проще - форжевские эвенты, прямые запросы к api нужных модов и.т.д.
 
2,955
12
Если твой мод стоит на клиенте,то его можно реализовать. Просто проверять, если загружен мод с айди к примеру "XrayForge" то тупо остановить загрузку клиента.
 
675
2
Dragon2488 написал(а):
Если твой мод стоит на клиенте,то его можно реализовать. Просто проверять, если загружен мод с айди к примеру "XrayForge" то тупо остановить загрузку клиента.
Я потерял веру в защиту на стороне клиента. Серверный античит невозможно обойти.
Раньше проверка каждого класса в клиенте на совпадение с базой "читерских".
 
1,990
18
105
Вообще абсолютно любую попытку проверки "настоящести" клиента можно обойти. И md5, и прочее. Почему?
Потому что есть доступ к коду и код можно менять. А ещё можно делать свои лаунчеры, можно копаться сторонним софтом в памяти и так далее. Поэтому единственно верная защита - на стороне сервера, которая абсолютно не касается клиента. И это обычные проверки входящих данных на валидность или вовсе полная реализация всей нужной механики игры на сервере.
Хотя клиент-защита поможет защититься от большинства обычных игроков.
 
675
2
Мне легче будет написать проверку скорости + исключения для каждого отдельного предмета, чем таскать java вместе с клиентом.
Ну а в общем, и там и там можно нагородить условий/проверок. Хотел бы мне увидеть лицо "хакера", который обойдет все мои костыли и не сможет сделать и шагу с читами в игре :)
А для защиты кода можно заобфусцировать лаунчер до смерти, но это лишь дополнительные затраты.
 
Сверху