Ошибка в оверлееЗдравствуйте. Помогите пожалуйста. Установил этот плагин, но он не работает, в консоле пишет:
Error reading file resource/flash/undefined_small.png.
KeyValues Error: LoadFromBuffer: missing { in file materials/overlay/k31z.vmt line 2
KeyValues Error: LoadFromBuffer: missing { in file materials/overlay/k31z.vmt line 4
KeyValues Error: LoadFromBuffer: missing { in file materials/overlay/k31z.vmt line 5
KeyValues Error: LoadFromBuffer: missing { in file materials/overlay/k31z.vmt line 6
ставим баннер при появлении на 2930290 секунд.А можно сделать, чтобы всегда показывался баннер с рекламой? Или может это другой плагин какой-то?
ставим баннер при появлении на 2930290 секунд.
Баннер убирают только другие баннеры, есть пагин при попадании делает красную обводку у прицела - это мини оверлей, из-за него пропадает.сделал вот так, было просто 0.0, но оверлей пропадал , с 2930290 секунд прокатит? Если макс написано 30 *_*
--- Добавлено позже ---
а вывод сообщений с рекламы типа C , которые по середине экрана появляются, могут убирать баннер?
--- Добавлено позже ---
не понимаю почему пропадает оверлей, один тестирую все ок, заходит еще пару человек и начинается( и начинается вроде все при смене карты
сейчас все включу, просто проблема в том, что сервер bhop , тут карты по 20+ минут и люди 20 + минут не умирают и т.д.((( но и плагина прицела тоже нетБаннер убирают только другие баннеры, есть пагин при попадании делает красную обводку у прицела - это мини оверлей, из-за него пропадает.
Можно засунуть что бы этот оверлей показывало при смерти, в конце раунда, при спавне - и он точно не будет выключаться. И не 392482 сек, а 0 - навсегда
[SM] Exception reported: Client index 0 is invalid
[SM] Blaming: OverlaySystem.smx
[SM] Call stack trace:
[SM] [0] ClientCommand
[SM] [1] Line 345, \OverlaySystem.sp::ShowDeathOverlayToClient
[SM] [2] Line 235, \OverlaySystem.sp::Timer_Death
public Action Timer_Death(Handle hTimer, int iUserId)
{
int iClient = GetClientOfUserId(iUserId);
float l_TimerPostOverlay = g_cDeathOverlayPostTimer.FloatValue;
if (iClient && !IsPlayerAlive(iClient)) // Если игрок 0, то идем дальше ;)
{
return Plugin_Continue;
}
if (l_TimerPostOverlay == 0.0)
{
ShowDeathOverlayToClient(iClient);
}
if (l_TimerPostOverlay > 0.0)
{
CreateTimer(l_TimerPostOverlay, Timer_PostOverlay, iUserId, TIMER_FLAG_NO_MAPCHANGE);
}
return Plugin_Continue;
}
public Action Timer_Death(Handle hTimer, int iUserId)
{
int iClient = GetClientOfUserId(iUserId);
float l_TimerPostOverlay = g_cDeathOverlayPostTimer.FloatValue;
if (!iClient || IsPlayerAlive(iClient)) // Если игрок 0 или он жив, то прерываем
{
return Plugin_Continue;
}
if (l_TimerPostOverlay == 0.0)
{
ShowDeathOverlayToClient(iClient);
}
if (l_TimerPostOverlay > 0.0)
{
CreateTimer(l_TimerPostOverlay, Timer_PostOverlay, iUserId, TIMER_FLAG_NO_MAPCHANGE);
}
return Plugin_Continue;
}
if ( sBuffer[0] && sBuffer[0] != '/' && sBuffer[1] != '/' )
if ( !sBuffer[0] || sBuffer[0] == '/' || sBuffer[1] == '/' ){ continue; }
public void Event_PlayerTeam(Event hEvent, const char[] sName, bool bDontBroadcast)
{
int iUserId = hEvent.GetInt("userid");
int iClient = GetClientOfUserId(iUserId);
int OldTeam = GetEventInt(hEvent, "oldteam");
if (OldTeam == 0)
{
g_bJoinOverlay[iClient] = true;
}
}
public void Event_PlayerTeam(Event hEvent, const char[] sName, bool bDontBroadcast)
{
int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
int OldTeam = GetEventInt(hEvent, "oldteam");
if (OldTeam == 0)
{
g_bJoinOverlay[iClient] = true;
}
}
public void OnClientPostAdminCheck(int iClient)
{
int iUserId = GetClientUserId(iClient);
int l_EnableOverlayWelcome = g_cWelcomeOverlay.IntValue;
float l_TimerWelcomeOverlay = g_cWelcomeOverlayTimer.FloatValue;
GetConVarString(g_cFlagHide, g_szFlag, sizeof(g_szFlag));
if(!iClient || IsFakeClient(iClient) || CheckAdminFlags(iClient, ReadFlagString(g_szFlag)))
{
return;
}
if(l_EnableOverlayWelcome == 1 && l_TimerWelcomeOverlay > 0.0)
{
g_hKillWelcomeTimer[iClient] = CreateTimer(10.0, Timer_ToWelcome, iUserId, TIMER_FLAG_NO_MAPCHANGE);
}
}
public void OnClientPostAdminCheck(int iClient)
{
GetConVarString(g_cFlagHide, g_szFlag, sizeof(g_szFlag));
if(!iClient || IsFakeClient(iClient) || CheckAdminFlags(iClient, ReadFlagString(g_szFlag)))
{
return;
}
if(g_cWelcomeOverlay.IntValue == 1 && g_cWelcomeOverlayTimer.FloatValue > 0.0)
{
g_hKillWelcomeTimer[iClient] = CreateTimer(10.0, Timer_ToWelcome, GetClientUserId(iClient), TIMER_FLAG_NO_MAPCHANGE);
}
}
public Action Timer_ToWelcome (Handle hTimer, int iUserId)
{
int iClient = GetClientOfUserId(iUserId);
if (!iClient) { return Plugin_Stop; }
ShowWelcomeOverlayToClient(iClient);
CreateTimer(g_cWelcomeOverlayTimer.FloatValue, Timer_WelcomeOverlay, iUserId, TIMER_FLAG_NO_MAPCHANGE);
if( g_cWelcomeOverlay.IntValue == 1 && g_hKillWelcomeTimer[iClient])
{
KillTimer(g_hKillWelcomeTimer[iClient]);
g_hKillWelcomeTimer[iClient] = null;
}
return Plugin_Stop;
}
public Action Timer_WelcomeOverlay(Handle hTimer, int iData)
{
iData = GetClientOfUserId(iData);
if (!iData || g_hKillSpawnTimer[iData]) { return Plugin_Stop; }
ResetOverlayToClient(iData);
return Plugin_Stop;
}
int l_EnableOverlayDeath = g_cDeathOverlay.IntValue;
int l_EnableOverlaySpawn = g_cSpawnOverlay.IntValue;
public Action Timer_Spawn(Handle hTimer, int iUserId)
{
int iClient = GetClientOfUserId(iUserId);
if ((iClient) && !IsFakeClient(iClient))
{
ResetOverlayToClient(iClient);
}
g_hKillSpawnTimer[iClient] = null;
return Plugin_Stop;
}
по-моему редактированный плагин не хочет загружать оверлей из файла overlay_downloads.ini, дефолтный загрузил на ура *_*Выпала ошибочка, решил пробежать по коду ;)
Ошибочка
PHP:[SM] Exception reported: Client index 0 is invalid [SM] Blaming: OverlaySystem.smx [SM] Call stack trace: [SM] [0] ClientCommand [SM] [1] Line 345, \OverlaySystem.sp::ShowDeathOverlayToClient [SM] [2] Line 235, \OverlaySystem.sp::Timer_Death
Причина ошибочки, не верное условие в таймере выше:
Вероятно должно быть так:PHP:public Action Timer_Death(Handle hTimer, int iUserId) { int iClient = GetClientOfUserId(iUserId); float l_TimerPostOverlay = g_cDeathOverlayPostTimer.FloatValue; if (iClient && !IsPlayerAlive(iClient)) // Если игрок 0, то идем дальше ;) { return Plugin_Continue; } if (l_TimerPostOverlay == 0.0) { ShowDeathOverlayToClient(iClient); } if (l_TimerPostOverlay > 0.0) { CreateTimer(l_TimerPostOverlay, Timer_PostOverlay, iUserId, TIMER_FLAG_NO_MAPCHANGE); } return Plugin_Continue; }
-------------------------------PHP:public Action Timer_Death(Handle hTimer, int iUserId) { int iClient = GetClientOfUserId(iUserId); float l_TimerPostOverlay = g_cDeathOverlayPostTimer.FloatValue; if (!iClient || IsPlayerAlive(iClient)) // Если игрок 0 или он жив, то прерываем { return Plugin_Continue; } if (l_TimerPostOverlay == 0.0) { ShowDeathOverlayToClient(iClient); } if (l_TimerPostOverlay > 0.0) { CreateTimer(l_TimerPostOverlay, Timer_PostOverlay, iUserId, TIMER_FLAG_NO_MAPCHANGE); } return Plugin_Continue; }
Немного того, как я бы подредактировал код ;)
Можно заменить наPHP:if ( sBuffer[0] && sBuffer[0] != '/' && sBuffer[1] != '/' )
В SP условие ИЛИ работает по упрощенной схеме (Наглядный пример: Пример для уроков 6 и 7 из личной практики.), но это не главная причина, просто проще читается код, когда условия везде по одному типу, кто понял о чем я, тот понял ;-)PHP:if ( !sBuffer[0] || sBuffer[0] == '/' || sBuffer[1] == '/' ){ continue; }
Нет необходимости создавать переменную iUserId, она используется только один раз.PHP:public void Event_PlayerTeam(Event hEvent, const char[] sName, bool bDontBroadcast) { int iUserId = hEvent.GetInt("userid"); int iClient = GetClientOfUserId(iUserId); int OldTeam = GetEventInt(hEvent, "oldteam"); if (OldTeam == 0) { g_bJoinOverlay[iClient] = true; } }
Тоже лишние переменныеPHP:public void Event_PlayerTeam(Event hEvent, const char[] sName, bool bDontBroadcast) { int iClient = GetClientOfUserId(hEvent.GetInt("userid")); int OldTeam = GetEventInt(hEvent, "oldteam"); if (OldTeam == 0) { g_bJoinOverlay[iClient] = true; } }
-->PHP:public void OnClientPostAdminCheck(int iClient) { int iUserId = GetClientUserId(iClient); int l_EnableOverlayWelcome = g_cWelcomeOverlay.IntValue; float l_TimerWelcomeOverlay = g_cWelcomeOverlayTimer.FloatValue; GetConVarString(g_cFlagHide, g_szFlag, sizeof(g_szFlag)); if(!iClient || IsFakeClient(iClient) || CheckAdminFlags(iClient, ReadFlagString(g_szFlag))) { return; } if(l_EnableOverlayWelcome == 1 && l_TimerWelcomeOverlay > 0.0) { g_hKillWelcomeTimer[iClient] = CreateTimer(10.0, Timer_ToWelcome, iUserId, TIMER_FLAG_NO_MAPCHANGE); } }
И в блоке Timer_ToWelcome, можно сделать такPHP:public void OnClientPostAdminCheck(int iClient) { GetConVarString(g_cFlagHide, g_szFlag, sizeof(g_szFlag)); if(!iClient || IsFakeClient(iClient) || CheckAdminFlags(iClient, ReadFlagString(g_szFlag))) { return; } if(g_cWelcomeOverlay.IntValue == 1 && g_cWelcomeOverlayTimer.FloatValue > 0.0) { g_hKillWelcomeTimer[iClient] = CreateTimer(10.0, Timer_ToWelcome, GetClientUserId(iClient), TIMER_FLAG_NO_MAPCHANGE); } }
В Timer_WelcomeOverlay можно не создавать дополнительные переменные, напримерPHP:public Action Timer_ToWelcome (Handle hTimer, int iUserId) { int iClient = GetClientOfUserId(iUserId); if (!iClient) { return Plugin_Stop; } ShowWelcomeOverlayToClient(iClient); CreateTimer(g_cWelcomeOverlayTimer.FloatValue, Timer_WelcomeOverlay, iUserId, TIMER_FLAG_NO_MAPCHANGE); if( g_cWelcomeOverlay.IntValue == 1 && g_hKillWelcomeTimer[iClient]) { KillTimer(g_hKillWelcomeTimer[iClient]); g_hKillWelcomeTimer[iClient] = null; } return Plugin_Stop; }
В Event_PlayerDeath опять же лишнее переменные, они используются только по одному разуPHP:public Action Timer_WelcomeOverlay(Handle hTimer, int iData) { iData = GetClientOfUserId(iData); if (!iData || g_hKillSpawnTimer[iData]) { return Plugin_Stop; } ResetOverlayToClient(iData); return Plugin_Stop; }
Тут можно не создавать iClient, а также проверка !IsFakeClient(iClient) не нужна, так как выше уже есть проверка на ботаPHP:int l_EnableOverlayDeath = g_cDeathOverlay.IntValue; int l_EnableOverlaySpawn = g_cSpawnOverlay.IntValue;
------------------------PHP:public Action Timer_Spawn(Handle hTimer, int iUserId) { int iClient = GetClientOfUserId(iUserId); if ((iClient) && !IsFakeClient(iClient)) { ResetOverlayToClient(iClient); } g_hKillSpawnTimer[iClient] = null; return Plugin_Stop; }
Не претендую на качество, мог и сам допустить опитяпки или косяки ;-)
--- Добавлено позже ---
Кстати, только заметил. Почему-то в таймере возвращается Plugin_Continue, хотя обычно Plugin_Stop . Так и было задумано?
.news
Дорогие пользователи моего плагина!
Да, я знаю что он несовершенен и во множество раз его можно сократить, но это была моя первая работа, которая получила огромную поддержку от вас, и потому - обещаю его обновить, вновь вникнуть, добавить новых функций:
от минимальной системы оповещений (звуки к оверлеям), до новых вариаций показа оверлея.
Дайте только время, как минимум приду из армии через 17 дней и начну вникать во все обновления произошедшие с движком, играми и мелочами! :)
Благодарю всех, кто пользуется им вплоть до нынешних времен!
Еще спасибо всем, кто помогает новым пользователям с настройкой, вы прекрасны!
Не забывайте перед установкой читать инструкции, всех целую!
Те, кто хотят помочь, можете присылать в личку пожелания и ошибки, все сделаю ;)
оверлей гуру - suremiur
// Время в секундах СКОЛЬКО показывать оверлей игроку после смерти. Где 0.0 - показывать оверлей на все время пока игрок мертв.
// -
// Default: "0.0"
// Minimum: "0.000000"
// Maximum: "20.000000"
sm_death_overlay_time "2.0"
у меня был баг не с плагином вовсе, а с архивацией текстуры. Она будто билось и после распаковки весила гораздо меньше изначального размера. Я был удивлен, потому, что и так есть плагин для оверлеев в конце раунда и там всё исправно. Грешил на этот плаг и был не прав. Я на впс сделал автоархивацию фастд при заливки) И оно так за архивировало криво. Отсюда и были проблемы.На моем сервере было много проблем с этим плагином, которые я писал выше. Решилось все одним способом, изменением квара sv_pure в sefver.cfg. И отображается адекватно, и таймер работает и убирается (не багается).