diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm
index 9a5928665c..3aba3d05f2 100644
--- a/code/game/objects/items/pneumaticCannon.dm
+++ b/code/game/objects/items/pneumaticCannon.dm
@@ -26,8 +26,31 @@
var/fire_mode = PCANNON_FIREALL
var/automatic = FALSE
var/clumsyCheck = TRUE
+ var/list/allowed_typecache //Leave as null to allow all.
+ var/charge_amount = 1
+ var/charge_ticks = 1
+ var/charge_tick = 0
+ var/charge_type
+ var/selfcharge = FALSE
trigger_guard = TRIGGER_GUARD_NORMAL
+
+/obj/item/pneumatic_cannon/Initialize()
+ . = ..()
+ if(selfcharge)
+ init_charge()
+
+/obj/item/pneumatic_cannon/proc/init_charge() //wrapper so it can be vv'd easier
+ START_PROCESSING(SSobj, src)
+
+/obj/item/pneumatic_cannon/process()
+ if(++charge_tick >= charge_ticks && charge_type)
+ fill_with_type(charge_type, charge_amount)
+
+/obj/item/pneumatic_cannon/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
/obj/item/pneumatic_cannon/CanItemAutoclick()
return automatic
@@ -75,6 +98,10 @@
load_item(IW, user)
/obj/item/pneumatic_cannon/proc/can_load_item(obj/item/I, mob/user)
+ if(allowed_typecache && is_type_in_typecache(I, allowed_typecache))
+ if(user)
+ to_chat(user, "[I] won't fit into [src]!")
+ return
if((loadedWeightClass + I.w_class) > maxWeightClass) //Only make messages if there's a user
if(user)
to_chat(user, "\The [I] won't fit into \the [src]!")
@@ -233,28 +260,14 @@
throw_amount = 1
maxWeightClass = 150 //50 pies. :^)
clumsyCheck = FALSE
+ var/static/list/pie_typecache = typecacheof(/obj/item/reagent_containers/food/snacks/pie)
-/obj/item/pneumatic_cannon/pie/can_load_item(obj/item/I, mob/user)
- if(istype(I, /obj/item/reagent_containers/food/snacks/pie))
- return ..()
- to_chat(user, "[src] only accepts pies!")
- return FALSE
-
+/obj/item/pneumatic_cannon/pie/Initialize()
+ . = ..()
+ allowed_typecache = pie_typecache
+
/obj/item/pneumatic_cannon/pie/selfcharge
automatic = TRUE
- var/charge_amount = 1
- var/charge_ticks = 1
- var/charge_tick = 0
+ selfcharge = TRUE
+ charge_type = /obj/item/reagent_containers/food/snacks/pie/cream
maxWeightClass = 60 //20 pies.
-
-/obj/item/pneumatic_cannon/pie/selfcharge/Initialize()
- . = ..()
- START_PROCESSING(SSobj, src)
-
-/obj/item/pneumatic_cannon/pie/selfcharge/Destroy()
- STOP_PROCESSING(SSobj, src)
- return ..()
-
-/obj/item/pneumatic_cannon/pie/selfcharge/process()
- if(++charge_tick >= charge_ticks)
- fill_with_type(/obj/item/reagent_containers/food/snacks/pie/cream, charge_amount)