I'm using Moghunter's script to allow enemies to drop treasures on the map, but for some reason out of all the enemies and bosses that drop an item, there's this particular boss that sometimes throws the disposed bitmap error whenever it dies (which is then suppose to drop something). Like I said, it doesn't happen a lot. I would get the error like once every 10 times I defeat the boss, and all trials are always in different spots of the map. It's completely random and it's really annoying.
Here's where the error points to:
#--------------------------------------------------------------------------
# ● update Treasure Icon Frame
#--------------------------------------------------------------------------
def update_treasure_icon_frame
self.sprite_frames_refresh += 1
if self.sprite_frames_refresh > MOG::XAS_ICON_REF
self.sprite_frames += 1
self.sprite_frames_refresh = 0
end
icon_react_x = self.bitmap.height * self.sprite_frames # ERROR!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if icon_react_x < self.bitmap.width
self.src_rect.set(icon_react_x, 0, self.bitmap.height, self.bitmap.height)
else
self.src_rect.set(0, 0, self.bitmap.height, self.bitmap.height)
self.sprite_frames = 0
end
self.ox = self.bitmap.height / 2
end
And this is the rest of the script involved with item drop:
# ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
#===============================================================================
# TREASURE
#===============================================================================
# ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
#===============================================================================
# ■ Game_Party
#===============================================================================
class Game_Party
#--------------------------------------------------------------------------
# ● Gain Exp
#--------------------------------------------------------------------------
def gain_exp(exp)
for i in 0...$game_party.actors.size
actor = $game_party.actors
if actor.cant_get_exp? == false
actor.exp += exp
end
end
end
end
#===============================================================================
# ■ XAS_BA_ItemDrop
#===============================================================================
module XAS_BA_ItemDrop
#--------------------------------------------------------------------------
# ● Defeat Process
#--------------------------------------------------------------------------
def defeat_process
super
if self.battler.is_a?(Game_Enemy) and self.battler.dead? and
$game_map.passable?(self.x, self.y,0) and terrain_tag != XAS::FALL_TERRAIN
treasure = nil
enemy = self.battler
if rand(100) < enemy.treasure_prob and self.battler.steal == false
treasure = $data_items[enemy.item_id] if enemy.item_id > 0
treasure = $data_weapons[enemy.weapon_id] if enemy.weapon_id > 0
treasure = $data_armors[enemy.armor_id] if enemy.armor_id > 0
else
# Multi Drop
tesouro = XAS_BA_ENEMY::ENEMY_MULTI_TREASURE[enemy.id]
item_2treasure = tesouro[rand(tesouro.size)] if tesouro != nil
if item_2treasure != nil
treasure_type = item_2treasure[0]
treasure_id = item_2treasure[1]
treasure_prob = item_2treasure[2]
if rand(100) < treasure_prob
treasure = $data_items[treasure_id] if treasure_type == 0
treasure = $data_weapons[treasure_id] if treasure_type == 1
treasure = $data_armors[treasure_id] if treasure_type == 2
end
end
end
make_treasure(treasure) if treasure != nil
end
end
Code:
#--------------------------------------------------------------------------
# ● Make Treasure
#--------------------------------------------------------------------------
def make_treasure(treasure)
item_se = XAS::ITEMDROP_SE
opecode = treasure.is_a?(RPG::Item) ? 126 :
treasure.is_a?(RPG::Weapon) ? 127 :
treasure.is_a?(RPG::Armor) ? 128 :
nil
list = []
if opecode != nil
item_number = XAS::ITEM_NUMBER[treasure.id]
if item_number != nil and treasure.is_a?(RPG::Item)
list[0] = RPG::EventCommand.new(opecode, 0, [treasure.id,0,0,item_number])
else
list[0] = RPG::EventCommand.new(opecode, 0, [treasure.id,0,0,1])
end
list[1] = RPG::EventCommand.new(250, 0, [item_se])
list[2] = RPG::EventCommand.new(116, 0, [])
end
list.push(RPG::EventCommand.new)
command = RPG::MoveCommand.new
command.code = 14
command.parameters = [0,0]
route = RPG::MoveRoute.new
route.repeat = false
route.list = [command, RPG::MoveCommand.new]
page = RPG::Event::Page.new
page.move_type = 3
page.move_route = route
page.move_frequency = 6
page.always_on_top = true
page.trigger = 1
page.list = list
page.through = true
event = RPG::Event.new(self.x, self.y)
event.pages =
Code:
#===============================================================================
# ■ Game_Event
#===============================================================================
class Game_Event < Game_Character
include XAS_BA_ItemDrop
end
#===============================================================================
# ■ Game_Character
#===============================================================================
class Game_Character
attr_accessor :icon_name
end
#===============================================================================
# ■ Interpreter
#===============================================================================
class Interpreter
#--------------------------------------------------------------------------
# ● Command_126 (ITEM)
#--------------------------------------------------------------------------
alias xas_command_126 command_126
def command_126
value = operate_value(@parameters[1], @parameters[2], @parameters[3])
$game_party.gain_item(@parameters[0], value)
item = $data_items[@parameters[0]]
if $data_items[item.id].element_set.include?($data_system.elements.index(XAS_ELEMENT::I_GOLD))
gold_effect = item.price
elsif $data_items[item.id].element_set.include?($data_system.elements.index(XAS_ELEMENT::I_EXP))
exp_effect = item.price
elsif $data_items[item.id].element_set.include?($data_system.elements.index(XAS_ELEMENT::I_AP))
ap_effect = item.price
elsif $data_items[item.id].element_set.include?($data_system.elements.index(XAS_ELEMENT::I_STATUS))
condition_effect = item.price
elsif $data_items[item.id].element_set.include?($data_system.elements.index(XAS_ELEMENT::I_HP_DAMAGE))
recover_hp_perc_effect = item.recover_hp_rate
elsif $data_items[item.id].element_set.include?($data_system.elements.index(XAS_ELEMENT::I_SP_DAMAGE))
recover_sp_perc_effect = item.recover_sp_rate
end
actor = $game_party.actors[0]
if gold_effect != nil
damage_item = gold_effect.to_s + " " + $data_system.words.gold
$game_party.gain_gold(gold_effect)
$game_party.lose_item(@parameters[0], value)
elsif exp_effect != nil
damage_item = "EXP" + " " + exp_effect.to_s
last_level = actor.level
actor.exp += exp_effect
$game_party.lose_item(@parameters[0], value)
elsif ap_effect != nil and $mog_rgss_ap_parameter != nil
damage_item = ap_effect.to_s + " " + MOG::AP_NAME
$game_party.gain_ap(ap_effect)
$game_party.lose_item(@parameters[0], value)
elsif condition_effect != nil
damage_item = ""
actor.add_state(condition_effect)
$game_party.lose_item(@parameters[0], value)
elsif recover_hp_perc_effect != nil
damage = actor.maxhp * recover_hp_perc_effect / 100
damage_item = damage
actor.hp -= damage
$game_party.lose_item(@parameters[0], value)
elsif recover_sp_perc_effect != nil
damage = actor.maxsp * recover_sp_perc_effect / 100
damage_item = $data_system.words.sp + " " + damage.to_s
actor.sp -= damage
$game_party.lose_item(@parameters[0], value)
end
item_name = $data_items[@parameters[0]].name
display_item_animaton(damage_item,gold_effect,value,item_name)
return true
xas_command_126
end
Code:
#--------------------------------------------------------------------------
# ● Display Item Animaton
#--------------------------------------------------------------------------
def display_item_animaton(damage_item,gold_effect,value,item_name)
animation_item = XAS::ITEM_ANIMATION_ID[@parameters[0]]
if damage_item != nil
$game_player.battler.damage = damage_item
$game_player.battler.damage_pop = true
elsif MOG::XAS_ITEM_NAME_POP == true
$game_player.battler.damage = value.to_s + " x "+ item_name
$game_player.battler.damage_pop = true rescue nil
$game_player.battler.item = true
end
if animation_item != nil
$game_player.animation_id = animation_item
end
end
#--------------------------------------------------------------------------
# ● Command_127 (WEAPON)
#--------------------------------------------------------------------------
alias mog_xas_ani_command_127 command_127
def command_127
mog_xas_ani_command_127
if MOG::XAS_ITEM_NAME_POP == true
value = operate_value(@parameters[1], @parameters[2], @parameters[3])
item_name = $data_weapons[@parameters[0]].name
$game_player.battler.damage = value.to_s + " x "+ item_name
$game_player.battler.damage_pop = true rescue nil
$game_player.battler.item = true rescue nil
end
end
#--------------------------------------------------------------------------
# ● Command_128 (ARMOR)
#--------------------------------------------------------------------------
alias mog_xas_ani_command_128 command_128
def command_128
mog_xas_ani_command_128
if MOG::XAS_ITEM_NAME_POP == true
value = operate_value(@parameters[1], @parameters[2], @parameters[3])
item_name = $data_armors[@parameters[0]].name
$game_player.battler.damage = value.to_s + " x "+ item_name
$game_player.battler.damage_pop = true rescue nil
$game_player.battler.item = true rescue nil
end
end
end
Code:
#===============================================================================
# ■ Sprite_Character
#===============================================================================
class Sprite_Character < RPG::Sprite
attr_accessor :sprite_frames
attr_accessor :sprite_frames_refresh
attr_accessor :sprite_frames_blink
attr_accessor :sprite_y
#--------------------------------------------------------------------------
# ● Initialize
#--------------------------------------------------------------------------
def initialize(viewport, character = nil)
super(viewport)
@character = character
@sprite_frames = 0
@sprite_frames_refresh = 0
@sprite_frames_blink = 0
@sprite_y = 0
update
end
#--------------------------------------------------------------------------
# ● Icon Float Update
#--------------------------------------------------------------------------
def update_treasure_icon_float(icon_ch)
if MOG::XAS_ICON_FLOAT == true
self.sprite_y += 1
if self.sprite_y < 3
self.oy = icon_ch + 1
elsif self.sprite_y < 6
self.oy = icon_ch + 2
elsif self.sprite_y < 9
self.oy = icon_ch + 3
elsif self.sprite_y < 12
self.oy = icon_ch + 4
elsif self.sprite_y < 15
self.oy = icon_ch + 3
elsif self.sprite_y < 18
self.oy = icon_ch + 2
elsif self.sprite_y < 21
self.oy = icon_ch + 1
else
self.oy = icon_ch
self.sprite_y = 0
end
else
self.oy = icon_ch
end
end
#--------------------------------------------------------------------------
# ● Icon Blink Update
#--------------------------------------------------------------------------
def update_treasure_icon_blink
if MOG::XAS_ITEM_BLINK == true
self.sprite_frames_blink += 1
if self.sprite_frames_blink > 30
self.sprite_frames_blink = 0
end
if self.sprite_frames_blink > 15
self.opacity = 255
else
self.opacity = 125
end
end
end
Code:
#--------------------------------------------------------------------------
# ● Create Treasure Icon
#--------------------------------------------------------------------------
def create_treasure_icon
return if self.ox == 12
@icon_name = @character.icon_name
self.bitmap = RPG::Cache.icon(@icon_name)
self.src_rect.set(0, 0, 24, 24)
self.ox = 12
self.oy = 24
self.z = 1
end
I can't recreate the error cause like I said, it barely happens and now it's not triggering, but it just pointed to that line and said "disposed bitmap". Please help.