Besais
Участник
- Сообщения
- 26
- Реакции
- 0
Решил написать плагин для ножевых раундов на основе NoZoom Rounds Voting, но есть баг из-за которого ножевые раунды начинаются и заканчиваются на 1 раунд позже. Как это можно исправить?
krv.sp:
#pragma semicolon 1
#include <sourcemod>
#include <sdkhooks>
#include <sdktools>
#include <csgo_colors>
#undef REQUIRE_PLUGIN
#pragma newdecls required
int g_iRounds, g_iCooldown, g_iPercent;
bool g_bKR, g_bVoted[MAXPLAYERS+1];
int g_iKRounds, g_iVotes, g_iTarget;
char g_sPrefix[32];
ConVar g_hCvar[4];
public Plugin myinfo =
{
name = "Knife Rounds Voting",
author = "Besais",
version = "1.0",
url = ""
};
public void OnPluginStart()
{
RegConsoleCmd("sm_kr", OnVoteCmd);
HookEvent("round_start", OnRoundStart);
HookEvent("player_spawn", OnPlayerSpawn);
g_hCvar[0] = CreateConVar("sm_krv_rounds", "4", "Количество ножевых раундов после успешного голосования.");
g_hCvar[1] = CreateConVar("sm_krv_cooldown_rounds", "4", "Количество раундов между голосованиями.");
g_hCvar[2] = CreateConVar("sm_krv_voting_percent", "50", "Процент от всех игроков, требуемый для начала ножевых раундов.");
g_hCvar[3] = CreateConVar("sm_krv_chat_prefix", "{green}[KRV]{default}", "Префикс плагина в чате.");
AutoExecConfig(true, "krv");
LoadTranslations("krv.phrases");
}
public void OnConfigsExecuted()
{
g_iRounds = GetConVarInt(g_hCvar[0]);
g_iCooldown = GetConVarInt(g_hCvar[1]);
g_iPercent = GetConVarInt(g_hCvar[2]);
GetConVarString(g_hCvar[3], g_sPrefix, sizeof(g_sPrefix));
}
public void OnMapStart()
{
g_iTarget = g_iCooldown;
}
public void OnClientDisconnect(int client)
{
if(g_bVoted[client])
{
g_bVoted[client] = false;
--g_iVotes;
}
}
public Action OnPlayerSpawn(Event hEvent, const char[] sName, bool bDontBroadcast)
{
if(g_bKR)
{
int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
int Weapon_Slot;
for (int i = 0; i < 5; i++)
{
if ((Weapon_Slot = GetPlayerWeaponSlot(iClient, i)) > 0 && RemovePlayerItem(iClient, Weapon_Slot))
{
AcceptEntityInput(Weapon_Slot, "Kill");
}
}
GivePlayerItem(iClient, "weapon_knife");
}
return Plugin_Continue;
}
public Action OnVoteCmd(int client, int args)
{
if(client)
{
if(!g_bKR)
{
int need = RoundToCeil(float(GetClientCount(true)) * (float(g_iPercent) / 100.0));
if(g_iVotes < need)
{
int rounds = GameRules_GetProp("m_totalRoundsPlayed");
if(g_iTarget <= rounds)
{
if(!g_bVoted[client])
{
++g_iVotes;
g_bVoted[client] = true;
CGOPrintToChatAll("%s{default} %t", g_sPrefix, "vote msg", client, g_iVotes, need);
}
else CGOPrintToChat(client, "%s{default} %t", g_sPrefix, "already voted");
if(g_iVotes >= need) CGOPrintToChatAll("%s{default} %t", g_sPrefix, "next round alert");
}
else CGOPrintToChat(client, "%s{default} %t", g_sPrefix, "cooldown alert", g_iTarget - rounds);
}
else CGOPrintToChat(client, "%s{default} %t", g_sPrefix, "enough votes");
}
else CGOPrintToChat(client, "%s{default} %t", g_sPrefix, "already happening");
}
return Plugin_Handled;
}
public void OnRoundStart(Event hEvent, const char[] name, bool dontBroadcast)
{
if(!g_bKR)
{
if(g_iVotes >= RoundToCeil(float(GetClientCount(true)) * (float(g_iPercent) / 100.0)))
{
g_bKR = true;
}
int rounds = GameRules_GetProp("m_totalRoundsPlayed");
if(g_iTarget - g_iCooldown > rounds)
g_iTarget = g_iCooldown;
}
if(g_iKRounds >= g_iRounds)
{
g_bKR = false;
g_iKRounds = g_iVotes = 0;
for (int i = 1; i <= MaxClients; ++i)
if (IsClientInGame(i))
g_bVoted[i] = false;
if(g_iCooldown)
g_iTarget = GameRules_GetProp("m_totalRoundsPlayed") + g_iCooldown;
CGOPrintToChatAll("%s{default} %t", g_sPrefix, "battle end");
}
if(g_bKR)
{
++g_iKRounds;
CGOPrintToChatAll("%s{default} %t", g_sPrefix, "round start alert");
}
}