From c491529d2d6415863d21f0a4be366dd34a169d8c Mon Sep 17 00:00:00 2001 From: Konrad Date: Sat, 18 May 2019 19:37:56 +0200 Subject: [PATCH] Changes: Clean code, fix for nades sucked in body, solid players on jump Clean code - removed unclear ConVar functionality so code its simple to read Added 'Solid Players' when one player want to jump on the other one - like in CSGO Fixed Stuck nades inside another player body in a time when player throw it from the same place - like in CSGO --- scripting/blockcontrol.sp | 517 ++++++++--------------- translations/blockcontrol.phrases.txt | 60 +-- translations/pl/blockcontrol.phrases.txt | 67 +-- 3 files changed, 187 insertions(+), 457 deletions(-) diff --git a/scripting/blockcontrol.sp b/scripting/blockcontrol.sp index b330c46..9b2d360 100644 --- a/scripting/blockcontrol.sp +++ b/scripting/blockcontrol.sp @@ -1,12 +1,11 @@ -#include #include #pragma semicolon 1 #pragma newdecls required #define PLUGIN_NAME "Block Control" -#define PLUGIN_VERSION "v1.1" -#define PLUGIN_DESCRIPTION "Control noblock for players, teams, nades, hostages" +#define PLUGIN_VERSION "v1.2" +#define PLUGIN_DESCRIPTION "Control player colissions with teammates, nades and hostages" enum COLISIONS_GROPUS { @@ -34,41 +33,18 @@ enum COLISIONS_GROPUS const int MAX_STRING_LENGHT = 256; const int MAX_PREDEFINED_PLAYERS = 32 + 1; // 1 is a SourceTV -bool PLUGIN_ENABLED = true; -bool CROUCH_BLOCK_ENABLED = true; -bool NOBLOCK_HOSTAGE_ENABLED = true; -bool NOBLOCK_NADE_ENABLED = true; -bool PLUGIN_ADVERTS_ENABLED = true; - -bool TIMER_CREATED[MAX_PREDEFINED_PLAYERS]; -bool PLAYER_IN_DUCK[MAX_PREDEFINED_PLAYERS]; -bool IS_PLAYER_SOLID[MAX_PREDEFINED_PLAYERS]; -bool PLUGIN_WELCOME_MESSAGE[MAX_PREDEFINED_PLAYERS]; +bool IS_KNIFE_FIGHT = false; int OFFSET_COLLISION_GROUP = -1; -int NOBLOCK_TYPE = 2; - -char TRANSLATION_DESCRIPTION[MAX_STRING_LENGHT]; -char TRANSLATION_PLUGIN_ENABLED[MAX_STRING_LENGHT]; -char TRANSLATION_CROUCH[MAX_STRING_LENGHT]; -char TRANSLATION_BLOCK_TIME[MAX_STRING_LENGHT]; -char TRANSLATION_HOSTAGES[MAX_STRING_LENGHT]; -char TRANSLATION_TYPES[MAX_STRING_LENGHT]; -char TRANSLATION_NADES[MAX_STRING_LENGHT]; -char TRANSLATION_ADVERTS[MAX_STRING_LENGHT]; - -float BLOCK_TIME = 3.0; +static char TRANSLATION_DESCRIPTION[MAX_STRING_LENGHT]; +static char TRANSLATION_ENABLE[MAX_STRING_LENGHT]; +static char TRANSLATION_HOSTAGES[MAX_STRING_LENGHT]; +static char TRANSLATION_DEBUG[MAX_STRING_LENGHT]; -Handle sm_blockcontrol_enable = INVALID_HANDLE; -Handle sm_blockcontrol_noblock_crouch = INVALID_HANDLE; -Handle sm_blockcontrol_crouch_block_time = INVALID_HANDLE; -Handle sm_blockcontrol_noblock_hostages = INVALID_HANDLE; -Handle sm_blockcontrol_noblock_type = INVALID_HANDLE; -Handle sm_blockcontrol_noblock_nades = INVALID_HANDLE; -Handle sm_blockcontrol_adverts = INVALID_HANDLE; - -Handle sv_turbophysics = INVALID_HANDLE; +ConVar sm_blockcontrol = null; +ConVar sm_blockcontrol_debug = null; +ConVar sm_blockcontrol_noblock_hostages = null; public Plugin myinfo = { name = PLUGIN_NAME, @@ -84,74 +60,31 @@ public void SetTranslation() Format(TRANSLATION_DESCRIPTION, MAX_STRING_LENGHT, "%T", "sm_blockcontrol_description", LANG_SERVER); - Format(TRANSLATION_PLUGIN_ENABLED, MAX_STRING_LENGHT, "%T", "sm_blockcontrol_enable", LANG_SERVER); - - Format(TRANSLATION_TYPES, MAX_STRING_LENGHT, "%T", "sm_blockcontrol_noblock_type", LANG_SERVER); + Format(TRANSLATION_ENABLE, MAX_STRING_LENGHT, "%T", "sm_blockcontrol", LANG_SERVER); - Format(TRANSLATION_CROUCH, MAX_STRING_LENGHT, "%T", "sm_blockcontrol_noblock_crouch", LANG_SERVER); + Format(TRANSLATION_DEBUG, MAX_STRING_LENGHT, "%T", "sm_blockcontrol_debug", LANG_SERVER); - Format(TRANSLATION_BLOCK_TIME, MAX_STRING_LENGHT, "%T", "sm_blockcontrol_crouch_block_time", LANG_SERVER); - Format(TRANSLATION_HOSTAGES, MAX_STRING_LENGHT, "%T", "sm_blockcontrol_noblock_hostages", LANG_SERVER); - - Format(TRANSLATION_NADES, MAX_STRING_LENGHT, "%T", "sm_blockcontrol_noblock_nades", LANG_SERVER); - - Format(TRANSLATION_ADVERTS, MAX_STRING_LENGHT, "%T", "sm_blockcontrol_adverts", LANG_SERVER); } public void SetValues() { SetOffsetCollisionGroup(); - - SetTurboPhysics(); } public void SetConVars() { CreateConVar("sm_blockcontrol_version", PLUGIN_VERSION, TRANSLATION_DESCRIPTION); - sm_blockcontrol_enable = CreateConVar("sm_blockcontrol_enable", "1", TRANSLATION_PLUGIN_ENABLED); - - sm_blockcontrol_noblock_type = CreateConVar("sm_blockcontrol_noblock_type", "2", TRANSLATION_TYPES); + sm_blockcontrol = CreateConVar("sm_blockcontrol", "1", TRANSLATION_ENABLE); - sm_blockcontrol_noblock_crouch = CreateConVar("sm_blockcontrol_noblock_crouch", "1", TRANSLATION_CROUCH); - - sm_blockcontrol_crouch_block_time = CreateConVar("sm_blockcontrol_crouch_block_time", "3.0", TRANSLATION_BLOCK_TIME); + sm_blockcontrol_debug = CreateConVar("sm_blockcontrol_debug", "0", TRANSLATION_DEBUG); sm_blockcontrol_noblock_hostages = CreateConVar("sm_blockcontrol_noblock_hostages", "1", TRANSLATION_HOSTAGES); - sm_blockcontrol_noblock_nades = CreateConVar("sm_blockcontrol_noblock_nades", "1", TRANSLATION_NADES); - - sm_blockcontrol_adverts = CreateConVar("sm_blockcontrol_adverts", "1", TRANSLATION_ADVERTS); - AutoExecConfig(true, "blockcontrol"); } -public void SetHooks() -{ - /// Plugin ConVars hooks - HookConVarChange(sm_blockcontrol_enable, OnConVarEnableChange); - - HookConVarChange(sm_blockcontrol_noblock_type, OnConVarNoblockTypeChange); - - HookConVarChange(sm_blockcontrol_noblock_crouch, OnConVarNoblockCrouchChange); - - HookConVarChange(sm_blockcontrol_crouch_block_time, OnConVarBlockTimeChange); - - HookConVarChange(sm_blockcontrol_noblock_hostages, OnConVarHostagesChange); - - HookConVarChange(sm_blockcontrol_noblock_nades, OnConVarNoblockNadesChange); - - HookConVarChange(sm_blockcontrol_adverts, OnConVarAdvertsChange); - - /// Game ConVars hooks - if(sv_turbophysics != INVALID_HANDLE) - HookConVarChange(sv_turbophysics, OnConVarTurboPhysicsChange); - - /// Game Events hooks - HookEvent("player_spawn", OnPlayerSpawn); -} - public void SetOffsetCollisionGroup() { OFFSET_COLLISION_GROUP = FindSendPropInfo("CBaseEntity", "m_CollisionGroup"); @@ -165,23 +98,8 @@ public void SetOffsetCollisionGroup() } } -public void SetTurboPhysics() -{ - if(CommandExists("sv_turbophysics")) - { - sv_turbophysics = FindConVar("sv_turbophysics"); - - if(sv_turbophysics != INVALID_HANDLE) - SetConVarInt(sv_turbophysics, 1); - else - { - char error[MAX_STRING_LENGHT]; - Format(error, MAX_STRING_LENGHT, "[%s] ERROR: %T", PLUGIN_NAME, "sv_turbophysics_error", LANG_SERVER); - - SetFailState(error); - } - } -} +//////////////////// +/// Plugin events public void OnPluginStart() { @@ -190,285 +108,179 @@ public void OnPluginStart() SetValues(); SetConVars(); - - SetHooks(); -} - -/* - * ConVar Events - */ - -public void OnConVarEnableChange(ConVar convar, const char[] oldValue, const char[] newValue) -{ - if(GetConVarInt(sm_blockcontrol_enable) > 0) - PLUGIN_ENABLED = true; - else - PLUGIN_ENABLED = false; } -public void OnConVarNoblockTypeChange(ConVar convar, const char[] oldValue, const char[] newValue) -{ - switch(GetConVarInt(sm_blockcontrol_noblock_type)) - { - case 0: - NOBLOCK_TYPE = 0; - - case 1: - NOBLOCK_TYPE = 1; - - case 2: - NOBLOCK_TYPE = 2; +/////////////////////////// +/// Other plugins events - default: - NOBLOCK_TYPE = 2; - } -} - -public void OnConVarNoblockCrouchChange(ConVar convar, const char[] oldValue, const char[] newValue) +public void OnPreKnifeFight(int client, int secod) { - if(GetConVarInt(sm_blockcontrol_noblock_crouch) > 0) - CROUCH_BLOCK_ENABLED = true; - else - CROUCH_BLOCK_ENABLED = false; + IS_KNIFE_FIGHT = true; } -public void OnConVarBlockTimeChange(ConVar convar, const char[] oldValue, const char[] newValue) +public void OnStartKnifeFight() { - float block_time = GetConVarFloat(sm_blockcontrol_crouch_block_time); - - if(block_time > 0.1) - BLOCK_TIME = block_time; - else - BLOCK_TIME = 0.1; + IS_KNIFE_FIGHT = false; } -public void OnConVarHostagesChange(ConVar convar, const char[] oldValue, const char[] newValue) +public void OnPostKnifeFight(int client, int secod) { - if(GetConVarInt(sm_blockcontrol_noblock_hostages) > 0) - NOBLOCK_HOSTAGE_ENABLED = true; - else - NOBLOCK_HOSTAGE_ENABLED = false; + IS_KNIFE_FIGHT = false; } -public void OnConVarNoblockNadesChange(ConVar convar, const char[] oldValue, const char[] newValue) -{ - if(GetConVarInt(sm_blockcontrol_noblock_nades) > 0) - NOBLOCK_NADE_ENABLED = true; - else - NOBLOCK_NADE_ENABLED = false; -} +////////////////// +/// Game events -public void OnConVarAdvertsChange(ConVar convar, const char[] oldValue, const char[] newValue) +public void OnEntityCreated(int entity, const char[] classname) { - if(GetConVarInt(sm_blockcontrol_adverts) > 0) - PLUGIN_ADVERTS_ENABLED = true; - else - PLUGIN_ADVERTS_ENABLED = false; + if(sm_blockcontrol.BoolValue && sm_blockcontrol_noblock_hostages.BoolValue && IsHostage(entity)) + CreateTimer(0.1, NonSolidHostages, entity); } -public void OnConVarTurboPhysicsChange(ConVar convar, const char[] oldValue, const char[] newValue) +public Action CH_PassFilter(int ent1, int ent2, bool &result) { - int value = StringToInt(newValue); + if(!sm_blockcontrol.BoolValue || !IsValidEntity(ent1) || !IsValidEntity(ent2)) + return Plugin_Continue; - if(value < 1) + /// Noblock - check teammates + if(IsAlivePlayer(ent1, false) && IsAlivePlayer(ent2, false)) { - SetConVarInt(sv_turbophysics, 1); + if(IS_KNIFE_FIGHT) + { + DisableCollisionsWithPlayer(ent1); + DisableCollisionsWithPlayer(ent2); - char warn[MAX_STRING_LENGHT]; - Format(warn, MAX_STRING_LENGHT, "[%s] WARN: %T", PLUGIN_NAME, "sv_turbophysics_warn", LANG_SERVER); + if(sm_blockcontrol_debug.BoolValue) + PrintToServer("Collision between %N and %N disabled on Knife Fight", ent1, ent2); - PrintToServer(warn); - } -} + return Plugin_Continue; + } -/* - * Game Events - */ -public void OnClientConnected(int client) -{ - PLUGIN_WELCOME_MESSAGE[client] = false; -} + if(IsSamePlayer(ent1, ent2) || !IsTeamMate(ent1, ent2) || IsPlayerAboveAnotherOne(ent1, ent2) || IsPlayerAboveAnotherOne(ent2, ent1)) + { + EnableCollisionsWithPlayer(ent1); + EnableCollisionsWithPlayer(ent2); -public void OnPlayerSpawn(Event event, const char[] name, bool dontBroadcast) -{ - int userid = GetEventInt(event, "userid"); - int client = GetClientOfUserId(userid); - - if(IsClientRedy(client)) - { - if(!PLUGIN_WELCOME_MESSAGE[client] && !IsFakeClient(client)) - if(PLUGIN_ADVERTS_ENABLED) - CreateTimer(0.1, Welcome, client); + if(sm_blockcontrol_debug.BoolValue) + PrintToServer("Collision between %N and %N enabled", ent1, ent2); + } + else + { + DisableCollisionsWithPlayer(ent1); + DisableCollisionsWithPlayer(ent2); - TIMER_CREATED[client] = false; - PLAYER_IN_DUCK[client] = false; - IS_PLAYER_SOLID[client] = false; - } -} + if(sm_blockcontrol_debug.BoolValue) + PrintToServer("Collision between %N and %N disabled", ent1, ent2); + } -public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon, int &subtype, int &cmdnum, int &tickcount, int &seed, int mouse[2]) -{ - if(!PLUGIN_ENABLED || NOBLOCK_TYPE != 2 || !CROUCH_BLOCK_ENABLED || !IsClientValid(client)) return Plugin_Continue; - - if(buttons == IN_DUCK) - PLAYER_IN_DUCK[client] = true; - else - PLAYER_IN_DUCK[client] = false; - - if(!TIMER_CREATED[client] && PLAYER_IN_DUCK[client]) - { - CreateTimer(BLOCK_TIME, NonsolidPlayer, client, TIMER_REPEAT); - - TIMER_CREATED[client] = true; - IS_PLAYER_SOLID[client] = true; - - if(PLUGIN_ADVERTS_ENABLED && !IsFakeClient(client)) - PrintToChat(client, "\x04[Block Control]\x01 %T", "sm_blockcontrol_noblock_off", client, '\x04'); } - return Plugin_Continue; -} - -public void OnEntityCreated(int entity, const char[] classname) -{ - if(PLUGIN_ENABLED) + /// Noblock - check nade and player + if(IsNade(ent1) && IsAlivePlayer(ent2, false)) { - /// Set no block for all hostages - if(NOBLOCK_HOSTAGE_ENABLED && IsHostage(entity)) - CreateTimer(0.1, NonsolidHostages, entity); - - if(NOBLOCK_TYPE == 1) + int nade_owner = GetThrowedNadeOwner(ent1); + if(!IsValidPlayer(nade_owner, false) || IsSamePlayer(nade_owner, ent2)) { - if(IsClientValid(entity)) - CreateTimer(0.1, NonsolidPlayer, entity); + result = true; - if(NOBLOCK_NADE_ENABLED && IsNade(entity)) - CreateTimer(0.1, NonsolidNades, entity); + return Plugin_Continue; } - } -} -public Action CH_PassFilter(int ent1, int ent2, bool &result) -{ - if(PLUGIN_ENABLED && NOBLOCK_TYPE == 2 && IsValidEntity(ent1) && IsValidEntity(ent2)) - { - /// Noblock check teammates - if(IsClientValid(ent1) && IsClientValid(ent2)) + if(IsTeamMate(nade_owner, ent2) && IsPlayersInSamePlace(nade_owner, ent2)) { - if(!IsSameTeam(ent1, ent2) || CROUCH_BLOCK_ENABLED && (IS_PLAYER_SOLID[ent1] || IS_PLAYER_SOLID[ent2])) - { - SetEntData(ent1, OFFSET_COLLISION_GROUP, COLLISION_GROUP_PLAYER, 4, true); - SetEntData(ent2, OFFSET_COLLISION_GROUP, COLLISION_GROUP_PLAYER, 4, true); - } - else - { - SetEntData(ent1, OFFSET_COLLISION_GROUP, COLLISION_GROUP_INTERACTIVE_DEBRIS, 4, true); - SetEntData(ent2, OFFSET_COLLISION_GROUP, COLLISION_GROUP_INTERACTIVE_DEBRIS, 4, true); - } + result = false; + + return Plugin_Handled; } + } - if(NOBLOCK_NADE_ENABLED) + /// Noblock - check player and nade + if(IsNade(ent2) && IsAlivePlayer(ent1, false)) + { + int nade_owner = GetThrowedNadeOwner(ent2); + if(!IsValidPlayer(nade_owner, false) || IsSamePlayer(nade_owner, ent1)) { - /// Noblock check nade and player - if(IsNade(ent1) && IsClientValid(ent2)) - { - int nade_owner = GetOwnerOfEntity(ent1); - - if(!IsClientValid(nade_owner)) - return Plugin_Continue; + result = true; - if(!IsSameTeam(nade_owner, ent2)) - result = true; + return Plugin_Continue; + } - return Plugin_Handled; - } - - /// Noblock check player and nade - if(IsNade(ent2) && IsClientValid(ent1)) - { - int nade_owner = GetOwnerOfEntity(ent2); - - if(!IsClientValid(nade_owner)) - return Plugin_Continue; + if(IsTeamMate(nade_owner, ent1) && IsPlayersInSamePlace(nade_owner, ent1)) + { + result = false; - if(!IsSameTeam(nade_owner, ent1)) - result = true; - - return Plugin_Handled; - } + return Plugin_Handled; } } return Plugin_Continue; } -/* - * Usefull functions - */ +///////////// +/// Timers -public Action NonsolidHostages(Handle timer, any data) +public Action NonSolidHostages(Handle timer, any data) { - if(NOBLOCK_HOSTAGE_ENABLED && IsValidEntity(data)) + if(sm_blockcontrol_noblock_hostages.IntValue && IsValidEntity(data)) SetEntData(data, OFFSET_COLLISION_GROUP, COLLISION_GROUP_DEBRIS_TRIGGER, 4, true); return Plugin_Continue; } -public Action NonsolidNades(Handle timer, any data) +//////////////////////// +/// Usefull functions + +stock void EnableCollisionsWithPlayer(int player) { - if(NOBLOCK_NADE_ENABLED && IsValidEntity(data)) - SetEntData(data, OFFSET_COLLISION_GROUP, COLLISION_GROUP_INTERACTIVE_DEBRIS, 4, true); + if(IsValidPlayer(player, false)) + SetEntData(player, OFFSET_COLLISION_GROUP, COLLISION_GROUP_PLAYER, 4, true); +} - return Plugin_Continue; +stock void DisableCollisionsWithPlayer(int player) +{ + if(IsValidPlayer(player, false)) + SetEntData(player, OFFSET_COLLISION_GROUP, COLLISION_GROUP_INTERACTIVE_DEBRIS, 4, true); } -public Action NonsolidPlayer(Handle timer, any data) +stock bool IsPlayersInSamePlace(int player, int other) { - if(!PLUGIN_ENABLED || !IsClientValid(data)) - return Plugin_Stop; + float player_pos[3]; + GetClientAbsOrigin(player, player_pos); - if(NOBLOCK_TYPE == 1) - { - SetEntData(data, OFFSET_COLLISION_GROUP, COLLISION_GROUP_DEBRIS_TRIGGER, 4, true); + float other_pos[3]; + GetClientAbsOrigin(other, other_pos); - return Plugin_Stop; - } + player_pos[2] = 0.0; + other_pos[2] = 0.0; - if(NOBLOCK_TYPE == 2 && CROUCH_BLOCK_ENABLED && !PLAYER_IN_DUCK[data]) - { - TIMER_CREATED[data] = false; - IS_PLAYER_SOLID[data] = false; - - if(PLUGIN_ADVERTS_ENABLED && !IsFakeClient(data)) - PrintToChat(data, "\x04[Block Control]\x01 %T", "sm_blockcontrol_noblock_on", data, '\x04'); + float distance = GetVectorDistance(player_pos, other_pos, false); - return Plugin_Stop; - } + if(sm_blockcontrol_debug.BoolValue) + PrintToServer("Distance between %N and %N is: %f", player, other, distance); - return Plugin_Continue; + return distance < 33.0; } -public Action Welcome(Handle timer, any data) +public bool IsPlayerAboveAnotherOne(int player, int other) { - if(!PLUGIN_ENABLED || !IsClientRedy(data)) - return Plugin_Stop; + float player_pos[3]; + GetClientAbsOrigin(player, player_pos); - if(PLUGIN_ADVERTS_ENABLED) - PrintToChat(data, "\x04[Block Control]\x01 %T", "sm_blockcontrol_welcome_message", data); + float other_pos[3]; + GetClientAbsOrigin(other, other_pos); - PLUGIN_WELCOME_MESSAGE[data] = true; + float y_diff = FloatAbs(player_pos[2] - other_pos[2]); - return Plugin_Continue; + if(sm_blockcontrol_debug.BoolValue) + PrintToServer("Player %N is on player %N with diff: [%f, %f]", player, other, player_pos[2], other_pos[2]); + + if(IsPlayerCrouched(player) || IsPlayerCrouched(other)) + return (y_diff > 45.031250); + else + return (y_diff >= 62.086700); } -/** - * Check player and other player are in the same team - * - * @param client An client entity index. - * @param player An other player entity index. - * @return Returns true if is a same team, false otherwise. - */ stock bool IsSameTeam(int client, int player) { int player_team = GetClientTeam(client); @@ -481,65 +293,80 @@ stock bool IsSameTeam(int client, int player) return false; } -/** - * Checks client is valid player. - * - * @param client An client entity index. - * @return Returns true if client is valid player, false otherwise. - */ -stock bool IsClientValid(int client) +stock bool IsClient(int client) { - if(IsClientRedy(client) && IsPlayerAlive(client)) - return true; - - return false; + return (client > 0 && client < MaxClients + 1); } -stock bool IsClientRedy(int client) +stock bool IsValidClient(int client) { - if(IsClient(client) && IsClientInGame(client)) - return true; - - return false; + return (IsClient(client) && IsClientConnected(client) && IsClientInGame(client)); } -stock bool IsClient(int client) +stock bool IsValidPlayer(int client, bool only_human) { - if(client > 0 && client < MaxClients) - return true; - - return false; + if(only_human) + return (IsValidClient(client) && !IsClientSourceTV(client) && !IsFakeClient(client)); + + return (IsValidClient(client) && !IsClientSourceTV(client)); } -stock bool IsNade(int entity) +stock bool IsAlivePlayer(int client, bool only_human) { - if(IsValidEntity(entity)) - { - char classname[128]; - GetEntityClassname(entity, classname, 128); + return (IsValidPlayer(client, only_human) && IsPlayerAlive(client)); +} - if(StrEqual(classname, "smokegrenade_projectile") || StrEqual(classname, "flashbang_projectile") || StrEqual(classname, "hegrenade_projectile")) - return true; - } +stock bool IsDeadPlayer(int client, bool only_human = false) +{ + return (IsValidPlayer(client, only_human) && !IsPlayerAlive(client)); +} - return false; +stock bool IsBot(int client) +{ + return (IsValidPlayer(client, false) && IsFakeClient(client)); +} + +stock bool IsSamePlayer(int client, int other) +{ + return (client == other); +} + +stock bool IsTeamMate(int client, int second) +{ + return (IsValidPlayer(second, false) && GetClientTeam(client) == GetClientTeam(second)); +} + +stock bool IsPlayerCrouched(int player) +{ + return GetEntProp(player, Prop_Send, "m_bDucked", 1) > 0; +} + +stock bool IsNade(int entity) +{ + if(!IsValidEntity(entity)) + return false; + + char classname[32]; + GetEntityClassname(entity, classname, 32); + + return (StrEqual(classname, "smokegrenade_projectile") || StrEqual(classname, "flashbang_projectile") || StrEqual(classname, "hegrenade_projectile")); } stock bool IsHostage(int entity) { - if(IsValidEntity(entity)) - { - char classname[128]; - GetEntityClassname(entity, classname, 128); + if(!IsValidEntity(entity)) + return false; - if(StrEqual(classname, "hostage_entity")) - return true; - } + char classname[32]; + GetEntityClassname(entity, classname, 32); - return false; + return (StrEqual(classname, "hostage_entity")); } -stock int GetOwnerOfEntity(int entity) +stock int GetThrowedNadeOwner(int entity) { + if(!IsValidEntity(entity)) + return 0; + return GetEntPropEnt(entity, Prop_Send, "m_hThrower"); } diff --git a/translations/blockcontrol.phrases.txt b/translations/blockcontrol.phrases.txt index 0d22484..a097718 100644 --- a/translations/blockcontrol.phrases.txt +++ b/translations/blockcontrol.phrases.txt @@ -6,72 +6,24 @@ "en" "Can't find Collision Group offset" } - "sv_turbophysics_error" - { - "en" "Can't find sv_turbophysics convar, plugin disabled" - } - - "sv_turbophysics_warn" - { - "en" "Can't disable Turbophysics is forced by 'Block Control' plugin" - } - /// ConVar's "sm_blockcontrol_description" { - "en" "Control noblock for players, teams, nades, hostages" - } - - "sm_blockcontrol_enable" - { - "en" "Enable or disabel 'block control' features: '0' - disabled, '1' - enabled" + "en" "Control player colissions with teammates, nades and hostages" } - "sm_blockcontrol_noblock_type" + "sm_blockcontrol" { - "en" "Type of used noblock [change can affect to other features]: '0' - disable players noblock (solid players/teams) [need new round to set], '1' - noblock for all players [instant], '2' - team noblock (only teammates noblock) [instant]" + "en" "Enable or disable plugin: '0' - disabled, '1' - enabled" } - "sm_blockcontrol_noblock_crouch" + "sm_blockcontrol_debug" { - "en" "Noblock 'OFF' by player crouch [works only when sm_blockcontrol_noblock_type = '2']: '0' - disabled, '1' - enabled" - } - - "sm_blockcontrol_crouch_block_time" - { - "en" "Added time in seconds on player change state from crouch, after expires noblock 'ON' [works only when sm_blockcontrol_noblock_crouch = '1']" + "en" "Enable or disable debugging mode: '0' - disabled, '1' - enabled" } "sm_blockcontrol_noblock_hostages" { - "en" "Noblock on hostages: '0' - disabled, '1' - enabled" - } - - "sm_blockcontrol_noblock_nades" - { - "en" "Noblock on nades not colide with team [works only when sm_blockcontrol_noblock_type = '1' or '2']: '0' - disabled, '1' - enabled" - } - - "sm_blockcontrol_adverts" - { - "en" "Adverts printed in player chat: '0' - disabled, '1' - enabled" - } - - /// In game chat - "sm_blockcontrol_welcome_message" - { - "en" "Noblock on server with: player nb, team nb, nade nb, hostage nb" - } - - "sm_blockcontrol_noblock_on" - { - "#format" "{1:c}" - "en" "Noblock: {1}ON" - } - - "sm_blockcontrol_noblock_off" - { - "#format" "{1:c}" - "en" "Noblock: on crouch is {1}OFF" + "en" "Enable or disable players collisions with hostages: '0' - disabled, '1' - enabled" } } \ No newline at end of file diff --git a/translations/pl/blockcontrol.phrases.txt b/translations/pl/blockcontrol.phrases.txt index 6e997f4..54322fc 100644 --- a/translations/pl/blockcontrol.phrases.txt +++ b/translations/pl/blockcontrol.phrases.txt @@ -1,77 +1,28 @@ -"Phrases" +"Phrases" { - /// W trakcie wystąpienia błędu "collision_group_error" { - "pl" "Nie udało się odnaleźć Collision Group Offset" - } - - "sv_turbophysics_error" - { - "pl" "Nie udało się odnaleźć komendy sv_turbophysics" - } - - "sv_turbophysics_warn" - { - "pl" "Nie można wyłączyć turbofizyki jest wymagana przez plugin 'Block Control'" + "pl" "Nie udalo sie odnalezc Collision Group Offset" } /// ConVar's "sm_blockcontrol_description" { - "pl" "Kontroluje blokowanie się: graczy, drużyn, zakładników, granatów" - } - - "sm_blockcontrol_enable" - { - "pl" "Włącza lub wyłącza funkcjonalność pluginu 'kontrola blokowania': '0' - wyłącza, '1' - włącza" + "pl" "Kontroluje kolizje gracza z: graczami z aktualnej druzyny, zakladnikow, granatow." } - "sm_blockcontrol_noblock_type" + "sm_blockcontrol" { - "pl" "Typ kontroli blokady [wpływa na inne funkcje]: '0' - wyłącza blokowanie się graczy [nowa runda], '1' - włącza brak blokady na wszystkich graczach [natychmiast], '2' - brak blokowania graczy z tej samej drużyny [natychmiast]" + "pl" "Wlacza lub wylacza plugin: '0' - wylacza, '1' - wlacza" } - "sm_blockcontrol_noblock_crouch" + "sm_blockcontrol_debug" { - "pl" "Wyłącza blokowanie przez kucnięcie [działa tylko gdy sm_blockcontrol_noblock_type = '2']: '0' - funkcja wyłączona, '1' - funkcja wyłączona" - } - - "sm_blockcontrol_crouch_block_time" - { - "pl" "Czas dodatkowy od momentu zmiany pozycji gracza po kucnięciu, po wygaśnięciu bkolada zostaje wyłączona [działa tylko gdy sm_blockcontrol_noblock_crouch = '1']: Min: 0.1 [natychmist], Max: 0.1+" + "pl" "Wlacza lub wylacza tryb debugowania: '0' - wylacza, '1' - wlacza" } "sm_blockcontrol_noblock_hostages" { - "pl" "Bkokada działająca na zakładników: '0' - funkcjonalność wyłączona, '1' - funkcjonalność włączona" - } - - "sm_blockcontrol_noblock_nades" - { - "pl" "Brak blokady granatów w trakcie kolizji z graczem [działa tylko gdy sm_blockcontrol_noblock_type = '1' (przelatuje przez wszystkich) lub '2' (przelatuje tylko przez graczy z drużyny)]: '0' - funkcjonalność wyłączona, '1' - funkcjonalność włączona" - } - - "sm_blockcontrol_adverts" - { - "pl" "Informacja wyświetla na na czacie gracza: '0' - funkcjonalność wyłączona, '1' - funkcjonalność włączona" - } - - /// Na czacie w grze - "sm_blockcontrol_welcome_message" - { - "pl" "Na serwerze znajduje się kontrola blokowania postaci, drużyn, zakładników oraz granatów" - } - - "sm_blockcontrol_noblock_on" - { - "#format" "{1:c}" - "pl" "Kontrola blokowania: {1}Wyłączona" - } - - "sm_blockcontrol_noblock_off" - { - "#format" "{1:c}" - "pl" "Kontrola blokowania podczas kucania: {1}Włączona" + "pl" "Wlacza lub wylacza kolizje graczy z zakladnikami: '0' - wylacza, '1' - wlacza" } -} \ No newline at end of file +}