diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm
index eec67985c08..de6176c3c7c 100644
--- a/code/game/gamemodes/gang/recaller.dm
+++ b/code/game/gamemodes/gang/recaller.dm
@@ -228,7 +228,7 @@
pointcost = 10
if("C4")
if(gang.points >= 10)
- item_type = /obj/item/weapon/c4
+ item_type = /obj/item/weapon/grenade/plastic/c4
pointcost = 10
if("pen")
if((gang.points >= 50) || free_pen)
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index 00da8edcade..1b784656308 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -4,20 +4,19 @@
name = "C-4"
desc = "Used to put holes in specific areas without too much extra hole."
gender = PLURAL
- icon = 'icons/obj/assemblies.dmi'
+ icon = 'icons/obj/grenade.dmi'
icon_state = "plastic-explosive0"
item_state = "plasticx"
flags = NOBLUDGEON
w_class = 2
origin_tech = "syndicate=2"
var/timer = 10
- var/atom/target = null
var/open_panel = 0
- var/image_overlay = null
+ parent_type = /obj/item/weapon/grenade/plastic/c4
/obj/item/weapon/c4/New()
wires = new /datum/wires/explosive/c4(src)
- image_overlay = image('icons/obj/assemblies.dmi', "plastic-explosive2")
+ image_overlay = image('icons/obj/grenade.dmi', "plastic-explosive2")
..()
/obj/item/weapon/c4/Destroy()
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 54c322dee79..e7d18f91de5 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -267,13 +267,15 @@
var/total_volume = 0
for(var/obj/item/weapon/reagent_containers/RC in beakers)
total_volume += RC.reagents.total_volume
-
+ if(!total_volume)
+ qdel(src)
+ qdel(nadeassembly)
+ return
var/fraction = unit_spread/total_volume
var/datum/reagents/reactants = new(unit_spread)
reactants.my_atom = src
for(var/obj/item/weapon/reagent_containers/RC in beakers)
RC.reagents.trans_to(reactants, RC.reagents.total_volume*fraction, threatscale, 1, 1)
-
chem_splash(get_turf(src), affected_area, list(reactants), ignition_temp, threatscale)
if(nadeassembly)
@@ -283,15 +285,12 @@
var/area/A = get_area(T)
message_admins("grenade primed by an assembly, attached by [key_name_admin(M)](?) (FLW) and last touched by [key_name_admin(last)](?) (FLW) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).")
log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])")
-
+ else
+ addtimer(src, "prime", det_time)
var/turf/DT = get_turf(src)
var/area/DA = get_area(DT)
log_game("A grenade detonated at [DA.name] ([DT.x], [DT.y], [DT.z])")
- if(total_volume < unit_spread) // If that was the last detonation, delete the grenade to prevent reusing it. Keep in mind, an explosion might destroy the grenade before it can detonate again anyways.
- update_mob()
- qdel(src)
-
diff --git a/code/game/objects/items/weapons/grenades/plastic.dm b/code/game/objects/items/weapons/grenades/plastic.dm
new file mode 100644
index 00000000000..f4ec3cff3e5
--- /dev/null
+++ b/code/game/objects/items/weapons/grenades/plastic.dm
@@ -0,0 +1,180 @@
+/obj/item/weapon/grenade/plastic
+ name = "plastic explosive"
+ desc = "Used to put holes in specific areas without too much extra hole."
+ icon_state = "plastic-explosive0"
+ item_state = "plastic-explosive"
+ flags = NOBLUDGEON
+ det_time = 10
+ display_timer = 0
+ var/atom/target = null
+ var/image_overlay = null
+ var/obj/item/device/assembly_holder/nadeassembly = null
+ var/assemblyattacher
+
+/obj/item/weapon/grenade/plastic/New()
+ image_overlay = image('icons/obj/grenade.dmi', "[item_state]2")
+ ..()
+
+/obj/item/weapon/grenade/plastic/Destroy()
+ qdel(nadeassembly)
+ nadeassembly = null
+ target = null
+ ..()
+
+/obj/item/weapon/grenade/plastic/attackby(obj/item/I, mob/user, params)
+ if(!nadeassembly && istype(I, /obj/item/device/assembly_holder))
+ var/obj/item/device/assembly_holder/A = I
+ if(!user.unEquip(I))
+ return ..()
+ nadeassembly = A
+ A.master = src
+ A.loc = src
+ assemblyattacher = user.ckey
+ user << "You add [A] to the [name]."
+ playsound(src, 'sound/weapons/tap.ogg', 20, 1)
+ update_icon()
+ return
+ if(nadeassembly && istype(I, /obj/item/weapon/wirecutters))
+ playsound(src, 'sound/items/Wirecutter.ogg', 20, 1)
+ nadeassembly.loc = get_turf(src)
+ nadeassembly.master = null
+ nadeassembly = null
+ update_icon()
+ return
+ ..()
+
+//assembly stuff
+/obj/item/weapon/grenade/plastic/receive_signal()
+ prime()
+
+/obj/item/weapon/grenade/plastic/Crossed(atom/movable/AM)
+ if(nadeassembly)
+ nadeassembly.Crossed(AM)
+
+/obj/item/weapon/grenade/plastic/on_found(mob/finder)
+ if(nadeassembly)
+ nadeassembly.on_found(finder)
+
+/obj/item/weapon/grenade/plastic/attack_self(mob/user)
+ if(nadeassembly)
+ nadeassembly.attack_self(user)
+ return
+ var/newtime = input(usr, "Please set the timer.", "Timer", 10) as num
+ if(user.get_active_hand() == src)
+ newtime = Clamp(newtime, 10, 60000)
+ det_time = newtime
+ user << "Timer set for [det_time] seconds."
+
+/obj/item/weapon/grenade/plastic/afterattack(atom/movable/AM, mob/user, flag)
+ if (!flag)
+ return
+ if (istype(AM, /mob/living/carbon))
+ return
+ user << "You start planting the [src]. The timer is set to [det_time]..."
+
+ if(do_after(user, 50, target = AM))
+ if(!user.unEquip(src))
+ return
+ src.target = AM
+ loc = null
+
+ message_admins("[key_name_admin(user)](?) (FLW) planted [src.name] on [target.name] at ([target.x],[target.y],[target.z] - JMP) with [det_time] second fuse",0,1)
+ log_game("[key_name(user)] planted [src.name] on [target.name] at ([target.x],[target.y],[target.z]) with [det_time] second fuse")
+
+ target.overlays += image_overlay
+ if(!nadeassembly)
+ user << "You plant the bomb. Timer counting down from [det_time]."
+ addtimer(src, "prime", det_time*10)
+
+/obj/item/weapon/grenade/plastic/suicide_act(mob/user)
+ message_admins("[key_name_admin(user)](?) (FLW) suicided with [src.name] at ([user.x],[user.y],[user.z] - JMP)",0,1)
+ message_admins("[key_name(user)] suicided with [src.name] at ([user.x],[user.y],[user.z])")
+ user.visible_message("[user] activates the [src.name] and holds it above \his head! It looks like \he's going out with a bang!")
+ var/message_say = "FOR NO RAISIN!"
+ if(user.mind)
+ if(user.mind.special_role)
+ var/role = lowertext(user.mind.special_role)
+ if(role == "traitor" || role == "syndicate")
+ message_say = "FOR THE SYNDICATE!"
+ else if(role == "changeling")
+ message_say = "FOR THE HIVE!"
+ else if(role == "cultist")
+ message_say = "FOR NAR-SIE!"
+ else if(role == "revolutionary" || role == "head revolutionary")
+ message_say = "VIVA LA REVOLUTION!"
+ else if(user.mind.gang_datum)
+ message_say = "[uppertext(user.mind.gang_datum.name)] RULES!"
+ user.say(message_say)
+ target = user
+ sleep(10)
+ prime()
+ user.gib(no_brain = 1)
+
+/obj/item/weapon/grenade/plastic/update_icon()
+ if(nadeassembly)
+ icon_state = "[item_state]1"
+ else
+ icon_state = "[item_state]0"
+
+//////////////////////////
+///// The Explosives /////
+//////////////////////////
+
+/obj/item/weapon/grenade/plastic/c4
+ name = "C4"
+ desc = "Used to put holes in specific areas without too much extra hole. A saboteurs favourite."
+
+/obj/item/weapon/grenade/plastic/c4/prime()
+ var/turf/location
+ if(target)
+ if(!qdeleted(target))
+ location = get_turf(target)
+ target.overlays -= image_overlay
+ else
+ location = get_turf(src)
+ if(location)
+ location.ex_act(2, target)
+ explosion(location,0,0,3)
+ if(istype(target, /mob))
+ var/mob/M = target
+ M.gib()
+ qdel(src)
+
+// X4 is an upgraded directional variant of c4 which is relatively safe to be standing next to. And much less safe to be standing on the other side of.
+// C4 is intended to be used for infiltration, and destroying tech. X4 is intended to be used for heavy breaching and tight spaces.
+// Intended to replace C4 for nukeops, and to be a randomdrop in surplus/random traitor purchases.
+
+/obj/item/weapon/grenade/plastic/x4
+ name = "X4"
+ desc = "A specialized shaped high explosive breaching charge. Designed to be safer for the user, and less so, for the wall."
+ var/aim_dir = NORTH
+ icon_state = "plasticx40"
+ item_state = "plasticx4"
+
+/obj/item/weapon/grenade/plastic/x4/prime()
+ var/turf/location
+ if(target)
+ if(!qdeleted(target))
+ location = get_turf(target)
+ target.overlays -= image_overlay
+ else
+ location = get_turf(src)
+ if(location)
+ if(istype(loc, /obj/item/weapon/twohanded/spear))
+ explosion(location, 0, 2, 3)
+ else if(target.density)
+ var/turf/T = get_step(location, aim_dir)
+ explosion(get_step(T, aim_dir),0,0,3)
+ explosion(T,0,2,0)
+ location.ex_act(2, target)
+ else
+ explosion(location, 0, 2, 3)
+ location.ex_act(2, target)
+ if(istype(target, /mob))
+ var/mob/M = target
+ M.gib()
+ qdel(src)
+
+/obj/item/weapon/grenade/plastic/x4/afterattack(atom/movable/AM, mob/user, flag)
+ aim_dir = get_dir(user,AM)
+ ..()
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index bdea527638a..3cab28cd5f8 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -484,9 +484,15 @@
..()
contents = list()
for(var/i in 1 to 10)
- new /obj/item/weapon/c4(src)
+ new /obj/item/weapon/grenade/plastic/c4(src)
return
+/obj/item/weapon/storage/backpack/dufflebag/syndie/x4/New()
+ ..()
+ contents = list()
+ for(var/i in 1 to 3)
+ new /obj/item/weapon/grenade/plastic/x4(src)
+
/obj/item/weapon/storage/backpack/dufflebag/syndie/firestarter
desc = "A large dufflebag containing New Russian pyro backpack sprayer, a pistol, a pipebomb, fireproof hardsuit, ammo, and other equipment."
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index 21949a40966..4ccc4803f1d 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -48,7 +48,7 @@
new /obj/item/weapon/gun/projectile/revolver(src)
new /obj/item/ammo_box/a357(src)
new /obj/item/weapon/card/emag(src)
- new /obj/item/weapon/c4(src)
+ new /obj/item/weapon/grenade/plastic/c4(src)
new /obj/item/clothing/gloves/color/latex/nitrile(src)
new /obj/item/clothing/mask/gas/clown_hat(src)
new /obj/item/clothing/under/suit_jacket/really_black(src)
@@ -86,8 +86,8 @@
return
if("sabotage")
- new /obj/item/weapon/c4 (src)
- new /obj/item/weapon/c4 (src)
+ new /obj/item/weapon/grenade/plastic/c4 (src)
+ new /obj/item/weapon/grenade/plastic/c4 (src)
new /obj/item/device/doorCharge(src)
new /obj/item/device/doorCharge(src)
new /obj/item/device/camera_bug(src)
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 7e524588548..87ec29a6261 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -318,7 +318,7 @@
explosive.prime()
qdel(src)
- //THIS MIGHT BE UNBALANCED SO I DUNNO
+ //THIS MIGHT BE UNBALANCED SO I DUNNO // it totally is.
/obj/item/weapon/twohanded/spear/throw_impact(atom/target)
. = ..()
if(!.) //not caught
@@ -326,7 +326,6 @@
explosive.prime()
qdel(src)
-
/obj/item/weapon/twohanded/spear/AltClick()
..()
if(!explosive)
@@ -337,16 +336,6 @@
if(input)
src.war_cry = input
-//Placeholder C4 "grenade" for use on this spear
-/obj/item/weapon/grenade/C4
- name = "C-4"
- desc = "A brick of C-4."
-
-/obj/item/weapon/grenade/C4/prime()
- update_mob()
- explosion(src.loc,-1,1,3)
- qdel(src)
-
/obj/item/weapon/twohanded/spear/CheckParts()
if(explosive)
explosive.loc = get_turf(src.loc)
@@ -357,12 +346,6 @@
name = "explosive lance"
desc = "A makeshift spear with [G] attached to it. Alt+click on the spear to set your war cry!"
return
- var/obj/item/weapon/c4/C4 = locate() in contents
- if(C4)
- var /obj/item/weapon/grenade/C4/C42 = new /obj/item/weapon/grenade/C4(src)
- qdel(C4)
- explosive = C42
- desc = "A makeshift spear with [C42] attached to it. Alt+click on the spear to set your war cry!"
update_icon()
// CHAINSAW
diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm
index fc452c13888..1a2c68e9d8b 100644
--- a/code/modules/awaymissions/mission_code/snowdin.dm
+++ b/code/modules/awaymissions/mission_code/snowdin.dm
@@ -124,7 +124,7 @@ obj/item/weapon/paper/crumpled/snowdin/shovel
/obj/item/weapon/storage/firstaid/brute = 27,
/obj/item/weapon/storage/firstaid/fire = 27,
/obj/item/weapon/storage/toolbox/syndicate = 12,
- /obj/item/weapon/c4 = 7,
+ /obj/item/weapon/grenade/plastic/c4 = 7,
/obj/item/weapon/grenade/clusterbuster/smoke = 15,
/obj/item/clothing/under/chameleon = 13,
/obj/item/clothing/shoes/chameleon = 10,
diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm
index e32ca287c73..e1f8ad0bdcc 100644
--- a/code/modules/clothing/outfits/standard.dm
+++ b/code/modules/clothing/outfits/standard.dm
@@ -167,7 +167,7 @@
sec_briefcase.handle_item_insertion(new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow,1)
sec_briefcase.handle_item_insertion(new /obj/item/weapon/gun/projectile/revolver/mateba,1)
sec_briefcase.handle_item_insertion(new /obj/item/ammo_box/a357,1)
- sec_briefcase.handle_item_insertion(new /obj/item/weapon/c4,1)
+ sec_briefcase.handle_item_insertion(new /obj/item/weapon/grenade/plastic/x4,1)
var/obj/item/device/pda/heads/pda = H.belt
pda.owner = H.real_name
@@ -347,7 +347,7 @@
/obj/item/weapon/storage/firstaid/regular=1,\
/obj/item/weapon/storage/box/flashbangs=1,\
/obj/item/device/flashlight=1,\
- /obj/item/weapon/c4=1)
+ /obj/item/weapon/grenade/plastic/x4=1)
/datum/outfit/death_commando/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
if(visualsOnly)
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index e8f28379376..355b92ce9ed 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -31,7 +31,7 @@
category = CAT_WEAPON
/datum/table_recipe/lance
- name = "explosive lance (grenade)"
+ name = "explosive lance"
result = /obj/item/weapon/twohanded/spear
reqs = list(/obj/item/weapon/twohanded/spear = 1,
/obj/item/weapon/grenade = 1)
@@ -39,15 +39,6 @@
time = 15
category = CAT_WEAPON
-/datum/table_recipe/lance2
- name = "explosive lance (C4)"
- result = /obj/item/weapon/twohanded/spear
- reqs = list(/obj/item/weapon/twohanded/spear = 1,
- /obj/item/weapon/c4 = 1)
- parts = list(/obj/item/weapon/c4 = 1)
- time = 40
- category = CAT_WEAPON
-
/datum/table_recipe/molotov
name = "Molotov"
@@ -321,11 +312,11 @@
category = CAT_MISC
/datum/table_recipe/chemical_payload
- name = "chemical payload (C4)"
+ name = "Chemical Payload (C4)"
result = /obj/item/weapon/bombcore/chemical
reqs = list(
- /obj/item/weapon/stock_parts/matter_bin/super = 1,
- /obj/item/weapon/c4 = 1,
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/grenade/plastic/c4 = 1,
/obj/item/weapon/grenade/chem_grenade = 2
)
parts = list(/obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/grenade/chem_grenade = 2)
@@ -333,7 +324,7 @@
category = CAT_WEAPON
/datum/table_recipe/chemical_payload2
- name = "chemical payload (gibtonite)"
+ name = "Chemical Payload (gibtonite)"
result = /obj/item/weapon/bombcore/chemical
reqs = list(
/obj/item/weapon/stock_parts/matter_bin = 1,
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 70c2a6f2870..9eca1592029 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -467,9 +467,9 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
/obj/item/weapon/cartridge/syndicate, /obj/item/clothing/under/chameleon,\
/obj/item/clothing/shoes/chameleon, /obj/item/weapon/card/id/syndicate,\
/obj/item/clothing/mask/chameleon, /obj/item/clothing/glasses/thermal,\
- /obj/item/device/chameleon, /obj/item/weapon/card/emag,\
+ /obj/item/device/chameleon, /obj/item/weapon/card/emag, /obj/item/weapon/grenade/plastic/x4,\
/obj/item/weapon/storage/toolbox/syndicate, /obj/item/weapon/aiModule,\
- /obj/item/device/radio/headset/syndicate, /obj/item/weapon/c4,\
+ /obj/item/device/radio/headset/syndicate, /obj/item/weapon/grenade/plastic/c4,\
/obj/item/device/powersink, /obj/item/weapon/storage/box/syndie_kit,\
/obj/item/toy/syndicateballoon, /obj/item/weapon/gun/energy/laser/captain,\
/obj/item/weapon/hand_tele, /obj/item/weapon/rcd, /obj/item/weapon/tank/jetpack,\
@@ -642,7 +642,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
halitem.icon_state = "revolver"
halitem.name = "Revolver"
if(2) //c4
- halitem.icon = 'icons/obj/assemblies.dmi'
+ halitem.icon = 'icons/obj/grenade.dmi'
halitem.icon_state = "plastic-explosive0"
halitem.name = "Mysterious Package"
if(prob(25))
@@ -685,7 +685,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
halimage = image('icons/effects/fire.dmi',target,"1",TURF_LAYER)
if(3)
//src << "C4"
- halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01)
+ halimage = image('icons/obj/grenade.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01)
if(client) client.images += halimage
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index bd928eb762c..44a6d648eab 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -164,7 +164,7 @@
usr << "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s back!"
return
- if(istype(item_to_add,/obj/item/weapon/c4)) // last thing he ever wears, I guess
+ if(istype(item_to_add,/obj/item/weapon/grenade/plastic)) // last thing he ever wears, I guess
item_to_add.afterattack(src,usr,1)
return
@@ -200,7 +200,7 @@
/mob/living/simple_animal/pet/dog/corgi/proc/place_on_head(obj/item/item_to_add, mob/user)
- if(istype(item_to_add,/obj/item/weapon/c4)) // last thing he ever wears, I guess
+ if(istype(item_to_add,/obj/item/weapon/grenade/plastic)) // last thing he ever wears, I guess
item_to_add.afterattack(src,user,1)
return
diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm
index 26e3f2f5302..903a523d884 100644
--- a/code/modules/ninja/ninja_event.dm
+++ b/code/modules/ninja/ninja_event.dm
@@ -206,7 +206,7 @@ Contents:
equip_to_slot_or_del(new /obj/item/clothing/glasses/night(src), slot_glasses)
equip_to_slot_or_del(EK, slot_belt)
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_r_store)
- equip_to_slot_or_del(new /obj/item/weapon/c4(src), slot_l_store)
+ equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/x4(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/weapon/tank/internals/emergency_oxygen(src), slot_s_store)
equip_to_slot_or_del(new /obj/item/weapon/tank/jetpack/carbondioxide(src), slot_back)
diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm
index 2374af37bca..e01f029a2b3 100644
--- a/code/modules/uplink/uplink_item.dm
+++ b/code/modules/uplink/uplink_item.dm
@@ -844,10 +844,10 @@ var/list/uplink_items = list() // Global list so we only initialize this once.
/datum/uplink_item/device_tools/c4
name = "Composition C-4"
- desc = "C-4 is plastic explosive of the common variety Composition C. You can use it to breach walls or connect \
- a signaler to its wiring to make it remotely detonable. It has a modifiable timer with a \
+ desc = "C-4 is plastic explosive of the common variety Composition C. You can use it to breach walls, sabotage equipment, or connect \
+ an assembly to it in order to alter the way it detonates. It has a modifiable timer with a \
minimum setting of 10 seconds."
- item = /obj/item/weapon/c4
+ item = /obj/item/weapon/grenade/plastic/c4
cost = 1
/datum/uplink_item/device_tools/c4bag
@@ -856,6 +856,13 @@ var/list/uplink_items = list() // Global list so we only initialize this once.
item = /obj/item/weapon/storage/backpack/dufflebag/syndie/c4
cost = 9 //10% discount!
+/datum/uplink_item/device_tools/x4bag
+ name = "Bag of X-4 explosives"
+ desc = "Contains 3 X-4 plastic explosives. Similar, but more powerful than C-4. X-4 can be placed on a solid surface, such as a wall or window, and it will \
+ blast through the wall, injuring anything on the opposite side, while being safer to the user. For when you want a wider, deeper, hole."
+ item = /obj/item/weapon/storage/backpack/dufflebag/syndie/x4
+ cost = 4 //
+
/datum/uplink_item/device_tools/powersink
name = "Power Sink"
desc = "When screwed to wiring attached to a power grid and activated, this large device places excessive \
diff --git a/icons/obj/assemblies.dmi b/icons/obj/assemblies.dmi
index 5a8719da0d8..6a862a263a8 100644
Binary files a/icons/obj/assemblies.dmi and b/icons/obj/assemblies.dmi differ
diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi
index e17974ecd19..4e38271e7ee 100644
Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 1aa9e1d273d..c4a050388ca 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -643,6 +643,7 @@
#include "code\game\objects\items\weapons\grenades\flashbang.dm"
#include "code\game\objects\items\weapons\grenades\ghettobomb.dm"
#include "code\game\objects\items\weapons\grenades\grenade.dm"
+#include "code\game\objects\items\weapons\grenades\plastic.dm"
#include "code\game\objects\items\weapons\grenades\smokebomb.dm"
#include "code\game\objects\items\weapons\grenades\spawnergrenade.dm"
#include "code\game\objects\items\weapons\grenades\syndieminibomb.dm"