Travelling functions
Inventory travelling functions
Since 227g GameInfo has following functions for modifying inventory travelling:
event ModifyTravelList( PlayerPawn Other, out array<Actor> TravelList ); event string GetPlayerTravelID( PlayerPawn Other, bool bSave ) { return Other.PlayerReplicationInfo.PlayerName; } event Actor SpawnTravelActor( Class<Actor> ActorClass, PlayerPawn DesiredOwner ) { return SpawnAct(ActorClass,DesiredOwner.Location,DesiredOwner.Rotation,,DesiredOwner,DesiredOwner,,false); }
ModifyTravelList - is called shortly before level change when saving player inventory, this allows modder to change the inventory list to save.
GetPlayerTravelID - is called before level change with bSave==true and after a player postlogin with bSave==false, used to get ID of player for identifying the inventory lists (MULTIPLAYER ONLY!).
SpawnTravelActor - is called after PostLogin for each inventory that's about to spawn for a player.
Example modification
Let's say you want all nearby monsters to travel with the player to next level:
function ModifyTravelList( PlayerPawn Other, out array<Actor> TravelList ) { local Pawn P; local int i; i = Array_Size(TravelList); // Store the current length of the array. // Collect all nearby visible monsters thats alive. foreach VisibleCollidingActors(Class'Pawn',P,1000,Other.Location) { if( P.bIsPlayer || P.Health<=0 ) continue; TravelList[i++] = P; // Add monster to the array. } } function Actor SpawnTravelActor( Class<Actor> ActorClass, PlayerPawn DesiredOwner ) { if( ActorClass.Default.bIsPawn ) // Is a Pawn, not inventory, so spawn it next to player. return TryToSpawnAt(ActorClass,DesiredOwner); else return SpawnAct(ActorClass,DesiredOwner.Location,DesiredOwner.Rotation,,DesiredOwner,DesiredOwner,,false); } final function Actor TryToSpawnAt( class<Actor> A, Actor Other ) { local byte i; local vector V; local Actor A; for( i=0; i<10; ++i ) // Give it 10 tries. { V.X = FRand()-0.5; V.Y = FRand()-0.5; // Randomize offset around player V.Z = 0; // Normalize the vector and multiply by randomized distance from player. V = Normal(V)*(Other.CollisionRadius+A.Default.CollisionRadius+100*FRand())+Other.Location; A = Spawn(A,,,V,Other.Rotation); if( A!=None ) return A; } return None; // Give up, too small spawn area. }
Since only Pawn.Health is marked as "travel" variable, only the monster's health will remain from last map. Note: this code has not been tested yet.