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

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

  1. STaJIKeR

    STaJIKeR Капо

    Собрать собрал, но не работает...

    Код:
    struct Vip
    {
        var config string PlayerName;        //Имя игрока, добавленно для удобства
        var config string PlayerID;            //ID игрока
        var config string Skin;                //скин игрока
        var config string PerkIndex;        //Индекс перка (Решил перейти к ней, тк мне проще с ней работать).
        var config string SpecialWeapon;    //Оружие, которое выдаем игроку
        var float ExpMult;                    //Даем игроку Х-кач
    };
    
    var BoostRules RulesMod; //Ссылаемся на наши правила выдачи опыта
    var() globalconfig float ExpMult; //Глабальный конфиг опыта
    var() globalconfig byte Exp4All; //Опыт для всех
    var() globalconfig array<string> ComDam; //Типы урона
    var() globalconfig array<string> SSDam; //Типы урона
    var() globalconfig array<string> ZerkDam; //Типы урона
    var() globalconfig array<string> DemoDam; //Типы урона
    var() globalconfig array<string> FireDam; //Типы урона
    var() globalconfig array<string> SupDam; //Типы урона
    var() globalconfig array<Vip> VipList; //Глабальный конфиг випов
    var array<PlayerController> PendingPlayers;
    var config float TimerPeriod;
    var float TickTime;

    Возможно неправильно собрал?
     
  2. Essence

    Essence Солдат

    Да не, это я не так поправил состояние
    Убрал нахер этот Begin, он меня заколебал
    Протестировал на выделенке дважды - всё окей
    Код:
    state HuntForHeal
    {
        function bool CanSpeedAdjust()
        {
            return false;
        }
    
        function bool ShouldChargeFromDamage()
        {
            return false;
        }
    
        function BeginState()
        {
            bChargingPlayer=True;
            if(Level.NetMode!=NM_DedicatedServer)
                PostNetReceive();
            SetGroundSpeed(OriginalGroundSpeed * 3.0);
            Acceleration=vect(0,0,0);
        }
    
        function EndState()
        {
            SetGroundSpeed(GetOriginalGroundSpeed());
            bChargingPlayer=False;
            ChargeDamage=0;
            if(Level.NetMode!=NM_DedicatedServer)
                PostNetReceive();
    
            bImmuned=false;
            bDrain=false;
        }
    
        function Tick(float Delta)
        {
            if(!bChargingPlayer)
            {
                bChargingPlayer=true;
                if(Level.NetMode!=NM_DedicatedServer)
                    PostNetReceive();
            }
    
            // Zapping slows him down, but doesn't stop him
            if(bZapped)
                SetGroundSpeed(OriginalGroundSpeed * 2.0);
            else
                SetGroundSpeed(OriginalGroundSpeed * 3.0);
           
            Global.Tick(Delta);
        }
    
        function Timer()
        {
            GoToState('');
        }
    
        //more space between us
        function bool IsCloseEnuf(Actor A)
        {
            local vector V;
    
            if(A==None)
                Return False;
            V=A.Location-Location;
            if(Abs(V.Z)>(CollisionHeight+A.CollisionHeight))
                Return False;
            V.Z=0;
            Return(VSize(V)<(CollisionRadius+A.CollisionRadius+50));
        }
    
        function RangedAttack(Actor A)
        {
            local vector loc;
            local InvPat IP;
            local KFHumanPawn HealPawn;
    
            if(IsCloseEnuf(A)&& !bDrain)
            {
                bDrain=True;
                HealPawn=KFHumanPawn(A);
                bShotAnim=true;
                Controller.MoveTarget=None;
                Acceleration=vect(0,0,0);
                SetAnimAction('Heal');
                loc=HealPawn.Location;
                loc.Z+=30;
                HealPawn.Controller.SetRotation(Rotator(Location-HealPawn.Location));
                IP=HealPawn.Spawn(class'InvPat', HealPawn,,,rot(0,0,0));
                IP.GiveTo(HealPawn);
                IP.InitTimer(5);
                HealPawn.DisableMovement(GetAnimDuration('Heal'));
                SetTimer(GetAnimDuration('Heal'), False);
            }
        }
    }
     
    RaideN- нравится это.
  3. Essence

    Essence Солдат

    Выводи логи или кидай весь код. По переменным тут никто не гадает.
     
  4. STaJIKeR

    STaJIKeR Капо

    Скинул в ЛС
     
  5. RaideN-

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

    Да, спасибо! Теперь стреляет)
     
  6. STaJIKeR

    STaJIKeR Капо

    Делал тут систему випов, назрел вопрос:
    Неужто нету другого принципа работы? А то проверка каждой пули что-то уж больно сильно грузит систему... Особенно сапорт и подрывник... Молчу уже об огнике...

    Или как альтернатива выдачи пушки с увеличенной статистикой?
     
  7. Essence

    Essence Солдат

    Есть. Через SP на этапе зачисления опыта в стату.
     
  8. STaJIKeR

    STaJIKeR Капо

    Отложу данную манипуляцию на потом...

    Интересует вот что:

    Код:
    static function string GetCustomLevelInfo( byte Level )
    {
        ...
       //Возможно ли здесь добавить наши переменные, которые будут отображаться на определенных уровня.
      // Например оружие, мол с такого по такое, ты бегаешь с ведром, на таком по таком с лопаткой?
        ...
    }
     
  9. RaideN-

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

    Как вариант это х-кач. Ну или как у меня отдельный ВИП перк.
     
  10. STaJIKeR

    STaJIKeR Капо

    Не не не... ты не понял, обычный перк, только например вы ресаетесь с такой то пушкой и типо критерии по каким лвл это показывает....
     
  11. RaideN-

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

    Эмм... чет не понял... Типа описание перка со всеми бонусами?
     
  12. Essence

    Essence Солдат

    Да, можно.
     
  13. STaJIKeR

    STaJIKeR Капо

    Ну что-то в этом роде, Типо до этого лвл вы ресаетесь с ведром, после с лопаткой, расписывать не вариант, перков пзд...
     
  14. mantis

    mantis Соучастник

    Подскажите как можно получить название текущего класса (в коде). Знаю есть class.outer.name но это актуально на целый пакет а не на конкретный класс.
     
  15. Flame

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

    Ну self - ссылка на объект
    Self.Class - на класс
    Self.Class.Name - небось)
     
    mantis и Essence нравится это.
  16. mantis

    mantis Соучастник

    Спасибо! еще вопрос
    В каких случаях нужно вызывать Destroyed() в PostBeginPlay или Timer, а также super.PostBeginPlay();
     
  17. Flame

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

    А зачем тебе вызывать Destroyed()? )
    А super.PostBeginPlay(); всегда пиши. В классе мутатора то не надо, но привыкнешь не писать и забудешь написать там, где эт важно)
     
  18. STaJIKeR

    STaJIKeR Капо

    Приветсвтую!
    Интересует как влияет функция "abstract"

    Код:
    class DamTypeCrossbow extends KFProjectileWeaponDamageType;
    И ниже пример ее использования

    Код:
    class DamTypeCrossbowHeadShot extends DamTypeCrossbow
        abstract;
     
  19. Flame

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

    Не функция, а ключевое слово)
    Нельзя создавать объекты, если их класс абстрактный
    В общем не забивай голову)
    Например, тип урона он абстрактный, ибо не создаётся объект класса DamTypeCrossbow
     
  20. STaJIKeR

    STaJIKeR Капо

    Хорошо, постараюсь...
    Вопрос насчет Beretta96FS.
    Добавил на сервер, прописал свой DamType (Взят с дигла):

    Код:
    class DamTypeBeretta96FSDT extends KFProjectileWeaponDamageType
        abstract;
    
    defaultproperties
    {
        WeaponClass=Class'Beretta96FSDT'
        HeadShotDamageMult=1.500000
        DeathString="%k killed %o (Beretta 96 FSDT)."
        FemaleSuicide="%o shot herself in the foot."
        MaleSuicide="%o shot himself in the foot."
        bBulletHit=True
        FlashFog=(X=600.000000)
        //KDamageImpulse=9500.000000
        VehicleDamageScaling=0.800000
        bIsPowerWeapon=false
        bSniperWeapon=true // Used to track Sharpshooter Headshot Kills
    
        // Make this bullet move the ragdoll when its shot
        bRagdollBullet=true
        KDamageImpulse=4500
        KDeathVel=200.000000
        KDeathUpKick=20
    }

    В Fire классе поменял:
    Код:
    DamageType=Class'DamTypeBeretta96FSDT'

    При стрельбе с глушителем ругается на каждый выстрел вот так:

    Код:
    Beretta96FSDTFire KF-Farm.Beretta96FSDT.Beretta96FSDTFire1 (Function ServerPerksP.Beretta96FSDTFire.DoTrace:036D) Attempt to assign variable through None

    Код:
    class Beretta96FSDTFire extends KFFire;
    
    var()        sound            FireSoundSil;
    var()        class<Emitter>    FlashEmitterClassS;
    var()        Emitter            FlashEmitterS;
    var()        name            FireAimedEmptyAnim;
    var()        name            FireEmptyAnim;
    var()        float                DamageMaxS;
    
    event ModeDoFire()
    {
        Super.ModeDoFire();
        InitEffects();
    }
    
    simulated function InitEffects()
    {
        // don't even spawn on server
        if(Level.NetMode == NM_DedicatedServer || AIController(Instigator.Controller) != None)
            return;
        //Log("Fire.InitEffects.0"@Weapon@Beretta96FSDT(Weapon).bSilencerOn);
        if (Beretta96FSDT(Weapon).bSilencerOn)
        {
            if(FlashEmitterClassS != None && (FlashEmitterS == None || FlashEmitterS.bDeleteMe))
            {
                FlashEmitterS = Weapon.Spawn(FlashEmitterClassS);
                Weapon.AttachToBone(FlashEmitterS, Beretta96FSDT(Weapon).altFlashBoneName);
            }
        }
        else
        {
            if(FlashEmitterClass != None && (FlashEmitter == None || FlashEmitter.bDeleteMe))
            {
                FlashEmitter = Weapon.Spawn(FlashEmitterClass);
                Weapon.AttachToBone(FlashEmitter, KFWeapon(Weapon).FlashBoneName);
            }
        }
        if(SmokeEmitterClass != None && (SmokeEmitter == None || SmokeEmitter.bDeleteMe))
        {
            SmokeEmitter = Weapon.Spawn(SmokeEmitterClass);
        }
          
        if(ShellEjectClass != None && (ShellEjectEmitter == None || ShellEjectEmitter.bDeleteMe))
        {
            ShellEjectEmitter = Weapon.Spawn(ShellEjectClass);
            Weapon.AttachToBone(ShellEjectEmitter, ShellEjectBoneName);
        }
    
    }
    
    function DrawMuzzleFlash(Canvas Canvas)
    {
        // Draw smoke first
    
        if (SmokeEmitter != None && SmokeEmitter.Base != Weapon)
        {
            SmokeEmitter.SetLocation( Weapon.GetEffectStart() );
            Canvas.DrawActor( SmokeEmitter, false, false, Weapon.DisplayFOV );
        }
        //Log("Fire.DrawMuzzleFlash.0"@Weapon@Beretta96FSDT(Weapon).bSilencerOn);
        if (Beretta96FSDT(Weapon).bSilencerOn)
        {
            if (FlashEmitterS != None && FlashEmitterS.Base != Weapon)
            {
                FlashEmitterS.SetLocation( Weapon.GetEffectStart() );
                Canvas.DrawActor( FlashEmitter, false, false, Weapon.DisplayFOV );
            }
        }
        else
        {
            if (FlashEmitter != None && FlashEmitter.Base != Weapon)
            {
                FlashEmitter.SetLocation( Weapon.GetEffectStart() );
                Canvas.DrawActor( FlashEmitter, false, false, Weapon.DisplayFOV );
            }
        }
        //    super.DrawMuzzleFlash(Canvas);
    }
    
    function FlashMuzzleFlash()
    {
        //Log("Fire.FlashMuzzleFlash.0"@Weapon@Beretta96FSDT(Weapon).bSilencerOn);
        if (Beretta96FSDT(Weapon).bSilencerOn)
        {
            if (FlashEmitterS != None)
                FlashEmitterS.Trigger(Weapon, Instigator);
        }
        else
        {
            if (FlashEmitter != None)
                FlashEmitter.Trigger(Weapon, Instigator);
        }
        if (ShellEjectEmitter != None)
        {
            //ShellEjectEmitter.SpawnParticle(1);//Trigger(Weapon, Instigator);
            ShellEjectEmitter.Trigger(Weapon, Instigator);
        }
        //    super.FlashMuzzleFlash();
    }
    
    simulated function DestroyEffects()
    {
        super.DestroyEffects();
        if(FlashEmitterS != None)
            FlashEmitterS.Destroy();
    }
    
    function PlayFiring()
    {
        local float RandPitch;
        if ( Weapon.Mesh != None )
        {
            if ( FireCount > 0 )
            {
                if( KFWeap.bAimingRifle )
                {
                    if ( Weapon.HasAnim(FireLoopAimedAnim) )
                    {
                        Weapon.PlayAnim(FireLoopAimedAnim, FireLoopAnimRate, 0.0);
                    }
                    else if( Weapon.HasAnim(FireAimedAnim) )
                    {
                        if(KFWeapon(Weapon).MagAmmoRemaining>0)
                            Weapon.PlayAnim(FireAimedAnim, FireAnimRate, TweenTime);
                        else Weapon.PlayAnim(FireAimedEmptyAnim, FireAnimRate, TweenTime);
                    }
                    else
                    {
                        if(KFWeapon(Weapon).MagAmmoRemaining>0)
                            Weapon.PlayAnim(FireAnim, FireAnimRate, TweenTime);
                        else Weapon.PlayAnim(FireEmptyAnim, FireAnimRate, TweenTime);
                    }
                }
                else
                {
                    if ( Weapon.HasAnim(FireLoopAnim) )
                    {
                        Weapon.PlayAnim(FireLoopAnim, FireLoopAnimRate, 0.0);
                    }
                    else
                    {
                        if(KFWeapon(Weapon).MagAmmoRemaining>0)
                            Weapon.PlayAnim(FireAnim, FireAnimRate, TweenTime);
                        else Weapon.PlayAnim(FireEmptyAnim, FireAnimRate, TweenTime);
                    }
                }
            }
            else
            {
                if( KFWeap.bAimingRifle )
                {
                    if( Weapon.HasAnim(FireAimedAnim) )
                    {
                        if(Beretta96FSDT(Weapon).ClientMagAmmoRemaining>0)
                            Weapon.PlayAnim(FireAimedAnim, FireAnimRate, TweenTime);
                        else Weapon.PlayAnim(FireAimedEmptyAnim, FireAnimRate, TweenTime);
                    }
                    else
                    {
                        if(Beretta96FSDT(Weapon).ClientMagAmmoRemaining>0)
                            Weapon.PlayAnim(FireAnim, FireAnimRate, TweenTime);
                        else  Weapon.PlayAnim(FireEmptyAnim, FireAnimRate, TweenTime);
                    }
                }
                else
                {
                    if(Beretta96FSDT(Weapon).ClientMagAmmoRemaining>0)
                        Weapon.PlayAnim(FireAnim, FireAnimRate, TweenTime);
                    else
                        Weapon.PlayAnim(FireEmptyAnim, FireAnimRate, TweenTime);
                }
            }
        }
    
        if( Weapon.Instigator != none && Weapon.Instigator.IsLocallyControlled() &&
        Weapon.Instigator.IsFirstPerson() && StereoFireSound != none )
        {
            if( bRandomPitchFireSound )
            {
                RandPitch = FRand() * RandomPitchAdjustAmt;
    
                if( FRand() < 0.5 )
                {
                    RandPitch *= -1.0;
                }
            }
    
            if(!Beretta96FSDT(Weapon).bSilencerOn)
                Weapon.PlayOwnedSound(StereoFireSound,SLOT_Interact,TransientSoundVolume * 0.85,,TransientSoundRadius,(1.0 + RandPitch),false);
            else
                Weapon.PlayOwnedSound(FireSoundSil,SLOT_Interact,TransientSoundVolume * 0.85,,TransientSoundRadius,(1.0 + RandPitch),false);
        }
        else
        {
            if( bRandomPitchFireSound )
            {
                RandPitch = FRand() * RandomPitchAdjustAmt;
                if( FRand() < 0.5 )
                {
                    RandPitch *= -1.0;
                }
            }
            if(!Beretta96FSDT(Weapon).bSilencerOn)
                Weapon.PlayOwnedSound(FireSound,SLOT_Interact,TransientSoundVolume,,TransientSoundRadius,(1.0 + RandPitch),false);
            else
                Weapon.PlayOwnedSound(FireSoundSil,SLOT_Interact,TransientSoundVolume,,TransientSoundRadius,(1.0 + RandPitch),false);
        }
        ClientPlayForceFeedback(FireForce);  // jdf
        FireCount++;
    }
    
    function ServerPlayFiring()
    {
        if(!Beretta96FSDT(Weapon).bSilencerOn)
            Weapon.PlayOwnedSound(FireSound,SLOT_Interact,TransientSoundVolume,,TransientSoundRadius,,false);
        else
            Weapon.PlayOwnedSound(FireSoundSil,SLOT_Interact,TransientSoundVolume,,TransientSoundRadius,,false);
    }
    
    simulated function bool AllowFire()
    {
        if(Beretta96FSDT(Weapon).bSilencerSwitch)
            return false;
        if(KFWeapon(Weapon).bIsReloading)
            return false;
        if(KFPawn(Instigator).SecondaryItem!=none)
            return false;
        if(KFPawn(Instigator).bThrowingNade)
            return false;
        //ƒелаем отдельные счЄтчики дл¤ сервера и клиента
        if(Level.NetMode == NM_DedicatedServer)
        {
            if(KFWeapon(Weapon).MagAmmoRemaining < 1)
            {
                if( Level.TimeSeconds - LastClickTime>FireRate )
                    LastClickTime = Level.TimeSeconds;
                if( AIController(Instigator.Controller)!=None )
                    KFWeapon(Weapon).ReloadMeNow();
                return false;
            }
        }
        else
        {
            if(Beretta96FSDT(Weapon).ClientMagAmmoRemaining<0)
            {
                if( Level.TimeSeconds - LastClickTime>FireRate )
                    LastClickTime = Level.TimeSeconds;
                if( AIController(Instigator.Controller)!=None )
                    KFWeapon(Weapon).ReloadMeNow();
                return false;
            }
        }
        return super(WeaponFire).AllowFire();
    }
    
    function StartBerserk()
    {
        DamageMin = default.DamageMin * 1.33;
        DamageMax = default.DamageMax * 1.33;
    }
    
    function StopBerserk()
    {
        DamageMin = default.DamageMin;
        DamageMax = default.DamageMax;
    }
    
    function StartSuperBerserk();
    
    function DoTrace(Vector Start, Rotator Dir)
    {
        local Vector X,Y,Z, End, HitLocation, HitNormal, ArcEnd;
        local Actor Other;
        local KFWeaponAttachment WeapAttach;
        local array<int>    HitPoints;
        local KFPawn HitPawn;
      
        //Flame
        local Pawn StoreEnemy;
        local KFMonster Victim;
        local int myDamage;
        //
        MaxRange();
    
        Weapon.GetViewAxes(X, Y, Z);
        if ( Weapon.WeaponCentered() )
            ArcEnd = (Instigator.Location + Weapon.EffectOffset.X * X + 1.5 * Weapon.EffectOffset.Z * Z);
        else ArcEnd = (Instigator.Location + Instigator.CalcDrawOffset(Weapon) + Weapon.EffectOffset.X * X + Weapon.Hand * Weapon.EffectOffset.Y * Y +
            Weapon.EffectOffset.Z * Z);
    
        X = Vector(Dir);
        End = Start + TraceRange * X;
        Other = Instigator.HitPointTrace(HitLocation, HitNormal, End, HitPoints, Start,, 1);
    
        if ( Other != None && Other != Instigator && Other.Base != Instigator )
        {
            WeapAttach = KFWeaponAttachment(Weapon.ThirdPersonActor);
    
            if ( !Other.bWorldGeometry )
            {
                // Update hit effect except for pawns
                if ( !Other.IsA('Pawn') && !Other.IsA('HitScanBlockingVolume') &&
                    !Other.IsA('ExtendedZCollision') )
                {
                    if( WeapAttach!=None )
                    {
                        WeapAttach.UpdateHit(Other, HitLocation, HitNormal);
                    }
                }
                HitPawn = KFPawn(Other);
              
                //Flame
                if(Beretta96FSDT(Weapon).bSilencerOn)
                    myDamage=default.DamageMaxS;
                else
                    myDamage=default.DamageMax;
                //
                if ( HitPawn != none )
                {
                    // Hit detection debugging
                    /*log("PreLaunchTrace hit "$HitPawn.PlayerReplicationInfo.PlayerName);
                    HitPawn.HitStart = Start;
                    HitPawn.HitEnd = End;*/
                    if(!HitPawn.bDeleteMe)
                        HitPawn.ProcessLocationalDamage(myDamage, Instigator, HitLocation, Momentum*X,DamageType,HitPoints);
    
                    // Hit detection debugging
                    /*if( Level.NetMode == NM_Standalone)
                        HitPawn.DrawBoneLocation();*/
                }
                else
                {
                    Victim=KFMonster(Other);
                    if(Victim!=none)
                    {
                        StoreEnemy=Victim.Controller.Enemy;
                        //Log("Victim.0"@Victim.Controller.Enemy.PlayerReplicationInfo.PlayerName);
                        Victim.TakeDamage(myDamage, Instigator, HitLocation, Momentum*X,DamageType);
                        //Log("Victim.1"@Victim.Controller.Enemy.PlayerReplicationInfo.PlayerName);
                        if(Beretta96FSDT(Weapon).bSilencerOn)
                            Victim.Controller.Enemy=StoreEnemy;
                        //Log("Victim.2"@Victim.Controller.Enemy.PlayerReplicationInfo.PlayerName);
                    }
                    else
                    {
                        Victim=KFMonster(Other.Owner);
                        if(Victim!=none)
                        {
                            StoreEnemy=Victim.Controller.Enemy;
                            //Log("Victim.3"@Victim.Controller.Enemy.PlayerReplicationInfo.PlayerName);
                            Victim.TakeDamage(myDamage, Instigator, HitLocation, Momentum*X,DamageType);
                            //Log("Victim.4"@Victim.Controller.Enemy.PlayerReplicationInfo.PlayerName);
                            if(Beretta96FSDT(Weapon).bSilencerOn)
                                Victim.Controller.Enemy=StoreEnemy;
                            //Log("Victim.5"@Victim.Controller.Enemy.PlayerReplicationInfo.PlayerName);
                        }
                        else
                        {
                            Other.TakeDamage(myDamage, Instigator, HitLocation, Momentum*X,DamageType);
                        }
                    }
                }
            }
            else
            {
                HitLocation = HitLocation + 2.0 * HitNormal;
                if ( WeapAttach != None )
                {
                    WeapAttach.UpdateHit(Other,HitLocation,HitNormal);
                }
            }
        }
        else
        {
            HitLocation = End;
            HitNormal = Normal(Start - End);
        }
    }
    
    defaultproperties
    {
        FireAimedEmptyAnim="Fire_Last"
        FireEmptyAnim="Fire_Last"
        FireSoundSil=Sound'DarkSunWP.Beretta96FS_DT_A.Beretta96FS_DT_Snd.FireSilenced';
        FireAimedAnim="Fire_Iron"
        RecoilRate=0.070000
        maxVerticalRecoilAngle=300
        maxHorizontalRecoilAngle=50
        ShellEjectClass=Class'ROEffects.KFShellEject9mm'
        ShellEjectBoneName="Shell_eject"
        bRandomPitchFireSound=False
        StereoFireSoundRef="KF_9MMSnd.9mm_FireST"
        DamageType=Class'DamTypeBeretta96FSDT'
        DamageMax=60
        DamageMaxS=45
        Momentum=10000.000000
        bPawnRapidFireAnim=True
        bWaitForRelease=True
        bAttachSmokeEmitter=True
        TransientSoundVolume=1.800000
        FireAnimRate=1.500000
        TweenTime=0.025000
        FireSound=Sound'DarkSunWP.Beretta96FS_DT_A.Beretta96FS_DT_Snd.FireUnsilenced'
        NoAmmoSound=Sound'KF_9MMSnd.9mm_DryFire'
        FireForce="AssaultRifleFire"
        FireRate=0.175000
        AmmoClass=Class'Beretta96FSDTAmmo'
        AmmoPerFire=1
        ShakeRotMag=(X=75.000000,Y=75.000000,Z=250.000000)
        ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000)
        ShakeRotTime=3.000000
        ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=10.000000)
        ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000)
        ShakeOffsetTime=2.000000
        BotRefireRate=0.350000
        FlashEmitterClass=Class'Beretta96FSDTMuzzleFlash'
        FlashEmitterClassS=Class'Beretta96FSDTMuzzleFlashS'
        aimerror=30.000000
        Spread=0.015000
        SpreadStyle=SS_Random
    }
    

    Более ничего не менял.

    Класс Beretta96FSDTFire1 отсутсвтует.
    2018-03-18_00-21-57.png
     
    Последнее редактирование: 18 мар 2018