Difference between revisions of "Dynamic array"
Jump to navigation
Jump to search
m |
(Update to 227i) |
||
(10 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
class KlondikeInventoryHandler extends KlondikeBaseModule; | class KlondikeInventoryHandler extends KlondikeBaseModule; | ||
struct PlayerInventory | struct PlayerInventory | ||
{ | { | ||
var Pawn InvOwner; | |||
var Array<Actor> InvList; | |||
var int InvMax; | |||
var int TravelHealth; | |||
var class<actor> SelectedWeapon; | |||
var class<actor> SelectedItem; | |||
}; | }; | ||
var PlayerInventory OriginalInventory[32]; | var PlayerInventory OriginalInventory[32]; | ||
function HandleInventory(Pawn P) | function HandleInventory(Pawn P) | ||
{ | { | ||
local int i; | |||
local int x; | |||
local int Max; | |||
local pickup NewPickup; | |||
local weapon NewWeapon; | |||
local playerpawn PP; | |||
if (P == None || !p.IsA('PlayerPawn')) | |||
Return; | |||
PP=PlayerPawn(P); | |||
for(i=0; I<32; i++) | |||
{ | |||
if(OriginalInventory[i].InvOwner != None && OriginalInventory[i].InvOwner == P) | |||
{ | |||
//log("OMFGWTF"@OriginalInventory[i].InvList[0]); | |||
Max = OriginalInventory[i].InvMax; | |||
//x=Max; | |||
while(OriginalInventory[i].InvList[x] != None) | |||
{ | |||
if(OriginalInventory[i].InvList[x].isa('Pickup')) | |||
{ | |||
NewPickup=Pickup(SpawnAct(OriginalInventory[i].InvList[x].Class,P.Location,P.Rotation,,P,P,OriginalInventory[i].InvList[x],true)); | |||
if (NewPickup != None) | |||
{ | |||
NewPickup.bHeldItem = true; | |||
NewPickup.GiveTo(PP); | |||
if(NewPickup.IsA('Translator')) | |||
PP.SelectedItem = NewPickup; | |||
NewPickup.PickupFunction(PP); | |||
NewPickup.TravelPreAccept(); | |||
NewPickup.TravelPostAccept(); | |||
if(NewPickup.isa('Ammo')) | |||
{ | |||
Ammo(PP.FindInventoryType(NewPickup.Class)).AddAmmo(Ammo(NewPickup).AmmoAmount); | |||
} | |||
} | |||
else log("fUCK OMG"@OriginalInventory[i].InvList[x].Class@"failed"); | |||
} | |||
else if(OriginalInventory[i].InvList[x].isa('weapon')) | |||
{ | |||
NewWeapon=Weapon(SpawnAct(OriginalInventory[i].InvList[x].Class,P.Location,P.Rotation,,P,P,OriginalInventory[i].InvList[x],true)); | |||
if (NewWeapon != None) | |||
{ | |||
newWeapon.Instigator = PP; | |||
newWeapon.BecomeItem(); | |||
PP.AddInventory(newWeapon); | |||
newWeapon.SetSwitchPriority(PP); | |||
newWeapon.WeaponSet(PP); | |||
NewWeapon.TravelPreAccept(); | |||
NewWeapon.TravelPostAccept(); | |||
} | |||
else log("fUCK OMG pickup"@OriginalInventory[i].InvList[x].Class@"failed"); | |||
} | |||
x++; | |||
if (OriginalInventory[i].InvList[x] == None) | |||
{ | |||
PP.PendingWeapon = Weapon(PP.FindInventoryType(OriginalInventory[i].SelectedWeapon)); | |||
if (PP.Weapon != None) | |||
PP.Weapon.PutDown(); | |||
PP.SelectedItem = Pickup(PP.FindInventoryType(OriginalInventory[i].SelectedItem)); | |||
PP.Health = OriginalInventory[i].TravelHealth; | |||
Break; | |||
} | |||
} | |||
} | |||
} | |||
} | |||
function HandleModifyTravelList(Pawn Other,bool bDelete) | |||
{ | |||
local int i; | |||
local int x; | |||
local inventory inv; | |||
local array<Actor> TravelList; | |||
if (!bDelete) | |||
{ | |||
for(i=0; I<32; i++) | |||
{ | |||
if(OriginalInventory[i].InvOwner != None) | |||
Continue; | |||
else | |||
{ | |||
OriginalInventory[i].InvOwner = Other; | |||
if (Other.Inventory != None) | |||
for(inv=Other.Inventory; inv!=None; inv=inv.inventory) | |||
{ | |||
if (x >= 1 && Inv == Other.Inventory) | |||
break; | |||
TravelList[x] = SpawnAct(inv.Class,Vect(65535,65535,65535),,,None,None,inv,true); | |||
TravelList[x].SetCollision(false,false,false);//If vect(0,0,0) is valid.. hide and make it noncollidable just in case. | |||
TravelList[x].bHidden = True; | |||
Inventory(TravelList[x]).Inventory = None; //Dereference inventory that will be deleted eventually anyway. | |||
if (TravelList[x].IsA('Weapon')) | |||
Weapon(TravelList[x]).PickupAmmoCount=0; //Fix ammo count crap. | |||
x++; | |||
} | |||
OriginalInventory[i].InvList = TravelList; | |||
OriginalInventory[i].InvMax = X; | |||
OriginalInventory[i].SelectedItem = Other.SelectedItem.Class; | |||
OriginalInventory[i].SelectedWeapon = Other.Weapon.Class; | |||
OriginalInventory[i].TravelHealth = Other.Health; | |||
break; | |||
} | |||
} | |||
} | |||
else if (bDelete) | |||
{ | |||
if (Other != None && Other.isa('PlayerPawn')) | |||
{ | |||
for(i=0; I<32; i++) | |||
{ | |||
if(OriginalInventory[i].InvOwner == Other) | |||
OriginalInventory[i].InvOwner = None; | |||
while(OriginalInventory[i].InvList[x] != None) | |||
{ | |||
OriginalInventory[i].InvList[x].Destroy(); | |||
x++; | |||
} | |||
break; | |||
} | |||
} | |||
} | |||
} | |||
defaultproperties | |||
{ | |||
} | |||
227i: | |||
class Luden expands Inventory | class Luden expands Inventory | ||
config(Luden); | config(Luden); | ||
var() config array<string> Laden; | var() config string LadenS[15]; // Normal (static) array. Limits to 15. | ||
var() config array<string> Laden; // Dynamic array. No limit. | |||
exec function AddLaden(string s) // Add 1 more message. | exec function AddLaden(string s) // Add 1 more message. | ||
{ | { | ||
Laden[Array_Size(Laden)] = S; | |||
SaveConfig(); | SaveConfig(); | ||
} | } | ||
Line 166: | Line 164: | ||
exec function ClearLaden() // Clear all messages. | exec function ClearLaden() // Clear all messages. | ||
{ | { | ||
Array_Remove(Laden,Array_Size(Laden) ); | |||
SaveConfig(); | SaveConfig(); | ||
} | } | ||
Line 174: | Line 172: | ||
local int I; | local int I; | ||
for(I=0;I< | for(I=0;I<Array_Size(Laden);I++) | ||
Pawn(Owner).ClientMessage(I@Laden[I]); | Pawn(Owner).ClientMessage(I@Laden[I]); | ||
} | } | ||
Line 182: | Line 180: | ||
local int I; | local int I; | ||
for(I= | for( I=Array_Size(Laden); I<(Array_Size(Laden)+10); I++) | ||
Laden[I] = "HI"; | Laden[I] = "HI"; | ||
SaveConfig(); | SaveConfig(); | ||
Line 200: | Line 198: | ||
local int I; | local int I; | ||
for(I=0;I< | for(I=0;I<Array_Size(Laden);I++) | ||
Laden[I] = "HI3"; | Laden[I] = "HI3"; | ||
SaveConfig(); | SaveConfig(); | ||
Line 207: | Line 205: | ||
exec function RemoveLaden() // Remove 1 message (last). | exec function RemoveLaden() // Remove 1 message (last). | ||
{ | { | ||
Array_Remove(Laden, 1 ); | |||
SaveConfig(); | SaveConfig(); | ||
} | } | ||
Line 213: | Line 211: | ||
exec function RemoveMultiLaden() // Remove 10 messages (last). | exec function RemoveMultiLaden() // Remove 10 messages (last). | ||
{ | { | ||
Array_Remove(Laden, Array_Size(Laden)-10, 10 ); // Remove 10 messages (last). | |||
SaveConfig(); | SaveConfig(); | ||
} | } | ||
Line 220: | Line 218: | ||
{ | { | ||
local Nali N; | local Nali N; | ||
foreach allactors(class'Nali',N) | foreach allactors(class'Nali',N) | ||
Laden[Array_Size(Laden)] = string(N); | |||
SaveConfig(); | SaveConfig(); | ||
} | } | ||
Replicate (227i): | |||
var array<string> ClientLaden; | |||
replication | |||
{ | |||
reliable if( Role==ROLE_Authority ) | |||
SendLaden, SendAllLaden, ReturnLaden; | |||
} | |||
simulated function SendAllLaden() // Send all messages to client. | |||
{ | |||
local int I; | |||
for(I=0;I<Array_Size(Laden);I++) | |||
SendLaden(I, Laden[I]); // To client. | |||
} | |||
simulated function SendLaden(int Slot, string S) // Send single message to client. | |||
{ | |||
ClientLaden[Slot] = S; | |||
} | |||
simulated function string ReturnLaden(int Slot) // Get from client. FIXME: This does not work like this. | |||
{ | |||
local string S; | |||
S = ClientLaden[Slot]; | |||
return S; | |||
} | |||
exec function GetLaden(int Slot) // Broadcast single message. | |||
{ | |||
local string S; | |||
SendLaden(Slot, Laden[Slot]); | |||
S = ReturnLaden(Slot); | |||
Pawn(Owner).ClientMessage(S); | |||
} | |||
exec function GetAllLaden() // Broadcast all messages. | |||
{ | |||
local int I; | |||
local string S; | |||
// SendAllLaden(); | |||
for(I=0;I<Array_Size(Laden);I++) | |||
{ | |||
SendLaden(I, Laden[I]); | |||
S = ReturnLaden[I]; | |||
Pawn(Owner).ClientMessage(S); | |||
} | |||
} | |||
defaultproperties | |||
{ | |||
bAlwaysRelevant=False | |||
RemoteRole=Role_SimulatedProxy | |||
} | |||
[[Category:Scripting]] | |||
[[Category:Mods]] | |||
[[Category:General]] |
Latest revision as of 19:16, 25 November 2012
class KlondikeInventoryHandler extends KlondikeBaseModule; struct PlayerInventory { var Pawn InvOwner; var Array<Actor> InvList; var int InvMax; var int TravelHealth; var class<actor> SelectedWeapon; var class<actor> SelectedItem; }; var PlayerInventory OriginalInventory[32]; function HandleInventory(Pawn P) { local int i; local int x; local int Max; local pickup NewPickup; local weapon NewWeapon; local playerpawn PP; if (P == None || !p.IsA('PlayerPawn')) Return; PP=PlayerPawn(P); for(i=0; I<32; i++) { if(OriginalInventory[i].InvOwner != None && OriginalInventory[i].InvOwner == P) { //log("OMFGWTF"@OriginalInventory[i].InvList[0]); Max = OriginalInventory[i].InvMax; //x=Max; while(OriginalInventory[i].InvList[x] != None) { if(OriginalInventory[i].InvList[x].isa('Pickup')) { NewPickup=Pickup(SpawnAct(OriginalInventory[i].InvList[x].Class,P.Location,P.Rotation,,P,P,OriginalInventory[i].InvList[x],true)); if (NewPickup != None) { NewPickup.bHeldItem = true; NewPickup.GiveTo(PP); if(NewPickup.IsA('Translator')) PP.SelectedItem = NewPickup; NewPickup.PickupFunction(PP); NewPickup.TravelPreAccept(); NewPickup.TravelPostAccept(); if(NewPickup.isa('Ammo')) { Ammo(PP.FindInventoryType(NewPickup.Class)).AddAmmo(Ammo(NewPickup).AmmoAmount); } } else log("fUCK OMG"@OriginalInventory[i].InvList[x].Class@"failed"); } else if(OriginalInventory[i].InvList[x].isa('weapon')) { NewWeapon=Weapon(SpawnAct(OriginalInventory[i].InvList[x].Class,P.Location,P.Rotation,,P,P,OriginalInventory[i].InvList[x],true)); if (NewWeapon != None) { newWeapon.Instigator = PP; newWeapon.BecomeItem(); PP.AddInventory(newWeapon); newWeapon.SetSwitchPriority(PP); newWeapon.WeaponSet(PP); NewWeapon.TravelPreAccept(); NewWeapon.TravelPostAccept(); } else log("fUCK OMG pickup"@OriginalInventory[i].InvList[x].Class@"failed"); } x++; if (OriginalInventory[i].InvList[x] == None) { PP.PendingWeapon = Weapon(PP.FindInventoryType(OriginalInventory[i].SelectedWeapon)); if (PP.Weapon != None) PP.Weapon.PutDown(); PP.SelectedItem = Pickup(PP.FindInventoryType(OriginalInventory[i].SelectedItem)); PP.Health = OriginalInventory[i].TravelHealth; Break; } } } } } function HandleModifyTravelList(Pawn Other,bool bDelete) { local int i; local int x; local inventory inv; local array<Actor> TravelList; if (!bDelete) { for(i=0; I<32; i++) { if(OriginalInventory[i].InvOwner != None) Continue; else { OriginalInventory[i].InvOwner = Other; if (Other.Inventory != None) for(inv=Other.Inventory; inv!=None; inv=inv.inventory) { if (x >= 1 && Inv == Other.Inventory) break; TravelList[x] = SpawnAct(inv.Class,Vect(65535,65535,65535),,,None,None,inv,true); TravelList[x].SetCollision(false,false,false);//If vect(0,0,0) is valid.. hide and make it noncollidable just in case. TravelList[x].bHidden = True; Inventory(TravelList[x]).Inventory = None; //Dereference inventory that will be deleted eventually anyway. if (TravelList[x].IsA('Weapon')) Weapon(TravelList[x]).PickupAmmoCount=0; //Fix ammo count crap. x++; } OriginalInventory[i].InvList = TravelList; OriginalInventory[i].InvMax = X; OriginalInventory[i].SelectedItem = Other.SelectedItem.Class; OriginalInventory[i].SelectedWeapon = Other.Weapon.Class; OriginalInventory[i].TravelHealth = Other.Health; break; } } } else if (bDelete) { if (Other != None && Other.isa('PlayerPawn')) { for(i=0; I<32; i++) { if(OriginalInventory[i].InvOwner == Other) OriginalInventory[i].InvOwner = None; while(OriginalInventory[i].InvList[x] != None) { OriginalInventory[i].InvList[x].Destroy(); x++; } break; } } } } defaultproperties { }
227i:
class Luden expands Inventory config(Luden); var() config string LadenS[15]; // Normal (static) array. Limits to 15. var() config array<string> Laden; // Dynamic array. No limit. exec function AddLaden(string s) // Add 1 more message. { Laden[Array_Size(Laden)] = S; SaveConfig(); } exec function ClearLaden() // Clear all messages. { Array_Remove(Laden,Array_Size(Laden) ); SaveConfig(); } exec function ShowLaden() // Show all messages. { local int I; for(I=0;I<Array_Size(Laden);I++) Pawn(Owner).ClientMessage(I@Laden[I]); } exec function AddMultiLaden() // Add 10 "HI's" more. { local int I; for( I=Array_Size(Laden); I<(Array_Size(Laden)+10); I++) Laden[I] = "HI"; SaveConfig(); } exec function ReplaceMultiLaden() // Replace 10 first to "HI2". { local int I; for(I=0;I<10;I++) Laden[I] = "HI2"; SaveConfig(); } exec function ReplaceAllLaden() // Replace all messages to "HI3". { local int I; for(I=0;I<Array_Size(Laden);I++) Laden[I] = "HI3"; SaveConfig(); } exec function RemoveLaden() // Remove 1 message (last). { Array_Remove(Laden, 1 ); SaveConfig(); } exec function RemoveMultiLaden() // Remove 10 messages (last). { Array_Remove(Laden, Array_Size(Laden)-10, 10 ); // Remove 10 messages (last). SaveConfig(); } exec function NalibinLaden() // Find all Nalis and add them to Laden array. { local Nali N; foreach allactors(class'Nali',N) Laden[Array_Size(Laden)] = string(N); SaveConfig(); }
Replicate (227i):
var array<string> ClientLaden; replication { reliable if( Role==ROLE_Authority ) SendLaden, SendAllLaden, ReturnLaden; } simulated function SendAllLaden() // Send all messages to client. { local int I; for(I=0;I<Array_Size(Laden);I++) SendLaden(I, Laden[I]); // To client. } simulated function SendLaden(int Slot, string S) // Send single message to client. { ClientLaden[Slot] = S; } simulated function string ReturnLaden(int Slot) // Get from client. FIXME: This does not work like this. { local string S; S = ClientLaden[Slot]; return S; } exec function GetLaden(int Slot) // Broadcast single message. { local string S; SendLaden(Slot, Laden[Slot]); S = ReturnLaden(Slot); Pawn(Owner).ClientMessage(S); } exec function GetAllLaden() // Broadcast all messages. { local int I; local string S; // SendAllLaden(); for(I=0;I<Array_Size(Laden);I++) { SendLaden(I, Laden[I]); S = ReturnLaden[I]; Pawn(Owner).ClientMessage(S); } } defaultproperties { bAlwaysRelevant=False RemoteRole=Role_SimulatedProxy }