Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class RealCrouchController expands Info;
- var private bool bIsBlocked;
- var private Actor BumpedActor;
- var private float TimeStamp;
- static final function bool CanStandUp(PlayerPawn Player, float TargetCollisionHeight)
- {
- local RealCrouchController CrouchController;
- local vector DstLocation;
- local int i;
- CrouchController = GetRealCrouchController(Player);
- if (CrouchController == none) // should be always false
- return true;
- if (Player.Level.TimeSeconds == CrouchController.TimeStamp)
- return !CrouchController.bIsBlocked;
- if (Player.CollisionHeight >= TargetCollisionHeight)
- return true;
- if (!Player.bCollideActors && !Player.bCollideWorld)
- return true;
- CrouchController.SetCollision(false, false, false);
- CrouchController.SetCollisionSize(Player.CollisionRadius, Player.CollisionHeight);
- CrouchController.bCollideWorld = false;
- CrouchController.Move(Player.Location - CrouchController.Location);
- if (Player.bBlockActors)
- CrouchController.SetCollision(true, false, false);
- CrouchController.bCollideWorld = Player.bCollideWorld;
- CrouchController.bIsBlocked = false;
- CrouchController.BumpedActor = none;
- DstLocation = Player.Location + vect(0, 0, 2) * (TargetCollisionHeight - Player.CollisionHeight);
- // Checking if the player would hit non-Brush actors, Brush actors, or the level geometry
- CrouchController.Move(DstLocation - CrouchController.Location);
- if (CrouchController.bIsBlocked)
- return CrouchController.CanStandUp_Cache(false);
- while (
- CrouchController.Location != DstLocation &&
- CrouchController.BumpedActor != none &&
- CrouchController.BumpedActor.bCollideActors &&
- !CrouchController.BumpedActor.bBlockPlayers &&
- i < 16)
- {
- CrouchController.BumpedActor.SetCollision(false, CrouchController.BumpedActor.bBlockActors, false);
- CrouchController.Move(DstLocation - CrouchController.Location);
- CrouchController.BumpedActor.SetCollision(true, CrouchController.BumpedActor.bBlockActors, false);
- if (CrouchController.bIsBlocked)
- return CrouchController.CanStandUp_Cache(false);
- CrouchController.BumpedActor = none;
- ++i;
- }
- return CrouchController.CanStandUp_Cache(CrouchController.Location == DstLocation);
- }
- static function RealCrouchController GetRealCrouchController(PlayerPawn Player)
- {
- local RealCrouchController CrouchController;
- foreach Player.ChildActors(class'RealCrouchController', CrouchController)
- break;
- if (CrouchController == none || CrouchController.bDeleteMe)
- return Player.Spawn(class'RealCrouchController', Player);
- return CrouchController;
- }
- function bool CanStandUp_Cache(bool bResult)
- {
- bIsBlocked = !bResult;
- TimeStamp = Level.TimeSeconds;
- SetCollision(false);
- return bResult;
- }
- event Touch(Actor A)
- {
- // see AActor::IsBlockedBy
- if (bIsBlocked || !A.bBlockPlayers || Owner == none)
- return;
- if (PlayerPawn(A) != none || Projectile(A) != none)
- {
- if (Owner.bBlockPlayers)
- bIsBlocked = true;
- }
- else if (Owner.bBlockActors)
- bIsBlocked = true;
- }
- event Bump(Actor A)
- {
- BumpedActor = A;
- }
- event Tick(float DeltaTime)
- {
- local PlayerPawn Player;
- Player = PlayerPawn(Owner);
- if (Player == none || Player.bDeleteMe)
- {
- Destroy();
- return;
- }
- if (Player.bIsReducedCrouch != Player.ShouldHaveReducedHeight())
- Player.TryToDuck(!Player.bIsReducedCrouch);
- }
- event FellOutOfWorld();
- defaultproperties
- {
- CollisionRadius=0
- CollisionHeight=0
- RemoteRole=ROLE_None
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement