Dynamic array

From Oldunreal-Wiki
Revision as of 19:16, 25 November 2012 by .:..: (talk | contribs) (Update to 227i)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
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
}