Mouse System - Sistema de Mouse
Seg Jan 20, 2020 11:07 am
Mouse System - Sistema de Mouse
por Jet10985(Jet)
[title]
- Introdução:
[/title]Quem não acha um máximo usar o mouse para interagir com o game?
Pois é! Este script permite o uso do mouse na interação com o projeto, e ainda possui algumas ferramentas extras que podem auxiliar e/ou melhorar essa interação. O script é de fácil entendimento, mas somente é aconselhável o manuseio das informações que não estejam nas partes personalizáveis por aqueles que entendem do assunto.
[title]
- Características:
[/title]. Permite o uso do mouse no gameplay.
. Interagem por padrão com qualquer sistema padrão do VX Ace.
. Permite exibir mensagens sobre o evento selecionado.
. Permite mudança de ícone quando selecionar um evento.
. Pathfinder incluso.
. Entre outras funções configuráveis.
[title]
- Imagens:
[/title]- Clique:
- [Tens de ter uma conta e sessão iniciada para poderes visualizar esta imagem]
[title]
- Código:
[/title]- Código:
#===============================================================================
# Mouse System - Sistema de Mouse
# Por: Jet10985(Jet)
#===============================================================================
# Este script permite o uso do mouse no sistema do Ace para vários propósitos.
#===============================================================================
# Overwritten Methods:
# Game_Player: move_by_input
# Window_NameInput: item_max
#-------------------------------------------------------------------------------
# Aliased methods:
# Scene_Map: update, terminate, update_transfer_player
# Input: update, trigger?, press?, repeat?, dir4
# Window_Selectable: update, top_row=
# Scene_File: update, top_index=
# Game_Event: update, setup_page
# Game_Player: check_action_event, get_on_off_vehicle
# Game_System: initialize
#===============================================================================
#
#===============================================================================
# MOSTRANDO UM TEXTO SOBRE O EVENTO QUANDO O MOUSE PASSA
#===============================================================================
# Você pode fazer com que apareça uma mensagem sobre o evento, quando o mesmo
# estiver como o mouse sobre ele. Para isso é só usar o comando de evento
# "Comentário" e colocar no início do comentário as palavras "MOUSE TEXT" e na
# frente escrever a mensagem que você quer que apareça. Como no exemplo:
#
# MOUSE TEXT Baúzinho
#
# Neste exemplo será mostrada a palavra "Baúzinho" sobre o evento.
# A mensagem some assim que o cursor do mouse é retirado de sobre o evento.
#===============================================================================
# TROCANDO A IMAGEM QUANDO O MOUSE ESTÁ SOBRE UM EVENTO
#===============================================================================
# Você pode também fazer com que a imagem/ícone do cursos mude, quando o mouse
# está sobre um evento. Para isso é só usar o comando de evento "Comentário" e
# colocar no início do comentário as palavras "MOUSE PIC" e na frente escrever
# o nome da imagem ou colocar o ID do ícone. Como no exemplo:
#
# MOUSE PIC 131
#
# Neste exemplo será mostrado o ícone de ID 131.
# Caso você coloque o número, esse número corresponderá ao ID do ícone que será
# exibido. Caso você coloque o nome, terá de haver uma imagem com esse mesmo
# nome na pasta "Graphics/Pictures".
#===============================================================================
# DEFINIR DESTINO DO PERSONAGEM AO CLICAR EM UM EVENTO
#===============================================================================
# Se você quiser que, quando um evento for clicado, o personagem se dirija para
# perto desse evento e para ao lado dele, é só usar o comando de evento
# "Comentário" e colocar no início do comentário as palavras "MOUSE MOVE" e na
# frente escrever o lado em que você quer que o personagem pare quando chegar
# próximo ao evento de destino, UP = acima, LEFT = esquerda, RIGHT = direita e
# DOWN = abaixo. Observe o exemplo:
#
# MOUSE MOVE DOWN
#
# Neste exemplo, o personagem irá se mover para próximo ao evento (esse evento é
# sempre o que recebe o comentário em questão) e parar abaixo dele.
#===============================================================================
# ATIVAR UM EVENTO AO CLICAR NELE
#===============================================================================
# Você ainda pode fazer com que um evento seja ativado, mesmo à distância. Para
# isso é só usar o comando de evento "Comentário" e colocar no comentário as
# palavras "MOUSE CLICK".
#===============================================================================
# IGNORAR EVENTOS
#===============================================================================
# Para ignorar um evento quando o mouse faz seu caminho de movimento (como se o
# evento não estivesse lá), use o comando de evento "Comentário" e colocar no
# comentário as palavras "MOUSE THROUGH".
#===============================================================================
# NOTAS EXTRAS
# Mesmo utilizando o sistema de mouse, ainda é possível usar as teclas.
#===============================================================================
module Jet
module MouseSystem
#-------------------------------------------------------------------------------
# Este é o nome da imagem que será usada como cursor. Essa imagem deve estar na
# na pasta "Graphics/Pictures". Se esta imagem não existir, o cursor terá o
# gráfico do ícone do ID respectivo ao que indicar logo abaixo.
#-------------------------------------------------------------------------------
CURSOR_IMAGE = "cursor-picture"
CURSOR_ICON = 147
#-------------------------------------------------------------------------------
# Esta é a Switch que desativa o mouse. Para o sistema de mouse ser desativado
# é só você ativar a switch abaixo.
#-------------------------------------------------------------------------------
TURN_MOUSE_OFF_SWITCH = 99
#-------------------------------------------------------------------------------
# Esta opção é para que você possa habilitar ou desabilitar o movimento do
# personagem usando o mouse. Para ativar ou desativar durante o jogo, você deve
# utilizar o comando por evento "Chamar Script" e escrever o código
# "toggle_mouse_movement(true/false)" sem as aspas obviamente e usando o "true"
# para permitir e o "false" para não permitir o movimento pelo mouse.
#-------------------------------------------------------------------------------
ALLOW_MOUSE_MOVEMENT = true
#-------------------------------------------------------------------------------
# A opção abaixo permite que seja ou não mostrada uma caixa com as bordas pretas
# no tile selecionado pelo mouse. Para permitir(como de padrão) deixe "true" e
# para não permitir, coloque "false".
#-------------------------------------------------------------------------------
DEV_OUTLINE = true
end
#===============================================================================
module HoverText
#-------------------------------------------------------------------------------
# Esta é a fonte que será usada para se escrever as mensagens sobre o evento,
# quando essa função for habilitada, claro.
#-------------------------------------------------------------------------------
FONT = "Verdana"
#-------------------------------------------------------------------------------
# Esta é a cor da fonte (R, G, B , Alpha[claridade]).
#-------------------------------------------------------------------------------
COLOR = Color.new(255, 255, 255, 255)
#-------------------------------------------------------------------------------
# Este é o tamanho da fonte.
#-------------------------------------------------------------------------------
SIZE = 15
end
#===============================================================================
module Pathfinder
#-------------------------------------------------------------------------------
# Este é o tempo padrão dado ao Pathfinder para que ele encontre o caminho.
#-------------------------------------------------------------------------------
MAXIMUM_ITERATIONS = 1000
end
#===============================================================================
end
#===============================================================================
# Somente edite abaixo por contra própria.
#===============================================================================
module Mouse
Get_Message = Win32API.new('user32', 'GetMessage', 'plll', 'l')
GetAsyncKeyState = Win32API.new("user32", "GetAsyncKeyState", 'i', 'i')
GetKeyState = Win32API.new("user32", "GetKeyState", 'i', 'i')
GetCursorPo = Win32API.new('user32', 'GetCursorPos', 'p', 'i')
SetCursorPos = Win32API.new('user32', 'SetCursorPos', 'nn', 'n')
ScreenToClient = Win32API.new('user32', 'ScreenToClient', 'lp', 'i')
FindWindowA = Win32API.new('user32', 'FindWindowA', 'pp', 'l')
GetClientRect = Win32API.new('user32', 'GetClientRect', 'lp', 'i')
GetWindowRect = Win32API.new('user32', 'GetWindowRect', 'lp', 'i')
contents = File.open('Game.ini', 'r') {|f| f.read }
q = contents[/Title=(.+)/].nil? ? "cccc" : $1
@handle = FindWindowA.call('RGSS Player', q)
Win32API.new('user32', 'ShowCursor', 'i', 'i').call(0)
module_function
def click?(button)
return true if @keys.include?(button)
return false
end
def press?(button)
return true if @press.include?(button)
return false
end
def set_pos(x_pos = 0, y_pos = 0)
width,height = client_size
if (x_pos.between?(0, width) && y_pos.between?(0, height))
SetCursorPos.call(client_pos[0] + x_pos,client_pos[1] + y_pos)
end
end
def moved?
@pos != @old_pos
end
def set_cursor(image)
(@cursor ||= Sprite_Cursor.new).set_cursor(image)
end
def revert_cursor
(@cursor ||= Sprite_Cursor.new).revert
end
def update
if !$game_switches.nil?
if $game_switches[Jet::MouseSystem::TURN_MOUSE_OFF_SWITCH]
@keys, @press = [], []
@pos = [-1, -1]
@cursor.update
return
end
end
@old_pos = @pos.dup
@pos = Mouse.pos
@keys.clear
@press.clear
@keys.push(1) if GetAsyncKeyState.call(1)&0x01 == 1
@keys.push(2) if GetAsyncKeyState.call(2)&0x01 == 1
@keys.push(3) if GetAsyncKeyState.call(4)&0x01 == 1
@press.push(1) if pressed?(1)
@press.push(2) if pressed?(2)
@press.push(3) if pressed?(4)
@cursor.update rescue @cursor = Sprite_Cursor.new
end
def init
@keys = []
@press = []
@pos = Mouse.pos
@cursor = Sprite_Cursor.new
end
def pressed?(key)
return true unless GetKeyState.call(key).between?(0, 1)
return false
end
def global_pos
pos = [0, 0].pack('ll')
GetCursorPo.call(pos) != 0 ? (return pos.unpack('ll')) : (return [0, 0])
end
def pos
x, y = screen_to_client(*global_pos)
width, height = client_size
begin
x = 0 if x <= 0; y = 0 if y <= 0
x = width if x >= width; y = height if y >= height
return x, y
end
end
def screen_to_client(x, y)
return nil unless x && y
pos = [x, y].pack('ll')
if ScreenToClient.call(@handle, pos) != 0
return pos.unpack('ll')
else
return [0, 0]
end
end
def client_size
rect = [0, 0, 0, 0].pack('l4')
GetClientRect.call(@handle, rect)
right,bottom = rect.unpack('l4')[2..3]
return right, bottom
end
def client_pos
rect = [0, 0, 0, 0].pack('l4')
GetWindowRect.call(@handle, rect)
left, upper = rect.unpack('l4')[0..1]
return left + 4, upper + 30
end
def grid
[(@pos[0]/32),(@pos[1]/32)]
end
def true_grid
[grid[0] + $game_map.display_x, grid[1] + $game_map.display_y]
end
def area?(x, y, width, height)
@pos[0].between?(x, width + x) && @pos[1].between?(y, height + y)
end
class Sprite_Cursor < Sprite
def initialize
super(nil)
self.z = 50000
@bitmap_cache = initial_bitmap
if Jet::MouseSystem::DEV_OUTLINE
@outline = Sprite.new(nil)
@outline.bitmap = Bitmap.new(32, 32)
@outline.bitmap.fill_rect(0, 0, 32, 32, Color.new(0, 0, 0, 190))
@outline.bitmap.fill_rect(1, 1, 30, 30, Color.new(0, 0, 0, 0))
end
end
def initial_bitmap
begin
self.bitmap = Cache.picture(Jet::MouseSystem::CURSOR_IMAGE)
rescue
self.bitmap = Bitmap.new(24, 24)
icon_index = Jet::MouseSystem::CURSOR_ICON
rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
self.bitmap.blt(0, 0, Cache.system("Iconset"), rect, 255)
end
self.bitmap.dup
end
def set_cursor(image)
if image.is_a?(Integer)
self.bitmap = Bitmap.new(24, 24)
icon_index = image
rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
self.bitmap.blt(0, 0, Cache.system("Iconset"), rect, 255)
else
self.bitmap = Cache.picture(image)
end
end
def revert
self.bitmap = @bitmap_cache.dup
end
def update
super
self.x, self.y = *Mouse.pos
self.visible = !$game_switches[Jet::MouseSystem::TURN_MOUSE_OFF_SWITCH]
if !@outline.nil?
@outline.visible = SceneManager.scene_is?(Scene_Map)
@outline.x = Mouse.grid[0] * 32
@outline.y = [Mouse.grid[1] * 32, 1].max
end
end
end
end
Mouse.init
class << Input
alias jet5888_press? press?
def press?(arg)
if arg == Input::C
return true if Mouse.press?(1)
elsif arg == Input::B
return true if Mouse.press?(2)
end
jet5888_press?(arg)
end
alias jet5888_repeat? repeat?
def repeat?(arg)
if arg == Input::C
return true if Mouse.click?(1)
elsif arg == Input::B
return true if Mouse.click?(2)
end
jet5888_repeat?(arg)
end
alias jet5888_trigger? trigger?
def trigger?(arg)
if arg == Input::C
return true if Mouse.click?(1)
elsif arg == Input::B
return true if Mouse.click?(2)
end
jet5888_trigger?(arg)
end
alias jet3845_dir4 dir4
def dir4(*args, &block)
if (orig = jet3845_dir4) == 0
if !$game_temp.nil? && SceneManager.scene_is?(Scene_Map)
if !(a = $game_temp.mouse_character).nil? && a.movable?
if !$game_temp.mouse_path.nil? && !$game_temp.mouse_path.empty?
return $game_temp.mouse_path.pop * 2
end
end
end
end
$game_temp.mouse_path = nil if !$game_temp.nil?
return orig
end
alias jet8432_update update
def update(*args, &block)
jet8432_update(*args, &block)
Mouse.update
end
end
class Window_Selectable
alias jet1084_update update
def update(*args, &block)
jet1084_update(*args, &block)
update_mouse if self.active && self.visible && Mouse.moved?
end
alias jet7222_top_row top_row=
def top_row=(*args, &block)
@last_cursor_move = 0 if @last_cursor_move.nil?
@last_cursor_move -= 1
return if @last_cursor_move > 0
jet7222_top_row(*args, &block)
@last_cursor_move = 10
end
def update_mouse
return if $game_switches[Jet::MouseSystem::TURN_MOUSE_OFF_SWITCH]
orig_index = @index
rects = []
add_x = self.x + 16 - self.ox
add_y = self.y + 16 - self.oy
if !self.viewport.nil?
add_x += self.viewport.rect.x - self.viewport.ox
add_y += self.viewport.rect.y - self.viewport.oy
end
self.item_max.times {|i|
@index = i
mouse_update_cursor
rects.push(cursor_rect.dup)
}
@index = orig_index
rects.each_with_index {|rect, i|
if Mouse.area?(rect.x + add_x, rect.y + add_y, rect.width, rect.height)
@index = i
end
}
update_cursor
end
def mouse_update_cursor
if @cursor_all
cursor_rect.set(0, 0, contents.width, row_max * item_height)
elsif @index < 0
cursor_rect.empty
else
cursor_rect.set(item_rect(@index))
end
end
end
class Window_NameInput
def item_max
90
end
end
class Scene_File
alias jet3467_update update
def update(*args, &block)
update_mouse
jet3467_update(*args, &block)
end
alias jet7222_top_index top_index=
def top_index=(*args, &block)
@last_cursor_move = 0 if @last_cursor_move.nil?
@last_cursor_move -= 1
return if @last_cursor_move > 0
jet7222_top_index(*args, &block)
@last_cursor_move = 10
end
def update_mouse
self.item_max.times {|i|
ix = @savefile_windows[i].x
iy = @savefile_windows[i].y + 48 - @savefile_viewport.oy
iw = @savefile_windows[i].width
ih = @savefile_windows[i].height
if Mouse.area?(ix, iy, iw, ih)
@savefile_windows[@index].selected = false
@savefile_windows[i].selected = true
@index = i
end
}
ensure_cursor_visible
end
end
class Game_Temp
attr_accessor :mouse_character, :mouse_movement, :mouse_path
end
class Game_CharacterBase
def mouse_path(target_x, target_y)
f = $game_map.find_path(target_x.to_i, target_y.to_i, @x.to_i, @y.to_i, self)
$game_temp.mouse_path = f.collect {|a| a.code }
end
end
class Game_Player
def move_by_input
return if !movable? || $game_map.interpreter.running?
dir = Input.dir4
move_straight(dir) if dir > 0
end
alias jet3745_check_action_event check_action_event
def check_action_event(*args, &block)
return false unless Input.jet5888_trigger?(:C)
jet3745_check_action_event(*args, &block)
end
alias jet3745_get_on_off_vehicle get_on_off_vehicle
def get_on_off_vehicle(*args, &block)
if !Input.jet5888_trigger?(:C)
[:boat, :ship, :airship].each {|a|
if $game_map.send(a).pos?(*Mouse.true_grid)
jet3745_get_on_off_vehicle(*args, &block)
return
end
}
elsif Input.jet5888_trigger?(:C)
jet3745_get_on_off_vehicle(*args, &block)
end
end
def get_on_vehicle_mouse(veh)
return if vehicle
@vehicle_type = veh.type
if vehicle
turn_toward_character(veh)
@vehicle_getting_on = true
force_move_forward unless in_airship?
@followers.gather
end
@vehicle_getting_on
end
end
class Window_MousePopUp < Window_Base
def initialize(event, text)
rect = Bitmap.new(1, 1).text_size(text)
width = rect.width
height = rect.height
super(event.screen_x - width / 2, event.screen_y - 48, width + 32, height + 32)
self.opacity = 0
self.contents.font.name = Jet::HoverText::FONT
self.contents.font.color = Jet::HoverText::COLOR
self.contents.font.size = Jet::HoverText::SIZE
@text = text
@event = event
refresh
end
def refresh
contents.clear
draw_text(0, 0, contents.width, contents.height, @text)
end
def update
super
self.visible = !@event.erased? && Mouse.true_grid == [@event.x, @event.y]
self.x = @event.screen_x - contents.width / 2 - 8
self.y = @event.screen_y - 64
end
end
class Game_Event
attr_accessor :text_box
def check_for_comment(regexp)
return false if empty?
for item in @list
if item.code == 108 or item.code == 408
if !item.parameters[0][regexp].nil?
return $1.nil? ? true : $1
end
end
end
return false
end
def mouse_empty?
return true if empty?
return @list.reject {|a| [108, 408].include?(a.code) }.size <= 1
end
alias jet3745_setup_page setup_page
def setup_page(*args, &block)
jet3745_setup_page(*args, &block)
@text_box = nil
@mouse_activated = nil
end
def mouse_activated?
@mouse_activated ||= check_for_comment(/MOUSE[ ]*CLICK/i)
end
def text_box
@text_box ||= (
if (a = check_for_comment(/MOUSE[ ]*TEXT[ ]*(.+)/i))
Window_MousePopUp.new(self, a)
else
false
end
)
end
def through
if $game_temp.mouse_movement && check_for_comment(/MOUSE[ ]*THROUGH/i)
true
else
super
end
end
def mouse_cursor
@mouse_cursor ||= (
if (a = check_for_comment(/MOUSE[ ]*PIC[ ]*(\d+)/i))
a.to_i
elsif (a = check_for_comment(/MOUSE[ ]*PIC[ ]*(.+)/i))
a
else
false
end
)
end
def erased?
@erased
end
def movable?
return false if moving?
return false if $game_message.busy? || $game_message.visible
return true
end
def check_mouse_change
if mouse_cursor
Mouse.set_cursor(@mouse_cursor)
return true
end
return false
end
alias jet3845_update update
def update(*args, &block)
jet3845_update(*args, &block)
@text_box.update if text_box
end
end
class Game_Vehicle
attr_reader :type
end
class Game_System
attr_accessor :mouse_movement
alias jet2735_initialize initialize
def initialize(*args, &block)
jet2735_initialize(*args, &block)
@mouse_movement = Jet::MouseSystem::ALLOW_MOUSE_MOVEMENT
end
end
class Game_Interpreter
def toggle_mouse_movement(bool)
$game_system.mouse_movement = bool
end
end
class Scene_Map
alias jet3745_update update
def update(*args, &block)
jet3745_update
check_mouse_movement if $game_system.mouse_movement
check_mouse_icon_change
end
alias jet5687_terminate terminate
def terminate(*args, &block)
$game_map.events.values.each {|a|
a.text_box.dispose if a.text_box
a.text_box = nil
}
Mouse.update
jet5687_terminate(*args, &block)
end
def mouse_char
$game_temp.mouse_character
end
def check_mouse_icon_change
changed_mouse = false
$game_map.events_xy(*Mouse.true_grid).each {|event|
changed_mouse = changed_mouse || event.check_mouse_change
}
Mouse.revert_cursor unless changed_mouse
end
def check_mouse_movement
$game_temp.mouse_character ||= $game_player
if Mouse.click?(1)
dont_move = false
x, y = *Mouse.true_grid
($game_map.events_xy(x, y) + $game_map.vehicles).each {|event|
if event.is_a?(Game_Vehicle)
if (event.x - mouse_char.x).abs + (event.y - mouse_char.y).abs == 1
if [event.x, event.y] == Mouse.true_grid
mouse_char.get_on_vehicle_mouse(event)
dont_move = true
end
end
elsif !!!mouse_char.vehicle
if event.mouse_activated?
event.start
dont_move = true
elsif (event.x - mouse_char.x).abs + (event.y - mouse_char.y).abs == 1
if event.is_a?(Game_Vehicle)
mouse_char.get_on_vehicle_mouse(event)
dont_move = true
else
if !event.mouse_empty? && [0, 1, 2].include?(event.trigger)
mouse_char.turn_toward_character(event)
event.start
dont_move = true
end
end
else
{UP: [0, -1], DOWN: [0, 1], LEFT: [-1, 0], RIGHT: [1, 0]}.each {|d, a|
if event.check_for_comment(/MOUSE[ ]*MOVE[ ]*#{d.to_s}/i)
x += a[0]; y += a[1]
end
}
end
end
}
mouse_char.mouse_path(x, y) unless dont_move
end
end
end
class Node
include Comparable
attr_accessor :point, :parent, :cost, :cost_estimated
def initialize(point)
@point = point
@cost = 0
@cost_estimated = 0
@on_path = false
@parent = nil
end
def mark_path
@on_path = true
@parent.mark_path if @parent
end
def total_cost
cost + cost_estimated
end
def <=>(other)
total_cost <=> other.total_cost
end
def ==(other)
point == other.point
end
end
class Point
attr_accessor :x, :y
def initialize(x, y)
@x, @y = x, y
end
def ==(other)
return false unless Point === other
@x == other.x && @y == other.y
end
def distance(other)
(@x - other.x).abs + (@y - other.y).abs
end
def relative(xr, yr)
Point.new(x + xr, y + yr)
end
end
class Game_Map
def each_neighbor(node, char = $game_player)
x = node.point.x
y = node.point.y
nodes = []
4.times {|i|
i += 1
new_x = round_x_with_direction(x, i * 2)
new_y = round_y_with_direction(y, i * 2)
next unless char.passable?(x, y, i * 2)
nodes.push(Node.new(Point.new(new_x, new_y)))
}
nodes
end
def find_path(tx, ty, sx, sy, char = $game_player)
start = Node.new(Point.new(sx, sy))
goal = Node.new(Point.new(tx, ty))
return [] if start == goal
return [] if ![2, 4, 6, 8].any? {|i| char.passable?(tx, ty, i) }
open_set = [start]
closed_set = []
path = []
iterations = 0
loop do
return [] if iterations == Jet::Pathfinder::MAXIMUM_ITERATIONS
iterations += 1
current = open_set.min
return [] unless current
each_neighbor(current, char).each {|node|
if node == goal
node.parent = current
node.mark_path
return recreate_path(node)
end
next if closed_set.include?(node)
cost = current.cost + 1
if open_set.include?(node)
if cost < node.cost
node.parent = current
node.cost = cost
end
else
open_set << node
node.parent = current
node.cost = cost
node.cost_estimated = node.point.distance(goal.point)
end
}
closed_set << open_set.delete(current)
end
end
def recreate_path(node)
path = []
hash = {[1, 0] => 6, [-1, 0] => 4, [0, 1] => 2, [0, -1] => 8}
until node.nil?
pos = node.point
node = node.parent
next if node.nil?
ar = [pos.x <=> node.point.x, pos.y <=> node.point.y]
path.push(RPG::MoveCommand.new(hash[ar] / 2))
end
return path
end
end
[title]
- Informações adicionais:
[/title]. Não funciona no XP e VX. Muito menos MV

. Possui baixo nível de compatibilidade se usado junto a scripts que interfiram nos mesmos scripts em que esse modificou.
[title]
- Créditos:
[/title]. Criado por: Jet
Permissões neste sub-fórum
Não podes responder a tópicos
|
|