Переменная на ноузум [РЕШЕНО]

Barkelay

Участник
Сообщения
520
Реакции
61
Операционная система
Windows
Текст ошибки
if(strcmp(sWeapon[7], "awp") == 0)
Список мета-модулей
Не важно
Список плагинов SM
Не важно
Список расширений SM
Не важно
Всем привет, нашёл один плагин, но кажется автор на него забил и я решил спросить тут

Может кто подскажет переменную, которая отвечает за стрельбу без прицела, если таковая имеется
Или же хотя бы как сделать в этом плагине, чтобы ноузум работал не только на AWP, но и на Scout и Скорострелках

Вот код... Там стоит только AWP, как добавить и другое оружие?
P.S. Нужное выделено "жирным"
#pragma semicolon 1

#include <sourcemod>
#include <sdkhooks>
#include <sdktools>
#include <csgo_colors>

#undef REQUIRE_PLUGIN
#include <adminmenu>

#pragma newdecls required

int g_iRounds, g_iCooldown, g_iPercent;
bool g_bPrintKills, g_bPrintAdv, g_bDisableDeagle;

bool g_bNZ, g_bVoted[MAXPLAYERS+1], g_bAdminStart;
int g_iNZRounds, g_iVotes, g_iRemainRounds, m_flNextSecondaryAttack = -1;
char g_sPrefix[32];

ConVar g_hCvar[7];
TopMenu g_hAdminMenu = null;

public Plugin myinfo =
{
name = "NoZoom Rounds Voting",
author = "d4Ck(vk.com/geliydaun)",
version = "2.0.0",
url = "CRYSTALS SOURCEMOD PLUGINS"
};

public void OnPluginStart()
{
RegConsoleCmd("sm_nz", OnVoteCmd);
RegConsoleCmd("sm_nozoom", OnVoteCmd);
RegConsoleCmd("sm_nzrv", OnVoteCmd);

HookEvent("round_start", OnRoundStart);
HookEvent("player_death", OnPlayerDeath);

m_flNextSecondaryAttack = FindSendPropInfo("CBaseCombatWeapon", "m_flNextSecondaryAttack");

g_hCvar[0] = CreateConVar("sm_nzrv_rounds", "1", "Количество раундов без прицела после успешного голосования.");
g_hCvar[1] = CreateConVar("sm_nzrv_cooldown_rounds", "0", "Количество раундов между голосованиями.");
g_hCvar[2] = CreateConVar("sm_nzrv_voting_percent", "50", "Процент от всех игроков, требуемый для начала игры без прицелов.");
g_hCvar[3] = CreateConVar("sm_nzrv_print_kills", "1", "Писать в чат об убийствах без прицела?\nВо время NoZoom раундов функция автоматически отключается.\n1 - Да.\n0 - Нет.");
g_hCvar[4] = CreateConVar("sm_nzrv_print_adv", "0", "Включена ли реклама в начале раунда?\n1 - Да.\n0 - Нет.");
g_hCvar[5] = CreateConVar("sm_nzrv_disable_deagle", "0", "Отключен ли дигл на время раундов без прицела?\n1 - Да.\n0 - Нет.");
g_hCvar[6] = CreateConVar("sm_nzrv_chat_prefix", "[Без прицела]", "Префикс плагина в чате.");

AutoExecConfig(true, "nzrv");
LoadTranslations("nzrv.phrases");

if (LibraryExists("adminmenu"))
{
TopMenu hTopMenu;
hTopMenu = GetAdminTopMenu();
if (hTopMenu != null)
{
OnAdminMenuReady(hTopMenu);
}
}

for (int i = 1; i <= MaxClients; ++i)
{
if (IsClientInGame(i))
{
OnClientPutInServer(i);
}
}
}

public void OnConfigsExecuted()
{
g_iRounds = GetConVarInt(g_hCvar[0]);
g_iCooldown = GetConVarInt(g_hCvar[1]) + 1;
g_iPercent = GetConVarInt(g_hCvar[2]);
g_bPrintKills = GetConVarBool(g_hCvar[3]);
g_bPrintAdv = GetConVarBool(g_hCvar[4]);
g_bDisableDeagle = GetConVarBool(g_hCvar[5]);
GetConVarString(g_hCvar[6], g_sPrefix, sizeof(g_sPrefix));
}

public void OnAdminMenuReady(Handle aTopMenu)
{
TopMenu hTopMenu = TopMenu.FromHandle(aTopMenu);

if (hTopMenu == g_hAdminMenu)
return;

g_hAdminMenu = hTopMenu;

TopMenuObject hCategory = g_hAdminMenu.FindCategory("ServerCommands");

if (hCategory != INVALID_TOPMENUOBJECT)
g_hAdminMenu.AddItem("AdminStart", StartNoZoomCallback, hCategory, "start_nozoom", ADMFLAG_ROOT);
}

public void StartNoZoomCallback(TopMenu hMenu, TopMenuAction action, TopMenuObject object_id, int iClient, char[] sBuffer, int maxlength)
{
switch (action)
{
case TopMenuAction_DrawOption:
{
if(g_bNZ || g_bAdminStart) sBuffer[0] = ITEMDRAW_DISABLED;
}
case TopMenuAction_DisplayOption:
{
FormatEx(sBuffer, maxlength, "Начать битву без прицелов");
}
case TopMenuAction_SelectOption:
{
g_bAdminStart = true;
CGOPrintToChatAll("%s{default} %t", g_sPrefix, "next round alert");
}
}
}

public void OnMapStart()
{
g_bNZ = g_bAdminStart = false;
g_iRemainRounds = g_iCooldown;
}

public void OnClientPutInServer(int client)
{
SDKHook(client, SDKHook_PreThink, OnPreThink);
if(g_bDisableDeagle) SDKHook(client, SDKHook_WeaponCanUse, OnWeaponCanUse);
}

public void OnClientDisconnect(int client)
{
if(g_bVoted[client])
{
g_bVoted[client] = false;
--g_iVotes;
}
}

public Action OnPreThink(int client)
{
if(g_bNZ) SetNoScope(GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon"));
return Plugin_Continue;
}

public void OnPlayerDeath(Event hEvent, const char[] name, bool dontBroadcast)
{
if(g_bPrintKills && !g_bNZ)
{
int client = GetClientOfUserId(hEvent.GetInt("userid"));
int attacker = GetClientOfUserId(hEvent.GetInt("attacker"));

if (attacker > 0 && IsClientInGame(attacker))
{
if (attacker != client)
{
char sWeapon[32];
GetEventString(hEvent, "weapon", sWeapon, sizeof(sWeapon));
if (!GetEntProp(attacker, Prop_Send, "m_bIsScoped") && StrContains(sWeapon, "awp", false) != -1)
CGOPrintToChatAll("%s{default} %t", g_sPrefix, "nozoom kill", attacker, client);
}
}
}
}

public Action OnVoteCmd(int client, int args)
{
if(client)
{
if(!g_bNZ)
{
int need = RoundToCeil(float(GetClientCount(true)) * (float(g_iPercent) / 100.0));

if(!g_bAdminStart && g_iVotes < need)
{
int rounds = GameRules_GetProp("m_totalRoundsPlayed");

if(g_iRemainRounds <= 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_iRemainRounds - 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_bNZ)
{
if(g_bAdminStart || g_iVotes >= RoundToCeil(float(GetClientCount(true)) * (float(g_iPercent) / 100.0)))
{
g_bNZ = true;
g_bAdminStart = false;
}

if (g_bPrintAdv && !g_bNZ && g_iRemainRounds <= GameRules_GetProp("m_totalRoundsPlayed"))
CGOPrintToChatAll("%s{default} %t", g_sPrefix, "advertisement");
}

if(g_iNZRounds >= g_iRounds)
{
g_bNZ = false;
g_iNZRounds = g_iVotes = 0;

for (int i = 1; i <= MaxClients; ++i)
{
if (IsClientInGame(i))
{
g_bVoted = false;
}
}

g_iRemainRounds = GameRules_GetProp("m_totalRoundsPlayed") + g_iCooldown;

CGOPrintToChatAll("%s{default} %t", g_sPrefix, "battle end");
}

if(g_bNZ)
{
++g_iNZRounds;
CGOPrintToChatAll("%s{default} %t", g_sPrefix, "round start alert");

if(g_bDisableDeagle)
{
char sWeapon[64];
int iEnt = GetMaxEntities();
for (int i = 1; i < iEnt; ++i)
{
if (IsValidEdict(i) && IsValidEntity(i))
{
GetEdictClassname(i, sWeapon, sizeof(sWeapon));
if (strcmp(sWeapon[7], "deagle") == 0) RemoveEdict(i);
}
}
}
}
}

void SetNoScope(int weapon)
{
if (IsValidEdict(weapon))
{
char sWeapon[32];
GetEdictClassname(weapon, sWeapon, sizeof(sWeapon));
if(strcmp(sWeapon[7], "awp") == 0)
SetEntDataFloat(weapon, m_flNextSecondaryAttack, GetGameTime() + 2.0);
}
}

public Action OnWeaponCanUse(int client, int weapon)
{
char sWeapon[32];
GetEdictClassname(weapon, sWeapon, sizeof(sWeapon));
if(g_bNZ && strcmp(sWeapon[7], "deagle") == 0)
return Plugin_Handled;

return Plugin_Continue;
}
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
if(!strcmp(sWeapon[7], "awp") || !strcmp(sWeapon[7], "g3sg1") || !strcmp(sWeapon[7], "scar20") || !strcmp(sWeapon[7], "ssg08")) || !strcmp(sWeapon[7], "sg550")) || !strcmp(sWeapon[7], "scout"))
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075
Может кто подскажет переменную, которая отвечает за стрельбу без прицела, если таковая имеется
Что имеется в виду? Отключение возможности зумирования? Как помнится - такого нет, только отключать с помощью плагинов.

if (!GetEntProp(attacker, Prop_Send, "m_bIsScoped") && StrContains(sWeapon, "awp", false) != -1)
if (!GetEntProp(attacker, Prop_Send, "m_bIsScoped") && (StrContains(sWeapon, "awp", false) != -1 || StrContains(sWeapon, "ssg08", false) != -1 || StrContains(sWeapon, "scar20", false) != -1 || StrContains(sWeapon, "g3sg1 ", false) != -1))

По второму "жирному" уже ответили выше
 

Barkelay

Участник
Сообщения
520
Реакции
61
Что имеется в виду? Отключение возможности зумирования? Как помнится - такого нет, только отключать с помощью плагинов.


if (!GetEntProp(attacker, Prop_Send, "m_bIsScoped") && (StrContains(sWeapon, "awp", false) != -1 || StrContains(sWeapon, "ssg08", false) != -1 || StrContains(sWeapon, "scar20", false) != -1 || StrContains(sWeapon, "g3sg1 ", false) != -1))

По второму "жирному" уже ответили выше
if (!strcmp(sWeapon[7], "awp") || !strcmp(sWeapon[7], "g3sg1") || !strcmp(sWeapon[7], "scar20") || !strcmp(sWeapon[7], "ssg08"))
if (!GetEntProp(attacker, Prop_Send, "m_bIsScoped") && (StrContains(sWeapon, "awp", false) != -1 || StrContains(sWeapon, "ssg08", false) != -1 || StrContains(sWeapon, "scar20", false) != -1 || StrContains(sWeapon, "g3sg1 ", false) != -1))

Не компилирует... 😢
C:\Server\server_csgo\csgo\addons\sourcemod\scripting\nzrv.sp(150) : warning 219: local variable "attacker" shadows a variable at a preceding level
C:\Server\server_csgo\csgo\addons\sourcemod\scripting\nzrv.sp(258) : error 017: undefined symbol "attacker"

Где может быть ошибка?
Полный код:
#pragma semicolon 1

#include <sourcemod>
#include <sdkhooks>
#include <sdktools>
#include <csgo_colors>

#undef REQUIRE_PLUGIN
#include <adminmenu>

#pragma newdecls required

int g_iRounds, g_iCooldown, g_iPercent;
bool g_bPrintKills, g_bPrintAdv, g_bDisableDeagle;

bool g_bNZ, g_bVoted[MAXPLAYERS+1], g_bAdminStart;
int g_iNZRounds, g_iVotes, g_iRemainRounds, m_flNextSecondaryAttack = -1;
char g_sPrefix[32];

ConVar g_hCvar[7];
TopMenu g_hAdminMenu = null;

public Plugin myinfo =
{
name = "NoZoom Rounds Voting",
author = "d4Ck(vk.com/geliydaun)",
version = "2.0.0",
url = "CRYSTALS SOURCEMOD PLUGINS"
};

public void OnPluginStart()
{
RegConsoleCmd("sm_nz", OnVoteCmd);
RegConsoleCmd("sm_nozoom", OnVoteCmd);
RegConsoleCmd("sm_nzrv", OnVoteCmd);

HookEvent("round_start", OnRoundStart);
HookEvent("player_death", OnPlayerDeath);

m_flNextSecondaryAttack = FindSendPropInfo("CBaseCombatWeapon", "m_flNextSecondaryAttack");

g_hCvar[0] = CreateConVar("sm_nzrv_rounds", "1", "Количество раундов без прицела после успешного голосования.");
g_hCvar[1] = CreateConVar("sm_nzrv_cooldown_rounds", "0", "Количество раундов между голосованиями.");
g_hCvar[2] = CreateConVar("sm_nzrv_voting_percent", "50", "Процент от всех игроков, требуемый для начала игры без прицелов.");
g_hCvar[3] = CreateConVar("sm_nzrv_print_kills", "1", "Писать в чат об убийствах без прицела?\nВо время NoZoom раундов функция автоматически отключается.\n1 - Да.\n0 - Нет.");
g_hCvar[4] = CreateConVar("sm_nzrv_print_adv", "0", "Включена ли реклама в начале раунда?\n1 - Да.\n0 - Нет.");
g_hCvar[5] = CreateConVar("sm_nzrv_disable_deagle", "0", "Отключен ли дигл на время раундов без прицела?\n1 - Да.\n0 - Нет.");
g_hCvar[6] = CreateConVar("sm_nzrv_chat_prefix", "[Без прицела]", "Префикс плагина в чате.");

AutoExecConfig(true, "nzrv");
LoadTranslations("nzrv.phrases");

if (LibraryExists("adminmenu"))
{
TopMenu hTopMenu;
hTopMenu = GetAdminTopMenu();
if (hTopMenu != null)
{
OnAdminMenuReady(hTopMenu);
}
}

for (int i = 1; i <= MaxClients; ++i)
{
if (IsClientInGame(i))
{
OnClientPutInServer(i);
}
}
}

public void OnConfigsExecuted()
{
g_iRounds = GetConVarInt(g_hCvar[0]);
g_iCooldown = GetConVarInt(g_hCvar[1]) + 1;
g_iPercent = GetConVarInt(g_hCvar[2]);
g_bPrintKills = GetConVarBool(g_hCvar[3]);
g_bPrintAdv = GetConVarBool(g_hCvar[4]);
g_bDisableDeagle = GetConVarBool(g_hCvar[5]);
GetConVarString(g_hCvar[6], g_sPrefix, sizeof(g_sPrefix));
}

public void OnAdminMenuReady(Handle aTopMenu)
{
TopMenu hTopMenu = TopMenu.FromHandle(aTopMenu);

if (hTopMenu == g_hAdminMenu)
return;

g_hAdminMenu = hTopMenu;

TopMenuObject hCategory = g_hAdminMenu.FindCategory("ServerCommands");

if (hCategory != INVALID_TOPMENUOBJECT)
g_hAdminMenu.AddItem("AdminStart", StartNoZoomCallback, hCategory, "start_nozoom", ADMFLAG_ROOT);
}

public void StartNoZoomCallback(TopMenu hMenu, TopMenuAction action, TopMenuObject object_id, int iClient, char[] sBuffer, int maxlength)
{
switch (action)
{
case TopMenuAction_DrawOption:
{
if(g_bNZ || g_bAdminStart) sBuffer[0] = ITEMDRAW_DISABLED;
}
case TopMenuAction_DisplayOption:
{
FormatEx(sBuffer, maxlength, "Начать битву без прицелов");
}
case TopMenuAction_SelectOption:
{
g_bAdminStart = true;
CGOPrintToChatAll("%s{default} %t", g_sPrefix, "next round alert");
}
}
}

public void OnMapStart()
{
g_bNZ = g_bAdminStart = false;
g_iRemainRounds = g_iCooldown;
}

public void OnClientPutInServer(int client)
{
SDKHook(client, SDKHook_PreThink, OnPreThink);
if(g_bDisableDeagle) SDKHook(client, SDKHook_WeaponCanUse, OnWeaponCanUse);
}

public void OnClientDisconnect(int client)
{
if(g_bVoted[client])
{
g_bVoted[client] = false;
--g_iVotes;
}
}

public Action OnPreThink(int client)
{
if(g_bNZ) SetNoScope(GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon"));
return Plugin_Continue;
}

public void OnPlayerDeath(Event hEvent, const char[] name, bool dontBroadcast)
{
if(g_bPrintKills && !g_bNZ)
{
int client = GetClientOfUserId(hEvent.GetInt("userid"));
int attacker = GetClientOfUserId(hEvent.GetInt("attacker"));

if (attacker > 0 && IsClientInGame(attacker))
{
if (attacker != client)
{
char sWeapon[32];
GetEventString(hEvent, "weapon", sWeapon, sizeof(sWeapon));
if (!strcmp(sWeapon[7], "awp") || !strcmp(sWeapon[7], "g3sg1") || !strcmp(sWeapon[7], "scar20") || !strcmp(sWeapon[7], "ssg08"))
CGOPrintToChatAll("%s{default} %t", g_sPrefix, "nozoom kill", attacker, client);
}
}
}
}

public Action OnVoteCmd(int client, int args)
{
if(client)
{
if(!g_bNZ)
{
int need = RoundToCeil(float(GetClientCount(true)) * (float(g_iPercent) / 100.0));

if(!g_bAdminStart && g_iVotes < need)
{
int rounds = GameRules_GetProp("m_totalRoundsPlayed");

if(g_iRemainRounds <= 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_iRemainRounds - 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_bNZ)
{
if(g_bAdminStart || g_iVotes >= RoundToCeil(float(GetClientCount(true)) * (float(g_iPercent) / 100.0)))
{
g_bNZ = true;
g_bAdminStart = false;
}

if (g_bPrintAdv && !g_bNZ && g_iRemainRounds <= GameRules_GetProp("m_totalRoundsPlayed"))
CGOPrintToChatAll("%s{default} %t", g_sPrefix, "advertisement");
}

if(g_iNZRounds >= g_iRounds)
{
g_bNZ = false;
g_iNZRounds = g_iVotes = 0;

for (int i = 1; i <= MaxClients; ++i)
{
if (IsClientInGame(i))
{
g_bVoted = false;
}
}

g_iRemainRounds = GameRules_GetProp("m_totalRoundsPlayed") + g_iCooldown;

CGOPrintToChatAll("%s{default} %t", g_sPrefix, "battle end");
}

if(g_bNZ)
{
++g_iNZRounds;
CGOPrintToChatAll("%s{default} %t", g_sPrefix, "round start alert");

if(g_bDisableDeagle)
{
char sWeapon[64];
int iEnt = GetMaxEntities();
for (int i = 1; i < iEnt; ++i)
{
if (IsValidEdict(i) && IsValidEntity(i))
{
GetEdictClassname(i, sWeapon, sizeof(sWeapon));
if (strcmp(sWeapon[7], "deagle") == 0) RemoveEdict(i);
}
}
}
}
}

void SetNoScope(int weapon)
{
if (IsValidEdict(weapon))
{
char sWeapon[32];
GetEdictClassname(weapon, sWeapon, sizeof(sWeapon));
if (!GetEntProp(attacker, Prop_Send, "m_bIsScoped") && (StrContains(sWeapon, "awp", false) != -1 || StrContains(sWeapon, "ssg08", false) != -1 || StrContains(sWeapon, "scar20", false) != -1 || StrContains(sWeapon, "g3sg1 ", false) != -1))
SetEntDataFloat(weapon, m_flNextSecondaryAttack, GetGameTime() + 2.0);
}
}

public Action OnWeaponCanUse(int client, int weapon)
{
char sWeapon[32];
GetEdictClassname(weapon, sWeapon, sizeof(sWeapon));
if(g_bNZ && strcmp(sWeapon[7], "deagle") == 0)
return Plugin_Handled;

return Plugin_Continue;
}
Сообщения автоматически склеены:

UDP:
Тьфу блин, местами перепутал 😀
Большое спасибо, всё работает!

Кому надо, берите:
#pragma semicolon 1

#include <sourcemod>
#include <sdkhooks>
#include <sdktools>
#include <csgo_colors>

#undef REQUIRE_PLUGIN
#include <adminmenu>

#pragma newdecls required

int g_iRounds, g_iCooldown, g_iPercent;
bool g_bPrintKills, g_bPrintAdv, g_bDisableDeagle;

bool g_bNZ, g_bVoted[MAXPLAYERS+1], g_bAdminStart;
int g_iNZRounds, g_iVotes, g_iRemainRounds, m_flNextSecondaryAttack = -1;
char g_sPrefix[32];

ConVar g_hCvar[7];
TopMenu g_hAdminMenu = null;

public Plugin myinfo =
{
name = "NoZoom Rounds Voting",
author = "d4Ck(vk.com/geliydaun)",
version = "2.0.0",
url = "CRYSTALS SOURCEMOD PLUGINS"
};

public void OnPluginStart()
{
RegConsoleCmd("sm_nz", OnVoteCmd);
RegConsoleCmd("sm_nozoom", OnVoteCmd);
RegConsoleCmd("sm_nzrv", OnVoteCmd);

HookEvent("round_start", OnRoundStart);
HookEvent("player_death", OnPlayerDeath);

m_flNextSecondaryAttack = FindSendPropInfo("CBaseCombatWeapon", "m_flNextSecondaryAttack");

g_hCvar[0] = CreateConVar("sm_nzrv_rounds", "1", "Количество раундов без прицела после успешного голосования.");
g_hCvar[1] = CreateConVar("sm_nzrv_cooldown_rounds", "0", "Количество раундов между голосованиями.");
g_hCvar[2] = CreateConVar("sm_nzrv_voting_percent", "50", "Процент от всех игроков, требуемый для начала игры без прицелов.");
g_hCvar[3] = CreateConVar("sm_nzrv_print_kills", "1", "Писать в чат об убийствах без прицела?\nВо время NoZoom раундов функция автоматически отключается.\n1 - Да.\n0 - Нет.");
g_hCvar[4] = CreateConVar("sm_nzrv_print_adv", "0", "Включена ли реклама в начале раунда?\n1 - Да.\n0 - Нет.");
g_hCvar[5] = CreateConVar("sm_nzrv_disable_deagle", "0", "Отключен ли дигл на время раундов без прицела?\n1 - Да.\n0 - Нет.");
g_hCvar[6] = CreateConVar("sm_nzrv_chat_prefix", "[Без прицела]", "Префикс плагина в чате.");

AutoExecConfig(true, "nzrv");
LoadTranslations("nzrv.phrases");

if (LibraryExists("adminmenu"))
{
TopMenu hTopMenu;
hTopMenu = GetAdminTopMenu();
if (hTopMenu != null)
{
OnAdminMenuReady(hTopMenu);
}
}

for (int i = 1; i <= MaxClients; ++i)
{
if (IsClientInGame(i))
{
OnClientPutInServer(i);
}
}
}

public void OnConfigsExecuted()
{
g_iRounds = GetConVarInt(g_hCvar[0]);
g_iCooldown = GetConVarInt(g_hCvar[1]) + 1;
g_iPercent = GetConVarInt(g_hCvar[2]);
g_bPrintKills = GetConVarBool(g_hCvar[3]);
g_bPrintAdv = GetConVarBool(g_hCvar[4]);
g_bDisableDeagle = GetConVarBool(g_hCvar[5]);
GetConVarString(g_hCvar[6], g_sPrefix, sizeof(g_sPrefix));
}

public void OnAdminMenuReady(Handle aTopMenu)
{
TopMenu hTopMenu = TopMenu.FromHandle(aTopMenu);

if (hTopMenu == g_hAdminMenu)
return;

g_hAdminMenu = hTopMenu;

TopMenuObject hCategory = g_hAdminMenu.FindCategory("ServerCommands");

if (hCategory != INVALID_TOPMENUOBJECT)
g_hAdminMenu.AddItem("AdminStart", StartNoZoomCallback, hCategory, "start_nozoom", ADMFLAG_ROOT);
}

public void StartNoZoomCallback(TopMenu hMenu, TopMenuAction action, TopMenuObject object_id, int iClient, char[] sBuffer, int maxlength)
{
switch (action)
{
case TopMenuAction_DrawOption:
{
if(g_bNZ || g_bAdminStart) sBuffer[0] = ITEMDRAW_DISABLED;
}
case TopMenuAction_DisplayOption:
{
FormatEx(sBuffer, maxlength, "Начать битву без прицелов");
}
case TopMenuAction_SelectOption:
{
g_bAdminStart = true;
CGOPrintToChatAll("%s{default} %t", g_sPrefix, "next round alert");
}
}
}

public void OnMapStart()
{
g_bNZ = g_bAdminStart = false;
g_iRemainRounds = g_iCooldown;
}

public void OnClientPutInServer(int client)
{
SDKHook(client, SDKHook_PreThink, OnPreThink);
if(g_bDisableDeagle) SDKHook(client, SDKHook_WeaponCanUse, OnWeaponCanUse);
}

public void OnClientDisconnect(int client)
{
if(g_bVoted[client])
{
g_bVoted[client] = false;
--g_iVotes;
}
}

public Action OnPreThink(int client)
{
if(g_bNZ) SetNoScope(GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon"));
return Plugin_Continue;
}

public void OnPlayerDeath(Event hEvent, const char[] name, bool dontBroadcast)
{
if(g_bPrintKills && !g_bNZ)
{
int client = GetClientOfUserId(hEvent.GetInt("userid"));
int attacker = GetClientOfUserId(hEvent.GetInt("attacker"));

if (attacker > 0 && IsClientInGame(attacker))
{
if (attacker != client)
{
char sWeapon[32];
GetEventString(hEvent, "weapon", sWeapon, sizeof(sWeapon));
if (!GetEntProp(attacker, Prop_Send, "m_bIsScoped") && (StrContains(sWeapon, "awp", false) != -1 || StrContains(sWeapon, "ssg08", false) != -1 || StrContains(sWeapon, "scar20", false) != -1 || StrContains(sWeapon, "g3sg1 ", false) != -1))
CGOPrintToChatAll("%s{default} %t", g_sPrefix, "nozoom kill", attacker, client);
}
}
}
}

public Action OnVoteCmd(int client, int args)
{
if(client)
{
if(!g_bNZ)
{
int need = RoundToCeil(float(GetClientCount(true)) * (float(g_iPercent) / 100.0));

if(!g_bAdminStart && g_iVotes < need)
{
int rounds = GameRules_GetProp("m_totalRoundsPlayed");

if(g_iRemainRounds <= 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_iRemainRounds - 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_bNZ)
{
if(g_bAdminStart || g_iVotes >= RoundToCeil(float(GetClientCount(true)) * (float(g_iPercent) / 100.0)))
{
g_bNZ = true;
g_bAdminStart = false;
}

if (g_bPrintAdv && !g_bNZ && g_iRemainRounds <= GameRules_GetProp("m_totalRoundsPlayed"))
CGOPrintToChatAll("%s{default} %t", g_sPrefix, "advertisement");
}

if(g_iNZRounds >= g_iRounds)
{
g_bNZ = false;
g_iNZRounds = g_iVotes = 0;

for (int i = 1; i <= MaxClients; ++i)
{
if (IsClientInGame(i))
{
g_bVoted = false;
}
}

g_iRemainRounds = GameRules_GetProp("m_totalRoundsPlayed") + g_iCooldown;

CGOPrintToChatAll("%s{default} %t", g_sPrefix, "battle end");
}

if(g_bNZ)
{
++g_iNZRounds;
CGOPrintToChatAll("%s{default} %t", g_sPrefix, "round start alert");

if(g_bDisableDeagle)
{
char sWeapon[64];
int iEnt = GetMaxEntities();
for (int i = 1; i < iEnt; ++i)
{
if (IsValidEdict(i) && IsValidEntity(i))
{
GetEdictClassname(i, sWeapon, sizeof(sWeapon));
if (strcmp(sWeapon[7], "deagle") == 0) RemoveEdict(i);
}
}
}
}
}

void SetNoScope(int weapon)
{
if (IsValidEdict(weapon))
{
char sWeapon[32];
GetEdictClassname(weapon, sWeapon, sizeof(sWeapon));
if(!strcmp(sWeapon[7], "awp") || !strcmp(sWeapon[7], "g3sg1") || !strcmp(sWeapon[7], "scar20") || !strcmp(sWeapon[7], "ssg08"))
SetEntDataFloat(weapon, m_flNextSecondaryAttack, GetGameTime() + 2.0);
}
}

public Action OnWeaponCanUse(int client, int weapon)
{
char sWeapon[32];
GetEdictClassname(weapon, sWeapon, sizeof(sWeapon));
if(g_bNZ && strcmp(sWeapon[7], "deagle") == 0)
return Plugin_Handled;

return Plugin_Continue;
}
 
Последнее редактирование:

VeNoM`1K =))

Живи и ошибайся. В этом жизнь.
Сообщения
701
Реакции
267
Можете пожалуйста, сделать для ксс. Или просто скомпилируйте. Заранее спасибо)
 

Вложения

  • nzrv.sp
    7.6 КБ · Просмотры: 9

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
VeNoM`1K =)), добавил поддержку CSS и немного код почистил
Сообщения автоматически склеены:

только я не понял этого: case TopMenuAction_DrawOption: if(g_bNZ || g_bAdminStart) sBuffer[0] = ITEMDRAW_DISABLED;
Там же должно быть return, а не присваивание значения, вроде
 

Вложения

  • nzrv_css_csgo.sp
    7.7 КБ · Просмотры: 25

VeNoM`1K =))

Живи и ошибайся. В этом жизнь.
Сообщения
701
Реакции
267
VeNoM`1K =)), добавил поддержку CSS и немного код почистил
Сообщения автоматически склеены:

только я не понял этого: case TopMenuAction_DrawOption: if(g_bNZ || g_bAdminStart) sBuffer[0] = ITEMDRAW_DISABLED;
Там же должно быть return, а не присваивание значения, вроде
Вот такую ошибку пишет :
[SM] Exception reported: Property "m_totalRoundsPlayed" not found on the gamerules proxy
[SM] Blaming: nzrv_css_csgo.smx
 
Сверху Снизу