Requesting tutorial for installation of Blizz-ABS for RMX-OS

Started by Xolitude, January 31, 2013, 02:13:54 am

Previous topic - Next topic

Xolitude

Hey guys, I need an installation tutorial for Blizz-ABS for RMX-OS.

I saw Blizzard's Controller script, but I don't really understand what I need/install/etc.

So any help would be appreciated, thanks :)

Blizzard

Quote from: Blizzard on January 17, 2010, 05:02:36 pm
Script

Just make a new script above main and paste this code into it.
Spoiler: ShowHide
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
# Blizz-ABS Controller for RMX-OS by Blizzard
# Version: 1.5
# Type: RMX-OS Add-on
# Date: 15.2.2010
# Date v1.01: 16.2.2010
# Date v1.02: 23.4.2010
# Date v1.1: 5.12.2010
# Date v1.19: 22.1.2011
# Date v1.2: 25.1.2011
# Date v1.3: 3.2.2011
# Date v1.31: 11.2.2011
# Date v1.32: 11.2.2011
# Date v1.33: 4.3.2011
# Date v1.34: 6.3.2011
# Date v1.4: 9.3.2011
# Date v1.5: 22.6.2012
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#
#  This script is to be distributed under the same terms and conditions like
#  the scripts it was created for: RMX-OS and Blizz-ABS.
#
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#
# - Special Thanks to Ryex for providing the basecode for the fix for the
#   controls conflict between Blizz-ABS and RMX-OS.
#
# Information:
#
#   This script must be placed below RMX-OS and Blizz-ABS. It requires RMX-OS
#   v1.18 or higher and Blizz-ABS 2.84 or higher to work properly. This script
#   will allow the RMX-OS Server to assign a client the role of the processor
#   (Global Master) and allow global processing Blizz-ABS AI behavior.
#   
#   
# What is different:
#   
#   - Map actor data will not be stored completely. Special states and effects
#     that are related to Blizz-ABS (i.e. the data regarding the charging
#     state) are not being saved.
#   - RMX-OS was not intended to have Blizz-ABS allies! Players will not see
#     other players' allies on the map if you add them and you are risking data
#     corruption during saving! The same goes for summons!
#   - Alignment groups are available, but dynamic change of alignment groups
#     is mostly disabled for convenience.
#   - Target selection is disabled. Every skill that has target selection will
#     be executed immediately. If a selection skill targets only one target, a
#     random target from all available targets will be chosen. Generally you
#     should avoid single-target selection skills and items.
#   - ABSEAL is disabled.
#   - Processing takes place only on the Global Master client that is assigned
#     dynamically by the server.
#   - Killed enemy events that are set on Death trigger are run only on the
#     Global Master client. It is recommended that killed enemies trigger
#     global switches that run common events. For that you need a plugin for
#     RMX-OS that allows you to have global switches.
#   - Item / Gold Drops are disabled. The actor who killed the enemy will get
#     the item reward. EXP and gold rewards are shared among party members
#     where each party member adds a specific amount to the gained EXP.
#     Remember that items can be traded so a shared item reward is unnecessary.
#   
#   
# Notes:
#   
#   - Keep in mind that adding and/or removing this script will corrupt the
#     save data in the RMX-OS SQL database.
#   - You shouldn't have any non-map scenes during the battle. This can disrupt
#     the normal game flow. You should get a custom menu system on the map for
#     the menu system specifically.
#   
#   
# If you find any bugs, please report them here:
# http://forum.chaos-project.com
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=

if !$BlizzABS || BlizzABS::VERSION < 2.85
  raise 'ERROR: The "Blizz-ABS Controller" requires Blizz-ABS 2.85 or higher.'
elsif !defined?(RMXOS) || RMXOS::VERSION < 1.18
  raise 'ERROR: The "Blizz-ABS Controller" requires RMX-OS 1.18 or higher.'
end

$blizzabs_rmxos = 1.5

#==============================================================================
# module RMXOS
#==============================================================================
 
module RMXOS
 
  #============================================================================
  # module RMXOS::Options
  #============================================================================
 
  module Options
 
    #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    # START Configuration
    #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
   
    # PvP active or not
    PVP = false
    # how much percent to the total EXP gain does each party member add
    PARTY_EXP_BONUS = 20
    # how much percent to the total gold gain does each party member add
    PARTY_GOLD_BONUS = 20
    # this should be only changed if necessary!
    BATTLER_VARIABLES = ['@battler|@hp', '@battler|@sp',
        '@battler|@states', '@battler|@states_turn', '@battler|@state_time',
        '@battler|@states_turn', '@battler|@state_time', '@battler|@states',
        '@ai|@positive', '@ai|@negative', '@ai|@neutral']
    ACTOR_VARIABLES = ['@battler|@actor_id', '@battler|@class_id',
        '@battler|@level', '@battler|@maxhp_plus', '@battler|@maxsp_plus',
        '@battler|@str_plus', '@battler|@dex_plus', '@battler|@agi_plus',
        '@battler|@int_plus', '@battler|@skills', '@battler|@weapon_id',
        '@battler|@armor1_id', '@battler|@armor2_id', '@battler|@armor4_id',
        '@battler|@armor3_id', '@battler|@character_name',
        '@battler|@character_hue']
    ENEMY_VARIABLES = ['@battler|@enemy_id', '@battler|@immortal',
        '@ai|@altered_alignment', '@ai|@aggressive', '@ai|@view_range',
        '@ai|@hearing_range_ratio']
   
    #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    # END Configuration
    #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 
    # because Game_Player was redefined
    old_Game_Player = SAVE_DATA.keys.find_all {|key|
        key.is_a?(Class) && key.name == 'Game_Player'}[0]
    SAVE_DATA[Game_Player] = SAVE_DATA[old_Game_Player]
    SAVE_DATA.delete(old_Game_Player)
    # other additional save data
    SAVE_DATA[Map_Actor] = SAVE_DATA[Game_Player].clone
    SAVE_DATA[Game_System].concat(['@hud', '@hotkeys', '@minimap',
        '@attack_button', '@defend_button', '@skill_button', '@item_button',
        '@select_button', '@hud_button', '@hotkey_button', '@minimap_button',
        '@turn_button', '@running_button', '@sneaking_button', '@jumping_button',
        '@caterpillar', '@caterpillar_active'])
    SAVE_DATA[Game_Actor].concat(['@skill', '@item', '@skill_hotkeys',
        '@item_hotkeys', '@old_level', '@offensive', '@aggressive',
        '@force_offensive', '@force_aggressive', '@state_time', '@triggers'])
    SAVE_DATA[BlizzABS::Trigger] = ['@activator', '@condition', '@comparator',
        '@value', '@action_type', '@action_data', '@target']
    # new creation data
    CREATION_DATA[Map_Actor] = '0'
 
  end
 
  #============================================================================
  # module RMXOS::Data
  #============================================================================
 
  module Data
   
    PartyAlreadyMember = 'Player is already a member of your party.'
    PartyNone          = 'You are not in a party.'
    PartyNotLeader     = 'You are not the leader of the party.'
    PartyNotMember     = 'Player is not a member of your party.'
    PartyInfo          = 'Party Leader: LEADER; Members: MEMBERS'
   
    ColorParty = Color.new(0xFF, 0x7F, 0x1F)
   
  end

  #============================================================================
  # module RMXOS::Documentation
  #============================================================================
 
  module Documentation
   
    # Party commands
    PARAMETERS['party']   = 'USERNAME'
    PARAMETERS['premove'] = 'USERNAME'
    PARAMETERS['pleave']  = 'none'
    PARAMETERS['pmsg']    = 'MESSAGE'
    PARAMETERS['pinfo']   = 'none'
   
    DESCRIPTIONS['party']   = 'Invites a player into your party.'
    DESCRIPTIONS['premove'] = 'Removes a player from your party.'
    DESCRIPTIONS['pleave']  = 'Leaves the current party. Disbands the party if you are the party leader.'
    DESCRIPTIONS['pmsg']    = 'Sends a message to all party members.'
    DESCRIPTIONS['pinfo']   = 'Displays information about your party.'
   
  end
 
  def self.change_keys
    controls = [Input::LEFT, Input::RIGHT, Input::UP, Input::DOWN, Input::B,
        Input::C]
    keys = []
    replacements = ['Arrow Left', 'Arrow Right', 'Arrow Up', 'Arrow Down',
        'Esc', 'Enter']
    controls.each_index {|i|
        keys[i] = controls[i].clone
        controls[i].clear
        controls[i].push(Input::Key[replacements[i]])
    }
    return keys
  end
 
  def self.restore_keys(keys)
    controls = [Input::LEFT, Input::RIGHT, Input::UP, Input::DOWN, Input::B,
        Input::C]
    controls.each_index {|i|
        controls[i].clear
        keys[i].each {|key| controls[i].push(key)}
    }
  end
 
end

#==============================================================================
# module BlizzABS
#==============================================================================
 
module BlizzABS
 
  #============================================================================
  # module BlizzABS::Config
  #============================================================================
 
  module Config
   
    ABSEAL_FACTOR = 485
    GOLD_DROP = ''
    ITEM_DROP = false
    CORPSES = false
   
  end
 
  #============================================================================
  # module BlizzABS::Alignments
  #============================================================================
 
  module Alignments
   
    ONLINE_GROUP = 0
    GROUPS.push(ONLINE_GROUP)
    GROUPS.sort!
   
    class << Alignments
      alias neutral_blizzabsrmxos_later neutral
      alias negative_blizzabsrmxos_later neutral
    end
   
    def self.negative(id)
      result = negative_blizzabsrmxos_later(id)
      case id
      when ONLINE_GROUP
        result = GROUPS.clone
        result.delete(id)
        result.delete(ACTOR_GROUP) if !RMXOS::Options::PVP
      when ENEMY_GROUP
        result.push(ONLINE_GROUP)
      end
      return result
    end
   
    def self.neutral(id)
      result = neutral_blizzabsrmxos_later(id)
      result |= [ONLINE_GROUP]
      return result
    end
   
  end
 
  #============================================================================
  # BlizzABS::AI::Data_Enemy
  #============================================================================
 
  class AI::Data_Enemy
   
    alias lifeless_blizzabsrmxos_later? lifeless?
    def lifeless?
      return (!$network.gmaster || lifeless_blizzabsrmxos_later?)
    end
   
  end
 
  #============================================================================
  # BlizzABS::Processor
  #============================================================================
 
  class Processor
   
    def update_killed
      deleted_killed = []
      $game_system.killed.each_key {|key|
          $game_system.killed[key] -= 1
          if key.execute
            key.update
          elsif $game_system.killed[key] <= 0
            $game_map.events.delete(key.id)
            if !key.ai.lifeless_blizzabsrmxos_later? &&
                ($game_system.respawn_time > 0 || key.respawn_point != nil)
              if $network.gmaster && !key.respawning
                $network.send_enemy_respawn(key)
                key.respawning = true
              end
            else
              deleted_killed.push(key)
            end
          end}
      deleted_killed.each {|key| $game_system.killed.delete(key)}
    end
   
    alias exp_result_blizzabsrmxos_later exp_result
    def exp_result(enemy)
      if enemy.last_targeter == $network.user_id ||
          $network.party.include?(enemy.last_targeter)
        return exp_result_blizzabsrmxos_later(enemy)
      end
      return 0
    end
   
    alias gold_result_blizzabsrmxos_later gold_result
    def gold_result(enemy)
      if enemy.last_targeter == $network.user_id ||
          $network.party.include?(enemy.last_targeter)
        return gold_result_blizzabsrmxos_later(enemy)
      end
      return 0
    end
   
    alias additional_result_blizzabsrmxos_later additional_result
    def additional_result(enemy)
      if enemy.last_targeter == $network.user_id
        return additional_result_blizzabsrmxos_later(enemy)
      end
    end
   
    alias drop_items_blizzabsrmxos_later drop_items
    def drop_items(enemy)
      if enemy.last_targeter == $network.user_id
        return drop_items_blizzabsrmxos_later(enemy)
      end
      return []
    end
   
    alias remove_enemy_blizzabsrmxos_later remove_enemy
    def remove_enemy(enemy)
      $network.send_enemy_death(enemy) if $network.gmaster
    end
   
  end
 
  #============================================================================
  # BlizzABS::Controller
  #============================================================================
 
  class Controller
   
    alias update_control_blizzabsrmxos_later update_control
    def update_control
      update_control_blizzabsrmxos_later if !$game_temp.chat_active
    end
   
  end
 
  #============================================================================
  # BlizzABS::Controls
  #============================================================================
 
  class Controls
   
    alias update_blizzabsrmxos_later update
    def update
      update_blizzabsrmxos_later if !$game_temp.chat_active
    end
   
  end
 
  #============================================================================
  # BlizzABS::Utility
  #============================================================================
 
  class Utility
   
    alias request_damage_sprite_blizzabsrmxos_later request_damage_sprite
    def request_damage_sprite(char, damage = nil)
      if $network.gmaster
        variables = char.get_exchange_variables(['@battler|@damage',
            '@battler|@hpdamage', '@battler|@spdamage', '@battler|@hp',
            '@battler|@sp'])
        char.send_exchange_variables(variables)
      end
      request_damage_sprite_blizzabsrmxos_later(char, damage)
    end
   
  end
 
end

$BlizzABS = BlizzABS::Processor.new

#==============================================================================
# RMXOS::Network
#==============================================================================

class RMXOS::Network
 
  attr_reader :gmaster
  attr_reader :party
  attr_reader :partyleader
 
  alias init_blizzabsrmxos_later initialize
  def initialize
    init_blizzabsrmxos_later
    @gmaster = false
    @respawning = {}
    self.party_reset
  end
 
  alias reset_blizzabsrmxos_later reset
  def reset
    self.party_reset
    reset_blizzabsrmxos_later
  end
 
  def party_reset
    @partyleader = ''
    @party = []
  end
 
  alias clear_map_players_blizzabsrmxos_later clear_map_players
  def clear_map_players
    clear_map_players_blizzabsrmxos_later
    @respawning = {}
  end
 
  alias check_game_blizzabsrmxos_later check_game
  def check_game(message)
    case message
    when /\AGMA\Z/ # global master activate
      @gmaster = true
      return true
    when /\AGMD\Z/ # global master deactivate
      @gmaster = false
      return true
    when /\AMEE(.+)\t(.+)/ # exchange variables for enemies
      id = $1.to_i
      variables = eval($2)
      if $game_map != nil && $game_map.events != nil &&
          $game_map.events.has_key?(id)
        $game_map.events[id].evaluate(variables)
      end
      return true
    when /\AMDR\Z/ # map data request
      $game_map.battlers.each {|battler| battler.send_exchange_variables}
      return true
    when /\ABED(.+)\t(.+)/ # broadcast enemy death
      id = $1.to_i
      targeter_id = $2.to_i
      if $game_map.events.has_key?(id)
        enemy = $game_map.events[id]
        enemy.last_targeter = targeter_id
        $BlizzABS.remove_enemy_blizzabsrmxos_later(enemy)
        tmp = $game_map.respawns.find_all {|event|
            !event.erased && event.respawn_ids != nil &&
            event.respawn_ids.include?(enemy.battler_id)}
        if !enemy.ai.lifeless_blizzabsrmxos_later? &&
            ($game_system.respawn_time > 0 || tmp.size > 0)
          @respawning[id] = enemy
        end
      end
    when /\ABER(.+)/ # broadcast enemy respawn
      id = $1.to_i
      if @respawning.has_key?(id)
        enemy = @respawning[id]
        $game_map.events[id] = $BlizzABS.respawn_enemy(enemy)
        @respawning.delete(enemy)
        if $game_system.killed.has_key?(enemy)
          $game_system.killed.delete(enemy)
        end
      end
      return true
    when /\APIN(.+)\t(.+)/ # party invite
      @partyleader = $1
      @party = eval($2).compact.sort
      @party.delete(@username)
      return true
    when /\APRM\Z/ # party reset
      self.party_reset
      return true
    when /\APRE(.+)/ # party remove
      @party.delete($1)
      return true
    when /\AIRM(.+)/ # item remove
      $game_party.lose_item($1.to_i)
      return true
    end
    return check_game_blizzabsrmxos_later(message)
  end
 
  alias check_normal_commands_blizzabsrmxos_later check_normal_commands
  def check_normal_commands(message)
    case message
    when /\A\/party (\S+)\Z/
      command_party_invite($1)
      return true
    when /\A\/premove (\S+)\Z/
      command_party_remove($1)
      return true
    when /\A\/pleave\Z/
      command_party_leave
      return true
    when /\A\/pmsg (\S{1}.*)/
      command_party_chat($1)
      return true
    when /\A\/pinfo\Z/
      command_party_info
      return true
    end
    return check_normal_commands_blizzabsrmxos_later(message)
  end
 
  def partyleader?
    return (self.in_party? && @partyleader == @username)
  end
 
  def in_party?
    return (@partyleader != '')
  end
   
  def check_partyleader_action
    if !self.partyleader?
      self.add_error(RMXOS::Data::PartyNotLeader)
      return false
    end
    return true
  end
   
  def check_party_action
    if !self.in_party?
      self.add_error(RMXOS::Data::PartyNone)
      return false
    end
    return true
  end
   
  def command_party_invite(username)
    if !self.in_party? || self.check_partyleader_action
      if @party.include?(username)
        self.add_error(RMXOS::Data::PartyAlreadyMember)
      else
        self.send("PIN#{username}")
      end
    end
  end
 
  def command_party_remove(username)
    if self.check_partyleader_action
      if !@party.include?(username)
        self.add_error(RMXOS::Data::PartyNotMember)
      else
        self.send("PRE#{username}")
      end
    end
  end
 
  def command_party_leave
    if self.check_party_action
      self.send('PLE')
    end
  end
 
  def command_party_info
    if self.check_party_action
      text = RMXOS::Data::PartyInfo.sub('LEADER') {@partyleader}
      text = text.sub('MEMBERS') {(@party - [@partyleader]).join(', ')}
      self.add_info(text)
    end
  end
   
  def command_party_chat(message)
    if self.check_party_action
      send_chat_message(message, RMXOS::Data::ColorParty, 'PME')
    end
  end
   
  def try_deactivate_gmaster
    self.send('GMD')
    @gmaster = false
  end
 
  def send_enemy_exchange_variables(id, variables)
    self.send("MEE#{id}\t#{variables.inspect}")
  end
   
  def send_item_remove(user_id, item_id)
    self.send("IRM#{user_id}\t#{item_id}")
  end
 
  def send_enemy_death(enemy)
    return if enemy.last_targeter == nil
    if enemy.last_targeter == $game_player
      id = $network.user_id
    elsif enemy.last_targeter.is_a?(Map_OnlineBattler)
      id = enemy.last_targeter.user_id
    else
      return
    end
    self.send("BED#{enemy.id}\t#{id}")
  end
 
  def send_enemy_respawn(enemy)
    self.send("BER#{enemy.id}")
  end
 
end

#==============================================================================
# Game_Enemy
#==============================================================================

class Game_Enemy
 
  alias exp_blizzabs_rmxos_later exp
  def exp
    result = exp_blizzabs_rmxos_later
    bonus = $network.party.size * RMXOS::Options::PARTY_EXP_BONUS
    return (result * (100 + bonus) / 100 / ($network.party.size + 1))
  end
 
  alias gold_blizzabs_rmxos_later gold
  def gold
    result = gold_blizzabs_rmxos_later
    bonus = $network.party.size * RMXOS::Options::PARTY_GOLD_BONUS
    return (result * (100 + bonus) / 100 / ($network.party.size + 1))
  end
 
end
 
#==============================================================================
# Spriteset_Map
#==============================================================================

class Spriteset_Map
 
  alias init_blizzabsrmxos_later initialize
  def initialize
    init_blizzabsrmxos_later
    $network.map_players.each_value {|character|
        sprite = Sprite_Character.new(@viewport1, character)
        sprite.update
        @character_sprites.push(sprite)}
  end
 
end

#==============================================================================
# Map_Battler
#==============================================================================

class Map_Battler
 
  attr_accessor :last_targeter
 
  def get_exchange_variable_names
    return (RMXOS::Options::EXCHANGE_VARIABLES |
        RMXOS::Options::BATTLER_VARIABLES)
  end
 
  alias use_attack_blizzabsrmxos_later use_attack
  def use_attack
    result = use_attack_blizzabsrmxos_later
    if result && (self == $game_player || $network.gmaster)
      variables = {}
      variables['@ai|@act|@kind'] = BlizzABS::ACTAttack
      self.send_exchange_variables(variables)
    end
    return result
  end
 
  alias use_skill_blizzabsrmxos_later use_skill
  def use_skill(skill, forced = false)
    result = use_skill_blizzabsrmxos_later(skill, forced)
    if result && (self == $game_player || $network.gmaster)
      variables = {}
      variables['@ai|@act|@kind'] = BlizzABS::ACTSkill
      variables['@ai|@act|@id'] = skill.id
      self.send_exchange_variables(variables)
    end
    return result
  end
 
  alias use_item_blizzabsrmxos_later use_item
  def use_item(item, forced = false)
    result = use_item_blizzabsrmxos_later(item, forced)
    if result && (self == $game_player || $network.gmaster)
      variables = {}
      variables['@ai|@act|@kind'] = BlizzABS::ACTItem
      variables['@ai|@act|@id'] = item.id
      self.send_exchange_variables(variables)
    end
    return result
  end
 
  def setup_damage_display
    $BlizzABS.util.request_damage_sprite(self)
    @battler.damage, @battler.hpdamage, @battler.spdamage = nil, 0, 0
  end
 
  def in_screen?
    return true
  end
         
end
 
#==============================================================================
# Map_Actor
#==============================================================================

class Map_Actor
 
  alias update_blizzabsrmxos_later update
  def update
    update_blizzabsrmxos_later
    if !$network.gmaster && self.valid? && @battler.damage != nil
      setup_damage_display
    end
  end
 
  def get_exchange_variable_names
    return (super | RMXOS::Options::ACTOR_VARIABLES)
  end
 
  def update_exchange_variables
    changed = self.get_exchange_variables_changes
    if changed.size > 0
      self.send_exchange_variables(changed)
      self.store_exchange_variables(changed)
    end
  end
 
  def send_exchange_variables(variables = nil)
    variables = super(variables)
    $network.send_exchange_variables(variables) if self == $game_player
    return variables
  end
 
  alias attack_effect_blizzabsrmxos_later attack_effect
  def attack_effect(character, _battler)
    return false if !$network.gmaster
    return attack_effect_blizzabsrmxos_later(character, _battler)
  end
 
  alias skill_effect_blizzabsrmxos_later skill_effect
  def skill_effect(character, _battler, skill)
    return false if !$network.gmaster
    return skill_effect_blizzabsrmxos_later(character, _battler, skill)
  end
 
  alias item_effect_blizzabsrmxos_later item_effect
  def item_effect(character, _battler, item)
    return false if !$network.gmaster
    return item_effect_blizzabsrmxos_later(character, _battler, item)
  end
 
end
 
#==============================================================================
# Map_Enemy
#==============================================================================

class Map_Enemy
 
  attr_accessor :respawning
 
  alias update_blizzabsrmxos_later update
  def update
    update_blizzabsrmxos_later
    if !$network.gmaster && self.valid? && @battler.damage != nil
      setup_damage_display
    end
  end
 
  def get_exchange_variable_names
    return (super | RMXOS::Options::ENEMY_VARIABLES)
  end
 
  def update_exchange_variables
    changed = self.get_exchange_variables_changes
    if changed.size > 0
      self.send_exchange_variables(changed)
      self.store_exchange_variables(changed)
    end
  end
 
  def send_exchange_variables(variables = nil)
    variables = super(variables)
    $network.send_enemy_exchange_variables(self.id, variables)
    return variables
  end
 
  alias attack_effect_blizzabsrmxos_later attack_effect
  def attack_effect(character, _battler)
    return false if !$network.gmaster
    @last_targeter = character
    return attack_effect_blizzabsrmxos_later(character, _battler)
  end
 
  alias skill_effect_blizzabsrmxos_later skill_effect
  def skill_effect(character, _battler, skill)
    return false if !$network.gmaster
    @last_targeter = character
    return skill_effect_blizzabsrmxos_later(character, _battler, skill)
  end
 
  alias item_effect_blizzabsrmxos_later item_effect
  def item_effect(character, _battler, item)
    return false if !$network.gmaster
    @last_targeter = character
    return item_effect_blizzabsrmxos_later(character, _battler, item)
  end
 
end
 
#==============================================================================
# Map_OnlineBattler
#==============================================================================

class Map_OnlineBattler < Map_Actor
 
  attr_reader   :user_id
  attr_reader   :username
  attr_reader   :usergroup
  attr_accessor :map_id
 
  def initialize
    super(0)
    @battler = Game_Actor.new(1)
    @cindex = nil
    @ai.setup_group(BlizzABS::Alignments::ONLINE_GROUP)
    @normal_speed = BlizzABS::Config::NORMAL_SPEED
    refresh
  end
 
  def update
    if !$network.gmaster && self.valid? && @battler.damage != nil
      setup_damage_display
    end
    refresh
    super
    @character_name = @character_name_org
    sprite_animation_setup
    check_action
  end
 
  def check_action
    return if !self.valid? || !@ai.act.valid?
    battlers = []
    if @ai.target == nil
      battlers = ($game_map.battlers + $BlizzABS.battlers).find_all {|b|
          b.valid?}
      battlers.compact!
    end
    $BlizzABS.AI.normal_action(self, battlers, battlers, @ai.act.basic?,
        @ai.act.kind - 1, 0xFFFF, 0xFFFF, @ai.act.id, @ai.act.skill?)
    @ai.act.delay = 0 if !@ai.act.defend?
    $BlizzABS.AI.try_execute(self) if @ai.target != nil
    self.reset_action
  end
 
  def update?
    return false
  end
 
  def evaluate(variables, user_id, username, usergroup)
    super(variables)
    @user_id = user_id
    @username = username
    @usergroup = usergroup
    refresh
  end
 
  def battler(override = false)
    return @battler
  end
 
  def item_can_use?(id)
    return true
  end
 
  def item_consumption(item)
    $network.send_item_remove(@user_id, item.id) if item.consumable
  end
 
  def update_ci(ind = nil)
  end
 
  def update_buffer(move)
  end
 
  def turn_toward(character)
  end
 
  def moveto(x, y)
    pix = $BlizzABS.pixel
    super(x / pix, y / pix)
  end
 
end

Game_OnlineCharacter = Map_OnlineBattler

#==============================================================================
# Game_Map
#==============================================================================

class Game_Map
 
  alias battlers_blizzabsrmxos_later battlers
  def battlers
    return (battlers_blizzabsrmxos_later | $network.map_players.values)
  end
 
end

#==============================================================================
# Frame_Text
#==============================================================================

class Frame_Text
 
  alias update_input_blizzabsrmxos_later update_input
  def update_input
    keys = RMXOS.change_keys
    update_input_blizzabsrmxos_later
    RMXOS.restore_keys(keys)
  end
 
end

#==============================================================================
# Scene_Login
#==============================================================================

class Scene_Login
 
  alias update_blizzabsrmxos_later update
  def update
    keys = RMXOS.change_keys
    update_blizzabsrmxos_later
    RMXOS.restore_keys(keys)
  end
 
end

#==============================================================================
# Scene_Register
#==============================================================================

class Scene_Register
 
  alias update_blizzabsrmxos_later update
  def update
    keys = RMXOS.change_keys
    update_blizzabsrmxos_later
    RMXOS.restore_keys(keys)
  end
 
end

#==============================================================================
# Scene_Map
#==============================================================================

class Scene_Map
 
  alias main_blizzabsrmxos_later main
  def main
    main_blizzabsrmxos_later
    $network.try_deactivate_gmaster
  end
 
  def initialize_selection
  end
 
  def process_selection
    object, r, type, sprites = $game_temp.select_data
    if $tons_version != nil && object.is_a?(RPG::Skill) &&
        ($tons_version >= 6.02 && $game_system.TARGET_EM_ALL &&
        FULL_TARGET_IDS.include?(object.id))
      targets = []
      sprites.each {|sprite| targets.push(sprite.character)}
    else
      targets = [sprites[rand(sprites.size)].character]
    end
    return targets
  end
 
  def execute_selection(targets)
    if targets.size > 0
      $game_player.ai.target = targets[0]
      case $game_temp.select_data[0]
      when RPG::Skill then $game_player.use_skill($game_temp.select_data[0])
      when RPG::Item then $game_player.use_item($game_temp.select_data[0])
      end
    end
    $game_temp.select_data = nil
  end
 
  alias call_menu_blizzardrmxos_later call_menu
  def call_menu
    if $game_temp.chat_active
      $game_temp.menu_calling = false
      $game_temp.menu_beep = false
      return
    end
    call_menu_blizzardrmxos_later
  end
 
  alias check_huds_blizzardrmxos_later check_huds
  def check_huds
    minimap_button = $game_system.minimap_button
    hotkey_button = $game_system.hotkey_button
    hud_button = $game_system.hud_button
    if $game_temp.chat_active
      $game_system.minimap_button = false
      $game_system.hotkey_button = false
      $game_system.hud_button = false
    end
    check_huds_blizzardrmxos_later
    $game_system.minimap_button = minimap_button
    $game_system.hotkey_button = hotkey_button
    $game_system.hud_button = hud_button
  end
 
  alias update_hotkeys_blizzardrmxos_later update_hotkeys
  def update_hotkeys
    update_hotkeys_blizzardrmxos_later if !$game_temp.chat_active
  end
 
end


Make a new file with an .rb extension in the Extensions folder of RMX-OS and copy-paste this script into it.
Spoiler: ShowHide
module RMXOS
 
  def self.load_current_extension
    return BlizzABS
  end
 
  module Data
    GlobalMasterActivate = 'Client \'CLIENT\' activate G-Master for map \'MAPID\'.'
    GlobalMasterDeactivate = 'Client \'CLIENT\' deactivate G-Master for map \'MAPID\'.'
    GlobalMasterRelease = 'Map \'MAPID\' has been released.'
    PartyDisbanded = 'The party has been disbanded.'
    PartyFull = 'Your party is already full.'
    PartyFullPlayer = 'The party of \'PLAYER\' is already full.'
    PartyInvitation = '\'PLAYER\' has invited you to join a party.'
    PartyInvited = 'You have invited \'PLAYER\' to join your party.'
    PartyJoined = 'You have joined the party of \'PLAYER\'.'
    PartyJoinedPlayer = '\'PLAYER\' has joined the party.'
    PartyNoJoinPlayer = '\'PLAYER\' has not accepted the party invitation.'
    PartyNotOnline = '\'PLAYER\' is not online anymore.'
    PartyRemoved = 'You have left the party.'
    PartyRemovedPlayer = '\'PLAYER\' has left the party.'
  end
 
end

#======================================================================
# module BlizzABS
#======================================================================

module BlizzABS
 
  VERSION = 1.5
  RMXOS_VERSION = 1.18
  SERVER_THREAD = true
  IDENTIFIER = 'Blizz-ABS'
 
  # START Configuration
  MAX_ONLINE_PARTY = 5
  GMASTER_TIMEOUT = 5 # after how much an inactive time global master client should be released
  SERVER_DISPLAY = false # show log in command prompt screen
  LOG_FILENAME = 'logs/blizzabs.log' # leave empty if no log file should be created
  DELETE_LOG_ON_START = true
  # END Configuration
 
  def self.initialize
    @client_times = {}
    @gmasters = {}
    @capable_clients = {}
    @battlers = {}
    if LOG_FILENAME != ''
      File.delete(LOG_FILENAME) if DELETE_LOG_ON_START && FileTest.exist?(LOG_FILENAME)
      RMXOS::Logs[IDENTIFIER] = LOG_FILENAME
    end
  end
 
  def self.main
    while RMXOS.server.running
      self.server_update
      sleep(0.1)
    end
  end
 
  def self.server_update
    Thread.exclusive {
      time = Time.now
      logged_in_clients = $clients.find_all {|client| client.player.user_id > 0}
      old_clients = @client_times.keys - logged_in_clients
      old_clients.each {|client|
        @client_times.delete(client)
        @capable_clients.delete(@capable_clients.key(client))
        self.try_deactivate_gmaster(client)
        if client.player.partyleader != ''
          client.action.execute_party_remove(client.player.username, client.player.partyleader)
        end
      }
      new_clients = logged_in_clients - @client_times.keys
      new_clients.each {|client| @client_times[client] = time}
      @capable_clients.keys.each {|key|
        if time - @client_times[@capable_clients[key]] > GMASTER_TIMEOUT
          client = @capable_clients[key]
          @capable_clients.delete(key)
          self.try_deactivate_gmaster(client)
        end
      }
      (@capable_clients.values - logged_in_clients).each {|client| @capable_clients.delete(@capable_clients.key(client))}
      map_ids = []
      logged_in_clients.each {|client| map_ids.push(client.player.map_id)}
      map_ids |= map_ids # removes duplicates
      (@battlers.keys - map_ids).each {|map_id| @battlers.delete(map_id) if @battlers.has_key?(map_id)}
      (@gmasters.keys - map_ids).each {|map_id| self.release_map(map_id)}
      (map_ids - @gmasters.keys).each {|map_id| self.try_activate_gmaster(map_id)}
    }
  end
 
  def self.client_update(client)
    result = false
    case client.message
    when /\AGMD\Z/ # deactivate capable global master client
      @capable_clients.delete(client.player.user_id) if @capable_clients.has_key?(client.player.user_id)
      self.try_deactivate_gmaster(client, client.player.map_id) if client == @gmasters[client.player.map_id]
      result = true
    when /\APNG\Z/ # client ping
      if client.player.user_id != 0
        @client_times[client] = Time.now
        @capable_clients[client.player.user_id] = client if !@capable_clients.has_key?(client.player.user_id)
      end
    when /\AMEE(.+)\t(.+)/ # exchange variables for enemies
      id = $1.to_i
      variables = eval($2)
      @battlers[client.player.map_id] = {} if !@battlers.has_key?(client.player.map_id)
      @battlers[client.player.map_id][id] = Player.new(nil) if !@battlers[client.player.map_id].has_key?(id)
      @battlers[client.player.map_id][id].evaluate(variables)
      client.sender.send_to_map(client.message)
      result = true
    when /\AMEN(.+)/ # enter map
      map_id = $1.to_i
      if @battlers.has_key?(map_id)
        @battlers[map_id].each_key {|id|
          client.send("MEE#{id}\t#{@battlers[map_id][id].get_exchange_variables}")
        }
      end
    when /\ABED(.+)\t(.+)/ # broadcast enemy death
      if @gmasters[client.player.map_id] == client
        client.sender.send_to_map(client.message, true)
      else
        id = $1.to_i
        client.send("MEE#{id}\t#{@battlers[client.player.map_id][id].get_exchange_variables}")
      end
      result = true
    when /\ABER(.+)/ # broadcast enemy respawn
      if @gmasters[client.player.map_id] == client
        client.sender.send_to_map(client.message, true)
      else
        id = $1.to_i
        client.send("MEE#{id}\t#{@battlers[client.player.map_id][id].get_exchange_variables}")
      end
      result = true
    when /\AIRM(.+)\t(.+)/ # item remove
      if @gmasters[client.player.map_id] == client
        user_id, item_id = $1.to_i, $2.to_i
        client.sender.send_to_id(user_id, "IRM#{item_id}")
      end
      result = true
    when /\APIN(.+)/ # party invitation
      username = $1
      result = client.action.try_party_invite(username)
      case result
      when RMXOS::RESULT_SUCCESS
        message = RMXOS::Data::PartyInvited.sub('PLAYER') {username}
        color = RMXOS::Data::ColorInfo
      when RMXOS::RESULT_FAIL
        message = RMXOS::Data::PlayerNotOnlineMap.sub('PLAYER') {username}
        color = RMXOS::Data::ColorError
      when RMXOS::RESULT_ALTFAIL
        message = RMXOS::Data::PartyFull
        color = RMXOS::Data::ColorError
      end
      client.send("CHT#{color}\t0\t#{message}")
      result = true
    when /\APLE\Z/ # party leave
      client.action.execute_party_remove(client.player.username, client.player.partyleader)
      result = true
    when /\APRE(.+)/ # party remove
      username = $1
      client.action.execute_party_remove(username, client.player.partyleader)
      result = true
    when /\APME(.+)/ # party message
      client.sender.send_to_party("CHT#{$1}", true)
      result = true
    end
    return result
  end
 
  def self.try_activate_gmaster(map_id)
    return if @gmasters.has_key?(map_id)
    clients = @capable_clients.values.find_all {|client| client.player.map_id == map_id}
    return if clients.size == 0
    client = clients[0]
    client.send('GMA')
    @gmasters[map_id] = client
    if !@battlers.has_key?(map_id)
      @battlers[map_id] = {}
      client.send('MDR')
    end
    message = RMXOS::Data::GlobalMasterActivate.sub('CLIENT', client.player.username).sub('MAPID', map_id.to_s)
    self.log(message)
  end
 
  def self.try_deactivate_gmaster(client, map_id = nil)
    if map_id == nil
      @gmasters.each_key {|key|
        if client == @gmasters[key]
          map_id = key
          break
        end
      }
    end
    return if map_id == nil
    @gmasters.delete(map_id)
    client.send('GMD')
    message = RMXOS::Data::GlobalMasterDeactivate.sub('CLIENT', client.player.username).sub('MAPID', map_id.to_s)
    self.log(message)
    self.try_activate_gmaster(map_id)
    self.release_map(map_id) if !@gmasters.has_key?(map_id)
  end
 
  def self.release_map(map_id)
    @gmasters.delete(map_id) if @gmasters.has_key?(map_id)
    message = RMXOS::Data::GlobalMasterRelease.sub('MAPID', map_id.to_s)
    self.log(message)
  end
 
  def self.log(message)
    puts message if SERVER_DISPLAY
    RMXOS.log(IDENTIFIER, 'Log', message)
  end
 
end

#======================================================================
# Player
#======================================================================

class Player

  IGNORE_VARIABLES.push('@battler|@damage')
  IGNORE_VARIABLES.push('@battler|@hpdamage')
  IGNORE_VARIABLES.push('@battler|@spdamage')
  IGNORE_VARIABLES.push('@ai|@act|@kind')
  IGNORE_VARIABLES.push('@ai|@act|@id')
 
  attr_accessor :party
  attr_accessor :partyleader
 
  alias initialize_blizzabsrmxos_later initialize
  def initialize(client)
    initialize_blizzabsrmxos_later(client)
    self.reset_party
  end
 
  def reset_party
    @partyleader = ''
    @party = []
  end
 
end

#======================================================================
# Action
#======================================================================

class Action
 
  TYPE_PARTY_JOIN = 111
 
end
 
#======================================================================
# Action_Handler
#======================================================================

class Action_Handler
 
  def try_party_invite(username)
    return RMXOS::RESULT_ALTFAIL if @client.player.party.size >= BlizzABS::MAX_ONLINE_PARTY - 1
    client = @client.sender.get_client_by_name(username)
    return RMXOS::RESULT_FAIL if client == nil
    return RMXOS::RESULT_FAIL if client.player.map_id != @client.player.map_id
    client.action.current.type = Action::TYPE_PARTY_JOIN
    client.action.current.data = [@client.player.user_id, @client.player.username]
    message = "#{RMXOS::Data::PartyInvitation.sub('PLAYER') {@client.player.username}} #{RMXOS::Data::DoYouAccept}"
    client.send("CHT#{RMXOS::Data::ColorInfo}\t0\t#{message}")
    return RMXOS::RESULT_SUCCESS
  end
 
  def execute_party_join
    user_id, leadername = @current.data
    leader = @client.sender.get_client_by_id(user_id)
    if leader == nil
      message = RMXOS::Data::PlayerNotOnlineMap.sub('PLAYER') {leadername}
      @client.send("CHT#{RMXOS::Data::ColorInfo}\t0\t#{RMXOS::Data::PartyNotOnline}")
      return
    end
    if leader.player.party.size >= BlizzABS::MAX_ONLINE_PARTY - 1
      message = RMXOS::Data::PartyFullPlayer.sub('PLAYER') {leadername}
      @client.send("CHT#{RMXOS::Data::ColorInfo}\t0\t#{message}")
      return
    end
    leader.player.party |= [@client.player.username]
    @client.player.party = leader.player.party.clone
    @client.player.partyleader = leader.player.partyleader = leadername
    message = RMXOS::Data::PartyJoined.sub('PLAYER') {leadername}
    @client.send("CHT#{RMXOS::Data::ColorOK}\t0\t#{message}")
    @client.send("PIN#{leadername}\t#{leader.player.party.inspect}")
    message = RMXOS::Data::PartyJoinedPlayer.sub('PLAYER') {@client.player.username}
    @client.sender.get_party_clients.each {|client|
      client.send("PIN#{leadername}\t#{leader.player.party.inspect}")
      client.send("CHT#{RMXOS::Data::ColorOK}\t0\t#{message}")
      client.player.party = leader.player.party.clone
    }
  end
 
  def execute_party_remove(username, leadername)
    client = @client.sender.get_client_by_name(username)
    clients = $clients.find_all {|client| client.player.partyleader == leadername}
    leader = @client.sender.get_client_by_name(leadername)
    party = clients - [client, leader]
    if username == leadername || leader == nil || party.size == 0
      clients.each {|client|
        if !client.socket.closed?
          client.send('PRM')
          client.send("CHT#{RMXOS::Data::ColorInfo}\t0\t#{RMXOS::Data::PartyDisbanded}")
          client.player.reset_party
        end
      }
      return
    end
    if client != nil
      client.send('PRM')
      message = RMXOS::Data::PartyRemoved
      client.send("CHT#{RMXOS::Data::ColorInfo}\t0\t#{message}")
      client.player.reset_party
    end
    leader.sender.send_to_party("PRE#{username}", true)
    message = RMXOS::Data::PartyRemovedPlayer.sub('PLAYER') {username}
    leader.sender.send_to_party("CHT#{RMXOS::Data::ColorInfo}\t0\t#{message}", true)
  end
 
  alias execute_yes_blizzabsrmxos_later execute_yes
  def execute_yes
    if @current.type == Action::TYPE_PARTY_JOIN
      self.execute_party_join
      @current.clear
    else
      execute_yes_blizzabsrmxos_later
    end
  end
 
  alias execute_no_blizzabsrmxos_later execute_no
  def execute_no
    if @current.type == Action::TYPE_PARTY_JOIN
      @client.send("CHT#{RMXOS::Data::ColorInfo}\t0\t#{RMXOS::Data::PartyNoJoin}")
      name = @current.data[1]
      if name != nil
        message = RMXOS::Data::PartyNoJoinPlayer.sub('PLAYER') {@client.player.username}
        @client.sender.send_to_name(name, "CHT#{RMXOS::Data::ColorInfo}\t0\t#{message}")
      end
      @current.clear
    else
      execute_no_blizzabsrmxos_later
    end
  end
 
end

#======================================================================
# Sender
#======================================================================

class Sender
 
  def get_party_clients(including = false)
    clients = $clients.find_all {|client| client.player.partyleader == @client.player.partyleader}
    clients.delete(@client) if !including
    return clients
  end

  def send_to_party(message, including = false)
    self.send_to_clients(self.get_party_clients(including), message)
  end
 
end

Check out Daygames and our games:

King of Booze 2      King of Booze: Never Ever
Drinking Game for Android      Never have I ever for Android
Drinking Game for iOS      Never have I ever for iOS


Quote from: winkioI do not speak to bricks, either as individuals or in wall form.

Quote from: Barney StinsonWhen I get sad, I stop being sad and be awesome instead. True story.

Xolitude

Quote from: Blizzard on January 31, 2013, 03:18:34 am
Quote from: Blizzard on January 17, 2010, 05:02:36 pm
Script

Just make a new script above main and paste this code into it.
Spoiler: ShowHide
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
# Blizz-ABS Controller for RMX-OS by Blizzard
# Version: 1.5
# Type: RMX-OS Add-on
# Date: 15.2.2010
# Date v1.01: 16.2.2010
# Date v1.02: 23.4.2010
# Date v1.1: 5.12.2010
# Date v1.19: 22.1.2011
# Date v1.2: 25.1.2011
# Date v1.3: 3.2.2011
# Date v1.31: 11.2.2011
# Date v1.32: 11.2.2011
# Date v1.33: 4.3.2011
# Date v1.34: 6.3.2011
# Date v1.4: 9.3.2011
# Date v1.5: 22.6.2012
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#
#  This script is to be distributed under the same terms and conditions like
#  the scripts it was created for: RMX-OS and Blizz-ABS.
#
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#
# - Special Thanks to Ryex for providing the basecode for the fix for the
#   controls conflict between Blizz-ABS and RMX-OS.
#
# Information:
#
#   This script must be placed below RMX-OS and Blizz-ABS. It requires RMX-OS
#   v1.18 or higher and Blizz-ABS 2.84 or higher to work properly. This script
#   will allow the RMX-OS Server to assign a client the role of the processor
#   (Global Master) and allow global processing Blizz-ABS AI behavior.
#   
#   
# What is different:
#   
#   - Map actor data will not be stored completely. Special states and effects
#     that are related to Blizz-ABS (i.e. the data regarding the charging
#     state) are not being saved.
#   - RMX-OS was not intended to have Blizz-ABS allies! Players will not see
#     other players' allies on the map if you add them and you are risking data
#     corruption during saving! The same goes for summons!
#   - Alignment groups are available, but dynamic change of alignment groups
#     is mostly disabled for convenience.
#   - Target selection is disabled. Every skill that has target selection will
#     be executed immediately. If a selection skill targets only one target, a
#     random target from all available targets will be chosen. Generally you
#     should avoid single-target selection skills and items.
#   - ABSEAL is disabled.
#   - Processing takes place only on the Global Master client that is assigned
#     dynamically by the server.
#   - Killed enemy events that are set on Death trigger are run only on the
#     Global Master client. It is recommended that killed enemies trigger
#     global switches that run common events. For that you need a plugin for
#     RMX-OS that allows you to have global switches.
#   - Item / Gold Drops are disabled. The actor who killed the enemy will get
#     the item reward. EXP and gold rewards are shared among party members
#     where each party member adds a specific amount to the gained EXP.
#     Remember that items can be traded so a shared item reward is unnecessary.
#   
#   
# Notes:
#   
#   - Keep in mind that adding and/or removing this script will corrupt the
#     save data in the RMX-OS SQL database.
#   - You shouldn't have any non-map scenes during the battle. This can disrupt
#     the normal game flow. You should get a custom menu system on the map for
#     the menu system specifically.
#   
#   
# If you find any bugs, please report them here:
# http://forum.chaos-project.com
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=

if !$BlizzABS || BlizzABS::VERSION < 2.85
  raise 'ERROR: The "Blizz-ABS Controller" requires Blizz-ABS 2.85 or higher.'
elsif !defined?(RMXOS) || RMXOS::VERSION < 1.18
  raise 'ERROR: The "Blizz-ABS Controller" requires RMX-OS 1.18 or higher.'
end

$blizzabs_rmxos = 1.5

#==============================================================================
# module RMXOS
#==============================================================================
 
module RMXOS
 
  #============================================================================
  # module RMXOS::Options
  #============================================================================
 
  module Options
 
    #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    # START Configuration
    #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
   
    # PvP active or not
    PVP = false
    # how much percent to the total EXP gain does each party member add
    PARTY_EXP_BONUS = 20
    # how much percent to the total gold gain does each party member add
    PARTY_GOLD_BONUS = 20
    # this should be only changed if necessary!
    BATTLER_VARIABLES = ['@battler|@hp', '@battler|@sp',
        '@battler|@states', '@battler|@states_turn', '@battler|@state_time',
        '@battler|@states_turn', '@battler|@state_time', '@battler|@states',
        '@ai|@positive', '@ai|@negative', '@ai|@neutral']
    ACTOR_VARIABLES = ['@battler|@actor_id', '@battler|@class_id',
        '@battler|@level', '@battler|@maxhp_plus', '@battler|@maxsp_plus',
        '@battler|@str_plus', '@battler|@dex_plus', '@battler|@agi_plus',
        '@battler|@int_plus', '@battler|@skills', '@battler|@weapon_id',
        '@battler|@armor1_id', '@battler|@armor2_id', '@battler|@armor4_id',
        '@battler|@armor3_id', '@battler|@character_name',
        '@battler|@character_hue']
    ENEMY_VARIABLES = ['@battler|@enemy_id', '@battler|@immortal',
        '@ai|@altered_alignment', '@ai|@aggressive', '@ai|@view_range',
        '@ai|@hearing_range_ratio']
   
    #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    # END Configuration
    #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 
    # because Game_Player was redefined
    old_Game_Player = SAVE_DATA.keys.find_all {|key|
        key.is_a?(Class) && key.name == 'Game_Player'}[0]
    SAVE_DATA[Game_Player] = SAVE_DATA[old_Game_Player]
    SAVE_DATA.delete(old_Game_Player)
    # other additional save data
    SAVE_DATA[Map_Actor] = SAVE_DATA[Game_Player].clone
    SAVE_DATA[Game_System].concat(['@hud', '@hotkeys', '@minimap',
        '@attack_button', '@defend_button', '@skill_button', '@item_button',
        '@select_button', '@hud_button', '@hotkey_button', '@minimap_button',
        '@turn_button', '@running_button', '@sneaking_button', '@jumping_button',
        '@caterpillar', '@caterpillar_active'])
    SAVE_DATA[Game_Actor].concat(['@skill', '@item', '@skill_hotkeys',
        '@item_hotkeys', '@old_level', '@offensive', '@aggressive',
        '@force_offensive', '@force_aggressive', '@state_time', '@triggers'])
    SAVE_DATA[BlizzABS::Trigger] = ['@activator', '@condition', '@comparator',
        '@value', '@action_type', '@action_data', '@target']
    # new creation data
    CREATION_DATA[Map_Actor] = '0'
 
  end
 
  #============================================================================
  # module RMXOS::Data
  #============================================================================
 
  module Data
   
    PartyAlreadyMember = 'Player is already a member of your party.'
    PartyNone          = 'You are not in a party.'
    PartyNotLeader     = 'You are not the leader of the party.'
    PartyNotMember     = 'Player is not a member of your party.'
    PartyInfo          = 'Party Leader: LEADER; Members: MEMBERS'
   
    ColorParty = Color.new(0xFF, 0x7F, 0x1F)
   
  end

  #============================================================================
  # module RMXOS::Documentation
  #============================================================================
 
  module Documentation
   
    # Party commands
    PARAMETERS['party']   = 'USERNAME'
    PARAMETERS['premove'] = 'USERNAME'
    PARAMETERS['pleave']  = 'none'
    PARAMETERS['pmsg']    = 'MESSAGE'
    PARAMETERS['pinfo']   = 'none'
   
    DESCRIPTIONS['party']   = 'Invites a player into your party.'
    DESCRIPTIONS['premove'] = 'Removes a player from your party.'
    DESCRIPTIONS['pleave']  = 'Leaves the current party. Disbands the party if you are the party leader.'
    DESCRIPTIONS['pmsg']    = 'Sends a message to all party members.'
    DESCRIPTIONS['pinfo']   = 'Displays information about your party.'
   
  end
 
  def self.change_keys
    controls = [Input::LEFT, Input::RIGHT, Input::UP, Input::DOWN, Input::B,
        Input::C]
    keys = []
    replacements = ['Arrow Left', 'Arrow Right', 'Arrow Up', 'Arrow Down',
        'Esc', 'Enter']
    controls.each_index {|i|
        keys[i] = controls[i].clone
        controls[i].clear
        controls[i].push(Input::Key[replacements[i]])
    }
    return keys
  end
 
  def self.restore_keys(keys)
    controls = [Input::LEFT, Input::RIGHT, Input::UP, Input::DOWN, Input::B,
        Input::C]
    controls.each_index {|i|
        controls[i].clear
        keys[i].each {|key| controls[i].push(key)}
    }
  end
 
end

#==============================================================================
# module BlizzABS
#==============================================================================
 
module BlizzABS
 
  #============================================================================
  # module BlizzABS::Config
  #============================================================================
 
  module Config
   
    ABSEAL_FACTOR = 485
    GOLD_DROP = ''
    ITEM_DROP = false
    CORPSES = false
   
  end
 
  #============================================================================
  # module BlizzABS::Alignments
  #============================================================================
 
  module Alignments
   
    ONLINE_GROUP = 0
    GROUPS.push(ONLINE_GROUP)
    GROUPS.sort!
   
    class << Alignments
      alias neutral_blizzabsrmxos_later neutral
      alias negative_blizzabsrmxos_later neutral
    end
   
    def self.negative(id)
      result = negative_blizzabsrmxos_later(id)
      case id
      when ONLINE_GROUP
        result = GROUPS.clone
        result.delete(id)
        result.delete(ACTOR_GROUP) if !RMXOS::Options::PVP
      when ENEMY_GROUP
        result.push(ONLINE_GROUP)
      end
      return result
    end
   
    def self.neutral(id)
      result = neutral_blizzabsrmxos_later(id)
      result |= [ONLINE_GROUP]
      return result
    end
   
  end
 
  #============================================================================
  # BlizzABS::AI::Data_Enemy
  #============================================================================
 
  class AI::Data_Enemy
   
    alias lifeless_blizzabsrmxos_later? lifeless?
    def lifeless?
      return (!$network.gmaster || lifeless_blizzabsrmxos_later?)
    end
   
  end
 
  #============================================================================
  # BlizzABS::Processor
  #============================================================================
 
  class Processor
   
    def update_killed
      deleted_killed = []
      $game_system.killed.each_key {|key|
          $game_system.killed[key] -= 1
          if key.execute
            key.update
          elsif $game_system.killed[key] <= 0
            $game_map.events.delete(key.id)
            if !key.ai.lifeless_blizzabsrmxos_later? &&
                ($game_system.respawn_time > 0 || key.respawn_point != nil)
              if $network.gmaster && !key.respawning
                $network.send_enemy_respawn(key)
                key.respawning = true
              end
            else
              deleted_killed.push(key)
            end
          end}
      deleted_killed.each {|key| $game_system.killed.delete(key)}
    end
   
    alias exp_result_blizzabsrmxos_later exp_result
    def exp_result(enemy)
      if enemy.last_targeter == $network.user_id ||
          $network.party.include?(enemy.last_targeter)
        return exp_result_blizzabsrmxos_later(enemy)
      end
      return 0
    end
   
    alias gold_result_blizzabsrmxos_later gold_result
    def gold_result(enemy)
      if enemy.last_targeter == $network.user_id ||
          $network.party.include?(enemy.last_targeter)
        return gold_result_blizzabsrmxos_later(enemy)
      end
      return 0
    end
   
    alias additional_result_blizzabsrmxos_later additional_result
    def additional_result(enemy)
      if enemy.last_targeter == $network.user_id
        return additional_result_blizzabsrmxos_later(enemy)
      end
    end
   
    alias drop_items_blizzabsrmxos_later drop_items
    def drop_items(enemy)
      if enemy.last_targeter == $network.user_id
        return drop_items_blizzabsrmxos_later(enemy)
      end
      return []
    end
   
    alias remove_enemy_blizzabsrmxos_later remove_enemy
    def remove_enemy(enemy)
      $network.send_enemy_death(enemy) if $network.gmaster
    end
   
  end
 
  #============================================================================
  # BlizzABS::Controller
  #============================================================================
 
  class Controller
   
    alias update_control_blizzabsrmxos_later update_control
    def update_control
      update_control_blizzabsrmxos_later if !$game_temp.chat_active
    end
   
  end
 
  #============================================================================
  # BlizzABS::Controls
  #============================================================================
 
  class Controls
   
    alias update_blizzabsrmxos_later update
    def update
      update_blizzabsrmxos_later if !$game_temp.chat_active
    end
   
  end
 
  #============================================================================
  # BlizzABS::Utility
  #============================================================================
 
  class Utility
   
    alias request_damage_sprite_blizzabsrmxos_later request_damage_sprite
    def request_damage_sprite(char, damage = nil)
      if $network.gmaster
        variables = char.get_exchange_variables(['@battler|@damage',
            '@battler|@hpdamage', '@battler|@spdamage', '@battler|@hp',
            '@battler|@sp'])
        char.send_exchange_variables(variables)
      end
      request_damage_sprite_blizzabsrmxos_later(char, damage)
    end
   
  end
 
end

$BlizzABS = BlizzABS::Processor.new

#==============================================================================
# RMXOS::Network
#==============================================================================

class RMXOS::Network
 
  attr_reader :gmaster
  attr_reader :party
  attr_reader :partyleader
 
  alias init_blizzabsrmxos_later initialize
  def initialize
    init_blizzabsrmxos_later
    @gmaster = false
    @respawning = {}
    self.party_reset
  end
 
  alias reset_blizzabsrmxos_later reset
  def reset
    self.party_reset
    reset_blizzabsrmxos_later
  end
 
  def party_reset
    @partyleader = ''
    @party = []
  end
 
  alias clear_map_players_blizzabsrmxos_later clear_map_players
  def clear_map_players
    clear_map_players_blizzabsrmxos_later
    @respawning = {}
  end
 
  alias check_game_blizzabsrmxos_later check_game
  def check_game(message)
    case message
    when /\AGMA\Z/ # global master activate
      @gmaster = true
      return true
    when /\AGMD\Z/ # global master deactivate
      @gmaster = false
      return true
    when /\AMEE(.+)\t(.+)/ # exchange variables for enemies
      id = $1.to_i
      variables = eval($2)
      if $game_map != nil && $game_map.events != nil &&
          $game_map.events.has_key?(id)
        $game_map.events[id].evaluate(variables)
      end
      return true
    when /\AMDR\Z/ # map data request
      $game_map.battlers.each {|battler| battler.send_exchange_variables}
      return true
    when /\ABED(.+)\t(.+)/ # broadcast enemy death
      id = $1.to_i
      targeter_id = $2.to_i
      if $game_map.events.has_key?(id)
        enemy = $game_map.events[id]
        enemy.last_targeter = targeter_id
        $BlizzABS.remove_enemy_blizzabsrmxos_later(enemy)
        tmp = $game_map.respawns.find_all {|event|
            !event.erased && event.respawn_ids != nil &&
            event.respawn_ids.include?(enemy.battler_id)}
        if !enemy.ai.lifeless_blizzabsrmxos_later? &&
            ($game_system.respawn_time > 0 || tmp.size > 0)
          @respawning[id] = enemy
        end
      end
    when /\ABER(.+)/ # broadcast enemy respawn
      id = $1.to_i
      if @respawning.has_key?(id)
        enemy = @respawning[id]
        $game_map.events[id] = $BlizzABS.respawn_enemy(enemy)
        @respawning.delete(enemy)
        if $game_system.killed.has_key?(enemy)
          $game_system.killed.delete(enemy)
        end
      end
      return true
    when /\APIN(.+)\t(.+)/ # party invite
      @partyleader = $1
      @party = eval($2).compact.sort
      @party.delete(@username)
      return true
    when /\APRM\Z/ # party reset
      self.party_reset
      return true
    when /\APRE(.+)/ # party remove
      @party.delete($1)
      return true
    when /\AIRM(.+)/ # item remove
      $game_party.lose_item($1.to_i)
      return true
    end
    return check_game_blizzabsrmxos_later(message)
  end
 
  alias check_normal_commands_blizzabsrmxos_later check_normal_commands
  def check_normal_commands(message)
    case message
    when /\A\/party (\S+)\Z/
      command_party_invite($1)
      return true
    when /\A\/premove (\S+)\Z/
      command_party_remove($1)
      return true
    when /\A\/pleave\Z/
      command_party_leave
      return true
    when /\A\/pmsg (\S{1}.*)/
      command_party_chat($1)
      return true
    when /\A\/pinfo\Z/
      command_party_info
      return true
    end
    return check_normal_commands_blizzabsrmxos_later(message)
  end
 
  def partyleader?
    return (self.in_party? && @partyleader == @username)
  end
 
  def in_party?
    return (@partyleader != '')
  end
   
  def check_partyleader_action
    if !self.partyleader?
      self.add_error(RMXOS::Data::PartyNotLeader)
      return false
    end
    return true
  end
   
  def check_party_action
    if !self.in_party?
      self.add_error(RMXOS::Data::PartyNone)
      return false
    end
    return true
  end
   
  def command_party_invite(username)
    if !self.in_party? || self.check_partyleader_action
      if @party.include?(username)
        self.add_error(RMXOS::Data::PartyAlreadyMember)
      else
        self.send("PIN#{username}")
      end
    end
  end
 
  def command_party_remove(username)
    if self.check_partyleader_action
      if !@party.include?(username)
        self.add_error(RMXOS::Data::PartyNotMember)
      else
        self.send("PRE#{username}")
      end
    end
  end
 
  def command_party_leave
    if self.check_party_action
      self.send('PLE')
    end
  end
 
  def command_party_info
    if self.check_party_action
      text = RMXOS::Data::PartyInfo.sub('LEADER') {@partyleader}
      text = text.sub('MEMBERS') {(@party - [@partyleader]).join(', ')}
      self.add_info(text)
    end
  end
   
  def command_party_chat(message)
    if self.check_party_action
      send_chat_message(message, RMXOS::Data::ColorParty, 'PME')
    end
  end
   
  def try_deactivate_gmaster
    self.send('GMD')
    @gmaster = false
  end
 
  def send_enemy_exchange_variables(id, variables)
    self.send("MEE#{id}\t#{variables.inspect}")
  end
   
  def send_item_remove(user_id, item_id)
    self.send("IRM#{user_id}\t#{item_id}")
  end
 
  def send_enemy_death(enemy)
    return if enemy.last_targeter == nil
    if enemy.last_targeter == $game_player
      id = $network.user_id
    elsif enemy.last_targeter.is_a?(Map_OnlineBattler)
      id = enemy.last_targeter.user_id
    else
      return
    end
    self.send("BED#{enemy.id}\t#{id}")
  end
 
  def send_enemy_respawn(enemy)
    self.send("BER#{enemy.id}")
  end
 
end

#==============================================================================
# Game_Enemy
#==============================================================================

class Game_Enemy
 
  alias exp_blizzabs_rmxos_later exp
  def exp
    result = exp_blizzabs_rmxos_later
    bonus = $network.party.size * RMXOS::Options::PARTY_EXP_BONUS
    return (result * (100 + bonus) / 100 / ($network.party.size + 1))
  end
 
  alias gold_blizzabs_rmxos_later gold
  def gold
    result = gold_blizzabs_rmxos_later
    bonus = $network.party.size * RMXOS::Options::PARTY_GOLD_BONUS
    return (result * (100 + bonus) / 100 / ($network.party.size + 1))
  end
 
end
 
#==============================================================================
# Spriteset_Map
#==============================================================================

class Spriteset_Map
 
  alias init_blizzabsrmxos_later initialize
  def initialize
    init_blizzabsrmxos_later
    $network.map_players.each_value {|character|
        sprite = Sprite_Character.new(@viewport1, character)
        sprite.update
        @character_sprites.push(sprite)}
  end
 
end

#==============================================================================
# Map_Battler
#==============================================================================

class Map_Battler
 
  attr_accessor :last_targeter
 
  def get_exchange_variable_names
    return (RMXOS::Options::EXCHANGE_VARIABLES |
        RMXOS::Options::BATTLER_VARIABLES)
  end
 
  alias use_attack_blizzabsrmxos_later use_attack
  def use_attack
    result = use_attack_blizzabsrmxos_later
    if result && (self == $game_player || $network.gmaster)
      variables = {}
      variables['@ai|@act|@kind'] = BlizzABS::ACTAttack
      self.send_exchange_variables(variables)
    end
    return result
  end
 
  alias use_skill_blizzabsrmxos_later use_skill
  def use_skill(skill, forced = false)
    result = use_skill_blizzabsrmxos_later(skill, forced)
    if result && (self == $game_player || $network.gmaster)
      variables = {}
      variables['@ai|@act|@kind'] = BlizzABS::ACTSkill
      variables['@ai|@act|@id'] = skill.id
      self.send_exchange_variables(variables)
    end
    return result
  end
 
  alias use_item_blizzabsrmxos_later use_item
  def use_item(item, forced = false)
    result = use_item_blizzabsrmxos_later(item, forced)
    if result && (self == $game_player || $network.gmaster)
      variables = {}
      variables['@ai|@act|@kind'] = BlizzABS::ACTItem
      variables['@ai|@act|@id'] = item.id
      self.send_exchange_variables(variables)
    end
    return result
  end
 
  def setup_damage_display
    $BlizzABS.util.request_damage_sprite(self)
    @battler.damage, @battler.hpdamage, @battler.spdamage = nil, 0, 0
  end
 
  def in_screen?
    return true
  end
         
end
 
#==============================================================================
# Map_Actor
#==============================================================================

class Map_Actor
 
  alias update_blizzabsrmxos_later update
  def update
    update_blizzabsrmxos_later
    if !$network.gmaster && self.valid? && @battler.damage != nil
      setup_damage_display
    end
  end
 
  def get_exchange_variable_names
    return (super | RMXOS::Options::ACTOR_VARIABLES)
  end
 
  def update_exchange_variables
    changed = self.get_exchange_variables_changes
    if changed.size > 0
      self.send_exchange_variables(changed)
      self.store_exchange_variables(changed)
    end
  end
 
  def send_exchange_variables(variables = nil)
    variables = super(variables)
    $network.send_exchange_variables(variables) if self == $game_player
    return variables
  end
 
  alias attack_effect_blizzabsrmxos_later attack_effect
  def attack_effect(character, _battler)
    return false if !$network.gmaster
    return attack_effect_blizzabsrmxos_later(character, _battler)
  end
 
  alias skill_effect_blizzabsrmxos_later skill_effect
  def skill_effect(character, _battler, skill)
    return false if !$network.gmaster
    return skill_effect_blizzabsrmxos_later(character, _battler, skill)
  end
 
  alias item_effect_blizzabsrmxos_later item_effect
  def item_effect(character, _battler, item)
    return false if !$network.gmaster
    return item_effect_blizzabsrmxos_later(character, _battler, item)
  end
 
end
 
#==============================================================================
# Map_Enemy
#==============================================================================

class Map_Enemy
 
  attr_accessor :respawning
 
  alias update_blizzabsrmxos_later update
  def update
    update_blizzabsrmxos_later
    if !$network.gmaster && self.valid? && @battler.damage != nil
      setup_damage_display
    end
  end
 
  def get_exchange_variable_names
    return (super | RMXOS::Options::ENEMY_VARIABLES)
  end
 
  def update_exchange_variables
    changed = self.get_exchange_variables_changes
    if changed.size > 0
      self.send_exchange_variables(changed)
      self.store_exchange_variables(changed)
    end
  end
 
  def send_exchange_variables(variables = nil)
    variables = super(variables)
    $network.send_enemy_exchange_variables(self.id, variables)
    return variables
  end
 
  alias attack_effect_blizzabsrmxos_later attack_effect
  def attack_effect(character, _battler)
    return false if !$network.gmaster
    @last_targeter = character
    return attack_effect_blizzabsrmxos_later(character, _battler)
  end
 
  alias skill_effect_blizzabsrmxos_later skill_effect
  def skill_effect(character, _battler, skill)
    return false if !$network.gmaster
    @last_targeter = character
    return skill_effect_blizzabsrmxos_later(character, _battler, skill)
  end
 
  alias item_effect_blizzabsrmxos_later item_effect
  def item_effect(character, _battler, item)
    return false if !$network.gmaster
    @last_targeter = character
    return item_effect_blizzabsrmxos_later(character, _battler, item)
  end
 
end
 
#==============================================================================
# Map_OnlineBattler
#==============================================================================

class Map_OnlineBattler < Map_Actor
 
  attr_reader   :user_id
  attr_reader   :username
  attr_reader   :usergroup
  attr_accessor :map_id
 
  def initialize
    super(0)
    @battler = Game_Actor.new(1)
    @cindex = nil
    @ai.setup_group(BlizzABS::Alignments::ONLINE_GROUP)
    @normal_speed = BlizzABS::Config::NORMAL_SPEED
    refresh
  end
 
  def update
    if !$network.gmaster && self.valid? && @battler.damage != nil
      setup_damage_display
    end
    refresh
    super
    @character_name = @character_name_org
    sprite_animation_setup
    check_action
  end
 
  def check_action
    return if !self.valid? || !@ai.act.valid?
    battlers = []
    if @ai.target == nil
      battlers = ($game_map.battlers + $BlizzABS.battlers).find_all {|b|
          b.valid?}
      battlers.compact!
    end
    $BlizzABS.AI.normal_action(self, battlers, battlers, @ai.act.basic?,
        @ai.act.kind - 1, 0xFFFF, 0xFFFF, @ai.act.id, @ai.act.skill?)
    @ai.act.delay = 0 if !@ai.act.defend?
    $BlizzABS.AI.try_execute(self) if @ai.target != nil
    self.reset_action
  end
 
  def update?
    return false
  end
 
  def evaluate(variables, user_id, username, usergroup)
    super(variables)
    @user_id = user_id
    @username = username
    @usergroup = usergroup
    refresh
  end
 
  def battler(override = false)
    return @battler
  end
 
  def item_can_use?(id)
    return true
  end
 
  def item_consumption(item)
    $network.send_item_remove(@user_id, item.id) if item.consumable
  end
 
  def update_ci(ind = nil)
  end
 
  def update_buffer(move)
  end
 
  def turn_toward(character)
  end
 
  def moveto(x, y)
    pix = $BlizzABS.pixel
    super(x / pix, y / pix)
  end
 
end

Game_OnlineCharacter = Map_OnlineBattler

#==============================================================================
# Game_Map
#==============================================================================

class Game_Map
 
  alias battlers_blizzabsrmxos_later battlers
  def battlers
    return (battlers_blizzabsrmxos_later | $network.map_players.values)
  end
 
end

#==============================================================================
# Frame_Text
#==============================================================================

class Frame_Text
 
  alias update_input_blizzabsrmxos_later update_input
  def update_input
    keys = RMXOS.change_keys
    update_input_blizzabsrmxos_later
    RMXOS.restore_keys(keys)
  end
 
end

#==============================================================================
# Scene_Login
#==============================================================================

class Scene_Login
 
  alias update_blizzabsrmxos_later update
  def update
    keys = RMXOS.change_keys
    update_blizzabsrmxos_later
    RMXOS.restore_keys(keys)
  end
 
end

#==============================================================================
# Scene_Register
#==============================================================================

class Scene_Register
 
  alias update_blizzabsrmxos_later update
  def update
    keys = RMXOS.change_keys
    update_blizzabsrmxos_later
    RMXOS.restore_keys(keys)
  end
 
end

#==============================================================================
# Scene_Map
#==============================================================================

class Scene_Map
 
  alias main_blizzabsrmxos_later main
  def main
    main_blizzabsrmxos_later
    $network.try_deactivate_gmaster
  end
 
  def initialize_selection
  end
 
  def process_selection
    object, r, type, sprites = $game_temp.select_data
    if $tons_version != nil && object.is_a?(RPG::Skill) &&
        ($tons_version >= 6.02 && $game_system.TARGET_EM_ALL &&
        FULL_TARGET_IDS.include?(object.id))
      targets = []
      sprites.each {|sprite| targets.push(sprite.character)}
    else
      targets = [sprites[rand(sprites.size)].character]
    end
    return targets
  end
 
  def execute_selection(targets)
    if targets.size > 0
      $game_player.ai.target = targets[0]
      case $game_temp.select_data[0]
      when RPG::Skill then $game_player.use_skill($game_temp.select_data[0])
      when RPG::Item then $game_player.use_item($game_temp.select_data[0])
      end
    end
    $game_temp.select_data = nil
  end
 
  alias call_menu_blizzardrmxos_later call_menu
  def call_menu
    if $game_temp.chat_active
      $game_temp.menu_calling = false
      $game_temp.menu_beep = false
      return
    end
    call_menu_blizzardrmxos_later
  end
 
  alias check_huds_blizzardrmxos_later check_huds
  def check_huds
    minimap_button = $game_system.minimap_button
    hotkey_button = $game_system.hotkey_button
    hud_button = $game_system.hud_button
    if $game_temp.chat_active
      $game_system.minimap_button = false
      $game_system.hotkey_button = false
      $game_system.hud_button = false
    end
    check_huds_blizzardrmxos_later
    $game_system.minimap_button = minimap_button
    $game_system.hotkey_button = hotkey_button
    $game_system.hud_button = hud_button
  end
 
  alias update_hotkeys_blizzardrmxos_later update_hotkeys
  def update_hotkeys
    update_hotkeys_blizzardrmxos_later if !$game_temp.chat_active
  end
 
end


Make a new file with an .rb extension in the Extensions folder of RMX-OS and copy-paste this script into it.
[spoiler][code]module RMXOS
 
  def self.load_current_extension
    return BlizzABS
  end
 
  module Data
    GlobalMasterActivate = 'Client \'CLIENT\' activate G-Master for map \'MAPID\'.'
    GlobalMasterDeactivate = 'Client \'CLIENT\' deactivate G-Master for map \'MAPID\'.'
    GlobalMasterRelease = 'Map \'MAPID\' has been released.'
    PartyDisbanded = 'The party has been disbanded.'
    PartyFull = 'Your party is already full.'
    PartyFullPlayer = 'The party of \'PLAYER\' is already full.'
    PartyInvitation = '\'PLAYER\' has invited you to join a party.'
    PartyInvited = 'You have invited \'PLAYER\' to join your party.'
    PartyJoined = 'You have joined the party of \'PLAYER\'.'
    PartyJoinedPlayer = '\'PLAYER\' has joined the party.'
    PartyNoJoinPlayer = '\'PLAYER\' has not accepted the party invitation.'
    PartyNotOnline = '\'PLAYER\' is not online anymore.'
    PartyRemoved = 'You have left the party.'
    PartyRemovedPlayer = '\'PLAYER\' has left the party.'
  end
 
end

#======================================================================
# module BlizzABS
#======================================================================

module BlizzABS
 
  VERSION = 1.5
  RMXOS_VERSION = 1.18
  SERVER_THREAD = true
  IDENTIFIER = 'Blizz-ABS'
 
  # START Configuration
  MAX_ONLINE_PARTY = 5
  GMASTER_TIMEOUT = 5 # after how much an inactive time global master client should be released
  SERVER_DISPLAY = false # show log in command prompt screen
  LOG_FILENAME = 'logs/blizzabs.log' # leave empty if no log file should be created
  DELETE_LOG_ON_START = true
  # END Configuration
 
  def self.initialize
    @client_times = {}
    @gmasters = {}
    @capable_clients = {}
    @battlers = {}
    if LOG_FILENAME != ''
      File.delete(LOG_FILENAME) if DELETE_LOG_ON_START && FileTest.exist?(LOG_FILENAME)
      RMXOS::Logs[IDENTIFIER] = LOG_FILENAME
    end
  end
 
  def self.main
    while RMXOS.server.running
      self.server_update
      sleep(0.1)
    end
  end
 
  def self.server_update
    Thread.exclusive {
      time = Time.now
      logged_in_clients = $clients.find_all {|client| client.player.user_id > 0}
      old_clients = @client_times.keys - logged_in_clients
      old_clients.each {|client|
        @client_times.delete(client)
        @capable_clients.delete(@capable_clients.key(client))
        self.try_deactivate_gmaster(client)
        if client.player.partyleader != ''
          client.action.execute_party_remove(client.player.username, client.player.partyleader)
        end
      }
      new_clients = logged_in_clients - @client_times.keys
      new_clients.each {|client| @client_times[client] = time}
      @capable_clients.keys.each {|key|
        if time - @client_times[@capable_clients[key]] > GMASTER_TIMEOUT
          client = @capable_clients[key]
          @capable_clients.delete(key)
          self.try_deactivate_gmaster(client)
        end
      }
      (@capable_clients.values - logged_in_clients).each {|client| @capable_clients.delete(@capable_clients.key(client))}
      map_ids = []
      logged_in_clients.each {|client| map_ids.push(client.player.map_id)}
      map_ids |= map_ids # removes duplicates
      (@battlers.keys - map_ids).each {|map_id| @battlers.delete(map_id) if @battlers.has_key?(map_id)}
      (@gmasters.keys - map_ids).each {|map_id| self.release_map(map_id)}
      (map_ids - @gmasters.keys).each {|map_id| self.try_activate_gmaster(map_id)}
    }
  end
 
  def self.client_update(client)
    result = false
    case client.message
    when /\AGMD\Z/ # deactivate capable global master client
      @capable_clients.delete(client.player.user_id) if @capable_clients.has_key?(client.player.user_id)
      self.try_deactivate_gmaster(client, client.player.map_id) if client == @gmasters[client.player.map_id]
      result = true
    when /\APNG\Z/ # client ping
      if client.player.user_id != 0
        @client_times[client] = Time.now
        @capable_clients[client.player.user_id] = client if !@capable_clients.has_key?(client.player.user_id)
      end
    when /\AMEE(.+)\t(.+)/ # exchange variables for enemies
      id = $1.to_i
      variables = eval($2)
      @battlers[client.player.map_id] = {} if !@battlers.has_key?(client.player.map_id)
      @battlers[client.player.map_id][id] = Player.new(nil) if !@battlers[client.player.map_id].has_key?(id)
      @battlers[client.player.map_id][id].evaluate(variables)
      client.sender.send_to_map(client.message)
      result = true
    when /\AMEN(.+)/ # enter map
      map_id = $1.to_i
      if @battlers.has_key?(map_id)
        @battlers[map_id].each_key {|id|
          client.send("MEE#{id}\t#{@battlers[map_id][id].get_exchange_variables}")
        }
      end
    when /\ABED(.+)\t(.+)/ # broadcast enemy death
      if @gmasters[client.player.map_id] == client
        client.sender.send_to_map(client.message, true)
      else
        id = $1.to_i
        client.send("MEE#{id}\t#{@battlers[client.player.map_id][id].get_exchange_variables}")
      end
      result = true
    when /\ABER(.+)/ # broadcast enemy respawn
      if @gmasters[client.player.map_id] == client
        client.sender.send_to_map(client.message, true)
      else
        id = $1.to_i
        client.send("MEE#{id}\t#{@battlers[client.player.map_id][id].get_exchange_variables}")
      end
      result = true
    when /\AIRM(.+)\t(.+)/ # item remove
      if @gmasters[client.player.map_id] == client
        user_id, item_id = $1.to_i, $2.to_i
        client.sender.send_to_id(user_id, "IRM#{item_id}")
      end
      result = true
    when /\APIN(.+)/ # party invitation
      username = $1
      result = client.action.try_party_invite(username)
      case result
      when RMXOS::RESULT_SUCCESS
        message = RMXOS::Data::PartyInvited.sub('PLAYER') {username}
        color = RMXOS::Data::ColorInfo
      when RMXOS::RESULT_FAIL
        message = RMXOS::Data::PlayerNotOnlineMap.sub('PLAYER') {username}
        color = RMXOS::Data::ColorError
      when RMXOS::RESULT_ALTFAIL
        message = RMXOS::Data::PartyFull
        color = RMXOS::Data::ColorError
      end
      client.send("CHT#{color}\t0\t#{message}")
      result = true
    when /\APLE\Z/ # party leave
      client.action.execute_party_remove(client.player.username, client.player.partyleader)
      result = true
    when /\APRE(.+)/ # party remove
      username = $1
      client.action.execute_party_remove(username, client.player.partyleader)
      result = true
    when /\APME(.+)/ # party message
      client.sender.send_to_party("CHT#{$1}", true)
      result = true
    end
    return result
  end
 
  def self.try_activate_gmaster(map_id)
    return if @gmasters.has_key?(map_id)
    clients = @capable_clients.values.find_all {|client| client.player.map_id == map_id}
    return if clients.size == 0
    client = clients[0]
    client.send('GMA')
    @gmasters[map_id] = client
    if !@battlers.has_key?(map_id)
      @battlers[map_id] = {}
      client.send('MDR')
    end
    message = RMXOS::Data::GlobalMasterActivate.sub('CLIENT', client.player.username).sub('MAPID', map_id.to_s)
    self.log(message)
  end
 
  def self.try_deactivate_gmaster(client, map_id = nil)
    if map_id == nil
      @gmasters.each_key {|key|
        if client == @gmasters[key]
          map_id = key
          break
        end
      }
    end
    return if map_id == nil
    @gmasters.delete(map_id)
    client.send('GMD')
    message = RMXOS::Data::GlobalMasterDeactivate.sub('CLIENT', client.player.username).sub('MAPID', map_id.to_s)
    self.log(message)
    self.try_activate_gmaster(map_id)
    self.release_map(map_id) if !@gmasters.has_key?(map_id)
  end
 
  def self.release_map(map_id)
    @gmasters.delete(map_id) if @gmasters.has_key?(map_id)
    message = RMXOS::Data::GlobalMasterRelease.sub('MAPID', map_id.to_s)
    self.log(message)
  end
 
  def self.log(message)
    puts message if SERVER_DISPLAY
    RMXOS.log(IDENTIFIER, 'Log', message)
  end
 
end

#======================================================================
# Player
#======================================================================

class Player

  IGNORE_VARIABLES.push('@battler|@damage')
  IGNORE_VARIABLES.push('@battler|@hpdamage')
  IGNORE_VARIABLES.push('@battler|@spdamage')
  IGNORE_VARIABLES.push('@ai|@act|@kind')
  IGNORE_VARIABLES.push('@ai|@act|@id')
 
  attr_accessor :party
  attr_accessor :partyleader
 
  alias initialize_blizzabsrmxos_later initialize
  def initialize(client)
    initialize_blizzabsrmxos_later(client)
    self.reset_party
  end
 
  def reset_party
    @partyleader = ''
    @party = []
  end
 
end

#======================================================================
# Action
#======================================================================

class Action
 
  TYPE_PARTY_JOIN = 111
 
end
 
#======================================================================
# Action_Handler
#======================================================================

class Action_Handler
 
  def try_party_invite(username)
    return RMXOS::RESULT_ALTFAIL if @client.player.party.size >= BlizzABS::MAX_ONLINE_PARTY - 1
    client = @client.sender.get_client_by_name(username)
    return RMXOS::RESULT_FAIL if client == nil
    return RMXOS::RESULT_FAIL if client.player.map_id != @client.player.map_id
    client.action.current.type = Action::TYPE_PARTY_JOIN
    client.action.current.data = [@client.player.user_id, @client.player.username]
    message = "#{RMXOS::Data::PartyInvitation.sub('PLAYER') {@client.player.username}} #{RMXOS::Data::DoYouAccept}"
    client.send("CHT#{RMXOS::Data::ColorInfo}\t0\t#{message}")
    return RMXOS::RESULT_SUCCESS
  end
 
  def execute_party_join
    user_id, leadername = @current.data
    leader = @client.sender.get_client_by_id(user_id)
    if leader == nil
      message = RMXOS::Data::PlayerNotOnlineMap.sub('PLAYER') {leadername}
      @client.send("CHT#{RMXOS::Data::ColorInfo}\t0\t#{RMXOS::Data::PartyNotOnline}")
      return
    end
    if leader.player.party.size >= BlizzABS::MAX_ONLINE_PARTY - 1
      message = RMXOS::Data::PartyFullPlayer.sub('PLAYER') {leadername}
      @client.send("CHT#{RMXOS::Data::ColorInfo}\t0\t#{message}")
      return
    end
    leader.player.party |= [@client.player.username]
    @client.player.party = leader.player.party.clone
    @client.player.partyleader = leader.player.partyleader = leadername
    message = RMXOS::Data::PartyJoined.sub('PLAYER') {leadername}
    @client.send("CHT#{RMXOS::Data::ColorOK}\t0\t#{message}")
    @client.send("PIN#{leadername}\t#{leader.player.party.inspect}")
    message = RMXOS::Data::PartyJoinedPlayer.sub('PLAYER') {@client.player.username}
    @client.sender.get_party_clients.each {|client|
      client.send("PIN#{leadername}\t#{leader.player.party.inspect}")
      client.send("CHT#{RMXOS::Data::ColorOK}\t0\t#{message}")
      client.player.party = leader.player.party.clone
    }
  end
 
  def execute_party_remove(username, leadername)
    client = @client.sender.get_client_by_name(username)
    clients = $clients.find_all {|client| client.player.partyleader == leadername}
    leader = @client.sender.get_client_by_name(leadername)
    party = clients - [client, leader]
    if username == leadername || leader == nil || party.size == 0
      clients.each {|client|
        if !client.socket.closed?
          client.send('PRM')
          client.send("CHT#{RMXOS::Data::ColorInfo}\t0\t#{RMXOS::Data::PartyDisbanded}")
          client.player.reset_party
        end
      }
      return
    end
    if client != nil
      client.send('PRM')
      message = RMXOS::Data::PartyRemoved
      client.send("CHT#{RMXOS::Data::ColorInfo}\t0\t#{message}")
      client.player.reset_party
    end
    leader.sender.send_to_party("PRE#{username}", true)
    message = RMXOS::Data::PartyRemovedPlayer.sub('PLAYER') {username}
    leader.sender.send_to_party("CHT#{RMXOS::Data::ColorInfo}\t0\t#{message}", true)
  end

Blizzard

As I quoted myself in red text, the instructions how to add these scripts into your game are already there.
Check out Daygames and our games:

King of Booze 2      King of Booze: Never Ever
Drinking Game for Android      Never have I ever for Android
Drinking Game for iOS      Never have I ever for iOS


Quote from: winkioI do not speak to bricks, either as individuals or in wall form.

Quote from: Barney StinsonWhen I get sad, I stop being sad and be awesome instead. True story.

Xolitude

Quote from: Blizzard on January 31, 2013, 04:05:04 am
As I quoted myself in red text, the instructions how to add these scripts into your game are already there.

Alright, lemme go ahead and re-try it. I will edit this post with updates afterwards.


EDIT:
Spoiler: ShowHide


Why does it say it needs to be a higher version? O.o
----

Spoiler: ShowHide


Why does it say it doesn't exist?(This is the .rb extension for ABS)
----

Spoiler: ShowHide


Picture of my scripts

Blizzard

You haven't added the actual Blizz-ABS script.

Refer to this topic to make sure you add your scripts in the right order: http://forum.chaos-project.com/index.php/topic,23.0.html
Check out Daygames and our games:

King of Booze 2      King of Booze: Never Ever
Drinking Game for Android      Never have I ever for Android
Drinking Game for iOS      Never have I ever for iOS


Quote from: winkioI do not speak to bricks, either as individuals or in wall form.

Quote from: Barney StinsonWhen I get sad, I stop being sad and be awesome instead. True story.

Xolitude

Quote from: Blizzard on January 31, 2013, 05:07:05 am
You haven't added the actual Blizz-ABS script.

Refer to this topic to make sure you add your scripts in the right order: http://forum.chaos-project.com/index.php/topic,23.0.html

Ok how does this look?



Also, when I still start the game, I get the error that it requires blizz-abs 2.85 or higher

MOAL

Quote from: Xolitude on February 01, 2013, 07:07:32 pm
Quote from: Blizzard on January 31, 2013, 05:07:05 am
You haven't added the actual Blizz-ABS script.

Refer to this topic to make sure you add your scripts in the right order: http://forum.chaos-project.com/index.php/topic,23.0.html

Ok how does this look?



Also, when I still start the game, I get the error that it requires blizz-abs 2.85 or higher


You need to look in the Blizz-ABS Controller for RMX-OS inside your game project on line 76, edit the 2.85 to 2.84.

Xolitude

Quote from: MOAL on February 01, 2013, 08:41:29 pm
Quote from: Xolitude on February 01, 2013, 07:07:32 pm
Quote from: Blizzard on January 31, 2013, 05:07:05 am
You haven't added the actual Blizz-ABS script.

Refer to this topic to make sure you add your scripts in the right order: http://forum.chaos-project.com/index.php/topic,23.0.html

Ok how does this look?



Also, when I still start the game, I get the error that it requires blizz-abs 2.85 or higher


You need to look in the Blizz-ABS Controller for RMX-OS inside your game project on line 76, edit the 2.85 to 2.84.


Ok fixed that issue but now....


MOAL

You didn't edit the parameters in the RMX-OS script, did you? Or are you using the unedited script?

Blizzard

Your images don't appear to me. Try imageshack or photobucket.
Check out Daygames and our games:

King of Booze 2      King of Booze: Never Ever
Drinking Game for Android      Never have I ever for Android
Drinking Game for iOS      Never have I ever for iOS


Quote from: winkioI do not speak to bricks, either as individuals or in wall form.

Quote from: Barney StinsonWhen I get sad, I stop being sad and be awesome instead. True story.

Xolitude

Quote from: MOAL on February 01, 2013, 10:54:06 pm
You didn't edit the parameters in the RMX-OS script, did you? Or are you using the unedited script?


Unedited...

Xolitude

Quote from: Blizzard on February 02, 2013, 04:51:11 am
Your images don't appear to me. Try imageshack or photobucket.


All it says is this:

"Script 'Blizz-OS' line 171: NameError occurred

uninitialized constant RMXOS::Documentation::PARAMETERS"

Blizzard

Make sure that you add both parts of the script. Part 1 (the configuration) goes above Part 2 in the script editor.
Check out Daygames and our games:

King of Booze 2      King of Booze: Never Ever
Drinking Game for Android      Never have I ever for Android
Drinking Game for iOS      Never have I ever for iOS


Quote from: winkioI do not speak to bricks, either as individuals or in wall form.

Quote from: Barney StinsonWhen I get sad, I stop being sad and be awesome instead. True story.

Xolitude

Quote from: Blizzard on February 02, 2013, 01:58:07 pm
Make sure that you add both parts of the script. Part 1 (the configuration) goes above Part 2 in the script editor.


my scripts go like this(from the RMXOS):



(RMX-OS) Options
(RMX-OS) Script
Blizz-ABS Part 1
Blizz-ABS Part 2
Blizz-ABS Part 3
Blizz-OS(Blizz-ABS Controller)
-<:::RMX-OS Main:::>-

Blizzard

Check out Daygames and our games:

King of Booze 2      King of Booze: Never Ever
Drinking Game for Android      Never have I ever for Android
Drinking Game for iOS      Never have I ever for iOS


Quote from: winkioI do not speak to bricks, either as individuals or in wall form.

Quote from: Barney StinsonWhen I get sad, I stop being sad and be awesome instead. True story.

Xolitude

Quote from: Blizzard on February 02, 2013, 02:38:44 pm
Try inserting the scripts again.

*facepalms*....

I don't think this:
  #============================================================================
  # module RMXOS::Documentation
  #============================================================================
 
  module Documentation
   
    # Party commands
    PARAMETERS['party']   = 'USERNAME'

(Line 164-171, 171 being the error line)

Has anything to do with the Blizz-ABS Script placement...

"Script 'Blizz-OS' line 171: NameError occurred

uninitialized constant RMXOS::Documentation::PARAMETERS"


Blizz-OS being the Controller script


Blizzard

No, I meant that you maybe didn't copy the scripts right. PARAMETERS is a constant defined in the original RMX-OS script for the definition of chat command parameters. The controller adds new chat commands so it also adds the documentation for them.
Check out Daygames and our games:

King of Booze 2      King of Booze: Never Ever
Drinking Game for Android      Never have I ever for Android
Drinking Game for iOS      Never have I ever for iOS


Quote from: winkioI do not speak to bricks, either as individuals or in wall form.

Quote from: Barney StinsonWhen I get sad, I stop being sad and be awesome instead. True story.

Xolitude

Quote from: Blizzard on February 02, 2013, 02:50:45 pm
No, I meant that you maybe didn't copy the scripts right. PARAMETERS is a constant defined in the original RMX-OS script for the definition of chat command parameters. The controller adds new chat commands so it also adds the documentation for them.


So what scripts are you asking I do the same thing for again?(re-copy)

Blizzard

Check out Daygames and our games:

King of Booze 2      King of Booze: Never Ever
Drinking Game for Android      Never have I ever for Android
Drinking Game for iOS      Never have I ever for iOS


Quote from: winkioI do not speak to bricks, either as individuals or in wall form.

Quote from: Barney StinsonWhen I get sad, I stop being sad and be awesome instead. True story.