af65c90125
This is a pretty big change all around. The gist of it is that it moves the mobility_flags into traits or variables that can track the sources, and to which we can append code to react to the events, be it via signals or via on_event-like procs. For example, MOBILITY_STAND could mean, depending on context, that the mob is either already standing or that it may be able to stand, and thus is lying down. There was a lot of snowflakery and redefinitions on top of redefinitions, so this is bound to create bugs I'm willing to fix as I learn them. The end-goal is for every living mob to use the same mobility system, for the traits to mean the same among them, and for no place to just mass-change settings without a way to trace it, such as with mobility_flags = NONE and mobility_flags = ALL Fixes AIs being able to strip nearby people. They've lost their hands usage.
42 lines
1.6 KiB
Plaintext
42 lines
1.6 KiB
Plaintext
/datum/component/slippery
|
|
var/force_drop_items = FALSE
|
|
var/knockdown_time = 0
|
|
var/paralyze_time = 0
|
|
var/lube_flags
|
|
var/datum/callback/callback
|
|
|
|
/datum/component/slippery/Initialize(_knockdown, _lube_flags = NONE, datum/callback/_callback, _paralyze, _force_drop = FALSE)
|
|
knockdown_time = max(_knockdown, 0)
|
|
paralyze_time = max(_paralyze, 0)
|
|
force_drop_items = _force_drop
|
|
lube_flags = _lube_flags
|
|
callback = _callback
|
|
RegisterSignal(parent, list(COMSIG_MOVABLE_CROSSED, COMSIG_ATOM_ENTERED), .proc/Slip)
|
|
RegisterSignal(parent, COMSIG_ITEM_WEARERCROSSED, .proc/Slip_on_wearer)
|
|
|
|
/datum/component/slippery/proc/Slip(datum/source, atom/movable/AM)
|
|
SIGNAL_HANDLER
|
|
|
|
var/mob/victim = AM
|
|
if(istype(victim) && !victim.is_flying() && victim.slip(knockdown_time, parent, lube_flags, paralyze_time, force_drop_items) && callback)
|
|
callback.Invoke(victim)
|
|
|
|
|
|
/datum/component/slippery/proc/Slip_on_wearer(datum/source, atom/movable/AM, mob/living/crossed)
|
|
SIGNAL_HANDLER
|
|
|
|
if(crossed.body_position == LYING_DOWN && !crossed.buckled)
|
|
Slip(source, AM)
|
|
|
|
|
|
/datum/component/slippery/clowning //used for making the clown PDA only slip if the clown is wearing his shoes and the elusive banana-skin belt
|
|
|
|
|
|
/datum/component/slippery/clowning/Slip_on_wearer(datum/source, atom/movable/AM, mob/living/crossed)
|
|
var/obj/item/I = crossed.get_item_by_slot(ITEM_SLOT_FEET)
|
|
if(crossed.body_position == LYING_DOWN && !crossed.buckled)
|
|
if(istype(I, /obj/item/clothing/shoes/clown_shoes))
|
|
Slip(source, AM)
|
|
else
|
|
to_chat(crossed,"<span class='warning'>[parent] failed to slip anyone. Perhaps I shouldn't have abandoned my legacy...</span>")
|