part 4
This commit is contained in:
@@ -92,6 +92,8 @@
|
||||
if(!weapon.isEmbedHarmless())
|
||||
harmful = TRUE
|
||||
|
||||
weapon.embedded(parent)
|
||||
|
||||
if(iscarbon(parent))
|
||||
initCarbon()
|
||||
else if(isclosedturf(parent))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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, "<span class='danger'>*click*</span>")
|
||||
|
||||
/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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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("<b><span class='danger'>[src] goes off in [C]'s hand, blowing [C.p_their()] [B.name] to bloody shreds!</span></b>", "<span class='userdanger'>[src] goes off in your hand, blowing your [B.name] to bloody shreds!</span>")
|
||||
|
||||
|
||||
|
||||
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"
|
||||
|
||||
@@ -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)
|
||||
. = ..()
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user