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

Тема в разделе "Программирование / Скриптинг", создана пользователем adacer, 4 апр 2012.

  1. adacer

    adacer

    Сообщения:
    144
    Симпатии:
    16
    Код:
    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
    ПринтТуЧат сделал специально для проверки, и этот текст печатается когда жмешь Е (использовать) в игре, но всё же действие не блокируется. В чем трабл ?
     
  2. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Re: Помощь в написании плагина

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

    PHP:
    public Action:OnPlayerRunCmd(client, &buttons, &impulseFloat: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 нравится это.
  3. adacer

    adacer

    Сообщения:
    144
    Симпатии:
    16
    Re: Помощь в написании плагина

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

    S1deX Скриптер ;)

    Сообщения:
    129
    Симпатии:
    204
    Re: Помощь в написании плагина

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

    adacer

    Сообщения:
    144
    Симпатии:
    16
    Re: Помощь в написании плагина

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

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Re: Помощь в написании плагина

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

    adacer

    Сообщения:
    144
    Симпатии:
    16
    Re: Помощь в написании плагина

    Решил я использовать эту возможность, но таки опять что-то не получается :)
    Код:
    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 хп. Хиляется. Не подскажете в чём я ошибся? Перепробовал много вариантов, уже хочу спать, может хоть вы поможете))
     
  8. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Re: Помощь в написании плагина

    А какие именно варианты ты пробовал? Почти всё сделано правильно, единственная ошибка с индексом ентити weapon, не ленитесь читать параметры функций. Попробуй получить индекс оружия через m_hActiveWeapon.
    PHP:
    new ActiveWeapon GetEntPropEnt(clientProp_Data"m_hActiveWeapon");
    Ну или
    PHP:
    public Action:OnPlayerRunCmd(client, &buttons, &impulseFloat:vel[3], Float:angles[3], &weapon)
    {    
        new 
    iHealth GetEntData(clientFindDataMapOffs(client"m_iHealth"), 4);
        
    decl String:classname[64];
        
    GetClientWeapon(clientclassnamesizeof(classname));
        if ((
    buttons IN_ATTACK) && StrEqual(classname"weapon_first_aid_kit") && iHealth 40)
        {
            
    buttons &= ~IN_ATTACK;
        }
    }
     
    Последнее редактирование: 5 апр 2012
    adacer нравится это.
  9. adacer

    adacer

    Сообщения:
    144
    Симпатии:
    16
    Игорь Охремчук, огромое тебе спасибо, ты прям спас меня от этого безрукого онанизма.
    Сначало прочел твое изначальное сообщение про m_hActiveWeapon, попытался склеить = не компилируется, ну думаю.. ладно, пошел искать другие пути, в конце концов получился такой код:
    Код:
    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).
    Код:
    new ActiveWeapon = GetEntPropEnt(client, Prop_Data, "m_hActiveWeapon");
    Строка 61:	if ((buttons & IN_ATTACK) && StrEqual(ActiveWeapon, "weapon_first_aid_kit") && iHealth > 40)
    С твоим кодом всё работает вери вел, ещё раз спасибо! :)
     
  10. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

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

    decl String:classname[64];
    if(
    IsValidEdict(ActiveWeapon))
        
    GetEdictClassname(ActiveWeaponclassnamesizeof(classname));
     
  11. S1deX

    S1deX Скриптер ;)

    Сообщения:
    129
    Симпатии:
    204
    Потенциально опасный код, т.к. массив может остаться пустым, не присвоенным к нулю. Лучше либо уже делать все дальнейшие действия под условием, либо что-то такое:
    PHP:
    if (!IsValidEdict(ActiveWeapon)) return Plugin_Continue;
     
  12. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

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

    S1deX Скриптер ;)

    Сообщения:
    129
    Симпатии:
    204
    Ну я подразумеваю то, что человек тупо скопирует этот код. :)