[MIRROR] Allow printing whitelisted bodies, but resleeve lock them by force (#9011)

Co-authored-by: Heroman3003 <31296024+Heroman3003@users.noreply.github.com>
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
Co-authored-by: Kashargul <KashL@t-online.de>
This commit is contained in:
CHOMPStation2
2024-10-01 13:39:18 -07:00
committed by GitHub
parent af2de93a8f
commit ebd7d7b18e
20 changed files with 161 additions and 63 deletions

View File

@@ -29,6 +29,14 @@
to_chat(usr,"<span class='danger'>The target's mind is too complex to be affected!</span>")
return
/* CHOMPRemove Start, we have a vore pref for that
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.resleeve_lock && usr.ckey != H.resleeve_lock)
to_chat(src, span_danger("[H] cannot be impersonated!"))
return
*///CHOMPRemove End
if(M.stat == DEAD) //Are they dead?
to_chat(usr,"<span class='warning'>A warning pops up on the device, informing you that [M] is dead, and, as such, the mind transfer can not be done.</span>")
return

View File

@@ -8,7 +8,6 @@
transmutation and energy sharing abilities not unlike they lleill, but considerably more limited. Unlike \
other shapeshifter species, such as proteans or prometheans, Hanner have a typical humanoid set of organs and can not regenerate."
flags = NO_SCAN
color_mult = 1
appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | HAS_UNDERWEAR | HAS_LIPS
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE

View File

@@ -130,7 +130,7 @@
for(var/mob/living/carbon/human/M in mob_list)
if(M.z != user.z || get_dist(user,M) > 10)
continue
if(istype(M) && M.resleeve_lock && M.ckey != M.resleeve_lock)
if(!M.allow_mimicry)
continue
targets |= M

View File

@@ -237,11 +237,6 @@
if(pred.prey_controlled)
to_chat(prey, "<span class='warning'>\The [pred] is already dominated, and cannot be controlled at this time.</span>")
return
if(ishuman(pred))
var/mob/living/carbon/human/h = pred
if(h.resleeve_lock && ckey != h.resleeve_lock)
to_chat(src, "<span class='warning'>\The [h] cannot be impersonated!</span>")
return
if(tgui_alert(prey, "You are attempting to take over [pred], are you sure? Ensure that their preferences align with this kind of play.", "Take Over Predator",list("No","Yes")) != "Yes")
return
to_chat(prey, "<span class='notice'>You attempt to exert your control over \the [pred]...</span>")

View File

@@ -99,7 +99,7 @@
/mob/living/simple_mob/vore/morph/proc/assume(atom/movable/target)
var/mob/living/carbon/human/humantarget = target
if(istype(humantarget) && humantarget.resleeve_lock && ckey != humantarget.resleeve_lock)
if(istype(humantarget) && !humantarget.allow_mimicry)
to_chat(src, "<span class='warning'>[target] cannot be impersonated!</span>")
return
if(morphed)
@@ -272,12 +272,9 @@
var/mob/living/L = tgui_input_list(src, "Select a mob to take over:", "Take Over Prey", possible_mobs)
if(!L)
return
// Adding a ishuman check here, since silicon mobs don't have a resleeve_lock from what I can tell.
if(ishuman(L))
var/mob/living/carbon/human/M = L
if(M.resleeve_lock && ckey != M.resleeve_lock)
to_chat(src, "<span class='warning'>\The [M] cannot be impersonated!</span>")
return
if(!L.allow_mimicry)
to_chat(src, "<span class='warning'>\The [L] cannot be impersonated!</span>")
return
if(tgui_alert(src, "You selected [L] to attempt to take over. Are you sure?", "Take Over Prey",list("No","Yes")) == "Yes")
log_admin("[key_name_admin(src)] offered [L] to swap bodies as a morph.")
if(tgui_alert(L, "\The [src] has elected to attempt to take over your body and control you. Is this something you will allow to happen?", "Allow Morph To Take Over",list("No","Yes")) == "Yes")

View File

@@ -41,6 +41,7 @@
noisy = client.prefs_vr.noisy
selective_preference = client.prefs_vr.selective_preference
eating_privacy_global = client.prefs_vr.eating_privacy_global
allow_mimicry = client.prefs_vr.allow_mimicry
drop_vore = client.prefs_vr.drop_vore
stumble_vore = client.prefs_vr.stumble_vore

View File

@@ -128,10 +128,15 @@
//Person OOCly doesn't want people impersonating them
locked = ckeylock
//CHOMPEdit Start, keep the lock
//Prevent people from printing restricted and whitelisted species
var/datum/species/S = GLOB.all_species["[M.dna.species]"]
if(S)
toocomplex = (S.spawn_flags & SPECIES_IS_WHITELISTED) || (S.spawn_flags & SPECIES_IS_RESTRICTED)
// Force ckey locking if species is whitelisted
//if((S.spawn_flags & SPECIES_IS_WHITELISTED) || (S.spawn_flags & SPECIES_IS_RESTRICTED))
//locked = TRUE
//CHOMPEdit End
//General stuff about them
synthetic = M.isSynthetic()

View File

@@ -33,7 +33,14 @@
var/datum/dna2/record/R = current_project.mydna
var/mob/living/carbon/human/H = new /mob/living/carbon/human(src, R.dna.species)
if(current_project.locked)
H.resleeve_lock = current_project.ckey
H.resleeve_lock = current_project.ckey //CHOMPAdd, keep the lock
/*CHOMPRemove Start
if(current_project.ckey)
H.resleeve_lock = current_project.ckey
else
// Ensure even body scans without an attached ckey respect locking
H.resleeve_lock = "@badckey"
*///CHOMPRemove End
//Fix the external organs
for(var/part in current_project.limb_data)
@@ -191,6 +198,7 @@
occupant = null
if(locked)
locked = 0
update_icon()
return
return
@@ -200,6 +208,12 @@
return 100 * ((occupant.health + abs(CONFIG_GET(number/health_threshold_dead))) / (occupant.maxHealth + abs(CONFIG_GET(number/health_threshold_dead)))) // CHOMPEdit
return 0
/obj/machinery/clonepod/transhuman/examine(mob/user, infix, suffix)
. = ..()
if(occupant)
var/completion = get_completion()
. += "Progress: [round(completion)]% [chat_progress_bar(round(completion), TRUE)]"
//Synthetic version
/obj/machinery/transhuman/synthprinter
name = "SynthFab 3000"
@@ -293,7 +307,14 @@
var/datum/dna2/record/R = current_project.mydna
var/mob/living/carbon/human/H = new /mob/living/carbon/human(src, R.dna.species)
if(current_project.locked)
H.resleeve_lock = current_project.ckey
H.resleeve_lock = current_project.ckey //CHOMPAdd, keep the lock
/*CHOMPRemove Start
if(current_project.ckey)
H.resleeve_lock = current_project.ckey
else
// Ensure even body scans without an attached ckey respect locking
H.resleeve_lock = "@badckey"
*///CHOMPRemove End
//Fix the external organs
for(var/part in current_project.limb_data)

View File

@@ -1,5 +1,64 @@
//Health bars in the game window would be pretty challenging and I don't know how to do that, so I thought this would be a good alternative
// Generates the progress bar text
/proc/chat_progress_bar(percentage, add_color = FALSE)
switch(percentage)
if(100)
. = "|▓▓▓▓▓▓▓▓▓▓|"
if(95 to 99)
. = "|▓▓▓▓▓▓▓▓▓▒|"
if(90 to 94)
. = "|▓▓▓▓▓▓▓▓▓░|"
if(85 to 89)
. = "|▓▓▓▓▓▓▓▓▒░|"
if(80 to 84)
. = "|▓▓▓▓▓▓▓▓░░|"
if(75 to 79)
. = "|▓▓▓▓▓▓▓▒░░|"
if(70 to 74)
. = "|▓▓▓▓▓▓▓░░░|"
if(65 to 69)
. = "|▓▓▓▓▓▓▒░░░|"
if(60 to 64)
. = "|▓▓▓▓▓▓░░░░|"
if(55 to 59)
. = "|▓▓▓▓▓▒░░░░|"
if(50 to 54)
. = "|▓▓▓▓▓░░░░░|"
if(45 to 49)
. = "|▓▓▓▓▒░░░░░|"
if(40 to 44)
. = "|▓▓▓▓░░░░░░|"
if(35 to 39)
. = "|▓▓▓▒░░░░░░|"
if(30 to 34)
. = "|▓▓▓░░░░░░░|"
if(25 to 29)
. = "|▓▓▒░░░░░░░|"
if(20 to 24)
. = "|▓▓░░░░░░░░|"
if(15 to 19)
. = "|▓▒░░░░░░░░|"
if(10 to 14)
. = "|▓░░░░░░░░░|"
if(5 to 9)
. = "|▒░░░░░░░░░|"
if(0)
. = "|░░░░░░░░░░|"
else
. = "!░░░░░░░░░░!"
if(add_color)
switch(percentage)
if(75 to 100)
. = span_green(.)
if(50 to 75)
. = span_yellow(.)
if(25 to 50)
. = span_orange(.)
else
. = span_red(.)
/mob/living/proc/chat_healthbar(var/mob/living/reciever, onExamine = FALSE, override = FALSE)
if(!reciever) //No one to send it to, don't bother
return
@@ -28,52 +87,7 @@
ourpercent = round(ourpercent)
switch(ourpercent) //I thought about trying to do this in a more automated way but my brain isn't very large so enjoy my stupid switch statement
if(100)
ourbar = "|▓▓▓▓▓▓▓▓▓▓|"
if(95 to 99)
ourbar = "|▓▓▓▓▓▓▓▓▓▒|"
if(90 to 94)
ourbar = "|▓▓▓▓▓▓▓▓▓░|"
if(85 to 89)
ourbar = "|▓▓▓▓▓▓▓▓▒░|"
if(80 to 84)
ourbar = "|▓▓▓▓▓▓▓▓░░|"
if(75 to 79)
ourbar = "|▓▓▓▓▓▓▓▒░░|"
if(70 to 74)
ourbar = "|▓▓▓▓▓▓▓░░░|"
if(65 to 69)
ourbar = "|▓▓▓▓▓▓▒░░░|"
if(60 to 64)
ourbar = "|▓▓▓▓▓▓░░░░|"
if(55 to 59)
ourbar = "|▓▓▓▓▓▒░░░░|"
if(50 to 54)
ourbar = "|▓▓▓▓▓░░░░░|"
if(45 to 49)
ourbar = "|▓▓▓▓▒░░░░░|"
if(40 to 44)
ourbar = "|▓▓▓▓░░░░░░|"
if(35 to 39)
ourbar = "|▓▓▓▒░░░░░░|"
if(30 to 34)
ourbar = "|▓▓▓░░░░░░░|"
if(25 to 29)
ourbar = "|▓▓▒░░░░░░░|"
if(20 to 24)
ourbar = "|▓▓░░░░░░░░|"
if(15 to 19)
ourbar = "|▓▒░░░░░░░░|"
if(10 to 14)
ourbar = "|▓░░░░░░░░░|"
if(5 to 9)
ourbar = "|▒░░░░░░░░░|"
if(0)
ourbar = "|░░░░░░░░░░|"
else
ourbar = "!░░░░░░░░░░!"
ourbar = chat_progress_bar(ourpercent, FALSE)
ourbar = "[ourbar] [which_var] - [src.name]"
if(stat == UNCONSCIOUS)

View File

@@ -270,6 +270,7 @@
P.digest_pain = src.digest_pain
P.stumble_vore = src.stumble_vore
P.eating_privacy_global = src.eating_privacy_global
P.allow_mimicry = src.allow_mimicry
P.nutrition_message_visible = src.nutrition_message_visible
P.nutrition_messages = src.nutrition_messages
@@ -344,6 +345,7 @@
food_vore = P.food_vore
digest_pain = P.digest_pain
eating_privacy_global = P.eating_privacy_global
allow_mimicry = P.allow_mimicry
nutrition_message_visible = P.nutrition_message_visible
nutrition_messages = P.nutrition_messages
@@ -1355,6 +1357,7 @@
dispvoreprefs += "<b>Can be resized:</b> [resizable ? "<font color='green'>Allowed</font>" : "<font color='red'>Disallowed</font>"]<br>"
dispvoreprefs += "<b>Spontaneous transformation:</b> [allow_spontaneous_tf ? "<font color='green'>Enabled</font>" : "<font color='red'>Disabled</font>"]<br>"
dispvoreprefs += "<b>Mind transfer:</b> [allow_mind_transfer ? "<font color='green'>Allowed</font>" : "<font color='red'>Disallowed</font>"]<br>"
dispvoreprefs += "<b>Allow Mimicry:</b> [allow_mimicry ? "<font color='green'>Yes</font>" : "<font color='red'>No</font>"]<br>"
dispvoreprefs += "<b>Feedable:</b> [feeding ? "<font color='green'>Enabled</font>" : "<font color='red'>Disabled</font>"]<br>"
dispvoreprefs += "<b>Receiving liquids:</b> [receive_reagents ? "<font color='green'>Enabled</font>" : "<font color='red'>Disabled</font>"]<br>"
dispvoreprefs += "<b>Giving liquids:</b> [give_reagents ? "<font color='green'>Enabled</font>" : "<font color='red'>Disabled</font>"]<br>"

View File

@@ -27,6 +27,7 @@
var/selective_preference = DM_DEFAULT // Preference for selective bellymode
var/text_warnings = TRUE // Allows us to dismiss the text limit warning messages after viewing it once per round
var/eating_privacy_global = FALSE // Makes eating attempt/success messages only reach for subtle range if true, overwritten by belly-specific var
var/allow_mimicry = TRUE // Allows mimicking their character
var/allow_mind_transfer = FALSE //Allows ones mind to be taken over or swapped
var/nutrition_message_visible = TRUE
var/list/nutrition_messages = list(

View File

@@ -53,6 +53,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
var/permit_healbelly = TRUE
var/noisy = FALSE
var/eating_privacy_global = FALSE //Makes eating attempt/success messages only reach for subtle range if true, overwritten by belly-specific var
var/allow_mimicry = TRUE
// These are 'modifier' prefs, do nothing on their own but pair with drop_prey/drop_pred settings.
var/drop_vore = TRUE
@@ -220,6 +221,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
weight_message_visible = json_from_file["weight_message_visible"]
weight_messages = json_from_file["weight_messages"]
eating_privacy_global = json_from_file["eating_privacy_global"]
allow_mimicry = json_from_file["allow_mimicry"]
vore_sprite_color = json_from_file["vore_sprite_color"]
allow_mind_transfer = json_from_file["allow_mind_transfer"]
@@ -301,6 +303,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
weight_message_visible = TRUE
if(isnull(eating_privacy_global))
eating_privacy_global = FALSE
if(isnull(allow_mimicry))
allow_mimicry = TRUE
if(isnull(nutrition_messages))
nutrition_messages = list(
"They are starving! You can hear their stomach snarling from across the room!",
@@ -424,6 +428,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
"weight_messages" = weight_messages,
"eating_privacy_global" = eating_privacy_global,
"vore_sprite_color" = vore_sprite_color,
"allow_mimicry" = allow_mimicry,
"vore_sprite_multiply" = vore_sprite_multiply, //CHOMPEdit
"strip_pref" = strip_pref, //CHOMPEdit
"no_latejoin_vore_warning" = no_latejoin_vore_warning, //CHOMPEdit

View File

@@ -549,6 +549,7 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
"weight_message_visible" = host.weight_message_visible,
"weight_messages" = host.weight_messages,
"eating_privacy_global" = host.eating_privacy_global,
"allow_mimicry" = host.allow_mimicry,
//CHOMPEdit start, vore sprites
"belly_rub_target" = host.belly_rub_target,
"vore_sprite_color" = host.vore_sprite_color,
@@ -1946,6 +1947,12 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
host.eating_privacy_global = host.eating_privacy_global
unsaved_changes = TRUE
return TRUE
if("toggle_mimicry")
host.allow_mimicry = !host.allow_mimicry
if(host.client.prefs_vr)
host.client.prefs_vr.allow_mimicry = host.allow_mimicry
unsaved_changes = TRUE
return TRUE
if("toggle_devour")
host.devourable = !host.devourable
if(host.client.prefs_vr)

View File

@@ -286,6 +286,7 @@
new_mob.nutrition_message_visible = nutrition_message_visible
new_mob.allow_spontaneous_tf = allow_spontaneous_tf
new_mob.eating_privacy_global = eating_privacy_global
new_mob.allow_mimicry = allow_mimicry
new_mob.text_warnings = text_warnings
new_mob.allow_mind_transfer = allow_mind_transfer

View File

@@ -41,6 +41,7 @@ export const VoreUserPreferences = (props: {
nutrition_message_visible,
weight_message_visible,
eating_privacy_global,
allow_mimicry,
} = prefs;
const preferences = {
@@ -425,6 +426,19 @@ export const VoreUserPreferences = (props: {
disabled: 'Global Vore Privacy: Loud',
},
},
allow_mimicry: {
action: 'toggle_mimicry',
test: allow_mimicry,
tooltip: {
main: 'Allows some creatures to mimick your apperance.',
enable: ' Click here to allow mimicry.',
disable: ' Click here to forbid mimicry.',
},
content: {
enabled: 'Allow Mimicry: Yes',
disabled: 'Allow Mimicry: No',
},
},
};
return (

View File

@@ -118,6 +118,9 @@ export const VoreUserPreferencesMechanical = (props: {
<Flex.Item basis="32%" grow={1}>
<VoreUserPreferenceItem spec={preferences.eating_privacy_global} />
</Flex.Item>
<Flex.Item basis="32%" grow={1}>
<VoreUserPreferenceItem spec={preferences.allow_mimicry} />
</Flex.Item>
</Flex>
</Section>
);

View File

@@ -172,6 +172,7 @@ export type prefData = {
weight_message_visible: BooleanLike;
weight_messages: string[];
eating_privacy_global: BooleanLike;
allow_mimicry: BooleanLike;
vore_sprite_color: { stomach: string; 'taur belly': string };
vore_sprite_multiply: { stomach: BooleanLike; 'taur belly': BooleanLike };
};
@@ -203,6 +204,7 @@ export type localPrefs = {
examine_nutrition: preferenceData;
examine_weight: preferenceData;
eating_privacy_global: preferenceData;
allow_mimicry: preferenceData;
};
export type preferenceData = {

View File

@@ -48,6 +48,7 @@ export const VoreUserPreferences = (props: {
allow_spontaneous_tf,
allow_mind_transfer,
eating_privacy_global,
allow_mimicry,
strip_mechanics_active,
autotransferable,
liq_rec,
@@ -510,6 +511,19 @@ export const VoreUserPreferences = (props: {
disabled: 'Global Vore Privacy: Loud',
},
},
allow_mimicry: {
action: 'toggle_mimicry',
test: allow_mimicry,
tooltip: {
main: 'Allows some creatures to mimick your apperance.',
enable: ' Click here to allow mimicry.',
disable: ' Click here to forbid mimicry.',
},
content: {
enabled: 'Allow Mimicry: Yes',
disabled: 'Allow Mimicry: No',
},
},
autotransferable: {
action: 'toggle_autotransferable',
test: autotransferable,

View File

@@ -106,8 +106,14 @@ export const VoreUserPreferencesMechanical = (props: {
<Flex.Item basis="33%">
<VoreUserPreferenceItem
spec={preferences.mind_transfer}
tooltipPosition="top"
tooltipPosition="left"
/>
<Flex.Item basis="33%">
<VoreUserPreferenceItem
spec={preferences.allow_mimicry}
tooltipPosition="right"
/>
</Flex.Item>
</Flex.Item>
</Flex>
</Section>

View File

@@ -283,6 +283,7 @@ export type prefData = {
weight_message_visible: BooleanLike;
weight_messages: string[];
eating_privacy_global: BooleanLike;
allow_mimicry: BooleanLike;
belly_rub_target: string | null;
vore_sprite_color: { stomach: string; 'taur belly': string };
vore_sprite_multiply: { stomach: BooleanLike; 'taur belly': BooleanLike };
@@ -348,6 +349,7 @@ export type localPrefs = {
examine_weight: preferenceData;
strippref: preferenceData;
eating_privacy_global: preferenceData;
allow_mimicry: preferenceData;
autotransferable: preferenceData;
liquid_receive: preferenceData;
liquid_give: preferenceData;