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

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

  1. Primo

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

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

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

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

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

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

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

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

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

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

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

    Если ещё не нашлось хорошего варианта:
    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

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

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

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

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

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

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

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

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

    Сообщения:
    6.005
    Симпатии:
    2.994
    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.591
    Симпатии:
    1.996
    Не так. Раз уж взялся расписывать, то хукаем только участников нужной команды. Поскольку среди них и есть нужные атакующие, так и сама жертва. А раз оба типа этих индексов присутствует, то должно работать и без глобального хука. Оффтоп
     
    Последнее редактирование: 22 май 2015
    Primo нравится это.
  11. R1KO

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

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

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

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

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