Ноль игроков, определенный конфиг.
|
|
Sunday
|
Дата: Четверг, 19.07.2012, 19:43:34 | Сообщение # 1 |
|
Сообщений: 186
Репутация: 24 [ +/- ]
|
|
Здравствуйте Форумчане!
Пытаюсь написать скрипт, когда нет игроков на сервере то загружается определенный конфиг и сервер перезагружает карту.
Подглядел скрипт из rockthevote.sp, он выводит кол-во игроков на сервере но пока что не укладывается в голове как сделать что бы когда есть игроки то он бездействует, а когда нет игроков (0) загружал конфиг... Вот сам скрипт, я думаю ни кого им не удивишь:
public OnMapStart() { for (new i = 1; i <= MaxClients; i++) { if (IsClientConnected(i)) { OnClientConnected(i); } } }
public OnClientConnected(client) { if(IsFakeClient(client)) return; }
В голове понимаю как надо сделать, практики написания, порядка и последовательности мало..
Пытаюсь представить как должно: new a = Максимальному кол-ву игроков на сервере; new b; Если a > b - то плагин бездействует Если a <= b то скрипт активируется и производит действие только один раз и после ожидал игрока, переменную 1, как только 1 появился, скрипт ожидает 0....
Вот как то так я это понимаю, сидел часов 5 в экран как облупленный и так не склепал, рассчитываю на ваше понимание.
|
|
| |
sssw
|
Дата: Пятница, 20.07.2012, 07:13:37 | Сообщение # 2 |
|
Сообщений: 123
Репутация: 14 [ +/- ]
|
|
Code #include <sourcemod> #include <sdktools>
public OnMapStart() { new f; for(new i = 0; i <= 3; i++) { f = f + GetTeamClientCount(i); } RuConfig(f); }
public RuConfig(f) { if (f <= 1) PrintToChatAll("в игре %d", f); }
Но думаю делать в OnMapStart бес мысленно всегда f будет ноль. Так как клиенты при OnMapEnd переключаться на сервер и новое соединение начинается после OnMapStart
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Точно не помню может они и не выходят и по этому даже useridы остаются прежними.
+++++++ Можно так
Code #include <sourcemod> #include <sdktools>
public OnPluginStart() { CreateTimer(500.0, Test, _, TIMER_REPEAT); }
public Action:Test(Handle:timer) { new count; for(new i = 0; i <= 3; i++) { count += GetTeamClientCount(i); } RuConfig(count); }
public RuConfig(f) { if (f <= 0) ServerCommand("exec restart.cfg"); }
Тут так если каждые 500 секунд не будет игроков, сервер выполнит restart.cfg.
++++++++++++++++++++++++ А если так (не уверен в его работе)
Code #include <sourcemod> #include <sdktools>
new Handle:LocalBase;
public OnMapEnd() { SQL_FastQuery(LocalBase, "INSERT OR REPLACE INTO restart VALUES ('0');"); }
public OnPluginStart() { SQL_LockDatabase(LocalBase); SQL_FastQuery(LocalBase, "VACUUM"); SQL_FastQuery(LocalBase, "CREATE TABLE IF NOT EXISTS restart (areadyrestart INTEGER);"); CreateTimer(500.0, Test, _, TIMER_REPEAT); }
public Action:Test(Handle:timer) { new count; for(new i = 0; i <= 3; i++) { count += GetTeamClientCount(i); } SQL_TQuery(LocalBase, Parse_Query, "SELECT areadyrestart FROM restart", count, DBPrio_High); //RuConfig(count); }
public Parse_Query(Handle:h_Owner, Handle:h_Query, const String:s_Error[], any:count) { if (h_Query != INVALID_HANDLE && SQL_GetRowCount(h_Query) > 0) { new iTemp = SQL_FetchInt(h_Query, 1) if (iTemp <= 0 && !count) { RuConfig(); } else { SQL_FastQuery(LocalBase, "INSERT OR REPLACE INTO restart VALUES ('0');"); } CloseHandle(h_Query) } else LogToGame("Query failed: %s", s_Error); }
public RuConfig() { SQL_FastQuery(LocalBase, "INSERT OR REPLACE INTO restart VALUES ('1');"); ServerCommand("exec restart.cfg"); SQL_FastQuery(LocalBase, "INSERT OR REPLACE INTO restart VALUES ('0');"); } Тут сервер будет делать exec restart.cfg каждые 500 секунд и если он ранее этого не делал(до перезагрузки).
Сообщение отредактировал sssw - Суббота, 21.07.2012, 04:07:15 |
|
| |
Sunday
|
Дата: Пятница, 20.07.2012, 20:10:43 | Сообщение # 3 |
|
Сообщений: 186
Репутация: 24 [ +/- ]
|
|
Спасибо большое sssw! Сейчас попробую!
Добавлено (20.07.2012, 17:07:41) --------------------------------------------- К сожалению, второй скрипт постоянно активируется, есть ли кто на сервере или нет, третий бездействует в обоих случаях. Есть еще варианты?
Добавлено (20.07.2012, 19:55:19) --------------------------------------------- не ужели это сложно так? третий день сижу и не получается все......Добавлено (20.07.2012, 20:10:43) --------------------------------------------- ладно, похоже не судьба... спасибо и на этом формумчане... попробую порыться в интернете и поспрашивать еще где...
Сообщение отредактировал Sunday - Пятница, 20.07.2012, 19:55:48 |
|
| |
sssw
|
Дата: Суббота, 21.07.2012, 04:08:41 | Сообщение # 4 |
|
Сообщений: 123
Репутация: 14 [ +/- ]
|
|
Проверю, я был уверен что второй скрипт работает.
|
|
| |
Scarface_slv
|
Дата: Суббота, 21.07.2012, 17:21:35 | Сообщение # 5 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
Можно так: Code public OnMapStart() CreateTimer(60.0, Timer_Func, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
public Action:Timer_Func(Handle:timer) { new client = 0; for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i) && !IsFakeClient(i)) client = i; } if (client == 0) ServerCommand("Changelevel de_cbble"); } Каждые 60 с. проверяет есть ли игроки на сервере если нет меняет на кебл.. это просто пример)
|
|
| |
Sunday
|
Дата: Воскресенье, 22.07.2012, 22:16:04 | Сообщение # 6 |
|
Сообщений: 186
Репутация: 24 [ +/- ]
|
|
Спасибо ребят за помощь, спасибо Scarface_slv, скрипт работает!
|
|
| |