ЗАКРЫТЬ
Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация


Наши новости:

02-дек
17-апр
30-дек
29-дек

Раскрутка Counter-Strike 1.6

Сохранение переменных при смене карты

Статус пользователя Metal Messiah
сообщение 10.1.2019, 3:27
Сообщение #1


Стаж: 6 лет 8 месяцев

Сообщений: 1380
Благодарностей: 987
Полезность: 1029

HostGame.cf
Кто-нибудь знает почему объявленная таким вот образом
Код
register_event("30", "ChangeMap", "a")

функция ChangeMap() никогда вообще не вызывается?
В ней log_amx(), в консоли и в логе - пусто. plugin_end() вызывается но кому он нужен когда игроки уже вышли а значения переменных затерты.


Полезные публикации - ссылки у меня в профиле.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя SISA
сообщение 10.1.2019, 11:18
Сообщение #2
Стаж: 8 лет 8 месяцев

Сообщений: 2635
Благодарностей: 2782
Полезность: 990

Суть вопроса в чем ? Почему не вызывается эвент или почему не сохраняются какие-то переменные, которые неизвестно как у вас должны сохраняться и для чего и куда ? rolleyes.gif

Да и с какой стати plugin_end начал вызываться до дисконнекта ? В амх 1.8.3 и выше, дисконнект вызывается до plugin_end, а нормальная работа дисконнекта появилась в билдах 5110 или 5120 и выше. До этих билдов, я бы не рекомендовал использовать дисконнект игрока, как точку для пересчета данных, ибо чревато.

Отредактировал: SISA, - 10.1.2019, 11:29
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Metal Messiah
сообщение 10.1.2019, 13:34
Сообщение #3


Стаж: 6 лет 8 месяцев

Сообщений: 1380
Благодарностей: 987
Полезность: 1029

HostGame.cf
Вопрос именно в том почему не вызывается event. Именно этот рекомендуется в интернетах для отлова события смены карты.
Для чего и куда это уже отдельный разговор, само сохранение и чтение я уже написал и отладил.
plugin_end вызывается после дисконнекта всех игроков, но при дисконнекте некоторые значения переменных очищаются (без этого нельзя) потому нужно просто сохранять перед тем как игроки отключатся. Можно сделать какую-то ерунду типа сохранения в конце каждого раунда но это все ерунда...


Полезные публикации - ссылки у меня в профиле.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя mazdan
сообщение 10.1.2019, 14:15
Сообщение #4


Иконка группы

Стаж: 8 лет 5 месяцев

Сообщений: 7316
Благодарностей: 5300
Полезность: 1223

Metal Messiah, можно на event intermission сделать, наверное, после него уже ничего же не происходит. Или он не вызывается при changemap... не уверен, надо больше играть)


Не пишите мне в ЛС. Пишите на почту. В ЛС я пропускаю сообщения.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя SISA
сообщение 10.1.2019, 14:33
Сообщение #5
Стаж: 8 лет 8 месяцев

Сообщений: 2635
Благодарностей: 2782
Полезность: 990

Самое простое, сделать пересчет данных в начале или конце раунду и это ни ерунда, а верное решение.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Metal Messiah
сообщение 10.1.2019, 14:37
Сообщение #6


Стаж: 6 лет 8 месяцев

Сообщений: 1380
Благодарностей: 987
Полезность: 1029

HostGame.cf
Судя по совпадению индекса 30 это и есть InterMission
Код
public plugin_init()
{
     register_event("30", "EV_InterMission", "a" );
}

public EV_InterMission( )
{
     // do stuff here
}


Цитата
register_event ( const event[], const function[], const flags[], [ cond=[], ... ] )
const event[] - Какое событие отлавливаем
const function[] - Функция которую будем вызывать при наступлении события
const flags[] - Флаги


Только я не понимаю почему 1й параметр может быть и строковым и численным (индекс евента)


Полезные публикации - ссылки у меня в профиле.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя SISA
сообщение 10.1.2019, 17:33
Сообщение #7
Стаж: 8 лет 8 месяцев

Сообщений: 2635
Благодарностей: 2782
Полезность: 990

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" derisive.gif

Тебе нужно хукать событие до plugin_end или после ?

P.S. Во, я нашел, что это за триггер: http://ralertmod.narod.ru/smena.htm короче можно сделать смену карты выстрелив по триггеру на карте huh.gif

Отредактировал: SISA, - 10.1.2019, 18:00
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Статус пользователя esterio
сообщение 11.1.2019, 1:03
Сообщение #8
Стаж: 6 лет 5 месяцев
Город: Украина

Сообщений: 200
Благодарностей: 131
Полезность: 500

Сами по себе игроки не выходят. При смене карты АМХХ сам в цыкле перебирает игроков и делает вызов дисконект на каждом из них.
https://github.com/alliedmodders/amxmodx/bl...ta_api.cpp#L688
Но вы можете спокйно хукать ClientDrop с помощью ReAPI. Это и есть выход игрока.

А еще можете использовать https://dev-cs.ru/threads/2638/


Нужно больше %
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Mistrick
сообщение 11.1.2019, 1:56
Сообщение #9


Стаж: 6 лет 4 месяца

Сообщений: 532
Благодарностей: 413
Полезность: 1026

Цитата(Metal Messiah @ 10.1.2019, 8:27) *
функция ChangeMap() никогда вообще не вызывается?

Мап менеджер, который стоит у вас, не вызывает этот эвент при смене карты и скорее всего тупо засылает в консоль "changelevel".
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя mazdan
сообщение 11.1.2019, 11:13
Сообщение #10


Иконка группы

Стаж: 8 лет 5 месяцев

Сообщений: 7316
Благодарностей: 5300
Полезность: 1223

Metal Messiah, да, Mistrick верно говорит, часто плагины, например, с motd в конце карты хукают эвент и отображают мотд, не давая эвент другим плагинам перехватить.
И я тут тоже с SISA тогда согласен, в конце раунда обновлять или запоминать (если триггер для смены карты это конец раунда). Ну или сам disconnect (если данные тех игроков, которые полностью на сервере надо запоминать)


Не пишите мне в ЛС. Пишите на почту. В ЛС я пропускаю сообщения.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Metal Messiah
сообщение 11.1.2019, 14:38
Сообщение #11


Стаж: 6 лет 8 месяцев

Сообщений: 1380
Благодарностей: 987
Полезность: 1029

HostGame.cf
Ну на счет не давая другим перехватить - не знаю, я предполагал что-то подобное и свой в верх списка поставил. Решается формированием данных (сохранением в отдельную переменную) в начале каждого раунда если номер раунда больше единицы, запись в plugin_end, чтение в plugin_cfg.
Ладно, всем спасибо за идеи, изначальная задача решена, причем в конце концов я решил ее абсолютно не так как собирался, обошлось без сохранения данных.

Раз уже тут собралась половина скриптеров этого форума, спрошу в этой же теме хотя вопрос не касается предыдущего.
При подключении в client_authorized идет одна проверка и могут выдаваться флаги set_user_flags(id, read_flags("rs")) при некоторых условиях.
Там же отправляется на web сервер GET запрос и через set_task запускается поток ожидающий ответа. В этой функции идет проверка ответа от сервера и игроку тоже могут выдаваться флаги. А теперь такой момент - при подключении все работает, а при смене карты флаги не выдаются, нужен реконнект. Причем вчера по логам смотрел - при смене карты на игроке отрабатываются события connect, authorized и putinserver так же как и при подключении. Кто-то может вангануть с чем связано?

Отредактировал: Metal Messiah, - 11.1.2019, 14:55


Полезные публикации - ссылки у меня в профиле.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя georgeml
сообщение 11.1.2019, 15:09
Сообщение #12
Стаж: 5 лет 2 месяца

Сообщений: 1407
Благодарностей: 409
Полезность: 341

Metal Messiah,
Цитата
при смене карты на игроке отрабатываются события connect, authorized и putinserver так же как и при подключении

А при смене карты разве не происходит подключение игрока?) Вопрос несколько странный.

Цитата
при подключении все работает, а при смене карты флаги не выдаются, нужен реконнект

Тут сложнее вангануть. Возможно, зависит от этой самой проверки.
Цитата
client_authorized идет одна проверка и могут выдаваться флаги


В таких случаях логирование помогает.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя mazdan
сообщение 11.1.2019, 21:44
Сообщение #13


Иконка группы

Стаж: 8 лет 5 месяцев

Сообщений: 7316
Благодарностей: 5300
Полезность: 1223

Metal Messiah, плагин, который заведует админками перезаписывает флаги чуть позже?


Не пишите мне в ЛС. Пишите на почту. В ЛС я пропускаю сообщения.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Metal Messiah
сообщение 11.1.2019, 22:32
Сообщение #14


Стаж: 6 лет 8 месяцев

Сообщений: 1380
Благодарностей: 987
Полезность: 1029

HostGame.cf
Не, таблица админправ считывается до подключения игроков из базы, а тут время задержки на ответ сервера присутствует. Вот за день логи насобирались изучаю, надо вручную отобрать определенных игроков и посмотреть как они реконнектятся в течение 1го раунда после смены карты...


Полезные публикации - ссылки у меня в профиле.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: