#include <sdktools_functions>
#include <sdktools_tempents>
#include <sdktools_tempents_stocks>
#include <sdkhooks>
#include <lvl_ranks>
#include <morecolors>
public Plugin myinfo =
{
name = "Auto Choice Of Santa Claus",
author = "KiKiEEKi (vk.com/kikieeki)",
version = "1.0"
};
int iMaxPlayers = 6;
char sModelT[64] = "models/player/vad36santa/red.mdl";
char sModelCT[64] = "models/player/vad36santa/blue.mdl";
int iHealth = 150;
float fSpeed = 2.0;
float fGravity = 0.5;
float fDamage = 5.0;
float fBlockDamage = 0.6;
int iLvlRanksXP = 111;
int iRandomPlayer = 0;
float fGetGravityRandomPlayer;
int g_iClient = 0;
float fGetGravityClient;
int iNumberRound = 0; //Номер раунда
int iEveryRound = 2; //Каждый раунд N раунд будет выбран Санта
public void OnPluginStart()
{
HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
HookEvent("player_death", Event_PlayerDeath, EventHookMode_Post);
//HookEvent("player_hurt", Event_PlayerHurt, EventHookMode_Post);
HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
RegAdminCmd("sm_santa", Cmd_GiveSanta, ADMFLAG_ROOT, "Выбор дед-мороза");
RegAdminCmd("sm_santa_reload", Cmd_ReloadCFG, ADMFLAG_CONFIG, "Перезагрузить конфиг");
}
public Action Cmd_GiveSanta(int iClient, int args)
{
fGetGravityClient = GetEntityGravity(iClient);
g_iClient = iClient;
int iGetCountPlayers = GetClientCount(true); //Максимальное кол-во игроков на сервере
if(iGetCountPlayers >= iMaxPlayers)
{
SetSantaPlayer(g_iClient);
}
}
public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
int iGetCountPlayers = GetClientCount(true); //Максимальное кол-во игроков на сервере
iNumberRound++; //Прибавляем +1 к счетчику раундов
if(iGetCountPlayers >= iMaxPlayers && iNumberRound == iEveryRound)
{
fGetGravityRandomPlayer = GetEntityGravity(iRandomPlayer); //Получаем гравитацию рандомного игрока
iRandomPlayer = GetRandomClient(); //Выбор рандомного игрока
SetSantaPlayer(iRandomPlayer);
iNumberRound = 0; //Обнуляем счетчик раундов
}
}
stock void SetSantaPlayer(int iRandomPlayerANDiClient)
{
if(GetClientTeam(iRandomPlayerANDiClient) == 2) //2 - это Т
{
SetEntityModel(iRandomPlayerANDiClient, sModelT); //Установить модель
}
else if(GetClientTeam(iRandomPlayerANDiClient) == 3) //3 - это КТ
{
SetEntityModel(iRandomPlayerANDiClient, sModelCT); //Установить модель
}
SetEntityHealth(iRandomPlayerANDiClient, iHealth); //Установить здоровье
SetEntPropFloat(iRandomPlayerANDiClient, Prop_Data, "m_flLaggedMovementValue", fSpeed); //Установить скорость
SetEntPropFloat(iRandomPlayerANDiClient, Prop_Data, "m_flGravity", fGravity); //Установить гравитацию
SDKHook(iRandomPlayerANDiClient, SDKHook_OnTakeDamage, OnTakeDamage);
CPrintToChatAll("\x04Игрок \x01%N \x04был выбран дед-морозом!", iRandomPlayerANDiClient);
CPrintToChat(iRandomPlayerANDiClient, "\x04Вы стали дед-морозом, ваше \x01HP \x04изменились до \x01%iHP");
}
public void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));
int iVictim = GetClientOfUserId(hEvent.GetInt("userid"));
if(iAttacker != iVictim && iVictim == iRandomPlayer || iVictim == g_iClient)
{
//LR_ChangeClientValue(iAttacker, iLvlRanksXP);
CPrintToChatAll("\x04Игрок \x01%N \x04получает награду за убийство дед-мороза!", iAttacker);
CPrintToChatAll("\x04Его награда\x01: %i \x04Опыта!", iLvlRanksXP);
}
}
public Action OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
bool bChange;
bChange = false;
if(iRandomPlayer == attacker)
{
damage *= fDamage;
bChange = true;
}
if(iRandomPlayer == victim)
{
damage *= fBlockDamage;
bChange = true;
}
return bChange ? Plugin_Changed : Plugin_Continue;
}
/*
public void Event_PlayerHurt(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));
int iVictim = GetClientOfUserId(hEvent.GetInt("userid"));
int iDmgHealth = GetEventInt(event, "dmg_health"); //Получает количество нанесенного урона игроку (не включая броню).
if(iAttacker != iVictim && iVictim == iRandomPlayer)
{
//Shop_GiveClientCredits(iAttacker, iShopCredits);
PrintToChatAll("Игрок %N Получил %i Кредитов за убийство Санты!", iAttacker, iShopCredits);
}
}
*/
public void Event_RoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
if(IsClientInGame(iRandomPlayer)) //Проверяем в игре ли игрок
{
SetEntPropFloat(iRandomPlayer, Prop_Data, "m_flGravity", fGetGravityRandomPlayer);
//Обнуляем индекс игрока, что бы после раунда с Сантой его индес
//Не сохранился на следущий раунд без Санты, и убийца не получил награду
iRandomPlayer = 0;
}
if(IsClientInGame(g_iClient)) //Проверяем в игре ли игрок
{
SetEntPropFloat(g_iClient, Prop_Data, "m_flGravity", fGetGravityClient);
//Обнуляем индекс игрока, что бы после раунда с Сантой его индес
//Не сохранился на следущий раунд без Санты и убийца не получил награду
g_iClient = 0;
}
}
GetRandomClient()
{
int iIndexPlayers[MAXPLAYERS+1]; //Индекс игроков
int iPlayers = 0; //Масив для хранение игроков которые в игре
for(int i = 1; i <= MaxClients; i++) //Цикл по всем игрокам
{
if(IsClientInGame(i)) //Проверяем в игре ли игрок
{
iIndexPlayers[iPlayers++] = i; //Прибавляем игрока в масив
}
}
if(iPlayers > 0) //Если игроков больше нуля
{
return iIndexPlayers[GetRandomInt(0, iPlayers-1)]; //Возвращаем рандомный индекс игрока в вызывающию функцию
}
return 0;
}
stock void LoadCfg()
{
char szPath[PLATFORM_MAX_PATH]; //PLATFORM_MAX_PATH - Применяется в буферах под путь файла
BuildPath(Path_SM, szPath, sizeof(szPath), "data/AutoChoiceOfSantaClaus.ini"); //Формируем путь к файлу
KeyValues hKeyValues = new KeyValues("AutoChoiceOfSantaClaus");
if(hKeyValues.ImportFromFile(szPath)) //Загружаем из файла
{
//Успешно загрузили
//hKeyValues.Rewind(); //Возвращает указатель на позицию в самое начало структуры.
iMaxPlayers = hKeyValues.GetNum("MaxPlayers");
iEveryRound = hKeyValues.GetNum("EveryRound");
hKeyValues.GetString("ModelT", sModelT, sizeof(sModelT));
hKeyValues.GetString("ModelCT", sModelCT, sizeof(sModelCT));
iHealth = hKeyValues.GetNum("Health");
fSpeed = hKeyValues.GetFloat("Speed");
fGravity = hKeyValues.GetFloat("Gravity");
fDamage = hKeyValues.GetFloat("Damage");
fBlockDamage = hKeyValues.GetFloat("BlockDamage");
iLvlRanksXP = hKeyValues.GetNum("LvlRanksXP");
}
//delete hKeyValues;
}
public void OnMapStart()
{
LoadCfg();
PrecacheModel(sModelT);
PrecacheModel(sModelCT);
}
public Action Cmd_ReloadCFG(int client, int args)
{
LoadCfg();
return Plugin_Handled;
}