mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-23 03:57:13 +01:00
Merge branch 'ParadiseSS13/master' into afk-subsystem-2
This commit is contained in:
@@ -99,4 +99,4 @@
|
||||
var/client_keysend_amount = 0
|
||||
var/next_keysend_reset = 0
|
||||
var/next_keysend_trip_reset = 0
|
||||
var/keysend_tripped = FALSE
|
||||
var/keysend_tripped = FALSE
|
||||
|
||||
@@ -360,10 +360,10 @@
|
||||
. = ..() //calls mob.Login()
|
||||
|
||||
|
||||
if(ckey in clientmessages)
|
||||
for(var/message in clientmessages[ckey])
|
||||
if(ckey in GLOB.clientmessages)
|
||||
for(var/message in GLOB.clientmessages[ckey])
|
||||
to_chat(src, message)
|
||||
clientmessages.Remove(ckey)
|
||||
GLOB.clientmessages.Remove(ckey)
|
||||
|
||||
if(SSinput.initialized)
|
||||
set_macros()
|
||||
@@ -413,10 +413,17 @@
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(M.client)
|
||||
playercount += 1
|
||||
|
||||
if(playercount >= 150 && GLOB.panic_bunker_enabled == 0)
|
||||
GLOB.panic_bunker_enabled = 1
|
||||
message_admins("Panic bunker has been automatically enabled due to playercount surpassing 150")
|
||||
|
||||
// Update the state of the panic bunker based on current playercount
|
||||
var/threshold = config.panic_bunker_threshold
|
||||
|
||||
if((playercount > threshold) && (GLOB.panic_bunker_enabled == FALSE))
|
||||
GLOB.panic_bunker_enabled = TRUE
|
||||
message_admins("Panic bunker has been automatically enabled due to playercount rising above [threshold]")
|
||||
|
||||
if((playercount < threshold) && (GLOB.panic_bunker_enabled == TRUE))
|
||||
GLOB.panic_bunker_enabled = FALSE
|
||||
message_admins("Panic bunker has been automatically disabled due to playercount dropping below [threshold]")
|
||||
|
||||
/client/proc/is_connecting_from_localhost()
|
||||
var/localhost_addresses = list("127.0.0.1", "::1") // Adresses
|
||||
@@ -549,20 +556,19 @@
|
||||
|
||||
// Check new peeps for panic bunker
|
||||
if(GLOB.panic_bunker_enabled)
|
||||
message_admins("<span class='adminnotice'>Failed Login: [key] - New account attempting to connect during panic bunker</span>")
|
||||
src << "Sorry but the server is currently not accepting connections from never before seen players. Please try again later."
|
||||
var/threshold = config.panic_bunker_threshold
|
||||
src << "Server is not accepting connections from never-before-seen players until player count is less than [threshold]. Please try again later."
|
||||
del(src)
|
||||
return // Dont insert or they can just go in again
|
||||
|
||||
|
||||
var/DBQuery/query_insert = dbcon.NewQuery("INSERT INTO [format_table_name("player")] (id, ckey, firstseen, lastseen, ip, computerid, lastadminrank) VALUES (null, '[ckey]', Now(), Now(), '[sql_ip]', '[sql_computerid]', '[sql_admin_rank]')")
|
||||
if(!query_insert.Execute())
|
||||
var/err = query_insert.ErrorMsg()
|
||||
log_game("SQL ERROR during log_client_to_db (insert). Error : \[[err]\]\n")
|
||||
message_admins("SQL ERROR during log_client_to_db (insert). Error : \[[err]\]\n")
|
||||
|
||||
//Logging player access
|
||||
var/serverip = "[world.internet_address]:[world.port]"
|
||||
var/DBQuery/query_accesslog = dbcon.NewQuery("INSERT INTO `[format_table_name("connection_log")]`(`id`,`datetime`,`serverip`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),'[serverip]','[ckey]','[sql_ip]','[sql_computerid]');")
|
||||
// Log player connections to DB
|
||||
var/DBQuery/query_accesslog = dbcon.NewQuery("INSERT INTO `[format_table_name("connection_log")]`(`datetime`,`ckey`,`ip`,`computerid`) VALUES(Now(),'[ckey]','[sql_ip]','[sql_computerid]');")
|
||||
query_accesslog.Execute()
|
||||
|
||||
/client/proc/check_ip_intel()
|
||||
@@ -601,8 +607,13 @@
|
||||
|
||||
|
||||
/client/proc/check_forum_link()
|
||||
if(config.forum_link_url && prefs && !prefs.fuid)
|
||||
to_chat(src, "<B>You do not have your forum account linked. <a href='?src=[UID()];link_forum_account=true'>LINK FORUM ACCOUNT</a></B>")
|
||||
if(!config.forum_link_url || !prefs || prefs.fuid)
|
||||
return
|
||||
if(config.use_exp_tracking)
|
||||
var/living_hours = get_exp_type_num(EXP_TYPE_LIVING) / 60
|
||||
if(living_hours < 20)
|
||||
return
|
||||
to_chat(src, "<B>You have no verified forum account. <a href='?src=[UID()];link_forum_account=true'>VERIFY FORUM ACCOUNT</a></B>")
|
||||
|
||||
/client/proc/create_oauth_token()
|
||||
var/DBQuery/query_find_token = dbcon.NewQuery("SELECT token FROM [format_table_name("oauth_tokens")] WHERE ckey = '[ckey]' limit 1")
|
||||
@@ -617,12 +628,15 @@
|
||||
return
|
||||
return tokenstr
|
||||
|
||||
/client/proc/link_forum_account()
|
||||
/client/proc/link_forum_account(fromban)
|
||||
if(!config.forum_link_url)
|
||||
return
|
||||
if(IsGuestKey(key))
|
||||
to_chat(src, "Guest keys cannot be linked.")
|
||||
return
|
||||
if(prefs && prefs.fuid)
|
||||
to_chat(src, "Your forum account is already set.")
|
||||
if(!fromban)
|
||||
to_chat(src, "Your forum account is already set.")
|
||||
return
|
||||
var/DBQuery/query_find_link = dbcon.NewQuery("SELECT fuid FROM [format_table_name("player")] WHERE ckey = '[ckey]' limit 1")
|
||||
if(!query_find_link.Execute())
|
||||
@@ -630,14 +644,19 @@
|
||||
return
|
||||
if(query_find_link.NextRow())
|
||||
if(query_find_link.item[1])
|
||||
to_chat(src, "Your forum account is already set. (" + query_find_link.item[1] + ")")
|
||||
if(!fromban)
|
||||
to_chat(src, "Your forum account is already set. (" + query_find_link.item[1] + ")")
|
||||
return
|
||||
var/tokenid = create_oauth_token()
|
||||
if(!tokenid)
|
||||
to_chat(src, "link_forum_account: unable to create token")
|
||||
return
|
||||
var/url = "[config.forum_link_url][tokenid]"
|
||||
to_chat(src, {"Now opening a windows to verify your information with the forums. If the window does not load, please go to: <a href="[url]">[url]</a>."})
|
||||
if(fromban)
|
||||
url += "&fwd=appeal"
|
||||
to_chat(src, {"Now opening a window to verify your information with the forums, so that you can appeal your ban. If the window does not load, please copy/paste this link: <a href="[url]">[url]</a>"})
|
||||
else
|
||||
to_chat(src, {"Now opening a window to verify your information with the forums. If the window does not load, please go to: <a href="[url]">[url]</a>"})
|
||||
src << link(url)
|
||||
return
|
||||
|
||||
@@ -774,7 +793,7 @@
|
||||
// Change the way they should download resources.
|
||||
if(config.resource_urls)
|
||||
preload_rsc = pick(config.resource_urls)
|
||||
else
|
||||
else
|
||||
preload_rsc = 1 // If config.resource_urls is not set, preload like normal.
|
||||
// Most assets are now handled through global_cache.dm
|
||||
getFiles(
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
var/list/clientmessages = list()
|
||||
GLOBAL_LIST_EMPTY(clientmessages)
|
||||
|
||||
proc/addclientmessage(var/ckey, var/message)
|
||||
ckey = ckey(ckey)
|
||||
if(!ckey || !message)
|
||||
return
|
||||
if(!(ckey in clientmessages))
|
||||
clientmessages[ckey] = list()
|
||||
clientmessages[ckey] += message
|
||||
var/list/L = GLOB.clientmessages[ckey]
|
||||
if(!L)
|
||||
GLOB.clientmessages[ckey] = L = list()
|
||||
L += message
|
||||
|
||||
@@ -21,4 +21,4 @@
|
||||
|
||||
/datum/gear/lipstick/lime
|
||||
display_name = "lipstick, lime"
|
||||
path = /obj/item/lipstick/lime
|
||||
path = /obj/item/lipstick/lime
|
||||
|
||||
@@ -93,4 +93,4 @@
|
||||
display_name = "Gold ID Decal"
|
||||
path = /obj/item/id_decal/gold
|
||||
donator_tier = 4
|
||||
cost = 4
|
||||
cost = 4
|
||||
|
||||
@@ -21,4 +21,4 @@
|
||||
|
||||
/datum/gear/glasses/prescription
|
||||
display_name = "Prescription glasses"
|
||||
path = /obj/item/clothing/glasses/regular
|
||||
path = /obj/item/clothing/glasses/regular
|
||||
|
||||
@@ -5,4 +5,4 @@
|
||||
|
||||
/datum/gear/gloves/fingerless
|
||||
display_name = "Fingerless Gloves"
|
||||
path = /obj/item/clothing/gloves/fingerless
|
||||
path = /obj/item/clothing/gloves/fingerless
|
||||
|
||||
@@ -1,46 +1,47 @@
|
||||
/datum/gear/racial
|
||||
sort_category = "Racial"
|
||||
subtype_path = /datum/gear/racial
|
||||
cost = 1
|
||||
|
||||
/datum/gear/racial/taj
|
||||
slot = slot_glasses
|
||||
cost = 2
|
||||
|
||||
/datum/gear/racial/taj/civ
|
||||
display_name = "embroidered veil"
|
||||
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races."
|
||||
path = /obj/item/clothing/glasses/tajblind
|
||||
cost = 1
|
||||
slot = slot_glasses
|
||||
|
||||
/datum/gear/racial/taj/sec
|
||||
display_name = "sleek veil"
|
||||
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races. This one has an in-built security HUD."
|
||||
path = /obj/item/clothing/glasses/hud/security/tajblind
|
||||
allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot", "Internal Affairs Agent", "Magistrate")
|
||||
cost = 2
|
||||
|
||||
/datum/gear/racial/taj/med
|
||||
display_name = "lightweight veil"
|
||||
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races. This one has an in-built medical HUD."
|
||||
path = /obj/item/clothing/glasses/hud/health/tajblind
|
||||
allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Psychiatrist", "Paramedic", "Virologist", "Brig Physician" , "Coroner")
|
||||
cost = 2
|
||||
|
||||
/datum/gear/racial/taj/sci
|
||||
display_name = "hi-tech veil"
|
||||
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races."
|
||||
path = /obj/item/clothing/glasses/tajblind/sci
|
||||
cost = 2
|
||||
|
||||
/datum/gear/racial/taj/eng
|
||||
display_name = "industrial veil"
|
||||
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races."
|
||||
path = /obj/item/clothing/glasses/tajblind/eng
|
||||
|
||||
cost = 2
|
||||
|
||||
/datum/gear/racial/taj/cargo
|
||||
display_name = "khaki veil"
|
||||
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races. It is light and comfy!"
|
||||
path = /obj/item/clothing/glasses/tajblind/cargo
|
||||
|
||||
cost = 2
|
||||
|
||||
/datum/gear/racial/footwraps
|
||||
display_name = "cloth footwraps"
|
||||
path = /obj/item/clothing/shoes/footwraps
|
||||
slot = slot_shoes
|
||||
cost = 1
|
||||
|
||||
@@ -55,4 +55,4 @@
|
||||
|
||||
/datum/gear/shoes/whiteshoes
|
||||
display_name = "White shoes"
|
||||
path = /obj/item/clothing/shoes/white
|
||||
path = /obj/item/clothing/shoes/white
|
||||
|
||||
@@ -55,8 +55,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
return max(0, days - C.player_age)
|
||||
return 0
|
||||
|
||||
#define MAX_SAVE_SLOTS 20 // Save slots for regular players
|
||||
#define MAX_SAVE_SLOTS_MEMBER 20 // Save slots for BYOND members
|
||||
#define MAX_SAVE_SLOTS 30 // Save slots for regular players
|
||||
#define MAX_SAVE_SLOTS_MEMBER 30 // Save slots for BYOND members
|
||||
|
||||
#define TAB_CHAR 0
|
||||
#define TAB_GAME 1
|
||||
@@ -294,8 +294,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
dat += "<b>Disabilities:</b> <a href='?_src_=prefs;preference=disabilities'>\[Set\]</a><br>"
|
||||
dat += "<b>Nanotrasen Relation:</b> <a href ='?_src_=prefs;preference=nt_relation;task=input'>[nanotrasen_relation]</a><br>"
|
||||
dat += "<a href='byond://?_src_=prefs;preference=flavor_text;task=input'>Set Flavor Text</a><br>"
|
||||
if(lentext(flavor_text) <= 40)
|
||||
if(!lentext(flavor_text)) dat += "\[...\]<br>"
|
||||
if(length(flavor_text) <= 40)
|
||||
if(!length(flavor_text)) dat += "\[...\]<br>"
|
||||
else dat += "[flavor_text]<br>"
|
||||
else dat += "[TextPreview(flavor_text)]...<br>"
|
||||
|
||||
@@ -651,7 +651,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
var/available_in_days = job.available_in_days(user.client)
|
||||
HTML += "<del>[rank]</del></td><td> \[IN [(available_in_days)] DAYS]</td></tr>"
|
||||
continue
|
||||
if((job_support_low & CIVILIAN) && (rank != "Civilian"))
|
||||
if((job_support_low & JOB_CIVILIAN) && (rank != "Civilian"))
|
||||
HTML += "<font color=orange>[rank]</font></td><td></td></tr>"
|
||||
continue
|
||||
if((rank in command_positions) || (rank == "AI"))//Bold head jobs
|
||||
@@ -693,7 +693,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
// HTML += "<a href='?_src_=prefs;preference=job;task=input;text=[rank]'>"
|
||||
|
||||
if(rank == "Civilian")//Civilian is special
|
||||
if(job_support_low & CIVILIAN)
|
||||
if(job_support_low & JOB_CIVILIAN)
|
||||
HTML += " <font color=green>\[Yes]</font></a>"
|
||||
else
|
||||
HTML += " <font color=red>\[No]</font></a>"
|
||||
@@ -760,7 +760,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
job_medsci_high = 0
|
||||
job_karma_high = 0
|
||||
|
||||
if(job.department_flag == SUPPORT)
|
||||
if(job.department_flag == JOBCAT_SUPPORT)
|
||||
job_support_low &= ~job.flag
|
||||
job_support_med &= ~job.flag
|
||||
job_support_high &= ~job.flag
|
||||
@@ -774,7 +774,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
job_support_low |= job.flag
|
||||
|
||||
return 1
|
||||
else if(job.department_flag == ENGSEC)
|
||||
else if(job.department_flag == JOBCAT_ENGSEC)
|
||||
job_engsec_low &= ~job.flag
|
||||
job_engsec_med &= ~job.flag
|
||||
job_engsec_high &= ~job.flag
|
||||
@@ -788,7 +788,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
job_engsec_low |= job.flag
|
||||
|
||||
return 1
|
||||
else if(job.department_flag == MEDSCI)
|
||||
else if(job.department_flag == JOBCAT_MEDSCI)
|
||||
job_medsci_low &= ~job.flag
|
||||
job_medsci_med &= ~job.flag
|
||||
job_medsci_high &= ~job.flag
|
||||
@@ -802,7 +802,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
job_medsci_low |= job.flag
|
||||
|
||||
return 1
|
||||
else if(job.department_flag == KARMA)
|
||||
else if(job.department_flag == JOBCAT_KARMA)
|
||||
job_karma_low &= ~job.flag
|
||||
job_karma_med &= ~job.flag
|
||||
job_karma_high &= ~job.flag
|
||||
@@ -886,21 +886,21 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
|
||||
HTML += "<a href=\"byond://?_src_=prefs;preference=records;task=med_record\">Medical Records</a><br>"
|
||||
|
||||
if(lentext(med_record) <= 40)
|
||||
if(length(med_record) <= 40)
|
||||
HTML += "[med_record]"
|
||||
else
|
||||
HTML += "[copytext(med_record, 1, 37)]..."
|
||||
|
||||
HTML += "<br><a href=\"byond://?_src_=prefs;preference=records;task=gen_record\">Employment Records</a><br>"
|
||||
|
||||
if(lentext(gen_record) <= 40)
|
||||
if(length(gen_record) <= 40)
|
||||
HTML += "[gen_record]"
|
||||
else
|
||||
HTML += "[copytext(gen_record, 1, 37)]..."
|
||||
|
||||
HTML += "<br><a href=\"byond://?_src_=prefs;preference=records;task=sec_record\">Security Records</a><br>"
|
||||
|
||||
if(lentext(sec_record) <= 40)
|
||||
if(length(sec_record) <= 40)
|
||||
HTML += "[sec_record]<br>"
|
||||
else
|
||||
HTML += "[copytext(sec_record, 1, 37)]...<br>"
|
||||
@@ -973,7 +973,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
/datum/preferences/proc/GetJobDepartment(var/datum/job/job, var/level)
|
||||
if(!job || !level) return 0
|
||||
switch(job.department_flag)
|
||||
if(SUPPORT)
|
||||
if(JOBCAT_SUPPORT)
|
||||
switch(level)
|
||||
if(1)
|
||||
return job_support_high
|
||||
@@ -981,7 +981,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
return job_support_med
|
||||
if(3)
|
||||
return job_support_low
|
||||
if(MEDSCI)
|
||||
if(JOBCAT_MEDSCI)
|
||||
switch(level)
|
||||
if(1)
|
||||
return job_medsci_high
|
||||
@@ -989,7 +989,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
return job_medsci_med
|
||||
if(3)
|
||||
return job_medsci_low
|
||||
if(ENGSEC)
|
||||
if(JOBCAT_ENGSEC)
|
||||
switch(level)
|
||||
if(1)
|
||||
return job_engsec_high
|
||||
@@ -997,7 +997,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
return job_engsec_med
|
||||
if(3)
|
||||
return job_engsec_low
|
||||
if(KARMA)
|
||||
if(JOBCAT_KARMA)
|
||||
switch(level)
|
||||
if(1)
|
||||
return job_karma_high
|
||||
@@ -1027,7 +1027,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
job_karma_high = 0
|
||||
|
||||
switch(job.department_flag)
|
||||
if(SUPPORT)
|
||||
if(JOBCAT_SUPPORT)
|
||||
switch(level)
|
||||
if(2)
|
||||
job_support_high = job.flag
|
||||
@@ -1037,7 +1037,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
job_support_low &= ~job.flag
|
||||
else
|
||||
job_support_low |= job.flag
|
||||
if(MEDSCI)
|
||||
if(JOBCAT_MEDSCI)
|
||||
switch(level)
|
||||
if(2)
|
||||
job_medsci_high = job.flag
|
||||
@@ -1047,7 +1047,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
job_medsci_low &= ~job.flag
|
||||
else
|
||||
job_medsci_low |= job.flag
|
||||
if(ENGSEC)
|
||||
if(JOBCAT_ENGSEC)
|
||||
switch(level)
|
||||
if(2)
|
||||
job_engsec_high = job.flag
|
||||
@@ -1057,7 +1057,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
job_engsec_low &= ~job.flag
|
||||
else
|
||||
job_engsec_low |= job.flag
|
||||
if(KARMA)
|
||||
if(JOBCAT_KARMA)
|
||||
switch(level)
|
||||
if(2)
|
||||
job_karma_high = job.flag
|
||||
@@ -1308,7 +1308,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
else //Not using the whitelist? Aliens for everyone!
|
||||
new_species += GLOB.whitelisted_species
|
||||
|
||||
species = input("Please select a species", "Character Generation", null) in new_species
|
||||
species = input("Please select a species", "Character Generation", null) in sortTim(new_species, /proc/cmp_text_asc)
|
||||
var/datum/species/NS = GLOB.all_species[species]
|
||||
if(!istype(NS)) //The species was invalid. Notify the user and fail out.
|
||||
species = prev_species
|
||||
@@ -1406,7 +1406,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
if(!(lang.flags & RESTRICTED))
|
||||
new_languages += lang.name
|
||||
|
||||
language = input("Please select a secondary language", "Character Generation", null) in new_languages
|
||||
language = input("Please select a secondary language", "Character Generation", null) in sortTim(new_languages, /proc/cmp_text_asc)
|
||||
|
||||
if("autohiss_mode")
|
||||
if(S.autohiss_basic_map)
|
||||
|
||||
@@ -36,6 +36,15 @@
|
||||
to_chat(usr, "You will [(prefs.toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from radios or speakers")
|
||||
feedback_add_details("admin_verb","THR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/verb/toggle_ai_voice_annoucements()
|
||||
set name = "Hear/Silence AI Voice Announcements"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggle hearing AI annoucements in voice form or in text form"
|
||||
prefs.sound ^= SOUND_AI_VOICE
|
||||
prefs.save_preferences(src)
|
||||
to_chat(usr, "[(prefs.sound & SOUND_AI_VOICE) ? "You will now hear AI announcements." : "AI annoucements will now be converted to text."] ")
|
||||
feedback_add_details("admin_verb","TAIvoice") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/toggleadminhelpsound()
|
||||
set name = "Hear/Silence Admin Bwoinks"
|
||||
set category = "Preferences"
|
||||
|
||||
@@ -87,4 +87,4 @@
|
||||
return
|
||||
|
||||
to_chat(src, "<span class='notice'>View range set to [viewNum_to_text(view_range)]</span>")
|
||||
AddViewMod("custom", view_range)
|
||||
AddViewMod("custom", view_range)
|
||||
|
||||
Reference in New Issue
Block a user