Items Class Restriction

Szyu

Villager
Member
Joined
Aug 22, 2013
Messages
29
Reaction score
56
First Language
German
Primarily Uses
Szyu's Items Class Restriction

Introduction

Easily specify items, weapons and armors, which can only be used/equipped by certain classes

How to Use

An item's note have to contain one of these:

<classes: x> # This will allow specified classes to use this item<!classes: x> # This will forbit specified classes to use this item

Seperate multiple classes with ','!

Allowed Database Items, which can be restricted by this script:

- Items

- Weapons

- Armors

 

If There is none of those tags in the items note, every class is permitted to use or equip this item!

 

Links

Pastebin

Credits

Credits to Szyu if you plan to use this script.
 

Roninator2

Gamer
Veteran
Joined
May 22, 2016
Messages
2,326
Reaction score
482
First Language
English
Primarily Uses
RMVXA
tested and works fine.

<actors: x> and <classes: x> both work as described.

So from reading your other post about using the character class names, let me say that this script also uses the class numbers and actor numbers.

<actors: 1>, <classes: 1>
<actors: 2>, <classes: 3>
<actors: 4>, <classes: 5>
<actors: 7>, <classes: 8>
etc...
 

bluebomber25

Veteran
Veteran
Joined
May 24, 2020
Messages
31
Reaction score
2
First Language
English
Primarily Uses
RMVXA
Would love to use this script, but can't.

error message.jpg

I have tried using the !actors and !classes version to no avail.
The purpose is to make items only usable by a particular actor in battle. The items work fine without the script loaded, but can be used by anyone in the party.
Only other scripts I am using are Yanfly's Core Engine / extra parameters, Yanfly's Battle Engine, and Yanfly's Status Menu.
Any suggestions?
 

Roninator2

Gamer
Veteran
Joined
May 22, 2016
Messages
2,326
Reaction score
482
First Language
English
Primarily Uses
RMVXA
Try this version instead
Ruby:
#==============================================================================
# Szyu's Item's Class Restriction
# Version 1.2
# By Szyu
#
# About:
# Easily specify items, weapons and armors, which can only be used/equipped
# by certain classes
#
# Instructions:
# - Place below "▼ Materials" but above "▼ Main Process".
#
# How to Use:
# - An item's note have to contain one of these:
# <classes: x> # This will allow specified classes to use this item
# <!classes: x> # This will forbit specified classes to use this item
#
# Seperate multiple classes with ','!
# Allowed Database Items, which can be restricted by this script:
# - Items
# - Weapons
# - Armors
#
# If There is none of those tags in the items note, every class is permitted to
# use or equip this item
#
#
# Requires:
# - RPG Maker VX Ace
#
# Terms of Use:
# - Free for commercal and non-commercial use. Please list me
#   in the credits to support my work.
#
#
# Changelog:
# - Same syntax can now be used to restrict for actors:
#   <actors: x>
#   <!actors: x>
# - Added Use Restriction for battles too. Restricted classes and actors can no
#   longer use restricted items in battle
#
#
#
# Pastebin:
# http://adf.ly/rYIZm
#
#
#==============================================================
#   * Game_BattlerBase
#==============================================================
class Game_BattlerBase
  alias sz_iucr_equippable? equippable?
 
  def equippable?(item)
    return false unless item.is_a?(RPG::EquipItem)
    return false if self.is_a?(Game_Actor) &&
      (item.forbid_classes.include?(self.class_id) || item.forbid_actors.include?(self.id))
    return sz_iucr_equippable?(item)
  end
end
#==============================================================
#   * Game_Battler
#==============================================================
class Game_Battler < Game_BattlerBase
  alias sz_iucr_item_test item_test
 
  def item_test(user, item)
#~     return false if item.is_a?(RPG::Item) &&
#~      (item.forbid_classes.include?(self.class_id) || item.forbid_actors.include?(self.id))
#~     return sz_iucr_item_test(user, item)
  return sz_iucr_item_test(user, item) if self.is_a?(Game_Enemy)
  if SceneManager.scene_is?(Scene_Battle)
    return false if item.is_a?(RPG::Item) &&
     (item.forbid_classes.include?(user.class_id) || item.forbid_actors.include?(user.id))
   else
     return false if item.is_a?(RPG::Item) &&
     (item.forbid_classes.include?(self.class_id) || item.forbid_actors.include?(self.id))
   end
   return sz_iucr_item_test(user, item)
    end
end
 
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
#==============================================================
#   * Initialize BaseItems
#==============================================================
module DataManager
  class << self
    alias load_db_iucr_sz load_database
  end
 
  def self.load_database
    load_db_iucr_sz
    load_iucr_items
  end
 
  def self.load_iucr_items
    groups = [$data_items, $data_weapons, $data_armors]
    for group in groups
      for obj in group
        next if obj.nil?
        obj.load_iucr_notetags_sz
      end
    end
  end
end

#==============================================================================
# ** Window_BattleActor
#------------------------------------------------------------------------------
#  This window is for selecting an actor's action target on the battle screen.
#==============================================================================
class Window_BattleActor < Window_BattleStatus
  #--------------------------------------------------------------------------
  # * Get Activation State of Selection Item
  #--------------------------------------------------------------------------
  def current_item_enabled?
    return false if !BattleManager.actor.input.item.is_a?(RPG::UsableItem) ||
      BattleManager.actor.input.item.forbid_classes.include?(BattleManager.actor.input.subject.class_id) ||
      BattleManager.actor.input.item.forbid_actors.include?(BattleManager.actor.input.subject.id)
    return true
  end
end
 
#==============================================================================
# ** Window_BattleActor
#------------------------------------------------------------------------------
#  This window is for selecting an actor's action target on the battle screen.
#==============================================================================
class Window_BattleEnemy < Window_Selectable
  #--------------------------------------------------------------------------
  # * Get Activation State of Selection Item
  #--------------------------------------------------------------------------
  def current_item_enabled?
    return false if !BattleManager.actor.input.item.is_a?(RPG::UsableItem) ||
      BattleManager.actor.input.item.forbid_classes.include?(BattleManager.actor.input.subject.class_id) ||
      BattleManager.actor.input.item.forbid_actors.include?(BattleManager.actor.input.subject.id)
    return true
  end
end
#==============================================================
#   * Content of Recycling Items
#==============================================================
class RPG::BaseItem
  attr_accessor :forbid_classes
  attr_accessor :forbid_actors
 
  def load_iucr_notetags_sz
    @forbid_classes = []
    @forbid_actors = []
    self.note.split(/[\r\n]+/).each do |line|
      # Forbid Classes
      if line =~ /<classes:([\d+,?\s*]+)>/i
        $data_classes.each do |cl|
          @forbid_classes.push(cl.id) if cl
        end
        $1.scan(/\s*,?\d+,?\s*/i).each do |cl|
          @forbid_classes.delete(cl.to_i)
        end
      elsif line =~ /<!classes:([\d+,?\s*]+)>/i
        $1.scan(/\s*,?\d+,?\s*/i).each do |cl|
          @forbid_classes.push(cl.to_i)
        end
        # Forbid Actors
      elsif line =~ /<actors:([\d+,?\s*]+)>/i
        $data_actors.each do |ac|
          @forbid_actors.push(ac.id) if ac
        end
        $1.scan(/\s*,?\d+,?\s*/i).each do |ac|
          @forbid_actors.delete(ac.to_i)
        end
      elsif line =~ /<!actors:([\d+,?\s*]+)>/i
        $1.scan(/\s*,?\d+,?\s*/i).each do |ac|
          @forbid_actors.push(ac.to_i)
        end
      end
    end
  end  
  def forbid_classes
    load_iucr_notetags_sz unless @forbid_classes
    return @forbid_classes
  end
  def forbid_actors
    load_iucr_notetags_sz unless @forbid_actors
    return @forbid_actors
  end
end
 
Last edited:

bluebomber25

Veteran
Veteran
Joined
May 24, 2020
Messages
31
Reaction score
2
First Language
English
Primarily Uses
RMVXA
What did you change? =)
The Game no longer crashes, but the classes and actors marked with !actors / !classes can still use the items that they should not be able to.

Am I not using the tags properly? Attached are the Actor and Class tab showing the # to be forbid, and then items using the !actors and !classes tags. Hope this helps.
 

Attachments

Roninator2

Gamer
Veteran
Joined
May 22, 2016
Messages
2,326
Reaction score
482
First Language
English
Primarily Uses
RMVXA
classes and actors marked with !actors / !classes can still use the items
Ok the script was designed for using items on the actors. Not on the enemies.
I added in a battle_enemy component and works on my end.
Code updated above.
 

bluebomber25

Veteran
Veteran
Joined
May 24, 2020
Messages
31
Reaction score
2
First Language
English
Primarily Uses
RMVXA
Wow thank you so much!!
 
Last edited:

Users Who Are Viewing This Thread (Users: 1, Guests: 1)

Latest Threads

Latest Profile Posts

Okay someone really needs to fix that broken railing, its a health hazard...

I'm starting to wonder if I should go the Half Minute Hero route with my game. The character's main weapon is logistically way too strong. So I can't really let the player continuously grow it.... But if they had to build it up each time like HMH, that could work. Also it lets me take advantage of my randomly generated maps so much more. Hmm... This could work! :LZSexcite:
std::vector, std::map and std::string. Three reasons why I'd take C++ over C. :D

Forum statistics

Threads
99,203
Messages
963,007
Members
130,791
Latest member
xericho
Top