Покупка гранат только админам

Юра Шмигель

Участник
Сообщения
32
Реакции
8
Пытаюсь написать плагин для запрета покупки гранат рядовым пользователям...
Помогите советом как это реализовать

PHP:
#include <sourcemod> 

public Action:CS_OnBuyCommand(client, const String:weapon[]) 
{
	if(strcmp(weapon, "molotov") == 0 || !(GetUserFlagBits(client) & ADMFLAG_GENERIC)) 
	{ 
		PrintToChat(client, "Покупка Коктеля Молотова доступна только админам!"); 
		return Plugin_Handled; 
	} 
	else if(strcmp(weapon, "incgrenade") == 0 || !(GetUserFlagBits(client) & ADMFLAG_GENERIC)) 
	{ 
		PrintToChat(client, "Покупка Зажигательной гранаты доступна только админам!"); 
		return Plugin_Handled; 
	}
	return Plugin_Continue;
}

При таком коде пропадает у обычных игров возможность покупки вообще любого оружия
 

Черная вдова

Участник
Сообщения
2,795
Реакции
670
C-подобный:
StrContains(weapon, "molotov") != -1 && !has_admflag[client]


public OnClientPostAdminCheck(client)
{
 has_admflag[client] = false;
 if(GetUserFlagBits(client) & ADMFLAG_GENERIC || GetUserFlagBits(client) & ADMFLAG_ROOT)
 {
 has_admflag[client] = true;
 }
}
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #4
а почему бы не
PHP:
GetUserAdmin(client) == INVALID_ADMIN_ID
 

Юра Шмигель

Участник
Сообщения
32
Реакции
8
а почему бы не
PHP:
GetUserAdmin(client) == INVALID_ADMIN_ID

Рико мне твой вариант больше нравится :yes: сейчас попробую

Добавлено через 8 минут
Да фигня какая то... на локальном сервере все хорошо отрабатывает плагин а на сетевом сервере у всех блочится закуп оружия кроме админа! Есть идеи? на том и на том сервере плины все идентичные
 
Последнее редактирование:

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
Рико мне твой вариант больше нравится :yes: сейчас попробую

Добавлено через 8 минут
Да фигня какая то... на локальном сервере все хорошо отрабатывает плагин а на сетевом сервере у всех блочится закуп оружия кроме админа! Есть идеи? на том и на том сервере плины все идентичные

Попробуй.

PHP:
#pragma semicolon 1

#include <sdkhooks>

// Список блокируемого оружия.
new const String:block_weapons_list[][] =
{
    "incgrenade", "molotov"
};

#define Weapon_Count sizeof(block_weapons_list)

public OnClientPostAdminCheck(client){SDKHook(client, SDKHook_WeaponEquip, WeaponEquip);}
public OnClientDisconnect(client){SDKUnhook(client, SDKHook_WeaponEquip, WeaponEquip);}

// Запрещает использовать и поднимать запрещенное оружие.
public Action:WeaponEquip(client, weapon) 
{ 
        decl String:blockWeapon[21]; 
        GetEntityClassname(weapon, blockWeapon, sizeof(blockWeapon));

        for(new i = 0; i < Weapon_Count; ++i) 
        { 
            if(strcmp(blockWeapon[7], block_weapons_list[i]) == 0 && !(GetUserFlagBits(client) & ADMFLAG_GENERIC))
            {   
                return Plugin_Handled; 
            } 
        } 
	return Plugin_Continue; 
} 

// Запрещает покупать заблокированное оружие.
public Action:CS_OnBuyCommand(client, const String:weapon[])  
{ 
	for(new i = 0; i < Weapon_Count; ++i)
	{ 
		if(strcmp(weapon, block_weapons_list[i]) == 0 && !(GetUserFlagBits(client) & ADMFLAG_GENERIC))
		{ 
			PrintToChat(client, "Разрешено только администратору"); // Сообщение клиенту.  
			return Plugin_Handled; 
		} 
	} 
   	return Plugin_Continue; 
}
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #7
Hejter, если он админ мы зря получаем имя оружия и сравниваем. Не админов можно отсеять сразу. Да и зачем 2 раза проверять

PHP:
public Action:WeaponEquip(client, weapon)  
{
	if(GetUserAdmin(client) == INVALID_ADMIN_ID)
	{
		decl String:blockWeapon[32], i;  
		GetEntityClassname(weapon, blockWeapon, sizeof(blockWeapon)); 

		for(i = 0; i < Weapon_Count; ++i)  
		{  
			if(strcmp(blockWeapon[7], block_weapons_list[i]) == 0 ) 
			{    
				return Plugin_Handled;  
			}  
		}
	}
	return Plugin_Continue;  
}  

// Запрещает покупать заблокированное оружие. 
public Action:CS_OnBuyCommand(client, const String:weapon[])   
{  
	if(GetUserAdmin(client) == INVALID_ADMIN_ID)
	{
		for(new i = 0; i < Weapon_Count; ++i) 
		{  
			if(strcmp(weapon, block_weapons_list[i]) == 0) 
			{  
				PrintToChat(client, "Разрешено только администратору"); // Сообщение клиенту.   
				return Plugin_Handled;  
			}  
		}
	}
	return Plugin_Continue;  
}
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
Hejter, если он админ мы зря получаем имя оружия и сравниваем. Не админов можно отсеять сразу. Да и зачем 2 раза проверять

PHP:
public Action:WeaponEquip(client, weapon)  
{
	if(GetUserAdmin(client) == INVALID_ADMIN_ID)
	{
		decl String:blockWeapon[32], i;  
		GetEntityClassname(weapon, blockWeapon, sizeof(blockWeapon)); 

		for(i = 0; i < Weapon_Count; ++i)  
		{  
			if(strcmp(blockWeapon[7], block_weapons_list[i]) == 0 ) 
			{    
				return Plugin_Handled;  
			}  
		}
	}
	return Plugin_Continue;  
}  

// Запрещает покупать заблокированное оружие. 
public Action:CS_OnBuyCommand(client, const String:weapon[])   
{  
	if(GetUserAdmin(client) == INVALID_ADMIN_ID)
	{
		for(new i = 0; i < Weapon_Count; ++i) 
		{  
			if(strcmp(weapon, block_weapons_list[i]) == 0) 
			{  
				PrintToChat(client, "Разрешено только администратору"); // Сообщение клиенту.   
				return Plugin_Handled;  
			}  
		}
	}
	return Plugin_Continue;  
}

Теперь понятно.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #9
А вообще на админ права проверять нужно бы при входе и просто хранить в bool
 

Юра Шмигель

Участник
Сообщения
32
Реакции
8
пока без bool попробую

Добавлено через 20 минут
Ну вот эта версия вроде работает :) всем спасибо! Рико отдельное СПАСИБО
 
Последнее редактирование:

-_-Ecarus-_-

Участник
Сообщения
76
Реакции
2
Как ограничить покупку грант всем, кроме админов на css v34?
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
ограничить покупку грант всем, кроме админов
PHP:
new bool:g_bIsAdmin[MAXPLAYERS + 1];

public OnClientPostAdminCheck(client) g_bIsAdmin[client] = GetUserAdmin(client) != INVALID_ADMIN_ID;

public Action:CS_OnBuyCommand(client, const String:weapon[])
{
    return StrContains(weapon, "grenade") == -1 || g_bIsAdmin[client] ? Plugin_Continue:Plugin_Handled;
}
 

Черная вдова

Участник
Сообщения
2,795
Реакции
670
PHP:
new bool:g_bIsAdmin[MAXPLAYERS + 1];

public OnClientPostAdminCheck(client) g_bIsAdmin[client] = GetUserAdmin(client) != INVALID_ADMIN_ID;

public Action:CS_OnBuyCommand(client, const String:weapon[])
{
    return StrContains(weapon, "grenade") == -1 || g_bIsAdmin[client] ? Plugin_Continue:Plugin_Handled;
}
А лично дле тебя и правда так удобно читать код?
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
PHP:
new bool:g_bIsAdmin[MAXPLAYERS + 1];

public OnClientPostAdminCheck(client) g_bIsAdmin[client] = GetUserAdmin(client) != INVALID_ADMIN_ID;

public Action:CS_OnBuyCommand(client, const String:weapon[])
{
    return StrContains(weapon, "grenade") == -1 || g_bIsAdmin[client] ? Plugin_Continue:Plugin_Handled;
}

Инклюд cstrike разве не нужен?
 

-_-Ecarus-_-

Участник
Сообщения
76
Реакции
2
C-подобный:
#pragma semicolon 1

#include <sdkhooks>
#include <colors>

// Список блокируемого оружия.
new const String:block_weapons_list[][] =
{
    "incgrenade", "smokegrenade"
};

#define Weapon_Count sizeof(block_weapons_list)

public OnClientPostAdminCheck(client){SDKHook(client, SDKHook_WeaponEquip, WeaponEquip);}
public OnClientDisconnect(client){SDKUnhook(client, SDKHook_WeaponEquip, WeaponEquip);}

// Запрещает использовать и поднимать запрещенное оружие.
public Action:WeaponEquip(client, weapon)   
{
    if(GetUserAdmin(client) == INVALID_ADMIN_ID)
    {
        decl String:blockWeapon[32], i;   
        GetEntityClassname(weapon, blockWeapon, sizeof(blockWeapon)); 

        for(i = 0; i < Weapon_Count; ++i)   
        {   
            if(strcmp(blockWeapon[7], block_weapons_list[i]) == 0 ) 
            {     
                return Plugin_Handled;   
            }   
        }
    }
    return Plugin_Continue;   
}   

// Запрещает покупать заблокированное оружие. 
public Action:CS_OnBuyCommand(client, const String:weapon[])   
{   
    if(GetUserAdmin(client) == INVALID_ADMIN_ID)
    {
        for(new i = 0; i < Weapon_Count; ++i) 
        {   
            if(strcmp(weapon, block_weapons_list[i]) == 0) 
            {   
                PrintToChat(client, "\x01[\x04Замораживающая граната\x01] \x03Разрешено только администратору"); // Сообщение клиенту.   
                return Plugin_Handled;   
            }   
        }
    }
    return Plugin_Continue;   
}


Как сделать, чтобы происходила проверка по определённому флагу доступа?
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
по определённому флагу доступа
if(GetUserAdmin(client) == INVALID_ADMIN_ID)
Оба замени на:
PHP:
if(!GetAdminFlag(GetUserAdmin(client), Admin_Root))
Где: Admin_Root - административный флаг доступа (Root, "z").
C-подобный:
    Admin_Reservation = 0,    /**< Reserved slot */
    Admin_Generic,            /**< Generic admin abilities */
    Admin_Kick,                /**< Kick another user */
    Admin_Ban,                /**< Ban another user */
    Admin_Unban,            /**< Unban another user */
    Admin_Slay,                /**< Slay/kill/damage another user */
    Admin_Changemap,        /**< Change the map */
    Admin_Convars,            /**< Change basic convars */
    Admin_Config,            /**< Change configuration */
    Admin_Chat,                /**< Special chat privileges */
    Admin_Vote,                /**< Special vote privileges */
    Admin_Password,            /**< Set a server password */
    Admin_RCON,                /**< Use RCON */
    Admin_Cheats,            /**< Change sv_cheats and use its commands */
    Admin_Root,                /**< All access by default */
    Admin_Custom1,            /**< First custom flag type */
    Admin_Custom2,            /**< Second custom flag type */
    Admin_Custom3,            /**< Third custom flag type */
    Admin_Custom4,            /**< Fourth custom flag type */
    Admin_Custom5,            /**< Fifth custom flag type */
    Admin_Custom6,            /**< Sixth custom flag type */
 
Сверху Снизу