Advertisement
Guest User

RealCrouchController

a guest
Jan 4th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. class RealCrouchController expands Info;
  2.  
  3. var private bool bIsBlocked;
  4. var private Actor BumpedActor;
  5. var private float TimeStamp;
  6.  
  7. static final function bool CanStandUp(PlayerPawn Player, float TargetCollisionHeight)
  8. {
  9.     local RealCrouchController CrouchController;
  10.     local vector DstLocation;
  11.     local int i;
  12.  
  13.     CrouchController = GetRealCrouchController(Player);
  14.     if (CrouchController == none) // should be always false
  15.         return true;
  16.  
  17.     if (Player.Level.TimeSeconds == CrouchController.TimeStamp)
  18.         return !CrouchController.bIsBlocked;
  19.  
  20.     if (Player.CollisionHeight >= TargetCollisionHeight)
  21.         return true;
  22.     if (!Player.bCollideActors && !Player.bCollideWorld)
  23.         return true;
  24.  
  25.     CrouchController.SetCollision(false, false, false);
  26.     CrouchController.SetCollisionSize(Player.CollisionRadius, Player.CollisionHeight);
  27.     CrouchController.bCollideWorld = false;
  28.     CrouchController.Move(Player.Location - CrouchController.Location);
  29.     if (Player.bBlockActors)
  30.         CrouchController.SetCollision(true, false, false);
  31.     CrouchController.bCollideWorld = Player.bCollideWorld;
  32.  
  33.     CrouchController.bIsBlocked = false;
  34.     CrouchController.BumpedActor = none;
  35.  
  36.     DstLocation = Player.Location + vect(0, 0, 2) * (TargetCollisionHeight - Player.CollisionHeight);
  37.  
  38.     // Checking if the player would hit non-Brush actors, Brush actors, or the level geometry
  39.     CrouchController.Move(DstLocation - CrouchController.Location);
  40.     if (CrouchController.bIsBlocked)
  41.         return CrouchController.CanStandUp_Cache(false);
  42.  
  43.     while (
  44.         CrouchController.Location != DstLocation &&
  45.         CrouchController.BumpedActor != none &&
  46.         CrouchController.BumpedActor.bCollideActors &&
  47.         !CrouchController.BumpedActor.bBlockPlayers &&
  48.         i < 16)
  49.     {
  50.         CrouchController.BumpedActor.SetCollision(false, CrouchController.BumpedActor.bBlockActors, false);
  51.         CrouchController.Move(DstLocation - CrouchController.Location);
  52.         CrouchController.BumpedActor.SetCollision(true, CrouchController.BumpedActor.bBlockActors, false);
  53.  
  54.         if (CrouchController.bIsBlocked)
  55.             return CrouchController.CanStandUp_Cache(false);
  56.  
  57.         CrouchController.BumpedActor = none;
  58.         ++i;
  59.     }
  60.  
  61.     return CrouchController.CanStandUp_Cache(CrouchController.Location == DstLocation);
  62. }
  63.  
  64. static function RealCrouchController GetRealCrouchController(PlayerPawn Player)
  65. {
  66.     local RealCrouchController CrouchController;
  67.     foreach Player.ChildActors(class'RealCrouchController', CrouchController)
  68.         break;
  69.     if (CrouchController == none || CrouchController.bDeleteMe)
  70.         return Player.Spawn(class'RealCrouchController', Player);
  71.     return CrouchController;
  72. }
  73.  
  74. function bool CanStandUp_Cache(bool bResult)
  75. {
  76.     bIsBlocked = !bResult;
  77.     TimeStamp = Level.TimeSeconds;
  78.     SetCollision(false);
  79.     return bResult;
  80. }
  81.  
  82. event Touch(Actor A)
  83. {
  84.     // see AActor::IsBlockedBy
  85.     if (bIsBlocked || !A.bBlockPlayers || Owner == none)
  86.         return;
  87.     if (PlayerPawn(A) != none || Projectile(A) != none)
  88.     {
  89.         if (Owner.bBlockPlayers)
  90.             bIsBlocked = true;
  91.     }
  92.     else if (Owner.bBlockActors)
  93.         bIsBlocked = true;
  94. }
  95.  
  96. event Bump(Actor A)
  97. {
  98.     BumpedActor = A;
  99. }
  100.  
  101. event Tick(float DeltaTime)
  102. {
  103.     local PlayerPawn Player;
  104.  
  105.     Player = PlayerPawn(Owner);
  106.     if (Player == none || Player.bDeleteMe)
  107.     {
  108.         Destroy();
  109.         return;
  110.     }
  111.  
  112.     if (Player.bIsReducedCrouch != Player.ShouldHaveReducedHeight())
  113.         Player.TryToDuck(!Player.bIsReducedCrouch);
  114. }
  115.  
  116. event FellOutOfWorld();
  117.  
  118. defaultproperties
  119. {
  120.     CollisionRadius=0
  121.     CollisionHeight=0
  122.     RemoteRole=ROLE_None
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement