Урон по одному союзнику

Тема в разделе "Программирование / Скриптинг", создана пользователем Primo, 20 май 2015.

  1. Primo

    Primo Где мои манеры

    Сообщения:
    1.229
    Симпатии:
    337
    Заинтересовался в нанесении урона не по всем союзникам, а только по одному. Т.е. все могут бить одного союзника, а он может бить их всех. Толпа бить друг друга не может, только одного :D

    Хотелось бы узнать варианты реализации подобного. Кому не жалко поделиться :D
     
  2. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.836
    Симпатии:
    2.143
    mp_friendlyfire 1
    Определяешь индекс "особенного" игрока и просто проверяешь урон относительно него.
    Если событием хукнул, то просто возвращаешь всем союзникам HP, когда бьют не его.
    Если SDHook, то просто блокируешь такой же урон.
     
    TWRP и Primo нравится это.
  3. EPacker2

    EPacker2 3D-моделист

    Сообщения:
    1.050
    Симпатии:
    655
    Primo, Оффтоп
     
  4. Primo

    Primo Где мои манеры

    Сообщения:
    1.229
    Симпатии:
    337
    EPacker2, скорее, чтобы люди искали кого забить до смерти
     
  5. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.836
    Симпатии:
    2.143
    Урон по одному союзнику, а он - по всем

    Если ещё не нашлось хорошего варианта:
    PHP:
    #define ANTIFRIEND_INDEX 1

    public OnPluginStart() HookEvent("player_hurt"Event_PlayerHurt);

    public 
    Event_PlayerHurt(Handle:eventString:name[], bool:dontBroadcast)
    {
        new 
    attacker GetClientOfUserId(GetEventInt(event"attacker"));
        if(
    attacker && attacker != ANTIFRIEND_INDEX)
        {
            new 
    client GetClientOfUserId(GetEventInt(event"userid"));
            if(
    attacker != client && client != ANTIFRIEND_INDEX && GetClientTeam(attacker) == GetClientTeam(client))
            {
                
    SetEntProp(clientProp_Send"m_iHealth"GetEventInt(event"dmg_health")+GetEventInt(event"health"));
            }
        }
    }
    mp_friendlyfire 1 не забывываем.
     
    Primo нравится это.
  6. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    247
    Симпатии:
    586
    Re: Урон по одному союзнику, а он - по всем

    EventHookMode_Pre для такого обязателен. Иначе попадание в голову (или нанесение урона больше, чем есть у человека) = смерть. К тому же каждый раунд один и тот же игрок будет этой целью. Как только он покинет сервер, не будет игрока, в которого можно стрелять. Всё же стоит определить этот индекс глобально и выбирать его случайным каждый раунд.
     
    Primo нравится это.
  7. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.258
    Симпатии:
    3.233
    AlmazON, не лучше ли через sdkhooks ?

    Reiko1231, индекс он написал просто для примера. ТС сам уже подстроит
     
    Primo нравится это.
  8. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.836
    Симпатии:
    2.143
    Сначала вызывается событие урона, а уже позже - смерти. Так что, данное событие просто переустановит HP - должно быть нормально.
    Пользовался как-то - вроде никто не умирал.
    Лучше, но там расписывать побольше) Я больше пример привёл, собственно проверок, для достижения эффекта. А чем и как - дело личное.
     
    Primo нравится это.
  9. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.258
    Симпатии:
    3.233
    Re: Урон по одному союзнику, а он - по всем

    PHP:
    #define ANTIFRIEND_INDEX 1

    public OnClientPutInServer(iClient)
    {
        
    SDKHook(iClientSDKHook_OnTakeDamageOnTakeDamage);
    }

    public 
    Action:OnTakeDamage(iClient, &iAttacker, &inflictor, &Float:damage, &damagetype)
    {
        if(
    iAttacker && iAttacker != ANTIFRIEND_INDEX && iAttacker != iClient && iClient != ANTIFRIEND_INDEX && GetClientTeam(iAttacker) == GetClientTeam(iClient))
        {
            
    damage 0.0;
            return 
    Plugin_Changed;
        }

    }
    Или просто return Plugin_Handled;
     
    Primo нравится это.
  10. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.836
    Симпатии:
    2.143
    Не так. Раз уж взялся расписывать, то хукаем только участников нужной команды. Поскольку среди них и есть нужные атакующие, так и сама жертва. А раз оба типа этих индексов присутствует, то должно работать и без глобального хука. Оффтоп
     
    Последнее редактирование: 22 май 2015
    Primo нравится это.
  11. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.258
    Симпатии:
    3.233
    AlmazON, если для игрока не хуункуто то он будет 0.
    Следовательно ты не узнаешь он упал или его ранили из чужой команды.

    Лучше лишний раз проверить
     
    Primo нравится это.
  12. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.836
    Симпатии:
    2.143
    Разве атакующий тогда не будет 0? Он то в проверке так и остаётся (ты же оставил) - мир то поэтому и не хукается.
     
    Primo нравится это.