/* -------------------------------------------------------------- KF_DropInventoryVolume -------------------------------------------------------------- This volume forces pawns which touch it to drop any items they may be carrying of the specified type. Author : Alex Quick -------------------------------------------------------------- */ class KF_DropInventoryVolume extends Volume; /* The type of item that gets dropped */ var () class DropInventoryType; /* Attempt to throw the inventory item toward this actor */ var () Actor DropTargetLoc; /* Amount of offset to apply to drop target loc */ var () float DropTargetOffset; var array RepositionedPickups; simulated event Touch( Actor Other ) { local Pawn TouchPawn; local Inventory Inv; local vector TargetVelocity; local vector DropFromLoc; local Vector X,Y,Z; local Pickup P; local vector RandOffset; /* Cause pawns to toss their pickups */ TouchPawn = Pawn(Other); if(TouchPawn != none) { TouchPawn.GetAxes(Rotation,X,Y,Z); for( Inv=TouchPawn.Inventory; Inv!=None; Inv=Inv.Inventory ) { if(Inv.IsThrowable() && ClassIsChildOf(Inv.Class,DropinventoryType)) { TargetVelocity = Vector(TouchPawn.Rotation)* 250.f; DropFromLoc = TouchPawn.Location + 0.8 * TouchPawn.CollisionRadius * X - 0.5 * TouchPawn.CollisionRadius * Y ; Inv.Velocity = TargetVelocity ; Inv.DropFrom(DropFromLoc); } } } /* Reposition tossed pickups */ P = Pickup(Other); if(P != none && P.InventoryType == DropInventoryType && !AlreadyRepositioned(P)) { if(DropTargetLoc != none && !DropTargetLoc.bBlockActors && DropTargetLoc.Location != vect(0,0,0)) { RepositionedPickups[RepositionedPickups.length] = P; RandOffset.X = FRand() * DropTargetOffset; RandOffset.Y = FRand() * DropTargetOffset; P.SetLocation(DropTargetLoc.Location + Vect(0,0,1)*P.CollisionHeight + RandOffset) ; } } } function bool AlreadyRepositioned(Pickup P) { local int i; for( i = 0 ; i < RepositionedPickups.length ; i ++) { if(RepositionedPickups[i] != none && RepositionedPickups[i] == P) { return true; } } return false; } defaultproperties { DropTargetOffset = 64.f }