mirror of
https://github.com/enduro2d/enduro2d.git
synced 2025-12-15 00:11:55 +07:00
bind high components and modules
This commit is contained in:
8
samples/bin/library/scripts/emmy/components/actor.lua
Normal file
8
samples/bin/library/scripts/emmy/components/actor.lua
Normal file
@@ -0,0 +1,8 @@
|
||||
---@class actor
|
||||
local actor = {
|
||||
---@type node
|
||||
node = {}
|
||||
}
|
||||
|
||||
---@type actor
|
||||
_G.actor = _G.actor or actor
|
||||
22
samples/bin/library/scripts/emmy/components/behaviour.lua
Normal file
22
samples/bin/library/scripts/emmy/components/behaviour.lua
Normal file
@@ -0,0 +1,22 @@
|
||||
---@class behaviour
|
||||
local behaviour = {
|
||||
---@type boolean
|
||||
enabled = true,
|
||||
|
||||
---@type boolean
|
||||
disabled = false,
|
||||
|
||||
---@type table
|
||||
meta = {}
|
||||
}
|
||||
|
||||
---@overload fun(self: behaviour)
|
||||
---@param self behaviour
|
||||
function behaviour.enable(self) end
|
||||
|
||||
---@overload fun(self: behaviour)
|
||||
---@param self behaviour
|
||||
function behaviour.disable(self) end
|
||||
|
||||
---@type behaviour
|
||||
_G.behaviour = _G.behaviour or behaviour
|
||||
31
samples/bin/library/scripts/emmy/components/camera.lua
Normal file
31
samples/bin/library/scripts/emmy/components/camera.lua
Normal file
@@ -0,0 +1,31 @@
|
||||
---@class camera
|
||||
local camera = {
|
||||
---@type boolean
|
||||
enabled = true,
|
||||
|
||||
---@type boolean
|
||||
disabled = false,
|
||||
|
||||
---@type integer
|
||||
depth = 0,
|
||||
|
||||
---@type rect
|
||||
viewport = rect.zero(),
|
||||
|
||||
---@type m4f
|
||||
projection = m4f.identity(),
|
||||
|
||||
---@type color
|
||||
background = color.white()
|
||||
}
|
||||
|
||||
---@overload fun(self: camera)
|
||||
---@param self camera
|
||||
function camera.enable(self) end
|
||||
|
||||
---@overload fun(self: camera)
|
||||
---@param self camera
|
||||
function camera.disable(self) end
|
||||
|
||||
---@type camera
|
||||
_G.camera = _G.camera or camera
|
||||
@@ -0,0 +1,38 @@
|
||||
---@class flipbook_player
|
||||
local flipbook_player = {
|
||||
---@type number
|
||||
time = 0,
|
||||
|
||||
---@type number
|
||||
speed = 1,
|
||||
|
||||
---@type boolean
|
||||
looped = false,
|
||||
|
||||
---@type boolean
|
||||
stopped = true,
|
||||
|
||||
---@type boolean
|
||||
playing = false,
|
||||
|
||||
---@type str_hash
|
||||
sequence = str_hash.new(),
|
||||
|
||||
---@type flipbook_asset
|
||||
flipbook = nil
|
||||
}
|
||||
|
||||
---@overload fun(self: flipbook_player, time: number)
|
||||
---@overload fun(self: flipbook_player, sequence: string)
|
||||
---@overload fun(self: flipbook_player, sequence: str_hash)
|
||||
---@param self flipbook_player
|
||||
function flipbook_player.stop(self, ...) end
|
||||
|
||||
---@overload fun(self: flipbook_player, time: number)
|
||||
---@overload fun(self: flipbook_player, sequence: string)
|
||||
---@overload fun(self: flipbook_player, sequence: str_hash)
|
||||
---@param self flipbook_player
|
||||
function flipbook_player.play(self, ...) end
|
||||
|
||||
---@type flipbook_player
|
||||
_G.flipbook_player = _G.flipbook_player or flipbook_player
|
||||
53
samples/bin/library/scripts/emmy/components/label.lua
Normal file
53
samples/bin/library/scripts/emmy/components/label.lua
Normal file
@@ -0,0 +1,53 @@
|
||||
---@class label
|
||||
local label = {
|
||||
---@type string
|
||||
text = "",
|
||||
|
||||
---@type font_asset
|
||||
font = nil,
|
||||
|
||||
---@type color32
|
||||
tint = color32.white(),
|
||||
|
||||
---@type label_haligns
|
||||
halign = label.haligns.center,
|
||||
|
||||
---@type label_valigns
|
||||
valign = label.valigns.baseline,
|
||||
|
||||
---@type number
|
||||
leading = 1,
|
||||
|
||||
---@type number
|
||||
tracking = 0,
|
||||
|
||||
---@type number
|
||||
text_width = 0,
|
||||
|
||||
---@type number
|
||||
glyph_dilate = 0,
|
||||
|
||||
---@type number
|
||||
outline_width = 0,
|
||||
|
||||
---@type color32
|
||||
outline_color = color32.white()
|
||||
}
|
||||
|
||||
---@class label_haligns
|
||||
label.haligns = {
|
||||
left = "left",
|
||||
center = "center",
|
||||
right = "right"
|
||||
}
|
||||
|
||||
---@class label_valigns
|
||||
label.valigns = {
|
||||
top = "top",
|
||||
center = "center",
|
||||
bottom = "bottom",
|
||||
baseline = "baseline"
|
||||
}
|
||||
|
||||
---@type label
|
||||
_G.label = _G.label or label
|
||||
@@ -0,0 +1,8 @@
|
||||
---@class model_renderer
|
||||
local model_renderer = {
|
||||
---@type model_asset
|
||||
model = nil
|
||||
}
|
||||
|
||||
---@type model_renderer
|
||||
_G.model_renderer = _G.model_renderer or model_renderer
|
||||
8
samples/bin/library/scripts/emmy/components/named.lua
Normal file
8
samples/bin/library/scripts/emmy/components/named.lua
Normal file
@@ -0,0 +1,8 @@
|
||||
---@class named
|
||||
local named = {
|
||||
---@type string
|
||||
name = ""
|
||||
}
|
||||
|
||||
---@type named
|
||||
_G.named = _G.named or named
|
||||
19
samples/bin/library/scripts/emmy/components/renderer.lua
Normal file
19
samples/bin/library/scripts/emmy/components/renderer.lua
Normal file
@@ -0,0 +1,19 @@
|
||||
---@class renderer
|
||||
local renderer = {
|
||||
---@type boolean
|
||||
enabled = true,
|
||||
|
||||
---@type boolean
|
||||
disabled = false
|
||||
}
|
||||
|
||||
---@overload fun(self: renderer)
|
||||
---@param self renderer
|
||||
function renderer.enable(self) end
|
||||
|
||||
---@overload fun(self: renderer)
|
||||
---@param self renderer
|
||||
function renderer.disable(self) end
|
||||
|
||||
---@type renderer
|
||||
_G.renderer = _G.renderer or renderer
|
||||
22
samples/bin/library/scripts/emmy/components/scene.lua
Normal file
22
samples/bin/library/scripts/emmy/components/scene.lua
Normal file
@@ -0,0 +1,22 @@
|
||||
---@class scene
|
||||
local scene = {
|
||||
---@type boolean
|
||||
enabled = true,
|
||||
|
||||
---@type boolean
|
||||
disabled = false,
|
||||
|
||||
---@type integer
|
||||
depth = 0
|
||||
}
|
||||
|
||||
---@overload fun(self: scene)
|
||||
---@param self scene
|
||||
function scene.enable(self) end
|
||||
|
||||
---@overload fun(self: scene)
|
||||
---@param self scene
|
||||
function scene.disable(self) end
|
||||
|
||||
---@type scene
|
||||
_G.scene = _G.scene or scene
|
||||
226
samples/bin/library/scripts/emmy/components/spine_player.lua
Normal file
226
samples/bin/library/scripts/emmy/components/spine_player.lua
Normal file
@@ -0,0 +1,226 @@
|
||||
---@class spine_player
|
||||
local spine_player = {
|
||||
---@type spine_asset
|
||||
spine = nil
|
||||
}
|
||||
|
||||
---@param self spine_player
|
||||
---@param name string
|
||||
---@return boolean
|
||||
function spine_player.skin(self, name) end
|
||||
|
||||
---@param self spine_player
|
||||
---@param slot string
|
||||
---@param name string
|
||||
---@return boolean
|
||||
function spine_player.attachment(self, slot, name) end
|
||||
|
||||
---@param self spine_player
|
||||
---@param name string
|
||||
---@return boolean
|
||||
function spine_player.has_skin(self, name) end
|
||||
|
||||
---@param self spine_player
|
||||
---@param name string
|
||||
---@return boolean
|
||||
function spine_player.has_animation(self, name) end
|
||||
|
||||
---@param self spine_player
|
||||
---@param cmd spine_player_command
|
||||
function spine_player.add_command(self, cmd) end
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
--
|
||||
-- events
|
||||
--
|
||||
-- -----------------------------------------------------------------------------
|
||||
|
||||
---@alias spine_player_event spine_player_custom_evt | spine_player_end_evt | spine_player_complete_evt
|
||||
|
||||
--
|
||||
-- custom_evt
|
||||
--
|
||||
|
||||
---@class spine_player_custom_evt
|
||||
spine_player.custom_evt = {
|
||||
---@type string
|
||||
name = "",
|
||||
|
||||
---@type integer
|
||||
int_value = 0,
|
||||
|
||||
---@type number
|
||||
float_value = 0,
|
||||
|
||||
---@type string
|
||||
string_value = ""
|
||||
}
|
||||
|
||||
---@param name string
|
||||
---@return spine_player_custom_evt
|
||||
function spine_player.custom_evt.new(name) end
|
||||
|
||||
--
|
||||
-- end_evt
|
||||
--
|
||||
|
||||
---@class spine_player_end_evt
|
||||
spine_player.end_evt = {
|
||||
---@type string
|
||||
message = ""
|
||||
}
|
||||
|
||||
---@param message string
|
||||
---@return spine_player_end_evt
|
||||
function spine_player.end_evt.new(message) end
|
||||
|
||||
--
|
||||
-- complete_evt
|
||||
--
|
||||
|
||||
---@class spine_player_complete_evt
|
||||
spine_player.complete_evt = {
|
||||
---@type string
|
||||
message = ""
|
||||
}
|
||||
|
||||
---@param message string
|
||||
---@return spine_player_complete_evt
|
||||
function spine_player.complete_evt.new(message) end
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
--
|
||||
-- commands
|
||||
--
|
||||
-- -----------------------------------------------------------------------------
|
||||
|
||||
---@alias spine_player_command spine_player_clear_track_cmd | spine_player_set_anim_cmd | spine_player_add_anim_cmd | spine_player_set_empty_anim_cmd | spine_player_add_empty_anim_cmd
|
||||
|
||||
--
|
||||
-- clear_track_cmd
|
||||
--
|
||||
|
||||
---@class spine_player_clear_track_cmd
|
||||
spine_player.clear_track_cmd = {
|
||||
---@type integer
|
||||
track = 0
|
||||
}
|
||||
|
||||
---@param track integer
|
||||
---@return spine_player_clear_track_cmd
|
||||
function spine_player.clear_track_cmd.new(track) end
|
||||
|
||||
--
|
||||
-- set_anim_cmd
|
||||
--
|
||||
|
||||
---@class spine_player_set_anim_cmd
|
||||
spine_player.set_anim_cmd = {
|
||||
---@type integer
|
||||
track = 0,
|
||||
|
||||
---@type string
|
||||
name = "",
|
||||
|
||||
---@type boolean
|
||||
loop = false,
|
||||
|
||||
---@type string
|
||||
end_message = "",
|
||||
|
||||
---@type string
|
||||
complete_message = ""
|
||||
}
|
||||
|
||||
---@param track integer
|
||||
---@param name string
|
||||
---@return spine_player_set_anim_cmd
|
||||
function spine_player.set_anim_cmd.new(track, name) end
|
||||
|
||||
--
|
||||
-- add_anim_cmd
|
||||
--
|
||||
|
||||
---@class spine_player_add_anim_cmd
|
||||
spine_player.add_anim_cmd = {
|
||||
---@type integer
|
||||
track = 0,
|
||||
|
||||
---@type string
|
||||
name = "",
|
||||
|
||||
---@type boolean
|
||||
loop = false,
|
||||
|
||||
---@type number
|
||||
delay = 0,
|
||||
|
||||
---@type string
|
||||
end_message = "",
|
||||
|
||||
---@type string
|
||||
complete_message = ""
|
||||
}
|
||||
|
||||
---@param track integer
|
||||
---@param name string
|
||||
---@return spine_player_add_anim_cmd
|
||||
function spine_player.add_anim_cmd.new(track, name) end
|
||||
|
||||
--
|
||||
-- set_empty_anim_cmd
|
||||
--
|
||||
|
||||
---@class spine_player_set_empty_anim_cmd
|
||||
spine_player.set_empty_anim_cmd = {
|
||||
---@type integer
|
||||
track = 0,
|
||||
|
||||
---@type number
|
||||
mix_duration = 0,
|
||||
|
||||
---@type string
|
||||
end_message = "",
|
||||
|
||||
---@type string
|
||||
complete_message = ""
|
||||
}
|
||||
|
||||
---@param track integer
|
||||
---@return spine_player_set_empty_anim_cmd
|
||||
function spine_player.set_empty_anim_cmd.new(track) end
|
||||
|
||||
--
|
||||
-- add_empty_anim_cmd
|
||||
--
|
||||
|
||||
---@class spine_player_add_empty_anim_cmd
|
||||
spine_player.add_empty_anim_cmd = {
|
||||
---@type integer
|
||||
track = 0,
|
||||
|
||||
---@type number
|
||||
delay = 0,
|
||||
|
||||
---@type number
|
||||
mix_duration = 0,
|
||||
|
||||
---@type string
|
||||
end_message = "",
|
||||
|
||||
---@type string
|
||||
complete_message = ""
|
||||
}
|
||||
|
||||
---@param track integer
|
||||
---@return spine_player_add_empty_anim_cmd
|
||||
function spine_player.add_empty_anim_cmd.new(track) end
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
--
|
||||
-- globals
|
||||
--
|
||||
-- -----------------------------------------------------------------------------
|
||||
|
||||
---@type spine_player
|
||||
_G.spine_player = _G.spine_player or spine_player
|
||||
@@ -0,0 +1,25 @@
|
||||
---@class sprite_renderer
|
||||
local sprite_renderer = {
|
||||
---@type color32
|
||||
tint = color32.white(),
|
||||
|
||||
---@type sprite_renderer_blendings
|
||||
blending = sprite_renderer.blendings.normal,
|
||||
|
||||
---@type boolean
|
||||
filtering = true,
|
||||
|
||||
---@type sprite_asset
|
||||
sprite = nil
|
||||
}
|
||||
|
||||
---@class sprite_renderer_blendings
|
||||
sprite_renderer.blendings = {
|
||||
normal = "normal",
|
||||
additive = "additive",
|
||||
multiply = "multiply",
|
||||
screen = "screen"
|
||||
}
|
||||
|
||||
---@type sprite_renderer
|
||||
_G.sprite_renderer = _G.sprite_renderer or sprite_renderer
|
||||
@@ -2,17 +2,21 @@
|
||||
local debug = {
|
||||
}
|
||||
|
||||
---@param self debug
|
||||
---@param message string
|
||||
function debug:trace(message) end
|
||||
function debug.trace(self, message) end
|
||||
|
||||
---@param self debug
|
||||
---@param message string
|
||||
function debug:warning(message) end
|
||||
function debug.warning(self, message) end
|
||||
|
||||
---@param self debug
|
||||
---@param message string
|
||||
function debug:error(message) end
|
||||
function debug.error(self, message) end
|
||||
|
||||
---@param self debug
|
||||
---@param message string
|
||||
function debug:fatal(message) end
|
||||
function debug.fatal(self, message) end
|
||||
|
||||
---@type debug
|
||||
_G.the_debug = _G.the_debug or debug
|
||||
|
||||
@@ -6,10 +6,10 @@ local engine = {
|
||||
---@type number
|
||||
delta_time = 0,
|
||||
|
||||
---@type number
|
||||
---@type integer
|
||||
frame_rate = 0,
|
||||
|
||||
---@type number
|
||||
---@type integer
|
||||
frame_count = 0,
|
||||
|
||||
---@type number
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
---@class input
|
||||
local input = {
|
||||
---@type mouse
|
||||
mouse = {},
|
||||
mouse = nil,
|
||||
|
||||
---@type keyboard
|
||||
keyboard = {}
|
||||
keyboard = nil
|
||||
}
|
||||
|
||||
---@type input
|
||||
|
||||
@@ -22,17 +22,20 @@ local keyboard = {
|
||||
just_released_keys = {}
|
||||
}
|
||||
|
||||
---@param self keyboard
|
||||
---@param key string
|
||||
---@return boolean
|
||||
function keyboard:is_key_pressed(key) end
|
||||
function keyboard.is_key_pressed(self, key) end
|
||||
|
||||
---@param self keyboard
|
||||
---@param key string
|
||||
---@return boolean
|
||||
function keyboard:is_key_just_pressed(key) end
|
||||
function keyboard.is_key_just_pressed(self, key) end
|
||||
|
||||
---@param self keyboard
|
||||
---@param key string
|
||||
---@return boolean
|
||||
function keyboard:is_key_just_released(key) end
|
||||
function keyboard.is_key_just_released(self, key) end
|
||||
|
||||
---@type keyboard
|
||||
_G.the_keyboard = _G.the_keyboard or keyboard
|
||||
|
||||
@@ -25,17 +25,20 @@ local mouse = {
|
||||
just_released_buttons = {}
|
||||
}
|
||||
|
||||
---@param self mouse
|
||||
---@param button string
|
||||
---@return boolean
|
||||
function mouse:is_button_pressed(button) end
|
||||
function mouse.is_button_pressed(self, button) end
|
||||
|
||||
---@param self mouse
|
||||
---@param button string
|
||||
---@return boolean
|
||||
function mouse:is_button_just_pressed(button) end
|
||||
function mouse.is_button_just_pressed(self, button) end
|
||||
|
||||
---@param self mouse
|
||||
---@param button string
|
||||
---@return boolean
|
||||
function mouse:is_button_just_released(button) end
|
||||
function mouse.is_button_just_released(self, button) end
|
||||
|
||||
---@type mouse
|
||||
_G.the_mouse = _G.the_mouse or mouse
|
||||
|
||||
@@ -34,13 +34,17 @@ local window = {
|
||||
should_close = false
|
||||
}
|
||||
|
||||
function window:hide() end
|
||||
---@param self window
|
||||
function window.hide(self) end
|
||||
|
||||
function window:show() end
|
||||
---@param self window
|
||||
function window.show(self) end
|
||||
|
||||
function window:restore() end
|
||||
---@param self window
|
||||
function window.restore(self) end
|
||||
|
||||
function window:minimize() end
|
||||
---@param self window
|
||||
function window.minimize(self) end
|
||||
|
||||
---@type window
|
||||
_G.the_window = _G.the_window or window
|
||||
|
||||
47
samples/bin/library/scripts/emmy/high/gobject.lua
Normal file
47
samples/bin/library/scripts/emmy/high/gobject.lua
Normal file
@@ -0,0 +1,47 @@
|
||||
---@class gobject
|
||||
local gobject = {
|
||||
---@type boolean
|
||||
alive = true,
|
||||
|
||||
---@type boolean
|
||||
valid = true,
|
||||
|
||||
---@type actor
|
||||
actor = nil,
|
||||
|
||||
---@type behaviour
|
||||
behaviour = nil,
|
||||
|
||||
---@type camera
|
||||
camera = nil,
|
||||
|
||||
---@type flipbook_player
|
||||
flipbook_player = nil,
|
||||
|
||||
---@type label
|
||||
label = nil,
|
||||
|
||||
---@type model_renderer
|
||||
model_renderer = nil,
|
||||
|
||||
---@type named
|
||||
named = nil,
|
||||
|
||||
---@type renderer
|
||||
renderer = nil,
|
||||
|
||||
---@type scene
|
||||
scene = nil,
|
||||
|
||||
---@type spine_player
|
||||
spine_player = nil,
|
||||
|
||||
---@type sprite_renderer
|
||||
sprite_renderer = nil
|
||||
}
|
||||
|
||||
---@param self gobject
|
||||
function gobject.destroy(self) end
|
||||
|
||||
---@type gobject
|
||||
_G.gobject = _G.gobject or gobject
|
||||
113
samples/bin/library/scripts/emmy/high/node.lua
Normal file
113
samples/bin/library/scripts/emmy/high/node.lua
Normal file
@@ -0,0 +1,113 @@
|
||||
---@class node
|
||||
local node = {
|
||||
---@type t3f
|
||||
transform = t3f.identity(),
|
||||
|
||||
---@type v3f
|
||||
translation = v3f.zero(),
|
||||
|
||||
---@type q4f
|
||||
rotation = q4f.identity(),
|
||||
|
||||
---@type v3f
|
||||
scale = v3f.unit(),
|
||||
|
||||
---@type m4f
|
||||
local_matrix = m4f.identity(),
|
||||
|
||||
---@type m4f
|
||||
world_matrix = m4f.identity(),
|
||||
|
||||
---@type node
|
||||
root = nil,
|
||||
|
||||
---@type node
|
||||
parent = nil,
|
||||
|
||||
---@type integer
|
||||
child_count = 0,
|
||||
|
||||
---@type integer
|
||||
child_count_recursive = 0,
|
||||
|
||||
---@type node
|
||||
first_child = nil,
|
||||
|
||||
---@type node
|
||||
last_child = nil,
|
||||
|
||||
---@type node
|
||||
prev_sibling = nil,
|
||||
|
||||
---@type node
|
||||
next_sibling = nil
|
||||
}
|
||||
|
||||
---@param self node
|
||||
---@return boolean
|
||||
function node.remove_from_parent(self) end
|
||||
|
||||
---@param self node
|
||||
---@return integer
|
||||
function node.remove_all_children(self) end
|
||||
|
||||
---@param self node
|
||||
---@param child node
|
||||
---@return boolean
|
||||
function node.add_child(self, child) end
|
||||
|
||||
---@param self node
|
||||
---@param child node
|
||||
---@return boolean
|
||||
function node.add_child_to_back(self, child) end
|
||||
|
||||
---@param self node
|
||||
---@param child node
|
||||
---@return boolean
|
||||
function node.add_child_to_front(self, child) end
|
||||
|
||||
---@param self node
|
||||
---@param before node
|
||||
---@param child node
|
||||
---@return boolean
|
||||
function node.add_child_before(self, before, child) end
|
||||
|
||||
---@param self node
|
||||
---@param after node
|
||||
---@param child node
|
||||
---@return boolean
|
||||
function node.add_child_after(self, after, child) end
|
||||
|
||||
---@param self node
|
||||
---@param sibling node
|
||||
---@return boolean
|
||||
function node.add_sibling_before(self, sibling) end
|
||||
|
||||
---@param self node
|
||||
---@param sibling node
|
||||
---@return boolean
|
||||
function node.add_sibling_after(self, sibling) end
|
||||
|
||||
---@param self node
|
||||
---@param child node
|
||||
---@return boolean
|
||||
function node.remove_child(self, child) end
|
||||
|
||||
---@param self node
|
||||
---@return boolean
|
||||
function node.send_backward(self) end
|
||||
|
||||
---@param self node
|
||||
---@return boolean
|
||||
function node.bring_to_back(self) end
|
||||
|
||||
---@param self node
|
||||
---@return boolean
|
||||
function node.send_forward(self) end
|
||||
|
||||
---@param self node
|
||||
---@return boolean
|
||||
function node.bring_to_front(self) end
|
||||
|
||||
---@type node
|
||||
_G.node = _G.node or node
|
||||
15
samples/bin/library/scripts/emmy/high/world.lua
Normal file
15
samples/bin/library/scripts/emmy/high/world.lua
Normal file
@@ -0,0 +1,15 @@
|
||||
---@class world
|
||||
local world = {
|
||||
}
|
||||
|
||||
---@overload fun(): gobject
|
||||
---@overload fun(prefab: prefab): gobject
|
||||
---@overload fun(parent: node): gobject
|
||||
---@overload fun(prefab: prefab, parent: node): gobject
|
||||
---@overload fun(parent: node, transform: t3f): gobject
|
||||
---@overload fun(prefab: prefab, parent: node, transform: t3f): gobject
|
||||
---@return gobject
|
||||
function world:instantiate(...) end
|
||||
|
||||
---@type world
|
||||
_G.the_world = _G.the_world or world
|
||||
Reference in New Issue
Block a user