Сохранение переменных при смене карты |
Здравствуйте, гость Вход | Регистрация
Наши новости:
|
|
|
Сохранение переменных при смене карты |
SISA
|
10.1.2019, 14:33
Сообщение
|
|
|
Самое простое, сделать пересчет данных в начале или конце раунду и это ни ерунда, а верное решение.
|
Поблагодарили 1 раз
|
|
SISA
|
10.1.2019, 17:33
Сообщение
|
|
|
Metal Messiah, register_event видимо умный и может хавать как название мессаги, так и её номер. Я так понимаю, речь там идет о мессаге "SVC_INTERMISSION": https://wiki.alliedmods.net/Half-Life_1_Eng...VC_INTERMISSION #define SVC_INTERMISSION 30 и 30 в случае и хуком, это не число, а строка. Судя по сурсам, SVC_INTERMISSION вызывается только в пяти случаях: Заканчивается лимит времени: Cкрытый текст Код BOOL CHalfLifeMultiplay::CheckTimeLimit(void) { if (timelimit.value < 0) { CVAR_SET_FLOAT("mp_timelimit", 0); return FALSE; } if (timelimit.value) { g_flTimeLimit = g_flResetTime + timelimit.value * 60; if (g_flTimeLimit <= gpGlobals->time) { ALERT(at_console, "Changing maps because time limit has been met\n"); GoToIntermission(); return TRUE; } } return FALSE; } Максимальное количество раундов: Cкрытый текст Код BOOL CHalfLifeMultiplay::CheckMaxRounds(void) { if (!m_iMaxRounds) return FALSE; if (m_iTotalRoundsPlayed < m_iMaxRounds) return FALSE; ALERT(at_console, "Changing maps due to maximum rounds have been met\n"); GoToIntermission(); return TRUE; } Максимальное количество побед одной из команд: Cкрытый текст Код BOOL CHalfLifeMultiplay::CheckWinLimit(void) { if (!m_iMaxRoundsWon) return FALSE; if (m_iNumCTWins < m_iMaxRoundsWon && m_iNumTerroristWins < m_iMaxRoundsWon) return FALSE; ALERT(at_console, "Changing maps...one team has won the specified number of rounds\n"); GoToIntermission(); return TRUE; } Некий экзотический вызов с применением триггера на карте (даже не знаю, где такое используется... Видимо в картах на прохождение разбитых на несколько частей): Cкрытый текст Код void NextLevel(void) { CChangeLevel *pChange; edict_t *pent = FIND_ENTITY_BY_CLASSNAME(NULL, "trigger_changelevel"); if (FNullEnt(pent)) { gpGlobals->mapname = ALLOC_STRING("start"); pChange = GetClassPtr((CChangeLevel *)NULL); strcpy(pChange->m_szMapName, "start"); } else pChange = GetClassPtr((CChangeLevel *)VARS(pent)); strcpy(st_szNextMap, pChange->m_szMapName); g_fGameOver = TRUE; if (pChange->pev->nextthink < gpGlobals->time) { pChange->SetThink(&CChangeLevel::ExecuteChangeLevel); pChange->pev->nextthink = gpGlobals->time + 0.1; } } Ещё есть вызов в InitHUD с условием g_fGameOver, но вызов мессаги идет персонально на игрока. Видимо какой-то дополнительный костыль. Для теста можешь поставить себе mp_maxrounds 1 и после первого раунда будет вызов чудесного "Intermission" Тебе нужно хукать событие до plugin_end или после ? P.S. Во, я нашел, что это за триггер: короче можно сделать смену карты выстрелив по триггеру на карте
Отредактировал: SISA, - 10.1.2019, 18:00
|
Поблагодарили 2 раз
|
|
Mistrick
|
11.1.2019, 1:56
Сообщение
|
![]() |
|
Поблагодарили 1 раз
|
|
mazdan
|
11.1.2019, 21:44
Сообщение
|
![]() ![]() |
![]() Не пишите мне в ЛС. Пишите на почту. В ЛС я пропускаю сообщения.
|
|
|
|
![]() ![]() |