Вопросы к кодерам и мододелам

Тема в разделе "Игровое редактирование", создана пользователем Фрэгл, 20 ноя 2011.

  1. yjas0105

    yjas0105 Новенький

    Спасибо большое !
     
  2. Arckon.

    Arckon. Соучастник

    Приветствую.

    Имеется игровой параметр weaponstay=значение параметра. Он отвечает за сохранение (исчезновение) оружия в начале новой волны. Проблема в том, что оружие не пропадает, даже при отключенном параметре при наличии мутатора KFBossSquad. Судя по всему, имеется некий конфликт параметра и свойств данного мутатора, что в итоге приводит к негативному эффекту: любое оружие, которое купил (подобрал) и выкинул игрок будет находиться на карте в течение всей партии игры и не исчезнет.
    В данном разделе нашел немного похожую проблему, но вызов оружия здесь никаким боком не привязан (см.). Может, проблему можно будет решить при помощи того отредактированного мутатора, который выложил Flame в том посте? Необходимо классическое исчезновение оружия на Сервере в начале новой волны.
    Мутатор KFBossSquad (последняя версия).
    Исходные файлы для KFBossSquad: cм.1 / см.2
    Мутатор KFWeaponStay

    Будьте добры подсказать, в чем загвоздка и имеются ли какие-нибудь решения данной проблемы? Прошу прощения, если пишу не в ту тему.
    P.S. На Форум TWI не обращался.
     
    ЛОХМАТЫЙ нравится это.
  3. Flame

    Flame -Заслуженый кодер форума-

    Мои последние посты с WTF должны быть рабочими на текущей версии сервера
    Погляжу темы, потестирую, поправлю шапки

    Я погляжу сегодня
     
  4. 0ren

    0ren Соучастник

    здравствуйте!
    Как бы у меня очень много вопросов, но начну с малого!
    1) как сделать , чтобы кнопка F бросала аптечки (на которые сдохла ссылка ) G - гранаты по умолчанию у медика так и осталась?
    2) на оружие медика альт. огонь - одно нажатие - 1 выстрел шприца, а вот как сделать, чтобы при зажатом ролике они выстреливались постоянно?
    3) подбор оружие в игре происходит автоматически. Как это сделать, чтоб подбор происходил после нажатие кнопки Е ?
    Заранее спасибо!
     
  5. Essence

    Essence Бандит

    Так-с. Значит MedicReward пихаю в NetDamage следующим образом:
    Код:
    function AddDamagedHealStats( int MedicReward )
    {
        local KFSteamStatsAndAchievements KFSteamStats;
        local Vector HitLocation, Momentum;
        local GameRules GR;
        GR=Level.Game.GameRulesModifiers;
    
        if(GR!=None)
        {
            if(GR.Name=='AlternativeStatsRules')
            {
                GR.NetDamage(MedicReward, MedicReward, Instigator, Instigator, HitLocation, Momentum, class'DamTypeHeal');
            }
            else
            {
                GR=GR.NextGameRules;
            }
        }
    
        if ( Instigator == none || Instigator.PlayerReplicationInfo == none )
        {
            return;
        }
    
        KFSteamStats = KFSteamStatsAndAchievements( Instigator.PlayerReplicationInfo.SteamStatsAndAchievements );
    
        if ( KFSteamStats != none )
        {
             KFSteamStats.AddDamageHealed(MedicReward);
        }
    }
    Не сработало.
    Потом добавил репликацию:
    Код:
    replication
    {
        reliable if(Role < ROLE_Authority)
            AddDamagedHealStats;
    }
    Всё равно не пашет.
    Что ещё нужно сделать, чтобы игроки засчитывались?
    Или я здесь где-то допускаю ошибку.
     
  6. Flame

    Flame -Заслуженый кодер форума-

    Чего то я вообще нить потерял что ты делаешь и что за странный у тебя код)
    У тебя всего 2 GameRules?
    Поэтому ты такой код пишешь?
    Код:
        if(GR!=None)
        {
            if(GR.Name=='AlternativeStatsRules')
            {
                GR.NetDamage(MedicReward, MedicReward, Instigator, Instigator, HitLocation, Momentum, class'DamTypeHeal');
            }
            else
            {
                GR=GR.NextGameRules;
            }
        }
    
    И вообще напомни что ты делаешь и где ты это делаешь)

    1. Ну если ты хочешь прям ослеживать F, то тебе придётся изучать Interaction - мне некогда про это сейчас статью писать) Можешь поглядеть как сделан мутатор ReloadInterrupt

    Ну или ты можешь сделать exec функцию в PlayerController классе (KFPCServ в случае SP)
    (Как пример можешь посмотреть exec function ThrowWeapon())
    и забиндить F на эту функцию

    2. Fire класс, bWaitForRelease=false в defaultproperties

    3. Ну это уже надо конкретный код писать. Использовать аналог мутатора
    для запрета поднятия пушек
    , а при нажатии E обследовать некоторую окрестность перед игроком и поднимать, например, ближайшую пушку.

    Upd. А. "F" это ведь фонарик. Ну значит можешь ещё переписать функцию ToggleFlashlight
     
    Последнее редактирование: 20 ноя 2016
  7. Essence

    Essence Бандит

    1) Взял твой мутатор PatDamageStoreMut и переписал его для себя, сделав, по сути, мутатор альтернативной статистики (мне было влом переписывать все даймтайпы).
    2) Столкнулся с проблемой - статистика обнулялась. Решил её.
    3) Потом стала обнуляться только стата убитых Патриархов, но, видимо, я их не так начислял.
    Вместо
    Код:
    Killer.PlayerReplicationInfo.SetPropertyText("KilledPats",string(KilledPatsStat+1));
    Надо было сделать так
    Код:
    Killer.PlayerReplicationInfo.SetPropertyText("KilledPats",string(KilledPatsStat+=1));
    По крайней мере, проблем теперь не наблюдаю.
    4) Осталось отследить количество вылеченных игроков.
    Ты посоветовал следующее:
    Я сначала подумал, зачем там Damage, с помощью него я вряд ли смогу отследить вылеченных игроков.
    Ну, думаю, ладно, раз Флейм написал, значит так надо.
    Сделал это, отслеживаю вылеченных игроков следующим способом:
    Код:
    function int NetDamage( int OriginalDamage, int Damage, Pawn Injured, Pawn InstigatedBy, vector HitLocation, out vector Momentum, class<DamageType> DamageType )
    {
        local int HealedPlayersStat;
        if(Injured==None || InstigatedBy==None)
        {
            if ( NextGameRules != None)
                return NextGameRules.NetDamage(OriginalDamage, Damage, Injured, InstigatedBy, HitLocation, Momentum, DamageType);
            return Damage;
        }
        if(Injured.IsA('KFHumanPawn') && InstigatedBy.IsA('KFHumanPawn') && InstigatedBy!=None
                     && InstigatedBy.Controller.IsA('PlayerController') && Damage>0)
        {
            // Field Medic
            if(DamageType.Name == 'DamTypeHeal' && KFGameType(InstigatedBy.Level.Game).bWaveBossInProgress)
            {
                HealedPlayersStat=int(InstigatedBy.PlayerReplicationInfo.GetPropertyText("HealedPlayers"));
                InstigatedBy.PlayerReplicationInfo.SetPropertyText("HealedPlayers",string(HealedPlayersStat+=1));
            }
        }
        ...
    Не сработало.
    Догадался, что нужно вместо Damage использовать MedicReward.
    Отредактировал AddDamagedHealStats (тот самый странный код выше).
    Не сработало.
    Потом подумал, что нужна репликация функции с клиента на сервер.
    Добавил. Всё равно результата нет.
    У меня несколько GameRules. Так значит загвоздка в этом? Нужно было просто написать:
    Код:
        if(GR!=None)
        {
            if(GR.Name=='AlternativeStatsRules')
                GR.NetDamage(MedicReward, MedicReward, Instigator, Instigator, HitLocation, Momentum, class'DamTypeHeal');
        }
    и всё?
     
    Последнее редактирование: 20 ноя 2016
  8. Flame

    Flame -Заслуженый кодер форума-

    Я сейчас туплю по поводу всего кроме последнего
    Но просто смотри что ты делаешь
    GR=Level.Game.GameRulesModifiers;
    это ты получаешь ссылку на первый добавленный GameRules
    Если этим GameRules каким-то удачным образом оказался AlternativeStatsRules, то тебе повезло
    Но если нет, то ты в пролёте)
    Может тебе стоит пробежать цикл по GameRules, по связному списку с помощью GR.NextGameRules
    И найти среди GameRules - AlternativeStatsRules? )
    И убери свои репликации. Это вроде ж серверная функция и так)
     
    Essence нравится это.
  9. Essence

    Essence Бандит

    Точно, цикл. Ты прав. Так и сделаю.
    Так, если б она была серверная, разве не было бы simulated function AddDamagedHealStats?
    Или из-за того, что она вызывается из simulated function ProcessTouch она тоже серверная?
     
  10. Flame

    Flame -Заслуженый кодер форума-

    simulated - значит может выполняться на клиенте
    вот ProcessTouch выполняется и на клиенте и на сервере, но если ты поглядишь, то увидишь, что AddDamagedHealStats вызывается внутри условия if( Role == ROLE_Authority ) - то есть только для сервера
     
    Essence нравится это.
  11. 0ren

    0ren Соучастник

    Здравствуйте, может кто-то сказать как сделать вместо гранат пачки с патронами? А то я вообще не знаю как.
    Да и вообще очень очень плохо с кодом дружу. Очень прошу, если можно, то расскажите!
     
  12. Essence

    Essence Бандит

    Доброго времени суток.

    После того, как я выставил мобам
    Код:
    defaultproperties
    {
         BleedOutDuration=0.000000
    }
    обезглавленные сталкеры перестали засчитываться в прокачку.
    Как сделать так, чтобы смерть сталкера от кровотечения засчитывалась коммандосу?
    Пробовал редактировать Tick моба. Менял DamTypeBleedOut. Потом попробовал через PreventDeath. Ничего не получилось.
     
  13. Фрэгл

    Фрэгл Administrator

    И в итоге что мы можем наблюдать?
     
  14. Essence

    Essence Бандит

    А наблюдать мы можем следующее.

    №1
    Код:
    class SRGameRules extends GameRules;
    
    var array<KFMonster> DecapitatedMonsters;
    
    function PostBeginPlay()
    {
        if(Level.Game.GameRulesModifiers==None)
            Level.Game.GameRulesModifiers=Self;
        else Level.Game.GameRulesModifiers.AddGameRules(Self);
    }
    
    function AddGameRules(GameRules GR)
    {
        if (GR!=Self)
            Super.AddGameRules(GR);
    }
    
    function bool PreventDeath(Pawn Killed, Controller Killer, class<DamageType> damageType, vector HitLocation)
    {
        local KFSteamStatsAndAchievements KFStatsAndAchievements;
        local PlayerController PC;
        local int WeaponIndex;
        local ClientPerkRepLink R;
        local SRCustomProgress S;
        CleanDecapitatedList();
    
        if(damageType==None || Killer==None || Killed==None)
        {
            if ( NextGameRules != None)
                return NextGameRules.PreventDeath(Killed,Killer,damageType,HitLocation);
            return false;
        }
        PC=PlayerController(Killer);
        if(PC!=None)
        {
            KFStatsAndAchievements=KFSteamStatsAndAchievements(PC.SteamStatsAndAchievements);
            WeaponIndex=class<KFWeaponPickup>(KFWeapon(Inventory).PickupClass).default.CorrespondingPerkIndex;
        }
        if(PC==None || KFStatsAndAchievements==None)
        {
            if ( NextGameRules != None)
                return NextGameRules.PreventDeath(Killed,Killer,damageType,HitLocation);
            return false;
        }
        if(DamageType.Name == 'DamTypeBleedOut' && WeaponIndex == 3)
        {
            if(Killed.IsA('ZombieStalker'))
            {
                KFStatsAndAchievements.AddStalkerKill();
            }
        }
    
        if ( (NextGameRules != None) && NextGameRules.PreventDeath(Killed,Killer, damageType,HitLocation) )
            return true;
    
        if( xPlayer(Killer)!=None && Killed.Controller!=None && Killed.Controller!=Killer )
        {
            R = FindStatsFor(Killer);
            if( R!=None )
                for( S=R.CustomLink; S!=None; S=S.NextLink )
                    S.NotifyPlayerKill(Killed,damageType);
        }
        if( xPlayer(Killed.Controller)!=None && Killer!=None && Killer.Pawn!=None )
        {
            R = FindStatsFor(Killed.Controller);
            if( R!=None )
                for( S=R.CustomLink; S!=None; S=S.NextLink )
                    S.NotifyPlayerKilled(Killer.Pawn,damageType);
        }
        return false;
    }
    
    function int NetDamage(int OriginalDamage, int Damage, Pawn Injured, Pawn InstigatedBy, Vector HitLocation, out Vector Momentum, class<DamageType> DamageType)
    {
        local SRPlayerReplicationInfo SRPRI;
        local PlayerController PC;
        local KFMonster KFM;
        KFM=KFMonster(Injured);
        if(KFM==None || InstigatedBy==None)
        {
            if(NextGameRules!=None)
                return NextGameRules.NetDamage(OriginalDamage, Damage, Injured, InstigatedBy, HitLocation, Momentum, DamageType);
            return Damage;
        }
        if(KFM!=None && InstigatedBy.IsA('KFHumanPawn') && InstigatedBy.Controller.IsA('PlayerController') && Damage>0)
        {
            PC=PlayerController(InstigatedBy.Controller);
            if(PC!=None)
                SRPRI=SRPlayerReplicationInfo(PC.PlayerReplicationInfo);
    
            if(PC==None || SRPRI==None)
            {
                if(NextGameRules!=None)
                    return NextGameRules.NetDamage(OriginalDamage, Damage, Injured, InstigatedBy, HitLocation, Momentum, DamageType);
                return Damage;
            }
            if(Damage>KFM.Health)
            {
                Damage=KFM.Health;
            }
            if(KFM.bDecapitated && !InDecapitatedList(KFM) && Damage>KFM.HeadHealth)
            {
                DecapitatedMonsters[DecapitatedMonsters.Length]=KFM;
                Damage=KFM.HeadHealth;
            }
            SRPRI.Damage+=Damage;
        }
        if(NextGameRules!=None)
            return NextGameRules.NetDamage(OriginalDamage, Damage, Injured, InstigatedBy, HitLocation, Momentum, DamageType);
        return Damage;
    }
    
    function bool InDecapitatedList(KFMonster M)
    {
        local int i;
        for(i=0;i<DecapitatedMonsters.Length;i++)
            if(DecapitatedMonsters[i]==M) return true;
        return false;
    }
    
    function CleanDecapitatedList()
    {
        local int i;
        for (i=0; i<DecapitatedMonsters.Length; i++)
        {
            if (DecapitatedMonsters[i]==none)
            {
                DecapitatedMonsters.Remove(i,1);
                i--;
            }
        }
    }
    
    static final function ClientPerkRepLink FindStatsFor( Controller C )
    {
        local LinkedReplicationInfo L;
    
        if( C.PlayerReplicationInfo==None )
            return None;
        for( L=C.PlayerReplicationInfo.CustomReplicationInfo; L!=None; L=L.NextReplicationInfo )
            if( ClientPerkRepLink(L)!=None )
                return ClientPerkRepLink(L);
        return None;
    }
    
    defaultproperties
    {
    }

    №2
    Код:
    class SRGameRules extends GameRules;
    
    var array<KFMonster> DecapitatedMonsters;
    
    function PostBeginPlay()
    {
        if(Level.Game.GameRulesModifiers==None)
            Level.Game.GameRulesModifiers=Self;
        else Level.Game.GameRulesModifiers.AddGameRules(Self);
    }
    
    function AddGameRules(GameRules GR)
    {
        if (GR!=Self)
            Super.AddGameRules(GR);
    }
    
    function bool PreventDeath(Pawn Killed, Controller Killer, class<DamageType> damageType, vector HitLocation)
    {
        local KFSteamStatsAndAchievements KFStatsAndAchievements;
        local PlayerController PC;
        local int WeaponIndex;
        local KFMonster KFM;
        local ClientPerkRepLink R;
        local SRCustomProgress S;
        CleanDecapitatedList();
        KFM=KFMonster(Killed);
    
        if(KFM==None || damageType==None || Killer==None || Killed==None)
        {
            if ( NextGameRules != None)
                return NextGameRules.PreventDeath(Killed,Killer,damageType,HitLocation);
            return false;
        }
        PC=PlayerController(Killer);
        if(PC!=None)
        {
            KFStatsAndAchievements=KFSteamStatsAndAchievements(PC.SteamStatsAndAchievements);
            WeaponIndex=class<KFWeaponPickup>(KFWeapon(Inventory).PickupClass).default.CorrespondingPerkIndex;
        }
        if(PC==None || KFStatsAndAchievements==None)
        {
            if ( NextGameRules != None)
                return NextGameRules.PreventDeath(Killed,Killer,damageType,HitLocation);
            return false;
        }
        if(KFM.bDecapitated && !InDecapitatedList(KFM) && WeaponIndex == 3)
        {
            if(Killed.IsA('ZombieStalker'))
            {
                KFStatsAndAchievements.AddStalkerKill();
            }
        }
    
        if ( (NextGameRules != None) && NextGameRules.PreventDeath(Killed,Killer, damageType,HitLocation) )
            return true;
    
        if( xPlayer(Killer)!=None && Killed.Controller!=None && Killed.Controller!=Killer )
        {
            R = FindStatsFor(Killer);
            if( R!=None )
                for( S=R.CustomLink; S!=None; S=S.NextLink )
                    S.NotifyPlayerKill(Killed,damageType);
        }
        if( xPlayer(Killed.Controller)!=None && Killer!=None && Killer.Pawn!=None )
        {
            R = FindStatsFor(Killed.Controller);
            if( R!=None )
                for( S=R.CustomLink; S!=None; S=S.NextLink )
                    S.NotifyPlayerKilled(Killer.Pawn,damageType);
        }
        return false;
    }
    
    function int NetDamage(int OriginalDamage, int Damage, Pawn Injured, Pawn InstigatedBy, Vector HitLocation, out Vector Momentum, class<DamageType> DamageType)
    {
        local SRPlayerReplicationInfo SRPRI;
        local PlayerController PC;
        local KFMonster KFM;
        KFM=KFMonster(Injured);
        if(KFM==None || InstigatedBy==None)
        {
            if(NextGameRules!=None)
                return NextGameRules.NetDamage(OriginalDamage, Damage, Injured, InstigatedBy, HitLocation, Momentum, DamageType);
            return Damage;
        }
        if(KFM!=None && InstigatedBy.IsA('KFHumanPawn') && InstigatedBy.Controller.IsA('PlayerController') && Damage>0)
        {
            PC=PlayerController(InstigatedBy.Controller);
            if(PC!=None)
                SRPRI=SRPlayerReplicationInfo(PC.PlayerReplicationInfo);
    
            if(PC==None || SRPRI==None)
            {
                if(NextGameRules!=None)
                    return NextGameRules.NetDamage(OriginalDamage, Damage, Injured, InstigatedBy, HitLocation, Momentum, DamageType);
                return Damage;
            }
            if(Damage>KFM.Health)
            {
                Damage=KFM.Health;
            }
            if(KFM.bDecapitated && !InDecapitatedList(KFM) && Damage>KFM.HeadHealth)
            {
                DecapitatedMonsters[DecapitatedMonsters.Length]=KFM;
                Damage=KFM.HeadHealth;
            }
            SRPRI.Damage+=Damage;
        }
        if(NextGameRules!=None)
            return NextGameRules.NetDamage(OriginalDamage, Damage, Injured, InstigatedBy, HitLocation, Momentum, DamageType);
        return Damage;
    }
    
    function bool InDecapitatedList(KFMonster M)
    {
        local int i;
        for(i=0;i<DecapitatedMonsters.Length;i++)
            if(DecapitatedMonsters[i]==M) return true;
        return false;
    }
    
    function CleanDecapitatedList()
    {
        local int i;
        for (i=0; i<DecapitatedMonsters.Length; i++)
        {
            if (DecapitatedMonsters[i]==none)
            {
                DecapitatedMonsters.Remove(i,1);
                i--;
            }
        }
    }
    
    static final function ClientPerkRepLink FindStatsFor( Controller C )
    {
        local LinkedReplicationInfo L;
    
        if( C.PlayerReplicationInfo==None )
            return None;
        for( L=C.PlayerReplicationInfo.CustomReplicationInfo; L!=None; L=L.NextReplicationInfo )
            if( ClientPerkRepLink(L)!=None )
                return ClientPerkRepLink(L);
        return None;
    }
    
    defaultproperties
    {
    }

    №3
    Код:
    class ZombieStalker_LH extends ZombieStalker_STANDARD;
    
    simulated function Tick(float DeltaTime)
    {
        local PlayerController P;
        local float DistSquared;
        local int WeaponIndex; // Индекс оружия
    
        WeaponIndex=class<KFWeaponPickup>(KFWeapon(Inventory).PickupClass).default.CorrespondingPerkIndex; // Получаем его
    
    //    if(Level.NetMode == NM_DedicatedServer)
    //    {
    //        IsHeadShot(vect(0,0,0), vect(0,0,0), 1.0);
    //    }
    
        // If we've flagged this character to be destroyed next tick, handle that
        if( bDestroyNextTick && TimeSetDestroyNextTickTime < Level.TimeSeconds )
        {
            Destroy();
        }
    
        // Make Zeds move faster if they aren't net relevant, or noone has seen them
        // in a while. This well get the Zeds to the player in larger groups, and
        // quicker - Ramm
        if ( Level.NetMode != NM_Client && CanSpeedAdjust() )
        {
            if ( Level.NetMode == NM_Standalone )
            {
                if ( Level.TimeSeconds - LastRenderTime > 5.0 )
                {
                    P = Level.GetLocalPlayerController();
    
                    if ( P != none && P.Pawn != none )
                    {
                        if ( Level.TimeSeconds - LastViewCheckTime > 1.0 )
                        {
                            LastViewCheckTime = Level.TimeSeconds;
                            DistSquared = VSizeSquared(P.Pawn.Location - Location);
                            if( (!P.Pawn.Region.Zone.bDistanceFog || (DistSquared < Square(P.Pawn.Region.Zone.DistanceFogEnd))) &&
                                FastTrace(Location + EyePosition(), P.Pawn.Location + P.Pawn.EyePosition()) )
                            {
                                LastSeenOrRelevantTime = Level.TimeSeconds;
                                SetGroundSpeed(GetOriginalGroundSpeed());
                            }
                            else
                            {
                                SetGroundSpeed(default.GroundSpeed * (HiddenGroundSpeed / default.GroundSpeed));
                            }
                        }
                    }
                }
                else
                {
                    LastSeenOrRelevantTime = Level.TimeSeconds;
                    SetGroundSpeed(GetOriginalGroundSpeed());
                }
            }
            else if ( Level.NetMode == NM_DedicatedServer )
            {
                if ( Level.TimeSeconds - LastReplicateTime > 0.5 )
                {
                    SetGroundSpeed(default.GroundSpeed * (300.0 / default.GroundSpeed));
                }
                else
                {
                    LastSeenOrRelevantTime = Level.TimeSeconds;
                    SetGroundSpeed(GetOriginalGroundSpeed());
                }
            }
            else if ( Level.NetMode == NM_ListenServer )
            {
                if ( Level.TimeSeconds - LastReplicateTime > 0.5 && Level.TimeSeconds - LastRenderTime > 5.0 )
                {
                    P = Level.GetLocalPlayerController();
    
                    if ( P != none && P.Pawn != none )
                    {
                        if ( Level.TimeSeconds - LastViewCheckTime > 1.0 )
                        {
                            LastViewCheckTime = Level.TimeSeconds;
                            DistSquared = VSizeSquared(P.Pawn.Location - Location);
    
                            if ( (!P.Pawn.Region.Zone.bDistanceFog || (DistSquared < Square(P.Pawn.Region.Zone.DistanceFogEnd))) &&
                                FastTrace(Location + EyePosition(), P.Pawn.Location + P.Pawn.EyePosition()) )
                            {
                                LastSeenOrRelevantTime = Level.TimeSeconds;
                                SetGroundSpeed(GetOriginalGroundSpeed());
                            }
                            else
                            {
                                SetGroundSpeed(default.GroundSpeed * (300.0 / default.GroundSpeed));
                            }
                        }
                    }
                }
                else
                {
                    LastSeenOrRelevantTime = Level.TimeSeconds;
                    SetGroundSpeed(GetOriginalGroundSpeed());
                }
            }
        }
    
        if ( bResetAnimAct && ResetAnimActTime<Level.TimeSeconds )
        {
            AnimAction = '';
            bResetAnimAct = False;
        }
    
        if ( Controller != None )
        {
            LookTarget = Controller.Enemy;
        }
    
        // If the Zed has been bleeding long enough, make it die
        if ( Role == ROLE_Authority && bDecapitated )
        {
            if ( BleedOutTime > 0 && Level.TimeSeconds - BleedOutTime >= 0 )
            {
                if(WeaponIndex==3) // Если пушка принадлежит коммандосу, меняем DamType.
                {
                    Died(LastDamagedBy.Controller,class'DamTypeBleedOutStalker',Location); // Может быть дело в LastDamagedBy.Controller?
                    BleedOutTime=0;
                }
                else
                {
                    Died(LastDamagedBy.Controller,class'DamTypeBleedOut',Location);
                    BleedOutTime=0;
                }
            }
    
        }
    
        //SPLATTER!!!!!!!!!
        //TODO - can we work this into Epic's gib code?
        //Will we see enough improvement in efficiency to be worth the effort?
        if ( Level.NetMode!=NM_DedicatedServer )
        {
            TickFX(DeltaTime);
    
            if ( bBurnified && !bBurnApplied )
            {
                if ( !bGibbed )
                {
                    StartBurnFX();
                }
            }
            else if ( !bBurnified && bBurnApplied )
            {
                StopBurnFX();
            }
    
            if ( bAshen && Level.NetMode == NM_Client && !class'GameInfo'.static.UseLowGore() )
            {
                ZombieCrispUp();
                bAshen = False;
            }
        }
    
        if ( DECAP )
        {
            if ( Level.TimeSeconds > (DecapTime + 2.0) && Controller != none )
            {
                DECAP = false;
                MonsterController(Controller).ExecuteWhatToDoNext();
            }
        }
    
        if ( BileCount > 0 && NextBileTime<level.TimeSeconds )
        {
            --BileCount;
            NextBileTime+=BileFrequency;
            TakeBileDamage();
        }
    
        if( bZapped && Role == ROLE_Authority )
        {
            RemainingZap -= DeltaTime;
    
            if( RemainingZap <= 0 )
            {
                RemainingZap = 0;
                bZapped = False;
                ZappedBy = none;
                // The Zed can take more zap each time they get zapped
                ZapThreshold *= ZapResistanceScale;
            }
        }
    
        if( !bZapped && TotalZap > 0 && ((Level.TimeSeconds - LastZapTime) > 0.1)  )
        {
            TotalZap -= DeltaTime;
        }
    
        if( bZapped != bOldZapped )
        {
            if( bZapped )
            {
                SetZappedBehavior();
            }
            else
            {
                UnSetZappedBehavior();
            }
    
            bOldZapped = bZapped;
        }
    
        if( bHarpoonStunned != bOldHarpoonStunned )
        {
            if( bHarpoonStunned )
            {
                SetBurningBehavior();
            }
            else
            {
                UnSetBurningBehavior();
            }
    
            bOldHarpoonStunned = bHarpoonStunned;
        }
    }
    
    defaultproperties
    {
         BleedOutDuration=0.000000
    }

    Код:
    class DamTypeBleedOutStalker extends KFWeaponDamageType;
    
    static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed )
    {
        if( Killed.IsA('ZombieStalker') )
            KFStatsAndAchievements.AddStalkerKill();
    }
    
    defaultproperties
    {
         DeathString="%o bleed out."
         bLocationalHit=False
    }

    UPD. Реализовал через NetDamage, правда теперь нужно правильно учитывать индекс пушки. Дальше справлюсь сам.
     
    Последнее редактирование: 21 дек 2016
  15. Essence

    Essence Бандит

    Доброго времени суток.

    Есть такой код:
    Код:
    Strip
    

    ̶Н̶о̶ ̶и̶н̶о̶г̶д̶а̶ ̶п̶о̶ч̶е̶м̶у̶-̶т̶о̶ ̶с̶п̶а̶в̶н̶и̶т̶с̶я̶ ̶2̶ ̶П̶а̶т̶р̶и̶а̶р̶х̶а̶,̶ ̶а̶ ̶Г̶а̶н̶с̶а̶ ̶н̶е̶т̶.̶
    ̶Ч̶т̶о̶ ̶м̶о̶ж̶е̶т̶ ̶б̶ы̶т̶ь̶ ̶э̶т̶о̶м̶у̶ ̶п̶р̶и̶ч̶и̶н̶о̶й̶ ̶и̶ ̶к̶а̶к̶ ̶э̶т̶о̶ ̶и̶с̶п̶р̶а̶в̶и̶т̶ь̶?̶
    UPD. Кажется, нашёл ошибку.
     
    Последнее редактирование: 6 янв 2017
  16. douradu

    douradu Соучастник

    кто-то не могли бы вы мне помочь?

    У меня есть serverperk и мутатор interfece красивой HUD
    но так как я не знаю (уже пробовали в различных учебных пособий) добавить бонус для новых видов оружия, я ScrnBalanceSrv-v8-21 использование.

    Проблема заключается в следующем:
    когда я использую только serverperk и новый интерфейс HUD выглядит следующим образом:
    Sem título.png

    но когда они обеспечить использование ScrnBalanceSrv-v8-21, добавьте красивый интерфейс HUD:
    Sem títuljo.png

    как я могу получить интерфейс Saja HUD совместимый с ScrnBalanceSrv-v8-21?
     
  17. Фрэгл

    Фрэгл Administrator

    Наложить один худ на другой,заменить детали одного-другим...Этим вроде бы никто раньше не занимался,или я не так понял?
     
  18. Arckon.

    Arckon. Соучастник

    Автор данного творения Skell. На данный момент, насколько мне известно, он не занимается текущей разработкой.
    Ссылка на TWI.
    Cсылка на обзор HUD.
    В его мутаторе имеется файл конфигурации, который можно грамотно настроить под себя.
     
    Фрэгл нравится это.
  19. douradu

    douradu Соучастник

  20. RaideN111

    RaideN111 Игровая Администрация

    А есть у кого-нибудь файлы этого мода? На форуме трипов битые ссылки