From ef7e307a275d64181050d82cd8d450e824ca2e66 Mon Sep 17 00:00:00 2001 From: Antoonij <42318445+Antoonij@users.noreply.github.com> Date: Fri, 24 Jan 2025 05:49:56 +0100 Subject: [PATCH] code_imp: pref holder & improve pref viewer (#6422) * 1 * dme * rework to element * 2 * fastfix * inconsistent * 3 * fix x10 * fix x11 * fix x12 * parenthesis.... * fix x14 --- code/__HELPERS/bitflags.dm | 6 +-- code/__HELPERS/global_lists.dm | 1 + code/datums/components/pref_holder.dm | 49 +++++++++++++++++++ code/datums/components/pref_viewer.dm | 41 ---------------- code/datums/elements/pref_viewer.dm | 42 ++++++++++++++++ code/datums/mind.dm | 1 - .../changeling/changeling_datum.dm | 8 +-- .../antagonists/space_ninja/ninja_datum.dm | 8 +-- .../antagonists/traitor/datum_traitor.dm | 8 +-- .../antagonists/vampire/vampire_datum.dm | 8 +-- .../client/preference/preference_info.dm | 2 + code/modules/mob/mob.dm | 2 + code/modules/mob/new_player/new_player.dm | 2 +- paradise.dme | 3 +- 14 files changed, 118 insertions(+), 63 deletions(-) create mode 100644 code/datums/components/pref_holder.dm delete mode 100644 code/datums/components/pref_viewer.dm create mode 100644 code/datums/elements/pref_viewer.dm diff --git a/code/__HELPERS/bitflags.dm b/code/__HELPERS/bitflags.dm index 5aa80c92560..ac34a84987e 100644 --- a/code/__HELPERS/bitflags.dm +++ b/code/__HELPERS/bitflags.dm @@ -1,7 +1,7 @@ #define HASBIT(CONTAINER, FLAG) ((CONTAINER) & (FLAG)) -#define SETBIT(CONTAINER, FLAG) (CONTAINER |= (FLAG)) +#define SETBIT(CONTAINER, FLAG) ((CONTAINER) |= (FLAG)) -#define CLEARBIT(CONTAINER, FLAG) (CONTAINER &= ~(FLAG)) +#define CLEARBIT(CONTAINER, FLAG) ((CONTAINER) &= ~(FLAG)) -#define TOGGLEBIT(CONTAINER, FLAG) (CONTAINER ^= (FLAG)) +#define TOGGLEBIT(CONTAINER, FLAG) ((CONTAINER) ^= (FLAG)) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 38e70efa2a6..e02c3b4689d 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -25,6 +25,7 @@ init_subtypes(/datum/surgery_step, GLOB.surgery_steps) init_subtypes(/obj/item/slimepotion, GLOB.slime_potions) + init_subtypes(/datum/preference_info, GLOB.preferences_info) // Different bodies __init_body_accessory(/datum/body_accessory/body) // Different tails diff --git a/code/datums/components/pref_holder.dm b/code/datums/components/pref_holder.dm new file mode 100644 index 00000000000..23b39b8b596 --- /dev/null +++ b/code/datums/components/pref_holder.dm @@ -0,0 +1,49 @@ +/datum/component/pref_holder + var/list/preferences + +/datum/component/pref_holder/Destroy(force) + LAZYNULL(preferences) + + return ..() + +/datum/component/pref_holder/Initialize(list/preferences) + var/mob/target = parent + + if(!istype(target)) + return COMPONENT_INCOMPATIBLE + + src.preferences = preferences || forge_preferences() + +/datum/component/pref_holder/RegisterWithParent() + RegisterSignal(parent, COMSIG_BODY_TRANSFER_TO, PROC_REF(on_mind_transfer)) + +/datum/component/pref_holder/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_BODY_TRANSFER_TO) + +/datum/component/pref_holder/proc/on_mind_transfer(mob/source) + SIGNAL_HANDLER + + preferences = forge_preferences() + +/datum/component/pref_holder/proc/forge_preferences() + var/mob/mob = parent + + if(!mob.client) + return + + var/list/prefs + + for(var/datum/preference_info/pref as anything in GLOB.preferences_info) + var/datum/preference_toggle/toggle = pref.get_preference_toggle() + + if(!toggle) + continue + + if(!HASBIT(mob.client.prefs.toggles, toggle.preftoggle_bitflag) \ + && !HASBIT(mob.client.prefs.toggles2, toggle.preftoggle_bitflag) + ) + continue + + LAZYADD(prefs, new pref.type) + + return prefs diff --git a/code/datums/components/pref_viewer.dm b/code/datums/components/pref_viewer.dm deleted file mode 100644 index 7aa2e379aa2..00000000000 --- a/code/datums/components/pref_viewer.dm +++ /dev/null @@ -1,41 +0,0 @@ -/datum/component/pref_viewer - var/list/preferences_to_show - -/datum/component/pref_viewer/Destroy(force) - LAZYNULL(preferences_to_show) - - return ..() - -/datum/component/pref_viewer/Initialize( - list/preferences_to_show -) - if(!ismob(parent)) - return COMPONENT_INCOMPATIBLE - - for(var/datum/preference_info/pref as anything in preferences_to_show) - LAZYADD(src.preferences_to_show, new pref) - -/datum/component/pref_viewer/RegisterWithParent() - RegisterSignal(parent, COMSIG_MOB_RUN_EXAMINATE, PROC_REF(on_examine)) - -/datum/component/pref_viewer/UnregisterFromParent() - UnregisterSignal(parent, COMSIG_MOB_RUN_EXAMINATE) - -/datum/component/pref_viewer/proc/on_examine(mob/source, mob/target, list/result) - SIGNAL_HANDLER - - if(!istype(target) || !target.client) - return - - INVOKE_ASYNC(src, PROC_REF(modify_examine), target, result) - -/datum/component/pref_viewer/proc/modify_examine(mob/target, list/result) - for(var/datum/preference_info/pref as anything in preferences_to_show) - var/datum/preference_toggle/toggle = pref.get_preference_toggle() - - if(!HASBIT(target.client.prefs.toggles, toggle.preftoggle_bitflag) \ - && !HASBIT(target.client.prefs.toggles2, toggle.preftoggle_bitflag) - ) - continue - - LAZYADD(result, pref.get_examine_text()) diff --git a/code/datums/elements/pref_viewer.dm b/code/datums/elements/pref_viewer.dm new file mode 100644 index 00000000000..1b03a1a46c5 --- /dev/null +++ b/code/datums/elements/pref_viewer.dm @@ -0,0 +1,42 @@ +/datum/element/pref_viewer + element_flags = ELEMENT_DETACH_ON_HOST_DESTROY + var/list/preferences_to_show + +/datum/element/pref_viewer/Destroy(force) + LAZYNULL(preferences_to_show) + + return ..() + +/datum/element/pref_viewer/Attach( + mob/target, + list/preferences_to_show + ) + . = ..() + + if(!istype(target)) + return ELEMENT_INCOMPATIBLE + + src.preferences_to_show = preferences_to_show + RegisterSignal(target, COMSIG_MOB_RUN_EXAMINATE, PROC_REF(on_examine)) + +/datum/element/pref_viewer/Detach(mob/target) + . = ..() + + UnregisterSignal(target, COMSIG_MOB_RUN_EXAMINATE) + +/datum/element/pref_viewer/proc/on_examine(mob/source, mob/target, list/result) + SIGNAL_HANDLER + + if(!istype(target) || !target.client || !target.GetComponent(/datum/component/pref_holder)) + return + + INVOKE_ASYNC(src, PROC_REF(modify_examine), target, result) + +/datum/element/pref_viewer/proc/modify_examine(mob/target, list/result) + var/datum/component/pref_holder/holder = target.GetComponent(/datum/component/pref_holder) + + for(var/datum/preference_info/info as anything in holder.preferences) + if(!is_type_in_list(info, preferences_to_show)) + continue + + LAZYADD(result, info.get_examine_text()) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 0ffd7d80a9d..00781cb6cfc 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -148,7 +148,6 @@ /datum/mind/proc/transfer_to(mob/living/new_character) - if(!istype(new_character)) stack_trace("transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob.") diff --git a/code/modules/antagonists/changeling/changeling_datum.dm b/code/modules/antagonists/changeling/changeling_datum.dm index 7eadcc50807..97d0631fce1 100644 --- a/code/modules/antagonists/changeling/changeling_datum.dm +++ b/code/modules/antagonists/changeling/changeling_datum.dm @@ -161,17 +161,17 @@ GLOBAL_LIST_INIT(possible_changeling_IDs, list("Alpha","Beta","Gamma","Delta","E var/obj/item/organ/internal/brain/ling_brain = carbon_user.get_organ_slot(INTERNAL_ORGAN_BRAIN) ling_brain?.decoy_brain = TRUE - user.AddComponent( \ - /datum/component/pref_viewer, \ + user.AddElement( \ + /datum/element/pref_viewer, \ list(/datum/preference_info/take_out_of_the_round_without_obj), \ ) /datum/antagonist/changeling/on_body_transfer(mob/living/old_body, mob/living/new_body) . = ..() - qdel(old_body.GetComponent(/datum/component/pref_viewer)) + old_body.RemoveElement(/datum/element/pref_viewer) /datum/antagonist/changeling/handle_last_instance_removal() - qdel(owner.current.GetComponent(/datum/component/pref_viewer)) + owner.current.RemoveElement(/datum/element/pref_viewer) /datum/antagonist/changeling/remove_innate_effects(mob/living/mob_override) var/mob/living/user = ..() diff --git a/code/modules/antagonists/space_ninja/ninja_datum.dm b/code/modules/antagonists/space_ninja/ninja_datum.dm index 7784b28dccb..6eec361ac6e 100644 --- a/code/modules/antagonists/space_ninja/ninja_datum.dm +++ b/code/modules/antagonists/space_ninja/ninja_datum.dm @@ -115,17 +115,17 @@ var/mob/living/user = ..() user.faction = list(ROLE_NINJA) - user.AddComponent( \ - /datum/component/pref_viewer, \ + user.AddElement( \ + /datum/element/pref_viewer, \ list(/datum/preference_info/take_out_of_the_round_without_obj), \ ) /datum/antagonist/ninja/handle_last_instance_removal() - qdel(owner.current.GetComponent(/datum/component/pref_viewer)) + owner.current.RemoveElement(/datum/element/pref_viewer) /datum/antagonist/ninja/on_body_transfer(mob/living/old_body, mob/living/new_body) . = ..() - qdel(old_body.GetComponent(/datum/component/pref_viewer)) + old_body.RemoveElement(/datum/element/pref_viewer) /datum/antagonist/ninja/proc/change_species(mob/living/mob_to_change = null) // This should be used to fully to remove robo-limbs & change species for lack of sprites human_ninja = ishuman(mob_to_change) ? mob_to_change : null diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 2a82ecfdc16..91241de6d95 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -39,17 +39,17 @@ datum_owner.AddComponent(/datum/component/codeword_hearing, GLOB.syndicate_code_phrase_regex, "codephrases", src) datum_owner.AddComponent(/datum/component/codeword_hearing, GLOB.syndicate_code_response_regex, "coderesponses", src) - datum_owner.AddComponent( \ - /datum/component/pref_viewer, \ + datum_owner.AddElement( \ + /datum/element/pref_viewer, \ list(/datum/preference_info/take_out_of_the_round_without_obj), \ ) /datum/antagonist/traitor/on_body_transfer(mob/living/old_body, mob/living/new_body) . = ..() - qdel(old_body.GetComponent(/datum/component/pref_viewer)) + old_body.RemoveElement(/datum/element/pref_viewer) /datum/antagonist/traitor/handle_last_instance_removal() - qdel(owner.current.GetComponent(/datum/component/pref_viewer)) + owner.current.RemoveElement(/datum/element/pref_viewer) /datum/antagonist/traitor/remove_innate_effects(mob/living/mob_override) . = ..() diff --git a/code/modules/antagonists/vampire/vampire_datum.dm b/code/modules/antagonists/vampire/vampire_datum.dm index d1ca9d0c521..928269bebd9 100644 --- a/code/modules/antagonists/vampire/vampire_datum.dm +++ b/code/modules/antagonists/vampire/vampire_datum.dm @@ -114,17 +114,17 @@ //slaved.leave_serv_hud(mob_override.mind) //.mind.som = null - user.AddComponent( \ - /datum/component/pref_viewer, \ + user.AddElement( \ + /datum/element/pref_viewer, \ list(/datum/preference_info/take_out_of_the_round_without_obj), \ ) /datum/antagonist/vampire/on_body_transfer(mob/living/old_body, mob/living/new_body) . = ..() - qdel(old_body.GetComponent(/datum/component/pref_viewer)) + old_body.RemoveElement(/datum/element/pref_viewer) /datum/antagonist/vampire/handle_last_instance_removal() - qdel(owner.current.GetComponent(/datum/component/pref_viewer)) + owner.current.RemoveElement(/datum/element/pref_viewer) /datum/antagonist/vampire/remove_innate_effects(mob/living/mob_override, transformation = FALSE) var/mob/living/user = ..() diff --git a/code/modules/client/preference/preference_info.dm b/code/modules/client/preference/preference_info.dm index 92358e026cf..8ef1a889896 100644 --- a/code/modules/client/preference/preference_info.dm +++ b/code/modules/client/preference/preference_info.dm @@ -1,3 +1,5 @@ +GLOBAL_LIST_INIT(preferences_info, list()) + /datum/preference_info var/name diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index b75d9400e64..77ae79a4970 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -39,6 +39,8 @@ if(can_strip()) ADD_TRAIT(src, TRAIT_CAN_STRIP, GENERIC_TRAIT) + AddComponent(/datum/component/pref_holder) + /mob/vv_edit_var(var_name, var_value) switch(var_name) if(NAMEOF(src, focus)) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index bf88583a7fa..59febbc31fb 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -639,7 +639,7 @@ GLOB.human_names_list += new_character.real_name - new_character.key = key //Manually transfer the key to log them in + new_character.key = key // Manually transfer the key to log them in return new_character diff --git a/paradise.dme b/paradise.dme index 80da0e922d1..e7da0149b60 100644 --- a/paradise.dme +++ b/paradise.dme @@ -498,8 +498,8 @@ #include "code\datums\components\paintable.dm" #include "code\datums\components\pellet_cloud.dm" #include "code\datums\components\persistent_overlay.dm" -#include "code\datums\components\pref_viewer.dm" #include "code\datums\components\proximity_monitor.dm" +#include "code\datums\components\pref_holder.dm" #include "code\datums\components\radioactivity.dm" #include "code\datums\components\ritual_object.dm" #include "code\datums\components\shielded.dm" @@ -592,6 +592,7 @@ #include "code\datums\elements\devil_banishment.dm" #include "code\datums\elements\devil_regen.dm" #include "code\datums\elements\diona_internals.dm" +#include "code\datums\elements\pref_viewer.dm" #include "code\datums\elements\falling_hazard.dm" #include "code\datums\elements\footstep.dm" #include "code\datums\elements\give_turf_traits.dm"