Код
public Action: cmd_explosive(client, args)
{
if (IsPlayerAlive(client))
{
// замаскироваться под бочку
SetEntityModel(client, "models/props_c17/oildrum001_explosive.mdl");
Timer_explosive[client] = CreateTimer(20.0, cmd_explosive_off, client);
}
}
Это неправильно.. Сам подумай, прописал игрок команду, стал бочкой, запустился таймер. Прописал команду опять и снова выполняются все эти действия и лишний таймер создается.. Почему не проверишь, стал ли он бочкой? Запущен ли уже таймер? Простые вещи.
Код
new String:g_MyOldSkin[MAXPLAYERS + 1][150];
public Action: cmd_explosive(client, args)
{
// Если команду ввел игрок (вдруг ее просто в ркон кто-то вписал и client = 0)
if (0 < client <= MaxClients)
{
// Если жив и еще не стал бочкой
if (IsPlayerAlive(client) && Timer_explosive[client] == INVALID_HANDLE)
{
Timer_explosive[client] = CreateTimer(20.0, cmd_explosive_off, client);
// тут запоминаешь текущую модель игрока
g_MyOldSkin[client][0] = '\0';
GetClientModel(client, g_MyOldSkin[client], 150);
SetEntityModel(client, "models/props_c17/oildrum001_explosive.mdl");
}
}
}
public Action:cmd_explosive_off(Handle:timer, any:client)
{
// Если он в игре и жив, возвращаем прошлый скин
if (IsClientInGame(client) && IsPlayerAlive(client))
{
if (g_MyOldSkin[client][0] == 'm')
{
PrecacheModel(g_MyOldSkin[client], true);
SetEntityModel(client, g_MyOldSkin[client]);
}
else if (GetClientTeam(client) == 2)
{
// Что-то не то с сохраненным скином в g_MyOldSkin, тут ставь стандартную модель T
}
else
{
// CT
}
}
Timer_explosive[client] = INVALID_HANDLE;
}
Ну и кэшируй все модели в OnMapStart, которые используешь в SetEntityModel.