class Ext_T_SupplierInteract extends KFUsablePerkTrigger; struct FActiveUsers { var Pawn Player; var transient float NextUseTime; }; var array ActiveUsers; var repnotify KFPawn_Human PlayerOwner; var Ext_PerkBase PerkOwner; var() float ReuseTime; var bool bGrenades; replication { if (true) PlayerOwner,bGrenades; } simulated event ReplicatedEvent(name VarName) { if (VarName=='PlayerOwner' && PlayerOwner!=None) { SetLocation(PlayerOwner.Location); SetBase(PlayerOwner); } } simulated function int GetInteractionIndex(Pawn User) { return (bGrenades ? IMT_ReceiveGrenades : InteractionIndex); } simulated event Touch(Actor Other, PrimitiveComponent OtherComp, vector HitLocation, vector HitNormal) { local KFPawn_Human KFP; Super.Touch(Other, OtherComp, HitLocation, HitNormal); KFP = KFPawn_Human(Other); if (KFP != none && KFP.Controller != none && KFP != PlayerOwner) { KFPlayerController(KFP.Controller).SetPendingInteractionMessage(); } } simulated event UnTouch(Actor Other) { local KFPawn_Human KFP; super.UnTouch(Other); KFP = KFPawn_Human(Other); if (KFP != none && KFP.Controller != none && KFP != PlayerOwner) { KFPlayerController(KFP.Controller).SetPendingInteractionMessage(); } } simulated function RecheckUser() { local KFPawn_Human Toucher; // Notify local player owner that this is available again. foreach TouchingActors(class'KFPawn_Human', Toucher) { if (Toucher.IsLocallyControlled()) Touch(Toucher,None,Location,vect(1,0,0)); } } simulated function bool GetCanInteract(Pawn User, optional bool bInteractIfTrue = false) { local int i; local ExtPlayerReplicationInfo PRI; if (PlayerOwner==None || User==PlayerOwner || KFPawn_Human(User)==None || User.Health<=0) return false; if (WorldInfo.NetMode==NM_Client) { PRI = ExtPlayerReplicationInfo(PlayerOwner.PlayerReplicationInfo); if (!User.IsLocallyControlled() || PRI==None || !PRI.CanUseSupply(User)) return false; if (bInteractIfTrue) { PRI.UsedSupply(User,ReuseTime); SetTimer(ReuseTime+0.1,false,'RecheckUser'); if (KFPlayerController(User.Controller)!=None) KFPlayerController(User.Controller).SetPendingInteractionMessage(); } } else { i = ActiveUsers.Find('Player',User); if (i>=0 && ActiveUsers[i].NextUseTime>WorldInfo.TimeSeconds) return false; if (bInteractIfTrue) { if (i==-1) { i = ActiveUsers.Length; ActiveUsers.Length = i+1; ActiveUsers[i].Player = User; SetTimer(10.f,true,'CleanupUsers'); } ActiveUsers[i].NextUseTime = WorldInfo.TimeSeconds+ReuseTime; } } if (bInteractIfTrue && WorldInfo.NetMode!=NM_Client) { GiveAmmunition(KFPawn_Human(User)); } return true; } function CleanupUsers() { local int i; for (i=(ActiveUsers.Length-1); i>=0; --i) if (ActiveUsers[i].Player==None || ActiveUsers[i].Player.Health<=0 || ActiveUsers[i].NextUseTime