16 changed files with 1168 additions and 4 deletions
@ -0,0 +1,2 @@ |
|||
*.smx |
|||
plugins/*.smx |
@ -0,0 +1,64 @@ |
|||
#include <sourcemod> |
|||
#include "modules/extra.sp" |
|||
|
|||
#define _root_debug |
|||
|
|||
#define _mute |
|||
#if defined _mute |
|||
#include "modules/mute.sp" |
|||
#endif |
|||
|
|||
#define _kick |
|||
#if defined _kick |
|||
#include "modules/kick.sp" |
|||
#endif |
|||
|
|||
|
|||
#if defined _vipblock |
|||
#include "modules/vipblock.sp" |
|||
#endif |
|||
|
|||
public void OnPluginStart(){ |
|||
#if defined _mute |
|||
MuteVoteOn(); |
|||
#endif |
|||
#if defined _kick |
|||
KickVoteOn() |
|||
#endif |
|||
#if defined _vipblock |
|||
VIPBlockVoteOn(); |
|||
#endif |
|||
} |
|||
|
|||
public void OnPluginEnd(){ |
|||
#if defined _mute |
|||
MuteVoteOff(); |
|||
#endif |
|||
#if defined _kick |
|||
KickVoteOff() |
|||
#endif |
|||
#if defined _vipblock |
|||
VIPBlockVoteOff(); |
|||
#endif |
|||
} |
|||
|
|||
public void OnClientPostAdminCheck(int client){ |
|||
#if defined _mute |
|||
MuteCheckState(client); |
|||
#endif |
|||
#if defined _vipblock |
|||
VIPBlockCheckCookie(client); |
|||
#endif |
|||
} |
|||
|
|||
public void OnClientDisconnect(int client){ |
|||
#if defined _mute |
|||
MuteClearPlayerVotes(client); |
|||
#endif |
|||
#if defined _kick |
|||
KickClearPlayerVotes(client); |
|||
#endif |
|||
#if defined _vipblock |
|||
VIPBlockClearPlayerVotes(client, false); |
|||
#endif |
|||
} |
@ -0,0 +1,91 @@ |
|||
#include <sourcemod> |
|||
#define TF2_MAXPLAYERS 101 |
|||
#define _one_person |
|||
|
|||
#define VOTE_NO "###no###" |
|||
#define VOTE_YES "###yes###" |
|||
|
|||
g_CurrentVoteTarget = 0; |
|||
|
|||
/*stock DisplayVote(int client, int target, &Callback, const char[] phrare, const char[] menu_phrare, bool random = true){ |
|||
g_CurrentVoteTarget = GetClientUserId(target); |
|||
|
|||
PrintToChatAll(phrare, client, target); |
|||
PrintCenterTextAll(phrare, client, target); |
|||
|
|||
Handle VoteMenuProcessing = new Menu(Callback, MENU_ACTIONS_ALL); |
|||
SetMenuTitle(VoteMenuProcessing, menu_phrare); |
|||
if(random){ |
|||
int range_a = 6, range_b = 10; |
|||
int yes = GetRandomInt(range_a, range_b); |
|||
for(int i = range_a; i < range_b; i++){ |
|||
if(i == yes) AddMenuItem(VoteMenuProcessing, VOTE_YES, "ДА"); |
|||
else AddMenuItem(VoteMenuProcessing, VOTE_NO, "НЕТ НЕ НАДО"); |
|||
} |
|||
} else { |
|||
AddMenuItem(VoteMenuProcessing, VOTE_YES, "ДА"); |
|||
AddMenuItem(VoteMenuProcessing, VOTE_NO, "НЕТ НЕ НАДО"); |
|||
} |
|||
|
|||
SetMenuExitButton(VoteMenuProcessing, false); |
|||
VoteMenuToAll(VoteMenuProcessing, 20); |
|||
} |
|||
*/ |
|||
|
|||
bool TestVoteDelay(int client){ |
|||
int delay = CheckVoteDelay(); |
|||
|
|||
if (delay > 0) |
|||
{ |
|||
if (delay > 60) |
|||
{ |
|||
ReplyToCommand(client, "Чтоб начать новое голосование нужно подождать %i минут!", (delay / 60)); |
|||
} |
|||
else |
|||
{ |
|||
ReplyToCommand(client, "Чтоб начать новое голосование нужно подождать %i секунд!", delay); |
|||
} |
|||
|
|||
return false; |
|||
} |
|||
|
|||
return true; |
|||
} |
|||
|
|||
stock ClearPlayerVotes(int client, int[][] votes){ |
|||
for(int sub_client = 0; sub_client < TF2_MAXPLAYERS; sub_client++){ |
|||
votes[client][sub_client] = 0; |
|||
votes[sub_client][client] = 0; |
|||
} |
|||
} |
|||
|
|||
stock int ReturnVoteCount(int client, int[][] votes){ |
|||
int count = 0; |
|||
for(int i = 1; i <= TF2_MAXPLAYERS; i++){ |
|||
if(votes[client][i]) count++; |
|||
} |
|||
return count; |
|||
} |
|||
|
|||
stock int CalcNeedCount(float count){ |
|||
float current_player_count = float(GetClientCount()); |
|||
return RoundToCeil(current_player_count * count); |
|||
} |
|||
|
|||
stock bool IsValidClient(int client){ |
|||
|
|||
if(client > 4096){ |
|||
client = EntRefToEntIndex(client); |
|||
} |
|||
|
|||
if(client < 1 || client > MaxClients) return false; |
|||
|
|||
if(!IsClientInGame(client)) return false; |
|||
|
|||
if(IsFakeClient(client)) return false; |
|||
|
|||
if(GetEntProp(client, Prop_Send, "m_bIsCoaching")) return false; |
|||
|
|||
return true; |
|||
|
|||
} |
@ -0,0 +1,104 @@ |
|||
#include <sourcemod> |
|||
|
|||
float g_kick_need_count = 0.3; |
|||
|
|||
int g_kick_player_votes[TF2_MAXPLAYERS][TF2_MAXPLAYERS]; |
|||
Handle g_kick_timer = INVALID_HANDLE; |
|||
char g_kick_votecmd[32] = "sm_votekick"; |
|||
|
|||
#define KICK_VOTE_COMPLETE "Игрок %N был кикнут по итогу подсчетов голосов!" |
|||
#define KICK_VOTE_VOTED "Игрок %N проголосовал за кик игрока %N. Проголосовать за: !votekick в чат или через меню." |
|||
|
|||
stock bool KickCheckVotes(int client){ |
|||
if(ReturnVoteCount(client, g_kick_player_votes) >= CalcNeedCount(g_kick_need_count)){ |
|||
KickPlayer(client); |
|||
return true; |
|||
} else { |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
stock KickClearPlayerVotes(int client){ |
|||
ClearPlayerVotes(client, g_kick_player_votes); |
|||
} |
|||
|
|||
stock KickPlayer(int client){ |
|||
PrintCenterTextAll(KICK_VOTE_COMPLETE, client); |
|||
PrintToChatAll(KICK_VOTE_COMPLETE, client); |
|||
KickClient(client, "votekick"); |
|||
} |
|||
|
|||
stock KickVoteOn(){ |
|||
if(g_kick_timer != INVALID_HANDLE) KillTimer(g_kick_timer); |
|||
else g_kick_timer = CreateTimer(5.0, CallbackKickTimer, _, TIMER_REPEAT); |
|||
RegConsoleCmd(g_kick_votecmd, CommandKickVote, "Vote for kick player on server"); |
|||
PrintToServer("[FV] [VoteKick] support enable"); |
|||
} |
|||
|
|||
stock KickVoteOff(){ |
|||
if(g_kick_timer != INVALID_HANDLE) KillTimer(g_kick_timer); |
|||
} |
|||
|
|||
stock DisplayKickMenu(int client){ |
|||
Handle KickMenu = CreateMenu(CallbackKickBuildMenu); |
|||
SetMenuTitle(KickMenu, "Кикнуть игрока:"); |
|||
char menu_line[64]; |
|||
char player_uid[32]; |
|||
for(int player = 1; player <= MaxClients; player++){ |
|||
if(IsValidClient(player)){ |
|||
//if(player == client) continue; |
|||
if(CheckCommandAccess(player, "", ADMFLAG_BAN)) continue; |
|||
Format(player_uid, sizeof(player_uid), "%i", GetClientUserId(player)); |
|||
|
|||
if(g_kick_player_votes[player][client] == 0) { |
|||
Format(menu_line, sizeof(menu_line), "%N [%i/%i]", player, ReturnVoteCount(player, g_kick_player_votes), CalcNeedCount(g_kick_need_count)); |
|||
AddMenuItem(KickMenu, player_uid, menu_line); |
|||
} else { |
|||
Format(menu_line, sizeof(menu_line), "%N [Ты проголосовал]", player); |
|||
AddMenuItem(KickMenu, player_uid, menu_line, ITEMDRAW_DISABLED); |
|||
} |
|||
} |
|||
} |
|||
if(GetMenuItemCount(KickMenu) == 0){ |
|||
PrintCenterText(client, "Незакого голосовать, ты один на сервере"); |
|||
return; |
|||
} |
|||
DisplayMenu(KickMenu, client, 0); |
|||
return; |
|||
} |
|||
|
|||
stock CallbackKickBuildMenu(Handle KickMenu, MenuAction action, int client, int pos){ |
|||
switch(action){ |
|||
case MenuAction_Select:{ |
|||
char player_uid[32]; |
|||
GetMenuItem(KickMenu, pos, player_uid, sizeof(player_uid)); |
|||
int player = GetClientOfUserId(StringToInt(player_uid)); |
|||
if(player == 0){ |
|||
PrintCenterText(client, "Увы игрок вышел!"); |
|||
return; |
|||
} |
|||
|
|||
g_kick_player_votes[player][client] = 1; |
|||
if(!KickCheckVotes(player)) PrintCenterTextAll(KICK_VOTE_VOTED, client, player); |
|||
|
|||
} |
|||
case MenuAction_End: delete KickMenu; |
|||
} |
|||
return; |
|||
} |
|||
|
|||
stock Action CallbackKickTimer(Handle timer){ |
|||
for(int client = 1; client <= MaxClients; client++){ |
|||
if(IsValidClient(client)) KickCheckVotes(client); |
|||
} |
|||
} |
|||
|
|||
public Action CommandKickVote(int client, int args){ |
|||
if (client == 0) |
|||
{ |
|||
ReplyToCommand(client, "Cannot use command from RCON."); |
|||
return Plugin_Handled; |
|||
} |
|||
DisplayKickMenu(client); |
|||
return Plugin_Handled; |
|||
} |
@ -0,0 +1,124 @@ |
|||
#include <sourcemod> |
|||
#include <sdktools> |
|||
|
|||
//#include "extra.sp" |
|||
|
|||
int g_mute_player_votes[TF2_MAXPLAYERS][TF2_MAXPLAYERS]; |
|||
bool g_mute_player_voted[TF2_MAXPLAYERS]; |
|||
float g_mute_need_count = 0.3; |
|||
Handle g_mute_timer = INVALID_HANDLE; |
|||
char g_mute_votecmd[32] = "sm_votemute"; |
|||
|
|||
#define MUTE_VOTE_COMPLETE "Игрок %N был выключен микрофон по итогу подсчетов голосов!" |
|||
#define MUTE_VOTE_VOTED "Игрок %N проголосовал за выключение микрофона игрока %N. Проголосовать за: !votemute в чат или через меню." |
|||
|
|||
stock MuteCheckState(int client){ |
|||
if(GetClientListeningFlags(client) == VOICE_MUTED) g_mute_player_voted[client] = true; |
|||
} |
|||
|
|||
stock bool MuteCheckVotes(int client){ |
|||
if(ReturnVoteCount(client, g_mute_player_votes) >= CalcNeedCount(g_mute_need_count)){ |
|||
MutePlayer(client); |
|||
return true; |
|||
} else { |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
stock MuteClearPlayerVotes(int client){ |
|||
g_mute_player_voted[client] = false; |
|||
ClearPlayerVotes(client, g_mute_player_votes); |
|||
} |
|||
|
|||
stock MutePlayer(int client){ |
|||
PrintCenterTextAll(MUTE_VOTE_COMPLETE, client); |
|||
PrintToChatAll(MUTE_VOTE_COMPLETE, client); |
|||
MuteClearPlayerVotes(client); |
|||
g_mute_player_voted[client] = true; |
|||
if(CommandExists("sm_fsb_mute")){ |
|||
ServerCommand("sm_fsb_mute #%i 900 vote", GetClientUserId(client)); |
|||
} else { |
|||
SetClientListeningFlags(client, VOICE_MUTED); |
|||
} |
|||
} |
|||
|
|||
stock MuteVoteOn(){ |
|||
if(g_mute_timer != INVALID_HANDLE) KillTimer(g_mute_timer); |
|||
else g_mute_timer = CreateTimer(5.0, CallbackMuteTimer, _, TIMER_REPEAT); |
|||
RegConsoleCmd(g_mute_votecmd, CommandMuteVote, "Vote for mute player on server"); |
|||
PrintToServer("[FV] [VoteMute] support enable"); |
|||
for(int client = 1; client <= MaxClients; client++){ |
|||
if(IsValidClient(client)) MuteCheckState(client); |
|||
} |
|||
} |
|||
|
|||
stock MuteVoteOff(){ |
|||
if(g_mute_timer != INVALID_HANDLE) KillTimer(g_mute_timer); |
|||
} |
|||
|
|||
stock DisplayMuteMenu(int client){ |
|||
Handle MuteMenu = CreateMenu(CallbackMuteBuildMenu); |
|||
SetMenuTitle(MuteMenu, "Выключить микрофон у:"); |
|||
char menu_line[64]; |
|||
char player_uid[32]; |
|||
for(int player = 1; player <= MaxClients; player++){ |
|||
if(IsValidClient(player)){ |
|||
//if(player == client) continue; |
|||
if(CheckCommandAccess(player, "", ADMFLAG_BAN)) continue; |
|||
Format(player_uid, sizeof(player_uid), "%i", GetClientUserId(player)); |
|||
if(g_mute_player_voted[player]){ |
|||
Format(menu_line, sizeof(menu_line), "%N [Выключен микрофон]", player); |
|||
AddMenuItem(MuteMenu, player_uid, menu_line, ITEMDRAW_DISABLED); |
|||
} |
|||
else if(g_mute_player_votes[player][client] == 0) { |
|||
Format(menu_line, sizeof(menu_line), "%N [%i/%i]", player, ReturnVoteCount(player, g_mute_player_votes), CalcNeedCount(g_mute_need_count)); |
|||
AddMenuItem(MuteMenu, player_uid, menu_line); |
|||
} else { |
|||
Format(menu_line, sizeof(menu_line), "%N [Ты проголосовал]", player); |
|||
AddMenuItem(MuteMenu, player_uid, menu_line, ITEMDRAW_DISABLED); |
|||
} |
|||
} |
|||
} |
|||
if(GetMenuItemCount(MuteMenu) == 0){ |
|||
PrintCenterText(client, "Незакого голосовать, ты один на сервере"); |
|||
return; |
|||
} |
|||
DisplayMenu(MuteMenu, client, 0); |
|||
return; |
|||
} |
|||
|
|||
stock CallbackMuteBuildMenu(Handle MuteMenu, MenuAction action, int client, int pos){ |
|||
switch(action){ |
|||
case MenuAction_Select:{ |
|||
char player_uid[32]; |
|||
GetMenuItem(MuteMenu, pos, player_uid, sizeof(player_uid)); |
|||
int player = GetClientOfUserId(StringToInt(player_uid)); |
|||
if(player == 0){ |
|||
PrintCenterText(client, "Увы игрок вышел!"); |
|||
return; |
|||
} |
|||
|
|||
g_mute_player_votes[player][client] = 1; |
|||
if(!MuteCheckVotes(player)) PrintCenterTextAll(MUTE_VOTE_VOTED, client, player); |
|||
|
|||
} |
|||
case MenuAction_End: delete MuteMenu; |
|||
} |
|||
return; |
|||
} |
|||
|
|||
stock Action CallbackMuteTimer(Handle timer){ |
|||
for(int client = 1; client <= MaxClients; client++){ |
|||
if(IsValidClient(client)) MuteCheckVotes(client); |
|||
} |
|||
} |
|||
|
|||
public Action CommandMuteVote(int client, int args){ |
|||
if (client == 0) |
|||
{ |
|||
ReplyToCommand(client, "Cannot use command from RCON."); |
|||
return Plugin_Handled; |
|||
} |
|||
DisplayMuteMenu(client); |
|||
return Plugin_Handled; |
|||
} |
@ -0,0 +1,208 @@ |
|||
#include <sourcemod> |
|||
#include <clientprefs> |
|||
#include "extra.sp" |
|||
|
|||
#define VIP_COMMANDS_COUNT 4 |
|||
char g_vipblock_commands[VIP_COMMANDS_COUNT][32] = {"sm_rof", "sm_aia", "sm_sethealth", "sm_speedme"}; |
|||
char g_vipblock_commands_disable[VIP_COMMANDS_COUNT][32] = {"sm_rof #%i 1", "sm_aia #%i 0", "sm_sethealth %i 0", "sm_speed %i 360"}; |
|||
|
|||
int g_vipblock_player_votes[TF2_MAXPLAYERS][TF2_MAXPLAYERS]; |
|||
float g_vipblock_need_count = 0.3; |
|||
int g_vipblock_player_settime[TF2_MAXPLAYERS]; |
|||
int g_vipblock_blocktime = 900; |
|||
Handle g_vipblock_timer = INVALID_HANDLE; |
|||
char g_vipblock_votecmd[32] = "sm_votevip"; |
|||
Handle g_vipblock_cookie = INVALID_HANDLE; |
|||
|
|||
#define VIPBLOCK_VOTE_COMPLETE "У игрок %N был ограничен по итогу подсчетов голосов!" |
|||
#define VIPBLOCK_VOTE_VOTED "Игрок %N проголосовал за блокировку VIP у игрока %N. Проголосовать за: !voteblock в чат или через меню." |
|||
#define VIPBLOCK_TIMEOUT "Блокировка ВИП команд снята!" |
|||
|
|||
|
|||
stock bool VIPBlockCheckTime(int client){ |
|||
if(g_vipblock_player_settime[client] && GetTime() - g_vipblock_player_settime[client] > g_vipblock_blocktime){ |
|||
VIPBlockClearPlayerVotes(client); |
|||
PrintCenterText(client, VIPBLOCK_TIMEOUT); |
|||
return true; |
|||
} else return false; |
|||
} |
|||
|
|||
stock bool VIPBlockCheckVotes(int client){ |
|||
if(ReturnVoteCount(client, g_vipblock_player_votes) >= CalcNeedCount(g_vipblock_need_count)){ |
|||
VIPBlockPlayer(client); |
|||
return true; |
|||
} else { |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
stock VIPBlockClearPlayerVotes(int client, bool save_cookie = true){ |
|||
g_vipblock_player_settime[client] = 0; |
|||
ClearPlayerVotes(client, g_vipblock_player_votes); |
|||
if(save_cookie) VIPBlockSaveCookie(client); |
|||
} |
|||
|
|||
stock VIPBlockCmdsDisable(int client){ |
|||
int uid = GetClientUserId(client); |
|||
if(uid){ |
|||
for(int i = 0; i < VIP_COMMANDS_COUNT;i++){ |
|||
ServerCommand(g_vipblock_commands_disable[i], uid); |
|||
} |
|||
} |
|||
} |
|||
|
|||
stock VIPBlockPlayer(int client){ |
|||
PrintCenterTextAll(VIPBLOCK_VOTE_COMPLETE, client); |
|||
PrintToChatAll(VIPBLOCK_VOTE_COMPLETE, client); |
|||
VIPBlockClearPlayerVotes(client); |
|||
g_vipblock_player_settime[client] = GetTime(); |
|||
VIPBlockSaveCookie(client); |
|||
VIPBlockCmdsDisable(client); |
|||
} |
|||
|
|||
stock VIPBlockVoteOn(){ |
|||
if(g_vipblock_timer != INVALID_HANDLE) KillTimer(g_vipblock_timer); |
|||
else g_vipblock_timer = CreateTimer(5.0, CallbackVIPBlockTimer, _, TIMER_REPEAT); |
|||
RegConsoleCmd(g_vipblock_votecmd, CommandVIPBlockVote, "Vote for votevipblock player on server"); |
|||
RegConsoleCmd("sm_voteblock", CommandVIPBlockVote, "Vote for votevipblock player on server"); |
|||
RegAdminCmd("sm_voteblock_enable", CommandVIPBlockEnable, ADMFLAG_ROOT); |
|||
g_vipblock_cookie = RegClientCookie("fv_vipblock_settime", "", CookieAccess_Private); |
|||
VIPBlockListener(true); |
|||
PrintToServer("[FV] [VIPBlock] support enable"); |
|||
for(int client = 1; client <= MaxClients; client++){ |
|||
if(IsValidClient(client) && AreClientCookiesCached(client)) VIPBlockCheckCookie(client); |
|||
} |
|||
} |
|||
|
|||
stock VIPBlockListener(bool add = true){ |
|||
for(int i = 0; i < VIP_COMMANDS_COUNT; i++){ |
|||
if(add) AddCommandListener(VIPBlockCommandListener, g_vipblock_commands[i]); |
|||
else RemoveCommandListener(VIPBlockCommandListener, g_vipblock_commands[i]); |
|||
} |
|||
} |
|||
|
|||
public Action VIPBlockCommandListener(int client, const char[] command, int args){ |
|||
if(g_vipblock_player_settime[client] == 0) return Plugin_Handled; |
|||
if(VIPBlockCheckTime(client)){ |
|||
PrintCenterText(client, "С тебя сняли ограничение на использование VIP команд!"); |
|||
return Plugin_Handled; |
|||
} else { |
|||
PrintCenterText(client, "Тебе ограничен доступ к VIP командам по результатам голосования! Ограничение пропадет через %i секунд.", g_vipblock_blocktime - (GetTime() - g_vipblock_player_settime[client])); |
|||
return Plugin_Stop; |
|||
} |
|||
} |
|||
|
|||
stock VIPBlockCheckCookie(int client){ |
|||
VIPBlockClearPlayerVotes(client, false); |
|||
char cookie[256]; |
|||
GetClientCookie(client, g_vipblock_cookie, cookie, sizeof(cookie)); |
|||
if(strlen(cookie) > 0){ |
|||
int settime = StringToInt(cookie); |
|||
g_vipblock_player_settime[client] = settime; |
|||
PrintToServer("[FV] [VIPBlock] %N set %i", client, g_vipblock_player_settime[client]); |
|||
} |
|||
} |
|||
|
|||
stock VIPBlockSaveCookie(int client){ |
|||
char cookie[256]; |
|||
if(g_vipblock_player_settime[client]) Format(cookie, sizeof(cookie), "%i", g_vipblock_player_settime[client]); |
|||
else Format(cookie, sizeof(cookie), "0"); |
|||
SetClientCookie(client, g_vipblock_cookie, cookie); |
|||
if(g_vipblock_player_settime[client]) PrintToServer("[FV] [VIPBlock] %N set %i", client, g_vipblock_player_settime[client]); |
|||
} |
|||
|
|||
stock VIPBlockVoteOff(){ |
|||
VIPBlockListener(false); |
|||
if(g_vipblock_timer != INVALID_HANDLE) KillTimer(g_vipblock_timer); |
|||
} |
|||
|
|||
stock DisplayVIPBlockMenu(int client){ |
|||
Handle VIPBlockMenu = CreateMenu(CallbackVIPBlockBuildMenu); |
|||
SetMenuTitle(VIPBlockMenu, "Выключить VIP у:"); |
|||
char menu_line[64]; |
|||
char player_uid[32]; |
|||
for(int player = 1; player <= MaxClients; player++){ |
|||
if(IsValidClient(player)){ |
|||
//if(player == client) continue; |
|||
if(CheckCommandAccess(player, "", ADMFLAG_BAN)) continue; |
|||
|
|||
if(!CheckCommandAccess(player, "", ADMFLAG_RESERVATION)) continue; |
|||
|
|||
Format(player_uid, sizeof(player_uid), "%i", GetClientUserId(player)); |
|||
if(g_vipblock_player_settime[player]){ |
|||
Format(menu_line, sizeof(menu_line), "%N [Выключен VIP]", player); |
|||
AddMenuItem(VIPBlockMenu, player_uid, menu_line, ITEMDRAW_DISABLED); |
|||
} |
|||
else if(g_vipblock_player_votes[player][client] == 0) { |
|||
Format(menu_line, sizeof(menu_line), "%N [%i/%i]", player, ReturnVoteCount(player, g_vipblock_player_votes), CalcNeedCount(g_vipblock_need_count)); |
|||
AddMenuItem(VIPBlockMenu, player_uid, menu_line); |
|||
} else { |
|||
Format(menu_line, sizeof(menu_line), "%N [Ты проголосовал]", player); |
|||
AddMenuItem(VIPBlockMenu, player_uid, menu_line, ITEMDRAW_DISABLED); |
|||
} |
|||
} |
|||
} |
|||
if(GetMenuItemCount(VIPBlockMenu) == 0){ |
|||
PrintCenterText(client, "Незакого голосовать, нет випов на сервере."); |
|||
return; |
|||
} |
|||
DisplayMenu(VIPBlockMenu, client, 0); |
|||
return; |
|||
} |
|||
|
|||
stock CallbackVIPBlockBuildMenu(Handle VIPBlockMenu, MenuAction action, int client, int pos){ |
|||
switch(action){ |
|||
case MenuAction_Select:{ |
|||
char player_uid[32]; |
|||
GetMenuItem(VIPBlockMenu, pos, player_uid, sizeof(player_uid)); |
|||
int player = GetClientOfUserId(StringToInt(player_uid)); |
|||
if(player == 0){ |
|||
PrintCenterText(client, "Увы игрок вышел!"); |
|||
return; |
|||
} |
|||
|
|||
g_vipblock_player_votes[player][client] = 1; |
|||
|
|||
if(!VIPBlockCheckVotes(player)) PrintCenterTextAll(VIPBLOCK_VOTE_VOTED, client, player); |
|||
|
|||
} |
|||
case MenuAction_End: delete VIPBlockMenu; |
|||
} |
|||
return; |
|||
} |
|||
|
|||
stock Action CallbackVIPBlockTimer(Handle timer){ |
|||
for(int client = 1; client <= MaxClients; client++){ |
|||
if(IsValidClient(client)){ |
|||
VIPBlockCheckVotes(client); |
|||
VIPBlockCheckTime(client); |
|||
} |
|||
} |
|||
} |
|||
|
|||
public Action CommandVIPBlockVote(int client, int args){ |
|||
if (client == 0) |
|||
{ |
|||
ReplyToCommand(client, "Cannot use command from RCON."); |
|||
return Plugin_Handled; |
|||
} |
|||
DisplayVIPBlockMenu(client); |
|||
return Plugin_Handled; |
|||
} |
|||
|
|||
public Action CommandVIPBlockEnable(int client, int args){ |
|||
char text[256], arg[64]; |
|||
GetCmdArgString(text, sizeof(text)); |
|||
BreakString(text, arg, sizeof(arg)); |
|||
|
|||
int target = FindTarget(client, arg, _, false); |
|||
if(target == -1) return Plugin_Handled; |
|||
|
|||
if(g_vipblock_player_settime[target]){ |
|||
ReplyToCommand(client, "Already setted!"); |
|||
} else { |
|||
VIPBlockPlayer(target); |
|||
ReplyToCommand(client, "Setted!"); |
|||
} |
|||
return Plugin_Handled; |
|||
} |
@ -0,0 +1,6 @@ |
|||
"Sprite" |
|||
{ |
|||
"$spriteorientation" "vp_parallel" |
|||
"$spriteorigin" "[ 0.50 0.50 ]" |
|||
"$basetexture" "sprites/halo01" |
|||
} |
Binary file not shown.
@ -0,0 +1,6 @@ |
|||
"Sprite" |
|||
{ |
|||
"$spriteorientation" "vp_parallel" |
|||
"$spriteorigin" "[ 0.50 0.50 ]" |
|||
"$basetexture" "sprites/xbeam2" |
|||
} |
Binary file not shown.
@ -0,0 +1,307 @@ |
|||
#include <sourcemod> |
|||
#include <sdktools> |
|||
#include <tf2_stocks> |
|||
|
|||
bool piss_on_only_client = true; |
|||
bool piss_disable_move = false; |
|||
int piss_tick_counter = 1; //default 4 |
|||
float piss_time = 9.0; |
|||
float piss_distance = 100.0; |
|||
|
|||
int piss_check_count = 4; |
|||
int piss_check_need_count = 2; |
|||
|
|||
|
|||
int g_TickCounter = 0; |
|||
bool g_bPiss[MAXPLAYERS + 1] = { false, ... }; |
|||
bool g_bCanPiss[MAXPLAYERS + 1] = { true, ... }; |
|||
|
|||
int g_PissTarget[MAXPLAYERS + 1] = {0, ...}; |
|||
int g_PissCount[MAXPLAYERS + 1] = {0, ...}; |
|||
int g_PissStart[MAXPLAYERS + 1] = {0, ...}; |
|||
|
|||
int BeamSprite; |
|||
int HaloSprite; |
|||
|
|||
Handle g_PEnabled = INVALID_HANDLE; |
|||
//int gVelocityOffset; |
|||
|
|||
public Plugin:myinfo = |
|||
{ |
|||
name = "Piss Mod", |
|||
author = "gsd", |
|||
description = "Original code https://forums.alliedmods.net/showthread.php?t=295055", |
|||
version = "1.1", |
|||
url = "" |
|||
} |
|||
|
|||
public OnPluginStart(){ |
|||
RegConsoleCmd("piss", Piss_In); |
|||
g_PEnabled = CreateConVar("sm_piss_enabled", "1"); |
|||
AddFileToDownloadsTable("materials/sprites/xbeam2.vmt"); |
|||
AddFileToDownloadsTable("materials/sprites/halo01.vmt"); |
|||
HookEvent("player_death", Event_PlayerDeath); |
|||
//gVelocityOffset = FindSendPropInfo("CBasePlayer", "m_vecVelocity[0]"); |
|||
} |
|||
|
|||
public OnPluginEnd(){ |
|||
for(int client = 1; client <= MaxClients; client++){ |
|||
Piss_Out_Handler(client, true); |
|||
} |
|||
} |
|||
|
|||
public OnMapStart(){ |
|||
BeamSprite = PrecacheModel("materials/sprites/xbeam2.vmt"); |
|||
HaloSprite = PrecacheModel("materials/sprites/halo01.vmt"); |
|||
} |
|||
|
|||
public OnClientConnected(int client){ |
|||
g_bCanPiss[client] = true; |
|||
g_bPiss[client] = false; |
|||
g_PissTarget[client] = 0; |
|||
g_PissCount[client] = 0; |
|||
g_PissStart[client] = 0; |
|||
} |
|||
|
|||
public OnClientDisconnect(int client){ |
|||
Piss_Out_Handler(client, true); |
|||
} |
|||
|
|||
public OnGameFrame() |
|||
{ |
|||
if(g_TickCounter == piss_tick_counter) |
|||
{ |
|||
for(int client = 1; client <=MaxClients; ++client) |
|||
{ |
|||
if(IsClientInGame(client) && IsPlayerAlive(client)) |
|||
{ |
|||
if(g_bPiss[client]) |
|||
{ |
|||
PissBeam(client); |
|||
} |
|||
} |
|||
} |
|||
g_TickCounter=0; |
|||
} |
|||
else |
|||
{ |
|||
g_TickCounter++; |
|||
} |
|||
} |
|||
|
|||
public Action Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast){ |
|||
int client = GetClientOfUserId(GetEventInt(event, "userid")); |
|||
if(g_bPiss[client]) Piss_Out_Handler(client, true); |
|||
} |
|||
|
|||
stock bool CheckPissDistance(int client, int target){ |
|||
new Float:rposition[3]; |
|||
new Float:cposition[3]; |
|||
GetEntPropVector(target, Prop_Send, "m_vecOrigin", rposition); |
|||
|
|||
GetClientAbsOrigin(client, cposition); |
|||
decl Float:DistanceG; |
|||
DistanceG = GetVectorDistance(rposition,cposition); |
|||
|
|||
if(DistanceG <= piss_distance) return true; |
|||
else return false; |
|||
} |
|||
|
|||
public Action:Piss_In(client, args) |
|||
{ |
|||
//PrintToServer("%N:%i", client, g_bCanPiss[client]); |
|||
if(!GetConVarBool(g_PEnabled)){ |
|||
PrintCenterText(client, "У тебя простатит..."); |
|||
return Plugin_Continue; |
|||
} |
|||
|
|||
if(!g_bCanPiss[client]){ |
|||
return Plugin_Continue; |
|||
} |
|||
/* |
|||
if ((g_AdmFlag > 0) && !CheckCommandAccess(client, "sm_piss", g_AdmFlag, true)) |
|||
{ |
|||
PrintToChat(client, "\x04You do not have access"); |
|||
return Plugin_Handled; |
|||
} |
|||
*/ |
|||
/* |
|||
if(veces[client] > GetConVarInt(g_veces)) |
|||
{ |
|||
PrintToChat(client, "\x04Times for round excedded"); |
|||
return Plugin_Handled; |
|||
} |
|||
*/ |
|||
//for(new i=1;i<=MaxClients;++i) |
|||
if(true) |
|||
{ |
|||
//if(g_PKiller[i] == client) |
|||
if(true) |
|||
{ |
|||
int ent = GetClientAimTarget(client, piss_on_only_client); |
|||
//PrintToServer("%N|%i|%i", client, ent, IsValidEdict(ent)); |
|||
if(IsValidEdict(ent)) |
|||
{ |
|||
g_PissTarget[client] = ent; |
|||
/*if ((g_AdmFlag2 > 0) && !CheckCommandAccess(client, "sm_piss2", g_AdmFlag2, true)) |
|||
{ |
|||
PrintToChat(client, "\x04You do not have access"); |
|||
return Plugin_Handled; |
|||
}*/ |
|||
|
|||
//if(DistanceG <= piss_distance) |
|||
if(CheckPissDistance(client, GetClientAimTarget(client, piss_on_only_client))) |
|||
{ |
|||
/* if(rposition[0] > cposition[0]-50 && rposition[0] < cposition[0]+50) |
|||
{ |
|||
if(rposition[1] > cposition[1]-50 && rposition[1] < cposition[1]+50) |
|||
{ |
|||
if(rposition[2] > cposition[2]-5 && rposition[2] < cposition[2]+5) |
|||
{ */ |
|||
PissBeam(client); |
|||
|
|||
g_bPiss[client] = true; |
|||
g_PissStart[client] = GetTime(); |
|||
if(piss_disable_move) SetEntityMoveType(client, MOVETYPE_NONE); |
|||
/* DISABLE SOUND |
|||
new String:sound[64]; |
|||
GetConVarString(g_PeeSound, sound, sizeof(sound)); |
|||
EmitAmbientSound(sound, pos); |
|||
*/ |
|||
//CreateTimer(0.8, EmitSoundPee, client, TIMER_REPEAT); |
|||
|
|||
float append = piss_time / piss_check_count; |
|||
|
|||
for(float start = 0.0; start < piss_time; start++){ |
|||
start--; |
|||
start = start + append; |
|||
|
|||
CreateTimer(start, Piss_Effect, client); |
|||
//PrintToServer("Create Timer: %i", start); |
|||
} |
|||
|
|||
if(ent >= 1 && ent <= MaxClients) PrintCenterText(client, "Ты начал ссать на %N...", ent); |
|||
CreateTimer(piss_time, Piss_Out, client); |
|||
//veces[client]++; |
|||
g_bCanPiss[client] = false; |
|||
//Quitararmas(client); |
|||
//break; |
|||
/* } |
|||
} */ |
|||
} |
|||
} else { |
|||
PrintCenterText(client, "Нет цели для окатывания мочёй!\nЗабиндь кнопку через консоль чтоб удобнее ловить цели!\nbind R piss") |
|||
} |
|||
} |
|||
} |
|||
|
|||
return Plugin_Handled; |
|||
} |
|||
|
|||
stock PissBeam(int client, int entity = -1, bool logging = false, bool magnet_piss = false){ |
|||
float pos[3], end[3], ang[3], ppos[3], aang[3]; |
|||
|
|||
GetClientEyePosition(client, pos); |
|||
GetClientEyeAngles(client, ang); |
|||
pos[2] -= 23.0; |
|||
ang[0] = 40.0; |
|||
TR_TraceRayFilter(pos, ang, MASK_PLAYERSOLID, RayType_Infinite, DontHitSelf, client); |
|||
|
|||
if(magnet_piss){ |
|||
float tpos[3]; |
|||
GetEntPropVector(g_PissTarget[client], Prop_Send, "m_vecOrigin", tpos); |
|||
GetClientAbsOrigin(client, ppos); |
|||
if(GetVectorDistance(ppos, tpos) <= piss_distance) end = tpos; |
|||
else TR_GetEndPosition(end); |
|||
} else { |
|||
TR_GetEndPosition(end); |
|||
} |
|||
//if(entity == -1) TR_GetEndPosition(end); |
|||
//else GetEntPropVector(entity, Prop_Send, "m_vecOrigin", end); |
|||
|
|||
TE_SetupBeamRingPoint(end, 5.0, 10.0, BeamSprite, HaloSprite, 0, 15, 0.5, 5.0, 1.0, {255, 255, 0, 255}, 10, 0); |
|||
TE_SendToAll(); |
|||
|
|||
GetClientEyePosition(client, ppos); |
|||
|
|||
//ppos[0]+=10.0; |
|||
ppos[2]-=30.0; |
|||
|
|||
GetClientAbsAngles(client, aang); |
|||
|
|||
if(aang[1] > 0) |
|||
{ |
|||
ppos[0]+=FloatSub(10.0, FloatMul(FloatDiv(10.0, 90.0), aang[1])); |
|||
ppos[1]+=FloatSub(10.0, FloatMul(FloatDiv(10.0, 90.0), FloatAbs(FloatSub(aang[1], 90.0)))); |
|||
} |
|||
else |
|||
{ |
|||
ppos[0]+=FloatSub(10.0, FloatMul(FloatDiv(10.0, 90.0), FloatAbs(aang[1]))); |
|||
ppos[1]-=FloatSub(10.0, FloatMul(FloatDiv(10.0, 90.0), FloatAbs(FloatSub(FloatAbs(aang[1]), 90.0)))); |
|||
} |
|||
|
|||
aang[0]=0.0; |
|||
aang[1]+=180.0; |
|||
aang[2]=0.0; |
|||
|
|||
TE_SetupBeamPoints(end, ppos, BeamSprite, HaloSprite, 0, 30, 0.1, 1.0, 1.0, 0, 10.0, {255, 255, 0, 255}, 10); |
|||
TE_SendToAll(); |
|||
if(logging) PrintCenterText(client, "%f %f %f | %f %f %f\n%f %f %f | %f %f %f", |
|||
pos[0], pos[1], pos[2], end[0], end[1], end[2], |
|||
ppos[0], ppos[1], ppos[2], aang[0], aang[1], aang[2]); |
|||
} |
|||
|
|||
public Action:Piss_Effect(Handle:timer, any:client){ |
|||
if(g_PissTarget[client] >= 1 && g_PissTarget[client] <= MaxClients){ |
|||
if(g_PissTarget[client] == GetClientAimTarget(client, piss_on_only_client)){ |
|||
if(CheckPissDistance(client, g_PissTarget[client])){ |
|||
g_PissCount[client]++; |
|||
PrintCenterText(client, "%N хлебнул твоей урины...", g_PissTarget[client]); |
|||
PrintCenterText(g_PissTarget[client], "Ты хлебнул урины от %N...", client); |
|||
} |
|||
} |
|||
} |
|||
//PrintToServer("%N count: %i", client, g_PissCount[client]); |
|||
} |
|||
|
|||
stock Piss_Out_Handler(int client, bool force = false){ |
|||
if (!force) if(!IsClientInGame(client) || !IsPlayerAlive(client)) return; |
|||
|
|||
g_bPiss[client] = false; |
|||
g_bCanPiss[client] = false; |
|||
|
|||
//PrintToServer("%N %i>=%i", client, g_PissCount[client], piss_check_need_count); |
|||
if(!force && g_PissCount[client] > piss_check_need_count){ |
|||
g_PissCount[client] = 0; |
|||
if(g_PissTarget[client] >= 1 && g_PissTarget[client] <= MaxClients){ |
|||
if(IsClientInGame(g_PissTarget[client]) && IsPlayerAlive(g_PissTarget[client])){ |
|||
TF2_AddCondition(g_PissTarget[client], TFCond_Jarated, 5.0); |
|||
PrintCenterText(g_PissTarget[client], "Тебя обоссал %N", client); |
|||
} |
|||
} |
|||
g_PissTarget[client] = -1; |
|||
} |
|||
|
|||
if(!force) if(piss_disable_move) SetEntityMoveType(client, MOVETYPE_ISOMETRIC); |
|||
CreateTimer(1.0, CanPiss, client); |
|||
} |
|||
|
|||
public Action:Piss_Out(Handle:timer, any:client) |
|||
{ |
|||
Piss_Out_Handler(client); |
|||
return; |
|||
} |
|||
|
|||
public bool:DontHitSelf(entity, mask, any:data) |
|||
{ |
|||
if(entity == data) |
|||
return false; |
|||
return true; |
|||
} |
|||
|
|||
public Action:CanPiss(Handle:timer, any:client) |
|||
{ |
|||
g_bCanPiss[client] = true; |
|||
|
|||
return Plugin_Continue; |
|||
} |
@ -0,0 +1,251 @@ |
|||
#pragma semicolon 1 |
|||
#include <sourcemod> |
|||
#include <sdktools> |
|||
|
|||
#define PLUGIN_VERSION "1.2" |
|||
|
|||
new OffAW = -1; |
|||
new Float:LastCharge[MAXPLAYERS+1]; |
|||
new Float:Multi[MAXPLAYERS+1]; |
|||
new bool:SpeedEnabled[MAXPLAYERS+1]; |
|||
new bool:InAttack[MAXPLAYERS+1]; |
|||
new Handle:g_hcvarSniperScope = INVALID_HANDLE; |
|||
new Handle:g_hcvarHuntsman = INVALID_HANDLE; |
|||
|
|||
|
|||
public Plugin:myinfo = |
|||
{ |
|||
name = "[TF2] Rate of Fire", |
|||
author = "EHG", |
|||
description = "Modify weapon rate of fire", |
|||
version = PLUGIN_VERSION, |
|||
url = "" |
|||
} |
|||
|
|||
|
|||
public OnPluginStart() |
|||
{ |
|||
//LoadTranslations("common.phrases"); |
|||
OffAW = FindSendPropInfo("CBasePlayer", "m_hActiveWeapon"); |
|||
|
|||
CreateConVar("sm_tf2_rof_version", PLUGIN_VERSION, "TF2 Rate of Fire version", FCVAR_PLUGIN|FCVAR_DONTRECORD|FCVAR_REPLICATED|FCVAR_NOTIFY); |
|||
g_hcvarSniperScope = CreateConVar("sm_tf2_rof_scope", "0", "Set if rof should effect sniper scope", 0, true, 0.0, true, 1.0); |
|||
g_hcvarHuntsman = CreateConVar("sm_tf2_rof_huntsman", "1", "Set if rof should effect huntsman", 0, true, 0.0, true, 1.0); |
|||
|
|||
RegAdminCmd("sm_rofl", Command_Rof, 0, "Set Rate of Fire"); |
|||
RegAdminCmd("rof", Command_Rof, 0, "Set Rate of Fire"); |
|||
|
|||
|
|||
for (new i = 0; i <= MaxClients; i++) OnClientPostAdminCheck(i); |
|||
} |
|||
|
|||
|
|||
public OnClientPostAdminCheck(client) |
|||
{ |
|||
Multi[client] = 1.0; |
|||
SpeedEnabled[client] = false; |
|||
InAttack[client] = false; |
|||
LastCharge[client] = 0.0; |
|||
} |
|||
|
|||
|
|||
public Action:Command_Rof(client, args) |
|||
{ |
|||
decl String:arg[65]; |
|||
decl String:arg2[20]; |
|||
new Float:amount; |
|||
new bool:HasTarget = false; |
|||
|
|||
if (CheckCommandAccess(client, "sm_rof_access_target", ADMFLAG_ROOT)) |
|||
{ |
|||
if (args < 2) |
|||
{ |
|||
ReplyToCommand(client, "[SM] Usage: sm_rof <#userid|name> <1.0 - 10.0>"); |
|||
return Plugin_Handled; |
|||
} |
|||
|
|||
GetCmdArg(1, arg, sizeof(arg)); |
|||
GetCmdArg(2, arg2, sizeof(arg2)); |
|||
|
|||
amount = StringToFloat(arg2); |
|||
|
|||
HasTarget = true; |
|||
} |
|||
else if (CheckCommandAccess(client, "sm_rof_access", ADMFLAG_GENERIC)) |
|||
{ |
|||
if(Multi[client] == 1.0) amount = 2.0; |
|||
else amount = 1.0; |
|||
} |
|||
else |
|||
{ |
|||
ReplyToCommand(client, "[SM] You do not have access to this command."); |
|||
return Plugin_Handled; |
|||
} |
|||
|
|||
|
|||
if (amount < 1 || amount > 10) |
|||
{ |
|||
ReplyToCommand(client, "[SM] Invalid Amount"); |
|||
return Plugin_Handled; |
|||
} |
|||
|
|||
|
|||
decl String:target_name[MAX_TARGET_LENGTH]; |
|||
|
|||
if (HasTarget) |
|||
{ |
|||
decl target_list[MAXPLAYERS], target_count, bool:tn_is_ml; |
|||
|
|||
if ((target_count = ProcessTargetString( |
|||
arg, |
|||
client, |
|||
target_list, |
|||
MAXPLAYERS, |
|||
COMMAND_FILTER_CONNECTED, |
|||
target_name, |
|||
sizeof(target_name), |
|||
tn_is_ml)) <= 0) |
|||
{ |
|||
ReplyToTargetError(client, target_count); |
|||
return Plugin_Handled; |
|||
} |
|||
|
|||
|
|||
for (new i = 0; i < target_count; i++) |
|||
{ |
|||
if (amount == 1) |
|||
{ |
|||
SpeedEnabled[target_list[i]] = false; |
|||
Multi[target_list[i]] = amount; |
|||
} |
|||
else |
|||
{ |
|||
SpeedEnabled[target_list[i]] = true; |
|||
Multi[target_list[i]] = amount; |
|||
} |
|||
} |
|||
|
|||
if (amount == 1) |
|||
{ |
|||
ReplyToCommand(client, "[SM] ROF disabled for %s", target_name); |
|||
} |
|||
else |
|||
{ |
|||
ReplyToCommand(client, "[SM] ROF set to: %s for %s", arg2, target_name); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
if (amount == 1) |
|||
{ |
|||
SpeedEnabled[client] = false; |
|||
Multi[client] = amount; |
|||
ReplyToCommand(client, "[SM] ROF disabled"); |
|||
} |
|||
else |
|||
{ |
|||
SpeedEnabled[client] = true; |
|||
Multi[client] = amount; |
|||
ReplyToCommand(client, "[SM] ROF set to: %s", arg); |
|||
} |
|||
} |
|||
|
|||
|
|||
return Plugin_Handled; |
|||
} |
|||
|
|||
public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon) |
|||
{ |
|||
if (SpeedEnabled[client] && Multi[client] != 1.0) |
|||
{ |
|||
if (buttons & IN_ATTACK2) |
|||
{ |
|||
new ent = GetEntDataEnt2(client, OffAW); |
|||
if(ent != -1) |
|||
{ |
|||
new String:weap[50]; |
|||
GetEdictClassname(ent, weap, sizeof(weap)); |
|||
if(strcmp(weap, "tf_weapon_sniperrifle") == 0 && GetConVarInt(g_hcvarSniperScope) == 0) |
|||
{ |
|||
InAttack[client] = false; |
|||
return Plugin_Continue; |
|||
} |
|||
|
|||
if (strcmp(weap, "tf_weapon_particle_cannon") == 0) |
|||
{ |
|||
new Float:charge = GetEntPropFloat(ent, Prop_Send, "m_flChargeBeginTime"); |
|||
new Float:chargemod = charge-4.0; |
|||
if (charge != 0 && LastCharge[client] != chargemod) |
|||
{ |
|||
LastCharge[client] = chargemod; |
|||
SetEntPropFloat(ent, Prop_Send, "m_flChargeBeginTime", chargemod); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
if (buttons & IN_ATTACK || buttons & IN_ATTACK2) |
|||
{ |
|||
new ent = GetEntDataEnt2(client, OffAW); |
|||
if(ent != -1) |
|||
{ |
|||
new String:weap[50]; |
|||
GetEdictClassname(ent, weap, sizeof(weap)); |
|||
if(strcmp(weap, "tf_weapon_compound_bow") == 0 && GetConVarInt(g_hcvarHuntsman) == 0) |
|||
{ |
|||
InAttack[client] = false; |
|||
return Plugin_Continue; |
|||
} |
|||
} |
|||
InAttack[client] = true; |
|||
} |
|||
else |
|||
{ |
|||
InAttack[client] = false; |
|||
} |
|||
} |
|||
return Plugin_Continue; |
|||
} |
|||
|
|||
public OnGameFrame() |
|||
{ |
|||
for(new i=1; i<=MaxClients; i++) |
|||
{ |
|||
if (SpeedEnabled[i] && InAttack[i]) |
|||
{ |
|||
if(IsClientInGame(i) && IsPlayerAlive(i)) |
|||
{ |
|||
ModRateOfFire(i, Multi[i]); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
stock ModRateOfFire(client, Float:Amount) |
|||
{ |
|||
new ent = GetEntDataEnt2(client, OffAW); |
|||
if (ent != -1) |
|||
{ |
|||
new Float:m_flNextPrimaryAttack = GetEntPropFloat(ent, Prop_Send, "m_flNextPrimaryAttack"); |
|||
new Float:m_flNextSecondaryAttack = GetEntPropFloat(ent, Prop_Send, "m_flNextSecondaryAttack"); |
|||
if (Amount > 12) |
|||
{ |
|||
SetEntPropFloat(ent, Prop_Send, "m_flPlaybackRate", 12.0); |
|||
} |
|||
else |
|||
{ |
|||
SetEntPropFloat(ent, Prop_Send, "m_flPlaybackRate", Amount); |
|||
} |
|||
|
|||
new Float:GameTime = GetGameTime(); |
|||
|
|||
new Float:PeTime = (m_flNextPrimaryAttack - GameTime) - ((Amount - 1.0) / 50); |
|||
new Float:SeTime = (m_flNextSecondaryAttack - GameTime) - ((Amount - 1.0) / 50); |
|||
new Float:FinalP = PeTime+GameTime; |
|||
new Float:FinalS = SeTime+GameTime; |
|||
|
|||
|
|||
SetEntPropFloat(ent, Prop_Send, "m_flNextPrimaryAttack", FinalP); |
|||
SetEntPropFloat(ent, Prop_Send, "m_flNextSecondaryAttack", FinalS); |
|||
} |
|||
} |
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue