mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-20 19:49:39 +01:00
Title. The clickon proc calls params2list only after the component signal was sent notwhitstanding clickon comsig procs also needing to access these parameters in order to work properly, which means every one of these comsig procs has its own params2list(params) call. This problem isn't exlusive to these comsig procs. For some reason the params text string is passed down to the melee click chain, afterattack and afterattack_secondary instead of the params/modifiers list... buuut we'll get there later. TL;DR params2list is being called more times than necessary because of a suboptimal old code. Another issue: Some of these comsig procs ignore parameters such as shift, which is used to examinate things and access popup menus, alt, ctrl and/or middle mouse button. This is the case of the honorbound mutation datum, shy and shy in room components, mechas and the clown car. This is of course also getting fixed.
106 lines
3.4 KiB
Plaintext
106 lines
3.4 KiB
Plaintext
#define SHY_COMPONENT_CACHE_TIME 0.5 SECONDS
|
|
|
|
/// You can't use items on anyone other than yourself if there are other living mobs around you
|
|
/datum/component/shy
|
|
can_transfer = TRUE
|
|
/// How close you are before you get shy
|
|
var/shy_range = 4
|
|
/// Typecache of mob types you are okay around
|
|
var/list/whitelist
|
|
/// Message shown when you are is_shy
|
|
var/message = "You find yourself too shy to do that around %TARGET!"
|
|
/// Are you shy around a dead body?
|
|
var/dead_shy = FALSE
|
|
/// Invalidate last_result at this time
|
|
COOLDOWN_DECLARE(result_cooldown)
|
|
/// What was our last result?
|
|
var/last_result = FALSE
|
|
|
|
/datum/component/shy/Initialize(whitelist, shy_range, message, dead_shy)
|
|
if(!ismob(parent))
|
|
return COMPONENT_INCOMPATIBLE
|
|
src.whitelist = whitelist
|
|
if(shy_range)
|
|
src.shy_range = shy_range
|
|
if(message)
|
|
src.message = message
|
|
if(dead_shy)
|
|
src.dead_shy = dead_shy
|
|
|
|
/datum/component/shy/RegisterWithParent()
|
|
RegisterSignal(parent, COMSIG_MOB_CLICKON, .proc/on_clickon)
|
|
RegisterSignal(parent, COMSIG_LIVING_TRY_PULL, .proc/on_try_pull)
|
|
RegisterSignal(parent, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_EARLY_UNARMED_ATTACK), .proc/on_unarmed_attack)
|
|
RegisterSignal(parent, COMSIG_TRY_STRIP, .proc/on_try_strip)
|
|
RegisterSignal(parent, COMSIG_TRY_ALT_ACTION, .proc/on_try_alt_action)
|
|
|
|
/datum/component/shy/UnregisterFromParent()
|
|
UnregisterSignal(parent, list(
|
|
COMSIG_MOB_CLICKON,
|
|
COMSIG_LIVING_TRY_PULL,
|
|
COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_EARLY_UNARMED_ATTACK,
|
|
COMSIG_TRY_STRIP,
|
|
COMSIG_TRY_ALT_ACTION,
|
|
))
|
|
|
|
/datum/component/shy/PostTransfer()
|
|
if(!ismob(parent))
|
|
return COMPONENT_INCOMPATIBLE
|
|
|
|
/datum/component/shy/InheritComponent(datum/component/shy/friend, i_am_original, list/arguments)
|
|
if(i_am_original)
|
|
shy_range = friend.shy_range
|
|
whitelist = friend.whitelist
|
|
message = friend.message
|
|
|
|
/// Returns TRUE or FALSE if you are within shy_range tiles from a /mob/living
|
|
/datum/component/shy/proc/is_shy(atom/target)
|
|
var/result = FALSE
|
|
var/mob/owner = parent
|
|
|
|
if(target in owner.DirectAccess())
|
|
return
|
|
|
|
if(!COOLDOWN_FINISHED(src, result_cooldown))
|
|
return last_result
|
|
|
|
var/list/strangers = view(shy_range, get_turf(owner))
|
|
|
|
if(length(strangers) && locate(/mob/living) in strangers)
|
|
for(var/mob/living/person in strangers)
|
|
if(person != owner && !is_type_in_typecache(person, whitelist) && (person.stat != DEAD || dead_shy))
|
|
to_chat(owner, span_warning("[replacetext(message, "%TARGET", person)]"))
|
|
result = TRUE
|
|
break
|
|
|
|
last_result = result
|
|
COOLDOWN_START(src, result_cooldown, SHY_COMPONENT_CACHE_TIME)
|
|
return result
|
|
|
|
|
|
|
|
/datum/component/shy/proc/on_clickon(datum/source, atom/target, list/modifiers)
|
|
SIGNAL_HANDLER
|
|
if(modifiers[SHIFT_CLICK]) //let them examine their surroundings.
|
|
return
|
|
return is_shy(target) && COMSIG_MOB_CANCEL_CLICKON
|
|
|
|
/datum/component/shy/proc/on_try_pull(datum/source, atom/movable/target, force)
|
|
SIGNAL_HANDLER
|
|
return is_shy(target) && COMSIG_LIVING_CANCEL_PULL
|
|
|
|
/datum/component/shy/proc/on_unarmed_attack(datum/source, atom/target, proximity, modifiers)
|
|
SIGNAL_HANDLER
|
|
return is_shy(target) && COMPONENT_CANCEL_ATTACK_CHAIN
|
|
|
|
/datum/component/shy/proc/on_try_strip(datum/source, atom/target, obj/item/equipping)
|
|
SIGNAL_HANDLER
|
|
return is_shy(target) && COMPONENT_CANT_STRIP
|
|
|
|
/datum/component/shy/proc/on_try_alt_action(datum/source, atom/target)
|
|
SIGNAL_HANDLER
|
|
return is_shy(target) && COMPONENT_CANT_ALT_ACTION
|
|
|
|
#undef SHY_COMPONENT_CACHE_TIME
|
|
|