Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Refactor caltrop component into element (#56020)
Refactors the nearly completely stateless component "caltrop" into an element. The previous limit on "one message per caltrop per second" has been changed to "one message (about caltrops) per mob per second". This avoids a unique component for each shard of glass, and each cactus in the world, so saves some much needed memory. A message about "sliding over" caltrops has been removed, since it's now intended that you only trigger caltrops if you're not lying down.
- Loading branch information
coiax
committed
Jan 11, 2021
1 parent
29f59d3
commit e986d32
Showing
11 changed files
with
111 additions
and
81 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
/** | ||
* Caltrop element; for hurting people when they walk over this. | ||
* | ||
* Used for broken glass, cactuses and four sided dice. | ||
*/ | ||
/datum/element/caltrop | ||
element_flags = ELEMENT_BESPOKE | ||
id_arg_index = 2 | ||
|
||
///Minimum damage done when crossed | ||
var/min_damage | ||
|
||
///Maximum damage done when crossed | ||
var/max_damage | ||
|
||
///Probability of actually "firing", stunning and doing damage | ||
var/probability | ||
|
||
///Miscelanous caltrop flags; shoe bypassing, walking interaction, silence | ||
var/flags | ||
|
||
/datum/element/caltrop/Attach(datum/target, min_damage = 0, max_damage = 0, probability = 100, flags = NONE) | ||
. = ..() | ||
if(!isatom(target)) | ||
return ELEMENT_INCOMPATIBLE | ||
|
||
src.min_damage = min_damage | ||
src.max_damage = max(min_damage, max_damage) | ||
src.probability = probability | ||
src.flags = flags | ||
|
||
RegisterSignal(target, COMSIG_MOVABLE_CROSSED, .proc/Crossed) | ||
|
||
/datum/element/caltrop/proc/Crossed(atom/caltrop, atom/movable/AM) | ||
SIGNAL_HANDLER | ||
|
||
if(!prob(probability)) | ||
return | ||
|
||
if(!ishuman(AM)) | ||
return | ||
|
||
var/mob/living/carbon/human/H = AM | ||
if(HAS_TRAIT(H, TRAIT_PIERCEIMMUNE)) | ||
return | ||
|
||
if((flags & CALTROP_IGNORE_WALKERS) && H.m_intent == MOVE_INTENT_WALK) | ||
return | ||
|
||
if(H.movement_type & (FLOATING|FLYING)) //check if they are able to pass over us | ||
//gravity checking only our parent would prevent us from triggering they're using magboots / other gravity assisting items that would cause them to still touch us. | ||
return | ||
|
||
if(H.buckled) //if they're buckled to something, that something should be checked instead. | ||
return | ||
|
||
if(H.body_position == LYING_DOWN) //if we're not standing we cant step on the caltrop | ||
return | ||
|
||
var/picked_def_zone = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) | ||
var/obj/item/bodypart/O = H.get_bodypart(picked_def_zone) | ||
if(!istype(O)) | ||
return | ||
|
||
if(O.status == BODYPART_ROBOTIC) | ||
return | ||
|
||
if (!(flags & CALTROP_BYPASS_SHOES)) | ||
if ((H.wear_suit?.body_parts_covered | H.w_uniform?.body_parts_covered | H.shoes?.body_parts_covered) & FEET) | ||
return | ||
|
||
var/damage = rand(min_damage, max_damage) | ||
if(HAS_TRAIT(H, TRAIT_LIGHT_STEP)) | ||
damage *= 0.75 | ||
|
||
|
||
if(!(flags & CALTROP_SILENT) && !H.has_status_effect(/datum/status_effect/caltropped)) | ||
H.apply_status_effect(/datum/status_effect/caltropped) | ||
H.visible_message("<span class='danger'>[H] steps on [caltrop].</span>", \ | ||
"<span class='userdanger'>You step on [caltrop]!</span>") | ||
|
||
H.apply_damage(damage, BRUTE, picked_def_zone, wound_bonus = CANT_WOUND) | ||
H.Paralyze(60) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters