mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-20 03:25:49 +01:00
Merge branch 'master' into hooks-part4
This commit is contained in:
@@ -319,10 +319,8 @@
|
||||
#define SHELTER_DEPLOY_BAD_AREA "bad area"
|
||||
#define SHELTER_DEPLOY_ANCHORED_OBJECTS "anchored objects"
|
||||
|
||||
// Client donator levels
|
||||
#define DONATOR_LEVEL_NONE 0
|
||||
#define DONATOR_LEVEL_ONE 1
|
||||
#define DONATOR_LEVEL_TWO 2
|
||||
// Maximum donation level
|
||||
#define DONATOR_LEVEL_MAX 4
|
||||
|
||||
// The cooldown on OOC messages such as OOC, LOOC, praying and adminhelps
|
||||
#define OOC_COOLDOWN 5
|
||||
|
||||
@@ -9,10 +9,3 @@
|
||||
* Called in gameticker.dm when a round starts.
|
||||
*/
|
||||
/hook/roundstart
|
||||
|
||||
/**
|
||||
* Captain spawned hook.
|
||||
* Called in supervisor.dm when a captain spawns
|
||||
* Parameters: var/mob/living/carbon/human/captain
|
||||
*/
|
||||
/hook/captain_spawned
|
||||
@@ -1,7 +1,8 @@
|
||||
SUBSYSTEM_DEF(jobs)
|
||||
name = "Jobs"
|
||||
init_order = INIT_ORDER_JOBS // 12
|
||||
flags = SS_NO_FIRE
|
||||
wait = 3000 // 5 minutes (Deciseconds)
|
||||
runlevels = RUNLEVEL_GAME
|
||||
|
||||
//List of all jobs
|
||||
var/list/occupations = list()
|
||||
@@ -21,6 +22,12 @@ SUBSYSTEM_DEF(jobs)
|
||||
LoadJobs("config/jobs.txt")
|
||||
return ..()
|
||||
|
||||
// Only fires every 5 minutes
|
||||
/datum/controller/subsystem/jobs/fire()
|
||||
if(!config.sql_enabled || !config.use_exp_tracking)
|
||||
return
|
||||
update_exp(5,0)
|
||||
|
||||
/datum/controller/subsystem/jobs/proc/SetupOccupations(var/list/faction = list("Station"))
|
||||
occupations = list()
|
||||
var/list/all_jobs = subtypesof(/datum/job)
|
||||
|
||||
@@ -132,15 +132,6 @@
|
||||
throw_range = 0
|
||||
throw_speed = 0
|
||||
|
||||
/obj/item/melee/arm_blade/New()
|
||||
..()
|
||||
if(ismob(loc))
|
||||
loc.visible_message("<span class='warning'>A grotesque blade forms around [loc.name]\'s arm!</span>", "<span class='warning'>Our arm twists and mutates, transforming it into a deadly blade.</span>", "<span class='warning'>You hear organic matter ripping and tearing!</span>")
|
||||
|
||||
/obj/item/melee/arm_blade/dropped(mob/user)
|
||||
user.visible_message("<span class='warning'>With a sickening crunch, [user] reforms [user.p_their()] blade into an arm!</span>", "<span class='notice'>We assimilate the blade back into our body.</span>", "<span class='warning'>You hear organic matter ripping and tearing!</span>")
|
||||
. = ..()
|
||||
|
||||
/obj/item/melee/arm_blade/afterattack(atom/target, mob/user, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
|
||||
@@ -637,9 +637,9 @@ var/global/list/multiverse = list()
|
||||
if(M.stat != DEAD)
|
||||
to_chat(user, "<span class='warning'>This artifact can only affect the dead!</span>")
|
||||
return
|
||||
|
||||
if(!M.mind || !M.client)
|
||||
to_chat(user, "<span class='warning'>There is no soul connected to this body...</span>")
|
||||
|
||||
if((!M.mind || !M.client) && !M.grab_ghost())
|
||||
to_chat(user,"<span class='warning'>There is no soul connected to this body...</span>")
|
||||
return
|
||||
|
||||
check_spooky()//clean out/refresh the list
|
||||
@@ -652,6 +652,7 @@ var/global/list/multiverse = list()
|
||||
else
|
||||
M.set_species(/datum/species/skeleton)
|
||||
M.visible_message("<span class = 'warning'> A massive amount of flesh sloughs off [M] and a skeleton rises up!</span>")
|
||||
M.grab_ghost() // yoinks the ghost if its not in the body
|
||||
M.revive()
|
||||
equip_skeleton(M)
|
||||
spooky_scaries |= M
|
||||
@@ -732,9 +733,8 @@ var/global/list/multiverse = list()
|
||||
|
||||
H.update_dna()
|
||||
H.update_body()
|
||||
|
||||
H.grab_ghost()
|
||||
H.revive()
|
||||
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/head/kitty(H), slot_head)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/schoolgirl(H), slot_w_uniform)
|
||||
|
||||
@@ -24,7 +24,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
|
||||
/datum/job/captain/announce(mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
captain_announcement.Announce("All hands, Captain [H.real_name] on deck!")
|
||||
callHook("captain_spawned", list("captain" = H))
|
||||
updateDisplaycase(H)
|
||||
|
||||
/datum/outfit/job/captain
|
||||
name = "Captain"
|
||||
|
||||
@@ -292,12 +292,3 @@ var/global/list/role_playtime_requirements = list(
|
||||
log_game("SQL ERROR during exp_update_client write. Error : \[[err]\]\n")
|
||||
message_admins("SQL ERROR during exp_update_client write. Error : \[[err]\]\n")
|
||||
return
|
||||
|
||||
/hook/roundstart/proc/exptimer()
|
||||
if(!config.sql_enabled || !config.use_exp_tracking)
|
||||
return 1
|
||||
spawn(0)
|
||||
while(TRUE)
|
||||
sleep(5 MINUTES)
|
||||
update_exp(5,0)
|
||||
return 1
|
||||
|
||||
@@ -9,6 +9,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
|
||||
* as well as allowing users to save and load configurations.
|
||||
*/
|
||||
/datum/nttc_configuration
|
||||
var/regex/word_blacklist = new("(<iframe|<embed|<script|<svg|<canvas|<video|<audio|onload)", "i") // Blacklist of naughties
|
||||
// ALL OF THE JOB CRAP
|
||||
// Dict of all jobs and their department color classes
|
||||
var/all_jobs = list(
|
||||
@@ -225,7 +226,11 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
|
||||
|
||||
// This loads a configuration from a JSON string.
|
||||
// Fucking broken as shit, someone help me fix this.
|
||||
/datum/nttc_configuration/proc/nttc_deserialize(text, obj/machinery/computer/telecomms/traffic/source)
|
||||
/datum/nttc_configuration/proc/nttc_deserialize(text, obj/machinery/computer/telecomms/traffic/source, var/ckey)
|
||||
if(word_blacklist.Find(text)) //uh oh, they tried to be naughty
|
||||
message_admins("<span class='danger'>EXPLOIT WARNING: </span> [ckey] attempted to upload an NTTC configuration containing JS abusable tags!")
|
||||
log_admin("EXPLOIT WARNING: [ckey] attempted to upload an NTTC configuration containing JS abusable tags")
|
||||
return FALSE
|
||||
var/list/var_list = json_decode(text)
|
||||
for(var/variable in var_list)
|
||||
if(variable in to_serialize) // Don't just accept any random vars jesus christ!
|
||||
@@ -236,6 +241,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
|
||||
variable_value = nttc_sanitize(variable_value, sanitize_method)
|
||||
if(variable_value != null)
|
||||
vars[variable] = variable_value
|
||||
return TRUE
|
||||
|
||||
// Sanitizing user input. Don't blindly trust the JSON.
|
||||
/datum/nttc_configuration/proc/nttc_sanitize(variable, sanitize_method)
|
||||
@@ -408,6 +414,11 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
|
||||
var/new_value = input(user, "Provide a new value for the key [new_key]", "New Row") as text|null
|
||||
if(new_value == null)
|
||||
return
|
||||
if(word_blacklist.Find(new_value)) //uh oh, they tried to be naughty
|
||||
message_admins("<span class='danger'>EXPLOIT WARNING: </span> [user.ckey] attempted to add a NTTC regex row containing JS abusable tags!")
|
||||
log_admin("EXPLOIT WARNING: [user.ckey] attempted to add a NTTC regex row containing JS abusable tags")
|
||||
to_chat(user, "<span class='biggerdanger'>ERROR: Regex contained bad strings. Upload cancelled.</span>")
|
||||
return
|
||||
var/list/table = vars[href_list["table"]]
|
||||
table[new_key] = new_value
|
||||
to_chat(user, "<span class='notice'>Added row [new_key] -> [new_value].</span>")
|
||||
@@ -450,8 +461,8 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
|
||||
|
||||
if(href_list["load_config"])
|
||||
var/json = input(user, "Provide configuration JSON below.", "Load Config", nttc_serialize()) as message
|
||||
nttc_deserialize(json, source)
|
||||
log_action(user, "has uploaded a NTTC JSON configuration: [ADMIN_SHOWDETAILS("Show", json)]", TRUE)
|
||||
if(nttc_deserialize(json, source, user.ckey))
|
||||
log_action(user, "has uploaded a NTTC JSON configuration: [ADMIN_SHOWDETAILS("Show", json)]", TRUE)
|
||||
|
||||
user << output(list2params(list(nttc_serialize())), "[window_id].browser:updateConfig")
|
||||
|
||||
|
||||
@@ -2,17 +2,15 @@
|
||||
#define DISPLAYCASE_FRAME_SCREWDRIVER 1
|
||||
|
||||
// List and hook used to set up the captain's print on their display case
|
||||
var/global/list/captain_display_cases = list()
|
||||
GLOBAL_LIST_INIT(captain_display_cases, list())
|
||||
|
||||
/hook/captain_spawned/proc/displaycase(mob/living/carbon/human/captain)
|
||||
if(!captain_display_cases.len)
|
||||
return 1
|
||||
/proc/updateDisplaycase(mob/living/carbon/human/captain)
|
||||
if(!GLOB.captain_display_cases.len)
|
||||
return
|
||||
var/fingerprint = captain.get_full_print()
|
||||
for(var/obj/structure/displaycase/D in captain_display_cases)
|
||||
if(istype(D))
|
||||
D.ue = fingerprint
|
||||
|
||||
return 1
|
||||
for(var/item in GLOB.captain_display_cases)
|
||||
var/obj/structure/displaycase/CASE = item
|
||||
CASE.ue = fingerprint
|
||||
|
||||
/obj/structure/displaycase_frame
|
||||
name = "display case frame"
|
||||
@@ -123,6 +121,10 @@ var/global/list/captain_display_cases = list()
|
||||
req_access = list(access_captain)
|
||||
start_showpiece_type = /obj/item/gun/energy/laser/captain
|
||||
|
||||
/obj/structure/displaycase/captains_laser/Initialize(mapload)
|
||||
. = ..()
|
||||
GLOB.captain_display_cases += src
|
||||
|
||||
/obj/structure/displaycase/stechkin
|
||||
name = "officer's display case"
|
||||
desc = "A display case containing a humble stechkin pistol. Never forget your roots."
|
||||
@@ -136,7 +138,7 @@ var/global/list/captain_display_cases = list()
|
||||
return ..()
|
||||
|
||||
/obj/structure/displaycase/captains_laser/Destroy()
|
||||
captain_display_cases -= src
|
||||
GLOB.captain_display_cases -= src
|
||||
return ..()
|
||||
|
||||
/obj/structure/displaycase/examine(mob/user)
|
||||
|
||||
@@ -11,7 +11,7 @@ var/global/admin_ooc_colour = "#b82e00"
|
||||
/client/verb/ooc(msg = "" as text)
|
||||
set name = "OOC"
|
||||
set category = "OOC"
|
||||
|
||||
|
||||
if(!mob)
|
||||
return
|
||||
if(IsGuestKey(key))
|
||||
@@ -28,10 +28,10 @@ var/global/admin_ooc_colour = "#b82e00"
|
||||
if(prefs.muted & MUTE_OOC)
|
||||
to_chat(src, "<span class='danger'>You cannot use OOC (muted).</span>")
|
||||
return
|
||||
|
||||
|
||||
if(!msg)
|
||||
msg = typing_input(src.mob, "", "ooc \"text\"")
|
||||
|
||||
|
||||
msg = trim(sanitize(copytext(msg, 1, MAX_MESSAGE_LEN)))
|
||||
if(!msg)
|
||||
return
|
||||
@@ -76,7 +76,7 @@ var/global/admin_ooc_colour = "#b82e00"
|
||||
var/icon/byond = icon('icons/member_content.dmi', "blag")
|
||||
display_name = "[bicon(byond)][display_name]"
|
||||
|
||||
if(donator_level >= DONATOR_LEVEL_ONE)
|
||||
if(donator_level > 0)
|
||||
if((prefs.toggles & DONATOR_PUBLIC))
|
||||
var/icon/donator = icon('icons/ooc_tag_16x.dmi', "donator")
|
||||
display_name = "[bicon(donator)][display_name]"
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
var/datum/chatOutput/chatOutput
|
||||
|
||||
// Donator stuff.
|
||||
var/donator_level = DONATOR_LEVEL_NONE
|
||||
var/donator_level = 0
|
||||
|
||||
// If set to true, this client can interact with atoms such as buttons and doors on top of regular machinery interaction
|
||||
var/advanced_admin_interaction = FALSE
|
||||
|
||||
@@ -328,8 +328,6 @@
|
||||
GLOB.admins += src
|
||||
holder.owner = src
|
||||
|
||||
donator_check()
|
||||
|
||||
//preferences datum - also holds some persistant data for the client (because we may as well keep these datums to a minimum)
|
||||
prefs = preferences_datums[ckey]
|
||||
if(!prefs)
|
||||
@@ -343,12 +341,6 @@
|
||||
spawn() // Goonchat does some non-instant checks in start()
|
||||
chatOutput.start()
|
||||
|
||||
if(custom_event_msg && custom_event_msg != "")
|
||||
to_chat(src, "<h1 class='alert'>Custom Event</h1>")
|
||||
to_chat(src, "<h2 class='alert'>A custom event is taking place. OOC Info:</h2>")
|
||||
to_chat(src, "<span class='alert'>[html_encode(custom_event_msg)]</span>")
|
||||
to_chat(src, "<br>")
|
||||
|
||||
if( (world.address == address || !address) && !host )
|
||||
host = key
|
||||
world.update_status()
|
||||
@@ -376,6 +368,7 @@
|
||||
to_chat(src, message)
|
||||
clientmessages.Remove(ckey)
|
||||
|
||||
donator_check()
|
||||
|
||||
send_resources()
|
||||
|
||||
@@ -400,6 +393,12 @@
|
||||
|
||||
screen += void
|
||||
|
||||
if(custom_event_msg && custom_event_msg != "")
|
||||
to_chat(src, "<h1 class='alert'>Custom Event</h1>")
|
||||
to_chat(src, "<h2 class='alert'>A custom event is taking place. OOC Info:</h2>")
|
||||
to_chat(src, "<span class='alert'>[html_encode(custom_event_msg)]</span>")
|
||||
to_chat(src, "<br>")
|
||||
|
||||
if(!winexists(src, "asset_cache_browser")) // The client is using a custom skin, tell them.
|
||||
to_chat(src, "<span class='warning'>Unable to access asset cache browser, if you are using a custom skin file, please allow DS to download the updated version, if you are not, then make a bug report. This is not a critical issue but can cause issues with resource downloading, as it is impossible to know when extra resources arrived to you.</span>")
|
||||
|
||||
@@ -431,13 +430,17 @@
|
||||
if(!dbcon.IsConnected())
|
||||
return
|
||||
|
||||
if(check_rights(R_ADMIN, 0, mob)) // Yes, the mob is required, regardless of other examples in this file, it won't work otherwise
|
||||
donator_level = DONATOR_LEVEL_MAX
|
||||
return
|
||||
|
||||
//Donator stuff.
|
||||
var/DBQuery/query_donor_select = dbcon.NewQuery("SELECT ckey, tier, active FROM `[format_table_name("donators")]` WHERE ckey = '[ckey]'")
|
||||
query_donor_select.Execute()
|
||||
while(query_donor_select.NextRow())
|
||||
if(!text2num(query_donor_select.item[3]))
|
||||
// Inactive donator.
|
||||
donator_level = DONATOR_LEVEL_NONE
|
||||
donator_level = 0
|
||||
return
|
||||
donator_level = text2num(query_donor_select.item[2])
|
||||
break
|
||||
|
||||
@@ -4,7 +4,6 @@ var/list/gear_datums = list()
|
||||
/datum/loadout_category
|
||||
var/category = ""
|
||||
var/list/gear = list()
|
||||
var/donor_only = FALSE
|
||||
|
||||
/datum/loadout_category/New(cat)
|
||||
category = cat
|
||||
@@ -34,8 +33,6 @@ var/list/gear_datums = list()
|
||||
if(!loadout_categories[use_category])
|
||||
loadout_categories[use_category] = new /datum/loadout_category(use_category)
|
||||
var/datum/loadout_category/LC = loadout_categories[use_category]
|
||||
if(initial(G.donor_only))
|
||||
LC.donor_only = TRUE
|
||||
gear_datums[use_name] = new geartype
|
||||
LC.gear[use_name] = gear_datums[use_name]
|
||||
|
||||
@@ -57,7 +54,7 @@ var/list/gear_datums = list()
|
||||
var/list/gear_tweaks = list() //List of datums which will alter the item after it has been spawned.
|
||||
var/subtype_path = /datum/gear //for skipping organizational subtypes (optional)
|
||||
var/subtype_cost_overlap = TRUE //if subtypes can take points at the same time
|
||||
var/donor_only = FALSE // if it's only available to donors
|
||||
var/donator_tier = 0
|
||||
|
||||
/datum/gear/New()
|
||||
..()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/gear/donor
|
||||
donor_only = TRUE
|
||||
donator_tier = 2
|
||||
sort_category = "Donor"
|
||||
subtype_path = /datum/gear/donor
|
||||
|
||||
@@ -77,6 +77,26 @@
|
||||
display_name = "Guy Fawkes mask"
|
||||
path = /obj/item/clothing/mask/fawkes
|
||||
|
||||
/datum/gear/donor/noble_clothes
|
||||
display_name = "Noble Clothes"
|
||||
path = /obj/item/clothing/under/noble_clothes
|
||||
/datum/gear/donor/id_decal_silver
|
||||
display_name = "Silver ID Decal"
|
||||
path = /obj/item/id_decal/silver
|
||||
donator_tier = 3
|
||||
cost = 2
|
||||
|
||||
/datum/gear/donor/id_decal_prisoner
|
||||
display_name = "Prisoner ID Decal"
|
||||
path = /obj/item/id_decal/prisoner
|
||||
donator_tier = 3
|
||||
cost = 2
|
||||
|
||||
/datum/gear/donor/id_decal_emag
|
||||
display_name = "Emag ID Decal"
|
||||
path = /obj/item/id_decal/emag
|
||||
donator_tier = 3
|
||||
cost = 2
|
||||
|
||||
/datum/gear/donor/id_decal_gold
|
||||
display_name = "Gold ID Decal"
|
||||
path = /obj/item/id_decal/gold
|
||||
donator_tier = 4
|
||||
cost = 4
|
||||
@@ -211,7 +211,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
unlock_content = C.IsByondMember()
|
||||
if(unlock_content)
|
||||
max_save_slots = MAX_SAVE_SLOTS_MEMBER
|
||||
if(C.donator_level >= DONATOR_LEVEL_ONE)
|
||||
if(C.donator_level > 0)
|
||||
max_gear_slots += 5
|
||||
|
||||
loaded_preferences_successfully = load_preferences(C) // Do not call this with no client/C, it generates a runtime / SQL error
|
||||
@@ -448,7 +448,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
dat += " - <b>Color:</b> <a href='?_src_=prefs;preference=UIcolor'><b>[UI_style_color]</b></a> <span style='border: 1px solid #161616; background-color: [UI_style_color];'> </span><br>"
|
||||
dat += " - <b>UI Style:</b> <a href='?_src_=prefs;preference=ui'><b>[UI_style]</b></a><br>"
|
||||
dat += "<b>Deadchat Anonymity:</b> <a href='?_src_=prefs;preference=ghost_anonsay'><b>[ghost_anonsay ? "Anonymous" : "Not Anonymous"]</b></a><br>"
|
||||
if(user.client.donator_level >= DONATOR_LEVEL_ONE)
|
||||
if(user.client.donator_level > 0)
|
||||
dat += "<b>Donator Publicity:</b> <a href='?_src_=prefs;preference=donor_public'><b>[(toggles & DONATOR_PUBLIC) ? "Public" : "Hidden"]</b></a><br>"
|
||||
dat += "<b>Fancy NanoUI:</b> <a href='?_src_=prefs;preference=nanoui'>[(nanoui_fancy) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>FPS:</b> <a href='?_src_=prefs;preference=clientfps;task=input'>[clientfps]</a><br>"
|
||||
@@ -508,10 +508,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
|
||||
var/firstcat = 1
|
||||
for(var/category in loadout_categories)
|
||||
var/datum/loadout_category/LC = loadout_categories[category]
|
||||
if(LC.donor_only)
|
||||
if(user.client.donator_level < DONATOR_LEVEL_TWO) // level two donators get the donator loadout, so don't show it to anyone with less than that
|
||||
continue
|
||||
if(firstcat)
|
||||
firstcat = 0
|
||||
else
|
||||
@@ -529,7 +525,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
for(var/gear_name in LC.gear)
|
||||
var/datum/gear/G = LC.gear[gear_name]
|
||||
var/ticked = (G.display_name in gear)
|
||||
dat += "<tr style='vertical-align:top;'><td width=15%><a style='white-space:normal;' [ticked ? "class='linkOn' " : ""]href='?_src_=prefs;preference=gear;toggle_gear=[G.display_name]'>[G.display_name]</a></td>"
|
||||
if(G.donator_tier > user.client.donator_level)
|
||||
dat += "<tr style='vertical-align:top;'><td width=15%><B>[G.display_name]</B></td>"
|
||||
else
|
||||
dat += "<tr style='vertical-align:top;'><td width=15%><a style='white-space:normal;' [ticked ? "class='linkOn' " : ""]href='?_src_=prefs;preference=gear;toggle_gear=[G.display_name]'>[G.display_name]</a></td>"
|
||||
dat += "<td width = 5% style='vertical-align:top'>[G.cost]</td><td>"
|
||||
if(G.allowed_roles)
|
||||
dat += "<font size=2>Restrictions: "
|
||||
@@ -1147,10 +1146,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
if(TG.display_name in gear)
|
||||
gear -= TG.display_name
|
||||
else
|
||||
if(TG.donor_only)
|
||||
if(user.client.donator_level < DONATOR_LEVEL_TWO) // donator items are locked to > tier 2
|
||||
//they normally can't even get this far- but just in case of href exploits, we check them here
|
||||
return
|
||||
if(TG.donator_tier && user.client.donator_level < TG.donator_tier)
|
||||
to_chat(user, "<span class='warning'>That gear is only available at a higher donation tier than you are on.</span>")
|
||||
return
|
||||
var/total_cost = 0
|
||||
var/list/type_blacklist = list()
|
||||
for(var/gear_name in gear)
|
||||
@@ -1944,7 +1942,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
toggles ^= MEMBER_PUBLIC
|
||||
|
||||
if("donor_public")
|
||||
if(user.client.donator_level >= DONATOR_LEVEL_ONE)
|
||||
if(user.client.donator_level > 0)
|
||||
toggles ^= DONATOR_PUBLIC
|
||||
|
||||
if("gender")
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
msg += "<EM>[name]</EM>"
|
||||
|
||||
var/displayed_species = dna.species.name
|
||||
var/examine_color = dna.species.flesh_color
|
||||
for(var/obj/item/clothing/C in src) //Disguise checks
|
||||
if(C == src.head || C == src.wear_suit || C == src.wear_mask || C == src.w_uniform || C == src.belt || C == src.back)
|
||||
if(C.species_disguise)
|
||||
@@ -37,11 +38,11 @@
|
||||
if(skipjumpsuit && skipface || (NO_EXAMINE in dna.species.species_traits)) //either obscured or on the nospecies list
|
||||
msg += "!\n" //omit the species when examining
|
||||
else if(displayed_species == "Slime People") //snowflakey because Slime People are defined as a plural
|
||||
msg += ", a slime person!\n"
|
||||
msg += ", a<b><font color='[examine_color]'> slime person</font></b>!\n"
|
||||
else if(displayed_species == "Unathi") //DAMN YOU, VOWELS
|
||||
msg += ", a unathi!\n"
|
||||
msg += ", a<b><font color='[examine_color]'> unathi</font></b>!\n"
|
||||
else
|
||||
msg += ", \a [lowertext(displayed_species)]!\n"
|
||||
msg += ", a<b><font color='[examine_color]'> [lowertext(displayed_species)]</font></b>!\n"
|
||||
|
||||
//uniform
|
||||
if(w_uniform && !skipjumpsuit && !(w_uniform.flags & ABSTRACT))
|
||||
|
||||
@@ -1331,11 +1331,13 @@
|
||||
|
||||
var/list/thing_to_check = list(slot_wear_mask, slot_head, slot_shoes, slot_gloves, slot_l_ear, slot_r_ear, slot_glasses, slot_l_hand, slot_r_hand)
|
||||
var/list/kept_items[0]
|
||||
|
||||
var/list/item_flags[0]
|
||||
for(var/thing in thing_to_check)
|
||||
var/obj/item/I = get_item_by_slot(thing)
|
||||
if(I)
|
||||
kept_items[I] = thing
|
||||
item_flags[I] = I.flags
|
||||
I.flags = 0 // Temporary set the flags to 0
|
||||
|
||||
if(retain_damage)
|
||||
//Create a list of body parts which are damaged by burn or brute and save them to apply after new organs are generated. First we just handle external organs.
|
||||
@@ -1401,8 +1403,9 @@
|
||||
else
|
||||
dna.species.create_organs(src)
|
||||
|
||||
for(var/thing in kept_items)
|
||||
for(var/obj/item/thing in kept_items)
|
||||
equip_to_slot_if_possible(thing, kept_items[thing], redraw_mob = 0)
|
||||
thing.flags = item_flags[thing] // Reset the flags to the origional ones
|
||||
|
||||
//Handle default hair/head accessories for created mobs.
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
var/dietflags = 0 // Make sure you set this, otherwise it won't be able to digest a lot of foods
|
||||
|
||||
var/blood_color = "#A10808" //Red.
|
||||
var/flesh_color = "#FFC896" //Pink.
|
||||
var/flesh_color = "#d1aa2e" //Gold.
|
||||
var/single_gib_type = /obj/effect/decal/cleanable/blood/gibs
|
||||
var/remains_type = /obj/effect/decal/remains/human //What sort of remains is left behind when the species dusts
|
||||
var/base_color //Used when setting species.
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
dietflags = DIET_HERB
|
||||
has_gender = FALSE
|
||||
reagent_tag = PROCESS_ORG
|
||||
flesh_color = "#a598ad"
|
||||
blood_color = "#A200FF"
|
||||
|
||||
/datum/species/grey/handle_dna(mob/living/carbon/human/H, remove)
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
bodyflags = HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS
|
||||
eyes = "kidan_eyes_s"
|
||||
dietflags = DIET_HERB
|
||||
flesh_color = "#ba7814"
|
||||
blood_color = "#FB9800"
|
||||
reagent_tag = PROCESS_ORG
|
||||
//Default styles for created mobs.
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
)
|
||||
|
||||
speciesbox = /obj/item/storage/box/survival_plasmaman
|
||||
flesh_color = "#8b3fba"
|
||||
|
||||
/datum/species/plasmaman/say_filter(mob/M, message, datum/language/speaking)
|
||||
if(copytext(message, 1, 2) != "*")
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
dietflags = DIET_CARN
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
flesh_color = "#5fe8b1"
|
||||
blood_color = "#0064C8"
|
||||
exotic_blood = "water"
|
||||
blood_damage_type = TOX
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
taste_sensitivity = TASTE_SENSITIVITY_SHARP
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
flesh_color = "#AFA59E"
|
||||
flesh_color = "#b5a69b"
|
||||
base_color = "#424242"
|
||||
butt_sprite = "tajaran"
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
author: "Couls"
|
||||
delete-after: True
|
||||
changes:
|
||||
- tweak: "necromantic stone now forces the ghost back into the body as a skeleton"
|
||||
- rscadd: "allow skeletons to give up their bodies and offer control to ghosts"
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "farie82"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "Transforming into another species will now retain the items correctly. Example clings will keep their armblades and they won't get stuck with a non existing armblade they can't put back"
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "Kyep"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "Added new bonus loadout items for higher-tier patrons. Also gave admins access to patron items, and ensured that during custom events, you see the custom event announcement when you connect."
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "Arkatos"
|
||||
delete-after: True
|
||||
changes:
|
||||
- tweak: "Species name now shows in a species theme color on examine"
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "Ionward"
|
||||
delete-after: True
|
||||
changes:
|
||||
- imageadd: "Updated the cautery sprite!"
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "AffectedArc07"
|
||||
delete-after: True
|
||||
changes:
|
||||
- tweak: "Removes an infinite loop in the code"
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "AffectedArc07"
|
||||
delete-after: True
|
||||
changes:
|
||||
- tweak: "Captains display case now actually has captains thumbprint lock on it"
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "AffectedArc07"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "Fixes a minor NTTC issue"
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 38 KiB |
Reference in New Issue
Block a user