Skip to content

Instantly share code, notes, and snippets.

@TiBarification
Last active October 17, 2016 18:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TiBarification/025c59a1685dba568b06 to your computer and use it in GitHub Desktop.
Save TiBarification/025c59a1685dba568b06 to your computer and use it in GitHub Desktop.
Поправлен шлепок, вынесен за условие.
/*ТЗ:
пахан вызывается случайным голосованием, имеет гранату(зажигательную)
может шлепать выбранного КТ каждую минуту.
Пахан доступен 1 раз за 2 раунда. Пахан недоступен если играет 1 КТ.
*/
#include <sourcemod>
#include <cstrike>
#include <sdktools>
#define VERSION "1.0"
#define PREFIX "\x01[\x04Пахан\x01]\x03 "
new Pahan = -1;
new g_iPlayedRounds = 0, bool:g_bTurnPahan;
new iMinCt, iHp, iNumRounds;
new Float:fSlapDelay;
new String:s_ModelOld[PLATFORM_MAX_PATH],
String:s_ModelPath[PLATFORM_MAX_PATH] = "models/player/kuristaja/duke/duke.mdl"; //Модель по умолчанию
new pickup_vots[MAXPLAYERS+1], timer_sec, all_votes;
new Handle:h_pMenu, Handle:h_Timer, Handle:h_pSlapMenu, Handle:h_SlapTimer[MAXPLAYERS+1], Handle:h_lateTimer = INVALID_HANDLE;
//ConVars
new Handle:h_MinCt = INVALID_HANDLE
Handle:h_NumRounds,
Handle:h_VoteTime = INVALID_HANDLE,
Handle:h_SlapDelay = INVALID_HANDLE,
Handle:h_SlapHp = INVALID_HANDLE,
Handle:h_PahanMDL = INVALID_HANDLE;
public Plugin:myinfo =
{
name = "Pahan",
description = "Pahan for JailBreak",
author = "TiBarification",
version = VERSION,
url = "https://gist.github.com/TiBarification/025c59a1685dba568b06"
};
public OnPluginStart()
{
h_MinCt = CreateConVar("sm_pahan_minct", "1", "Минимальное кол-во КТ требуемого для пахана. 0 - неогр", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_DONTRECORD, true, 0.0);
h_NumRounds = CreateConVar("sm_pahan_numrounds", "2", "Пахан недоступен каждые n раундов. 0 - пахан доступен всегда", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_DONTRECORD|FCVAR_REPLICATED, true, 0.0);
h_VoteTime = CreateConVar("sm_pahan_votetime", "10", "Время голосования за пахана у Т", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_DONTRECORD, true, 5.0, true, 20.0);
h_SlapDelay = CreateConVar("sm_pahan_slapdelay", "60.0", "Ожидание перед следующим шлепком у пахана. В секундах.", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_DONTRECORD, true, 5.0);
h_SlapHp = CreateConVar("sm_pahan_slaphp", "5", "Урон от шлепка пахана.", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_DONTRECORD, true, 0.0, true, 99.0);
h_PahanMDL = CreateConVar("sm_pahan_model", s_ModelPath, "Моделька(скин) пахана.");
iMinCt = GetConVarInt(h_MinCt);
iNumRounds = GetConvarInt(h_NumRounds);
fSlapDelay = GetConVarFloat(h_SlapDelay);
iHp = GetConVarInt(h_SlapHp);
timer_sec = GetConVarInt(h_VoteTime);
//Cut for DEBUG
//RegServerCmd("sm_pahan1", ForceVote);
//RegConsoleCmd("sm_mepahan", ForcePahan);
HookEvent("round_start", EventRoundStart);
HookEvent("round_end", EventRoundEnd);
HookEvent("player_death", EventPlayerDeath);
AutoExecConfig(true, "pahan");
}
public OnConfigsExecuted()
{
GetConVarString(h_PahanMDL, s_ModelPath, sizeof(s_ModelPath));
}
public OnMapStart()
{
PrecacheModel(s_ModelPath);
g_iPlayedRounds = 0;
g_bTurnPahan = true;
}
/*
public Action:ForceVote(args)
{
PahanVote();
}
public Action:ForcePahan(client, args)
{
SetPahan(client);
}*/
public Action:EventRoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
Pahan = -1; //Удаляем пахана в начале раунда если он существует
new client = GetClientOfUserId(GetEventInt(event, "userid"));
new CtCount = GetTeamClientCount(CS_TEAM_CT);
if (h_Timer != INVALID_HANDLE)
{
KillTimer(h_Timer);
h_Timer = INVALID_HANDLE;
}
else if (h_SlapTimer[client] != INVALID_HANDLE)
{
KillTimer(h_SlapTimer[client]);
h_SlapTimer[client] = INVALID_HANDLE;
}
if (CtCount >= iMinCt && g_bTurnPahan)
{
PahanVote();
}
else PrintToChatAll("%sНедостаточно КТ для пахана.", PREFIX);
}
public Action:EventRoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
if (g_iPlayedRounds++ == iNumRounds && iNumRounds > 0)
{
g_bTurnPahan = !g_bTurnPahan;
g_iPlayedRounds = 0;
}
}
public Select_Pahan(Handle:menu, MenuAction:action, client, item)
{
if (action != MenuAction_Select)
return;
decl String:Num_String[15];
if (!GetMenuItem(menu, item, Num_String, sizeof(Num_String)))
return;
new target = GetClientOfUserId(StringToInt(Num_String));
if (target > 0)
{
all_votes++;
pickup_vots[target]++;
PrintToChatAll("| \x03%N \x01выбрал игрока \x03%N в роли пахана\x01|", client, target);
}
else
PrintToChat(client, "Игрок не найден");
}
public Action:Timer_Func(Handle:timer_f)
{
if (timer_sec-- > 0)
{
PrintHintTextToAll("До завершения выбора пахана осталось:\n< %d сек >", timer_sec);
return Plugin_Continue;
}
//Время истекло, голосование завершено
h_Timer = INVALID_HANDLE;
if (h_pMenu != INVALID_HANDLE)
{
CloseHandle(h_pMenu);
h_pMenu = INVALID_HANDLE;
}
PrintHintTextToAll("Голосование завершено (%d голосов)", all_votes);
if (all_votes < 1)
{
PrintToChatAll("%sНикто не проголосовал, пахан отсутствует", PREFIX);
}
//Если голосование прошло успешно и мы нашли игрока, за которого больше всего голосов, то
new vots = 0, target = 0;
for (new i = 1; i <= GetTeamClientCount(CS_TEAM_T); i++)
{
if (pickup_vots[i] > vots)
{
vots = pickup_vots[i];
target = i;
}
}
if (CheckPlayer(target) && IsPlayerAlive(target))
{
PrintToChatAll("%s%N стал паханом этой тюряги", PREFIX, target);
SetPahan(target);
timer_sec = GetConVarInt(h_VoteTime);
}
return Plugin_Stop;
}
public Action:EventPlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
new client = GetClientOfUserId(GetEventInt(event, "userid"));
if (client == Pahan)
{
if (h_SlapTimer[Pahan] != INVALID_HANDLE)
{
KillTimer(h_SlapTimer[Pahan]);
h_SlapTimer[Pahan] = INVALID_HANDLE;
}
else if (h_lateTimer != INVALID_HANDLE)
{
KillTimer(h_lateTimer);
h_lateTimer = INVALID_HANDLE;
}
h_lateTimer = CreateTimer(5.0, Func_LateTimer);
Pahan = -1;
PrintToChatAll("%s%N сдох\nНовый пахан будет выбран через 5 секунд", PREFIX, client);
}
return Plugin_Handled;
}
public Action:Func_LateTimer(Handle:timer_f)
{
PahanVote();
}
public OnClientDisconnect(client)
{
if (client == Pahan && GetClientTeam(client) == CS_TEAM_T)
{
Pahan = -1;
if (h_SlapTimer[Pahan] != INVALID_HANDLE)
{
KillTimer(h_SlapTimer[Pahan]);
h_SlapTimer[Pahan] = INVALID_HANDLE;
}
else if (h_lateTimer != INVALID_HANDLE)
{
KillTimer(h_lateTimer);
h_lateTimer = INVALID_HANDLE;
}
h_lateTimer = CreateTimer(5.0, Func_LateTimer);
}
}
public HandleSlapMenu(Handle:menu, MenuAction:action, client, slot)
{
if (action != MenuAction_Select)
return;
decl String:userid[15];
GetMenuItem(menu, slot, userid, 15);
new target = GetClientOfUserId(StringToInt(userid));
if (target > 0)
{
if (iHp == 0)
{
PrintToChat(target, "%sШлёпнул вас", PREFIX);
PrintToChat(client, "%sВы шлёпнули \x04%N", PREFIX, target);
}
else
{
SlapPlayer(target, iHp, true);
PrintToChat(target, "%sШлёпнул вас на \x04%d HP", PREFIX, iHp);
PrintToChat(client, "%sВы шлёпнули \x04%N \x01на \x04%d HP", PREFIX, target, iHp);
}
CloseHandle(menu);
}
else
{
PrintToChat(client, "Игрок не найден");
}
}
public Action:Func_SlapMenu(Handle:timer_f)
{
SlapMenu();
DisplayMenu(h_pSlapMenu, Pahan, 15);
}
stock SetPahan(client)
{
if (CheckPlayer(client) && IsPlayerAlive(client))
{
Pahan = client;
//Таймер для вывода меню с возможностью шлёпать КТ
h_SlapTimer[Pahan] = CreateTimer(fSlapDelay, Func_SlapMenu, _, TIMER_REPEAT);
//Работа с моделью
GetEntPropString(Pahan, Prop_Data, "m_ModelName", s_ModelOld, sizeof(s_ModelOld));
SetEntityModel(Pahan, s_ModelPath);
SetClientListeningFlags(Pahan, VOICE_NORMAL);
//Выдаем Молотов!
GivePlayerItem(Pahan, "weapon_molotov");
}
}
stock CheckPlayer(client)
{
if (client > 0 && IsClientInGame(client) && !IsFakeClient(client) && GetClientTeam(client) == CS_TEAM_T)
return true;
return false;
}
stock SlapMenu()
{
h_pSlapMenu = CreateMenu(HandleSlapMenu);
SetMenuTitle(h_pSlapMenu, "Шлёпнуть КТ");
decl String:Num_String[15], String:Name_String[MAX_NAME_LENGTH];
for (new i = 1; i <= MaxClients; i++)
{
if(IsClientInGame(i) && !IsFakeClient(i) && GetClientTeam(i) == CS_TEAM_CT && IsPlayerAlive(i))
{
IntToString(GetClientUserId(i), Num_String, sizeof(Num_String));
GetClientName(i, Name_String, sizeof(Name_String));
AddMenuItem(h_pSlapMenu, Num_String, Name_String);
}
}
}
stock PahanVote()
{
if (h_pMenu != INVALID_HANDLE) CloseHandle(h_pMenu);
h_pMenu = CreateMenu(Select_Pahan);
SetMenuTitle(h_pMenu, "Кто станет паханом в этом раунде?\n \n");
SetMenuExitButton(h_pMenu, false);
decl String:Num_String[15], String:Name_String[MAX_NAME_LENGTH];
new players = 0;
for (new i = 1; i <= MaxClients; i++)
{
pickup_vots[i] = 0;
if (CheckPlayer(i) && GetClientName(i, Name_String, sizeof(Name_String)))
{
//получаем userid игрока и делаем его строкой чтобы добавить в меню
IntToString(GetClientUserId(i), Num_String, sizeof(Num_String));
AddMenuItem(h_pMenu, Num_String, Name_String);
players++;
}
}
//Если игроки есть на сервере, то
if (players > 0)
{
for (new i = 1; i <= MaxClients; i++)
{
if (CheckPlayer(i)) DisplayMenu(h_pMenu, i, 10);
}
all_votes = 0; //Всего голосов
h_Timer = CreateTimer(1.0, Timer_Func, _, TIMER_REPEAT);
}
else
{
//Нет игроков, то удаляем меню
CloseHandle(h_pMenu);
h_pMenu = INVALID_HANDLE;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment