Как остановить таймер в игре
Перейти к содержимому

Как остановить таймер в игре

  • автор:

Как остановить таймер в игре

Gardenscapes

Вопросы и ответы по «Gardenscapes»

Вопрос и ответы были вам полезны?

Да

Нет

Попробуйте также:

Похожие вопросы :

  • У меня на этапе «поставить мост» происходит зависание на одном и том же месте. (Ответов: 6)
  • Как взломать игру? (Ответов: 1)
  • Здравствуйте,подскажите пожалуйста правда ли что сейчас в новой игре нет сундука и. (Ответов: 0)
  • Как пройти 75 уровень в игре Gardenscapes? (Ответов: 2)
  • Как пройти 45 уровень в Gardenscapes? (Ответов: 2)
  • Как пройти 108 уровень в игре Gardenscapes? (Ответов: 2)
  • После последнего обновления игра не запускается. Что делать? (Ответов: 2)
  • Тоже не могу найти палку, что делать? (Ответов: 2)
  • Добрый день. Пишу Вам уже раз 5й,Проблема с начислением бонусов за приглашение друга. (Ответов: 1)
  • Почему исчез бассейн в мини-игре? (Ответов: 1)

Как остановить таймер в игре

ЭТА ИГРА СОДЕРЖИТ КОНТЕНТ, КОТОРЫЙ ВЫ ПРЕДПОЧЛИ СКРЫТЬ:

Эпизодическая демонстрация наготы или сцен сексуального характера

Разработчики описывают контент так:

This game contains references to fantasy drugs (potions), alcohol, sex and sexual acts (no direct visualisation or nudity), along with visual gore effects. Storyline contains adult content.

Показать центр сообщества Отмена

Хотите видеть другой контент в Steam?
Изменить настройки контента

© Valve Corporation. Все права сохранены. Все торговые марки являются собственностью соответствующих владельцев в США и других странах. Часть географических сведений на этом сайте предоставлена geonames.org.
Политика конфиденциальности | Правовая информация | Соглашение подписчика Steam | Файлы cookie

Как остановить (удалить) глобальный таймер

Вот минимальные примеры с комментариями, как это грамотно сделать:

1. Единоразовый таймер с хендлом в глобальной переменной (timer_single.sp)

#include Handle g_iTimer; // глобальная переменная нашего таймера public void OnPluginStart() < HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy); HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy); >// Давайте создадим таймер в начале раунда: public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast) < delete g_iTimer; // удалим предыдущий таймер на случай, если событие "round_start" сработает дважды g_iTimer = CreateTimer(30.0, Timer_Sample); // не ставьте здесь TIMER_FLAG_NO_MAPCHANGE . // потому что переменная с хендлом таймера не будет обнулена автоматически в случае, если произойдёт смена карты прежде, чем сработает таймер >public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast) < delete g_iTimer; // останавливаем таймер на случай, если он ещё не сработал, таким образом этот старый таймер не будет перенесён на новый раунд и не сработает случайно в процессе загрузки уровня // ключевое слово "delete" останавливает таймер и автоматически присваивает ноль переменной. // Заметка: "delete 0" не вызывает срабатывания исключения. >public void OnMapEnd() // требуется, поскольку принудительная смена карты не вызывает событие "round_end" < delete g_iTimer; >public Action Timer_Sample(Handle timer) < // делаем что-либо PrintToChatAll("tick"); // не забываем обнулить здесь переменную-хендл таймера, т.к. после завершения колбека этот хендл станет недействительным g_iTimer = null; >

2. Повторяющийся таймер с хендлом в глобальной переменной (timer_repeat.sp)

#include Handle g_iTimer; public void OnPluginStart() < HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy); HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy); >public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast) < // Давайте создадим таймер в начале раунда: delete g_iTimer; // предотвращает двойной запуск (на всякий случай) // не ставьте сюда флаг TIMER_FLAG_NO_MAPCHANGE . // потому что переменная с хендлом не будет обнулена g_iTimer = CreateTimer(1.0, Timer_Sample, _, TIMER_REPEAT); >public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast) < delete g_iTimer; // ключевое слово "delete" останавливает таймер и автоматически присваивает ноль переменной. // Заметка: "delete 0" не вызывает срабатывания исключения. >public void OnMapEnd() // требуется, поскольку принудительная смена карты не вызывает событие "round_end" < delete g_iTimer; >public Action Timer_Sample(Handle timer) < // полезная нагрузка PrintToChatAll("tick"); return Plugin_Continue; /* Замечание 1: если вы желаете принудительно остановить таймер здесь, вам необходимо сначала присвоить ноль переменной с хендлом таймера g_iTimer = null; return Plugin_Stop; Замечание 2: Никогда не пытайтесь применить delete или KillTimer() на хендле таймера внутри своего же колбека (т.е. здесь). */ >

3. Единоразовый таймер с хендлами для каждого клиента в глобальном массиве (timer_single_per-client.sp)

#include Handle g_iTimer[MAXPLAYERS+1]; public void OnPluginStart() < HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy); HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy); RegConsoleCmd("sm_timer", CmdTestTimer, "Re-starts timer for testing") >Action CmdTestTimer(int client, int args) < delete g_iTimer[client]; g_iTimer[client] = CreateTimer(15.0, Timer_Sample, GetClientUserId(client)); >public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast) < for ( int i = 1; i > > public void OnClientDisconnect(int client) < // детальное объяснение см. в следующем примере delete g_iTimer[client]; >void Reset() < for ( int i = 1; i > public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast) < Reset(); >public void OnMapEnd() < Reset(); >public Action Timer_Sample(Handle timer, int UserId) < int client = GetClientOfUserId(UserId); if ( client && IsClientInGame(client) ) < g_iTimer[client] = null; // что-нибудь делаем // . PrintToChat(client, "tick"); >>

4. Повторяющийся таймер с хендлами для каждого клиента в глобальном массиве (timer_repeat_per-client.sp)

#include Handle g_iTimer[MAXPLAYERS+1]; public void OnPluginStart() < HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy); HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy); RegConsoleCmd("sm_timer", CmdTestTimer, "Starts timer for testing") >Action CmdTestTimer(int client, int args) < // останавливаем таймер, если он уже был запущен // это также установит значение переменной в 0 delete g_iTimer[client]; PrintToChatAll("timer = %i", g_iTimer[client]); // запускаем повторяющийся таймер // передаём ссылку на клиента, таким образом мы сможем убедиться, что он не подменён за время, пока таймер на самом деле не сработает g_iTimer[client] = CreateTimer(15.0, Timer_Sample, GetClientUserId(client), TIMER_REPEAT); >public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast) < for ( int i = 1; i > > public void OnClientDisconnect(int client) < // убедимся, что убили таймер при отключении клиента delete g_iTimer[client]; >void Reset() < for ( int i = 1; i > public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast) < Reset(); >public void OnMapEnd() // требуется, потому что ForceChangeLevel не вызывает события "round_end" < Reset(); >public Action Timer_Sample(Handle timer, int UserId) < // проверяем, является ли тем же клиентом int client = GetClientOfUserId(UserId); // проверка, действителен ли if ( client && IsClientInGame(client) ) < // что-нибудь делаем // . PrintToChat(client, "tick"); return Plugin_Continue; /* или, если вам хочется остановить таймер но, не забудьте сперва обнулить ('null') таймер: g_iTimer[client] = null; return Plugin_Stop; */ >// здесь вы не сможете обнулить переменную таймера, потому что вы не знаете правильный индекс клиента для доступа к массиву хендлов, а поскольку клиент уже мог выйти, то GetClientOfUserId не сработает // поэтому вместо этого мы используем форвард OnClientDisconnect() return Plugin_Stop; >

5. (Без глобальной переменной) Приостанавливаем повторяющийся таймер
— без необходимости управлять хендлом в глобальной переменной (timer_repeat_pause.sp)

/* Этот пример демонстрирует 'Шлепок игрока' через 30.0 сек. задержки от начала раунда и повторяет каждые 2 секунды, пока не закончится раунд. Спасибо Marttt за идею и код. */ #pragma semicolon 1 #pragma newdecls required #include #include #define WAIT_TIME 30.0 float g_fRoundStartTime; public void OnPluginStart() < HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy); HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy); // запускаем таймер, который никогда не будет уничтожен CreateTimer(2.0, Timer_CheckPlayerZone, _, TIMER_REPEAT); >public Action Event_RoundStart(Handle event, const char[] name, bool dontBroadcast) < g_fRoundStartTime = GetEngineTime(); >public Action Event_RoundEnd(Handle event, const char[] name, bool dontBroadcast) < g_fRoundStartTime = 0.0; >public void OnMapEnd() < g_fRoundStartTime = 0.0; >public Action Timer_CheckPlayerZone(Handle timer) < if ( g_fRoundStartTime == 0.0 ) // "приостанавливаем" таймер между событиями "round_end" - "round_start" return Plugin_Continue; if ( GetEngineTime() - g_fRoundStartTime < WAIT_TIME ) // "приостанавливаем" таймер на протяжении 30.0 сек. после "round_start" return Plugin_Continue; for ( int i = 1; i > return Plugin_Continue; >

    Не используйте флаг TIMER_FLAG_NO_MAPCHANGE, если вы присваиваете хендл таймера глобальной переменной с целью дальнейшего контроля таймера через эту переменную позднее.
    — Флаг TIMER_FLAG_NO_MAPCHANGE может быть безопасно использован, если вы создаёте таймер без назначения его хендла переменной.

Plugin «XXX.smx» encountered error 23: Native detected error
[SM] Invalid timer handle XXX (error 3) during timer end, displayed function is timer callback, not the stack trace

  • для повторяющегося таймера, — когда вы передаёте «return Plugin_Stop»
  • для единоразового таймера, — автоматически, как только завершается колбек таймера.
  • в таймерах вида «для каждого игрока», используйте форвард OnClientDisconnect(), чтобы получить индекс массива.
  • в таймерах вида «авто-инкремент»:
const int MAX = 100; Handle g_iTimer[MAX]; int g_iTimerCount; public void OnPluginStart()

для обнуления глобальной переменной (элемента массива) из-под колбека таймера вы можете воспользоваться вспомогательной функцией:

void NullifyHandle(Handle timer) < for( int i = 0; i > >

Использование:

public Action Timer_Sample(Handle timer) < // some code // . NullifyHandle(timer); // найдёт соответствие хендла в массиве и обнулит его return Plugin_Stop; >

    Удаляйте таймер перед его созданием, чтобы избежать случайного его срабатывания дважды; некоторые события, такие как «round_start» имеют привычку вызываться несколько раз (в определённых играх).

Остановка таймера

итак, как остановить таймер:
1. качаем прогу Cheat Engine, лучше последней версии (напоминаю, это v5.6), найти можно на офф. сайте cheatengine.org
2. запускаем игру, в игре прыгаем с обрыва, чтобы запустился таймер (корчое выходим из домашней зоны, чтобы таймер стартанул) и нажимаем f1 (открываем pda), запоминаем время, которое осталось на таймере
3. сворачиваем игру (альт+таб), запускаем Cheat Engine, там выбираем процесс justcause2.exe, выбираем unknown initial value в пункте scan type, выбираем 4 bytes в value type и жамкаем по кнопке first scan
4. разворачиваем игру, снимаем с паузы (выходим из PDA) и снова заходим в PDA побегав по миру секунд 10-20, например.
5. запоминаем сколько времени на счетчики осталось (предыдущее что мы запоминали не забываем))) снова сворачиваем игру, разворачиваем Cheat Engine и ищем новое значение, предварительно в scan type выбрав increased value by, вписав в value разницу во времени (в секундах) между первым и вторым таймером (значения которых мы запоминали) и жамкаем next scan
6. повторяем пункты 4, 5 пока не найдем нужное нам значение (в таблице останется, по идее, одно значение, его адрес чаще всего на 1А5 начинается; каждый раз вводить нужно разницу между предыдущим и нынешним таймером)
7. когда значение останется одно, кликаем по нему два раза, оно перенесется в таблицу внизу, там ставите в графе freeze галочку и играете на здоровье сколько хотите =)

написал бы патчилку, да только лениво до жути, надеюсь найдется какой-нибудь умелец, который это вместо меня сделает))

З.Ы. Cheat Engine после заморозки таймера НЕ закрывайте!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *