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();
}