From 34c9a2f8216879cfc887b49fcd3d6d096c9de287 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Thu, 11 Jun 2020 21:45:32 +0100 Subject: [PATCH] part 4 --- code/datums/components/embedded.dm | 2 + code/datums/mutations/actions.dm | 15 +-- .../game/gamemodes/clown_ops/clown_weapons.dm | 2 +- code/game/machinery/deployable.dm | 2 +- code/game/objects/effects/mines.dm | 25 ++-- code/game/objects/items.dm | 2 +- .../objects/items/grenades/antigravity.dm | 4 +- .../objects/items/grenades/chem_grenade.dm | 6 +- .../objects/items/grenades/clusterbuster.dm | 8 +- code/game/objects/items/grenades/emgrenade.dm | 4 +- code/game/objects/items/grenades/flashbang.dm | 116 ++---------------- .../game/objects/items/grenades/ghettobomb.dm | 4 +- code/game/objects/items/grenades/grenade.dm | 14 +-- code/game/objects/items/grenades/plastic.dm | 6 +- code/game/objects/items/grenades/smokebomb.dm | 4 +- .../objects/items/grenades/spawnergrenade.dm | 4 +- .../objects/items/grenades/syndieminibomb.dm | 12 +- code/modules/cargo/packs/security.dm | 2 +- code/modules/hydroponics/grown/citrus.dm | 2 +- code/modules/hydroponics/grown/misc.dm | 2 +- code/modules/mob/living/living_defense.dm | 2 +- 21 files changed, 67 insertions(+), 171 deletions(-) diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm index 2324b36033..137a1bb864 100644 --- a/code/datums/components/embedded.dm +++ b/code/datums/components/embedded.dm @@ -92,6 +92,8 @@ if(!weapon.isEmbedHarmless()) harmful = TRUE + weapon.embedded(parent) + if(iscarbon(parent)) initCarbon() else if(isclosedturf(parent)) diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm index 58e2092e74..1475cfa356 100644 --- a/code/datums/mutations/actions.dm +++ b/code/datums/mutations/actions.dm @@ -406,6 +406,8 @@ w_class = WEIGHT_CLASS_SMALL sharpness = IS_SHARP var/mob/living/carbon/human/fired_by + /// if we missed our target + var/missed = TRUE /obj/item/hardened_spike/Initialize(mapload, firedby) . = ..() @@ -413,13 +415,12 @@ addtimer(CALLBACK(src, .proc/checkembedded), 5 SECONDS) /obj/item/hardened_spike/proc/checkembedded() - if(ishuman(loc)) - var/mob/living/carbon/human/embedtest = loc - for(var/l in embedtest.bodyparts) - var/obj/item/bodypart/limb = l - if(src in limb.embedded_objects) - return limb - unembedded() + if(missed) + unembedded() + +/obj/item/hardened_spike/embedded(atom/target) + if(isbodypart(target)) + missed = FALSE /obj/item/hardened_spike/unembedded() var/turf/T = get_turf(src) diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index 4d3ea2d02e..afa3dbfeaa 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -202,7 +202,7 @@ icon_state = "moustacheg" clumsy_check = GRENADE_NONCLUMSY_FUMBLE -/obj/item/grenade/chem_grenade/teargas/moustache/prime() +/obj/item/grenade/chem_grenade/teargas/moustache/prime(mob/living/lanced_by) var/list/check_later = list() for(var/mob/living/carbon/C in get_turf(src)) check_later += C diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index d8abe7c1c7..252e6cf6b3 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -169,7 +169,7 @@ to_chat(user, "[src] is now in [mode] mode.") -/obj/item/grenade/barrier/prime() +/obj/item/grenade/barrier/prime(mob/living/lanced_by) . = ..() new /obj/structure/barricade/security(get_turf(src.loc)) switch(mode) diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 1ee8b1e224..40104d5ea8 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -5,19 +5,21 @@ anchored = TRUE icon = 'icons/obj/items_and_weapons.dmi' icon_state = "uglymine" - var/triggered = 0 + /// We manually check to see if we've been triggered in case multiple atoms cross us in the time between the mine being triggered and it actually deleting, to avoid a race condition with multiple detonations + var/triggered = FALSE /obj/effect/mine/proc/mineEffect(mob/victim) to_chat(victim, "*click*") -/obj/effect/mine/Crossed(AM as mob|obj) - if(isturf(loc)) - if(ismob(AM)) - var/mob/MM = AM - if(!(MM.movement_type & FLYING)) - triggermine(AM) - else - triggermine(AM) +/obj/effect/mine/Crossed(atom/movable/AM) + if(triggered || !isturf(loc)) + return + . = ..() + + if(AM.movement_type & FLYING) + return + + triggermine(AM) /obj/effect/mine/proc/triggermine(mob/victim) if(triggered) @@ -31,6 +33,9 @@ triggered = 1 qdel(src) +/obj/effect/mine/take_damage(damage_amount, damage_type, damage_flag, sound_effect, attack_dir) + . = ..() + triggermine() /obj/effect/mine/explosive name = "explosive mine" @@ -118,7 +123,7 @@ /obj/effect/mine/pickup/triggermine(mob/victim) if(triggered) return - triggered = 1 + triggered = TRUE invisibility = INVISIBILITY_ABSTRACT mineEffect(victim) qdel(src) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 770b2e7129..883c9717b6 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -918,7 +918,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb // if w_volume is 0 you fucked up anyways lol return w_volume || AUTO_SCALE_VOLUME(w_class) -/obj/item/proc/embedded(mob/living/carbon/human/embedded_mob) +/obj/item/proc/embedded(atom/embedded_target) return /obj/item/proc/unembedded() diff --git a/code/game/objects/items/grenades/antigravity.dm b/code/game/objects/items/grenades/antigravity.dm index 313b91acd7..b6700599a3 100644 --- a/code/game/objects/items/grenades/antigravity.dm +++ b/code/game/objects/items/grenades/antigravity.dm @@ -7,7 +7,7 @@ var/forced_value = 0 var/duration = 300 -/obj/item/grenade/antigravity/prime() +/obj/item/grenade/antigravity/prime(mob/living/lanced_by) . = ..() update_mob() @@ -15,4 +15,4 @@ T.AddElement(/datum/element/forced_gravity, forced_value) addtimer(CALLBACK(T, /datum/.proc/_RemoveElement, list(forced_value)), duration) - resolve() + qdel(src) diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index 03ceda048f..4ce0e811c3 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -174,7 +174,7 @@ message_admins(message) user.log_message("primed [src] ([reagent_string])",LOG_GAME) -/obj/item/grenade/chem_grenade/prime() +/obj/item/grenade/chem_grenade/prime(mob/living/lanced_by) if(stage != READY) return FALSE @@ -218,7 +218,7 @@ ignition_temp = 25 // Large grenades are slightly more effective at setting off heat-sensitive mixtures than smaller grenades. threatscale = 1.1 // 10% more effective. -/obj/item/grenade/chem_grenade/large/prime() +/obj/item/grenade/chem_grenade/large/prime(mob/living/lanced_by) if(stage != READY) return FALSE @@ -287,7 +287,7 @@ return ..() -/obj/item/grenade/chem_grenade/adv_release/prime() +/obj/item/grenade/chem_grenade/adv_release/prime(mob/living/lanced_by) if(stage != READY) return FALSE diff --git a/code/game/objects/items/grenades/clusterbuster.dm b/code/game/objects/items/grenades/clusterbuster.dm index 728c6a0b57..9980ff34ce 100644 --- a/code/game/objects/items/grenades/clusterbuster.dm +++ b/code/game/objects/items/grenades/clusterbuster.dm @@ -14,7 +14,7 @@ var/max_spawned = 8 var/segment_chance = 35 -/obj/item/grenade/clusterbuster/prime() +/obj/item/grenade/clusterbuster/prime(mob/living/lanced_by) . = ..() update_mob() var/numspawned = rand(min_spawned,max_spawned) @@ -30,7 +30,7 @@ new payload_spawner(drop_location(), payload, numspawned)//Launches payload playsound(src, prime_sound, 75, 1, -3) - resolve() + qdel(src) ////////////////////// //Clusterbang segment @@ -60,10 +60,10 @@ step_away(src,loc) addtimer(CALLBACK(src, .proc/prime), rand(15,60)) -/obj/item/grenade/clusterbuster/segment/prime() +/obj/item/grenade/clusterbuster/segment/prime(mob/living/lanced_by) new payload_spawner(drop_location(), payload, rand(min_spawned,max_spawned)) playsound(src, prime_sound, 75, 1, -3) - resolve() + qdel(src) ////////////////////////////////// //The payload spawner effect diff --git a/code/game/objects/items/grenades/emgrenade.dm b/code/game/objects/items/grenades/emgrenade.dm index 5780dc1bbf..815a3b343c 100644 --- a/code/game/objects/items/grenades/emgrenade.dm +++ b/code/game/objects/items/grenades/emgrenade.dm @@ -4,8 +4,8 @@ icon_state = "emp" item_state = "emp" -/obj/item/grenade/empgrenade/prime() +/obj/item/grenade/empgrenade/prime(mob/living/lanced_by) . = ..() update_mob() empulse(src, 4, 10) - resolve() + qdel(src) diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm index 2965f98a05..f51db9fa4c 100644 --- a/code/game/objects/items/grenades/flashbang.dm +++ b/code/game/objects/items/grenades/flashbang.dm @@ -6,7 +6,7 @@ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' var/flashbang_range = 7 //how many tiles away the mob will be stunned. -/obj/item/grenade/flashbang/prime() +/obj/item/grenade/flashbang/prime(mob/living/lanced_by) . = ..() update_mob() var/flashbang_turf = get_turf(src) @@ -16,7 +16,7 @@ playsound(flashbang_turf, 'sound/weapons/flashbang.ogg', 100, TRUE, 8, 0.9) new /obj/effect/dummy/lighting_obj (flashbang_turf, LIGHT_COLOR_WHITE, (flashbang_range + 2), 4, 2) flashbang_mobs(flashbang_turf, flashbang_range) - resolve() + qdel(src) /obj/item/grenade/flashbang/proc/flashbang_mobs(turf/source, range) var/list/banged = get_hearers_in_view(range, source) @@ -45,142 +45,40 @@ M.DefaultCombatKnockdown(max(200/max(1,distance), 60)) /obj/item/grenade/stingbang - - - name = "stingbang" - - - icon_state = "timeg" - - - item_state = "flashbang" - - - lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' - - - righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' - - - var/flashbang_range = 1 //how many tiles away the mob will be stunned. - - - shrapnel_type = /obj/item/projectile/bullet/pellet/stingball - - - shrapnel_radius = 5 - - - custom_premium_price = 700 // mostly gotten through cargo, but throw in one for the sec vendor ;) - - - - - - /obj/item/grenade/stingbang/mega - - - name = "mega stingbang" - - - shrapnel_type = /obj/item/projectile/bullet/pellet/stingball/mega - - - shrapnel_radius = 12 - - - - - - -/obj/item/grenade/stingbang/prime() - - - +/obj/item/grenade/stingbang/prime(mob/living/lanced_by) if(iscarbon(loc)) - - - var/mob/living/carbon/C = loc - - - var/obj/item/bodypart/B = C.get_holding_bodypart_of_item(src) - - - if(B) - - - C.visible_message("[src] goes off in [C]'s hand, blowing [C.p_their()] [B.name] to bloody shreds!", "[src] goes off in your hand, blowing your [B.name] to bloody shreds!") - - - B.dismember() - - - - - - . = ..() - - - update_mob() - - - var/flashbang_turf = get_turf(src) - - - if(!flashbang_turf) - - - return - - - do_sparks(rand(5, 9), FALSE, src) - - - playsound(flashbang_turf, 'sound/weapons/flashbang.ogg', 50, TRUE, 8, 0.9) - - - new /obj/effect/dummy/lighting_obj (flashbang_turf, LIGHT_COLOR_WHITE, (flashbang_range + 2), 2, 1) - - - for(var/mob/living/M in get_hearers_in_view(flashbang_range, flashbang_turf)) - - - pop(get_turf(M), M) - - - - resolve() + qdel(src) /obj/item/grenade/stingbang/proc/pop(turf/T , mob/living/M) if(M.stat == DEAD) //They're dead! @@ -194,7 +92,7 @@ M.Knockdown(max(100/max(1,distance), 60)) //Bang - if(!distance || loc == M || loc == M.loc) //Stop allahu akbarring rooms with this. + if(!distance || loc == M || loc == M.loc) M.Paralyze(20) M.Knockdown(200) M.soundbang_act(1, 200, 10, 15) @@ -222,10 +120,10 @@ rots++ user.changeNext_move(CLICK_CD_RAPID) -/obj/item/grenade/primer/prime() +/obj/item/grenade/primer/prime(mob/living/lanced_by) shrapnel_radius = round(rots / rots_per_mag) . = ..() - resolve() + qdel(src) /obj/item/grenade/primer/stingbang name = "rotsting" diff --git a/code/game/objects/items/grenades/ghettobomb.dm b/code/game/objects/items/grenades/ghettobomb.dm index dad1fdb6a2..3553d79faf 100644 --- a/code/game/objects/items/grenades/ghettobomb.dm +++ b/code/game/objects/items/grenades/ghettobomb.dm @@ -50,11 +50,11 @@ cut_overlay("improvised_grenade_filled") preprime(user, null, FALSE) -/obj/item/grenade/iedcasing/prime() //Blowing that can up +/obj/item/grenade/iedcasing/prime(mob/living/lanced_by) //Blowing that can up . = ..() update_mob() explosion(src.loc,-1,-1,2, flame_range = 4) // small explosion, plus a very large fireball. - resolve() + qdel(src) /obj/item/grenade/iedcasing/examine(mob/user) . = ..() diff --git a/code/game/objects/items/grenades/grenade.dm b/code/game/objects/items/grenades/grenade.dm index bb99bf3d6e..7a6157bf65 100644 --- a/code/game/objects/items/grenades/grenade.dm +++ b/code/game/objects/items/grenades/grenade.dm @@ -112,7 +112,7 @@ icon_state = initial(icon_state) + "_active" addtimer(CALLBACK(src, .proc/prime), isnull(delayoverride)? det_time : delayoverride) -/obj/item/grenade/proc/prime() +/obj/item/grenade/proc/prime(mob/living/lanced_by) var/turf/T = get_turf(src) log_game("Grenade detonation at [AREACOORD(T)], location [loc]") @@ -120,7 +120,7 @@ shrapnel_initialized = TRUE AddComponent(/datum/component/pellet_cloud, projectile_type=shrapnel_type, magnitude=shrapnel_radius) - SEND_SIGNAL(src, COMSIG_GRENADE_PRIME) + SEND_SIGNAL(src, COMSIG_GRENADE_PRIME, lanced_by) if(ex_dev || ex_heavy || ex_light || ex_flame) explosion(loc, ex_dev, ex_heavy, ex_light, flame_range = ex_flame) @@ -165,13 +165,3 @@ /obj/item/proc/grenade_prime_react(obj/item/grenade/nade) return - -/// Don't call qdel() directly on the grenade after it booms, call this instead so it can still resolve its pellet_cloud component if it has shrapnel, then the component will qdel it - - - -/obj/item/grenade/proc/resolve() - if(shrapnel_type) - moveToNullspace() - else - qdel(src) \ No newline at end of file diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index 77cc0cd59f..ebf50cbc3d 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -158,7 +158,7 @@ shout_syndicate_crap(user) explosion(user,0,2,0) //Cheap explosion imitation because putting prime() here causes runtimes user.gib(1, 1) - resolve() + qdel(src) /obj/item/grenade/plastic/update_icon_state() if(nadeassembly) @@ -207,7 +207,7 @@ else return ..() -/obj/item/grenade/plastic/c4/prime() +/obj/item/grenade/c4/prime(mob/living/lanced_by) if(QDELETED(src)) return . = ..() @@ -222,7 +222,7 @@ location = get_turf(src) if(location) explosion(location,0,0,3) - resolve() + qdel(src) /obj/item/grenade/plastic/c4/attack(mob/M, mob/user, def_zone) return diff --git a/code/game/objects/items/grenades/smokebomb.dm b/code/game/objects/items/grenades/smokebomb.dm index ef779ac8e4..1b856fc013 100644 --- a/code/game/objects/items/grenades/smokebomb.dm +++ b/code/game/objects/items/grenades/smokebomb.dm @@ -17,7 +17,7 @@ qdel(smoke) return ..() -/obj/item/grenade/smokebomb/prime() +/obj/item/grenade/smokebomb/prime(mob/living/lanced_by) . = ..() update_mob() playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) @@ -29,4 +29,4 @@ var/damage = round(30/(get_dist(B,src)+1)) B.take_damage(damage, BURN, "melee", 0) sleep(80) - resolve() + qdel(src) diff --git a/code/game/objects/items/grenades/spawnergrenade.dm b/code/game/objects/items/grenades/spawnergrenade.dm index 594e5ad2e5..a8b0fa3cd3 100644 --- a/code/game/objects/items/grenades/spawnergrenade.dm +++ b/code/game/objects/items/grenades/spawnergrenade.dm @@ -7,7 +7,7 @@ var/spawner_type = null // must be an object path var/deliveryamt = 1 // amount of type to deliver -/obj/item/grenade/spawnergrenade/prime() // Prime now just handles the two loops that query for people in lockers and people who can see it. +/obj/item/grenade/spawnergrenade/prime(mob/living/lanced_by) // Prime now just handles the two loops that query for people in lockers and people who can see it. . = ..() update_mob() if(spawner_type && deliveryamt) @@ -20,7 +20,7 @@ // Spawn some hostile syndicate critters and spread them out spawn_and_random_walk(spawner_type, T, deliveryamt, walk_chance=50, admin_spawn=((flags_1 & ADMIN_SPAWNED_1) ? TRUE : FALSE)) - resolve() + qdel(src) /obj/item/grenade/spawnergrenade/manhacks name = "viscerator delivery grenade" diff --git a/code/game/objects/items/grenades/syndieminibomb.dm b/code/game/objects/items/grenades/syndieminibomb.dm index ae2877dcaf..9f12edeb17 100644 --- a/code/game/objects/items/grenades/syndieminibomb.dm +++ b/code/game/objects/items/grenades/syndieminibomb.dm @@ -10,10 +10,10 @@ ex_flame = 2 -/obj/item/grenade/syndieminibomb/prime() +/obj/item/grenade/syndieminibomb/prime(mob/living/lanced_by) . = ..() update_mob() - resolve() + qdel(src) /obj/item/grenade/syndieminibomb/concussion name = "HE Grenade" @@ -39,10 +39,10 @@ shrapnel_type = /obj/item/projectile/bullet/shrapnel/mega shrapnel_radius = 12 -/obj/item/grenade/frag/prime() +/obj/item/grenade/frag/prime(mob/living/lanced_by) . = ..() update_mob() - resolve() + qdel(src) /obj/item/grenade/gluon desc = "An advanced grenade that releases a harmful stream of gluons inducing radiation in those nearby. These gluon streams will also make victims feel exhausted, and induce shivering. This extreme coldness will also likely wet any nearby floors." @@ -54,7 +54,7 @@ var/rad_damage = 350 var/stamina_damage = 30 -/obj/item/grenade/gluon/prime() +/obj/item/grenade/gluon/prime(mob/living/lanced_by) . = ..() update_mob() playsound(loc, 'sound/effects/empulse.ogg', 50, 1) @@ -66,4 +66,4 @@ for(var/mob/living/carbon/L in T) L.adjustStaminaLoss(stamina_damage) L.adjust_bodytemperature(-230) - resolve() + qdel(src) diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm index fca85952c9..738eb03fbf 100644 --- a/code/modules/cargo/packs/security.dm +++ b/code/modules/cargo/packs/security.dm @@ -8,7 +8,7 @@ /datum/supply_pack/security group = "Security" - access_any = ACCESS_FORENSICS_LOCKERS //| ACCESS_SECURITY + access = ACCESS_SECURITY crate_type = /obj/structure/closet/crate/secure/gear can_private_buy = FALSE diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm index 851753da46..f4748ccde8 100644 --- a/code/modules/hydroponics/grown/citrus.dm +++ b/code/modules/hydroponics/grown/citrus.dm @@ -195,7 +195,7 @@ /obj/item/reagent_containers/food/snacks/grown/firelemon/ex_act(severity) qdel(src) //Ensuring that it's deleted by its own explosion -/obj/item/reagent_containers/food/snacks/grown/firelemon/proc/prime() +/obj/item/reagent_containers/food/snacks/grown/firelemon/proc/prime(mob/living/lanced_by) switch(seed.potency) //Combustible lemons are alot like IEDs, lots of flame, very little bang. if(0 to 30) update_mob() diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index f356ed7b68..e5c8f72dfe 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -223,7 +223,7 @@ /obj/item/reagent_containers/food/snacks/grown/cherry_bomb/ex_act(severity) qdel(src) //Ensuring that it's deleted by its own explosion. Also prevents mass chain reaction with piles of cherry bombs -/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/prime() +/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/prime(mob/living/lanced_by) icon_state = "cherry_bomb_lit" playsound(src, 'sound/effects/fuse.ogg', seed.potency, 0) addtimer(CALLBACK(src, /obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/detonate), rand(50, 100)) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index d20553d8ad..b3b49cb7cd 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -1,5 +1,5 @@ -/mob/living/proc/run_armor_check(def_zone = null, attack_flag = "melee", absorb_text = null, soften_text = null, silent=FALSE, armour_penetration, penetrated_text) +/mob/living/proc/run_armor_check(def_zone = null, attack_flag = "melee", absorb_text = null, soften_text = null, armour_penetration, penetrated_text, silent=FALSE) var/armor = getarmor(def_zone, attack_flag) if(armor <= 0)