сделать чтобы игрок не мог использовать команду +use

adacer

Участник
Сообщения
145
Реакции
14
C-подобный:
public OnPluginStart() 
{
	HookEvent("player_use", Event_PlayerUse);
}

public Action:Event_PlayerUse(Handle:event, const String:name[], bool:dontBroadcast)
{
	if (TimerEnds ==0)
	{
		PrintToChatAll("test");
		return Plugin_Handled;
	}
	return Plugin_Continue;
}
Пишу плагин для l4d2, задача - сделать чтобы игрок не мог использовать команду +use (то есть использовать\Е на клавиатуре) если значение TimerEnds = 0
ПринтТуЧат сделал специально для проверки, и этот текст печатается когда жмешь Е (использовать) в игре, но всё же действие не блокируется. В чем трабл ?
 

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
Re: Помощь в написании плагина

C-подобный:
public OnPluginStart() 
{
	HookEvent("player_use", Event_PlayerUse);
}

public Action:Event_PlayerUse(Handle:event, const String:name[], bool:dontBroadcast)
{
	if (TimerEnds ==0)
	{
		PrintToChatAll("test");
		return Plugin_Handled;
	}
	return Plugin_Continue;
}
Пишу плагин для l4d2, задача - сделать чтобы игрок не мог использовать команду +use (то есть использовать\Е на клавиатуре) если значение TimerEnds = 0
ПринтТуЧат сделал специально для проверки, и этот текст печатается когда жмешь Е (использовать) в игре, но всё же действие не блокируется. В чем трабл ?

Мне кажется для этой цели лучше использовать OnPlayerRunCmd(). В вашем случае кнопочка IN_USE.

PHP:
public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon)
{
	if ((buttons & IN_USE) && (TimerEnds == 0))
	{
		return Plugin_Handled;
	}
	
	return Plugin_Continue;
}

PHP:
#define IN_ATTACK		(1 << 0)
#define IN_JUMP			(1 << 1)
#define IN_DUCK			(1 << 2)
#define IN_FORWARD		(1 << 3)
#define IN_BACK			(1 << 4)
#define IN_USE			(1 << 5)
#define IN_CANCEL		(1 << 6)
#define IN_LEFT			(1 << 7)
#define IN_RIGHT		(1 << 8)
#define IN_MOVELEFT		(1 << 9)
#define IN_MOVERIGHT		(1 << 10)
#define IN_ATTACK2		(1 << 11)
#define IN_RUN			(1 << 12)
#define IN_RELOAD		(1 << 13)
#define IN_ALT1			(1 << 14)
#define IN_ALT2			(1 << 15)
#define IN_SCORE		(1 << 16)   	// Used by client.dll for when scoreboard is held down
#define IN_SPEED		(1 << 17)	// Player is holding the speed key
#define IN_WALK			(1 << 18)	// Player holding walk key
#define IN_ZOOM			(1 << 19)	// Zoom key for HUD zoom
#define IN_WEAPON1		(1 << 20)	// weapon defines these bits
#define IN_WEAPON2		(1 << 21)	// weapon defines these bits
#define IN_BULLRUSH		(1 << 22)
#define IN_GRENADE1		(1 << 23)	// grenade 1
#define IN_GRENADE2		(1 << 24)	// grenade 2
 

adacer

Участник
Сообщения
145
Реакции
14
Re: Помощь в написании плагина

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

S1deX

Скриптер ;)
Сообщения
129
Реакции
204
Re: Помощь в написании плагина

Евенты - это всего лишь НОТИФИКАЦИЯ, т.е. уведомление. Заблокировать через них выполнение команды невозможно. Тут действительно поможет OnPlayerRunCmd, но не путем ретурна значения, а изменения кнопок игрока. То есть:
PHP:
public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon)
{
 if ((buttons & IN_USE) && TimerEnds == 0)
  buttons &= ~IN_USE;
}
 

adacer

Участник
Сообщения
145
Реакции
14
Re: Помощь в написании плагина

Опять тоже самое, оружие не берется, дверь открывается, но в отличии от первого кода игрок не подвисает когда использует USE. Похоже тут заблокировать клавишу мало, взял код из другого плагина, там отискывается ентитя двери сейфрума и ставятся флаги на то чтобы она не открывалась.
Спасибо за ответы, в будущем пригодится.
 

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
Re: Помощь в написании плагина

Евенты - это всего лишь НОТИФИКАЦИЯ, т.е. уведомление. Заблокировать через них выполнение команды невозможно. Тут действительно поможет OnPlayerRunCmd, но не путем ретурна значения, а изменения кнопок игрока. То есть:
PHP:
public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon)
{
 if ((buttons & IN_USE) && TimerEnds == 0)
  buttons &= ~IN_USE;
}

Честно говоря ты немного ошибаешся. Если отправлять значения, то форвард тоже на них реагирует.
PHP:
Return: 
Plugin_Handled to block the commands from being processed, Plugin_Continue otherwise.
 

adacer

Участник
Сообщения
145
Реакции
14
Re: Помощь в написании плагина

Решил я использовать эту возможность, но таки опять что-то не получается :)
C-подобный:
public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon)
{	
	new iHealth = GetEntData(client, FindDataMapOffs(client, "m_iHealth"), 4);
	decl String:classname[64];
	GetEdictClassname(weapon, classname, 64);
	if ((buttons & IN_ATTACK) && StrEqual(classname, "weapon_first_aid_kit") && iHealth > 40)
	{
		buttons &= ~IN_ATTACK;
	}
}
Суть в том чтобы запретить хилять себя аптечкой если у игрока больше 40 хп. Хиляется. Не подскажете в чём я ошибся? Перепробовал много вариантов, уже хочу спать, может хоть вы поможете))
 

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
Re: Помощь в написании плагина

Решил я использовать эту возможность, но таки опять что-то не получается :)
C-подобный:
public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon)
{	
	new iHealth = GetEntData(client, FindDataMapOffs(client, "m_iHealth"), 4);
	decl String:classname[64];
	GetEdictClassname(weapon, classname, 64);
	if ((buttons & IN_ATTACK) && StrEqual(classname, "weapon_first_aid_kit") && iHealth > 40)
	{
		buttons &= ~IN_ATTACK;
	}
}
Суть в том чтобы запретить хилять себя аптечкой если у игрока больше 40 хп. Хиляется. Не подскажете в чём я ошибся? Перепробовал много вариантов, уже хочу спать, может хоть вы поможете))

А какие именно варианты ты пробовал? Почти всё сделано правильно, единственная ошибка с индексом ентити weapon, не ленитесь читать параметры функций. Попробуй получить индекс оружия через m_hActiveWeapon.
PHP:
new ActiveWeapon = GetEntPropEnt(client, Prop_Data, "m_hActiveWeapon");

Ну или
PHP:
public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon)
{	
	new iHealth = GetEntData(client, FindDataMapOffs(client, "m_iHealth"), 4);
	decl String:classname[64];
	GetClientWeapon(client, classname, sizeof(classname));
	if ((buttons & IN_ATTACK) && StrEqual(classname, "weapon_first_aid_kit") && iHealth > 40)
	{
		buttons &= ~IN_ATTACK;
	}
}
 
Последнее редактирование:

adacer

Участник
Сообщения
145
Реакции
14
Игорь Охремчук, огромое тебе спасибо, ты прям спас меня от этого безрукого онанизма.
Сначало прочел твое изначальное сообщение про m_hActiveWeapon, попытался склеить = не компилируется, ну думаю.. ладно, пошел искать другие пути, в конце концов получился такой код:
C-подобный:
public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon)
{	
	new iHealth = GetEntData(client, FindDataMapOffs(client, "m_iHealth"), 4);
	new iWindex = GetPlayerWeaponSlot(client, 3);
	if(iWindex == -1)
		return Plugin_Continue;
	new String:iWeapon[64];
	GetEdictClassname(iWindex, iWeapon, sizeof(iWeapon));
	if ((buttons & IN_ATTACK) && StrEqual(iWeapon, "weapon_first_aid_kit") && iHealth > 40)
	{
		buttons &= ~IN_ATTACK;
	}
	return Plugin_Continue;
}
При проверке мне доходит, почему ты мне посоветовал использовать актив випон вместо этого способа - клавиша блочилась в не зависимости от того выбрана аптечка или другое оружие :) Начал обратно пытатся склеить код с использованием m_hActiveWeapon, но получал line 61: error 035: argument type mismatch (argument 1).
C-подобный:
new ActiveWeapon = GetEntPropEnt(client, Prop_Data, "m_hActiveWeapon");
Строка 61:	if ((buttons & IN_ATTACK) && StrEqual(ActiveWeapon, "weapon_first_aid_kit") && iHealth > 40)
С твоим кодом всё работает вери вел, ещё раз спасибо! :)
 

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
C-подобный:
new ActiveWeapon = GetEntPropEnt(client, Prop_Data, "m_hActiveWeapon");
Строка 61:	if ((buttons & IN_ATTACK) && StrEqual(ActiveWeapon, "weapon_first_aid_kit") && iHealth > 40)

Я ведь написал "индекс ентити оружия". Даже в объявлении видно, что это интовое число. Надо было его использовать примерно так:
PHP:
new ActiveWeapon = GetEntPropEnt(client, Prop_Data, "m_hActiveWeapon");

decl String:classname[64];
if(IsValidEdict(ActiveWeapon))
	GetEdictClassname(ActiveWeapon, classname, sizeof(classname));
 

S1deX

Скриптер ;)
Сообщения
129
Реакции
204
Я ведь написал "индекс ентити оружия". Даже в объявлении видно, что это интовое число. Надо было его использовать примерно так:
PHP:
new ActiveWeapon = GetEntPropEnt(client, Prop_Data, "m_hActiveWeapon");

decl String:classname[64];
if(IsValidEdict(ActiveWeapon))
	GetEdictClassname(ActiveWeapon, classname, sizeof(classname));
Потенциально опасный код, т.к. массив может остаться пустым, не присвоенным к нулю. Лучше либо уже делать все дальнейшие действия под условием, либо что-то такое:
PHP:
if (!IsValidEdict(ActiveWeapon)) return Plugin_Continue;
 

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
Потенциально опасный код, т.к. массив может остаться пустым, не присвоенным к нулю. Лучше либо уже делать все дальнейшие действия под условием, либо что-то такое:
PHP:
if (!IsValidEdict(ActiveWeapon)) return Plugin_Continue;

Это не код, а кусок кода. По-сути его комментировать не обязательно, только если существуют существенные ошибки. Врятли у кого-то хватит ума использовать нулл массив, хотя Адасер скорей всего неверояный умелец.
 

S1deX

Скриптер ;)
Сообщения
129
Реакции
204
Это не код, а кусок кода. По-сути его комментировать не обязательно, только если существуют существенные ошибки. Врятли у кого-то хватит ума использовать нулл массив, хотя Адасер скорей всего неверояный умелец.
Ну я подразумеваю то, что человек тупо скопирует этот код. :)
 
Сверху Снизу