RMRK is retiring.
Registration is disabled. The site will remain online, but eventually become a read-only archive. More information.

RMRK.net has nothing to do with Blockchains, Cryptocurrency or NFTs. We have been around since the early 2000s, but there is a new group using the RMRK name that deals with those things. We have nothing to do with them.
NFTs are a scam, and if somebody is trying to persuade you to buy or invest in crypto/blockchain/NFT content, please turn them down and save your money. See this video for more information.
[XP] Item Storage

0 Members and 1 Guest are viewing this topic.

***
Rep:
Level 84
Yes, hoh my gawd!
Item Storage
Authors: game_guy
Version: 1.2
Type: Item Storage
Key Term: Misc System

Introduction

If you've ever played any of the Elder Scrolls series or Fallout series than of
course then you would have noticed the awesome item storage. This script does that

Features

  • Store and Take Items Out of Chests, Closets, ect
  • Have Seperate Chests, Closets, ect
  • Easy to use
  • Stores Chests into Game System Instead of Variables
  • Have Max Amount of Items In Chest
  • Set Default Items in Chest

Screenshots

Spoiler for:
Chest 1

Chest 1 Storage

Chest 2

Chest 2 Storage

Demo

MediaFire

Script

Spoiler for:
Code: [Select]
#===============================================================================
# Item Storage
# Author game_guy
# Version 1.2
#-------------------------------------------------------------------------------
# Intro:
# Okay. Well if you've played the Elder Scrolls Series or Fallout then you'd
# know that it has an item storage system. What it does is lets you open up
# closets, chests, ect and store and take items out of it.
#
# Features:
# Store and Take Items Out of Chests, Closets, ect
# Have Seperate Chests, Closets, ect
# Easy to Use
# Stores Chests into Game System Instead of Variables
# Have Max Amount of Items In Chest
# Set Default Items in Chest
#
# Instructions:
# First lets go over the syntaxes.
#
# Calling the Item Storage:
# $scene = Scene_Chest.new(chest_id, max_items)
# chest_id is the number chest you want open
# max_items is the max amount of any item the chest can hold
# you can just use this to
# $scene = Scene_Chest.new(chest_id)
# because in the config this ChestMaxItems is the default so if you dont use
# the long one, it'll use the default.
#
# Adding/Removing Items from Chest:
# This feature is still being worked on. But what it will allow you to do
# is add an item or remove it whithout actually opening the chest.
#
# Okay so thats done with the syntaxes. Now onto the configuration.
# Go down to Begin Config and do all your configuration there.
#
# Credits:
# game_guy ~ for making it
# MightyLink ~ requesting the system
#===============================================================================
module GameGuy
  #============================================================================
  # ChestMaxItems   = The max amount of any item a chest can hold. So example
  #                   Its 9999 so it can have 9999 of any item.
  #============================================================================
  ChestMaxItems     = 9999
  def self.chest_items(id)
    case id
    #==========================================================================
    # Config Chest Items
    # Use this
    # when chest_id then return [[id, amount, type], [id, amount, type]]
    # id = item, weapon, or armor id
    # amount = the amount
    # type = 0, 1, or 2 0 = item, 1 = weapon, 2 = armor
    # Example:
    # when 1 then return [[1, 3, 0], [1, 1, 1]]
    # This has 3 potions, and 1 bronze sword. So when this is called
    # $scene = Scene_Chest.new(1)
    # it will have those items in the chest already.
    #==========================================================================
    when 1 then return [[1, 999, 0], [1, 1, 1]]
    when 2 then return [[1, 10, 0], [1, 1, 2], [1, 2, 1]]
    when 3 then return [[1, 10, 2], [3, 1, 1], [9, 1, 1]]
    end
    return []
  end
end

#==============================================================================
# Game_System
#------------------------------------------------------------------------------
# Modded it so it makes it store every chest.
#==============================================================================
class Game_System
  attr_accessor :chests
  alias gg_add_item_storage initialize
  def initialize
    @chests = []
    return gg_add_item_storage
  end
  def add_chest(chest)
    @chests[chest] = $chest
  end
end

#==============================================================================
# Game_Chest
#------------------------------------------------------------------------------
# Holds all the data for a single chest.
#==============================================================================
class Game_Chest
  attr_accessor :max
  def initialize(max)
    @max = max
    @items = {}
    @weapons = {}
    @armors = {}
  end
  def item_amount(item_id)
    return @items.include?(item_id) ? @items[item_id] : 0
  end
  def weapon_amount(weapon_id)
    return @weapons.include?(weapon_id) ? @weapons[weapon_id] : 0
  end
  def armor_amount(armor_id)
    return @armors.include?(armor_id) ? @armors[armor_id] : 0
  end
  def add_item(item_id, n)
    if item_id > 0
      @items[item_id] = [[item_amount(item_id) + n, 0].max, @max].min
    end
  end
  def add_weapon(weapon_id, n)
    if weapon_id > 0
      @weapons[weapon_id] = [[weapon_amount(weapon_id) + n, 0].max, @max].min
    end
  end
  def add_armor(armor_id, n)
    if armor_id > 0
      @armors[armor_id] = [[armor_amount(armor_id) + n, 0].max, @max].min
    end
  end
  def take_item(item_id, n)
    add_item(item_id, -n)
  end
  def take_weapon(weapon_id, n)
    add_weapon(weapon_id, -n)
  end
  def take_armor(armor_id, n)
    add_armor(armor_id, -n)
  end
end

#==============================================================================
# Window_Chest_Choices
#------------------------------------------------------------------------------
# The choices for the chest when the scene is opened.
#==============================================================================
class Window_Chest_Choices < Window_Selectable
  def initialize
    super(0, 0, 640, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    @item_max = 3
    @column_max = 3
    @commands = ["Store Items", "Take Items", "Exit"]
    self.z = 200
    refresh
    self.index = 0
  end
  def refresh
    self.contents.clear
    for i in 0...@item_max
      draw_item(i)
    end
  end
  def draw_item(index)
    x = 4 + index * 215
    self.contents.draw_text(x, 0, 128, 32, @commands[index], 1)
  end
end

#==============================================================================
# Window_Chest_Item
#------------------------------------------------------------------------------
# Displays all items in the chest.
#==============================================================================
class Window_Chest_Item < Window_Selectable
  def initialize
    super(320, 64, 320, 416)
    @column_max = 1
    refresh
    self.index = 0
    if $game_temp.in_battle
      self.y = 64
      self.height = 256
      self.back_opacity = 160
    end
  end
  def item
    return @data[self.index]
  end
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    for i in 1...$data_items.size
      if $chest.item_amount(i) > 0
        @data.push($data_items[i])
      end
    end
    unless $game_temp.in_battle
      for i in 1...$data_weapons.size
        if $chest.weapon_amount(i) > 0
          @data.push($data_weapons[i])
        end
      end
      for i in 1...$data_armors.size
        if $chest.armor_amount(i) > 0
          @data.push($data_armors[i])
        end
      end
    end
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
  def draw_item(index)
    item = @data[index]
    case item
    when RPG::Item
      number = $chest.item_amount(item.id)
    when RPG::Weapon
      number = $chest.weapon_amount(item.id)
    when RPG::Armor
      number = $chest.armor_amount(item.id)
    end
    x = 4 + index % @column_max * (288 + 32)
    y = index / @column_max * 32
    rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon(item.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
    self.contents.draw_text(x + 216, y, 16, 32, ":", 1)
    self.contents.draw_text(x + 224, y, 48, 32, number.to_s, 2)
  end
  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.description)
  end
end

#==============================================================================
# Window_Party_Item
#------------------------------------------------------------------------------
# Displays all items the party has.
#==============================================================================
class Window_Party_Item < Window_Selectable
  def initialize
    super(0, 64, 320, 416)
    @column_max = 1
    refresh
    self.index = 0
    if $game_temp.in_battle
      self.y = 64
      self.height = 256
      self.back_opacity = 160
    end
  end
  def item
    return @data[self.index]
  end
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    for i in 1...$data_items.size
      if $game_party.item_number(i) > 0
        @data.push($data_items[i])
      end
    end
    unless $game_temp.in_battle
      for i in 1...$data_weapons.size
        if $game_party.weapon_number(i) > 0
          @data.push($data_weapons[i])
        end
      end
      for i in 1...$data_armors.size
        if $game_party.armor_number(i) > 0
          @data.push($data_armors[i])
        end
      end
    end
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
  def draw_item(index)
    item = @data[index]
    case item
    when RPG::Item
      number = $game_party.item_number(item.id)
    when RPG::Weapon
      number = $game_party.weapon_number(item.id)
    when RPG::Armor
      number = $game_party.armor_number(item.id)
    end
    x = 4 + index % @column_max * (288 + 32)
    y = index / @column_max * 32
    rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon(item.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
    self.contents.draw_text(x + 216, y, 16, 32, ":", 1)
    self.contents.draw_text(x + 224, y, 48, 32, number.to_s, 2)
  end
  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.description)
  end
end

#==============================================================================
# Scene_Chest
#------------------------------------------------------------------------------
# The scene that controls storing and taking items.
#==============================================================================
class Scene_Chest
  def initialize(chest=1, max=GameGuy::ChestMaxItems)
    @chestid = chest
    if $game_system.chests[chest] == nil
      $chest = Game_Chest.new(max)
      items = GameGuy.chest_items(chest)
      for i in 0...items.size
        item = items[i][2]
        case item
        when 0
          $chest.add_item(items[i][0], items[i][1])
        when 1
          $chest.add_weapon(items[i][0], items[i][1])
        when 2
          $chest.add_armor(items[i][0], items[i][1])
        else
          $chest.add_item(items[i][0], items[i][1])
        end
      end
    else
      $chest = $game_system.chests[chest]
    end
  end
  def main
    @help_window = Window_Help.new
    @help_window.visible = false
    @command_window = Window_Chest_Choices.new
    @party_window = Window_Party_Item.new
    @party_window.active = false
    @chest_window = Window_Chest_Item.new
    @chest_window.active = false
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    @help_window.dispose
    @command_window.dispose
    @party_window.dispose
    @chest_window.dispose
  end
  def update
    @help_window.update
    @command_window.update
    @party_window.update
    @chest_window.update
    if @command_window.active
      update_command
      return
    end
    if @party_window.active
      update_party
      return
    end
    if @chest_window.active
      update_chest
      return
    end
  end
  def update_command
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $game_system.add_chest(@chestid)
      $scene = Scene_Map.new
      return
    end
    if Input.trigger?(Input::C)
      case @command_window.index
      when 0
        $game_system.se_play($data_system.decision_se)
        @party_window.active = true
        @party_window.help_window = @help_window
        @command_window.active = false
        @help_window.z = 500
        @help_window.visible = true
      when 1
        $game_system.se_play($data_system.decision_se)
        @chest_window.active = true
        @chest_window.help_window = @help_window
        @command_window.active = false
        @help_window.z = 500
        @help_window.visible = true
      when 2
        $game_system.se_play($data_system.cancel_se)
        $game_system.add_chest(@chestid)
        $scene = Scene_Map.new
      end
      return
    end
  end
  def update_party
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @command_window.active = true
      @help_window.visible = false
      @party_window.help_window = nil
      @party_window.active = false
      return
    end
    if Input.repeat?(Input::C)
      @item = @party_window.item
      unless @item.is_a?(RPG::Item) or @item.is_a?(RPG::Weapon) or
             @item.is_a?(RPG::Armor)
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      case @item
      when RPG::Item
        amount = $chest.item_amount(@item.id)
        if amount < $chest.max
          $game_system.se_play($data_system.decision_se)
          $chest.add_item(@item.id, 1)
          $game_party.lose_item(@item.id, 1)
        else
          $game_system.se_play($data_system.buzzer_se)
          return
        end
      when RPG::Weapon
        amount = $chest.weapon_amount(@item.id)
        if amount < $chest.max
          $game_system.se_play($data_system.decision_se)
          $chest.add_weapon(@item.id, 1)
          $game_party.lose_weapon(@item.id, 1)
        else
          $game_system.se_play($data_system.buzzer_se)
          return
        end
      when RPG::Armor
        amount = $chest.armor_amount(@item.id)
        if amount < $chest.max
          $game_system.se_play($data_system.decision_se)
          $chest.add_armor(@item.id, 1)
          $game_party.lose_armor(@item.id, 1)
        else
          $game_system.se_play($data_system.buzzer_se)
          return
        end
      end
      @party_window.refresh
      @chest_window.refresh
      return
    end
  end
  def update_chest
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @command_window.active = true
      @help_window.visible = false
      @chest_window.help_window = nil
      @chest_window.active = false
      return
    end
    if Input.repeat?(Input::C)
      @item = @chest_window.item
      unless @item.is_a?(RPG::Item) or @item.is_a?(RPG::Weapon) or
             @item.is_a?(RPG::Armor)
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      case @item
      when RPG::Item
        amount = $game_party.item_number(@item.id)
        if amount < 99
          $game_system.se_play($data_system.decision_se)
          $chest.take_item(@item.id, 1)
          $game_party.gain_item(@item.id, 1)
        else
          $game_system.se_play($data_system.buzzer_se)
          return
        end
      when RPG::Weapon
        amount = $game_party.weapon_number(@item.id)
        if amount < 99
          $game_system.se_play($data_system.decision_se)
          $chest.take_weapon(@item.id, 1)
          $game_party.gain_weapon(@item.id, 1)
        else
          $game_system.se_play($data_system.buzzer_se)
          return
        end
      when RPG::Armor
        amount = $game_party.armor_number(@item.id)
        if amount < 99
          $game_system.se_play($data_system.decision_se)
          $chest.take_armor(@item.id, 1)
          $game_party.gain_armor(@item.id, 1)
        else
          $game_system.se_play($data_system.buzzer_se)
          return
        end
      end
      @party_window.refresh
      @chest_window.refresh
      return
    end
  end
end

Instructions

New and improved instructions in the script.

Compatibility

Not tested with SDK.

Credits and Thanks

  • game_guy ~ making the system
  • MightyLink ~ requesting the system

Author's Notes

Enjoy and give credits!
« Last Edit: December 01, 2009, 06:52:58 AM by game_guy »

*
Rep:
Level 97
2014 Most Unsung Member2014 Best RPG Maker User - Engine2013 Best RPG Maker User (Scripting)2012 Most Mature Member2012 Favorite Staff Member2012 Best RPG Maker User (Scripting)2012 Best MemberSecret Santa 2012 ParticipantProject of the Month winner for July 20092011 Best Use of Avatar and Signature Space2011 Best RPG Maker User (Scripting)2011 Most Mature Member2011 Favourite Staff Member2011 Best Veteran2010 Most Mature Member2010 Favourite Staff Member
It looks good, but I would suggest maybe making that also set a limit on how much the party can hold. Why would anyone want to store all their stuff if they could carry it around with them?

***
Rep:
Level 84
Yes, hoh my gawd!
I'm updating stuff right now. I'm making it where the chest can hold over 1000 items and even hold gold so when the party reaches its limits its gonna have to dump some somewhere right?

******
Revolution is not a bed of roses.
Rep:
Level 91
Project of the Month winner for July 2009
Sounds cool, I remember someone made a script like this a very long time ago. This could work as a bank script, right?

I don't think you should bother to make an item limiting script, but you should throw in links to some.

***
Rep:
Level 84
Yes, hoh my gawd!
I've already started to put it in here. The party can only normally hold 99 items so when they want to overstock they can store some in a chest or closet.

**
Rep: +0/-0Level 83
lol it  Great. hey Thanks

**
Rep:
Level 84
Fantastic script, exactly what I've been looking for.

Is there a way to add items directly to the chest by event script command? For example, instead of giving the player the items, have the items waiting for them in the chest and they have to physically take the items OUT the first time.

I've tried
$chest(1).gain_item(29, 1)

but it doesn't know the gain-item method.

***
Rep:
Level 84
Yes, hoh my gawd!
Try
$game_variables[1] = Chest.new # change the one with the chest number
$game_variables[1].gain_item(29, 1)

This can only be used as long as you havent opened a chest using variable 1

*
Rep: +0/-0Level 83
Hello,
this script is a great one ! But i've got a problem ;

I don't know why it doesn't work... do you have an idea ? Please ?

***
Rep:
Level 88
Hello,
this script is a great one ! But i've got a problem ;

I don't know why it doesn't work... do you have an idea ? Please ?
I do believe you have to find the text that it uses, and match it with the one in the script called main.
Don't quote me though.

******
Revolution is not a bed of roses.
Rep:
Level 91
Project of the Month winner for July 2009
That's probably because you're using illegal RMXP.

****
Rep:
Level 83
Great script but how the heck do i put items in the chests ive tried
$game_variables[2] = $chest
$game_variables[2].gain_item(1, 10)

and ive never opend the chest once, and its in a seprate event,
i get error:
NoMethodError occured while runnin script.
undefined method `gain_item' for 0:fixnum

also would it be possible to put more then one type of weapon in a chest too?
Spoiler for:
METALFRESH is a paint contractor that specializes in refinishing metal and vinyl siding. We paint metal buildings as well as siding on homes.

We also

    Refinish decks
    Do custom interior painting
    Strip wallpaper
    Refinish cedar siding
    Metal front doors and sidelights
    Metal garage and service doors
    Grained fiberglass doors

    If your structure is *RUSTED *FADED *CHALKING *IN NEED OF COLOR CHANGE, we can fix it with a guarentee!

northern Illinois and southern Wisconsin.

http://metalfreshcoatings.com


***
Rep:
Level 84
Yes, hoh my gawd!
Updated script. Much much more compatible then older version. You can also have items in the chests from the start. Check the new demo out as well.

****
Rep:
Level 83
Sweet you fixed to problems i was having, adding items and preventing them from taking after they have reached the max they can carry. nice script
oh question can you make it to where they push a key and it takes all of that item they have selected? because i edited max carried and if a box has 100 of the same item in it you'd be holding the space bar down for about 20 - 30 seconds, manly i just think it would be a convenience
« Last Edit: December 01, 2009, 10:32:26 AM by Mr_Wiggles »
Spoiler for:
METALFRESH is a paint contractor that specializes in refinishing metal and vinyl siding. We paint metal buildings as well as siding on homes.

We also

    Refinish decks
    Do custom interior painting
    Strip wallpaper
    Refinish cedar siding
    Metal front doors and sidelights
    Metal garage and service doors
    Grained fiberglass doors

    If your structure is *RUSTED *FADED *CHALKING *IN NEED OF COLOR CHANGE, we can fix it with a guarentee!

northern Illinois and southern Wisconsin.

http://metalfreshcoatings.com


***
Rep:
Level 84
Yes, hoh my gawd!
I'll make it where you press the Z key, and it'll take the all of the selected item out that it can

**
Rep: +0/-0Level 82
Another epic win by game_guy