But i am writing because i have a problem with a custom script and i need the help to the community
The thing is that i am attemp to implement the Mouse Drop menu of nattman on MRMX, but i have some problems...
The thing is that the i implemented the code and it works pretty well, but works only just the player loggin in and just the player warp to another map...
As soon the player give one step in any direction, the drop menu doesn't appear again
The strange thing is that the scripts works well in a blank RMX-OS project, the problem is the compatibility with pokemon essentials, that makes lost the player control when the players gives 1 step
In any case, this are the 3 scripts that i modified to works but essentials, feel free to take a look and tell me if you have any ideas to works well:
#=begin
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
# Mouse Controller by Blizzard
# Version: 2.0b
# Type: Custom Input System
# Date: 9.10.2009
# Date v2.0b: 22.7.2010
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#
# This work is protected by the following license:
# #----------------------------------------------------------------------------
# #
# # Creative Commons - Attribution-NonCommercial-ShareAlike 3.0 Unported
# # ( http://creativecommons.org/licenses/by-nc-sa/3.0/ )
# #
# # You are free:
# #
# # to Share - to copy, distribute and transmit the work
# # to Remix - to adapt the work
# #
# # Under the following conditions:
# #
# # Attribution. You must attribute the work in the manner specified by the
# # author or licensor (but not in any way that suggests that they endorse you
# # or your use of the work).
# #
# # Noncommercial. You may not use this work for commercial purposes.
# #
# # Share alike. If you alter, transform, or build upon this work, you may
# # distribute the resulting work only under the same or similar license to
# # this one.
# #
# # - For any reuse or distribution, you must make clear to others the license
# # terms of this work. The best way to do this is with a link to this web
# # page.
# #
# # - Any of the above conditions can be waived if you get permission from the
# # copyright holder.
# #
# # - Nothing in this license impairs or restricts the author's moral rights.
# #
# #----------------------------------------------------------------------------
#
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#
# Compatibility:
#
# 90% compatible with SDK v1.x. 80% compatible with SDK v2.x. May cause
# incompatibility issues with other custom input Systems. Works with "Custom
# Game Controls" from Tons of Add-ons and Blizz-ABS's custom controls.
# This script is not meant to be used as a standalone but rather in
# combination with special menus that are properly adapted to support a mouse
# controller system.
#
#
# Features:
#
# - fully automated mouse control in game
# - can be enhanced with "Custom Game Controls" from Tons of Add-ons
# - can be enhanced with "Blizz-ABS Controls"
# - can be enhanced with "RMX-OS"
#
# new in 2.0b:
#
# - added option to hide Windows' cursor
# - added possibility to hide and show the ingame cursor during the game
# - added possibility to change the cursor icon
# - added several new options
# - optimized
#
#
# Instructions:
#
# - Explanation:
#
# This script can work as a stand-alone for window option selections. To be
# able to use the mouse buttons, you need a custom Input module. The
# supported systems are "Custom Game Controls" from Tons of Add-ons,
# Blizz-ABS Custom Controls and RMX-OS Custom Controls. This script will
# automatically detect and apply the custom input modules' configuration
# which is optional.
#
# - Configuration:
#
# MOUSE_ICON - the default filename of the icon located in the
# Graphics/Pictures folder
# APPLY_BORDERS - defines whether the ingame cursor can go beyond the
# game window borders
# WINDOW_WIDTH - defines the window width, required only when using
# APPLY_BORDER
# WINDOW_HEIGHT - defines the window height, required only when using
# APPLY_BORDER
# HIDE_WINDOWS_CURSOR - hides the Windows Cursor on the window by default
# AUTO_CONFIGURE - when using "Custom Game Controls" from Tons of
# Add-ons, Blizz-ABS or RMX-OS, this option will
# automatically add the left mouse button as
# confirmation button
#
# - Script Calls:
#
# You can use a few script calls to manipulate the cursor. Keep in mind that
# these changes are not being saved with the save file.
#
# To hide the ingame Mouse Cursor, use following call.
#
# $mouse.hide
#
# To show the ingame Mouse Cursor, use following call.
#
# $mouse.show
#
# To change the cursor image, use following call. Make sure your image is
#
# $mouse.set_cursor('IMAGE_NAME')
#
#
# Additional Information:
#
# Even though there is an API call to determine the size of the window, API
# calls are CPU expensive so the values for the window size need to be
# configured manually in this script.
#
#
# If you find any bugs, please report them here:
# http://forum.chaos-project.com
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
$mouse_controller = 2.0
#===============================================================================
# Mouse
#===============================================================================
class Mouse
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# START Configuration
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
MOUSE_ICON = 'Pokeball2'
AUTO_CONFIGURE = true
APPLY_BORDERS = true
WINDOW_WIDTH = 640
WINDOW_HEIGHT = 480
HIDE_WINDOWS_CURSOR = false
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# END Configuration
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if HIDE_WINDOWS_CURSOR
Win32API.new('user32', 'ShowCursor', 'i', 'i').call(0)
end
SCREEN_TO_CLIENT = Win32API.new('user32', 'ScreenToClient', %w(l p), 'i')
READ_INI = Win32API.new('kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l')
FIND_WINDOW = Win32API.new('user32', 'FindWindowA', %w(p p), 'l')
CURSOR_POSITION = Win32API.new('user32', 'GetCursorPos', 'p', 'i')
def initialize
@cursor = Sprite.new
@cursor.z = 1000000
self.set_cursor(MOUSE_ICON)
update
end
def update
@cursor.x, @cursor.y = self.position
end
def x
return @cursor.x
end
def y
return @cursor.y
end
def position
x, y = self.get_client_position
if APPLY_BORDERS
if x < 0
x = 0
elsif x >= WINDOW_WIDTH
x = WINDOW_WIDTH - 1
end
if y < 0
y = 0
elsif y >= WINDOW_HEIGHT
y = WINDOW_HEIGHT - 1
end
end
return x, y
end
def get_client_position
pos = [0, 0].pack('ll')
CURSOR_POSITION.call(pos)
SCREEN_TO_CLIENT.call(WINDOW, pos)
return pos.unpack('ll')
end
def set_cursor(image)
@cursor.bitmap = RPG::Cache.picture(image)
end
def show
@cursor.visible = true
end
def hide
@cursor.visible = false
end
def self.find_window
game_name = "\0" * 256
READ_INI.call('Game', 'Title', '', game_name, 255, '.\\Game.ini')
game_name.delete!("\0")
return FIND_WINDOW.call('RGSS Player', game_name)
end
WINDOW = self.find_window
end
$mouse = Mouse.new
#==============================================================================
# module Input
#==============================================================================
module Input
class << Input
alias update_mousecontroller_later update
end
def self.update
$mouse.update
update_mousecontroller_later
end
if Mouse::AUTO_CONFIGURE
if $BlizzABS
C.push(Input::Key['Mouse Left']) if !C.include?(Input::Key['Mouse Left'])
if !Attack.include?(Input::Key['Mouse Right'])
Attack.push(Input::Key['Mouse Right'])
end
elsif $tons_version != nil && $tons_version >= 6.4 &&
TONS_OF_ADDONS::CUSTOM_CONTROLS || defined?(RMXOS)
C.push(Input::Key['Mouse Left']) if !C.include?(Input::Key['Mouse Left'])
end
end
end
#===============================================================================
# Rect
#===============================================================================
class Rect
def covers?(x, y)
return !(x < self.x || x >= self.x + self.width ||
y < self.y || y >= self.y + self.height)
end
end
#===============================================================================
# Sprite
#===============================================================================
class Sprite
def mouse_in_area?
return false if self.bitmap == nil
return ($mouse.x >= self.x && $mouse.x < self.x + self.src_rect.width &&
$mouse.y >= self.y && $mouse.y < self.y + self.src_rect.height)
end
end
#===============================================================================
# Window_Base
#===============================================================================
class Window_Base
def mouse_in_area?
return ($mouse.x >= self.x && $mouse.x < self.x + self.width &&
$mouse.y >= self.y && $mouse.y < self.y + self.height)
end
def mouse_in_inner_area?
return ($mouse.x >= self.x + 16 && $mouse.x < self.x + self.width - 16 &&
$mouse.y >= self.y + 16 && $mouse.y < self.y + self.height - 16)
end
end
#===============================================================================
# Window_Selectable
#===============================================================================
class Window_Selectable
alias contents_is_mousecontroller_later contents=
def contents=(bitmap)
contents_is_mousecontroller_later(bitmap)
begin
update_selections
update_mouse if self.active
rescue
end
end
alias index_is_mousecontroller_later index=
def index=(value)
index_is_mousecontroller_later(value)
update_selections
end
alias active_is_mousecontroller_later active=
def active=(value)
active_is_mousecontroller_later(value)
update_cursor_rect
end
def update_selections
@selections = []
index, ox, oy = self.index, self.ox, self.oy
(0...@item_max).each {|i|
@index = i
update_cursor_rect
rect = self.cursor_rect.clone
rect.x += self.ox
rect.y += self.oy
@selections.push(rect)}
@index, self.ox, self.oy = index, ox, oy
self.cursor_rect.empty
end
alias update_mousecontroller_later update
def update
update_mouse if self.active
update_mousecontroller_later
end
# Aegis fix
def mouse_in_area?
return ($mouse.x >= self.x && $mouse.x < self.x + self.width &&
$mouse.y >= self.y && $mouse.y < self.y + self.height)
end
def mouse_in_inner_area?
return ($mouse.x >= self.x + 16 && $mouse.x < self.x + self.width - 16 &&
$mouse.y >= self.y + 16 && $mouse.y < self.y + self.height - 16)
end
# Aegis fix
def update_mouse
if self.mouse_in_inner_area?
update_mouse_selection
return
end
self.index = -1
if self.contents != nil && @selections.size > 0 && self.mouse_in_area?
update_mouse_scrolling
end
end
def update_mouse_selection
update_selections if @selections.size != @item_max
@selections.each_index {|i|
if @selections[i].covers?($mouse.x - self.x - 16 + self.ox,
$mouse.y - self.y - 16 + self.oy)
self.index = i if self.index != i
return
end}
self.index = -1
end
def update_mouse_scrolling
if Input.repeat?(Input::C)
if $mouse.x < self.x + 16
if self.ox > 0
$game_system.se_play($data_system.cursor_se)
self.ox -= @selections[0].width
self.ox = 0 if self.ox < 0
end
elsif $mouse.x >= self.x + self.width - 16
max_ox = self.contents.width - self.width + 32
if self.ox <= max_ox
$game_system.se_play($data_system.cursor_se)
self.ox += @selections[0].width
self.ox = max_ox if self.ox >= max_ox
end
elsif $mouse.y < self.y + 16
if self.oy > 0
$game_system.se_play($data_system.cursor_se)
self.oy -= @selections[0].height
self.oy = 0 if self.oy < 0
end
elsif $mouse.y >= self.y + self.height - 16
max_oy = self.contents.height - self.height + 32
if self.oy <= max_oy
$game_system.se_play($data_system.cursor_se)
self.oy += @selections[0].height
self.oy = max_oy if self.oy >= max_oy
end
end
end
end
end
#=end
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
# Mouse Controller Enhancement Script by Nathmatt
# Version: 1.74
# Type: Add On
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#
# This work is protected by the following license:
# #----------------------------------------------------------------------------
# #
# # Creative Commons - Attribution-NonCommercial-ShareAlike 3.0 Unported
# # ( http://creativecommons.org/licenses/by-nc-sa/3.0/ )
# #
# # You are free:
# #
# # to Share - to copy, distribute and transmit the work
# # to Remix - to adapt the work
# #
# # Under the following conditions:
# #
# # Attribution. You must attribute the work in the manner specified by the
# # author or licensor (but not in any way that suggests that they endorse you
# # or your use of the work).
# #
# # Noncommercial. You may not use this work for commercial purposes.
# #
# # Share alike. If you alter, transform, or build upon this work, you may
# # distribute the resulting work only under the same or similar license to
# # this one.
# #
# # - For any reuse or distribution, you must make clear to others the license
# # terms of this work. The best way to do this is with a link to this web
# # page.
# #
# # - Any of the above conditions can be waived if you get permission from the
# # copyright holder.
# #
# # - Nothing in this license impairs or restricts the author's moral rights.
# #
# #----------------------------------------------------------------------------
#
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
# Instructions:
#
# To use the event effects in this script you will need to name the following.
#
# definitions
# d = 2 down, 4 left 6, right, or 8 up
# right click to access an events command list
#
# \ignore Use on events you want to be walkable
#
# \msg[message] This will add the message above the highlighted event
#
# \directionfix[d] If an event has a graphic and needs a specific direction
# they must be named this d as the open direction
#
# \direction[d] If an event has no graphic or isn't direction specific
# they must be named this d as the open direction
#
# \commands This will create a command list for each page with the
# name of the first avalible comment
#
# \curser[graphic] This will change the graphic of the curser while
# over that event
#
# \auto This will start the event as soon as you click it
#
# \door[id] This will run the pages of an event as the following
# id is the item id needed to unlock the door
# first page when door is locked
# second page when unlocking the door
# third page any time after being unlocked
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
# Script Calls:
#
# $MCES.disabled = true/false whether or not this script is disabled
#
# $MCES.movement_disabled = true/false whether or not movement is disabled
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
module MCES
Version = 1.74
#============================================================================
# MCES::Config
#----------------------------------------------------------------------------
# The configuration for $MCES
#============================================================================
module Config
No_Walk_Tag = 7 # The terrain tag for unreachable locations
Text_Size = 20 # The size of the event name text
Text_Color = [0,0,160] # The color of the event name text
Click_Graphic = false # The sprite placed for move target
Range = 30 # The range for allows click movement
end
#============================================================================
# MCES::Cache
#----------------------------------------------------------------------------
# Stores data for use throughout $MCES
#============================================================================
module Cache
PathDirs = [[0, 1, 2], [-1, 0, 4], [1, 0, 6], [0, -1, 8]]
TDirs = [[0, true], [1, true], [2, true], [3, true], [4, true], [5, true],
[6, true], [7, true], [8, true], [9, true]]
DirOffsets = [[0, 0], [-1, 1], [0, 1], [1, 1], [-1, 0], [0, 0], [1, 0],
[-1, -1], [0, -1], [1, -1]]
Direction = 0
Commands = 1
Curser = 2
Auto = 3
Door = 4
Msg = 5
Ignore = 6
end
#============================================================================
# MCES::Processor
#----------------------------------------------------------------------------
# This class performs the $MCES's processing.
#============================================================================
class Processor
attr_accessor :item,:curser_lock,:disabled,:movement_disabled,:location
attr_reader :event_start
def initialize
@disabled,@movement_disabled,@location = false,false,[]
@lwait,@rwait,curser_lock,@carry_sprite = 0,0,false,Sprite.new
@carry_sprite.z = 999999;@carry_sprite.bitmap = Bitmap.new(24, 24)
@mouse_set = true
end
def update
if @lwait > 0;@lwait-= 1;end
if @rwait > 0;@rwait-= 1;end
@item = $data_items[@item] if @item.is_a?(Numeric)
return if @disabled
if !$scene.is_a?(Scene_Map);@lwait = 5;return;end
if Input.trigger?(Input::Key['Mouse Left']) &&
!$game_temp.message_window_showing && @lwait == 0
@lwait = 5
check_left
elsif Input.trigger?(Input::Key['Mouse Right']) && @rwait == 0
@rwait = 5
check_right
end
check_player
check_carry
check_mouse
if @command_window != nil && !@command_window.disposed?
@command_window.update
end
end
def check_left
x,y = mouse_tile
return if check_event || !$game_map.passable?(x,y,0) || @movement_disabled ||
check_terrain_tag(x,y) || check_range(x,y,MCES::Config::Range)
return if @command_window != nil && !@command_window.disposed?
$game_player.set(x,y)
end
def check_event
$game_map.events.each_value{|event|
next if event.erased
if event.mouse_in_area?
if event.type.include?(MCES::Cache::Ignore)
return false
end
if event.type.include?(MCES::Cache::Auto)
event.start_event
return true
elsif event.type.include?(MCES::Cache::Door)
event.check_door
return true
else
$game_player.set(event) if !@movement_disabled
return true
end
end}
return false
end
def check_right
$game_map.events.each_value{|event|
next if event.erased
if event.mouse_in_area?
if event.type.include?(MCES::Cache::Commands)
return if @command_window != nil && !@command_window.disposed?
@command_window = Event_Command.new(event)
return
end
end}
end
def mouse_tile
x,y = $mouse.x,$mouse.y
return (x+$game_map.display_x/4)/32,(y+$game_map.display_y/4)/32
end
def check_terrain_tag(x,y)
return ($game_map.terrain_tag(x,y) == Config::No_Walk_Tag)
end
def check_target(x,y=0)
if x.is_a?(Game_Character)
c = x
d = (x.direction_fixed != nil ? x.direction_fixed : x.direction)
x,y = c.x,c.y
x += (d == 4 ? -1 : 1) if d != (2 || 8)
y += (d == 8 ? -1 : 1) if d != (4 || 6)
end
return x,y
end
def check_player
return if @request == nil
count = 4
characters = [$game_player]
while characters.size > 0 && count > 0
char = characters.shift
result = find_path
result != nil ? char.force_movement = result : characters.push(char)
count -= 1
end
end
def check_carry
@carry_sprite.x,@carry_sprite.y = $mouse.x,$mouse.y
if @item != nil
if @carry_curser != @item.icon_name
@carry_curser = @item.icon_name
@carry_sprite.bitmap.blt(0, 0, RPG::Cache.icon(@carry_curser),
Rect.new(0, 0, 24, 24))
end
else
@carry_curser = nil
@carry_sprite.bitmap.clear
end
end
def check_mouse
$game_map.events.each_value{|event|
if event.mouse_in_area?
next if event.erased
if event.type.include?(MCES::Cache::Curser)
$mouse.set_cursor(event.curser)
@mouse_set = false
return
end
end}
if !@mouse_set
return if @curser_lock
@mouse_set = true
$mouse.set_cursor(Mouse::MOUSE_ICON)
end
end
def request_path(x, y = nil)
x,y = check_target(x,y)
if x != nil && y != nil && @request == nil
@request = PathRequesting.new(x, y)
end
end
def distance(x,y,tx,ty)
return Math.hypot((x - tx),(y - ty))
end
def check_range(x,y,range)
pl = $game_player
return (range <= distance(pl.x,pl.y,x,y))
end
def find_path
request = @request
if request.open.size == 0;@request = nil;return []end
found = false
key = request.open.keys.min {|a, b|
Math.hypot(a[0] - request.tx, a[1] - request.ty) <=>
Math.hypot(b[0] - request.tx, b[1] - request.ty)}
request.closed[key[0], key[1]] = request.open[key]
request.open.delete(key)
Cache::PathDirs.each {|dir|
kx, ky = key[0] + dir[0], key[1] + dir[1]
if kx == request.tx && ky == request.ty
request.closed[kx, ky] = dir[2]
found = true
break
elsif request.closed[kx, ky] == 0 &&
$game_player.passable?(key[0], key[1], dir[2])
request.open[[kx, ky]] = dir[2]
end}
return nil unless found
@request = nil
return request.backtrack
end
end
#============================================================================
# MCES::Msg_Sprite
#----------------------------------------------------------------------------
# The msg sprite.
#============================================================================
class Msg_Sprite < Sprite
def initialize(event)
super()
@event = event
self.z,self.opacity = 1000,0
self.set
@h = MCES::Config::Text_Size
@w = event.msg.size*@h
c = MCES::Config::Text_Color
self.bitmap = Bitmap.new(@w,@h)
self.bitmap.font.size = @h
self.bitmap.font.color = Color.new(c[0],c[1],c[2])
self.bitmap.draw_text(0,0,@w,@h,event.msg,1)
end
def set
return if !$scene.is_a?(Scene_Map) || @event.erased
b = @event.get_sprite.inner_bitmap
xs = @event.get_sprite.x-(@event.get_sprite.cw/2)
ys = @event.get_sprite.y-@event.get_sprite.ch
self.x,self.y = xs + (b.width/2)-(@w/2),ys-@h
end
def update
self.set
return self.opacity = 0 if @event.erased
if @event.mouse_in_area?
if self.opacity < 255
self.opacity += 25
end
elsif self.opacity > 0
self.opacity -= 25
end
end
end
#============================================================================
# MCES::Set_Sprite
#----------------------------------------------------------------------------
# The set sprite.
#============================================================================
class Set_Sprite < Sprite
def initialize(v)
super
self.bitmap = RPG::Cache.picture(MCES::Config::Click_Graphic)
@x,@y,self.opacity,self.z = 0,0,0,1
end
def set(x,y)
return if MCES::Config::Click_Graphic == false
@e,x,y = x,x.x,x.y if x.is_a?(Game_Character)
@x,@y,self.opacity = x,y,255
end
def update_screen
return if self.opacity == 0
x = ((@x * 128) - $game_map.display_x + 3) / 4
y = ((@y * 128) - $game_map.display_y + 3) / 4
self.x,self.y = x,y
end
def update
return if MCES::Config::Click_Graphic == false
update_screen
end
end
#============================================================================
# MCES::Event_Command
#----------------------------------------------------------------------------
# The event command window.
#============================================================================
class Event_Command < Window_Command
def initialize(event)
@size = 0
@event = event
@main_commands = event.commands
@array = []
@main_commands.each{|command|
@array.push(command) if command != nil
@size = (command.size * 32) if (command.size * 32) > @size}
super(@size,@array)
self.x,self.y = $mouse.position
end
def indexes
return @main_commands.index(@array[self.index])
end
def update
super
if Input.trigger?(Input::Key['Mouse Left'])
if self.index >= 0
@event.start_command(indexes)
self.dispose
else
self.dispose
end
end
end
end
#============================================================================
# MCES::Pathrequest
#----------------------------------------------------------------------------
# This class preforms the movement requests.
#============================================================================
class PathRequesting
attr_reader :open,:closed,:sx,:sy,:tx,:ty,:jd
def initialize(tx, ty, jd = 0)
pix = ($BlizzABS != nil ? BlizzABS::Config::PIXEL_MOVEMENT_RATE : 1)
ox,oy = $game_player.location
@sx, @sy, @tx, @ty, @jd = ox, oy, tx, ty, jd
@x_off, @y_off = ox - @sx, oy - @sy
@open = {[@sx, @sy] => -1}
@closed = Table.new($game_map.width, $game_map.height)
end
def backtrack
cx, cy, x, y, result = @tx, @ty, 0, 0, []
loop do
cx, cy = cx - x, cy - y
break if cx == @sx && cy == @sy
result.unshift(Cache::TDirs[@closed[cx, cy]])
x, y = Cache::DirOffsets[@closed[cx, cy]]
end
return result
end
end
end
raise('This script requires Mouse Controller by Blizzard to work') if $mouse == nil
$MCES = MCES::Processor.new
#============================================================================
# Game_Character
#----------------------------------------------------------------------------
# Adds a mouse_in_area? method to any instance of this class.
#============================================================================
class Game_Character_fix
attr_reader :type
attr_accessor :icon_name,:direction_fixed
alias mces_character_initialize initialize
def initialize
@type = []
mces_character_initialize
end
def mouse_in_area?
return false if get_sprite == nil || get_sprite.is_a?(Array)
return false if get_sprite.inner_bitmap == nil
return false if get_sprite.cw == nil || get_sprite.ch == nil
return true if [$mouse.x/32,$mouse.y/32] == [self.x,self.y]
b = get_sprite.inner_bitmap
xs = get_sprite.x-(get_sprite.cw/2)
ys = get_sprite.y-get_sprite.ch
return ($mouse.x >= xs && $mouse.x < xs + b.width &&
$mouse.y >= ys && $mouse.y < ys + b.height &&
b.get_pixel($mouse.x-xs, $mouse.y-ys) != Color.new(255,255,255,0))
end
def get_sprite
return if !$scene.is_a?(Scene_Map)
$scene.spriteset.character_sprites.each{|s|return s if s.character == self}
end
end
#============================================================================
# Game_Event
#----------------------------------------------------------------------------
# This class sets the events proccesing for MCES.
#============================================================================
class Game_Event_fix < Game_Character_fix
attr_accessor :event_start
attr_reader :key,:curser,:msg,:commands,:erased
alias mces_initialize initialize
def initialize(id,event)
mces_initialize(id,event)
@child_interpeter = Interpreter.new
@event_start = false
@type,@commands, = [],[]
check_name
end
#alias mces_update update
def mces_update
mces_update
@child_interpeter.update
@msg_sprite.update if @msg_sprite != nil
end
#alias mces_start start
def mces_start
return if @trigger == 0 && (!@event_start || @commands.size > 0)
mces_start
@event_start = false
end
def start_event
@event_start = true
start
end
def check_door
if @key == $MCES.item
@child_interpeter.setup(@event.pages[1].list,@id)
$game_party.gain_item($MCES.item.id, -1)
$MCES.item = nil
@key_unlock = true
elsif @key_unlock
@child_interpeter.setup(@event.pages[2].list,@id)
else
@child_interpeter.setup(@event.pages[0].list,@id)
end
return
end
def start_command(i)
@child_interpeter.setup(@event.pages[i].list,@id)
end
def check_name
if @event.name.clone.gsub!(/\\[Ii]gnore/) {''}
@type.push(MCES::Cache::Ignore)
end
if @event.name.clone.gsub!(/\\[Aa]uto/) {''}
@type.push(MCES::Cache::Auto)
end
if @event.name.clone.gsub!(/\\[Cc]ommands/) {''}
@type.push(MCES::Cache::Commands)
@interpreter = Interpreter.new
@event.pages.each{|page|page.list.each{|list|
@last_list = list if @last_list == nil
if list.code == 108
if @last_list.code == 111
if @interpreter.command_111([@last_list,list])
@commands[@event.pages.index(page)] = list.parameters[0]
end
else
@commands[@event.pages.index(page)] = list.parameters[0]
end
end
@last_list = list}}
@interpreter = nil
end
if @event.name.clone.gsub!(/\\[Dd]irectionfix\[(\d+)\]/) {"#[$1]"}
@type.push(MCES::Cache::Direction)
@direction_fixed = $1.to_i
end
if @event.name.clone.gsub!(/\\[Dd]irection\[(\d+)\]/) {"#[$1]"}
@type.push(MCES::Cache::Direction)
@direction = $1.to_i
end
if @event.name.clone.gsub!(/\\[Ll]ocked\[(\d+)\]/) {"#[$1]"}
@type.push(MCES::Cache::Door)
@key = $data_items[$1.to_i]
end
if @event.name.clone.gsub!(/\\[Cc]urser\[(.+?)\]/) {"#[$1]"}
@type.push(MCES::Cache::Curser)
@curser = $1
end
if @event.name.clone.gsub!(/\\[Mm]sg\[(.+?)\]/) {"#[$1]"}
@type.push(MCES::Cache::Msg)
@msg = $1
@msg_sprite = MCES::Msg_Sprite.new(self)
end
end
end
#============================================================================
# Game_Player
#----------------------------------------------------------------------------
# Adds force movement.
#============================================================================
class Game_Player_fix
attr_accessor :force_movement
#alias mces_update update
def mces_update
mces_update
if @target_x == nil
@force_movement = []
$MCES.location = []
else
if @force_movement == []
$MCES.request_path(@target_x, @target_y)
end
update_forcemovement if !moving?
if location == $MCES.check_target(@target_x,@target_y)
if @target_x.is_a?(Game_Event)
@target_x.start_event
face_target
end
if $scene.spriteset.set_sprite != nil
$scene.spriteset.set_sprite.opacity = 0
end
@target_x = @target_y = nil
@force_movement = []
$MCES.location = []
end
end
end
def face_target
sx = @x - @target_x.x
sy = @y - @target_x.y
return if sx == 0 and sy == 0
sx > 0 ? turn_left : turn_right if sx.abs > sy.abs
sy > 0 ? turn_up : turn_down if sx.abs < sy.abs
end
def update_forcemovement
return if @force_movement.size == 0
move = @force_movement.shift
case move[0]
when 1 then move_lower_left
when 2 then move_down(move[1])
when 3 then move_lower_right
when 4 then move_left(move[1])
when 6 then move_right(move[1])
when 7 then move_upper_left
when 8 then move_up(move[1])
when 9 then move_upper_right
end
end
def location
return self.x,self.y
end
def click_jump(x,y)
new_x,new_y = x-self.y,x-self.y
jump(new_x,new_y)
end
def set(x,y=nil)
@force_movement = []
@target_x, @target_y = x,y
$scene.spriteset.set_sprite.set(x,y) if MCES::Config::Click_Graphic != false
end
end
#============================================================================
# Interpreter
#----------------------------------------------------------------------------
# Allows external use of the condition command.
#============================================================================
class Interpreter
alias mces_command_111 command_111
def command_111(list = nil)
if list != nil
@index = 0
@list = list
@list.push(RPG::EventCommand.new(412, list[0].indent, []))
@parameters = list[0].parameters
end
mces_command_111
if list != nil
return @branch[0] == nil
end
end
end
=begin
#============================================================================
# Input
#----------------------------------------------------------------------------
# Adds the alias methods and updates the processor.
#============================================================================
module Input
class << Input
alias mces_trigger? trigger?
alias mces_update update
end
def self.update
$MCES.update
mces_update
end
end
if ($tons_version || $BlizzABS || $network) == nil
#============================================================================
# Input
#----------------------------------------------------------------------------
# Adds the mouse trigger commands if not using Blizzards input methods.
#============================================================================
module Input
Key = {'Mouse Left' => 1, 'Mouse Right' => 2}
C = Key['Mouse Left']
#======================================
# |-> Keyboard Input Module
#======================================
# By: Near Fantastica
# Date: 06.07.05
# Version: 3
#
# Cut down by Zeriab
# Date: 16.08.06
#======================================
def self.trigger?(key)
return false if key == nil
if !Win32API.new("user32","GetKeyState",['i'],'i').call(key).between?(0, 1)
return true
else
return mces_trigger?(key)
end
end
end
end
=end
#============================================================================
# Sprite_Character
#----------------------------------------------------------------------------
# Creats a inner bitmap for use with the mouse_in_area? method.
#============================================================================
class Sprite_Character_fix
attr_reader :ch,:cw,:inner_bitmap
alias mces_initialize initialize
def initialize(viewport,character = nil)
mces_initialize(viewport,character)
end
#alias mces_update update
def mces_update
mces_update
if $BlizzABS != nil
return if @sprite == nil
return if @sprite.cw == nil || @sprite.ch == nil
@cw,@ch = @sprite.cw, @sprite.ch
end
if @character.icon_name != nil || @character.tile_id >= 384
@inner_bitmap = self.bitmap.clone
return
end
@inner_bitmap = Bitmap.new(@cw,@ch) if @inner_bitmap == nil
if @pattern != @character.pattern
@pattern = @character.pattern
bitmap = ($BlizzABS != nil ? @sprite.bitmap : self.bitmap)
src_rect = ($BlizzABS != nil ? @sprite.src_rect : self.src_rect)
@inner_bitmap.clear
@inner_bitmap.blt(0, 0, bitmap, src_rect)
end
end
end
#============================================================================
# Spriteset_Map
#----------------------------------------------------------------------------
# Creats the set_sprite
#============================================================================
class Spriteset_Map_fix
attr_reader :character_sprites,:set_sprite
alias mces_initialize initialize
def initialize
mces_initialize
if MCES::Config::Click_Graphic != false
@set_sprite = MCES::Set_Sprite.new(@viewport1)
end
end
#alias mces_update update
def mces_update
mces_update
@set_sprite.update if @set_sprite != nil
end
end
#============================================================================
# Adds eternal reading of methods.
#============================================================================
class Sprite_Character_ABSEAL_ed; attr_reader :ch,:cw end if $BlizzABS != nil
class Scene_Map; attr_reader :spriteset end
if $BlizzABS != nil
class BlizzABS::Processor
def pixel
return 1
end
end
end
#=begin
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
# Character Drop Down Menu by Nathmatt
# Version: 1.15
# Type: Misc System
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#
# This work is protected by the following license:
# #----------------------------------------------------------------------------
# #
# # Creative Commons - Attribution-NonCommercial-ShareAlike 3.0 Unported
# # ( http://creativecommons.org/licenses/by-nc-sa/3.0/ )
# #
# # You are free:
# #
# # to Share - to copy, distribute and transmit the work
# # to Remix - to adapt the work
# #
# # Under the following conditions:
# #
# # Attribution. You must attribute the work in the manner specified by the
# # author or licensor (but not in any way that suggests that they endorse you
# # or your use of the work).
# #
# # Noncommercial. You may not use this work for commercial purposes.
# #
# # Share alike. If you alter, transform, or build upon this work, you may
# # distribute the resulting work only under the same or similar license to
# # this one.
# #
# # - For any reuse or distribution, you must make clear to others the license
# # terms of this work. The best way to do this is with a link to this web
# # page.
# #
# # - Any of the above conditions can be waived if you get permission from the
# # copyright holder.
# #
# # - Nothing in this license impairs or restricts the author's moral rights.
# #
# #----------------------------------------------------------------------------
#
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
class Character_Drop_Down_Menu
def initialize
username = ''
@mini_list_array = ['Add Buddy','Trade']
@mini_list_array.insert(1,'Add Party') if $blizzabs_rmxos != nil
if $network.guildleader == $network.username
@mini_list_array.insert(0,'Guild Invite')
end
@mini_list_array.push('Kick','Ban') if $network.usergroup > 0
@confirm_window = Window_Confirm.new
@mini_list = Window_Mini_List.new(@mini_list_array)
@mini_list.visible = false
@wait = 0
end
def update
@wait -= 1 if @wait > 0
if Input.trigger?(Input::Key['Mouse Right'])
return if @wait != 0
@mx,@my = $mouse.pos
@sx,@sy = $mouse.position
@player_username = $network.check_player(@mx,@my)
@players_info = $network.get_player(@mx,@my)
if @player_username != nil
@mini_list.visible = true
@mini_list.active = true
@mini_list.x = @sx
@mini_list.y = @sy
$MCES.disabled = true
end
@wait = 5
end
if @mini_list.active
@mini_list.update
if Input.trigger?(Input::Key['Mouse Left'])
return if @wait != 0
if @mini_list.index >= 0
@confirm_window.set_commands(@mini_list.item,@player_username)
end
@mini_list.visible = false
@mini_list.active = false
@wait = 5
end
end
if @confirm_window.active
@confirm_window.update
if Input.trigger?(Input::Key['Mouse Left'])
return if @wait != 0
case @confirm_window.index
when 0
case @mini_list.item
when 'Add Buddy'
$network.command_buddy_add(@player_username)
when 'Trade'
$network.command_trade_request(@player_username)
when 'Guild Invite'
$network.command_guild_invite(@player_username)
when 'Kick'
$network.command_kick_player(@player_username)
when 'Ban'
$network.command_ban_player(@player_username)
when 'Add Party'
$network.command_party_invite(@player_username)
end
@confirm_window.visible = false
@confirm_window.active = false
else
@confirm_window.visible = false
@confirm_window.active = false
end
$MCES.disabled = false
#$MCES.wait = 5
@wait = 5
end
end
end
end
#==============================================================================
# Scene_Map
#==============================================================================
class Scene_Map
alias character_drop_down_menu_main main
def main
@mini_menu = Character_Drop_Down_Menu.new
character_drop_down_menu_main
end
alias character_drop_down_menu_update update
def update
@mini_menu.update
character_drop_down_menu_update
end
end
#==============================================================================
# Mouse
#==============================================================================
class Mouse
attr_accessor :cursor
def pos
x, y = self.position
x = ( x + $game_map.display_x / 4) / 32
y = ( y + $game_map.display_y / 4) / 32
return x, y
end
end
#==============================================================================
# Window_list
#==============================================================================
class Window_Mini_List < Window_Selectable
#--------------------------------------------------------------------------
# * Object Initialization
# actor : actor
#--------------------------------------------------------------------------
def initialize(list)
super(476, 175, 104, 300)
@list = list
@column_max = 1
refresh
self.index = 0
self.opacity = 0
self.active = false
self.z = 10000
end
#--------------------------------------------------------------------------
# * Get Item
#--------------------------------------------------------------------------
def item
return @data[self.index] if self.index >= 0
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
if self.contents != nil
self.contents.dispose
self.contents = nil
end
@data = []
@list.each {|i| @data.push(i)}
# If item count is not 0, make a bit map and draw all items
@item_max = @data.size
if @item_max > 0
self.contents = Bitmap.new(width - 32, row_max * 32)
self.contents.fill_rect(0,0,width,height,Color.new(0, 0, 0, 160))
@data.each_index {|i| draw_item(i)}
end
end
#--------------------------------------------------------------------------
# * Draw Item
# index : item number
#--------------------------------------------------------------------------
def draw_item(index)
x = index % 1 * (288 + 32)
y = index / 1 * 32
self.contents.font.size = 16
self.contents.draw_text(x, y, width - 32, 32, @data[index].to_s, 1)
end
end
#==============================================================================
# Window_Confirm
#==============================================================================
class Window_Confirm < Window_Selectable
#--------------------------------------------------------------------------
# * Object Initialization
# actor : actor
#--------------------------------------------------------------------------
def initialize
super(100, 100, 300, 150)
@data = ['Yes','No']
@column_max = 2
@command = nil
@user = nil
refresh
self.index = 0
self.opacity = 0
self.active = false
self.visible = false
self.z = 10000
end
#--------------------------------------------------------------------------
# * Get Item
#--------------------------------------------------------------------------
def item
return @data[self.index] if self.index >= 0
end
#--------------------------------------------------------------------------
# * reset
#--------------------------------------------------------------------------
def set_commands(command,user)
@command = command
@user = user
self.visible = true
self.active = true
refresh
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
if self.contents != nil
self.contents.dispose
self.contents = nil
end
# If item count is not 0, make a bit map and draw all items
@item_max = @data.size
if @item_max > 0
self.contents = Bitmap.new(width - 32, 20 + row_max * 32)
self.contents.font.size = 16
self.contents.fill_rect(0,0,width,height,Color.new(0, 0, 0, 160))
self.contents.draw_text(0,0,width,20,
'Are you sure you want to '+ @command.to_s + ' ' + @user.to_s)
@data.each_index {|i| draw_item(i)}
end
end
#--------------------------------------------------------------------------
# * Draw Item
# index : item number
#--------------------------------------------------------------------------
def draw_item(index)
x = index * (width - 32) / 2
self.contents.draw_text(x, 20, (width - 32) / 2, 32, @data[index].to_s, 1)
end
#--------------------------------------------------------------------------
# * Cursor Rectangle Update
#--------------------------------------------------------------------------
def update_cursor_rect
if @index < 0
self.cursor_rect.empty
else
self.cursor_rect.set(self.index * (width - 32) / 2, 25,
(width - 32) / 2 , 20)
end
end
end
#============================================================================
# RMXOS::Network
#============================================================================
class RMXOS::Network
def check_player(x,y)
@players.any? {|key, value|
return value.username if value.x == x && value.y == y}
return nil
end
def get_player(x,y)
if $blizzabs_rmxos != nil
@players.any? {|key, value|
return value.battler if value.x == x && value.y == y}
end
return nil
end
end
# Load the network
$network = RMXOS::Network.new
#=end
PS: I also added the scripts of a blank project: *Window_base * Window_selectable *Window_Command, but the problem persist
-------------------------------------------------------------------------------------------------------------------------------------------------------
Thanks to Wizered and Blizzard this problem is solved, it was a error in the coordinates, thanks to they for this