mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-25 16:45:42 +00:00
* SPECIES NUKING 2023: Head flags 3 & Knuckles: Fixes some growing pains with head flags (#76440) Fixes https://github.com/tgstation/tgstation/issues/76422 This was caused by me somehow not using the wrapper there and not noticing it Also fixes hair gradients and facial hair gradients. I am pretty sure they were uhh, being hidden behind the actual hair/facial hair. Oops. Also also fixes spawning yourself as a human as admin and getting random hair colors. That was just a failure to update the icon after updating everything, I think? Additionally, to totally babyproof all of this, ensures that head_flags involved stuff gets applied AFTER species by creating a new preference priority, and uses two separate wrappers to apply gradient style and color. Here's this absolute hellspawn to prove that everything works.     Sorry for being so damn good at breaking this codebase. Bugs are bad they make you mad 🆑 fix: Hair and facial hair gradients work again now fix: Facial hair colors apply properly again fix: Admin spawned characters will get hair color preferences applied properly /🆑 * Fixed a compile error (whoops) * Whoops fixed that wrong * Okay now I compiled and made sure it was fixed for real, I swear! --------- Co-authored-by: ChungusGamer666 <82850673+ChungusGamer666@users.noreply.github.com>
72 lines
3.1 KiB
Plaintext
72 lines
3.1 KiB
Plaintext
|
|
//This proc is the most basic of the procs. All it does is make a new mob on the same tile and transfer over a few variables.
|
|
//Returns the new mob
|
|
//Note that this proc does NOT do MMI related stuff!
|
|
/mob/proc/change_mob_type(new_type = null, turf/location = null, new_name = null as text, delete_old_mob = FALSE)
|
|
|
|
if(isnewplayer(src))
|
|
to_chat(usr, span_danger("Cannot convert players who have not entered yet."))
|
|
return
|
|
|
|
if(!new_type)
|
|
new_type = input("Mob type path:", "Mob type") as text|null
|
|
|
|
if(istext(new_type))
|
|
new_type = text2path(new_type)
|
|
|
|
if( !ispath(new_type) )
|
|
to_chat(usr, "Invalid type path (new_type = [new_type]) in change_mob_type(). Contact a coder.")
|
|
return
|
|
|
|
if(ispath(new_type, /mob/dead/new_player))
|
|
to_chat(usr, span_danger("Cannot convert into a new_player mob type."))
|
|
return
|
|
|
|
return change_mob_type_unchecked(new_type, location, new_name, delete_old_mob)
|
|
|
|
/// Version of [change_mob_type] that does no usr prompting (may send an error message though). Satisfies procs with the SHOULD_NOT_SLEEP restriction
|
|
/mob/proc/change_mob_type_unchecked(new_type = null, turf/location = null, new_name = null as text, delete_old_mob = FALSE)
|
|
var/mob/desired_mob
|
|
if(isturf(location))
|
|
desired_mob = new new_type(location)
|
|
else
|
|
desired_mob = new new_type(src.loc)
|
|
|
|
if(!desired_mob || !ismob(desired_mob))
|
|
to_chat(usr, "Type path is not a mob (new_type = [new_type]) in change_mob_type(). Contact a coder.")
|
|
qdel(desired_mob)
|
|
return
|
|
|
|
if(istext(new_name))
|
|
desired_mob.name = new_name
|
|
desired_mob.real_name = new_name
|
|
else
|
|
desired_mob.name = src.name
|
|
desired_mob.real_name = src.real_name
|
|
|
|
if(has_dna() && desired_mob.has_dna())
|
|
var/mob/living/carbon/old_mob = src
|
|
var/mob/living/carbon/new_mob = desired_mob
|
|
old_mob.dna.transfer_identity(new_mob, transfer_species = FALSE)
|
|
new_mob.updateappearance(icon_update = TRUE, mutcolor_update = TRUE, mutations_overlay_update = TRUE)
|
|
else if(ishuman(desired_mob) && (!ismonkey(desired_mob)))
|
|
var/mob/living/carbon/human/new_human = desired_mob
|
|
client?.prefs.safe_transfer_prefs_to(new_human)
|
|
new_human.dna.update_dna_identity()
|
|
new_human.updateappearance(icon_update = TRUE, mutcolor_update = TRUE, mutations_overlay_update = TRUE)
|
|
|
|
//Ghosts have copys of their minds, but if an admin put somebody else in their og body, the mind will have a new mind.key
|
|
// and transfer_to will transfer the wrong person since it uses mind.key
|
|
if(mind && isliving(desired_mob) && (!isobserver(src) || mind.current == src || QDELETED(mind.current)))
|
|
if (ckey(mind.key) != ckey)
|
|
//we could actually prevent the bug from happening here, but then nobody would know to look for the stack trace we are about to print.
|
|
stack_trace("DEBUG: The bug where mob transfers or transforms sometimes kick unrelated people out of mobs has happened again. mob [src]([type])\ref[src] owned by [ckey] is being changed into a [new_type] but has a mind owned by [ckey(mind.key)].")
|
|
|
|
mind.transfer_to(desired_mob, 1) // second argument to force key move to new mob
|
|
else
|
|
desired_mob.key = key
|
|
|
|
if(delete_old_mob)
|
|
QDEL_IN(src, 1)
|
|
return desired_mob
|