SlotMachine

Тема в разделе "Общего назначения", создана пользователем F4TAL1ST, 17 окт 2010.

  1. MARYhuANNA

    MARYhuANNA Соучастник

    Доброго времени суток! Подскажите, как правильно добавить свои карточки? Например: выпадение краулеров, сталкеров, скрейков!
    Добавляю их таким же образом, как и клота, блоата, сирены и флешки.
    При завершении компиляции сообщает об ошибке:

    Analizing...
    Error: Script vs. class name mismatch (ScrakeMessege/ScrakeMessage)
    Error: Script vs. class name mismatch (StalkerMessege/StalkerMessage)
    Log: Parsing MutSlotMachine
    Log: Compile aborted due to errors.
    Log: Failure - 2 error(s), 0 warning(s)
     
    Flame нравится это.
  2. Flame

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

    Ну сообщает, что класс называется ScrakeMessage
    А файл ScrakeMessege
    Ну или наоборот - лень думать )
     
  3. MARYhuANNA

    MARYhuANNA Соучастник

    Благодарю Вас за подсказку! Ну, как всегда =))) Ошибка в одной буковке...!
    Спасибо большое!

    Поставил в рулетку краулеров! При совпадении комбинации, выпадает 10 маленьких гнусных паучков.
    Продолжительность жизни игрока в этой ситуации 1-2 секунды! Так как они всей кучей сразу атакуют! Мгновение - и ты весь в пауках!
    Без поддержки товарища тут ни как не обойтись! Здорово подбодряет совпадение этой комбинации!

    Еще раз благодарю!

    С уважением, Вячеслав.
     
    Фрэгл и ЛОХМАТЫЙ нравится это.
  4. Сеня

    Сеня Соучастник

    подскажите,как создать свою карту,например маленького патрика..
     
  5. AkycTuk

    AkycTuk Бандит

    Это кусочек из рулетки ртд. буду дома можно впринципе и для однорукого бандита сделать?
    Код:
    // Zombie Monster for KF Invasion gametype
    class RTDMiniBossChar extends KFMonster;
    #exec OBJ LOAD FILE=KFPatch2.utx
    #exec OBJ LOAD FILE=KF_Specimens_Trip_T.utx
    var bool bChargingPlayer,bClientCharg,bFireAtWill,bMinigunning,bIsBossView;
    var float RageStartTime,LastChainGunTime,LastMissileTime,LastSneakedTime;
    var bool bClientMiniGunning;
    var name ChargingAnim;  // How he runs when charging the player.
    var byte SyringeCount,ClientSyrCount;
    var int MGFireCounter;
    var BossHPNeedle CurrentNeedle;
    var vector TraceHitPos;
    var Emitter mTracer,mMuzzleFlash;
    var float LastCheckTimes;
    var int HealingLevels[3],HealingAmount;
    var(Sounds)	 sound   RocketFireSound;	// The sound of the rocket being fired
    var(Sounds)	 sound   MiniGunFireSound;   // The sound of the minigun being fired
    var(Sounds)	 sound   MiniGunSpinSound;   // The sound of the minigun spinning
    var(Sounds)	 sound   MeleeImpaleHitSound;// The sound of melee impale attack hitting the player
    var			 float   MGFireDuration;	 // How long to fire for this burst
    var			 float   MGLostSightTimeout; // When to stop firing because we lost sight of the target
    var()		   float   MGDamage;		   // How much damage the MG will do
    var()		   float   ClawMeleeDamageRange;// How long his arms melee strike is
    var()		   float   ImpaleMeleeDamageRange;// How long his spike melee strike is
    var			 float   LastChargeTime;	 // Last time the patriarch charged
    var			 float   LastForceChargeTime;// Last time patriarch was forced to charge
    var			 int	 NumChargeAttacks;   // Number of attacks this charge
    var			 float   ChargeDamage;	   // How much damage he's taken since the last charge
    var			 float   LastDamageTime;	 // Last Time we took damage
    // Sneaking
    var			 float   SneakStartTime;	 // When did we start sneaking
    replication
    {
    reliable if( Role==ROLE_Authority )
      bChargingPlayer,SyringeCount,TraceHitPos,bMinigunning,bIsBossView;
    }
    // Make the Boss's ambient scale higher, since there is only 1, doesn't matter if he's relevant almost all the time
    simulated function CalcAmbientRelevancyScale()
    {
    		// Make the zed only relevant by thier ambient sound out to a range of 100 meters
    	 CustomAmbientRelevancyScale = 5000/(100 * SoundRadius);
    }
    function ZombieMoan()
    {
    if( !bShotAnim ) // Do not moan while taunting
      Super.ZombieMoan();
    }
    // Speech notifies called from the anims
    function PatriarchKnockDown()
    {
    	PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_KnockedDown', SLOT_Misc, 2.0,true,500.0);
    }
    function PatriarchEntrance()
    {
    	PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_Entrance', SLOT_Misc, 2.0,true,500.0);
    }
    function PatriarchVictory()
    {
    	PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_Victory', SLOT_Misc, 2.0,true,500.0);
    }
    function PatriarchMGPreFire()
    {
    	PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_WarnGun', SLOT_Misc, 2.0,true,1000.0);
    }
    function PatriarchMisslePreFire()
    {
    	PlaySound(SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_WarnRocket', SLOT_Misc, 2.0,true,1000.0);
    }
    simulated function Tick(float DeltaTime)
    {
    Super.Tick(DeltaTime);
    if( Level.NetMode==NM_DedicatedServer )
      Return; // Servers aren't intrested in this info.
    bSpecialCalcView = bIsBossView;
    }
    
    //-----------------------------------------------------------------------------
    // PostBeginPlay
    //-----------------------------------------------------------------------------
    simulated function PostBeginPlay()
    {
    	super.PostBeginPlay();
    	if( Role < ROLE_Authority )
    	{
    		return;
    	}
    // Difficulty Scaling
    if (Level.Game != none)
    {
    		//log(self$" Beginning ground speed "$default.GroundSpeed);
    		// If you are playing by yourself,  reduce the MG damage
    		if( Level.Game.NumPlayers == 1 )
    		{
    			if( Level.Game.GameDifficulty < 2.0 )
    			{
    				MGDamage = default.MGDamage * 0.375;
    			}
    			else if( Level.Game.GameDifficulty < 4.0 )
    			{
    				MGDamage = default.MGDamage * 0.75;
    			}
    			else if( Level.Game.GameDifficulty < 7.0 )
    			{
    				MGDamage = default.MGDamage * 1.15;
    			}
    			else // Hardest difficulty
    			{
    				MGDamage = default.MGDamage * 1.3;
    			}
    		}
    		else
    		{
    			if( Level.Game.GameDifficulty < 2.0 )
    			{
    				MGDamage = default.MGDamage * 0.375;
    			}
    			else if( Level.Game.GameDifficulty < 4.0 )
    			{
    				MGDamage = default.MGDamage * 1.0;
    			}
    			else if( Level.Game.GameDifficulty < 7.0 )
    			{
    				MGDamage = default.MGDamage * 1.15;
    			}
    			else // Hardest difficulty
    			{
    				MGDamage = default.MGDamage * 1.3;
    			}
    		}
    }
    HealingLevels[0] = Health/1.25; // Around 5600 HP
    HealingLevels[1] = Health/2.f; // Around 3500 HP
    HealingLevels[2] = Health/3.2; // Around 2187 HP
    // log("Health = "$Health);
    // log("HealingLevels[0] = "$HealingLevels[0]);
    // log("HealingLevels[1] = "$HealingLevels[1]);
    // log("HealingLevels[2] = "$HealingLevels[2]);
    HealingAmount = Health/4; // 1750 HP
    // log("HealingAmount = "$HealingAmount);
    }
    function bool MakeGrandEntry()
    {
    bShotAnim = true;
    Acceleration = vect(0,0,0);
    SetAnimAction('Entrance');
    HandleWaitForAnim('Entrance');
    return True;
    }
    simulated function Destroyed()
    {
    if( mTracer!=None )
      mTracer.Destroy();
    if( mMuzzleFlash!=None )
      mMuzzleFlash.Destroy();
    Super.Destroyed();
    }
    simulated Function PostNetBeginPlay()
    {
    EnableChannelNotify ( 1,1);
    AnimBlendParams(1, 1.0, 0.0,, SpineBone1);
    super.PostNetBeginPlay();
    TraceHitPos = vect(0,0,0);
    bNetNotify = True;
    }
    function PlayTakeHit(vector HitLocation, int Damage, class<DamageType> DamageType)
    {
    if( Level.TimeSeconds - LastPainAnim < MinTimeBetweenPainAnims )
      return;
    if( Damage>=150 || (DamageType.name=='DamTypeStunNade' && rand(5)>3) || (DamageType.name=='DamTypeCrossbowHeadshot' && Damage>=200) )
      PlayDirectionalHit(HitLocation);
    LastPainAnim = Level.TimeSeconds;
    if( Level.TimeSeconds - LastPainSound < MinTimeBetweenPainSounds )
      return;
    LastPainSound = Level.TimeSeconds;
    PlaySound(HitSound[0], SLOT_Pain,2*TransientSoundVolume,,400);
    }
    function bool OnlyEnemyAround( Pawn Other )
    {
    local Controller C;
    For( C=Level.ControllerList; C!=None; C=C.NextController )
    {
      if( C.bIsPlayer && C.Pawn!=None && C.Pawn!=Other && ((VSize(C.Pawn.Location-Location)<1500 && FastTrace(C.Pawn.Location,Location))
       || (VSize(C.Pawn.Location-Other.Location)<1000 && FastTrace(C.Pawn.Location,Other.Location))) )
       Return False;
    }
    Return True;
    }
    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+25));
    }
    function RangedAttack(Actor A)
    {
    local float D;
    local bool bOnlyE;
    	local bool bDesireChainGun;
    	// Randomly make him want to chaingun more
    	if( Controller.LineOfSightTo(A) && FRand() < 0.15 && LastChainGunTime<Level.TimeSeconds )
    	{
    		bDesireChainGun = true;
    	}
    if ( bShotAnim )
      return;
    D = VSize(A.Location-Location);
    bOnlyE = (Pawn(A)!=None && OnlyEnemyAround(Pawn(A)));
    if ( IsCloseEnuf(A) )
    {
      bShotAnim = true;
      if( Health>1500 && Pawn(A)!=None && FRand() < 0.5 )
      {
       SetAnimAction('MeleeImpale');
      }
      else
      {
       SetAnimAction('MeleeClaw');
       //PlaySound(sound'Claw2s', SLOT_None); KFTODO: Replace this
      }
    }
    else if( Level.TimeSeconds - LastSneakedTime > 20.0 )
    {
      if( FRand() < 0.3 )
      {
    	  // Wait another 20 to try this again
       LastSneakedTime = Level.TimeSeconds;//+FRand()*120;
       Return;
      }
      SetAnimAction('transition');
      GoToState('SneakAround');
    }
    else if( bChargingPlayer && (bOnlyE || D<200) )
      Return;
    else if( !bDesireChainGun && !bChargingPlayer && (D<300 || (D<700 && bOnlyE)) &&
    		(Level.TimeSeconds - LastChargeTime > (5.0 + 5.0 * FRand())) )  // Don't charge again for a few seconds
    {
      SetAnimAction('transition');
      GoToState('Charging');
    }
    else if( LastMissileTime<Level.TimeSeconds && D > 500 )
    {
      if( !Controller.LineOfSightTo(A) || FRand() > 0.75 )
      {
       LastMissileTime = Level.TimeSeconds+FRand() * 5;
       Return;
      }
      LastMissileTime = Level.TimeSeconds + 10 + FRand() * 15;
      bShotAnim = true;
      Acceleration = vect(0,0,0);
      SetAnimAction('PreFireMissile');
      HandleWaitForAnim('PreFireMissile');
      GoToState('FireMissile');
    }
    else if ( !bWaitForAnim && !bShotAnim && LastChainGunTime<Level.TimeSeconds )
    {
      if ( !Controller.LineOfSightTo(A) || FRand()> 0.85 )
      {
       LastChainGunTime = Level.TimeSeconds+FRand()*4;
       Return;
      }
      LastChainGunTime = Level.TimeSeconds + 5 + FRand() * 10;
      bShotAnim = true;
      Acceleration = vect(0,0,0);
      SetAnimAction('PreFireMG');
      HandleWaitForAnim('PreFireMG');
      MGFireCounter =  Rand(60) + 35;
      GoToState('FireChaingun');
    }
    }
    event Bump(actor Other)
    {
    Super(Monster).Bump(Other);
    if( Other==none )
      return;
    if( Other.IsA('NetKActor') && Physics != PHYS_Falling && !bShotAnim && Abs(Other.Location.Z-Location.Z)<(CollisionHeight+Other.CollisionHeight) )
    { // Kill the annoying deco brat.
      Controller.Target = Other;
      Controller.Focus = Other;
      bShotAnim = true;
      Acceleration = (Other.Location-Location);
      SetAnimAction('MeleeClaw');
      //PlaySound(sound'Claw2s', SLOT_None);  KFTODO: Replace this
      HandleWaitForAnim('MeleeClaw');
    }
    }
    simulated function AddTraceHitFX( vector HitPos )
    {
    local vector Start,SpawnVel,SpawnDir;
    local float hitDist;
    Start = GetBoneCoords('tip').Origin;
    if( mTracer==None )
      mTracer = Spawn(Class'KFMod.KFNewTracer',,,Start);
    else mTracer.SetLocation(Start);
    if( mMuzzleFlash==None )
    {
      // KFTODO: Replace this
    		mMuzzleFlash = Spawn(Class'MuzzleFlash3rdMG');
      AttachToBone(mMuzzleFlash, 'tip');
    }
    else mMuzzleFlash.SpawnParticle(1);
    hitDist = VSize(HitPos - Start) - 50.f;
    if( hitDist>10 )
    {
      SpawnDir = Normal(HitPos - Start);
      SpawnVel = SpawnDir * 10000.f;
      mTracer.Emitters[0].StartVelocityRange.X.Min = SpawnVel.X;
      mTracer.Emitters[0].StartVelocityRange.X.Max = SpawnVel.X;
      mTracer.Emitters[0].StartVelocityRange.Y.Min = SpawnVel.Y;
      mTracer.Emitters[0].StartVelocityRange.Y.Max = SpawnVel.Y;
      mTracer.Emitters[0].StartVelocityRange.Z.Min = SpawnVel.Z;
      mTracer.Emitters[0].StartVelocityRange.Z.Max = SpawnVel.Z;
      mTracer.Emitters[0].LifetimeRange.Min = hitDist / 10000.f;
      mTracer.Emitters[0].LifetimeRange.Max = mTracer.Emitters[0].LifetimeRange.Min;
      mTracer.SpawnParticle(1);
    }
    Instigator = Self;
    if( HitPos != vect(0,0,0) )
    {
    		Spawn(class'ROBulletHitEffect',,, HitPos, Rotator(Normal(HitPos - Start)));
    	}
    }
    simulated function AnimEnd( int Channel )
    {
    local name  Sequence;
    local float Frame, Rate;
    if( Level.NetMode==NM_Client && bMinigunning )
    {
    		GetAnimParams( Channel, Sequence, Frame, Rate );
    		if( Sequence != 'PreFireMG' && Sequence != 'FireMG' )
    		{
    			Super.AnimEnd(Channel);
    			return;
    		}
      PlayAnim('FireMG');
      bWaitForAnim = true;
      bShotAnim = true;
      IdleTime = Level.TimeSeconds;
    }
    else Super.AnimEnd(Channel);
    }
    state FireChaingun
    {
    function RangedAttack(Actor A)
    {
      Controller.Target = A;
      Controller.Focus = A;
    }
    	// Chaingun mode handles this itself
    	function bool ShouldChargeFromDamage()
    	{
    		return false;
    	}
    	function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class<DamageType> damageType, optional int HitIndex)
    	{
    	 local float EnemyDistSq, DamagerDistSq;
    		global.TakeDamage(Damage,instigatedBy,hitlocation,vect(0,0,0),damageType);
    		// if someone close up is shooting us, just charge them
    		if( InstigatedBy != none )
    		{
    			DamagerDistSq = VSizeSquared(Location - InstigatedBy.Location);
    			if( (ChargeDamage > 200 && DamagerDistSq < (500 * 500)) || DamagerDistSq < (100 * 100) )
    			{
    				SetAnimAction('transition');
    		  //log("Frak this shizz, Charging!!!!");
    		  GoToState('Charging');
    		  return;
    	  }
    		}
    		if( Controller.Enemy != none && InstigatedBy != none && InstigatedBy != Controller.Enemy )
    		{
    			EnemyDistSq = VSizeSquared(Location - Controller.Enemy.Location);
    			DamagerDistSq = VSizeSquared(Location - InstigatedBy.Location);
    		}
    		if( InstigatedBy != none && (DamagerDistSq < EnemyDistSq || Controller.Enemy == none) )
    		{
    			MonsterController(Controller).ChangeEnemy(InstigatedBy,Controller.CanSee(InstigatedBy));
    			Controller.Target = InstigatedBy;
    	  Controller.Focus = InstigatedBy;
    			if( DamagerDistSq < (500 * 500) )
    			{
    		  SetAnimAction('transition');
    		  GoToState('Charging');
    	  }
    		}
    	}
    function EndState()
    {
    		TraceHitPos = vect(0,0,0);
      bMinigunning = False;
    		AmbientSound = default.AmbientSound;
    		SoundVolume=default.SoundVolume;
    		SoundRadius=default.SoundRadius;
    		MGFireCounter=0;
    		LastChainGunTime = Level.TimeSeconds + 5 + (FRand()*10);
    }
    function BeginState()
    {
    		bFireAtWill = False;
      Acceleration = vect(0,0,0);
      MGLostSightTimeout = 0.0;
      bMinigunning = True;
    }
    function AnimEnd( int Channel )
    {
      if( MGFireCounter <= 0 )
      {
       bShotAnim = true;
       Acceleration = vect(0,0,0);
       SetAnimAction('FireEndMG');
       HandleWaitForAnim('FireEndMG');
       GoToState('');
      }
      else
      {
       if ( Controller.Enemy != none )
       {
    	if ( Controller.LineOfSightTo(Controller.Enemy) && FastTrace(GetBoneCoords('tip').Origin,Controller.Enemy.Location))
    	{
    	 MGLostSightTimeout = 0.0;
    					Controller.Focus = Controller.Enemy;
    	 Controller.FocalPoint = Controller.Enemy.Location;
    	}
    	else
    				{
    					MGLostSightTimeout = Level.TimeSeconds + (0.25 + FRand() * 0.35);
    					Controller.Focus = None;
    				}
    	Controller.Target = Controller.Enemy;
       }
       else
       {
    				MGLostSightTimeout = Level.TimeSeconds + (0.25 + FRand() * 0.35);
    				Controller.Focus = None;
       }
       if( !bFireAtWill )
       {
    				MGFireDuration = Level.TimeSeconds + (0.75 + FRand() * 0.5);
       }
       else if ( FRand() < 0.03 && Controller.Enemy != none && PlayerController(Controller.Enemy.Controller) != none )
       {
    	// Randomly send out a message about Patriarch shooting chain gun(3% chance)
    	PlayerController(Controller.Enemy.Controller).Speech('AUTO', 9, "");
       }
       bFireAtWill = True;
       bShotAnim = true;
       Acceleration = vect(0,0,0);
       SetAnimAction('FireMG');
       bWaitForAnim = true;
      }
    }
    function FireMGShot()
    {
      local vector Start,End,HL,HN,Dir;
      local rotator R;
      local Actor A;
      MGFireCounter--;
    		if( AmbientSound != MiniGunFireSound )
    		{
    			SoundVolume=255;
    			SoundRadius=400;
    			AmbientSound = MiniGunFireSound;
    		}
      Start = GetBoneCoords('tip').Origin;
      if( Controller.Focus!=None )
       R = rotator(Controller.Focus.Location-Start);
      else R = rotator(Controller.FocalPoint-Start);
      if( NeedToTurnFor(R) )
       R = Rotation;
      // KFTODO: Maybe scale this accuracy by his skill or the game difficulty
      Dir = Normal(vector(R)+VRand()*0.02); //*0.04
      End = Start+Dir*40000;
    				bBlockHitPointTraces = false;
      A = Trace(HL,HN,End,Start,True);
      if( A==None )
       Return;
    				TraceHitPos = HL;
    				if( Level.NetMode!=NM_DedicatedServer )
       AddTraceHitFX(HL);
      if( A!=Level )
      {
    		 A.TakeDamage(MGDamage+Rand(3),Self,HL,Dir*500,Class'DamageType');
      }
    }
    function bool NeedToTurnFor( rotator targ )
    {
      local int YawErr;
      targ.Yaw = DesiredRotation.Yaw & 65535;
      YawErr = (targ.Yaw - (Rotation.Yaw & 65535)) & 65535;
      return !((YawErr < 2000) || (YawErr > 64535));
    }
    Begin:
    While( True )
    {
      Acceleration = vect(0,0,0);
    		if( MGLostSightTimeout > 0 && Level.TimeSeconds > MGLostSightTimeout )
    		{
    			bShotAnim = true;
       Acceleration = vect(0,0,0);
       SetAnimAction('FireEndMG');
       HandleWaitForAnim('FireEndMG');
       GoToState('');
    		}
      if( MGFireCounter <= 0 )
      {
       bShotAnim = true;
       Acceleration = vect(0,0,0);
       SetAnimAction('FireEndMG');
       HandleWaitForAnim('FireEndMG');
       GoToState('');
      }
      // Give some randomness to the patriarch's firing
      if( Level.TimeSeconds > MGFireDuration )
      {
    			if( AmbientSound != MiniGunSpinSound )
    			{
    				SoundVolume=185;
    				SoundRadius=200;
    				AmbientSound = MiniGunSpinSound;
    			}
    			Sleep(0.5 + FRand() * 0.75);
    			MGFireDuration = Level.TimeSeconds + (0.75 + FRand() * 0.5);
      }
      else
      {
    			if( bFireAtWill )
    	   FireMGShot();
    	  Sleep(0.05);
      }
    }
    }
    state FireMissile
    {
    Ignores RangedAttack;
    	function bool ShouldChargeFromDamage()
    	{
    		return false;
    	}
    function BeginState()
    {
    		Acceleration = vect(0,0,0);
    }
    function AnimEnd( int Channel )
    {
      local vector Start;
      local Rotator R;
      Start = GetBoneCoords('tip').Origin;
      if ( !SavedFireProperties.bInitialized )
      {
       SavedFireProperties.AmmoClass = MyAmmo.Class;
       SavedFireProperties.ProjectileClass = MyAmmo.ProjectileClass;
       SavedFireProperties.WarnTargetPct = 0.15;
       SavedFireProperties.MaxRange = 10000;
       SavedFireProperties.bTossed = False;
       SavedFireProperties.bTrySplash = False;
       SavedFireProperties.bLeadTarget = True;
       SavedFireProperties.bInstantHit = True;
       SavedFireProperties.bInitialized = true;
      }
      R = AdjustAim(SavedFireProperties,Start,100);
      PlaySound(RocketFireSound,SLOT_Interact,2.0,,TransientSoundRadius,,false);
      Spawn(Class'MiniBossLAWProj',,,Start,R);
      bShotAnim = true;
      Acceleration = vect(0,0,0);
      SetAnimAction('FireEndMissile');
      HandleWaitForAnim('FireEndMissile');
      // Randomly send out a message about Patriarch shooting a rocket(5% chance)
      if ( FRand() < 0.05 && Controller.Enemy != none && PlayerController(Controller.Enemy.Controller) != none )
      {
       PlayerController(Controller.Enemy.Controller).Speech('AUTO', 10, "");
      }
      GoToState('');
    }
    Begin:
    while ( true )
    {
      Acceleration = vect(0,0,0);
      Sleep(0.1);
    }
    }
    function bool MeleeDamageTarget(int hitdamage, vector pushdir)
    {
    local bool RetVal;
    if( Controller.Target!=None && Controller.Target.IsA('NetKActor') )
      pushdir = Normal(Controller.Target.Location-Location)*100000; // Fly bitch!
    RetVal = Super.MeleeDamageTarget(hitdamage, pushdir);
    MeleeRange = Default.MeleeRange;
    return RetVal;
    }
    state Charging
    {
    	// Don't override speed in this state
    	function bool CanSpeedAdjust()
    	{
    		return false;
    	}
    	function bool ShouldChargeFromDamage()
    	{
    		return false;
    	}
    function BeginState()
    {
    		bChargingPlayer = True;
      if( Level.NetMode!=NM_DedicatedServer )
       PostNetReceive();
      // How many charge attacks we can do randomly 1-3
      NumChargeAttacks = Rand(2) + 1;
    }
    function EndState()
    {
    		GroundSpeed = OriginalGroundSpeed;
      bChargingPlayer = False;
      ChargeDamage = 0;
      if( Level.NetMode!=NM_DedicatedServer )
       PostNetReceive();
      LastChargeTime = Level.TimeSeconds;
    }
    function Tick( float Delta )
    {
    		if( NumChargeAttacks <= 0 )
    		{
    			GoToState('');
    		}
    		// Keep the flesh pound moving toward its target when attacking
    	 if( Role == ROLE_Authority && bShotAnim)
    	 {
    	  if( bChargingPlayer )
    	  {
    				bChargingPlayer = false;
    		  if( Level.NetMode!=NM_DedicatedServer )
    		   PostNetReceive();
    	  }
    			GroundSpeed = OriginalGroundSpeed * 1.25;
    			if( LookTarget!=None )
    	  {
    		  Acceleration = AccelRate * Normal(LookTarget.Location - Location);
    	  }
    		}
    		else
    		{
    	  if( !bChargingPlayer )
    	  {
    				bChargingPlayer = true;
    		  if( Level.NetMode!=NM_DedicatedServer )
    		   PostNetReceive();
    	  }
    			GroundSpeed = OriginalGroundSpeed * 2.5;
    		}
    
      Global.Tick(Delta);
    }
    function bool MeleeDamageTarget(int hitdamage, vector pushdir)
    {
      local bool RetVal;
    		NumChargeAttacks--;
      RetVal = Global.MeleeDamageTarget(hitdamage, pushdir*1.5);
      if( RetVal )
       GoToState('');
      return RetVal;
    }
    function RangedAttack(Actor A)
    {
    		if( VSize(A.Location-Location)>700 && Level.TimeSeconds - LastForceChargeTime > 3.0 )
       GoToState('');
      Global.RangedAttack(A);
    }
    Begin:
    Sleep(6);
    GoToState('');
    }
    function BeginHealing()
    {
    MonsterController(Controller).WhatToDoNext(55);
    }
    
    state Healing // Healing
    {
    	function bool ShouldChargeFromDamage()
    	{
    		return false;
    	}
    Begin:
    Sleep(GetAnimDuration('Heal'));
    GoToState('');
    }
    state KnockDown // Knocked
    {
    	function bool ShouldChargeFromDamage()
    	{
    		return false;
    	}
    Begin:
    	if( Health > 0 )
    	{
    	 Sleep(GetAnimDuration('KnockDown'));
    	 PlaySound(sound'KF_EnemiesFinalSnd.Patriarch.Kev_SaveMe', SLOT_Misc, 2.0,,500.0);
    	 if( KFGameType(Level.Game).FinalSquadNum == SyringeCount )
    		{
    		KFGameType(Level.Game).AddBossBuddySquad();
    	 }
    		GotoState('Escaping');
    	}
    	else
    	{
    GotoState('');
    	}
    }
    State Escaping extends Charging // Got hurt and running away...
    {
    function BeginHealing()
    {
      bShotAnim = true;
      Acceleration = vect(0,0,0);
      SetAnimAction('Heal');
      HandleWaitForAnim('Heal');
      GoToState('Healing');
    }
    function RangedAttack(Actor A)
    {
      if ( bShotAnim )
       return;
      else if ( IsCloseEnuf(A) )
      {
       bShotAnim = true;
       Acceleration = vect(0,0,0);
       Acceleration = (A.Location-Location);
       SetAnimAction('MeleeClaw');
       //PlaySound(sound'Claw2s', SLOT_None); Claw2s
      }
    }
    function bool MeleeDamageTarget(int hitdamage, vector pushdir)
    {
      return Global.MeleeDamageTarget(hitdamage, pushdir*1.5);
    }
    function Tick( float Delta )
    {
    		// Keep the flesh pound moving toward its target when attacking
    	 if( Role == ROLE_Authority && bShotAnim)
    	 {
    	  if( bChargingPlayer )
    	  {
    				bChargingPlayer = false;
    		  if( Level.NetMode!=NM_DedicatedServer )
    		   PostNetReceive();
    	  }
    			GroundSpeed = OriginalGroundSpeed;
    		}
    		else
    		{
    	  if( !bChargingPlayer )
    	  {
    				bChargingPlayer = true;
    		  if( Level.NetMode!=NM_DedicatedServer )
    		   PostNetReceive();
    	  }
    			GroundSpeed = OriginalGroundSpeed * 2.5;
    		}
    
      Global.Tick(Delta);
    }
    function EndState()
    {
    		GroundSpeed = OriginalGroundSpeed;
      bChargingPlayer = False;
      if( Level.NetMode!=NM_DedicatedServer )
       PostNetReceive();
    }
    Begin:
    While( true )
    {
      Sleep(0.5);
    }
    }
    State SneakAround extends Escaping // Attempt to sneak around.
    {
    function BeginHealing()
    {
      MonsterController(Controller).WhatToDoNext(56);
      GoToState('');
    }
    function bool MeleeDamageTarget(int hitdamage, vector pushdir)
    {
      local bool RetVal;
      RetVal = super.MeleeDamageTarget(hitdamage, pushdir);
      GoToState('');
      return RetVal;
    }
    function BeginState()
    {
    	 super.BeginState();
    		SneakStartTime = Level.TimeSeconds;
    }
    function EndState()
    {
      super.EndState();
      LastSneakedTime = Level.TimeSeconds;
    }
    
    Begin:
    While( true )
    {
      Sleep(0.5);
      if( Level.TimeSeconds - SneakStartTime > 10.0 )
      {
    			GoToState('');
      }
      if( !Controller.IsInState('ZombieHunt') && !Controller.IsInState('WaitForAnim') )
      {
    		 Controller.GoToState('ZombieHunt');
    		}
    }
    }
    simulated function DropNeedle()
    {
    if( CurrentNeedle!=None )
    {
      DetachFromBone(CurrentNeedle);
      CurrentNeedle.SetLocation(GetBoneCoords('Rpalm_MedAttachment').Origin);
      CurrentNeedle.DroppedNow();
      CurrentNeedle = None;
    }
    }
    simulated function NotifySyringeA()
    {
    	//log("Heal Part 1");
    if( Level.NetMode!=NM_Client )
    {
      if( SyringeCount<3 )
       SyringeCount++;
      if( Level.NetMode!=NM_DedicatedServer )
    	PostNetReceive();
    }
    if( Level.NetMode!=NM_DedicatedServer )
    {
      DropNeedle();
      CurrentNeedle = Spawn(Class'BossHPNeedle');
      AttachToBone(CurrentNeedle,'Rpalm_MedAttachment');
    }
    }
    function NotifySyringeB()
    {
    	//log("Heal Part 2");
    if( Level.NetMode != NM_Client )
    {
      Health += HealingAmount;
      bHealed = true;
    }
    }
    simulated function NotifySyringeC()
    {
    	//log("Heal Part 3");
    if( Level.NetMode!=NM_DedicatedServer && CurrentNeedle!=None )
    {
      CurrentNeedle.Velocity = vect(-45,300,-90) >> Rotation;
      DropNeedle();
    }
    }
    simulated function PostNetReceive()
    {
    if( bClientMiniGunning != bMinigunning )
    {
    		bClientMiniGunning = bMinigunning;
    		// Hack so Patriarch won't go out of MG Firing to play his idle anim online
    		if( bMinigunning )
    		{
    		 IdleHeavyAnim='FireMG';
    		 IdleRifleAnim='FireMG';
    		 IdleCrouchAnim='FireMG';
    		 IdleWeaponAnim='FireMG';
    		 IdleRestAnim='FireMG';
    		}
    		else
    		{
    		 IdleHeavyAnim='BossIdle';
    		 IdleRifleAnim='BossIdle';
    		 IdleCrouchAnim='BossIdle';
    		 IdleWeaponAnim='BossIdle';
    		 IdleRestAnim='BossIdle';
    		}
    }
    if( bClientCharg!=bChargingPlayer )
    {
      bClientCharg = bChargingPlayer;
      if (bChargingPlayer)
      {
       MovementAnims[0] = ChargingAnim;
       MovementAnims[1] = ChargingAnim;
       MovementAnims[2] = ChargingAnim;
       MovementAnims[3] = ChargingAnim;
      }
      else if( !bChargingPlayer )
      {
       MovementAnims[0] = default.MovementAnims[0];
       MovementAnims[1] = default.MovementAnims[1];
       MovementAnims[2] = default.MovementAnims[2];
       MovementAnims[3] = default.MovementAnims[3];
      }
    }
    else if( ClientSyrCount!=SyringeCount )
    {
      ClientSyrCount = SyringeCount;
      Switch( SyringeCount )
      {
       Case 1:
    	SetBoneScale(3,0,'Syrange1');
    	Break;
       Case 2:
    	SetBoneScale(3,0,'Syrange1');
    	SetBoneScale(4,0,'Syrange2');
    	Break;
       Case 3:
    	SetBoneScale(3,0,'Syrange1');
    	SetBoneScale(4,0,'Syrange2');
    	SetBoneScale(5,0,'Syrange3');
    	Break;
       Default: // WTF? reset...?
    	SetBoneScale(3,1,'Syrange1');
    	SetBoneScale(4,1,'Syrange2');
    	SetBoneScale(5,1,'Syrange3');
    	Break;
      }
    }
    else if( TraceHitPos!=vect(0,0,0) )
    {
      AddTraceHitFX(TraceHitPos);
      TraceHitPos = vect(0,0,0);
    }
    }
    simulated function int DoAnimAction( name AnimName )
    {
    if( AnimName=='MeleeImpale' || AnimName=='MeleeClaw' || AnimName=='transition' /*|| AnimName=='FireMG'*/  )
    {
      AnimBlendParams(1, 1.0, 0.0,, SpineBone1);
      PlayAnim(AnimName,, 0.1, 1);
      Return 1;
    }
    Return Super.DoAnimAction(AnimName);
    }
    
    simulated event SetAnimAction(name NewAction)
    {
    local int meleeAnimIndex;
    if( NewAction=='' )
      Return;
    if(NewAction == 'Claw')
    {
      meleeAnimIndex = Rand(3);
      NewAction = meleeAnims[meleeAnimIndex];
      CurrentDamtype = ZombieDamType[meleeAnimIndex];
    }
    ExpectingChannel = DoAnimAction(NewAction);
    	if( Controller != none )
    	{
    	MiniBossZombieController(Controller).AnimWaitChannel = ExpectingChannel;
    }
    	if( AnimNeedsWait(NewAction) )
    	{
    		bWaitForAnim = true;
    	}
    	else
    	{
    		bWaitForAnim = false;
    	}
    if( Level.NetMode!=NM_Client )
    {
      AnimAction = NewAction;
      bResetAnimAct = True;
    		ResetAnimActTime = Level.TimeSeconds+0.3;
    }
    }
    // Hand sending the controller to the WaitForAnim state
    simulated function HandleWaitForAnim( name NewAnim )
    {
    	local float RageAnimDur;
    	Controller.GoToState('WaitForAnim');
    RageAnimDur = GetAnimDuration(NewAnim);
    	MiniBossZombieController(Controller).SetWaitForAnimTimout(RageAnimDur,NewAnim);
    }
    // The animation is full body and should set the bWaitForAnim flag
    simulated function bool AnimNeedsWait(name TestAnim)
    {
    	if( /*TestAnim == 'MeleeImpale' || TestAnim =='MeleeClaw' || TestAnim =='transition' ||*/ TestAnim == 'FireMG' ||
    		TestAnim == 'PreFireMG' || TestAnim == 'PreFireMissile' || TestAnim == 'FireEndMG'|| TestAnim == 'FireEndMissile' ||
    		TestAnim == 'Heal' || TestAnim == 'KnockDown' || TestAnim == 'Entrance' || TestAnim == 'VictoryLaugh' )
    	{
    		return true;
    	}
    	return false;
    }
    simulated function HandleBumpGlass()
    {
    }
    
    function bool FlipOver()
    {
    Return False;
    }
    // Return true if we want to charge from taking too much damage
    function bool ShouldChargeFromDamage()
    {
    	// If we don;t want to heal, charge whoever damaged us!!!
    	if( (SyringeCount==0 && Health<HealingLevels[0]) || (SyringeCount==1 && Health<HealingLevels[1]) || (SyringeCount==2 && Health<HealingLevels[2]) )
    	{
    		return false;
    	}
    	else if( !bChargingPlayer && Level.TimeSeconds - LastForceChargeTime > (5.0 + 5.0 * FRand()) )
    	{
    		return true;
    	}
    	return false;
    }
    function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class<DamageType> damageType, optional int HitIndex)
    {
    local float DamagerDistSq;
    	//log(GetStateName()$" Took damage. Health="$Health$" Damage = "$Damage$" HealingLevels "$HealingLevels[SyringeCount]);
    	Super.TakeDamage(Damage,instigatedBy,hitlocation,vect(0,0,0),damageType);
    	if( Level.TimeSeconds - LastDamageTime > 10 )
    	{
    		ChargeDamage = 0;
    	}
    	else
    	{
    		LastDamageTime = Level.TimeSeconds;
    		ChargeDamage += Damage;
    	}
    	if( ShouldChargeFromDamage() && ChargeDamage > 200 )
    	{
    		// If someone close up is shooting us, just charge them
    		if( InstigatedBy != none )
    		{
    			DamagerDistSq = VSizeSquared(Location - InstigatedBy.Location);
    			if( DamagerDistSq < (700 * 700) )
    			{
    				SetAnimAction('transition');
    		  ChargeDamage=0;
    		  LastForceChargeTime = Level.TimeSeconds;
    		  GoToState('Charging');
    		  return;
    	  }
    		}
    	}
    if( Health<=0 || SyringeCount==3 || IsInState('Escaping') || IsInState('KnockDown') /*|| bShotAnim*/ )
      Return;
    if( (SyringeCount==0 && Health<HealingLevels[0]) || (SyringeCount==1 && Health<HealingLevels[1]) || (SyringeCount==2 && Health<HealingLevels[2]) )
    {
    	 //log(GetStateName()$" Took damage and want to heal!!! Health="$Health$" HealingLevels "$HealingLevels[SyringeCount]);
    	 bShotAnim = true;
      Acceleration = vect(0,0,0);
      SetAnimAction('KnockDown');
      HandleWaitForAnim('KnockDown');
      KFMonsterController(Controller).bUseFreezeHack = True;
      GoToState('KnockDown');
    }
    }
    function DoorAttack(Actor A)
    {
    if ( bShotAnim )
      return;
    else if ( A!=None )
    {
      Controller.Target = A;
      bShotAnim = true;
      Acceleration = vect(0,0,0);
      SetAnimAction('PreFireMissile');
      HandleWaitForAnim('PreFireMissile');
      GoToState('FireMissile');
    }
    }
    function RemoveHead();
    function PlayDirectionalHit(Vector HitLoc);
    function bool SameSpeciesAs(Pawn P)
    {
    return False;
    }
    simulated function bool SpectatorSpecialCalcView(PlayerController Viewer, out Actor ViewActor, out vector CameraLocation, out rotator CameraRotation)
    {
    Viewer.bBehindView = True;
    ViewActor = Self;
    CameraRotation.Yaw = Rotation.Yaw-32768;
    CameraRotation.Pitch = 0;
    CameraRotation.Roll = Rotation.Roll;
    CameraLocation = Location + (vect(80,0,80) >> Rotation);
    Return True;
    }
    
    function ClawDamageTarget()
    {
    local vector PushDir;
    local name Anim;
    local float frame,rate;
    local float UsedMeleeDamage;
    if( MeleeDamage > 1 )
    	{
    	UsedMeleeDamage = (MeleeDamage - (MeleeDamage * 0.05)) + (MeleeDamage * (FRand() * 0.1));
    }
    else
    {
    	UsedMeleeDamage = MeleeDamage;
    }
    GetAnimParams(1, Anim,frame,rate);
    	if( Anim == 'MeleeImpale' )
    	{
    		MeleeRange = ImpaleMeleeDamageRange;
    	}
    	else
    	{
    		MeleeRange = ClawMeleeDamageRange;
    	}
    if(Controller!=none && Controller.Target!=none)
      PushDir = (damageForce * Normal(Controller.Target.Location - Location));
    else PushDir = damageForce * vector(Rotation);
    if ( MeleeDamageTarget( UsedMeleeDamage, PushDir))
    {
    		if( Anim == 'MeleeImpale' )
    		{
    			PlaySound(MeleeImpaleHitSound, SLOT_Interact, 2.0);
    		}
    		else
    		{
    			PlaySound(MeleeAttackHitSound, SLOT_Interact, 2.0);
    		}
    }
    }
    simulated function ProcessHitFX()
    {
    	local Coords boneCoords;
    local class<xEmitter> HitEffects[4];
    local int i,j;
    	local float GibPerterbation;
    	if( (Level.NetMode == NM_DedicatedServer) || bSkeletized || (Mesh == SkeletonMesh))
    	{
      SimHitFxTicker = HitFxTicker;
    		return;
    	}
    	for ( SimHitFxTicker = SimHitFxTicker; SimHitFxTicker != HitFxTicker; SimHitFxTicker = (SimHitFxTicker + 1) % ArrayCount(HitFX) )
    	{
      j++;
      if ( j > 30 )
      {
       SimHitFxTicker = HitFxTicker;
       return;
      }
    		if( (HitFX[SimHitFxTicker].damtype == None) || (Level.bDropDetail && (Level.TimeSeconds - LastRenderTime > 3) && !IsHumanControlled()) )
    			continue;
      //log("Processing effects for damtype "$HitFX[SimHitFxTicker].damtype);
      if( HitFX[SimHitFxTicker].bone == 'obliterate' && !class'GameInfo'.static.UseLowGore())
      {
       SpawnGibs( HitFX[SimHitFxTicker].rotDir, 1);
       bGibbed = true;
       Destroy();
       return;
      }
    		boneCoords = GetBoneCoords( HitFX[SimHitFxTicker].bone );
    		if ( !Level.bDropDetail && !class'GameInfo'.static.NoBlood() && !bSkeletized )
    		{
    			//AttachEmitterEffect( BleedingEmitterClass, HitFX[SimHitFxTicker].bone, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir );
       HitFX[SimHitFxTicker].damtype.static.GetHitEffects( HitEffects, Health );
       if( !PhysicsVolume.bWaterVolume ) // don't attach effects under water
       {
    	for( i = 0; i < ArrayCount(HitEffects); i++ )
    	{
    	 if( HitEffects[i] == None )
    	  continue;
    	   AttachEffect( HitEffects[i], HitFX[SimHitFxTicker].bone, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir );
    	}
       }
      }
    		if ( class'GameInfo'.static.UseLowGore() )
       HitFX[SimHitFxTicker].bSever = false;
    		if( HitFX[SimHitFxTicker].bSever )
    		{
    			GibPerterbation = HitFX[SimHitFxTicker].damtype.default.GibPerterbation;
    			switch( HitFX[SimHitFxTicker].bone )
    			{
    				case 'obliterate':
    					break;
    				case LeftThighBone:
    				 if( !bLeftLegGibbed )
    	 {
    					 SpawnSeveredGiblet( DetachedLegClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) );
    				  KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ;
    				  KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ;
    				  KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ;
    					 bLeftLegGibbed=true;
    					}
    					break;
    				case RightThighBone:
    				 if( !bRightLegGibbed )
    	 {
    					 SpawnSeveredGiblet( DetachedLegClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) );
    				  KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ;
    				  KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ;
    				  KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ;
    					 bRightLegGibbed=true;
    					}
    					break;
    				case LeftFArmBone:
    				 if( !bLeftArmGibbed )
    	 {
    					 SpawnSeveredGiblet( DetachedSpecialArmClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) );
    				  KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ;
    				  KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ;;
    					 bLeftArmGibbed=true;
    					}
    					break;
    				case RightFArmBone:
    				 if( !bRightArmGibbed )
    	 {
    					 SpawnSeveredGiblet( DetachedArmClass, boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, GetBoneRotation(HitFX[SimHitFxTicker].bone) );
    				  KFSpawnGiblet( class 'KFMod.KFGibBrain',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ;
    				  KFSpawnGiblet( class 'KFMod.KFGibBrainb',boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, GibPerterbation, 250 ) ;
    					 bRightArmGibbed=true;
    					}
    					break;
    				case 'head':
    					if( !bHeadGibbed )
    					{
    						if ( HitFX[SimHitFxTicker].damtype == class'DamTypeDecapitation' )
    						{
    							DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, false);
    						}
    						else if( HitFX[SimHitFxTicker].damtype == class'DamTypeMeleeDecapitation' )
    						{
    							DecapFX( boneCoords.Origin, HitFX[SimHitFxTicker].rotDir, true);
    						}
    					   bHeadGibbed=true;
    				   }
    					break;
    			}
    
       if( HitFX[SimHitFXTicker].bone != 'Spine' && HitFX[SimHitFXTicker].bone != FireRootBone &&
    				HitFX[SimHitFXTicker].bone != 'head')
    			 HideBone(HitFX[SimHitFxTicker].bone);
    		}
    	}
    }
    // Maybe spawn some chunks when the player gets obliterated
    simulated function SpawnGibs(Rotator HitRotation, float ChunkPerterbation)
    {
    bGibbed = true;
    PlayDyingSound();
    	if ( class'GameInfo'.static.UseLowGore() )
      return;
    if( ObliteratedEffectClass != none )
      Spawn( ObliteratedEffectClass,,, Location, HitRotation );
    	super.SpawnGibs(HitRotation,ChunkPerterbation);
    	if ( FRand() < 0.1 )
    {
      KFSpawnGiblet( class 'KFMod.KFGibBrain',Location, HitRotation, ChunkPerterbation, 500 ) ;
      KFSpawnGiblet( class 'KFMod.KFGibBrainb',Location, HitRotation, ChunkPerterbation, 500 ) ;
      KFSpawnGiblet( class 'KFMod.KFGibBrain',Location, HitRotation, ChunkPerterbation, 500 ) ;
      KFSpawnGiblet( class 'KFMod.KFGibBrainb',Location, HitRotation, ChunkPerterbation, 500 ) ;
      KFSpawnGiblet( class 'KFMod.KFGibBrain',Location, HitRotation, ChunkPerterbation, 500 ) ;
      SpawnSeveredGiblet( DetachedLegClass, Location, HitRotation, ChunkPerterbation, HitRotation );
      SpawnSeveredGiblet( DetachedLegClass, Location, HitRotation, ChunkPerterbation, HitRotation );
      SpawnSeveredGiblet( DetachedSpecialArmClass, Location, HitRotation, ChunkPerterbation, HitRotation );
      SpawnSeveredGiblet( DetachedArmClass, Location, HitRotation, ChunkPerterbation, HitRotation );
    }
    else if ( FRand() < 0.25 )
    {
      KFSpawnGiblet( class 'KFMod.KFGibBrainb',Location, HitRotation, ChunkPerterbation, 500 ) ;
      KFSpawnGiblet( class 'KFMod.KFGibBrain',Location, HitRotation, ChunkPerterbation, 500 ) ;
      KFSpawnGiblet( class 'KFMod.KFGibBrainb',Location, HitRotation, ChunkPerterbation, 500 ) ;
      KFSpawnGiblet( class 'KFMod.KFGibBrain',Location, HitRotation, ChunkPerterbation, 500 ) ;
      SpawnSeveredGiblet( DetachedLegClass, Location, HitRotation, ChunkPerterbation, HitRotation );
      SpawnSeveredGiblet( DetachedLegClass, Location, HitRotation, ChunkPerterbation, HitRotation );
      if ( FRand() < 0.5 )
      {
    			KFSpawnGiblet( class 'KFMod.KFGibBrain',Location, HitRotation, ChunkPerterbation, 500 ) ;
       SpawnSeveredGiblet( DetachedArmClass, Location, HitRotation, ChunkPerterbation, HitRotation );
      }
    }
    else if ( FRand() < 0.35 )
    {
      KFSpawnGiblet( class 'KFMod.KFGibBrainb',Location, HitRotation, ChunkPerterbation, 500 ) ;
      KFSpawnGiblet( class 'KFMod.KFGibBrain',Location, HitRotation, ChunkPerterbation, 500 ) ;
    	 SpawnSeveredGiblet( DetachedLegClass, Location, HitRotation, ChunkPerterbation, HitRotation );
    }
    else if ( FRand() < 0.5 )
    {
      KFSpawnGiblet( class 'KFMod.KFGibBrainb',Location, HitRotation, ChunkPerterbation, 500 ) ;
      KFSpawnGiblet( class 'KFMod.KFGibBrain',Location, HitRotation, ChunkPerterbation, 500 ) ;
      SpawnSeveredGiblet( DetachedArmClass, Location, HitRotation, ChunkPerterbation, HitRotation );
    }
    }
    defaultproperties
    {
    	 ChargingAnim="RunF"
    	 HealingLevels(0)=560
    	 HealingLevels(1)=350
    	 HealingLevels(2)=218
    	 HealingAmount=175
    	 RocketFireSound=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_FireRocket'
    	 MiniGunFireSound=Sound'KF_BasePatriarch.Attack.Kev_MG_GunfireLoop'
    	 MiniGunSpinSound=Sound'KF_BasePatriarch.Attack.Kev_MG_TurbineFireLoop'
    	 MeleeImpaleHitSound=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_HitPlayer_Impale'
    	 MGDamage=0.500000
    	 ClawMeleeDamageRange=85.000000
    	 ImpaleMeleeDamageRange=45.000000
    	 MoanVoice=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_Talk'
    	 ZombieFlag=3
    	 MeleeDamage=20
    	 damageForce=17000
    	 bFatAss=True
    	 KFRagdollName="Patriarch_Trip"
    	 MeleeAttackHitSound=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_HitPlayer_Fist'
    	 JumpSound=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_Jump'
    	 bMeleeStunImmune=True
    	 bCanDistanceAttackDoors=True
    	 bUseExtendedCollision=True
    	 ColOffset=(Z=65.000000)
    	 ColRadius=27.000000
    	 ColHeight=25.000000
    	 SeveredArmAttachScale=0.550000
    	 SeveredLegAttachScale=0.600000
    	 SeveredHeadAttachScale=0.750000
    	 DetachedArmClass=Class'KFChar.SeveredArmPatriarch'
    	 DetachedLegClass=Class'KFChar.SeveredLegPatriarch'
    	 DetachedHeadClass=Class'KFChar.SeveredHeadPatriarch'
    	 DetachedSpecialArmClass=Class'KFChar.SeveredRocketArmPatriarch'
    	 PlayerCountHealthScale=0.750000
    	 HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_Pain'
    	 DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.Patriarch.Kev_Death'
    	 ScoringValue=50
    	 IdleHeavyAnim="BossIdle"
    	 IdleRifleAnim="BossIdle"
    	 RagDeathVel=80.000000
    	 RagDeathUpKick=100.000000
    	 MeleeRange=10.000000
    	 GroundSpeed=120.000000
    	 WaterSpeed=120.000000
    	 HealthMax=500.000000
    	 Health=500
    	 HeadHeight=1.000000
    	 HeadScale=0.650000
    	 MenuName="Mini-Patriarchik"
    	 ControllerClass=Class'KFModsRTD.MiniBossZombieController'
    	 MovementAnims(0)="WalkF"
    	 MovementAnims(1)="WalkF"
    	 MovementAnims(2)="WalkF"
    	 MovementAnims(3)="WalkF"
    	 AirAnims(0)="JumpInAir"
    	 AirAnims(1)="JumpInAir"
    	 AirAnims(2)="JumpInAir"
    	 AirAnims(3)="JumpInAir"
    	 TakeoffAnims(0)="JumpTakeOff"
    	 TakeoffAnims(1)="JumpTakeOff"
    	 TakeoffAnims(2)="JumpTakeOff"
    	 TakeoffAnims(3)="JumpTakeOff"
    	 LandAnims(0)="JumpLanded"
    	 LandAnims(1)="JumpLanded"
    	 LandAnims(2)="JumpLanded"
    	 LandAnims(3)="JumpLanded"
    	 AirStillAnim="JumpInAir"
    	 TakeoffStillAnim="JumpTakeOff"
    	 IdleCrouchAnim="BossIdle"
    	 IdleWeaponAnim="BossIdle"
    	 IdleRestAnim="BossIdle"
    	 AmbientSound=Sound'KF_BasePatriarch.Idle.Kev_IdleLoop'
    	 Mesh=SkeletalMesh'KF_Freaks_Trip.Patriarch_Freak'
    	 DrawScale=0.500000
    	 PrePivot=(Z=3.000000)
    	 Skins(0)=Combiner'KF_Specimens_Trip_T.gatling_cmb'
    	 Skins(1)=Combiner'KF_Specimens_Trip_T.patriarch_cmb'
    	 SoundVolume=75
    	 CollisionRadius=13.000000
    	 CollisionHeight=22.000000
    	 bNetNotify=False
    	 Mass=1000.000000
    	 RotationRate=(Yaw=36000,Roll=0)
    }
    
     
  6. Сеня

    Сеня Соучастник

    для слот машины по другому..
     
  7. DukeNukem4ever

    DukeNukem4ever Соучастник

    А как добавлять бонусы на мутатор?
    (Т.е. если я хочу добавить опцию "Random Gun" (даёт случайную (зависит от класса) пушку),то как мне это сделать?)
     
  8. Flame

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

    Тема про создание карт для рулетки
     
  9. Arckon.

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

    Товарищи, приветствую. Буду благодарен, если кто-нибудь выложит рабочий мутатор с настройками по умолчанию для дальнейшего редактирования.
     
  10. Flame

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

    Дак он вроде рабочий. Вот скачал я - зеркало
     
  11. Flame

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

    MutSlotMachine - вытащил ресурсы из MutSlotMachine.u и из SlotsAddOn.u
    (ибо вечная у всех беда с редактированием, экспортированием, импортированием)
    Закинул в MutSlotMachine_A.ukx, а uc файлы из SlotsAddOn добавил в MutSlotMachine
    Ссылка

    Кстати, ссылки на SlotsAddOn уже так себе находятся в инете - в этой темке можно взять при желании

    Потом обновлю шапку темы
    Только надо бы проверить не накосячил ли я на утро глядя
     
  12. tor1980

    tor1980 Соучастник

    Доброго дня или вечера!имеется ли у кого версия 2.00 рулетки? если есть залейте пожалуйста на яндекс.диск