diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 818abd5098d..a4d55e4236c 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -140,6 +140,7 @@ var/datum/subsystem/ticker/ticker
if(!mode.can_start())
world << "Unable to start [mode.name]. Not enough players, [mode.required_players] players and [mode.required_enemies] eligible antagonists needed. Reverting to pre-game lobby."
qdel(mode)
+ mode = null
SSjob.ResetOccupations()
return 0
@@ -151,6 +152,7 @@ var/datum/subsystem/ticker/ticker
if(!Debug2)
if(!can_continue)
qdel(mode)
+ mode = null
world << "Error setting up [master_mode]. Reverting to pre-game lobby."
SSjob.ResetOccupations()
return 0
@@ -291,8 +293,11 @@ var/datum/subsystem/ticker/ticker
flick("station_intact",cinematic)
world << sound('sound/ambience/signal.ogg')
sleep(100)
- if(cinematic) qdel(cinematic)
- if(temp_buckle) qdel(temp_buckle)
+ if(cinematic)
+ qdel(cinematic)
+ cinematic = null
+ if(temp_buckle)
+ qdel(temp_buckle)
return //Faster exit, since nothing happened
else //Station nuked (nuke,explosion,summary)
flick("intro_nuke",cinematic)
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 21b7b401754..8cc89bfb8c7 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -668,6 +668,7 @@ What a mess.*/
if(active2)
data_core.security -= active2
qdel(active2)
+ active2 = null
if("Delete Record (ALL) Execute")
if(active1)
@@ -679,10 +680,12 @@ What a mess.*/
break
data_core.general -= active1
qdel(active1)
+ active1 = null
if(active2)
data_core.security -= active2
qdel(active2)
+ active2 = null
else
temp = "This function does not appear to be working at the moment. Our apologies."
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 46a6f1e7429..571a2cf61a3 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -140,27 +140,28 @@ Gunshots/explosions/opening doors/less rare audio (done)
radius++
if(radius > FAKE_FLOOD_MAX_RADIUS)
qdel(src)
+ return
Expand()
next_expand = world.time + FAKE_FLOOD_EXPAND_TIME
- return
/obj/effect/hallucination/fake_flood/proc/Expand()
- if(!flood_turfs) //for qdel
- return
for(var/turf/T in circlerangeturfs(loc,radius))
if((T in flood_turfs)|| T.blocks_air)
continue
flood_images += image(image_icon,T,image_state,MOB_LAYER)
flood_turfs += T
- if(target.client) target.client.images |= flood_images
- return
+ if(target.client)
+ target.client.images |= flood_images
/obj/effect/hallucination/fake_flood/Destroy()
SSobj.processing.Remove(src)
qdel(flood_turfs)
- if(target.client) target.client.images.Remove(flood_images)
+ flood_turfs = list()
+ if(target.client)
+ target.client.images.Remove(flood_images)
target = null
qdel(flood_images)
+ flood_images = list()
return ..()
/obj/effect/hallucination/simple/xeno
diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm
index 80afb0f065c..507a224cc35 100644
--- a/code/modules/projectiles/firing.dm
+++ b/code/modules/projectiles/firing.dm
@@ -6,7 +6,7 @@
ready_proj(target, user, quiet, zone_override)
if(distro)
targloc = spread(targloc, curloc, distro)
- if(!throw_proj(targloc, user, params))
+ if(!throw_proj(target, targloc, user, params))
return 0
if(i > 1)
newshot()
@@ -15,7 +15,7 @@
update_icon()
return 1
-/obj/item/ammo_casing/proc/ready_proj(atom/target as mob|obj|turf, mob/living/user, quiet, zone_override = "")
+/obj/item/ammo_casing/proc/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
if (!BB)
return
BB.original = target
@@ -30,14 +30,15 @@
reagents.trans_to(BB, reagents.total_volume) //For chemical darts/bullets
qdel(reagents)
-/obj/item/ammo_casing/proc/throw_proj(var/turf/targloc, mob/living/user as mob|obj, params)
+/obj/item/ammo_casing/proc/throw_proj(atom/target, turf/targloc, mob/living/user, params)
var/turf/curloc = user.loc
if (!istype(targloc) || !istype(curloc) || !BB)
return 0
if(targloc == curloc)
- if(BB.original == user) //if we target ourselves we go straight to bullet_act()
- user.bullet_act(BB, BB.def_zone)
+ if(target) //if the target is right on our location we go straight to bullet_act()
+ target.bullet_act(BB, BB.def_zone)
qdel(BB)
+ BB = null
return 1
BB.loc = get_turf(user)
BB.starting = get_turf(user)
@@ -51,7 +52,6 @@
BB.p_x = text2num(mouse_control["icon-x"])
if(mouse_control["icon-y"])
BB.p_y = text2num(mouse_control["icon-y"])
-
if(BB)
BB.fire()
BB = null
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 02729e68ac9..e2ebfac6b69 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -122,14 +122,14 @@
/obj/item/weapon/gun/afterattack(atom/target as mob|obj|turf, mob/living/carbon/human/user as mob|obj, flag, params)//TODO: go over this
if(flag) //It's adjacent, is the user, or is on the user's person
- if(istype(target, /mob/) && !(target in user.contents) && target != user && user.a_intent == "harm")
- //We make sure that it is a mob, it's not us or part of us.
- return //Flogging action
- else if(ishuman(target) && ishuman(user))
- if(user.zone_sel.selecting == "mouth")
- handle_suicide(user, target, params)
- return
- else
+ if(target in user.contents) //can't shoot stuff inside us.
+ return
+ if(!ismob(target) || user.a_intent == "harm") //melee attack
+ return
+ if(user.zone_sel.selecting == "mouth")
+ handle_suicide(user, target, params)
+ return
+ if(target == user) //so we can't shoot ourselves (unless mouth selected)
return
//Exclude lasertag guns from the CLUMSY check.
@@ -385,10 +385,11 @@
semicd = 1
if(!do_mob(user, target, 120) || user.zone_sel.selecting != "mouth")
- if(user == target && user)
- user.visible_message("[user] decided life was worth living.")
- else if(user && target && target.Adjacent(user))
- target.visible_message("[user] has decided to spare [target]'s life.", "[user] has decided to spare your life!")
+ if(user)
+ if(user == target)
+ user.visible_message("[user] decided life was worth living.")
+ else if(target && target.Adjacent(user))
+ target.visible_message("[user] has decided to spare [target]'s life.", "[user] has decided to spare your life!")
semicd = 0
return
diff --git a/html/changelogs/phil235-BugFixBoogalooA.yml b/html/changelogs/phil235-BugFixBoogalooA.yml
new file mode 100644
index 00000000000..494c6f7f4e8
--- /dev/null
+++ b/html/changelogs/phil235-BugFixBoogalooA.yml
@@ -0,0 +1,10 @@
+
+author: phil235
+
+delete-after: True
+
+changes:
+ - bugfix: "Fixes critical bug causing multiple hits from single projectile."
+ - bugfix: "Fixes not being able to shoot a mob on same tile as the shooter."
+ - bugfix: "Clicking your mob (without targeting your mouth) no longer causes you to shoot yourself."
+ - bugfix: "Fixes not being able to shoot non human mobs at point blank."