open_storage("My Chest")
Вид для печати
open_storage("My Chest")
Если ты используешь мою версию, то там обязательно указывать остальные параметры, которые идут после "name" в open_storage("name", name_window, category, gold, free_slot), так же если category ставишь true, то обязательно нужно перед open_storage ставить allowed_category(items, weapons, armors). Это описано в шапке моего скрипта. Почитай и попробуй, должно работать. Я чуть позже подправлю, чтобы оно все не было так жестко по правилам.
Ну ты тоже нашёл гения скриптинга, если бы я ещё хоть слово понял из твоей инструкции
ну он и не является plug&play скриптом. Требует понимая работы переменных.
UPDATE
Обновил модифицированный скрипт.
Раз уж, такой интерес у людей появился к скрипту, в связи с этим сделал его менее строгим к требованиям оформления, но читать описание нужно обязательно, сам он работать не будет.
Поправил некоторые недоработки, из-за которых игрок мог брать больше предметов чем позволял его инвентарь, из-за чего предметы сверх максимума уходили в небытие. Так же, добавил опцию управления максимальным количеством предметов в стаке инвентаря игрока.
Большое спасибо dirge за проделанную работу и помощь! Скрипт теперь не имеет ошибок аналогичных имеющихся скриптов. Всем рекомендую - очень удобная и функциональная вещь!
Что бы понять как скрип работает сделай в любой демке событие, да хотя бы просто нарисуй на столе кувшин. После чего перепиши скрипт из шапки, вызывается он через вызов скрипта и внимательно вноси изменения, как там в шапке написано, после чего у тебя всё получится, просто будь ВНИМАТЕЛЬНЕЕ!. НЕ ПОВТОРЯЙТЕ МОИХ ОШИБОК ТРЕНЕРУЙТЕСЬ НА МАЛЕНЕЬКИХ ИГРУШКАХ.
Было бы круто ещё реализовать набор определённых предметов, типа изначально там книги, а ты могёшь сунуть чё хош. Или я ещё не до конца разобрался?*:slow:
Я сделяль.
Под свои нужды немного дополнил этот скрипт, делюсь:
Спойлер Bravo Storage System (modified version):
Код:#==============================================================================
# Bravo Storage System (modified version)
#------------------------------------------------------------------------------
# Автор скрипта: Bravo2Kilo
# Автор аддона: Dirge
# Дополнение 1.3: Sleeping Visitor ( простите мой говнокод, сделал как смог :D )
# Version: 2.0
# Addon Version: 1.3
#
# Version History:
# v1.0 = Initial Release
# v1.1 = Fixed a bug and added some commands.
# v2.0 = Added the ability to have multiple storage containers.
# Addon History:
# v1.0 = релиз, расширение возможностей скрипта, больше настроек.
# Русский перевод xD
# v1.1 = Добавлено больше всяких штук типа статистики хранилища.
# v1.2 = Правка некоторых багов и расширение допустимого кол-ва предметов в
# инвентаре.
# v1.3 = Добавлена возможность отслеживания краж предметов и денег, возможность
# вложения в банк. (инструкции в описании)
#==============================================================================
# Заметки:
# Если category и gold выставлены в значение false - доступен только обмен
# вещей. Если же category стоит false, а gold true, то в хранилище можно
# будет положить только деньги.
#==============================================================================
# Для вызова хранилища используйте приведенный ниже скрипт(call script)
# open_storage("name", name_window, category, gold, free_slot)
# Где:
# "name" = имя хранилища
# name_window = (true или false) true - для показа имени хранилища на экране.
# category = (true или false)true - для показа категорий предметов, если
# вы используете категории ОБЯЗАТЕЛЬНО перед open_storage вызовите
# allowed_category (скрипт который описан под этим).
# gold = (true или false) true - для показа ячейки с золотом.
# free_slot = введите число свободного места в хранилище, поставьте 0,
# если вам это не нужно.
# По-умолчанию, не указывая name_window, category, gold, они устанавливаются
# на значение true, а free_slot = 0.
#
# Если вы используете category в скрипте выше, то ОБЯЗАТЕЛЬНО перед ним
# вызовите этот(ОБЯЗАТЕЛЬНО, при каждом вызове open_storage с включенными
# категориями). Он позволяет определять какие категории предметов можно класть
# в данное хранилище.
# allowed_category(items, weapons, armors)
# Где:
# items = (true или false) категория - вещи, при true видна.
# weapons = (true или false) категория - оружие, при true видна.
# armors = (true или false) категория - броня, при true видна.
#
# Для запрета внесения определенных вещей в определенное хранилище.
# Впишите, через запятую, ID-предметов с базы данных, доступны только вещи (броня
# и оружие не поддерживается). Оставьте скобки пустыми, если запрещать нечего.
# ОБЯЗАТЕЛЬНО вызывать перед open_storage, если использовали хоть раз. Иначе
# старые настройки будут влиять и на другие хранилища.
# $not_allowed_items = []
#
# Добавить\удалить определенный предмет в нужном хранилище в ручном режиме.
# storage_add_item("name", type, id, amount) - добавление
# storage_remove_item("name", type, id, amount) - удаление
# Где:
# "name" = имя хранилища
# type = тип предмета, может быть(:item, :weapon, :armor)
# id = id предмета в базе данных
# amount = количество
#
# Для удаления всех предметов из определенного хранилища
# clear_storage("name")
# "name" = имя хранилища
#
# Для получения количества определенного предмета в нужном хранилище.
# s_item_number("name", type, id)
# "name" = имя хранилища
# type = тип предмета, может быть(:item, :weapon, :armor)
# id = id предмета в базе данных
#
# Для добавления\удаления золота из определенного хранилища
# storage_add_gold("name", amount) - добавление
# storage_remove_gold("name", amount) - удаление
# "name" = имя хранилища
# amount = количество
#
# Для получения количества золота в определенном хранилище.
# storage_gold_number("name")
# "name" = имя хранилища
#
# Если вы хотите установить максимальное количество определенного предмета в
# хранилищах, используйте этот тег в заметка к предмету. В противном случае
# будет использоваться значение по-умолчанию(ITEM_MAX) идущее ниже.
# <storagemax: X> где X = максимум.
#==============================================================================
module BRAVO_STORAGE
# Показывать окно с количеством свободного места в хранилище true\false
FREE_SLOTS_WINDOW = true
# Максимальное количество предметов в стаке инвентаря.
INV_ITEM_MAX = 100
# Переменная максимально доступного количества предметов в хранилище
ITEMS_MAX_VAR = 999
# Назначте переключатель показывающий есть ли вещи в хранилище.
# Переключатель включается, в случае, если в последнем открытом хранилище
# что-то есть.
STORAGE_SWITCH = 0 # поставить 0 если вам это не нужно.
# Максимальное количество определенного предмета в хранилище, это значение будет
# применено ко всем предметам, кроме тех у которых стоит тег <storagemax: X>
# в базе данных игры.
ITEM_MAX = 9999
# Макс. количество золота которое может храниться в хранилище.
GOLD_MAX = 9999999
# Название команды для того, чтобы забрать вещи с хранилища.
WITHDRAW_TEXT = "Забрать"
# Название команды для того, чтобы положить вещи в хранилище.
STORE_TEXT = "Положить"
# Название команды для того, чтобы выйти с хранилища.
CANCEL_TEXT = "Выход"
# Обозначение денег вашей группы при обмене с хранилищем.
PARTY_CUR_GOLD = "В кармане "
# Обозначение денег находящихся в хранилище.
STOR_CUR_GOLD = "В хранилище "
# Обозначение статистики хранилища
STORAGE_STAT = "В хранилище:"
# Номер иконки денег для хранилища
GOLD_ICON = 361
# Номер иконки предметов для хранилища
ITEMS_ICON = 270
# Длина окна имени
NAME_WIDTH = 160
# Длина окна свободного места в хранилище
FREE_SLOT_WIDTH = 120
# Переключатель для режима воровства
THIEF_SWITCH = 16
# Как пользоваться: перед обыском сундука, включайте этот переключатель,
# после обыска - отключайте его. Так вы пометите сундук, брать предметы
# из которого будет считаться за воровство.
# Рекомендация: через проверку, например если НПС стал вашим другом, вы
# можете написать отдельный переключатель или переменную, которые при
# соответствии не будут включать переключатель воровства, т.е. игроку
# как будто бы друг разрешит брать вещи из сундука.
# Карма игрока и изменение кармы
THIEF_KARMA = 41
THIEF_KARMA_NUM = 5 # на сколько нужно понизить карму за кражи.
# Карма понижается не за количество украденных предметов, а за сам факт
# воровства на -5 (можно заменить на другое значение).
# Анти-абуз понижения кармы (переключатель, отключать вручную)
NIL_KARMA = 17
# вы можете заккоментировать функцию, если она вам не нужна, просмотрите
# строки ниже 1380 и 1409, я там всё пометил и подписал.
# Как пользоваться: переключатель включается автоматически, когда игрок
# что-нибудь сворует, но автоматически не отключается. Пока включён
# этот переключатель, карма не будет понижаться.
# Т.е. карма понижается лишь один раз.
# Рекомендую отключать переключатель анти-абуза когда игрок ложится спать,
# тогда на следующие игровые сутки карма игрока при воровстве снова будет
# падать.
# НАСТРОЙКА ПЕРЕМЕННЫХ ДЛЯ КРАЖ И ДЕПОЗИТОВ (игровые переменные)
THIEF_ITEM = 42 # текущие кражи предметов
GIVE_ITEM = 43 # текущие вложения предметов
THIEF_MONEY = 44 # текущие кражи денег
GIVE_MONEY = 45 # текущие вклады денег
# все переменные обнуляйте вручную!
BANK_MONEY = 46 # деньги, которые вы вложили именно в банк
BANK_SWITCH = 18 # если контейнер является банком, включите переключатель
# перед открытием контейнера, а выключите после закрытия конетейнера.
# Для кражи предметов и денег созданы разные переменные, чтобы можно было
# отслеживать количество украденного, и пользователь мог провести проверки
# в любом ивенте.
#==============================================================================
# End of Configuration
#==============================================================================
end
$imported ||= {}
$imported[:Bravo_Storage] = true
$not_allowed_items = []
#==============================================================================
# ** RPG::BaseItem
#==============================================================================
class RPG::BaseItem
#--------------------------------------------------------------------------
# * Item Storage Max
#--------------------------------------------------------------------------
def storage_max
if @note =~ /<storagemax: (.*)>/i
return $1.to_i
else
return BRAVO_STORAGE::ITEM_MAX
end
end
end
#==============================================================================
# ** Game_Temp
#==============================================================================
class Game_Temp
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_accessor :storage_gold
attr_accessor :storage_category
attr_accessor :storage_name_window
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
alias bravo_storage_initialize initialize
def initialize
bravo_storage_initialize
@storage_gold = true
@storage_category = true
@storage_name_window = true
end
end
#==============================================================================
# ** Game_Party
#==============================================================================
class Game_Party < Game_Unit
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :storage_name
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
alias bravo_storage_initialize initialize
def initialize
bravo_storage_initialize
@storage_gold = {}
@storage_items = {}
@storage_weapons = {}
@storage_armors = {}
@storage_name = nil
end
#--------------------------------------------------------------------------
# * Initialize Storage
#--------------------------------------------------------------------------
def init_storage(name)
@storage_gold[name] ||= 0
@storage_items[name] ||= {}
@storage_weapons[name] ||= {}
@storage_armors[name] ||= {}
end
#--------------------------------------------------------------------------
# * Storage Name =
#--------------------------------------------------------------------------
def storage_name=(name)
return if @storage_name == name
@storage_name = name
init_storage(name)
end
#--------------------------------------------------------------------------
# * Clear Storage
#--------------------------------------------------------------------------
def clear_storage(name)
@storage_gold[name] = 0
@storage_items[name] = {}
@storage_weapons[name] = {}
@storage_armors[name] = {}
end
#--------------------------------------------------------------------------
# * Get Item Object Array
#--------------------------------------------------------------------------
def storage_items
@storage_items[@storage_name].keys.sort.collect {|id| $data_items[id] }
end
#--------------------------------------------------------------------------
# * Get Weapon Object Array
#--------------------------------------------------------------------------
def storage_weapons
@storage_weapons[@storage_name].keys.sort.collect {|id| $data_weapons[id] }
end
#--------------------------------------------------------------------------
# * Get Armor Object Array
#--------------------------------------------------------------------------
def storage_armors
@storage_armors[@storage_name].keys.sort.collect {|id| $data_armors[id] }
end
#--------------------------------------------------------------------------
# * Get Array of All Equipment Objects
#--------------------------------------------------------------------------
def storage_equip_items
storage_weapons + storage_armors
end
#--------------------------------------------------------------------------
# * Get Array of All Item Objects
#--------------------------------------------------------------------------
def storage_all_items
storage_items + storage_equip_items
end
#--------------------------------------------------------------------------
# * Get Container Object Corresponding to Item Class
#--------------------------------------------------------------------------
def storage_item_container(item_class)
return @storage_items[@storage_name] if item_class == RPG::Item
return @storage_weapons[@storage_name] if item_class == RPG::Weapon
return @storage_armors[@storage_name] if item_class == RPG::Armor
return nil
end
#--------------------------------------------------------------------------
# * Storage Gold
#--------------------------------------------------------------------------
def storage_gold
@storage_gold[@storage_name]
end
#--------------------------------------------------------------------------
# * Increase Storage Gold
#--------------------------------------------------------------------------
def storage_gain_gold(amount)
@storage_gold[@storage_name] = [[@storage_gold[@storage_name] + amount, 0].max, BRAVO_STORAGE::GOLD_MAX].min
end
#--------------------------------------------------------------------------
# * Decrease Storage Gold
#--------------------------------------------------------------------------
def storage_lose_gold(amount)
storage_gain_gold(-amount)
end
#--------------------------------------------------------------------------
# * Get Number of All Items in Box
#--------------------------------------------------------------------------
def storage_all_items_in_box?(name)
all_items_in_box = 0
@storage_items[name].each_value {|i| all_items_in_box += i}
@storage_weapons[name].each_value {|i| all_items_in_box += i}
@storage_armors[name].each_value {|i| all_items_in_box += i}
return all_items_in_box
end
#--------------------------------------------------------------------------
# * Get Maximum Number of Items in Storage
#--------------------------------------------------------------------------
def storage_max_item_number(item)
return item.storage_max
end
#--------------------------------------------------------------------------
# * Determine if Maximum Number of Items Are Possessed
#--------------------------------------------------------------------------
def storage_item_max?(item)
storage_item_number(item) >= storage_max_item_number(item)
end
#--------------------------------------------------------------------------
# * Get Number of Items Possessed
#--------------------------------------------------------------------------
def s_item_number(item)
container = storage_item_container(item.class)
container ? container[item.id] || 0 : 0
end
#--------------------------------------------------------------------------
# * Increase/Decrease Storage Items
#--------------------------------------------------------------------------
def storage_gain_item(item, amount)
container = storage_item_container(item.class)
return unless container
last_number = s_item_number(item)
new_number = last_number + amount
container[item.id] = [[new_number, 0].max, storage_max_item_number(item)].min
container.delete(item.id) if container[item.id] == 0
end
#--------------------------------------------------------------------------
# * Remove Storage Items
#--------------------------------------------------------------------------
def storage_lose_item(item, amount)
storage_gain_item(item, -amount)
end
def max_item_number(item)
return BRAVO_STORAGE::INV_ITEM_MAX
end
end
#==============================================================================
# ** Game_Interpreter
#==============================================================================
class Game_Interpreter
#--------------------------------------------------------------------------
# * Open Storage Scene
#--------------------------------------------------------------------------
def open_storage(name, name_window = true, category = true, gold = true, free_slot = 0)
$game_party.storage_name = name
$game_temp.storage_name_window = name_window
$game_temp.storage_category = category
$game_temp.storage_gold = gold
$game_variables[BRAVO_STORAGE::ITEMS_MAX_VAR] = free_slot
SceneManager.call(Scene_Storage)
end
#--------------------------------------------------------------------------
# * allowed_category
#--------------------------------------------------------------------------
def allowed_category(items = true, weapons = true, armors = true)
$allow_items = items
$allow_weapons = weapons
$allow_armors = armors
end
#--------------------------------------------------------------------------
# * Clear Storage
#--------------------------------------------------------------------------
def clear_storage(name)
$game_party.clear_storage(name)
end
#--------------------------------------------------------------------------
# * Storage Add Item
#--------------------------------------------------------------------------
def storage_add_item(name, type, id, amount)
$game_party.storage_name = name
case type
when :item
item = $data_items[id]
when :weapon
item = $data_weapons[id]
when :armor
item = $data_armors[id]
end
$game_party.storage_gain_item(item, amount)
end
#--------------------------------------------------------------------------
# * Storage Remove Item
#--------------------------------------------------------------------------
def storage_remove_item(name, type, id, amount)
$game_party.storage_name = name
case type
when :item
item = $data_items[id]
when :weapon
item = $data_weapons[id]
when :armor
item = $data_armors[id]
end
$game_party.storage_lose_item(item, amount)
end
#--------------------------------------------------------------------------
# * Storage Item Number
#--------------------------------------------------------------------------
def s_item_number(name, type, id)
$game_party.storage_name = name
case type
when :item
item = $data_items[id]
when :weapon
item = $data_weapons[id]
when :armor
item = $data_armors[id]
end
$game_party.s_item_number(item)
end
def storage_all_items_in_box(name)
return $game_party.storage_all_items_in_box?(name)
end
#--------------------------------------------------------------------------
# * Storage Add Gold
#--------------------------------------------------------------------------
def storage_add_gold(name, amount)
$game_party.storage_name = name
$game_party.storage_gain_gold(amount)
end
#--------------------------------------------------------------------------
# * Storage Remove Gold
#--------------------------------------------------------------------------
def storage_remove_gold(name, amount)
$game_party.storage_name = name
$game_party.storage_lose_gold(amount)
end
#--------------------------------------------------------------------------
# * Storage Gold Number
#--------------------------------------------------------------------------
def storage_gold_number(name)
$game_party.storage_name = name
$game_party.storage_gold
end
end
#==============================================================================
# ** Window_StorageCategory
#==============================================================================
$allow_items = true
$allow_weapons = true
$allow_armors = true
class Window_StorageCategory < Window_ItemCategory
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize(gold)
@gold = gold
super()
$allow_items = true
$allow_weapons = true
$allow_armors = true
end
#--------------------------------------------------------------------------
# * Get Digit Count
#--------------------------------------------------------------------------
def col_max
if @gold == true
return 4
else
return 3
end
end
#--------------------------------------------------------------------------
# * Create Command List
#--------------------------------------------------------------------------
def make_command_list
add_command(Vocab::item, :item) if $allow_items == true
add_command(Vocab::weapon, :weapon) if $allow_weapons == true
add_command(Vocab::armor, :armor) if $allow_armors == true
add_command(Vocab::currency_unit, :gold) if @gold == true
end
end
#==============================================================================
# ** Window_ItemList
#------------------------------------------------------------------------------
# This window displays a list of party items on the item screen.
#==============================================================================
class Window_StorageItemList < Window_ItemList
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize(x, y, width, height)
super(x, y, width, height)
@storage = :none
end
#--------------------------------------------------------------------------
# * Set Storage Flag
#--------------------------------------------------------------------------
def storage=(storage)
return if @storage == storage
@storage = storage
refresh
self.oy = 0
end
#--------------------------------------------------------------------------
# * Include in Item List?
#--------------------------------------------------------------------------
def include?(item)
case @category
when :item
item.is_a?(RPG::Item)
when :weapon
item.is_a?(RPG::Weapon)
when :armor
item.is_a?(RPG::Armor)
when :all
item
else
false
end
end
#--------------------------------------------------------------------------
# * Display in Enabled State?
#--------------------------------------------------------------------------
def enable?(item)
if item.is_a?(RPG::Item)
$not_allowed_items.each do |items_id|
return false if item.id == items_id
end
case @storage
when :store
box_name = $game_party.storage_name
return false if $game_party.s_item_number(item) >= $game_party.storage_max_item_number(item)
if $game_variables[BRAVO_STORAGE::ITEMS_MAX_VAR] > 0
return false if $game_party.storage_all_items_in_box?(box_name) >= $game_variables[BRAVO_STORAGE::ITEMS_MAX_VAR]
end
when :withdraw
box_name = $game_party.storage_name
return false if $game_party.item_number(item) == $game_party.max_item_number(item)
end
return true if !item.key_item?
elsif item.is_a?(RPG::Weapon) || item.is_a?(RPG::Armor)
case @storage
when :store
box_name = $game_party.storage_name
return false if $game_party.s_item_number(item) >= $game_party.storage_max_item_number(item)
if $game_variables[BRAVO_STORAGE::ITEMS_MAX_VAR] > 0
return false if $game_party.storage_all_items_in_box?(box_name) >= $game_variables[BRAVO_STORAGE::ITEMS_MAX_VAR]
end
end
return true
else
return false
end
end
#--------------------------------------------------------------------------
# * Create Item List
#--------------------------------------------------------------------------
def make_item_list
case @storage
when :store
@data = $game_party.all_items.select {|item| include?(item) }
@data.push(nil) if include?(nil)
when :withdraw
@data = $game_party.storage_all_items.select {|item| include?(item) }
@data.push(nil) if include?(nil)
end
end
#--------------------------------------------------------------------------
# * Draw Number of Items
#--------------------------------------------------------------------------
def draw_item_number(rect, item)
case @storage
when :store
draw_text(rect, sprintf(":%2d", $game_party.item_number(item)), 2)
when :withdraw
draw_text(rect, sprintf(":%2d", $game_party.s_item_number(item)), 2)
end
end
end
#==============================================================================
# ** Window_StorageCommand
#==============================================================================
class Window_StorageCommand < Window_HorzCommand
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super(0, 0)
end
#--------------------------------------------------------------------------
# * Get Window Width
#--------------------------------------------------------------------------
def window_width
if $game_temp.storage_name_window == false
return Graphics.width
else
Graphics.width - BRAVO_STORAGE::NAME_WIDTH
end
end
#--------------------------------------------------------------------------
# * Get Digit Count
#--------------------------------------------------------------------------
def col_max
return 3
end
#--------------------------------------------------------------------------
# * Create Command List
#--------------------------------------------------------------------------
def make_command_list
add_command(BRAVO_STORAGE::WITHDRAW_TEXT, :withdraw)
add_command(BRAVO_STORAGE::STORE_TEXT, :store)
add_command(BRAVO_STORAGE::CANCEL_TEXT, :cancel)
end
end
#==============================================================================
# ** Window_StorageName
#==============================================================================
class Window_StorageName < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super(0, 0, window_width, fitting_height(1))
refresh
end
#--------------------------------------------------------------------------
# * Get Window Width
#--------------------------------------------------------------------------
def window_width
return BRAVO_STORAGE::NAME_WIDTH
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
contents.clear
name = $game_party.storage_name
draw_text(0, 0, window_width, line_height, name)
end
#--------------------------------------------------------------------------
# * Open Window
#--------------------------------------------------------------------------
def open
refresh
super
end
end
#==============================================================================
# ** Window_StorageNumber
#==============================================================================
class Window_StorageNumber < Window_Selectable
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :number # quantity entered
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super(0, 0, window_width, window_height)
@item = nil
@max = 1
@number = 1
end
#--------------------------------------------------------------------------
# * Get Window Width
#--------------------------------------------------------------------------
def window_width
return 304
end
#--------------------------------------------------------------------------
# * Get Window Height
#--------------------------------------------------------------------------
def window_height
return 48
end
#--------------------------------------------------------------------------
# * Set Item, Max Quantity
#--------------------------------------------------------------------------
def set(item, max)
@item = item
@max = max
@number = 1
refresh
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
contents.clear
draw_item_name(@item, 0, 0)
draw_number
end
#--------------------------------------------------------------------------
# * Draw Quantity
#--------------------------------------------------------------------------
def draw_number
change_color(normal_color)
draw_text(cursor_x - 28, 0, 22, line_height, "×")
draw_text(cursor_x, 0, cursor_width - 4, line_height, @number, 2)
end
#--------------------------------------------------------------------------
# * Get Cursor Width
#--------------------------------------------------------------------------
def cursor_width
figures * 10 + 12
end
#--------------------------------------------------------------------------
# * Get X Coordinate of Cursor
#--------------------------------------------------------------------------
def cursor_x
contents_width - cursor_width - 4
end
#--------------------------------------------------------------------------
# * Get Maximum Number of Digits for Quantity Display
#--------------------------------------------------------------------------
def figures
return 2
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
if active
last_number = @number
update_number
if @number != last_number
Sound.play_cursor
refresh
end
end
end
#--------------------------------------------------------------------------
# * Update Quantity
#--------------------------------------------------------------------------
def update_number
change_number(1) if Input.repeat?(:RIGHT)
change_number(-1) if Input.repeat?(:LEFT)
change_number(10) if Input.repeat?(:UP)
change_number(-10) if Input.repeat?(:DOWN)
end
#--------------------------------------------------------------------------
# * Change Quantity
#--------------------------------------------------------------------------
def change_number(amount)
@number = [[@number + amount, @max].min, 1].max
end
#--------------------------------------------------------------------------
# * Update Cursor
#--------------------------------------------------------------------------
def update_cursor
cursor_rect.set(cursor_x, 0, cursor_width, line_height)
end
end
#==============================================================================
# ** Window_GoldTransfer
#==============================================================================
class Window_GoldTransfer < Window_Selectable
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :number # quantity entered
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super(0, 0, window_width, window_height)
@item = nil
@max = 1
@number = 1
@cursor_y = 0
end
#--------------------------------------------------------------------------
# * Get Window Width
#--------------------------------------------------------------------------
def window_width
return 330
end
#--------------------------------------------------------------------------
# * Get Window Height
#--------------------------------------------------------------------------
def window_height
return 72
end
#--------------------------------------------------------------------------
# * Set Item, Max Quantity
#--------------------------------------------------------------------------
def set(max, position)
@max = max
@number = 1
@cursor_y = position
refresh
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
contents.clear
draw_gold_info
draw_number
end
#--------------------------------------------------------------------------
# * Display in Enabled State?
#--------------------------------------------------------------------------
def enabled?
if @cursor_y == 0
return true if $game_party.gold > 0
else
return true if $game_party.storage_gold > 0
end
return false
end
#--------------------------------------------------------------------------
# * Processing When OK Button Is Pressed
#--------------------------------------------------------------------------
def process_ok
if enabled?
Sound.play_ok
Input.update
deactivate
call_ok_handler
else
Sound.play_buzzer
end
end
#--------------------------------------------------------------------------
# * Draw Gold Info
#--------------------------------------------------------------------------
def draw_gold_info
party = BRAVO_STORAGE::PARTY_CUR_GOLD + Vocab::currency_unit + " :"
storage = BRAVO_STORAGE::STOR_CUR_GOLD + Vocab::currency_unit + " :"
draw_text(0, 0, 280, line_height, party)
draw_text(0, 24, 280, line_height, storage)
draw_text(0, 0, 225, line_height, $game_party.gold, 2)
draw_text(0, 24, 225, line_height, $game_party.storage_gold, 2)
end
#--------------------------------------------------------------------------
# * Draw Quantity
#--------------------------------------------------------------------------
def draw_number
change_color(normal_color)
draw_text(cursor_x - 28, @cursor_y, 22, line_height, "×")
draw_text(cursor_x, @cursor_y, cursor_width - 4, line_height, @number, 2)
end
#--------------------------------------------------------------------------
# * Get Cursor Width
#--------------------------------------------------------------------------
def cursor_width
figures * 10 + 12
end
#--------------------------------------------------------------------------
# * Get X Coordinate of Cursor
#--------------------------------------------------------------------------
def cursor_x
contents_width - cursor_width - 4
end
#--------------------------------------------------------------------------
# * Get Maximum Number of Digits for Quantity Display
#--------------------------------------------------------------------------
def figures
return 3
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
if active
last_number = @number
update_number
if @number != last_number
Sound.play_cursor
refresh
end
end
end
#--------------------------------------------------------------------------
# * Update Quantity
#--------------------------------------------------------------------------
def update_number
change_number(1) if Input.repeat?(:RIGHT)
change_number(-1) if Input.repeat?(:LEFT)
change_number(10) if Input.repeat?(:UP)
change_number(-10) if Input.repeat?(:DOWN)
end
#--------------------------------------------------------------------------
# * Change Quantity
#--------------------------------------------------------------------------
def change_number(amount)
@number = [[@number + amount, @max].min, 1].max
end
#--------------------------------------------------------------------------
# * Update Cursor
#--------------------------------------------------------------------------
def update_cursor
@cursor_y ||= 0
cursor_rect.set(cursor_x, @cursor_y, cursor_width, line_height)
end
end
#==============================================================================
# ** Window_FreeSlots
#==============================================================================
class Window_FreeSlots < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super(0, 0, window_width, fitting_height(1))
refresh
end
#--------------------------------------------------------------------------
# * Get Window Width
#--------------------------------------------------------------------------
def window_width
return BRAVO_STORAGE::FREE_SLOT_WIDTH
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
contents.clear
box_name = $game_party.storage_name
items_info = $game_party.storage_all_items_in_box?(box_name).to_s + "/" + $game_variables[BRAVO_STORAGE::ITEMS_MAX_VAR].to_s
draw_text(0, 0, window_width, line_height, items_info)
end
#--------------------------------------------------------------------------
# * Open Window
#--------------------------------------------------------------------------
def open
refresh
super
end
end
class Window_StorageInfo < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super(0, 0, window_width, fitting_height(3))
self.opacity = 0
refresh
end
#--------------------------------------------------------------------------
# * Get Window Width
#--------------------------------------------------------------------------
def window_width
return Graphics.width / 2
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
contents.clear
box_name = $game_party.storage_name
draw_text(0, 0, window_width, line_height, BRAVO_STORAGE::STORAGE_STAT)
gold_info = $game_party.storage_gold.to_s #+ " - " #+ BRAVO_STORAGE::STOR_CUR_GOLD
draw_text(24, 24, window_width, line_height, gold_info)
draw_icon(BRAVO_STORAGE::GOLD_ICON, 0, 24, true)
if $game_variables[BRAVO_STORAGE::ITEMS_MAX_VAR] > 0
items_info = $game_party.storage_all_items_in_box?(box_name).to_s + "/" + $game_variables[BRAVO_STORAGE::ITEMS_MAX_VAR].to_s
else
items_info = $game_party.storage_all_items_in_box?(box_name).to_s
end
draw_text(24, 48, window_width, line_height, items_info)
draw_icon(BRAVO_STORAGE::ITEMS_ICON, 0, 48, true)
end
#--------------------------------------------------------------------------
# * Open Window
#--------------------------------------------------------------------------
def open
refresh
super
end
end
#==============================================================================
# ** Scene_Storage
#==============================================================================
class Scene_Storage < Scene_MenuBase
#--------------------------------------------------------------------------
# * Start Processing
#--------------------------------------------------------------------------
def start
super
@storage_gold = $game_temp.storage_gold
@storage_category = $game_temp.storage_category
@storage_name_window = $game_temp.storage_name_window
create_help_window
create_command_window
create_name_window
create_dummy_window
create_freeslot_window
create_category_window
create_item_window
create_number_window
create_gold_window
create_storageinfo_window
end
#--------------------------------------------------------------------------
# * Create Command Window
#--------------------------------------------------------------------------
def create_command_window
@command_window = Window_StorageCommand.new
@command_window.viewport = @viewport
@command_window.y = @help_window.height
@command_window.set_handler(:withdraw, method(:command_withdraw))
@command_window.set_handler(:store, method(:command_store))
@command_window.set_handler(:cancel, method(:return_scene))
end
#--------------------------------------------------------------------------
# * Create Storage Name Window
#--------------------------------------------------------------------------
def create_name_window
@name_window = Window_StorageName.new
@name_window.viewport = @viewport
@name_window.x = @command_window.width
@name_window.y = @help_window.height
if @storage_name_window == true
@name_window.show
end
end
#--------------------------------------------------------------------------
# * Create Storage Free Slot Window
#--------------------------------------------------------------------------
def create_freeslot_window
@freeslot_window = Window_FreeSlots.new
@freeslot_window.viewport = @viewport
@freeslot_window.x = Graphics.width - @freeslot_window.width
@freeslot_window.y = Graphics.height - @freeslot_window.height
@freeslot_window.z = 1000
@freeslot_window.hide
end
def create_storageinfo_window
@storageinfo_window = Window_StorageInfo.new
@storageinfo_window.viewport = @viewport
@storageinfo_window.x = 0
@storageinfo_window.y = Graphics.height - @dummy_window.height
@storageinfo_window.z = 1000
end
#--------------------------------------------------------------------------
# * Create Dummy Window
#--------------------------------------------------------------------------
def create_dummy_window
wy = @command_window.y + @command_window.height
wh = Graphics.height - wy
@dummy_window = Window_Base.new(0, wy, Graphics.width, wh)
@dummy_window.viewport = @viewport
end
#--------------------------------------------------------------------------
# * Create Quantity Input Window
#--------------------------------------------------------------------------
def create_number_window
@number_window = Window_StorageNumber.new
@number_window.viewport = @viewport
@number_window.x = ((Graphics.width / 2) - (@number_window.width / 2))
@number_window.y = ((Graphics.height / 2) - (@number_window.height / 2))
@number_window.hide
@number_window.set_handler(:ok, method(:on_number_ok))
@number_window.set_handler(:cancel, method(:on_number_cancel))
end
#--------------------------------------------------------------------------
# * Create Category Window
#--------------------------------------------------------------------------
def create_category_window
@category_window = Window_StorageCategory.new(@storage_gold)
@category_window.viewport = @viewport
@category_window.help_window = @help_window
@category_window.y = @dummy_window.y
@category_window.hide.deactivate
@category_window.set_handler(:ok, method(:on_category_ok))
@category_window.set_handler(:cancel, method(:on_category_cancel))
end
#--------------------------------------------------------------------------
# * Create Item Window
#--------------------------------------------------------------------------
def create_item_window
if @storage_category == false
wy = @command_window.y + @command_window.height
else
wy = @category_window.y + @category_window.height
end
wh = Graphics.height - wy
@item_window = Window_StorageItemList.new(0, wy, Graphics.width, wh)
@item_window.viewport = @viewport
@item_window.help_window = @help_window
@item_window.hide
@item_window.set_handler(:ok, method(:on_item_ok))
@item_window.set_handler(:cancel, method(:on_item_cancel))
if @storage_category == false
@item_window.category = :all
else
@category_window.item_window = @item_window
end
end
#--------------------------------------------------------------------------
# * Create Item Window
#--------------------------------------------------------------------------
def create_gold_window
@gold_window = Window_GoldTransfer.new
@gold_window.viewport = @viewport
@gold_window.x = ((Graphics.width / 2) - (@gold_window.width / 2))
@gold_window.y = ((Graphics.height / 2) - (@gold_window.height / 2))
@gold_window.hide
@gold_window.set_handler(:ok, method(:on_gold_ok))
@gold_window.set_handler(:cancel, method(:on_gold_cancel))
end
#--------------------------------------------------------------------------
# * Start Category Selection
#--------------------------------------------------------------------------
def start_category_selection
@dummy_window.hide
@storageinfo_window.hide
@freeslot_window.show if ($game_variables[BRAVO_STORAGE::ITEMS_MAX_VAR] > 0) && (BRAVO_STORAGE::FREE_SLOTS_WINDOW == true)
@item_window.show
@item_window.unselect
@item_window.refresh
@item_window.storage = @command_window.current_symbol
@category_window.show.activate
end
#--------------------------------------------------------------------------
# * [Withdraw] Command
#--------------------------------------------------------------------------
def command_withdraw
if @storage_category == false and @storage_gold == true
case @command_window.current_symbol
when :withdraw
@gold_window.set(max_withdraw, 24)
when :store
@gold_window.set(max_store, 0)
end
@gold_window.show.activate
elsif @storage_category == false
@dummy_window.hide
@storageinfo_window.hide
@freeslot_window.show if ($game_variables[BRAVO_STORAGE::ITEMS_MAX_VAR] > 0) && (BRAVO_STORAGE::FREE_SLOTS_WINDOW == true)
@item_window.show.activate
@item_window.storage = @command_window.current_symbol
@item_window.select_last
else
start_category_selection
end
end
#--------------------------------------------------------------------------
# * [Store] Command
#--------------------------------------------------------------------------
def command_store
if @storage_category == false and @storage_gold == true
case @command_window.current_symbol
when :withdraw
@gold_window.set(max_withdraw, 24)
when :store
@gold_window.set(max_store, 0)
end
@gold_window.show.activate
elsif @storage_category == false
@dummy_window.hide
@storageinfo_window.hide
@freeslot_window.show if ($game_variables[BRAVO_STORAGE::ITEMS_MAX_VAR] > 0) && (BRAVO_STORAGE::FREE_SLOTS_WINDOW == true)
@item_window.show.activate
@item_window.storage = @command_window.current_symbol
@item_window.select_last
else
start_category_selection
end
end
#--------------------------------------------------------------------------
# * Category [OK]
#--------------------------------------------------------------------------
def on_category_ok
case @category_window.current_symbol
when :item, :weapon, :armor
@item_window.activate
@item_window.select_last
when :gold
case @command_window.current_symbol
when :withdraw
@gold_window.set(max_withdraw, 24)
when :store
@gold_window.set(max_store, 0)
end
@gold_window.show.activate
end
end
#--------------------------------------------------------------------------
# * Category [Cancel]
#--------------------------------------------------------------------------
def on_category_cancel
@command_window.activate
@dummy_window.show
@storageinfo_window.show
@freeslot_window.hide
@item_window.hide
@category_window.hide
end
#--------------------------------------------------------------------------
# * Item [OK]
#--------------------------------------------------------------------------
def on_item_ok
@item = @item_window.item
case @command_window.current_symbol
when :withdraw
@number_window.set(@item, max_withdraw)
when :store
@number_window.set(@item, max_store)
end
@number_window.show.activate
end
#--------------------------------------------------------------------------
# * Item [Cancel]
#--------------------------------------------------------------------------
def on_item_cancel
@item_window.unselect
if @storage_category == false
@item_window.hide
@dummy_window.show
@storageinfo_window.show
@freeslot_window.hide
@command_window.activate
else
@category_window.activate
end
end
#--------------------------------------------------------------------------
# * Quantity Input [OK]
#--------------------------------------------------------------------------
def on_number_ok
Sound.play_ok
case @command_window.current_symbol
when :withdraw
do_withdraw(@number_window.number)
when :store
do_store(@number_window.number)
end
@number_window.hide
@freeslot_window.refresh
@storageinfo_window.refresh
@item_window.refresh
@item_window.activate
@item_window.select_last
end
#--------------------------------------------------------------------------
# * Quantity Input [Cancel]
#--------------------------------------------------------------------------
def on_number_cancel
Sound.play_cancel
@number_window.hide
@item_window.activate
end
#--------------------------------------------------------------------------
# * Gold Quantity Input [OK]
#--------------------------------------------------------------------------
def on_gold_ok
case @command_window.current_symbol
when :withdraw
gold_withdraw(@gold_window.number)
@gold_window.set(max_withdraw, 24)
when :store
gold_store(@gold_window.number)
@gold_window.set(max_store, 0)
end
@gold_window.show.activate
@gold_window.refresh
@storageinfo_window.refresh
Sound.play_ok
end
#--------------------------------------------------------------------------
# * Gold Quantity Input [Cancel]
#--------------------------------------------------------------------------
def on_gold_cancel
Sound.play_cancel
if @storage_category == false && @storage_gold == true
@command_window.activate
else
start_category_selection
end
@gold_window.hide
end
#--------------------------------------------------------------------------
# * Execute Withdraw
#--------------------------------------------------------------------------
def do_withdraw(number)
if $game_switches[BRAVO_STORAGE::THIEF_SWITCH] == false # это не воровство
$game_party.storage_lose_item(@item, number)
$game_party.gain_item(@item, number)
end
if $game_switches[BRAVO_STORAGE::THIEF_SWITCH] == true # если это воровство
$game_party.storage_lose_item(@item, number)
$game_party.gain_item(@item, number)
$game_variables[BRAVO_STORAGE::THIEF_ITEM] += number # подсчёт текущей кражи
#АНТИ-АБУЗ КАРМЫ
if $game_switches[BRAVO_STORAGE::NIL_KARMA] == false # анти-абуз "if" (можно удалить)
$game_switches[BRAVO_STORAGE::NIL_KARMA] = true # анти-абуз (можно удалить)
$game_variables[BRAVO_STORAGE::THIEF_KARMA] -= BRAVO_STORAGE::THIEF_KARMA_NUM # понижает карму (не удалять)
end # анти-абуз "end" (можно удалить)
end
end
#--------------------------------------------------------------------------
# * Execute Store
#--------------------------------------------------------------------------
def do_store(number)
$game_party.storage_gain_item(@item, number)
$game_party.lose_item(@item, number)
$game_variables[BRAVO_STORAGE::GIVE_ITEM] += number # подсчёт текущего вложения
end
#--------------------------------------------------------------------------
# * Gold Withdraw
#--------------------------------------------------------------------------
def gold_withdraw(number)
if $game_switches[BRAVO_STORAGE::THIEF_SWITCH] == false # это не воровство
if $game_switches[BRAVO_STORAGE::BANK_SWITCH] == false # это не банк
$game_party.storage_lose_gold(number)
$game_party.gain_gold(number)
end
end
if $game_switches[BRAVO_STORAGE::THIEF_SWITCH] == true # если это воровство
$game_party.storage_lose_gold(number)
$game_party.gain_gold(number)
$game_variables[BRAVO_STORAGE::THIEF_MONEY] += number # подсчёт текущей кражи
#АНТИ-АБУЗ КАРМЫ
if $game_switches[BRAVO_STORAGE::NIL_KARMA] == false # анти-абуз "if" (можно удалить)
$game_switches[BRAVO_STORAGE::NIL_KARMA] = true # анти-абуз (можно удалить)
$game_variables[BRAVO_STORAGE::THIEF_KARMA] -= BRAVO_STORAGE::THIEF_KARMA_NUM # понижает карму (не удалять)
end # анти-абуз "end" (можно удалить)
end
if $game_switches[BRAVO_STORAGE::BANK_SWITCH] == true # если это банк
$game_party.storage_lose_gold(number)
$game_party.gain_gold(number)
$game_variables[BRAVO_STORAGE::BANK_MONEY] -= number # подсчёт текущего вывода денег
end
end
#--------------------------------------------------------------------------
# * Gold Store
#--------------------------------------------------------------------------
def gold_store(number)
$game_party.lose_gold(number)
$game_party.storage_gain_gold(number)
$game_variables[BRAVO_STORAGE::GIVE_MONEY] += number # подсчёт текущего вложения
if $game_switches[BRAVO_STORAGE::BANK_SWITCH] == true # это банк
$game_variables[BRAVO_STORAGE::BANK_MONEY] += number # подсчёт текущего вклада
end
end
#--------------------------------------------------------------------------
# * Get Maximum Quantity Withdrawable
#--------------------------------------------------------------------------
def max_withdraw
case @category_window.current_symbol
when :item, :weapon, :armor
available_inv_slots = $game_party.max_item_number(@item) - $game_party.item_number(@item)
if $game_party.s_item_number(@item) > available_inv_slots
return available_inv_slots
else
$game_party.s_item_number(@item)
end
when :gold
if $game_party.storage_gold > 999
return 999
else
$game_party.storage_gold
end
end
end
#--------------------------------------------------------------------------
# * Get Maximum Quantity Storable
#--------------------------------------------------------------------------
def max_store
case @category_window.current_symbol
when :item, :weapon, :armor
box_name = $game_party.storage_name
if $game_variables[BRAVO_STORAGE::ITEMS_MAX_VAR] > 0
if $game_variables[BRAVO_STORAGE::ITEMS_MAX_VAR] - $game_party.storage_all_items_in_box?(box_name) >= $game_party.item_number(@item)
available_slots_in_box = 99
elsif $game_variables[BRAVO_STORAGE::ITEMS_MAX_VAR] - $game_party.storage_all_items_in_box?(box_name) <= 99
available_slots_in_box = $game_variables[BRAVO_STORAGE::ITEMS_MAX_VAR] - $game_party.storage_all_items_in_box?(box_name)
else
available_slots_in_box = 99
end
else
available_slots_in_box = 99
end
if $game_party.item_number(@item) > available_slots_in_box
return available_slots_in_box
else
$game_party.item_number(@item)
end
when :gold
if $game_party.gold > 999
return 999
else
$game_party.gold
end
end
end
end
class Scene_Map < Scene_Base
alias stor_flag_update update
def update
stor_flag_update
upd_name = $game_party.storage_name
if upd_name != nil
check_storage = $game_party.storage_all_items_in_box?(upd_name) + $game_party.storage_gold
if check_storage > 0
$game_switches[BRAVO_STORAGE::STORAGE_SWITCH] = true if BRAVO_STORAGE::STORAGE_SWITCH != 0
else
$game_switches[BRAVO_STORAGE::STORAGE_SWITCH] = false if BRAVO_STORAGE::STORAGE_SWITCH != 0
end
end
end
end
Раньше мне не хватало у скрипта возможности кражи предметов из сундуков так, чтобы игрой это можно было отследить.
Теперь игра помещает в игровые переменные, данные о количестве вложенных в сундуки предметов и денег, записывает
количество украденных предметов и денег, позволяет вкладывать деньги в подобие банка (отследить вложение денег в банк).
Все переменные и переключатели выведены для удобства в начало скрипта, так что вы можете их изменить на свои.
Любой сундук можно сделать чьим-то, просто включив перед его обыском игровой переключатель и выключив после обыска.
(Это запустит проверку краж.)
Любой сундук можно сделать БАНКОМ, делается это так-же как с проверкой краж, но с другим переключателем.
Есть что-то вроде кармы за воровство. Карма отнимается не за количество украденного, а за сам факт совершения кражи,
т.е. после понижения кармы включится переключатель, который больше не даст её понизить, выключаете его уже вручную,
т.к. вы сами можете поместить его куда пожелаете (например после того как персонаж игрока ляжет спать).
Это своего рода и защита от абуза понижения кармы, но эту функцию защиты от абуза можно убрать, я пометил где и как
это сделать.
Эти переменные нужны только для отслеживания, вы же можете настроить на их основе много своего, как вам угодно.
Можно например сделать проверку для сундука НПС, и если НПС вам стал другом, то переключатель краж в его сундуке
больше не будет включаться - т.е. он разрешит вам брать его вещи.
Можно делать подобие карманных краж на основе сундуков, запуская рандомные или зависящие от
характеристики персонажа, пассивной способности или переменной -- проверки.
Можно на основе переменной для денег, вложенных в банк, создать дополнительные переменные для множества банков,
а основную использовать просто как отслеживание вклада денег, чтобы потом данные из неё передать переменной
конкретного банка, не забудьте только после этого обнулить основную переменную, чтобы она не копила информацию
с разных банков.
Вообще внимательно прочитайте инструкции, это очень важно!
Так можно установить отслеживание режима кражи или режима банка.
Спойлер Установка:
Спойлер Скриншот:
Чуть не забыл, на всякий случай для новичков:
Когда будете тестировать работу скрипта, вы можете посмотреть все переключатели и переменные в запущенной игре, нажав на F9.
Это позволит быстрее протестировать проект на ошибки. Если в этом скрипте есть ошибки, напишите какие и как работают.
Если знаете как исправить сами, пожалуйста исправьте, обновите версию аддона в описании и загрузите скрипт сюда.