[MIRROR] Fixes an embed runtime (#373)

* embed runtime (#52912)

* Fixes an embed runtime

Co-authored-by: Rohesie <rohesie@gmail.com>
This commit is contained in:
SkyratBot
2020-08-17 23:32:27 +02:00
committed by GitHub
co-authored by Rohesie
parent 9d135f8e1b
commit f088ef3ce4
4 changed files with 24 additions and 13 deletions
+2
View File
@@ -580,6 +580,8 @@
///from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle, hit_limb)
#define COMSIG_PROJECTILE_SELF_ON_HIT "projectile_self_on_hit"
#define COMPONENT_PROJECTILE_SELF_ON_HIT_EMBED_SUCCESS (1<<0)
#define COMPONENT_PROJECTILE_SELF_ON_HIT_SELF_DELETE (1<<1)
///from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle)
#define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit"
///from base of /obj/projectile/proc/fire(): (obj/projectile, atom/original_target)
+1 -1
View File
@@ -143,7 +143,7 @@
if(!limb)
limb = C.get_bodypart()
payload.tryEmbed(limb)
. = payload.tryEmbed(limb)
Detach(P)
/**
+19 -11
View File
@@ -951,11 +951,13 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
if(embedding)
return !isnull(embedding["pain_mult"]) && !isnull(embedding["jostle_pain_mult"]) && embedding["pain_mult"] == 0 && embedding["jostle_pain_mult"] == 0
///In case we want to do something special (like self delete) upon failing to embed in something, return true
///In case we want to do something special (like self delete) upon failing to embed in something. Returns a bitflag.
/obj/item/proc/failedEmbed()
if(item_flags & DROPDEL)
QDEL_NULL(src)
return TRUE
qdel(src)
return COMPONENT_PROJECTILE_SELF_ON_HIT_SELF_DELETE
return NONE
///Called by the carbon throw_item() proc. Returns null if the item negates the throw, or a reference to the thing to suffer the throw else.
/obj/item/proc/on_thrown(mob/living/carbon/user, atom/target)
@@ -972,19 +974,22 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
*
* Really, this is used mostly with projectiles with shrapnel payloads, from [/datum/element/embed/proc/checkEmbedProjectile], and called on said shrapnel. Mostly acts as an intermediate between different embed elements.
*
* Returns bitflags informing whether the item was able to embed itself, deleted itself in the process, or nothing happened.
*
* Arguments:
* * target- Either a body part or a carbon. What are we hitting?
* * forced- Do we want this to go through 100%?
*/
/obj/item/proc/tryEmbed(atom/target, forced=FALSE, silent=FALSE)
if(!isbodypart(target) && !iscarbon(target))
return
return NONE
if(!forced && !LAZYLEN(embedding))
return
return NONE
if(SEND_SIGNAL(src, COMSIG_EMBED_TRY_FORCE, target, forced, silent))
return TRUE
failedEmbed()
return COMPONENT_PROJECTILE_SELF_ON_HIT_EMBED_SUCCESS
return failedEmbed()
///For when you want to disable an item's embedding capabilities (like transforming weapons and such), this proc will detach any active embed elements from it.
/obj/item/proc/disableEmbedding()
@@ -1043,10 +1048,13 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
M.apply_damage(max(15, force), BRUTE, BODY_ZONE_HEAD, wound_bonus = 10, sharpness = TRUE)
M.losebreath += 2
if(tryEmbed(M.get_bodypart(BODY_ZONE_CHEST), TRUE, TRUE)) //and if it embeds in their chest, cause a lot of pain
M.apply_damage(max(25, force*1.5), BRUTE, BODY_ZONE_CHEST, wound_bonus = 7, sharpness = TRUE)
M.losebreath += 6
discover_after = FALSE
switch(tryEmbed(M.get_bodypart(BODY_ZONE_CHEST), TRUE, TRUE)) //and if it embeds in their chest, cause a lot of pain
if(COMPONENT_PROJECTILE_SELF_ON_HIT_SELF_DELETE)
return
if(COMPONENT_PROJECTILE_SELF_ON_HIT_EMBED_SUCCESS)
M.apply_damage(max(25, force*1.5), BRUTE, BODY_ZONE_CHEST, wound_bonus = 7, sharpness = TRUE)
M.losebreath += 6
discover_after = FALSE
if(S?.tastes?.len) //is that blood in my mouth?
S.tastes += "iron"
+2 -1
View File
@@ -186,7 +186,8 @@
if(isliving(target))
var/mob/living/L = target
hit_limb = L.check_limb_hit(def_zone)
SEND_SIGNAL(src, COMSIG_PROJECTILE_SELF_ON_HIT, firer, target, Angle, hit_limb)
if(SEND_SIGNAL(src, COMSIG_PROJECTILE_SELF_ON_HIT, firer, target, Angle, hit_limb) & COMPONENT_PROJECTILE_SELF_ON_HIT_SELF_DELETE)
return BULLET_ACT_HIT
var/turf/target_loca = get_turf(target)
var/hitx