Last active
October 17, 2016 18:14
-
-
Save TiBarification/025c59a1685dba568b06 to your computer and use it in GitHub Desktop.
Поправлен шлепок, вынесен за условие.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*ТЗ: | |
пахан вызывается случайным голосованием, имеет гранату(зажигательную) | |
может шлепать выбранного КТ каждую минуту. | |
Пахан доступен 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