Christmas Patriarch

Reload Interrupt Mutator. Мутатор прерывание перезарядки

Некоторые пушки очень уж долго и нудно перезаряжаются и не дают шанса поменять себя на другое оружие.
Это простейший мутатор позволяющий прерывать любую перезарядку сменой оружия или броском гранаты. В принципе можете дописать среди InterruptAliases в Interaction классе, например, “Fire” и “AltFire”.
Тогда сможете частично перезарядиться и стрелять там, где раньше это не позволялось.

class ReloadInterruptMut extends Mutator;
//simple version of Reload Options Mutator
//author: a1eat0r
//link: http://forums.tripwireinteractive.com/showpost.php?p=1208486&postcount=1
//каждому игроку вешаем Interaction класс, который будет отслеживать нажатие клавиш
simulated function Tick(float DeltaTime)
{
    local PlayerController PC;
    PC = Level.GetLocalPlayerController();

    if (PC != None)
    {
        PC.Player.InteractionMaster.AddInteraction("ReloadInterruptMut.RIInteraction", PC.Player);
        Disable('Tick');
    }
}
defaultproperties
{
    GroupName="KF-ReloadInterrupt"
    FriendlyName="ReloadInterruptMut"
    Description="ReloadInterruptMut"
    bAlwaysRelevant=true
    RemoteRole=ROLE_SimulatedProxy
    bAddToServerPackages=true
}
class RIInteraction extends Interaction;
var KFPlayerController PC;
var array<string> InterruptAliases;
function Initialize()
{
    PC = KFPlayerController(ViewportOwner.Actor);
    if (PC == None)
        Master.RemoveInteraction(Self);
    if (InterruptAliases.Length == 0)
        InterruptAliases = default.InterruptAliases;
}
event NotifyLevelChange()
{
    Master.RemoveInteraction(Self);
}
function KFWeapon GetWeapon()
{
    if (PC.Pawn != None)
        return KFWeapon(PC.Pawn.Weapon);
    else
        return None;
}
//Получаем текущую пушку в руках у игрока, если она перезаряжается - прерываем процесс
//на сервере и на клиенте
function InterruptReload()
{
    local KFWeapon W;
    W = GetWeapon();
    if (W == None)
        return;
    if(W.bIsReloading)
    {
        W.ServerInterruptReload();
        if    (
                PC.Level.NetMode != NM_StandAlone
                &&    (PC.Level.NetMode != NM_ListenServer || !PC.Pawn.IsLocallyControlled())
            )
        {
            W.ClientInterruptReload();
        }
    }
}
//Если нажата клавиша - срабатываем и проверяем что нажато. Если действие является одним из //перечисленных в массиве InterruptAliases, то прерываем перезарядку
function bool KeyEvent(EInputKey Key, EInputAction Action, float Delta)
{
    local string Alias, LeftPart, RigthPart;
    local int i;
    if (Action == IST_Press)
    {
        Alias = PC.ConsoleCommand("KEYBINDING" @ PC.ConsoleCommand("KEYNAME" @ Key));
        if (Divide(Alias, " ", LeftPart, RigthPart))
            Alias = LeftPart;
        for (i = 0; i < InterruptAliases.Length; i++)
        {
            if (Alias ~= InterruptAliases[i])
            {
                InterruptReload();
                break;
            }
        }
    }
    return false;
}
defaultproperties
{
    InterruptAliases(0)="ThrowNade"
    InterruptAliases(1)="ThrowGrenade"
    InterruptAliases(2)="GetWeapon"
    InterruptAliases(3)="SwitchWeapon"
    InterruptAliases(4)="SwitchToLastWeapon"
}

Добавлять в виде ReloadInterruptMut.ReloadInterruptMut
Автор: Flame