Inventory script now with armor fields :D

Hi!

Here’s my better inventory script

Everybody can edit if. I hope I could help u with it. If someone finds bugs please just tell me.

This is an open source project so please edit it and post your better script:

Inventory.js

var manager :inv_manager;

var offset :Vector2 = Vector2(40,30);

var offsetTop :int = 20;
var offsetTop2:int = 70;
private var draggedItem :int;

private var draggedAmount :int;

private var windowRect : Rect = Rect (20, 20, 120, 50);

private var selectedTab :int;

private var hoveredItem :int;

class inv{
	var WindowSize :Vector2 = Vector2(500,400);
	var fieldContents :field[];
	var quickContents :field[];
	var lines :int = 4; //how many lines of the top part
	var perLine :int = 10; //how many fields per Line
	var size :Vector2 = Vector2(40,40); //the size of the fields
	var spacing :Vector2 = Vector2(2,2); //space between the fields
	var onLeftClick :OnLeftClick = OnLeftClick.TakeFullStack; //on left click on full field
	var onRightClick :OnRightClick = OnRightClick.TakeHalfStack; //on right click on full field
	var MaxStack :MaxStackType = MaxStackType.both; //Is the maximum stack only for top only for bottom or for both?
}


var inventory :inv;

class ar{
	var WindowSize :Vector2 = Vector2(500,400);
	var armorTexture :Texture;
	var TextureRect :Rect = Rect(130,0,200,290);
	var Fields :armorType[];
	var onLeftClick :OnLeftClick = OnLeftClick.TakeFullStack;
	var onRightClick :OnRightClick = OnRightClick.TakeHalfStack;
}

class armorType{
	var id :int;
	var amount :int;
	var max_amount :int = 64; //Yes I like minecraft :smile:
	var rect :Rect = Rect(0,0,40,40);
	var availibleFor :Types[];
	var name :String = "Field";
}
class field{
	public var id :int;
	public var amount:int;
}
var armor :ar;


class s{
	var ClickSounds :AudioClip[];
	var HoverSounds :AudioClip[];
	var UnAbleSounds :AudioClip[];
}
var sounds :s;



function Start(){
	inventory.fieldContents = new field[inventory.lines * inventory.perLine + inventory.perLine];
	inventory.quickContents = new field[inventory.perLine];

}
function Update(){
	if(selectedTab == 0){
		windowRect.width = inventory.WindowSize.x;
		windowRect.height = inventory.WindowSize.y;
	}else if(selectedTab == 1){
		windowRect.width = armor.WindowSize.x;
		windowRect.height = armor.WindowSize.y;
	}
/*	if(!manager.mouseOver(windowRect)){
		if(draggedItem != 0){
			if(Input.GetKeyDown("mouse 0") || Input.GetKeyDown("mouse 1")){
				draggedItem = 0;
			}
		}
	}*/
	
	
	
}
//By the Way: "The Cake is a lie!"
function OnGUI(){
	windowRect = GUI.Window (0, windowRect, Window, "");
	if(draggedItem != 0){
		GUI.Window(1, Rect(Input.mousePosition.x,Screen.height-Input.mousePosition.y,60,60), draggedItemWindow, "", GUIStyle.none);
		GUI.BringWindowToFront(1);
	}else{
		if(hoveredItem != 0){
			GUI.Window(2, Rect(Input.mousePosition.x,Screen.height-Input.mousePosition.y, manager.Items[hoveredItem - 1].title.length * 7,25), hoveredItemWindow, "");
			GUI.BringWindowToFront(2);
		}
	}
	
}
function hoveredItemWindow(){
	if(draggedItem == 0){
		if(hoveredItem != 0){
			GUI.Label(Rect(0,0,500,500), manager.Items[hoveredItem - 1].title);
		}
	}
}
function draggedItemWindow(){
	if(draggedItem != 0){
		GUI.DrawTexture(Rect(0,0,inventory.size.x - 5,inventory.size.y - 5), manager.Items[draggedItem-1].texture, ScaleMode.StretchToFill, true, 10.0f);
		if(draggedAmount >= 2)
			GUI.Label(Rect(inventory.size.x - 15, inventory.size.y - 15,inventory.size.x-5,inventory.size.y-5),draggedAmount.ToString());
		
	}
}
function Window(){
	if(GUI.Button(Rect(offset.x / 2, offsetTop, 60,60), "0")){
		selectedTab = 0;
	}
	if(GUI.Button(Rect(offset.x / 2 + 60 + inventory.spacing.x, offsetTop, 60,60), "1")){
		selectedTab = 1;
	}
	if(selectedTab == 0){
		var i :int = 0;
		for(var line:int = 0; line<inventory.lines; line++){
			for(var n :int = 0; n<inventory.perLine; n++){
				var position_x :int = n*inventory.size.x + n*inventory.spacing.x + offset.x / 2;
				var position_y :int = line*inventory.size.y + line*inventory.spacing.y + offset.y / 2 + offsetTop + offsetTop2;
				var realposition_x :int = (n*inventory.size.x + n*inventory.spacing.x + offset.x / 2) + windowRect.x;
				var realposition_y :int = (line*inventory.size.y + line*inventory.spacing.y + offset.y / 2 + offsetTop) + windowRect.y;
				if(inventory.fieldContents[i] != null  inventory.fieldContents[i].id != 0  inventory.fieldContents[i].id <= manager.Items.Length){
					//field with content
					if(inventory.MaxStack != MaxStackType.onlyQuickLine){
						if(inventory.fieldContents[i].amount > manager.Items[inventory.fieldContents[i].id - 1].MaxPerStack){
							draggedAmount = draggedAmount + inventory.fieldContents[i].amount - manager.Items[inventory.fieldContents[i].id - 1].MaxPerStack;
							draggedItem = inventory.fieldContents[i].id;
							inventory.fieldContents[i].amount = manager.Items[inventory.fieldContents[i].id - 1].MaxPerStack;
						}
					}
					if(GUI.Button(Rect(position_x, position_y, inventory.size.x, inventory.size.y), manager.Items[inventory.fieldContents[i].id-1].texture)){
						manager.playSound(manager.clickSound3);
						if(draggedItem == 0){
							if (Event.current.button == 1){
								if(inventory.onRightClick == OnRightClick.ShowInformation){
									ShowInfo(i);
								}else if(inventory.onRightClick == OnRightClick.TakeFullStack){
									draggedItem = inventory.fieldContents[i].id;
									draggedAmount = inventory.fieldContents[i].amount;
									inventory.fieldContents[i].id = 0;
									inventory.fieldContents[i].amount = 0;
								}else{
									if(inventory.fieldContents[i].amount > 1){
										draggedItem = inventory.fieldContents[i].id;
										draggedAmount = (inventory.fieldContents[i].amount / 2);
										inventory.fieldContents[i].amount -= draggedAmount;
									}else{
										draggedAmount = 1;
										draggedItem = inventory.fieldContents[i].id;
									}
								}
							}else if(Event.current.button == 0){
								if(inventory.onLeftClick == OnLeftClick.ShowInformation){
									ShowInfo(i);
								}else if(inventory.onLeftClick == OnLeftClick.TakeFullStack){
									draggedItem = inventory.fieldContents[i].id;
									draggedAmount = inventory.fieldContents[i].amount;
									inventory.fieldContents[i].id = 0;
									inventory.fieldContents[i].amount = 0;
								}else{
									if(inventory.fieldContents[i].amount > 1){
										draggedItem = inventory.fieldContents[i].id;
										draggedAmount = (inventory.fieldContents[i].amount / 2);
										inventory.fieldContents[i].amount -= draggedAmount;
									}else{
										draggedAmount = 1;
										draggedItem = inventory.fieldContents[i].id;
									}
								}
							}
						}else{
							if(inventory.fieldContents[i].id == draggedItem){
								if(Event.current.button == 0){
									inventory.fieldContents[i].amount += draggedAmount;
									draggedItem = 0;
									draggedAmount = 0;
								}else if(Event.current.button == 1){
									inventory.fieldContents[i].amount += Mathf.CeilToInt(draggedAmount / 2);
									draggedAmount = draggedAmount - Mathf.CeilToInt(draggedAmount / 2);
									if(draggedAmount == 0)
										draggedItem = 0;
								}
							}
						}
					}
					
					if(inventory.fieldContents[i] != null  inventory.fieldContents[i].amount > 1){
						GUI.Label(Rect(position_x + inventory.size.x - 15,position_y + inventory.size.y - 20,30,20),inventory.fieldContents[i].amount.ToString());
					}
				}else{
					//empty field
					if(GUI.Button(Rect(position_x, position_y, inventory.size.x, inventory.size.y), "")){
						manager.playSound(manager.clickSound2);
						if(Event.current.button == 1){
							if(draggedItem != 0){
								inventory.fieldContents[i].id = draggedItem;
								inventory.fieldContents[i].amount += Mathf.CeilToInt(draggedAmount / 2);
								draggedAmount = draggedAmount - Mathf.CeilToInt(draggedAmount / 2);
								if(draggedAmount == 0)
									draggedItem = 0;
							}
						}else if(Event.current.button == 0){
							if(draggedItem != 0){
								inventory.fieldContents[i].id = draggedItem;
								inventory.fieldContents[i].amount = draggedAmount;
								draggedItem = 0;
								draggedAmount = 0;
							}
						}
					}
					
				}
				i++;
			}
		}
			for(var y :int = 0; y<inventory.perLine; y++){
			var p_x :int = y*inventory.size.x + y*inventory.spacing.x + offset.x / 2;
			var p_y = inventory.lines*inventory.size.y + inventory.lines*inventory.spacing.y + inventory.size.y + offset.y / 2 + offsetTop + offsetTop2;
			if(inventory.quickContents[y] != null  inventory.quickContents[y].id != 0  inventory.quickContents[y].id <= manager.Items.Length){
				if(inventory.MaxStack != MaxStackType.onlyTopPart){
					if(inventory.quickContents[y].amount > manager.Items[inventory.quickContents[y].id - 1].MaxPerStack){
						draggedAmount = draggedAmount + inventory.quickContents[y].amount - manager.Items[inventory.quickContents[y].id - 1].MaxPerStack;
						draggedItem = inventory.quickContents[y].id;
						inventory.quickContents[y].amount = manager.Items[inventory.quickContents[y].id - 1].MaxPerStack;
					}
				}
				//filled Field
				if(GUI.Button(Rect(p_x, p_y, inventory.size.x, inventory.size.y), manager.Items[inventory.quickContents[y].id - 1].texture)){
					if(draggedItem == 0){
					//an Item is dragged
						if(Event.current.button == 0){
							if(inventory.onLeftClick == OnLeftClick.ShowInformation){
								ShowInfo(inventory.quickContents[y].id - 1);
							}else if(inventory.onLeftClick == OnLeftClick.TakeFullStack){
								draggedItem = inventory.quickContents[y].id;
								draggedAmount = inventory.quickContents[y].amount;
								inventory.quickContents[y].id = 0;
								inventory.quickContents[y].amount = 0;
							}else{
								if(inventory.quickContents[y].amount > 1){
									draggedItem = inventory.quickContents[y].id;
									draggedAmount = (inventory.quickContents[y].amount / 2);
									inventory.quickContents[y].amount -= draggedAmount;
								}else{
									draggedAmount = 1;
									draggedItem = inventory.quickContents[y].id;
								}
							}
						}else if(Event.current.button == 1){
							if(inventory.onRightClick == OnRightClick.ShowInformation){
								ShowInfo(inventory.quickContents[y].id - 1);
							}else if(inventory.onRightClick == OnRightClick.TakeFullStack){
								draggedItem = inventory.quickContents[y].id;
								draggedAmount = inventory.quickContents[y].amount;
								inventory.quickContents[y].id = 0;
								inventory.quickContents[y].amount = 0;
							}else{
								if(inventory.quickContents[y].amount > 1){
									draggedItem = inventory.quickContents[y].id;
									draggedAmount = (inventory.quickContents[y].amount / 2);
									inventory.quickContents[y].amount -= draggedAmount;
								}else{
									draggedAmount = 1;
									draggedItem = inventory.quickContents[y].id;
								}
							}
						}
					}else{
					//click without Item in one hand
						if(inventory.quickContents[y].id == draggedItem){
							if(Event.current.button == 0){
								inventory.quickContents[y].amount += draggedAmount;
								draggedItem = 0;
								draggedAmount = 0;
							}else if(Event.current.button == 1){
								inventory.quickContents[y].amount += Mathf.CeilToInt(draggedAmount / 2);
								draggedAmount = draggedAmount - Mathf.CeilToInt(draggedAmount / 2);
								if(draggedAmount == 0)
									draggedItem = 0;
							}
						}
					}
				}
				if(inventory.quickContents[y] != null  inventory.quickContents[y].amount > 1){
					GUI.Label(Rect(p_x + inventory.size.x - 15,p_y + inventory.size.y - 20,30,20),inventory.quickContents[y].amount.ToString());
				}
			}else{
				if(GUI.Button(Rect(p_x, p_y, inventory.size.x, inventory.size.y), "")){
					if(draggedItem != 0){
						if(Event.current.button == 0){
							//left click
							if(draggedItem == inventory.quickContents[y].id){
								//same item
								inventory.quickContents[y].amount = draggedAmount;
								draggedAmount = 0;
								draggedItem = 0;
							}else{
								//other item
								var old_amount = inventory.quickContents[y].amount;
								var old_id = inventory.quickContents[y].id;
								inventory.quickContents[y].id = draggedItem;
								inventory.quickContents[y].amount = draggedAmount;
								draggedItem = old_id;
								draggedAmount = old_amount;
							}
						}
						if(Event.current.button == 1){
							//right click
							if(draggedItem == inventory.quickContents[y].id){
								//same item
								inventory.quickContents[y].amount = Mathf.CeilToInt(draggedAmount);
								draggedAmount = inventory.quickContents[y].amount;
								draggedItem = 0;
							}else{
								//other item
								var old_amount1 = inventory.quickContents[y].amount;
								var old_id1 = inventory.quickContents[y].id;
								inventory.quickContents[y].id = draggedItem;
								inventory.quickContents[y].amount = draggedAmount;
								draggedItem = old_id1;
								draggedAmount = old_amount1;
							}
						}
					}
				}
			}
			
		}
		
		}else{
		//BACKGROUND TEXTURE//
		if(armor.armorTexture != null)
			GUI.DrawTexture(Rect(armor.TextureRect.x + offset.x / 2, armor.TextureRect.y + offsetTop + offsetTop2, armor.TextureRect.width, armor.TextureRect.height), armor.armorTexture);
		
		//ALL FIELDS//
		for(var index :int; index<armor.Fields.Length; index++){
			if(armor.Fields[index] != null){
				var c_rect :Rect = Rect(armor.Fields[index].rect.x + offset.x / 2, armor.Fields[index].rect.y + offset.y / 2 + offsetTop + offsetTop2, armor.Fields[index].rect.width, armor.Fields[index].rect.height);
				var c_name :String = armor.Fields[index].name;
				var c_availibles :Types[] = armor.Fields[index].availibleFor;
				var c_id :int = armor.Fields[index].id;
				var c_amount :int = armor.Fields[index].amount;
				var c_max_amount :int = armor.Fields[index].max_amount;
				
				if(c_id != 0  c_id <= manager.Items.Length){
				//////////////////////////////////////////////////////////////////////////////////////////////
				//////////////////////////////////////////////////////////////////////////////////////////////
				//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
				//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
				if(c_amount > manager.Items[c_id - 1].MaxPerStack){
					draggedAmount = draggedAmount +  c_amount - manager.Items[ c_id - 1].MaxPerStack;
					draggedItem =  c_id;
					c_amount = manager.Items[ c_id - 1].MaxPerStack;
				}
				if(c_amount > armor.Fields[index].max_amount){
					draggedAmount = draggedAmount + c_amount + armor.Fields[index].max_amount;
					draggedItem =  c_id;
					c_amount = armor.Fields[index].max_amount;
				}
				//filled Field
				if(GUI.Button(Rect(armor.Fields[index].rect.x + offset.x / 2, armor.Fields[index].rect.y + offset.y / 2 + offsetTop + offsetTop2,  armor.Fields[index].rect.width,  armor.Fields[index].rect.height), manager.Items[ c_id - 1].texture)){
					if(draggedItem == 0){
						//an Item is dragged
						if(Event.current.button == 0){
							if(armor.onLeftClick == OnLeftClick.ShowInformation){
								ShowInfo( c_id - 1);
							}else if( armor.onLeftClick == OnLeftClick.TakeFullStack){
								draggedItem =  c_id;
								draggedAmount =  c_amount;
								c_id = 0;
								c_amount = 0;
							}else{
								if( c_amount > 1){
									draggedItem =  c_id;
									draggedAmount = ( c_amount / 2);
									c_amount -= draggedAmount;
								}else{
									draggedAmount = 1;
									draggedItem =  c_id;
								}
							}
						}else if(Event.current.button == 1){
							if( armor.onRightClick == OnRightClick.ShowInformation){
								ShowInfo( c_id - 1);
							}else if( armor.onRightClick == OnRightClick.TakeFullStack){
								draggedItem =  c_id;
								draggedAmount =  c_amount;
								c_id = 0;
								c_amount = 0;
							}else{
								if(c_amount > 1){
									draggedItem =  c_id;
									draggedAmount = ( c_amount / 2);
									c_amount -= draggedAmount;
								}else{
									draggedAmount = 1;
									draggedItem =  c_id;
								}
							}
						}
					}else{
						//click without Item in one hand
						if( c_id == draggedItem){
							if(Event.current.button == 0){
								c_amount += draggedAmount;
								draggedItem = 0;
								draggedAmount = 0;
							}else if(Event.current.button == 1){
								 c_amount += Mathf.CeilToInt(draggedAmount / 2);
								draggedAmount = draggedAmount - Mathf.CeilToInt(draggedAmount / 2);
								if(draggedAmount == 0)
									draggedItem = 0;
							}
						}
					}
				}
				if(c_amount > 1){
					GUI.Label(Rect(p_x +  armor.Fields[index].rect.x - 15,p_y +  armor.Fields[index].rect.y - 20,30,20), c_amount.ToString());
				}
			}else{
				if(GUI.Button(Rect(armor.Fields[index].rect.x + offset.x / 2, armor.Fields[index].rect.y + offset.y / 2 + offsetTop + offsetTop2,  armor.Fields[index].rect.width,  armor.Fields[index].rect.height), "")){
					if(draggedItem != 0){
						if(Event.current.button == 0){
							//left click
							c_id = draggedItem;
							c_amount = draggedAmount;
							draggedItem = 0;
							draggedAmount = 0;
						}
						if(Event.current.button == 1){
							//right click
							if(draggedItem ==  c_id){
								 c_id = draggedItem;
								 c_amount = draggedAmount;
								draggedItem = 0;
								draggedAmount = 0;
							}
						}
					}
				}
			}
				//////////////////////////////////////////////////////////////////////////////////////////////
				//////////////////////////////////////////////////////////////////////////////////////////////
				//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
				//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
				armor.Fields[index].amount = c_amount;
				armor.Fields[index].id = c_id;
			}
		}
		
	}
	GUI.DragWindow (Rect (0,0,Screen.width,Screen.height));
	
}
function ShowInfo(id :int){
	
}
function Save(name :String){
	if(name == null){
		name = "Current";
	}
	for(var i :int=0; i< inventory.quickContents.Length; i++){
		PlayerPrefs.SetInt(name + "_inv["+i+"]",  inventory.fieldContents[i].id);
	}
	print("Sucessfully saved!");
}

function Load(name :String){
	if(name == null){
		name = "Current";
	}
	for(var i :int=0; i< inventory.quickContents.Length; i++){
		if(PlayerPrefs.GetInt(name + "_inv["+i+"]") != null){
			 inventory.fieldContents[i].id = PlayerPrefs.GetInt(name + "_inv["+i+"]");
		}
	}
	print("Sucessfully loaded!");
}

inv_manager.js

#pragma strict
var clickSound1 :AudioClip;
var clickSound2 :AudioClip;
var clickSound3 :AudioClip;
var hoverSound1 :AudioClip;
var hoverSound2 :AudioClip;
var hovered :boolean[];
var Items :item[];
enum Types {
	sword,
	helmet,
	armor,
	amulet,
	quickContents,
	ring
}
enum OnLeftClick{
	TakeFullStack,
	TakeHalfStack,
	ShowInformation
}
enum MaxStackType{
	both,
	onlyTopPart,
	onlyQuickLine
}
enum OnRightClick{
	TakeFullStack,
	TakeHalfStack,
	ShowInformation
}

class item{
	var texture :Texture;
	var title :String;
	var availibleFor :Types[];
	var MaxPerStack :int = 1;
}
function playRandomHoverSound(){
	var ran :float = Random.value;
	if(ran <= 1  ran >= 0.5){
		audio.clip = hoverSound1;
		audio.Play();
	}else{
		audio.clip = hoverSound2;
		audio.Play();
	}
}
function mouseOver(rect :Rect){
	if(Input.mousePosition.x >= rect.x  Input.mousePosition.x <= rect.x + rect.width){
		if(Screen.height - Input.mousePosition.y >= rect.y  Screen.height - Input.mousePosition.y <= rect.y + rect.height){
			return true;	
		}
	}else{
		return false;
	}
}
function mouseOver(rect :Rect, i :int){
	if(Input.mousePosition.x >= rect.x  Input.mousePosition.x <= rect.x + rect.width){
		if(Screen.height - Input.mousePosition.y >= rect.y  Screen.height - Input.mousePosition.y <= rect.y + rect.height){
			if(hovered[i] == false){
				hovered[i] = true;
				return true;	
			}else{
				hovered[i] = true;
				return false;
			}
		}
	}else{
		hovered[i] = false;
		return false;
	}
}
function playSound(a :AudioClip){
	audio.clip = a;
	audio.Play();
}

Hey, nice system here, exactly what i wanted, maybe you can make tutorial how to implement it? I cant understand how to do sertain thing. Sorry if my english is bad, I am from centre of europe :smile: Lithuania

Aš irgi :smile: