Предположим, что я разрабатываю игру, и существует такая вещь, как респаун. Пользователь может возобновиться через 15 минут. Есть ли распространенная практика, чтобы избежать обмана времени? Я имею в виду, ничто не может остановить пользователя от изменения системного времени и установить его в будущем. Я знаю, частично это можно решить, используя серверную часть, но ничто не может помешать пользователю отключить сеть вообще. PS. игра - кросс-платформа, поэтому решение интересно как для Android, так и для iOS. PS2. Я знаю пару игр, в которых есть решение.Timer anti cheat technique
ответ
Для чего-то подобного вы можете просто начать свой собственный таймер полностью отдельно от системного времени. Если вы начнете отсчет времени на 15 минут, когда игрок умрет, они не смогут изменить ваш внутренний таймер. Я не так хорошо знаком с прошивкой разработчика (NSTimer выглядит как возможность), но я знаю, что в Android это так же просто, как:
// create 30 second internal countdown timer
new CountDownTimer(30000, 3000) {
public void onTick(long millisUntilFinished) {
// store time remaining in database every 3 seconds in case user exits the game
dbHelper.updateDeathTimer(millisUntilFinished);
}
public void onFinish() {
// player respawns now
}
}.start();
Для борьбы с проблемой игроков закрытия игры, которую я хотел бы предложить вам также настроить ваш внутренний таймер для кэширования своего текущего состояния в базе данных с регулярным интервалом, скажем, каждые 30 секунд или около того, если вы собираетесь придерживаться 15-минутного таймера.
Ниже приведен какой-то псевей-код, который может выглядеть, когда игрок выходит из игры, пока они мертвы, и наш респаун-таймер все еще продолжается.
// When game resumes check database and begin updated death timer if necessary
onGameResume() {
if(dbHelper.isUserDead()) {
// resume respawn timer
new CountDownTimer(dbHelper.getRespawnTime(), 15000) {
public void onTick(long millisUntilFinished) {
// store time remaining in database every 15 seconds in case user exits the game
dbHelper.updateDeathTimer(millisUntilFinished);
}
public void onFinish() {
// player respawns now
}
}.start();
}
}
Вы можете сохранить время события (икру в вашем случае), а затем запустить timeIntervalSinceReferenceDate против него и посмотреть, если она превышает лимит (15 минут).
Риск со стороны iOS заключается в том, что приложение переходит на задний план и таймеры останавливаются.
Это не ответ, а просто идея. Что делать, если мы используем tickCount? Каждая операционная система обладает этим свойством. Например, android.os.SystemClock.elapsedRealtime() в Android и [NSProcessInfo processInfo].systemUptime in iOS Они должны указывать требуемые значения.
- 1. Anti Cheat Client
- 2. asp.net session technique
- 3. Valid iframe-like technique
- 4. K NN Technique (sanket077047)
- 5. Javascript Closure technique
- 6. Sprite Batching: advanced technique
- 7. Zend Framework Routing Technique
- 8. IOS Synchronization Technique
- 9. Rendering Technique в OpenGL
- 10. HTML/Javascript Bookmarks technique?
- 11. openmp reduce technique
- 12. Как работает Cheat O'Matic?
- 13. Git cheat sheet
- 14. Objective-C cheat sheet
- 15. Boost cheat sheet
- 16. HTML5 Forms Cheat Sheet
- 17. JavaScript Cheat Sheet
- 18. System.ComponentModel.DataAnnotations cheat sheet?
- 19. Cheat Engine base address
- 20. Cheat Engine vs Ollydbg
- 21. OpenGL Cheat Sheet?
- 22. Zlib compresion technique in asp.net
- 23. URL Generation Technique с PHP
- 24. PHP SQL Injection Prevention Technique
- 25. Как jQuery в Javascript Timer?
- 26. javascript cheat SRC не работает
- 27. Javascript Code Simplification Cheat Sheet
- 28. Flex 4 css cheat sheet
- 29. Rubymine Live Templates cheat sheet
- 30. C# readprocessmemory с Cheat Engine
Это хорошая идея, но если приложение убито пользователем - это не сработает. верный? – DeepThought
@DeepThought Чтобы бороться с этим, вам нужно будет скрыть текущее состояние таймера в каком-то постоянном хранилище (БД) до закрытия приложения. И затем, конечно, загрузите и возобновите таймер, когда приложение (или конкретная игра в приложении) будет возобновлено. – bwegs
это не поможет мне определить, сколько времени приложение было неактивным. – DeepThought