Hejter
xor ebx, ebx
- Сообщения
- 1,759
- Реакции
- 393
Делаю голод для паблика. Оффтоп
Хотелось бы узнать чего не хватает в моем коде или сделано не так. Вообщем оптимизировать его.
Возможно такой мусор кому-то понадобиться.
Хотелось бы узнать чего не хватает в моем коде или сделано не так. Вообщем оптимизировать его.
PHP:
#pragma semicolon 1
#include <sdktools>
/* Спасибо Zipcore - макросы */
#define LoopIngameClients(%1) for(int %1=1;%1<=MaxClients;++%1)\
if(IsClientInGame(%1))
#define start_hunger 100 // Сколько давать ед. голода при спавне?
#define minus_hunger 2 // Кол-во ед. снятия голода
new p_hunger[MAXPLAYERS + 1]; // Голод -+
new bool:b_hunger[MAXPLAYERS + 1]; // Голод true/false
Handle g_hHunger = null;
ConVar g_cvCheckHunger;
new Float:g_fCheckHunger;
public OnPluginStart(){
HookEvent("player_spawn", PlayerSpawn);
HookEvent("player_death", PlayerDeath);
g_cvCheckHunger = CreateConVar("sm_check_hunger", "5.0", "Отрезок времени через которое игроку будет отнимать голод.");
HookConVarChange(g_cvCheckHunger, ConVar_Callback);
g_fCheckHunger = GetConVarFloat(g_cvCheckHunger);
HookEvent("round_start", RoundStart);
HookEvent("round_end", RoundEnd);
}
public ConVar_Callback(Handle:cvar, const String:oldVal[], const String:newVal[])
{
if (cvar == g_cvCheckHunger)
{
g_fCheckHunger = GetConVarFloat(g_cvCheckHunger);
if(g_hHunger != null)
CloseHandle(g_hHunger);
g_hHunger = CreateTimer(g_fCheckHunger, Timer_CheckHunger, 0, TIMER_REPEAT);
}
}
public RoundStart(Handle:event, const String:name[], bool:dontBroadcast){
g_hHunger = CreateTimer(g_fCheckHunger, Timer_CheckHunger, 0, TIMER_REPEAT);
}
public RoundEnd(Handle:event, const String:name[], bool:dontBroadcast){
if(g_hHunger != null)
{
KillTimer(g_hHunger);
g_hHunger = null;
}
}
public Action:Timer_CheckHunger(Handle:timer)
{
CheckHunger();
return Plugin_Continue;
}
CheckHunger()
{
LoopIngameClients(client)
{
Hunger(client);
}
}
Hunger(client)
{
if (IsClientInGame(client) && IsPlayerAlive(client) && b_hunger[client])
{
if (b_hunger[client] == true)
{
if (p_hunger[client] > 0)
{
p_hunger[client] -= minus_hunger;
PrintHintText(client, "Голод %d", p_hunger[client]);
}
else if (p_hunger[client] <= 0)
{
ForcePlayerSuicide(client);
b_hunger[client] = false;
}
}
}
}
public OnClientDisconnect(client){
Info(client);
}
/* Спасибо AlmazON - убиваем глобальный таймер, если все игроки вышли с сервера */
public OnClientDisconnect_Post(client)
{
for (new i = 1; i <= MaxClients; ++i)
{
if (IsClientInGame(i)) return;
}
if(g_hHunger != null)
{
KillTimer(g_hHunger);
g_hHunger = null;
}
}
public Info(client){
p_hunger[client] = 0;
b_hunger[client] = false;
}
public PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast){
new client = GetClientOfUserId(GetEventInt(event, "userid"));
if(IsClientInGame(client) && !IsFakeClient(client))
{
p_hunger[client] = 0;
b_hunger[client] = false;
}
}
public PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast){
new client = GetClientOfUserId(GetEventInt(event, "userid"));
if(IsClientInGame(client) && IsPlayerAlive(client))
{
p_hunger[client] = start_hunger;
b_hunger[client] = true;
/* if (p_hunger[client] == start_hunger)
{
HungerTimer[client] = CreateTimer(minus_hunger_timer, hunger_timer, GetClientUserId(client), TIMER_REPEAT);
b_hunger[client] = true;
} */
}
}
Последнее редактирование: