Activate ta4 movecontroller, ta4 sequencer and command counting
This commit is contained in:
parent
3505751f16
commit
ad25882ca1
@ -14,6 +14,10 @@
|
|||||||
|
|
||||||
local PlayerName
|
local PlayerName
|
||||||
local PlayerPoints = {}
|
local PlayerPoints = {}
|
||||||
|
local LastPlayerPoints = {}
|
||||||
|
local S = techage.S
|
||||||
|
|
||||||
|
local MAX_POINTS = tonumber(minetest.settings:get("techage_command_limit")) or 1200
|
||||||
|
|
||||||
function techage.counting_start(player_name)
|
function techage.counting_start(player_name)
|
||||||
PlayerName = player_name
|
PlayerName = player_name
|
||||||
@ -32,11 +36,33 @@ end
|
|||||||
|
|
||||||
local function output()
|
local function output()
|
||||||
for name, val in pairs(PlayerPoints) do
|
for name, val in pairs(PlayerPoints) do
|
||||||
minetest.log("action", "[techage] " .. name .. " hat " .. val .. " Punkte")
|
if val > MAX_POINTS then
|
||||||
|
local obj = minetest.get_player_by_name(name)
|
||||||
|
if obj then
|
||||||
|
minetest.chat_send_player(name,
|
||||||
|
S("[techage] The limit for 'number of commands per minute' has been exceeded.") ..
|
||||||
|
" " .. string.format(MAX_POINTS .. " " .. S("is allowed. Current value is") .. " " .. val));
|
||||||
|
minetest.log("action", "[techage] " .. name ..
|
||||||
|
" exceeds the limit for commands per minute. value = " .. val)
|
||||||
|
local factor = 100 / (obj:get_armor_groups().fleshy or 100)
|
||||||
|
obj:punch(obj, 1.0, {full_punch_interval=1.0, damage_groups = {fleshy=factor * 5}})
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
LastPlayerPoints = table.copy(PlayerPoints)
|
||||||
PlayerPoints = {}
|
PlayerPoints = {}
|
||||||
minetest.after(60, output)
|
minetest.after(60, output)
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.after(60, output)
|
minetest.after(60, output)
|
||||||
|
|
||||||
|
|
||||||
|
minetest.register_chatcommand("ta_limit", {
|
||||||
|
description = "Get your current techage command limit value",
|
||||||
|
func = function(name)
|
||||||
|
local num = LastPlayerPoints[name] or 0
|
||||||
|
return true, S("Your current value is") .. " " .. num .. " " .. S("per minute") .. ". " ..
|
||||||
|
MAX_POINTS .. " " .. S("is allowed")
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
|
@ -113,6 +113,13 @@ Access:=Zugriff:
|
|||||||
TA3 Button/Switch=TA3 Taster/Schalter
|
TA3 Button/Switch=TA3 Taster/Schalter
|
||||||
TA4 Button/Switch=TA4 Schalter/Taster
|
TA4 Button/Switch=TA4 Schalter/Taster
|
||||||
|
|
||||||
|
### button.lua ###
|
||||||
|
### button_4x.lua ###
|
||||||
|
### signallamp_4x.lua ###
|
||||||
|
|
||||||
|
Command=Kommando
|
||||||
|
Command to be sent=Zu sendender Befehl
|
||||||
|
|
||||||
### button.lua ###
|
### button.lua ###
|
||||||
### cart_detector.lua ###
|
### cart_detector.lua ###
|
||||||
### detector.lua ###
|
### detector.lua ###
|
||||||
@ -130,6 +137,7 @@ Insert destination node number(s)=Gebe Zielnummer(n) ein
|
|||||||
### doorcontroller.lua ###
|
### doorcontroller.lua ###
|
||||||
### mesecons_converter.lua ###
|
### mesecons_converter.lua ###
|
||||||
### repeater.lua ###
|
### repeater.lua ###
|
||||||
|
### sequencer2.lua ###
|
||||||
### submenu.lua ###
|
### submenu.lua ###
|
||||||
|
|
||||||
Save=Speichern
|
Save=Speichern
|
||||||
@ -145,8 +153,6 @@ TA4 4x Button=TA4 4x Taster
|
|||||||
|
|
||||||
Access=Zugriff
|
Access=Zugriff
|
||||||
Button protection=Tastenschutz
|
Button protection=Tastenschutz
|
||||||
Command=Kommando
|
|
||||||
Command to be sent=Zu sendender Befehl
|
|
||||||
Destination block number=Zielblocknummer
|
Destination block number=Zielblocknummer
|
||||||
Number=Nummer
|
Number=Nummer
|
||||||
|
|
||||||
@ -220,6 +226,14 @@ TA3 Melting=TA3 Schmelzen
|
|||||||
|
|
||||||
TA3 Cooler=TA3 Kühler
|
TA3 Cooler=TA3 Kühler
|
||||||
|
|
||||||
|
### counting.lua ###
|
||||||
|
|
||||||
|
Your current value is=Der aktuelle Wert ist
|
||||||
|
[techage] The limit for 'number of commands per minute' has been exceeded.=[techage] Das Limit für 'Anzahl Befehle pro Minute' wurde überschritten.
|
||||||
|
is allowed=ist erlaubt
|
||||||
|
is allowed. Current value is=ist erlaubt. Aktueller Wert ist
|
||||||
|
per minute=pro Minute
|
||||||
|
|
||||||
### cylinder.lua ###
|
### cylinder.lua ###
|
||||||
|
|
||||||
TA2 Cylinder=TA2 Zylinder
|
TA2 Cylinder=TA2 Zylinder
|
||||||
@ -276,15 +290,19 @@ Blocks are back=Blöcke sind wieder da
|
|||||||
Blocks are disappeared=Blöcke sind verschwunden
|
Blocks are disappeared=Blöcke sind verschwunden
|
||||||
Click on all the blocks that are part of the door/gate=Klicke auf alle Blöcke, die Teil des Tores sind
|
Click on all the blocks that are part of the door/gate=Klicke auf alle Blöcke, die Teil des Tores sind
|
||||||
Ctrl,Inv=Ctrl,Inv
|
Ctrl,Inv=Ctrl,Inv
|
||||||
Done=Fertig
|
|
||||||
Record=Aufzeichnen
|
|
||||||
Recording...=Aufzeichnung...
|
|
||||||
Remove=Entfernen
|
Remove=Entfernen
|
||||||
Set=Setzen
|
Set=Setzen
|
||||||
TA3 Door Controller II=TA3 Tür Controller II
|
TA3 Door Controller II=TA3 Tür Controller II
|
||||||
block positions are stored.=Block Positionen gespeichert.
|
|
||||||
with door sound=mit Türgeräusch
|
with door sound=mit Türgeräusch
|
||||||
|
|
||||||
|
### doorcontroller2.lua ###
|
||||||
|
### movecontroller.lua ###
|
||||||
|
|
||||||
|
Done=Fertig
|
||||||
|
Record=Aufzeichnen
|
||||||
|
Recording...=Aufzeichnung...
|
||||||
|
block positions are stored.=Block Positionen gespeichert.
|
||||||
|
|
||||||
### drillbox.lua ###
|
### drillbox.lua ###
|
||||||
|
|
||||||
Build derrick=Errichte Ölturm
|
Build derrick=Errichte Ölturm
|
||||||
@ -634,10 +652,15 @@ Syntax=Syntax
|
|||||||
### logic_block.lua ###
|
### logic_block.lua ###
|
||||||
### lua_logic.lua ###
|
### lua_logic.lua ###
|
||||||
|
|
||||||
Store=Speichern
|
|
||||||
TA3 Logic Block=TA3 Logikblock
|
TA3 Logic Block=TA3 Logikblock
|
||||||
Update=Update
|
Update=Update
|
||||||
|
|
||||||
|
### logic_block.lua ###
|
||||||
|
### lua_logic.lua ###
|
||||||
|
### movecontroller.lua ###
|
||||||
|
|
||||||
|
Store=Speichern
|
||||||
|
|
||||||
### lye.lua ###
|
### lye.lua ###
|
||||||
|
|
||||||
Lye=Lauge
|
Lye=Lauge
|
||||||
@ -695,6 +718,27 @@ TA1 Pine Wood Board=TA1 Kiefernholzbrett
|
|||||||
|
|
||||||
TA4 Streetlamp Solar Cell=TA4 Straßenlampen-Solarzelle
|
TA4 Streetlamp Solar Cell=TA4 Straßenlampen-Solarzelle
|
||||||
|
|
||||||
|
### movecontroller.lua ###
|
||||||
|
|
||||||
|
Click on all blocks that shall be moved=Klicke auf alle Blöcke, die verschoben werden sollen
|
||||||
|
Destination position is protected=Zielposition ist geschützt
|
||||||
|
Handover to A=Übergabe an A
|
||||||
|
Handover to B=Übergabe an B
|
||||||
|
Maximum Speed=Maximalgeschwindigkeit
|
||||||
|
Maximum speed for the moving block.=Maximale Geschwindigkeit für den beweglichen Block.
|
||||||
|
Move A-B=Bewege A-B
|
||||||
|
Move B-A=Bewege B-A
|
||||||
|
Move block height=Move Block Höhe
|
||||||
|
Move distance (A to B)=Entfernung (A nach B)
|
||||||
|
No valid destination position=Keine gültige Zielposition
|
||||||
|
No valid node at the start position=Kein gültiger Block an der Startposition
|
||||||
|
Number of the next movecontroller.=Nummer des nächsten Move Controllers.
|
||||||
|
Number of the previous movecontroller.=Nummer des vorherigen Move Controllers.
|
||||||
|
Position list error=Positionslistenfehler
|
||||||
|
Start position is protected=Startposition ist geschützt
|
||||||
|
TA4 Move Controller=TA4 Move Controller
|
||||||
|
Value in the range of 0.0 to 1.0=Wert im Bereich von 0.0 bis 1.0
|
||||||
|
|
||||||
### node_detector.lua ###
|
### node_detector.lua ###
|
||||||
|
|
||||||
Send signal if nodes have been:=Sende ein Signal falls Blöcke:
|
Send signal if nodes have been:=Sende ein Signal falls Blöcke:
|
||||||
@ -905,8 +949,26 @@ not connected=nicht verbunden
|
|||||||
### sequencer.lua ###
|
### sequencer.lua ###
|
||||||
|
|
||||||
TA3 Sequencer=TA3 Sequenzer
|
TA3 Sequencer=TA3 Sequenzer
|
||||||
|
|
||||||
|
### sequencer.lua ###
|
||||||
|
### sequencer2.lua ###
|
||||||
|
|
||||||
stopped=gestoppt
|
stopped=gestoppt
|
||||||
|
|
||||||
|
### sequencer2.lua ###
|
||||||
|
|
||||||
|
Commands=Kommandos
|
||||||
|
Invalid command!=Ungültiges Kommando!
|
||||||
|
Start=Start
|
||||||
|
Stop=Stopp
|
||||||
|
TA4 Sequencer=TA4 Sequenzer
|
||||||
|
running=läuft
|
||||||
|
|
||||||
|
### sequencer2.lua ###
|
||||||
|
### submenu.lua ###
|
||||||
|
|
||||||
|
Cancel=Abbruch
|
||||||
|
|
||||||
### signallamp.lua ###
|
### signallamp.lua ###
|
||||||
|
|
||||||
TA4 Wind Turbine Signal Lamp=TA4 Windkraftanlagenlampe
|
TA4 Wind Turbine Signal Lamp=TA4 Windkraftanlagenlampe
|
||||||
@ -979,7 +1041,6 @@ TA4 LED Street Lamp Pole=TA4 LED Lampenmast
|
|||||||
|
|
||||||
### submenu.lua ###
|
### submenu.lua ###
|
||||||
|
|
||||||
Cancel=Abbruch
|
|
||||||
Note: You can't change any values while the block is running!=Hinweis: Während der Block läuft, kann kein Wert geändert werden!
|
Note: You can't change any values while the block is running!=Hinweis: Während der Block läuft, kann kein Wert geändert werden!
|
||||||
Refresh=Aktualisieren
|
Refresh=Aktualisieren
|
||||||
|
|
||||||
@ -1161,3 +1222,5 @@ is a suitable place for a wind turbine!=ist ein geeigneter Ort für eine Windkra
|
|||||||
|
|
||||||
|
|
||||||
##### not used anymore #####
|
##### not used anymore #####
|
||||||
|
|
||||||
|
[techage] The limit for commands per minute has been exceeded.=[techage] Das Limit für Befehle pro Minute wurde überschritten.
|
||||||
|
@ -113,6 +113,13 @@ Access:=
|
|||||||
TA3 Button/Switch=
|
TA3 Button/Switch=
|
||||||
TA4 Button/Switch=
|
TA4 Button/Switch=
|
||||||
|
|
||||||
|
### button.lua ###
|
||||||
|
### button_4x.lua ###
|
||||||
|
### signallamp_4x.lua ###
|
||||||
|
|
||||||
|
Command=
|
||||||
|
Command to be sent=
|
||||||
|
|
||||||
### button.lua ###
|
### button.lua ###
|
||||||
### cart_detector.lua ###
|
### cart_detector.lua ###
|
||||||
### detector.lua ###
|
### detector.lua ###
|
||||||
@ -130,6 +137,7 @@ Insert destination node number(s)=
|
|||||||
### doorcontroller.lua ###
|
### doorcontroller.lua ###
|
||||||
### mesecons_converter.lua ###
|
### mesecons_converter.lua ###
|
||||||
### repeater.lua ###
|
### repeater.lua ###
|
||||||
|
### sequencer2.lua ###
|
||||||
### submenu.lua ###
|
### submenu.lua ###
|
||||||
|
|
||||||
Save=
|
Save=
|
||||||
@ -145,8 +153,6 @@ TA4 4x Button=
|
|||||||
|
|
||||||
Access=
|
Access=
|
||||||
Button protection=
|
Button protection=
|
||||||
Command=
|
|
||||||
Command to be sent=
|
|
||||||
Destination block number=
|
Destination block number=
|
||||||
Number=
|
Number=
|
||||||
|
|
||||||
@ -220,6 +226,14 @@ TA3 Melting=
|
|||||||
|
|
||||||
TA3 Cooler=
|
TA3 Cooler=
|
||||||
|
|
||||||
|
### counting.lua ###
|
||||||
|
|
||||||
|
Your current value is=
|
||||||
|
[techage] The limit for 'number of commands per minute' has been exceeded.=
|
||||||
|
is allowed=
|
||||||
|
is allowed. Current value is=
|
||||||
|
per minute=
|
||||||
|
|
||||||
### cylinder.lua ###
|
### cylinder.lua ###
|
||||||
|
|
||||||
TA2 Cylinder=
|
TA2 Cylinder=
|
||||||
@ -276,15 +290,19 @@ Blocks are back=
|
|||||||
Blocks are disappeared=
|
Blocks are disappeared=
|
||||||
Click on all the blocks that are part of the door/gate=
|
Click on all the blocks that are part of the door/gate=
|
||||||
Ctrl,Inv=
|
Ctrl,Inv=
|
||||||
Done=
|
|
||||||
Record=
|
|
||||||
Recording...=
|
|
||||||
Remove=
|
Remove=
|
||||||
Set=
|
Set=
|
||||||
TA3 Door Controller II=
|
TA3 Door Controller II=
|
||||||
block positions are stored.=
|
|
||||||
with door sound=
|
with door sound=
|
||||||
|
|
||||||
|
### doorcontroller2.lua ###
|
||||||
|
### movecontroller.lua ###
|
||||||
|
|
||||||
|
Done=
|
||||||
|
Record=
|
||||||
|
Recording...=
|
||||||
|
block positions are stored.=
|
||||||
|
|
||||||
### drillbox.lua ###
|
### drillbox.lua ###
|
||||||
|
|
||||||
Build derrick=
|
Build derrick=
|
||||||
@ -634,10 +652,15 @@ Syntax=
|
|||||||
### logic_block.lua ###
|
### logic_block.lua ###
|
||||||
### lua_logic.lua ###
|
### lua_logic.lua ###
|
||||||
|
|
||||||
Store=
|
|
||||||
TA3 Logic Block=
|
TA3 Logic Block=
|
||||||
Update=
|
Update=
|
||||||
|
|
||||||
|
### logic_block.lua ###
|
||||||
|
### lua_logic.lua ###
|
||||||
|
### movecontroller.lua ###
|
||||||
|
|
||||||
|
Store=
|
||||||
|
|
||||||
### lye.lua ###
|
### lye.lua ###
|
||||||
|
|
||||||
Lye=
|
Lye=
|
||||||
@ -695,6 +718,27 @@ TA1 Pine Wood Board=
|
|||||||
|
|
||||||
TA4 Streetlamp Solar Cell=
|
TA4 Streetlamp Solar Cell=
|
||||||
|
|
||||||
|
### movecontroller.lua ###
|
||||||
|
|
||||||
|
Click on all blocks that shall be moved=
|
||||||
|
Destination position is protected=
|
||||||
|
Handover to A=
|
||||||
|
Handover to B=
|
||||||
|
Maximum Speed=
|
||||||
|
Maximum speed for the moving block.=
|
||||||
|
Move A-B=
|
||||||
|
Move B-A=
|
||||||
|
Move block height=
|
||||||
|
Move distance (A to B)=
|
||||||
|
No valid destination position=
|
||||||
|
No valid node at the start position=
|
||||||
|
Number of the next movecontroller.=
|
||||||
|
Number of the previous movecontroller.=
|
||||||
|
Position list error=
|
||||||
|
Start position is protected=
|
||||||
|
TA4 Move Controller=
|
||||||
|
Value in the range of 0.0 to 1.0=
|
||||||
|
|
||||||
### node_detector.lua ###
|
### node_detector.lua ###
|
||||||
|
|
||||||
Send signal if nodes have been:=
|
Send signal if nodes have been:=
|
||||||
@ -905,8 +949,26 @@ not connected=
|
|||||||
### sequencer.lua ###
|
### sequencer.lua ###
|
||||||
|
|
||||||
TA3 Sequencer=
|
TA3 Sequencer=
|
||||||
|
|
||||||
|
### sequencer.lua ###
|
||||||
|
### sequencer2.lua ###
|
||||||
|
|
||||||
stopped=
|
stopped=
|
||||||
|
|
||||||
|
### sequencer2.lua ###
|
||||||
|
|
||||||
|
Commands=
|
||||||
|
Invalid command!=
|
||||||
|
Start=
|
||||||
|
Stop=
|
||||||
|
TA4 Sequencer=
|
||||||
|
running=
|
||||||
|
|
||||||
|
### sequencer2.lua ###
|
||||||
|
### submenu.lua ###
|
||||||
|
|
||||||
|
Cancel=
|
||||||
|
|
||||||
### signallamp.lua ###
|
### signallamp.lua ###
|
||||||
|
|
||||||
TA4 Wind Turbine Signal Lamp=
|
TA4 Wind Turbine Signal Lamp=
|
||||||
@ -979,7 +1041,6 @@ TA4 LED Street Lamp Pole=
|
|||||||
|
|
||||||
### submenu.lua ###
|
### submenu.lua ###
|
||||||
|
|
||||||
Cancel=
|
|
||||||
Note: You can't change any values while the block is running!=
|
Note: You can't change any values while the block is running!=
|
||||||
Refresh=
|
Refresh=
|
||||||
|
|
||||||
|
@ -175,7 +175,9 @@ local function entity_to_node(pos, obj)
|
|||||||
local meta = M(pos)
|
local meta = M(pos)
|
||||||
if not meta:contains("ta_move_block") then
|
if not meta:contains("ta_move_block") then
|
||||||
meta:set_string("ta_move_block", minetest.serialize({name=name, param2=param2}))
|
meta:set_string("ta_move_block", minetest.serialize({name=name, param2=param2}))
|
||||||
|
return
|
||||||
end
|
end
|
||||||
|
minetest.add_item(pos, ItemStack(name))
|
||||||
elseif ndef1 then
|
elseif ndef1 then
|
||||||
minetest.add_item(pos, ItemStack(name))
|
minetest.add_item(pos, ItemStack(name))
|
||||||
end
|
end
|
||||||
@ -563,7 +565,7 @@ local function move_nodes(pos, lpos1, lpos2, handover)
|
|||||||
if not is_simple_node(pos1) then
|
if not is_simple_node(pos1) then
|
||||||
meta:set_string("status", S("No valid node at the start position"))
|
meta:set_string("status", S("No valid node at the start position"))
|
||||||
else
|
else
|
||||||
meta:set_string("status", S("No air at the destination position"))
|
meta:set_string("status", S("No valid destination position"))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
@ -114,9 +114,6 @@ local function check_rules(pos, elapsed)
|
|||||||
nvm.index = get_next_slot(nvm.index, nvm.rules, nvm.endless)
|
nvm.index = get_next_slot(nvm.index, nvm.rules, nvm.endless)
|
||||||
if nvm.index ~= nil and offs ~= nil and nvm.running then
|
if nvm.index ~= nil and offs ~= nil and nvm.running then
|
||||||
-- after the last rule a pause with 1 or more sec is required
|
-- after the last rule a pause with 1 or more sec is required
|
||||||
if nvm.index == 1 and offs < 1 then
|
|
||||||
offs = 1
|
|
||||||
end
|
|
||||||
if offs > 0 then
|
if offs > 0 then
|
||||||
-- we can't restart the timer within the function om_timer
|
-- we can't restart the timer within the function om_timer
|
||||||
minetest.after(0, restart_timer, pos, offs)
|
minetest.after(0, restart_timer, pos, offs)
|
||||||
|
@ -31,7 +31,7 @@ end
|
|||||||
local function command(s)
|
local function command(s)
|
||||||
local num, cmd, pld = unpack(string.split(s, " ", false, 2))
|
local num, cmd, pld = unpack(string.split(s, " ", false, 2))
|
||||||
if not num or not cmd then
|
if not num or not cmd then
|
||||||
return "Invalid command!"
|
return S("Invalid command!")
|
||||||
end
|
end
|
||||||
return {number = num, cmnd = cmd, payload = pld}
|
return {number = num, cmnd = cmd, payload = pld}
|
||||||
end
|
end
|
||||||
@ -171,7 +171,9 @@ local function node_timer(pos, elapsed)
|
|||||||
local code = mem.code.tCode[mem.idx]
|
local code = mem.code.tCode[mem.idx]
|
||||||
if code and code.cmnd then
|
if code and code.cmnd then
|
||||||
local src = M(pos):get_string("node_number")
|
local src = M(pos):get_string("node_number")
|
||||||
|
techage.counting_start(M(pos):get_string("owner"))
|
||||||
techage.send_single(src, code.number, code.cmnd, code.payload)
|
techage.send_single(src, code.number, code.cmnd, code.payload)
|
||||||
|
techage.counting_stop()
|
||||||
end
|
end
|
||||||
if code and code.next_idx then
|
if code and code.next_idx then
|
||||||
local offs = code.next_idx - mem.idx
|
local offs = code.next_idx - mem.idx
|
||||||
|
@ -403,7 +403,8 @@ local function call_loop(pos, meta, elapsed)
|
|||||||
local code = Cache[number].code
|
local code = Cache[number].code
|
||||||
local res = safer_lua.run_loop(pos, elapsed, code, error)
|
local res = safer_lua.run_loop(pos, elapsed, code, error)
|
||||||
if res then
|
if res then
|
||||||
t = minetest.get_us_time() - t
|
-- Don't count thread changes
|
||||||
|
t = math.min(minetest.get_us_time() - t, 1000)
|
||||||
cpu = math.floor(((cpu * 20) + t) / 21)
|
cpu = math.floor(((cpu * 20) + t) / 21)
|
||||||
meta:set_int("cpu", cpu)
|
meta:set_int("cpu", cpu)
|
||||||
meta:set_string("infotext", "Controller "..number..": running ("..cpu.."us)")
|
meta:set_string("infotext", "Controller "..number..": running ("..cpu.."us)")
|
||||||
|
@ -26,3 +26,7 @@ techage_use_marshal (use lua-marshal as serialize/deserialize functions) bool fa
|
|||||||
# Use the external library 'lsqlite3' for for faster storing of data.
|
# Use the external library 'lsqlite3' for for faster storing of data.
|
||||||
# See also 'README.md'.
|
# See also 'README.md'.
|
||||||
techage_use_sqlite (use sqlite database) bool false
|
techage_use_sqlite (use sqlite database) bool false
|
||||||
|
|
||||||
|
# To reduce the server CPU load, the number of sent techage commands
|
||||||
|
# per player and minute can be limited.
|
||||||
|
techage_command_limit (Max. number of commands sent per minute) int 1200
|
Loading…
Reference in New Issue
Block a user