mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-06 06:01:46 +00:00
@@ -1006,7 +1006,6 @@ class Interpreter
|
|||||||
# * Return to Title Screen
|
# * Return to Title Screen
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
def command_354
|
def command_354
|
||||||
resetPlayerPosition
|
|
||||||
$game_temp.to_title = true
|
$game_temp.to_title = true
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -45,7 +45,6 @@ class Spriteset_Map
|
|||||||
end
|
end
|
||||||
|
|
||||||
def initialize(map=nil)
|
def initialize(map=nil)
|
||||||
return if $scene.is_a?(Scene_Intro) || $scene.is_a?(Scene_DebugIntro)
|
|
||||||
@map = (map) ? map : $game_map
|
@map = (map) ? map : $game_map
|
||||||
$scene.map_renderer.add_tileset(@map.tileset_name)
|
$scene.map_renderer.add_tileset(@map.tileset_name)
|
||||||
@map.autotile_names.each { |filename| $scene.map_renderer.add_autotile(filename) }
|
@map.autotile_names.each { |filename| $scene.map_renderer.add_autotile(filename) }
|
||||||
|
|||||||
@@ -1,245 +1,225 @@
|
|||||||
# #===============================================================================
|
#===============================================================================
|
||||||
# # Klein Footprints / WolfPP for Pokémon Essentials
|
# Klein Footprints / WolfPP for Pokémon Essentials
|
||||||
# # Give credits if you're using this!
|
# Give credits if you're using this!
|
||||||
# # http://kleinstudio.deviantart.com
|
# http://kleinstudio.deviantart.com
|
||||||
# #
|
|
||||||
# # bo4p5687 update (v.19)
|
|
||||||
# #===============================================================================
|
|
||||||
#
|
#
|
||||||
# # Fix event comment
|
# bo4p5687 update (v.19)
|
||||||
# def pbEventCommentInput(*args)
|
#===============================================================================
|
||||||
# parameters = []
|
|
||||||
# list = *args[0].list # Event or event page
|
# Fix event comment
|
||||||
# elements = *args[1] # Number of elements
|
def pbEventCommentInput(*args)
|
||||||
# trigger = *args[2] # Trigger
|
parameters = []
|
||||||
# return nil if list == nil
|
list = *args[0].list # Event or event page
|
||||||
# return nil unless list.is_a?(Array)
|
elements = *args[1] # Number of elements
|
||||||
# for item in list
|
trigger = *args[2] # Trigger
|
||||||
# next unless item.code == 108 || item.code == 408
|
return nil if list == nil
|
||||||
# if item.parameters[0] == trigger[0]
|
return nil unless list.is_a?(Array)
|
||||||
# start = list.index(item) + 1
|
for item in list
|
||||||
# finish = start + elements[0]
|
next unless item.code == 108 || item.code == 408
|
||||||
# for id in start...finish
|
if item.parameters[0] == trigger[0]
|
||||||
# next if !list[id]
|
start = list.index(item) + 1
|
||||||
# parameters.push(list[id].parameters[0])
|
finish = start + elements[0]
|
||||||
# end
|
for id in start...finish
|
||||||
# return parameters
|
next if !list[id]
|
||||||
# end
|
parameters.push(list[id].parameters[0])
|
||||||
# end
|
end
|
||||||
# return nil
|
return parameters
|
||||||
# end
|
end
|
||||||
#
|
end
|
||||||
# module FootprintVariables
|
return nil
|
||||||
# # If you set pokemon here, they doesn't have footprints
|
end
|
||||||
# FOLLOWING_DONT_WALK = [
|
|
||||||
# # Example:
|
module FootprintVariables
|
||||||
# # 12,15,17
|
# If you set pokemon here, they doesn't have footprints
|
||||||
# ]
|
FOLLOWING_DONT_WALK = [
|
||||||
#
|
# Example:
|
||||||
# # Set here the terrain tag for footprints, 3 is sand
|
# 12,15,17
|
||||||
# TERRAIN_FOOT = 3
|
]
|
||||||
#
|
|
||||||
# # Initial opacity for footprints
|
# Set here the terrain tag for footprints, 3 is sand
|
||||||
# FOOT_OPACITY = 62
|
TERRAIN_FOOT = 3
|
||||||
#
|
|
||||||
# # Delay velocity
|
# Initial opacity for footprints
|
||||||
# FOOT_DELAY = 1.1
|
FOOT_OPACITY = 62
|
||||||
#
|
|
||||||
# def self.get_new_id
|
# Delay velocity
|
||||||
# newId = 1
|
FOOT_DELAY = 1.1
|
||||||
# while !$game_map.events[newId].nil? do
|
|
||||||
# break if $game_map.events[newId].erased
|
def self.get_new_id
|
||||||
# newId += 1
|
newId = 1
|
||||||
# end
|
while !$game_map.events[newId].nil? do
|
||||||
# return newId
|
break if $game_map.events[newId].erased
|
||||||
# end
|
newId += 1
|
||||||
#
|
end
|
||||||
# def self.show(event, position)
|
return newId
|
||||||
# if event != $game_player
|
end
|
||||||
# return if event.character_name == "" || event.character_name == "nil" || event.name.include?("/nofoot/")
|
|
||||||
# return if pbEventCommentInput(event, 0, "NoFoot")
|
def self.show(event, position)
|
||||||
# if $Trainer.party.length > 0
|
if event != $game_player
|
||||||
# return if (!($game_map.events[event] && $game_map.events[event].name == "Dependent") &&
|
return if event.character_name == "" || event.character_name == "nil" || event.name.include?("/nofoot/")
|
||||||
# (FOLLOWING_DONT_WALK.include?($Trainer.party[0].species) || $PokemonGlobal.bicycle))
|
return if pbEventCommentInput(event, 0, "NoFoot")
|
||||||
# end
|
if $Trainer.party.length > 0
|
||||||
# end
|
return if (!($game_map.events[event] && $game_map.events[event].name == "Dependent") &&
|
||||||
# character_sprites = $scene.spriteset.character_sprites
|
(FOLLOWING_DONT_WALK.include?($Trainer.party[0].species) || $PokemonGlobal.bicycle))
|
||||||
# viewport = $scene.spriteset.viewport1
|
end
|
||||||
# footsprites = $scene.spriteset.footsprites
|
end
|
||||||
# nid = self.get_new_id
|
character_sprites = $scene.spriteset.character_sprites
|
||||||
# rpgEvent = RPG::Event.new(position[0], position[1])
|
viewport = $scene.spriteset.viewport1
|
||||||
# rpgEvent.id = nid
|
footsprites = $scene.spriteset.footsprites
|
||||||
# fev = Game_Event.new($game_map.map_id, rpgEvent, $game_map)
|
nid = self.get_new_id
|
||||||
# eventsprite = Sprite_Character.new(viewport, fev)
|
rpgEvent = RPG::Event.new(position[0], position[1])
|
||||||
# character_sprites.push(eventsprite)
|
rpgEvent.id = nid
|
||||||
# footsprites.push(Footsprite.new(eventsprite, fev, viewport, $game_map, position[2], nid, character_sprites, (event == $game_player)))
|
fev = Game_Event.new($game_map.map_id, rpgEvent, $game_map)
|
||||||
# end
|
eventsprite = Sprite_Character.new(viewport, fev)
|
||||||
#
|
character_sprites.push(eventsprite)
|
||||||
# end
|
footsprites.push(Footsprite.new(eventsprite, fev, viewport, $game_map, position[2], nid, character_sprites, (event==$game_player)))
|
||||||
#
|
end
|
||||||
# class Game_Event < Game_Character
|
|
||||||
# attr_reader :erased
|
end
|
||||||
# end
|
|
||||||
#
|
class Game_Event < Game_Character
|
||||||
# class Sprite_Character
|
attr_reader :erased
|
||||||
# alias old_initialize_foot initialize
|
end
|
||||||
#
|
|
||||||
# def initialize(viewport, character = nil)
|
class Sprite_Character
|
||||||
# old_initialize_foot(viewport, character)
|
alias old_initialize_foot initialize
|
||||||
# @disposed = false
|
def initialize(viewport, character=nil)
|
||||||
# end
|
old_initialize_foot(viewport, character)
|
||||||
#
|
@disposed = false
|
||||||
# alias old_update_foot update
|
end
|
||||||
#
|
|
||||||
# def update
|
alias old_update_foot update
|
||||||
# return if @disposed
|
def update
|
||||||
# old_update_foot
|
return if @disposed
|
||||||
# end
|
old_update_foot
|
||||||
#
|
end
|
||||||
# alias old_dispose_foot dispose
|
|
||||||
#
|
alias old_dispose_foot dispose
|
||||||
# def dispose
|
def dispose
|
||||||
# old_dispose_foot
|
old_dispose_foot
|
||||||
# @disposed = true
|
@disposed = true
|
||||||
# end
|
end
|
||||||
# end
|
end
|
||||||
#
|
|
||||||
# class Spriteset_Map
|
class Spriteset_Map
|
||||||
# attr_accessor :character_sprites
|
attr_accessor :character_sprites
|
||||||
# attr_accessor :footsprites
|
attr_accessor :footsprites
|
||||||
#
|
|
||||||
# alias old_initialize initialize
|
alias old_initialize initialize
|
||||||
#
|
def initialize(map=nil)
|
||||||
# def initialize(map = nil)
|
old_initialize(map)
|
||||||
# begin
|
@footsprites = []
|
||||||
# old_initialize(map) if map != nil
|
end
|
||||||
# @footsprites = []
|
|
||||||
# rescue
|
def viewport1
|
||||||
# return
|
return @@viewport1
|
||||||
# end
|
end
|
||||||
# end
|
|
||||||
#
|
def putFootprint(event, pos)
|
||||||
# def viewport1
|
return FootprintVariables.show(event, pos)
|
||||||
# return @@viewport1
|
end
|
||||||
# end
|
|
||||||
#
|
alias old_dispose dispose
|
||||||
# def putFootprint(event, pos)
|
def dispose
|
||||||
# return FootprintVariables.show(event, pos)
|
old_dispose
|
||||||
# end
|
@footsprites.each { |sprite| sprite.dispose } if !@footsprites.nil?
|
||||||
#
|
@footsprites.clear
|
||||||
# alias old_dispose dispose
|
end
|
||||||
#
|
|
||||||
# def dispose
|
alias old_update update
|
||||||
# old_dispose
|
def update
|
||||||
# @footsprites.each { |sprite| sprite.dispose } if !@footsprites.nil?
|
old_update
|
||||||
# @footsprites.clear
|
return if @footsprites.nil?
|
||||||
# end
|
@footsprites.each { |sprite| sprite.update }
|
||||||
#
|
end
|
||||||
# alias old_update update
|
end
|
||||||
#
|
|
||||||
# def update
|
class Scene_Map
|
||||||
# old_update
|
def spriteset?
|
||||||
# return if @footsprites.nil?
|
return !@spritesets.nil?
|
||||||
# @footsprites.each { |sprite| sprite.update }
|
end
|
||||||
# end
|
end
|
||||||
# end
|
|
||||||
#
|
class Game_Character
|
||||||
# class Scene_Map
|
|
||||||
# def spriteset?
|
def get_last_pos
|
||||||
# return !@spritesets.nil?
|
case direction
|
||||||
# end
|
when 2 then return [@x, @y-1, direction] # Move down
|
||||||
# end
|
when 4 then return [@x+1, @y, direction] # Move left
|
||||||
#
|
when 6 then return [@x-1, @y, direction] # Move right
|
||||||
# class Game_Character
|
when 8 then return [@x, @y+1, direction] # Move up
|
||||||
#
|
end
|
||||||
# def get_last_pos
|
return false
|
||||||
# case direction
|
end
|
||||||
# when 2 then
|
|
||||||
# return [@x, @y - 1, direction] # Move down
|
def foot_prints?
|
||||||
# when 4 then
|
return $game_map.terrain_tag(get_last_pos[0], get_last_pos[1]) == FootprintVariables::TERRAIN_FOOT && $scene.is_a?(Scene_Map) && $scene.spriteset?
|
||||||
# return [@x + 1, @y, direction] # Move left
|
end
|
||||||
# when 6 then
|
|
||||||
# return [@x - 1, @y, direction] # Move right
|
alias leave_tile_footprints triggerLeaveTile
|
||||||
# when 8 then
|
def triggerLeaveTile
|
||||||
# return [@x, @y + 1, direction] # Move up
|
leave_tile_footprints
|
||||||
# end
|
$scene.spriteset.putFootprint(self, get_last_pos) if foot_prints?
|
||||||
# return false
|
end
|
||||||
# end
|
|
||||||
#
|
end
|
||||||
# def foot_prints?
|
|
||||||
# return $game_map.terrain_tag(get_last_pos[0], get_last_pos[1]) == FootprintVariables::TERRAIN_FOOT && $scene.is_a?(Scene_Map) && $scene.spriteset?
|
class Footsprite
|
||||||
# end
|
def initialize(sprite,event,viewport,map,direction,nid,chardata,player)
|
||||||
#
|
@rsprite = sprite
|
||||||
# alias leave_tile_footprints triggerLeaveTile
|
# Sprite
|
||||||
#
|
@sprite = Sprite.new(viewport)
|
||||||
# def triggerLeaveTile
|
file = player && $PokemonGlobal.bicycle ? "footsetbike.png" : "footset.png"
|
||||||
# leave_tile_footprints
|
@sprite.bitmap = RPG::Cache.load_bitmap("Graphics/Pictures/", file)
|
||||||
# $scene.spriteset.putFootprint(self, get_last_pos) if foot_prints?
|
# Set position
|
||||||
# end
|
@realwidth = @sprite.bitmap.width/4
|
||||||
#
|
@sprite.src_rect.width = @realwidth
|
||||||
# end
|
@opacity = FootprintVariables::FOOT_OPACITY
|
||||||
#
|
setFootset(direction)
|
||||||
# class Footsprite
|
# Values
|
||||||
# def initialize(sprite, event, viewport, map, direction, nid, chardata, player)
|
@map = map
|
||||||
# return if $scene.is_a?(PokemonLoad_Scene) || $scene.is_a?(PokemonLoadScreen)
|
@event = event
|
||||||
# @rsprite = sprite
|
@disposed = false
|
||||||
# # Sprite
|
@eventid = nid
|
||||||
# @sprite = Sprite.new(viewport)
|
@viewport = viewport
|
||||||
# file = player && $PokemonGlobal.bicycle ? "footsetbike.png" : "footset.png"
|
@chardata = chardata
|
||||||
# @sprite.bitmap = RPG::Cache.load_bitmap("Graphics/Pictures/", file)
|
update
|
||||||
# # Set position
|
end
|
||||||
# @realwidth = @sprite.bitmap.width / 4
|
|
||||||
# @sprite.src_rect.width = @realwidth
|
def setFootset(direction)
|
||||||
# @opacity = FootprintVariables::FOOT_OPACITY
|
@sprite.src_rect.x =
|
||||||
# setFootset(direction)
|
case direction
|
||||||
# # Values
|
when 2 then 0 # Move down
|
||||||
# @map = map
|
when 4 then @realwidth * 3 # Move left
|
||||||
# @event = event
|
when 6 then @realwidth * 2 # Move right
|
||||||
# @disposed = false
|
when 8 then @realwidth # Move up
|
||||||
# @eventid = nid
|
end
|
||||||
# @viewport = viewport
|
@sprite.opacity = @opacity
|
||||||
# @chardata = chardata
|
end
|
||||||
# update
|
|
||||||
# end
|
def dispose
|
||||||
#
|
return if @disposed
|
||||||
# def setFootset(direction)
|
@disposed = true
|
||||||
# @sprite.src_rect.x =
|
@event.erase
|
||||||
# case direction
|
(0...@chardata.length).each { |i| @chardata.delete_at(i) if @chardata[i] == @rsprite }
|
||||||
# when 2 then
|
@rsprite.dispose
|
||||||
# 0 # Move down
|
@sprite.dispose
|
||||||
# when 4 then
|
@sprite = nil
|
||||||
# @realwidth * 3 # Move left
|
end
|
||||||
# when 6 then
|
|
||||||
# @realwidth * 2 # Move right
|
def update
|
||||||
# when 8 then
|
return if @disposed
|
||||||
# @realwidth # Move up
|
x = @rsprite.x - @rsprite.ox
|
||||||
# end
|
y = @rsprite.y - @rsprite.oy
|
||||||
# @sprite.opacity = @opacity
|
width = @rsprite.src_rect.width
|
||||||
# end
|
height = @rsprite.src_rect.height
|
||||||
#
|
@sprite.x = x + width / 2
|
||||||
# def dispose
|
@sprite.y = y + height
|
||||||
# return if @disposed
|
@sprite.ox = @realwidth / 2
|
||||||
# @disposed = true
|
@sprite.oy = @sprite.bitmap.height
|
||||||
# @event.erase
|
@sprite.z = @rsprite.z - 2
|
||||||
# (0...@chardata.length).each { |i| @chardata.delete_at(i) if @chardata[i] == @rsprite }
|
@opacity -= FootprintVariables::FOOT_DELAY
|
||||||
# @rsprite.dispose
|
@sprite.opacity = @opacity
|
||||||
# @sprite.dispose
|
dispose if @sprite.opacity <= 0
|
||||||
# @sprite = nil
|
end
|
||||||
# end
|
end
|
||||||
#
|
|
||||||
# def update
|
|
||||||
# return if @disposed
|
|
||||||
# x = @rsprite.x - @rsprite.ox
|
|
||||||
# y = @rsprite.y - @rsprite.oy
|
|
||||||
# width = @rsprite.src_rect.width
|
|
||||||
# height = @rsprite.src_rect.height
|
|
||||||
# @sprite.x = x + width / 2
|
|
||||||
# @sprite.y = y + height
|
|
||||||
# @sprite.ox = @realwidth / 2
|
|
||||||
# @sprite.oy = @sprite.bitmap.height
|
|
||||||
# @sprite.z = @rsprite.z - 2
|
|
||||||
# @opacity -= FootprintVariables::FOOT_DELAY
|
|
||||||
# @sprite.opacity = @opacity
|
|
||||||
# dispose if @sprite.opacity <= 0
|
|
||||||
# end
|
|
||||||
# end
|
|
||||||
@@ -1,278 +1,278 @@
|
|||||||
# # #===============================================================================
|
# #===============================================================================
|
||||||
# # # * Unreal Time System - by FL (Credits will be apreciated)
|
# # * Unreal Time System - by FL (Credits will be apreciated)
|
||||||
# # #===============================================================================
|
# #===============================================================================
|
||||||
# # #
|
|
||||||
# # # This script is for Pokémon Essentials. It makes the time in game uses its
|
|
||||||
# # # own clock that only pass when you are in game instead of using real time
|
|
||||||
# # # (like Minecraft and Zelda: Ocarina of Time).
|
|
||||||
# # #
|
|
||||||
# # #== INSTALLATION ===============================================================
|
|
||||||
# # #
|
|
||||||
# # # To this script works, put it above main OR convert into a plugin.
|
|
||||||
# # #
|
|
||||||
# # #== HOW TO USE =================================================================
|
|
||||||
# # #
|
|
||||||
# # # This script automatic works after installed.
|
|
||||||
# # #
|
|
||||||
# # # If you wish to add/reduce time, there are 3 ways:
|
|
||||||
# # #
|
|
||||||
# # # 1. EXTRA_SECONDS/EXTRA_DAYS are variables numbers that hold time passage;
|
|
||||||
# # # The time in these variable isn't affected by PROPORTION.
|
|
||||||
# # # Example: When the player sleeps you wish to the time in game advance
|
|
||||||
# # # 8 hours, so put in EXTRA_SECONDS a game variable number and sum
|
|
||||||
# # # 28800 (60*60*8) in this variable every time that the players sleeps.
|
|
||||||
# # #
|
|
||||||
# # # 2. 'UnrealTime.add_seconds(seconds)' and 'UnrealTime.add_days(days)' does the
|
|
||||||
# # # same thing, in fact, EXTRA_SECONDS/EXTRA_DAYS call these methods.
|
|
||||||
# # #
|
|
||||||
# # # 3. 'UnrealTime.advance_to(16,17,18)' advance the time to a fixed time of day,
|
|
||||||
# # # 16:17:18 on this example.
|
|
||||||
# # #
|
|
||||||
# # #== NOTES ======================================================================
|
|
||||||
# # #
|
|
||||||
# # # If you wish to some parts still use real time like the Trainer Card start time
|
|
||||||
# # # and Pokémon Trainer Memo, just change 'pbGetTimeNow' to 'Time.now' in their
|
|
||||||
# # # scripts.
|
|
||||||
# # #
|
|
||||||
# # # This script uses the Ruby Time class. Before Essentials version 19 (who came
|
|
||||||
# # # with 64-bit ruby) it can only have 1901-2038 range.
|
|
||||||
# # #
|
|
||||||
# # # Some time methods:
|
|
||||||
# # # 'pbGetTimeNow.year', 'pbGetTimeNow.mon' (the numbers from 1-12),
|
|
||||||
# # # 'pbGetTimeNow.day','pbGetTimeNow.hour', 'pbGetTimeNow.min',
|
|
||||||
# # # 'pbGetTimeNow.sec', 'pbGetAbbrevMonthName(pbGetTimeNow.mon)',
|
|
||||||
# # # 'pbGetTimeNow.strftime("%A")' (displays weekday name),
|
|
||||||
# # # 'pbGetTimeNow.strftime("%I:%M %p")' (displays Hours:Minutes pm/am)
|
|
||||||
# # #
|
|
||||||
# # #===============================================================================
|
|
||||||
# #
|
# #
|
||||||
# # if defined?(PluginManager) && !PluginManager.installed?("Unreal Time System")
|
# # This script is for Pokémon Essentials. It makes the time in game uses its
|
||||||
# # PluginManager.register({
|
# # own clock that only pass when you are in game instead of using real time
|
||||||
# # :name => "Unreal Time System",
|
# # (like Minecraft and Zelda: Ocarina of Time).
|
||||||
# # :version => "1.1",
|
|
||||||
# # :link => "https://www.pokecommunity.com/showthread.php?t=285831",
|
|
||||||
# # :credits => "FL"
|
|
||||||
# # })
|
|
||||||
# # end
|
|
||||||
# #
|
# #
|
||||||
# module UnrealTime
|
# #== INSTALLATION ===============================================================
|
||||||
# # Set false to disable this system (returns Time.now)
|
# #
|
||||||
# ENABLED=true
|
# # To this script works, put it above main OR convert into a plugin.
|
||||||
|
# #
|
||||||
|
# #== HOW TO USE =================================================================
|
||||||
|
# #
|
||||||
|
# # This script automatic works after installed.
|
||||||
|
# #
|
||||||
|
# # If you wish to add/reduce time, there are 3 ways:
|
||||||
|
# #
|
||||||
|
# # 1. EXTRA_SECONDS/EXTRA_DAYS are variables numbers that hold time passage;
|
||||||
|
# # The time in these variable isn't affected by PROPORTION.
|
||||||
|
# # Example: When the player sleeps you wish to the time in game advance
|
||||||
|
# # 8 hours, so put in EXTRA_SECONDS a game variable number and sum
|
||||||
|
# # 28800 (60*60*8) in this variable every time that the players sleeps.
|
||||||
|
# #
|
||||||
|
# # 2. 'UnrealTime.add_seconds(seconds)' and 'UnrealTime.add_days(days)' does the
|
||||||
|
# # same thing, in fact, EXTRA_SECONDS/EXTRA_DAYS call these methods.
|
||||||
|
# #
|
||||||
|
# # 3. 'UnrealTime.advance_to(16,17,18)' advance the time to a fixed time of day,
|
||||||
|
# # 16:17:18 on this example.
|
||||||
|
# #
|
||||||
|
# #== NOTES ======================================================================
|
||||||
|
# #
|
||||||
|
# # If you wish to some parts still use real time like the Trainer Card start time
|
||||||
|
# # and Pokémon Trainer Memo, just change 'pbGetTimeNow' to 'Time.now' in their
|
||||||
|
# # scripts.
|
||||||
|
# #
|
||||||
|
# # This script uses the Ruby Time class. Before Essentials version 19 (who came
|
||||||
|
# # with 64-bit ruby) it can only have 1901-2038 range.
|
||||||
|
# #
|
||||||
|
# # Some time methods:
|
||||||
|
# # 'pbGetTimeNow.year', 'pbGetTimeNow.mon' (the numbers from 1-12),
|
||||||
|
# # 'pbGetTimeNow.day','pbGetTimeNow.hour', 'pbGetTimeNow.min',
|
||||||
|
# # 'pbGetTimeNow.sec', 'pbGetAbbrevMonthName(pbGetTimeNow.mon)',
|
||||||
|
# # 'pbGetTimeNow.strftime("%A")' (displays weekday name),
|
||||||
|
# # 'pbGetTimeNow.strftime("%I:%M %p")' (displays Hours:Minutes pm/am)
|
||||||
|
# #
|
||||||
|
# #===============================================================================
|
||||||
#
|
#
|
||||||
# # Time proportion here.
|
# if defined?(PluginManager) && !PluginManager.installed?("Unreal Time System")
|
||||||
# # So if it is 100, one second in real time will be 100 seconds in game.
|
# PluginManager.register({
|
||||||
# # If it is 60, one second in real time will be one minute in game.
|
# :name => "Unreal Time System",
|
||||||
# PROPORTION=60
|
# :version => "1.1",
|
||||||
#
|
# :link => "https://www.pokecommunity.com/showthread.php?t=285831",
|
||||||
# # Starting on Essentials v17, the map tone only try to refresh tone each 30
|
# :credits => "FL"
|
||||||
# # real time seconds.
|
# })
|
||||||
# # If this variable number isn't -1, the game use this number instead of 30.
|
|
||||||
# # When time is changed with advance_to or add_seconds, the tone refreshes.
|
|
||||||
# TONE_CHECK_INTERVAL = 10.0
|
|
||||||
#
|
|
||||||
# # Make this true to time only pass at field (Scene_Map)
|
|
||||||
# # A note to scripters: To make time pass on other scenes, put line
|
|
||||||
# # '$PokemonGlobal.addNewFrameCount' near to line 'Graphics.update'
|
|
||||||
# TIME_STOPS=true
|
|
||||||
#
|
|
||||||
# # Make this true to time pass in battle, during turns and command selection.
|
|
||||||
# # This won't affect the Pokémon and Bag submenus.
|
|
||||||
# # Only works if TIME_STOPS=true.
|
|
||||||
# BATTLE_PASS=true
|
|
||||||
#
|
|
||||||
# # Make this true to time pass when the Dialog box or the main menu are open.
|
|
||||||
# # This won't affect the submenus like Pokémon and Bag.
|
|
||||||
# # Only works if TIME_STOPS=true.
|
|
||||||
# TALK_PASS=true
|
|
||||||
#
|
|
||||||
# # Choose switch number that when true the time won't pass (or -1 to cancel).
|
|
||||||
# # Only works if TIME_STOPS=true.
|
|
||||||
# SWITCH_STOPS=-1
|
|
||||||
#
|
|
||||||
# # Choose variable(s) number(s) that can hold time passage (or -1 to cancel).
|
|
||||||
# # Look at description for more details.
|
|
||||||
# EXTRA_SECONDS=79
|
|
||||||
# EXTRA_DAYS=-1
|
|
||||||
#
|
|
||||||
# # Initial date. In sequence: Year, month, day, hour and minutes.
|
|
||||||
# # Method UnrealTime.reset resets time back to this time.
|
|
||||||
# def self.initial_date
|
|
||||||
# return Time.local(2000,1,1, 12,0)
|
|
||||||
# end
|
|
||||||
#
|
|
||||||
# # Advance to next time. If time already passed, advance
|
|
||||||
# # into the time on the next day.
|
|
||||||
# # Hour is 0..23
|
|
||||||
# def self.advance_to(hour,min=0,sec=0)
|
|
||||||
# if hour < 0 || hour > 23
|
|
||||||
# raise RangeError, "hour is #{hour}, should be 0..23"
|
|
||||||
# end
|
|
||||||
# day_seconds = 60*60*24
|
|
||||||
# seconds_now = pbGetTimeNow.hour*60*60+pbGetTimeNow.min*60+pbGetTimeNow.sec
|
|
||||||
# target_seconds = hour*60*60+min*60+sec
|
|
||||||
# seconds_added = target_seconds-seconds_now
|
|
||||||
# seconds_added += day_seconds if seconds_added<0
|
|
||||||
# $PokemonGlobal.newFrameCount+=seconds_added
|
|
||||||
# PBDayNight.sheduleToneRefresh
|
|
||||||
# end
|
|
||||||
#
|
|
||||||
# # Resets time to initial_date.
|
|
||||||
# def self.reset
|
|
||||||
# raise "Method doesn't work when TIME_STOPS is false!" if !TIME_STOPS
|
|
||||||
# $game_variables[EXTRA_SECONDS]=0 if EXTRA_DAYS>0
|
|
||||||
# $game_variables[EXTRA_DAYS]=0 if EXTRA_DAYS>0
|
|
||||||
# $PokemonGlobal.newFrameCount=0
|
|
||||||
# $PokemonGlobal.extraYears=0
|
|
||||||
# PBDayNight.sheduleToneRefresh
|
|
||||||
# end
|
|
||||||
#
|
|
||||||
# # Does the same thing as EXTRA_SECONDS variable.
|
|
||||||
# def self.add_seconds(seconds)
|
|
||||||
# raise "Method doesn't work when TIME_STOPS is false!" if !TIME_STOPS
|
|
||||||
# $PokemonGlobal.newFrameCount+=(seconds*Graphics.frame_rate)/PROPORTION.to_f
|
|
||||||
# PBDayNight.sheduleToneRefresh
|
|
||||||
# end
|
|
||||||
#
|
|
||||||
# def self.add_days(days)
|
|
||||||
# add_seconds(60*60*24*days)
|
|
||||||
# end
|
|
||||||
#
|
|
||||||
# NEED_32_BIT_FIX = [''].pack('p').size <= 4
|
|
||||||
# end
|
# end
|
||||||
#
|
#
|
||||||
# # Essentials V18 and lower compatibility
|
module UnrealTime
|
||||||
# module Settings
|
# Set false to disable this system (returns Time.now)
|
||||||
# TIME_SHADING = defined?(ENABLESHADING) ? ENABLESHADING : ::TIME_SHADING
|
ENABLED=true
|
||||||
# end if defined?(TIME_SHADING) || defined?(ENABLESHADING)
|
|
||||||
#
|
# Time proportion here.
|
||||||
# module PBDayNight
|
# So if it is 100, one second in real time will be 100 seconds in game.
|
||||||
# class << self
|
# If it is 60, one second in real time will be one minute in game.
|
||||||
# if method_defined?(:getTone) && UnrealTime::TONE_CHECK_INTERVAL > 0
|
PROPORTION=60
|
||||||
# def getTone
|
|
||||||
# @cachedTone = Tone.new(0,0,0) if !@cachedTone
|
# Starting on Essentials v17, the map tone only try to refresh tone each 30
|
||||||
# return @cachedTone if !Settings::TIME_SHADING
|
# real time seconds.
|
||||||
# toneNeedUpdate = (!@dayNightToneLastUpdate ||
|
# If this variable number isn't -1, the game use this number instead of 30.
|
||||||
# Graphics.frame_count-@dayNightToneLastUpdate >=
|
# When time is changed with advance_to or add_seconds, the tone refreshes.
|
||||||
# Graphics.frame_rate*UnrealTime::TONE_CHECK_INTERVAL
|
TONE_CHECK_INTERVAL = 10.0
|
||||||
# )
|
|
||||||
# if toneNeedUpdate
|
# Make this true to time only pass at field (Scene_Map)
|
||||||
# getToneInternal
|
# A note to scripters: To make time pass on other scenes, put line
|
||||||
# @dayNightToneLastUpdate = Graphics.frame_count
|
# '$PokemonGlobal.addNewFrameCount' near to line 'Graphics.update'
|
||||||
# end
|
TIME_STOPS=true
|
||||||
# return @cachedTone
|
|
||||||
# end
|
# Make this true to time pass in battle, during turns and command selection.
|
||||||
# end
|
# This won't affect the Pokémon and Bag submenus.
|
||||||
#
|
# Only works if TIME_STOPS=true.
|
||||||
# # Shedule a tone refresh on the next try (probably next frame)
|
BATTLE_PASS=true
|
||||||
# def sheduleToneRefresh
|
|
||||||
# @dayNightToneLastUpdate = nil
|
# Make this true to time pass when the Dialog box or the main menu are open.
|
||||||
# end
|
# This won't affect the submenus like Pokémon and Bag.
|
||||||
# end
|
# Only works if TIME_STOPS=true.
|
||||||
# end
|
TALK_PASS=true
|
||||||
#
|
|
||||||
# def pbGetTimeNow
|
# Choose switch number that when true the time won't pass (or -1 to cancel).
|
||||||
# return Time.now if !$PokemonGlobal || !UnrealTime::ENABLED
|
# Only works if TIME_STOPS=true.
|
||||||
# day_seconds = 60*60*24
|
SWITCH_STOPS=-1
|
||||||
# if UnrealTime::TIME_STOPS
|
|
||||||
# # Sum the extra values to newFrameCount
|
# Choose variable(s) number(s) that can hold time passage (or -1 to cancel).
|
||||||
# if UnrealTime::EXTRA_SECONDS>0
|
# Look at description for more details.
|
||||||
# UnrealTime.add_seconds(pbGet(UnrealTime::EXTRA_SECONDS))
|
EXTRA_SECONDS=79
|
||||||
# $game_variables[UnrealTime::EXTRA_SECONDS]=0
|
EXTRA_DAYS=-1
|
||||||
# end
|
|
||||||
# if UnrealTime::EXTRA_DAYS>0
|
# Initial date. In sequence: Year, month, day, hour and minutes.
|
||||||
# UnrealTime.add_seconds(day_seconds*pbGet(UnrealTime::EXTRA_DAYS))
|
# Method UnrealTime.reset resets time back to this time.
|
||||||
# $game_variables[UnrealTime::EXTRA_DAYS]=0
|
def self.initial_date
|
||||||
# end
|
return Time.local(2000,1,1, 12,0)
|
||||||
# elsif UnrealTime::EXTRA_SECONDS>0 && UnrealTime::EXTRA_DAYS>0
|
end
|
||||||
# # Checks to regulate the max/min values at UnrealTime::EXTRA_SECONDS
|
|
||||||
# while pbGet(UnrealTime::EXTRA_SECONDS)>=day_seconds
|
# Advance to next time. If time already passed, advance
|
||||||
# $game_variables[UnrealTime::EXTRA_SECONDS]-=day_seconds
|
# into the time on the next day.
|
||||||
# $game_variables[UnrealTime::EXTRA_DAYS]+=1
|
# Hour is 0..23
|
||||||
# end
|
def self.advance_to(hour,min=0,sec=0)
|
||||||
# while pbGet(UnrealTime::EXTRA_SECONDS)<=-day_seconds
|
if hour < 0 || hour > 23
|
||||||
# $game_variables[UnrealTime::EXTRA_SECONDS]+=day_seconds
|
raise RangeError, "hour is #{hour}, should be 0..23"
|
||||||
# $game_variables[UnrealTime::EXTRA_DAYS]-=1
|
end
|
||||||
# end
|
day_seconds = 60*60*24
|
||||||
# end
|
seconds_now = pbGetTimeNow.hour*60*60+pbGetTimeNow.min*60+pbGetTimeNow.sec
|
||||||
# start_time=UnrealTime.initial_date
|
target_seconds = hour*60*60+min*60+sec
|
||||||
# if UnrealTime::TIME_STOPS
|
seconds_added = target_seconds-seconds_now
|
||||||
# time_played=$PokemonGlobal.newFrameCount
|
seconds_added += day_seconds if seconds_added<0
|
||||||
# else
|
$PokemonGlobal.newFrameCount+=seconds_added
|
||||||
# time_played=Graphics.frame_count
|
PBDayNight.sheduleToneRefresh
|
||||||
# end
|
end
|
||||||
# time_played=(time_played*UnrealTime::PROPORTION)/Graphics.frame_rate
|
|
||||||
# time_jumped=0
|
# Resets time to initial_date.
|
||||||
# if UnrealTime::EXTRA_SECONDS>-1
|
def self.reset
|
||||||
# time_jumped+=pbGet(UnrealTime::EXTRA_SECONDS)
|
raise "Method doesn't work when TIME_STOPS is false!" if !TIME_STOPS
|
||||||
# end
|
$game_variables[EXTRA_SECONDS]=0 if EXTRA_DAYS>0
|
||||||
# if UnrealTime::EXTRA_DAYS>-1
|
$game_variables[EXTRA_DAYS]=0 if EXTRA_DAYS>0
|
||||||
# time_jumped+=pbGet(UnrealTime::EXTRA_DAYS)*day_seconds
|
$PokemonGlobal.newFrameCount=0
|
||||||
# end
|
$PokemonGlobal.extraYears=0
|
||||||
# time_ret = 0
|
PBDayNight.sheduleToneRefresh
|
||||||
# # Before Essentials V19, there is a year limit. To prevent crashes due to this
|
end
|
||||||
# # limit, every time that you reach in year 2036 the system will subtract 6
|
|
||||||
# # years (to works with leap year) from your date and sum in
|
# Does the same thing as EXTRA_SECONDS variable.
|
||||||
# # $PokemonGlobal.extraYears. You can sum your actual year with this extraYears
|
def self.add_seconds(seconds)
|
||||||
# # when displaying years.
|
raise "Method doesn't work when TIME_STOPS is false!" if !TIME_STOPS
|
||||||
# loop do
|
$PokemonGlobal.newFrameCount+=(seconds*Graphics.frame_rate)/PROPORTION.to_f
|
||||||
# time_fix=0
|
PBDayNight.sheduleToneRefresh
|
||||||
# if $PokemonGlobal.extraYears!=0
|
end
|
||||||
# time_fix = $PokemonGlobal.extraYears*day_seconds*(365*6+1)/6
|
|
||||||
# end
|
def self.add_days(days)
|
||||||
# time_ret=start_time+(time_played+time_jumped-time_fix)
|
add_seconds(60*60*24*days)
|
||||||
# break if !UnrealTime::NEED_32_BIT_FIX || time_ret.year<2036
|
end
|
||||||
# $PokemonGlobal.extraYears+=6
|
|
||||||
# end
|
NEED_32_BIT_FIX = [''].pack('p').size <= 4
|
||||||
# return time_ret
|
end
|
||||||
# end
|
|
||||||
#
|
# Essentials V18 and lower compatibility
|
||||||
# if UnrealTime::ENABLED
|
module Settings
|
||||||
# class PokemonGlobalMetadata
|
TIME_SHADING = defined?(ENABLESHADING) ? ENABLESHADING : ::TIME_SHADING
|
||||||
# attr_accessor :newFrameCount # Became float when using extra values
|
end if defined?(TIME_SHADING) || defined?(ENABLESHADING)
|
||||||
# attr_accessor :extraYears
|
|
||||||
#
|
module PBDayNight
|
||||||
# def addNewFrameCount
|
class << self
|
||||||
# return if (UnrealTime::SWITCH_STOPS>0 &&
|
if method_defined?(:getTone) && UnrealTime::TONE_CHECK_INTERVAL > 0
|
||||||
# $game_switches[UnrealTime::SWITCH_STOPS])
|
def getTone
|
||||||
# self.newFrameCount+=1
|
@cachedTone = Tone.new(0,0,0) if !@cachedTone
|
||||||
# end
|
return @cachedTone if !Settings::TIME_SHADING
|
||||||
#
|
toneNeedUpdate = (!@dayNightToneLastUpdate ||
|
||||||
# def newFrameCount
|
Graphics.frame_count-@dayNightToneLastUpdate >=
|
||||||
# @newFrameCount=0 if !@newFrameCount
|
Graphics.frame_rate*UnrealTime::TONE_CHECK_INTERVAL
|
||||||
# return @newFrameCount
|
)
|
||||||
# end
|
if toneNeedUpdate
|
||||||
#
|
getToneInternal
|
||||||
# def extraYears
|
@dayNightToneLastUpdate = Graphics.frame_count
|
||||||
# @extraYears=0 if !@extraYears
|
end
|
||||||
# return @extraYears
|
return @cachedTone
|
||||||
# end
|
end
|
||||||
# end
|
end
|
||||||
#
|
|
||||||
# if UnrealTime::TIME_STOPS
|
# Shedule a tone refresh on the next try (probably next frame)
|
||||||
# class Scene_Map
|
def sheduleToneRefresh
|
||||||
# alias :updateold :update
|
@dayNightToneLastUpdate = nil
|
||||||
# def update
|
end
|
||||||
# $PokemonGlobal.addNewFrameCount
|
end
|
||||||
# updateold
|
end
|
||||||
# end
|
|
||||||
#
|
def pbGetTimeNow
|
||||||
# if UnrealTime::TALK_PASS
|
return Time.now if !$PokemonGlobal || !UnrealTime::ENABLED
|
||||||
# alias :miniupdateold :miniupdate
|
day_seconds = 60*60*24
|
||||||
# def miniupdate
|
if UnrealTime::TIME_STOPS
|
||||||
# $PokemonGlobal.addNewFrameCount
|
# Sum the extra values to newFrameCount
|
||||||
# miniupdateold
|
if UnrealTime::EXTRA_SECONDS>0
|
||||||
# end
|
UnrealTime.add_seconds(pbGet(UnrealTime::EXTRA_SECONDS))
|
||||||
# end
|
$game_variables[UnrealTime::EXTRA_SECONDS]=0
|
||||||
# end
|
end
|
||||||
#
|
if UnrealTime::EXTRA_DAYS>0
|
||||||
# if UnrealTime::BATTLE_PASS
|
UnrealTime.add_seconds(day_seconds*pbGet(UnrealTime::EXTRA_DAYS))
|
||||||
# class PokeBattle_Scene
|
$game_variables[UnrealTime::EXTRA_DAYS]=0
|
||||||
# alias :pbGraphicsUpdateold :pbGraphicsUpdate
|
end
|
||||||
# def pbGraphicsUpdate
|
elsif UnrealTime::EXTRA_SECONDS>0 && UnrealTime::EXTRA_DAYS>0
|
||||||
# $PokemonGlobal.addNewFrameCount
|
# Checks to regulate the max/min values at UnrealTime::EXTRA_SECONDS
|
||||||
# pbGraphicsUpdateold
|
while pbGet(UnrealTime::EXTRA_SECONDS)>=day_seconds
|
||||||
# end
|
$game_variables[UnrealTime::EXTRA_SECONDS]-=day_seconds
|
||||||
# end
|
$game_variables[UnrealTime::EXTRA_DAYS]+=1
|
||||||
# end
|
end
|
||||||
# end
|
while pbGet(UnrealTime::EXTRA_SECONDS)<=-day_seconds
|
||||||
# end
|
$game_variables[UnrealTime::EXTRA_SECONDS]+=day_seconds
|
||||||
|
$game_variables[UnrealTime::EXTRA_DAYS]-=1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
start_time=UnrealTime.initial_date
|
||||||
|
if UnrealTime::TIME_STOPS
|
||||||
|
time_played=$PokemonGlobal.newFrameCount
|
||||||
|
else
|
||||||
|
time_played=Graphics.frame_count
|
||||||
|
end
|
||||||
|
time_played=(time_played*UnrealTime::PROPORTION)/Graphics.frame_rate
|
||||||
|
time_jumped=0
|
||||||
|
if UnrealTime::EXTRA_SECONDS>-1
|
||||||
|
time_jumped+=pbGet(UnrealTime::EXTRA_SECONDS)
|
||||||
|
end
|
||||||
|
if UnrealTime::EXTRA_DAYS>-1
|
||||||
|
time_jumped+=pbGet(UnrealTime::EXTRA_DAYS)*day_seconds
|
||||||
|
end
|
||||||
|
time_ret = 0
|
||||||
|
# Before Essentials V19, there is a year limit. To prevent crashes due to this
|
||||||
|
# limit, every time that you reach in year 2036 the system will subtract 6
|
||||||
|
# years (to works with leap year) from your date and sum in
|
||||||
|
# $PokemonGlobal.extraYears. You can sum your actual year with this extraYears
|
||||||
|
# when displaying years.
|
||||||
|
loop do
|
||||||
|
time_fix=0
|
||||||
|
if $PokemonGlobal.extraYears!=0
|
||||||
|
time_fix = $PokemonGlobal.extraYears*day_seconds*(365*6+1)/6
|
||||||
|
end
|
||||||
|
time_ret=start_time+(time_played+time_jumped-time_fix)
|
||||||
|
break if !UnrealTime::NEED_32_BIT_FIX || time_ret.year<2036
|
||||||
|
$PokemonGlobal.extraYears+=6
|
||||||
|
end
|
||||||
|
return time_ret
|
||||||
|
end
|
||||||
|
|
||||||
|
if UnrealTime::ENABLED
|
||||||
|
class PokemonGlobalMetadata
|
||||||
|
attr_accessor :newFrameCount # Became float when using extra values
|
||||||
|
attr_accessor :extraYears
|
||||||
|
|
||||||
|
def addNewFrameCount
|
||||||
|
return if (UnrealTime::SWITCH_STOPS>0 &&
|
||||||
|
$game_switches[UnrealTime::SWITCH_STOPS])
|
||||||
|
self.newFrameCount+=1
|
||||||
|
end
|
||||||
|
|
||||||
|
def newFrameCount
|
||||||
|
@newFrameCount=0 if !@newFrameCount
|
||||||
|
return @newFrameCount
|
||||||
|
end
|
||||||
|
|
||||||
|
def extraYears
|
||||||
|
@extraYears=0 if !@extraYears
|
||||||
|
return @extraYears
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if UnrealTime::TIME_STOPS
|
||||||
|
class Scene_Map
|
||||||
|
alias :updateold :update
|
||||||
|
def update
|
||||||
|
$PokemonGlobal.addNewFrameCount
|
||||||
|
updateold
|
||||||
|
end
|
||||||
|
|
||||||
|
if UnrealTime::TALK_PASS
|
||||||
|
alias :miniupdateold :miniupdate
|
||||||
|
def miniupdate
|
||||||
|
$PokemonGlobal.addNewFrameCount
|
||||||
|
miniupdateold
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if UnrealTime::BATTLE_PASS
|
||||||
|
class PokeBattle_Scene
|
||||||
|
alias :pbGraphicsUpdateold :pbGraphicsUpdate
|
||||||
|
def pbGraphicsUpdate
|
||||||
|
$PokemonGlobal.addNewFrameCount
|
||||||
|
pbGraphicsUpdateold
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
class Scene_DebugIntro
|
class Scene_DebugIntro
|
||||||
attr_accessor :map_renderer
|
|
||||||
def main
|
def main
|
||||||
Graphics.transition(0)
|
Graphics.transition(0)
|
||||||
sscene = PokemonLoad_Scene.new
|
sscene = PokemonLoad_Scene.new
|
||||||
@@ -9,41 +8,8 @@ class Scene_DebugIntro
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def resetPlayerPosition
|
|
||||||
save_data = load_save_file(SaveData::FILE_PATH)
|
|
||||||
map = save_data[:map_factory].map.map_id
|
|
||||||
x = save_data[:game_player].x
|
|
||||||
y = save_data[:game_player].y
|
|
||||||
dir = save_data[:game_player].direction
|
|
||||||
$MapFactory.setup(map)
|
|
||||||
$game_player.moveto(x,y)
|
|
||||||
$game_player.direction = dir
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
def load_save_file(file_path)
|
|
||||||
save_data = SaveData.read_from_file(file_path)
|
|
||||||
unless SaveData.valid?(save_data)
|
|
||||||
if File.file?(file_path + '.bak')
|
|
||||||
pbMessage(_INTL('The save file is corrupt. A backup will be loaded.'))
|
|
||||||
save_data = load_save_file(file_path + '.bak')
|
|
||||||
else
|
|
||||||
self.prompt_save_deletion
|
|
||||||
return {}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return save_data
|
|
||||||
end
|
|
||||||
|
|
||||||
def returnToTitle()
|
|
||||||
resetPlayerPosition
|
|
||||||
pbMapInterpreter.command_end
|
|
||||||
$game_temp.to_title = true
|
|
||||||
end
|
|
||||||
|
|
||||||
def pbCallTitle
|
def pbCallTitle
|
||||||
$game_temp.to_title = false
|
return Scene_DebugIntro.new if $DEBUG
|
||||||
#return Scene_DebugIntro.new if $DEBUG
|
|
||||||
return Scene_Intro.new
|
return Scene_Intro.new
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user