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 :)
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.
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
# 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.
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
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.
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
# 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
As I quoted myself in red text, the instructions how to add these scripts into your game are already there.
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:
(http://gyazo.com/1e4ff407b0bfd8832232b45f61f54563.png)
Why does it say it needs to be a higher version? O.o
----
(http://gyazo.com/6494ff1c74fc0be775dd8ddcea24ad49.png)
Why does it say it doesn't exist?(This is the .rb extension for ABS)
----
(http://gyazo.com/24b7b2652079d83abead26387e28b314.png)
Picture of my scripts
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
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?
(http://gyazo.com/0563ab8b5337de57d8cfb871c70b7fca.png)
Also, when I still start the game, I get the error that it requires blizz-abs 2.85 or higher
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?
(http://gyazo.com/0563ab8b5337de57d8cfb871c70b7fca.png)
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.
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?
(http://gyazo.com/0563ab8b5337de57d8cfb871c70b7fca.png)
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....
(http://gyazo.com/f598d18638be4d395286af389f2bb219.png)
You didn't edit the parameters in the RMX-OS script, did you? Or are you using the unedited script?
Your images don't appear to me. Try imageshack or photobucket.
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...
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"
Make sure that you add both parts of the script. Part 1 (the configuration) goes above Part 2 in the script editor.
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:::>-
Try inserting the scripts again.
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
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.
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)
The RMX-OS script is probably causing the problem.
Quote from: Blizzard on February 02, 2013, 03:25:31 pm
The RMX-OS script is probably causing the problem.
Nope. Re-copied it twice. Same error.
EDIT: Perhaps the problem is the extension is not being loaded?
1. Yes, I do actually have an extension in the folder.
2. Yes, I do have the text for the controller in it.
Loading Extensions...
Error: 'new' could not be loaded, initialized or does not exist
It says that you set EXTENSIONS = ['new'] or EXTENSIONS = ['new.rb']
Quote from: Blizzard on February 02, 2013, 05:45:33 pm
It says that you set EXTENSIONS = ['new'] or EXTENSIONS = ['new.rb']
That's how it looks.
EDIT: Do you just wanna talk on Skype or something so we don't have to keep bumping this post up?
You don't have to bump things, it'll be read eventually. Many people here are busy with other things after all. Anyway, are you sure that you made the extension an .rb file? Because from the looks of it, it seems like it can't detect it.
Quote from: MOAL on February 02, 2013, 07:00:38 pm
You don't have to bump things, it'll be read eventually. Many people here are busy with other things after all. Anyway, are you sure that you made the extension an .rb file? Because from the looks of it, it seems like it can't detect it.
Haven't been bumping it...
Anyways yes.
Extensions folder contains:
Controller.rb - Renamed from new
ExtensionSkeleton.rb
info.txt
Let me set a demo for you containing both the client and the server, that way you can see if that one works instead. Here it is, try this one: http://www.mediafire.com/?2uim5jtsw5pk4r5 It contains Blizz-ABS already set up in it.
I've tested these myself and they work just fine.
Edit: Had to re-upload.
Quote from: MOAL on February 02, 2013, 07:45:32 pm
Let me set a demo for you containing both the client and the server, that way you can see if that one works instead. Here it is, try this one: http://www.mediafire.com/?2uim5jtsw5pk4r5 It contains Blizz-ABS already set up in it.
I've tested these myself and they work just fine.
Edit: Had to re-upload.
"This project is from an old version of RPG Maker and cannot be loaded." :/ You have an older version?
Quote from: Xolitude on February 02, 2013, 08:02:34 pm
Quote from: MOAL on February 02, 2013, 07:45:32 pm
Let me set a demo for you containing both the client and the server, that way you can see if that one works instead. Here it is, try this one: http://www.mediafire.com/?2uim5jtsw5pk4r5 It contains Blizz-ABS already set up in it.
I've tested these myself and they work just fine.
Edit: Had to re-upload.
"This project is from an old version of RPG Maker and cannot be loaded." :/ You have an older version?
Strange, not that I recall. I have the one I got from Enterbrain's website. Replace the Game.exe, Game.rxproj, and Game.ini with the ones from your project.
Quote from: MOAL on February 02, 2013, 08:06:35 pm
Quote from: Xolitude on February 02, 2013, 08:02:34 pm
Quote from: MOAL on February 02, 2013, 07:45:32 pm
Let me set a demo for you containing both the client and the server, that way you can see if that one works instead. Here it is, try this one: http://www.mediafire.com/?2uim5jtsw5pk4r5 It contains Blizz-ABS already set up in it.
I've tested these myself and they work just fine.
Edit: Had to re-upload.
"This project is from an old version of RPG Maker and cannot be loaded." :/ You have an older version?
Strange, not that I recall. I have the one I got from Enterbrain's website. Replace the Game.exe, Game.rxproj, and Game.ini with the ones from your project.
But wouldn't that just erase everything you made in this project...?
you only need to replace game.rxproj with the same file from your current version, it wont delete any of your progress in your project, all that is stored inside the data files, also i remember a small bug that occurred when adding and removing extensions with the gui tool, if I remember correctly when you delete an entry it does not fully remove it, it just leaves a blank named extension, open up the config file thingy and check the extension part to make sure that is not the case
No, that wouldn't. As long as you're not deleting the folders.
Quote from: MOAL on February 02, 2013, 08:27:23 pm
Quote from: Xolitude on February 02, 2013, 08:18:05 pm
Quote from: MOAL on February 02, 2013, 08:06:35 pm
Quote from: Xolitude on February 02, 2013, 08:02:34 pm
Quote from: MOAL on February 02, 2013, 07:45:32 pm
Let me set a demo for you containing both the client and the server, that way you can see if that one works instead. Here it is, try this one: http://www.mediafire.com/?2uim5jtsw5pk4r5 It contains Blizz-ABS already set up in it.
I've tested these myself and they work just fine.
Edit: Had to re-upload.
"This project is from an old version of RPG Maker and cannot be loaded." :/ You have an older version?
Strange, not that I recall. I have the one I got from Enterbrain's website. Replace the Game.exe, Game.rxproj, and Game.ini with the ones from your project.
But wouldn't that just erase everything you made in this project...?
No, that wouldn't. As long as you're not deleting the folders.
So far so good, except when I try to register:
2013-02-03 01:33:48 UTC; -1 () - Error:
Data too long for column 'password' at row 1
Data/Action_Handler1.rb:38:in `query'
Data/Action_Handler1.rb:38:in `try_register'
Data/Client.rb:137:in `check_connection'
Data/Client.rb:47:in `handle'
Data/Server.rb:276:in `block (2 levels) in run'
<internal:prelude>:28:in `block in exclusive'
<internal:prelude>:10:in `synchronize'
<internal:prelude>:27:in `exclusive'
Data/Server.rb:274:in `block in run'
I get this :/
What is the length of the password that you're trying to use? I set the length to 50 in the script... Try lowering it.
Quote from: MOAL on February 02, 2013, 08:52:07 pm
Quote from: Xolitude on February 02, 2013, 08:35:14 pm
Quote from: MOAL on February 02, 2013, 08:27:23 pm
Quote from: Xolitude on February 02, 2013, 08:18:05 pm
Quote from: MOAL on February 02, 2013, 08:06:35 pm
Quote from: Xolitude on February 02, 2013, 08:02:34 pm
Quote from: MOAL on February 02, 2013, 07:45:32 pm
Let me set a demo for you containing both the client and the server, that way you can see if that one works instead. Here it is, try this one: http://www.mediafire.com/?2uim5jtsw5pk4r5 It contains Blizz-ABS already set up in it.
I've tested these myself and they work just fine.
Edit: Had to re-upload.
"This project is from an old version of RPG Maker and cannot be loaded." :/ You have an older version?
Strange, not that I recall. I have the one I got from Enterbrain's website. Replace the Game.exe, Game.rxproj, and Game.ini with the ones from your project.
But wouldn't that just erase everything you made in this project...?
No, that wouldn't. As long as you're not deleting the folders.
So far so good, except when I try to register:
2013-02-03 01:33:48 UTC; -1 () - Error:
Data too long for column 'password' at row 1
Data/Action_Handler1.rb:38:in `query'
Data/Action_Handler1.rb:38:in `try_register'
Data/Client.rb:137:in `check_connection'
Data/Client.rb:47:in `handle'
Data/Server.rb:276:in `block (2 levels) in run'
<internal:prelude>:28:in `block in exclusive'
<internal:prelude>:10:in `synchronize'
<internal:prelude>:27:in `exclusive'
Data/Server.rb:274:in `block in run'
I get this :/
What is the length of the password that you're trying to use? I set the length to 50 in the script... Try lowering it.
Nope, same error :/
Okay guys, there is absolutely no reason to create a quoteception. Only do that in the SPAM boards.
I'm sorry, I deleted the quotes off my replies. Back to the topic, try clearing your database? That's as far as I can help...
Cleared, yet still this same error :/ ugh... always problems.
So no one can help with this problem I have NOW...
Great, back where I started. No progress made! :facepalm:
Try deleting the database completely. I think something went wrong during the database creation.
Quote from: Blizzard on February 02, 2013, 10:04:53 pm
Try deleting the database completely. I think something went wrong during the database creation.
Same error even after doing that..
2013-02-03 03:10:35 UTC; -1 () - Error:
Data too long for column 'password' at row 1
Data/Action_Handler1.rb:38:in `query'
Data/Action_Handler1.rb:38:in `try_register'
Data/Client.rb:137:in `check_connection'
Data/Client.rb:47:in `handle'
Data/Server.rb:276:in `block (2 levels) in run'
<internal:prelude>:28:in `block in exclusive'
<internal:prelude>:10:in `synchronize'
<internal:prelude>:27:in `exclusive'
Data/Server.rb:274:in `block in run'
This only happens when registering. Login obviously can't be done.
Did you edit the SQL script? By default the database password hashes always have the same length, regardless of password length.
Turn on message logging in cfg.ini and post the messages that are logged right after that error happens.
2013-02-03 03:28:08 UTC; -1 () - Incoming Message:
Test
2013-02-03 03:28:08 UTC; -1 () - Outgoing Message:
DCS
2013-02-03 03:28:18 UTC; -1 () - Incoming Message:
Test
2013-02-03 03:28:18 UTC; -1 () - Outgoing Message:
DCS
2013-02-03 03:28:22 UTC; -1 () - Incoming Message:
CON1.21
2013-02-03 03:28:22 UTC; -1 () - Outgoing Message:
CON0 1.21
2013-02-03 03:28:30 UTC; -1 () - Incoming Message:
REGXolitude royVLEuD.WM
2013-02-03 03:28:30 UTC; -1 () - Outgoing Message:
DCS
2013-02-03 03:28:33 UTC; -1 () - Incoming Message:
Test
2013-02-03 03:28:33 UTC; -1 () - Outgoing Message:
DCS
I have no clue what this means.. I hope you do. This is what the log said.
That's really weird. This is the message for registration:
Xolitude is your username and royVLEuD.WM is the hash value of your password. The length is fine, IDK why it's not working. Have you tried another password?
Quote from: Blizzard on February 03, 2013, 06:43:07 am
That's really weird. This is the message for registration:
Xolitude is your username and royVLEuD.WM is the hash value of your password. The length is fine, IDK why it's not working. Have you tried another password?
I've tried several different passwords..
Alright, drop the database again and recreate it from scratch. But before execute the SQL script for creating the database, find this line:
`password` varchar(11) NOT NULL,
and change it to this:
`password` varchar(20) NOT NULL,
Let's see what happens.
The line is located somewhere right under this one:
Quote from: Blizzard on February 03, 2013, 04:09:27 pm
Alright, drop the database again and recreate it from scratch. But before execute the SQL script for creating the database, find this line:
`password` varchar(11) NOT NULL,
and change it to this:
`password` varchar(20) NOT NULL,
Let's see what happens.
The line is located somewhere right under this one:
After that, execute the SQL script?
EDIT: OMG thank you so much <3 it works! I had to do that, and change the database being used from "rmxosdb" to "db", thanks so much <3