diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index 527578727a2..0dfb63d8877 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -356,6 +356,10 @@
icon_state = "impact_laser_purple"
duration = 4
+/obj/effect/temp_visual/impact_effect/yellow_laser
+ icon_state = "impact_laser_yellow"
+ duration = 4
+
/obj/effect/temp_visual/impact_effect/ion
icon_state = "shieldsparkles"
duration = 6
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
index c1e40323915..e8c2bf7ef55 100644
--- a/code/modules/projectiles/ammunition/energy.dm
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -316,16 +316,16 @@
..(mimic_type)
/obj/item/ammo_casing/energy/detective
- projectile_type = /obj/item/projectile/energy/detective
+ projectile_type = /obj/item/projectile/beam/laser/detective
fire_sound = 'sound/weapons/gunshots/gunshot_det_energy.ogg'
select_name = "disabler"
/obj/item/ammo_casing/energy/detective/tracker_warrant
- projectile_type = /obj/item/projectile/energy/detective/tracker_warrant_shot
+ projectile_type = /obj/item/projectile/beam/laser/detective/tracker_warrant_shot
e_cost = 50
select_name = "tracker and warrant generator"
/obj/item/ammo_casing/energy/detective/overcharge
- projectile_type = /obj/item/projectile/energy/detective/overcharged
+ projectile_type = /obj/item/projectile/beam/laser/detective/overcharged
e_cost = 200
select_name = "overcharged"
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index c4743e80fcb..2f4a2171637 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -161,3 +161,69 @@
var/mob/living/L = target
L.visible_message("[L] explodes!")
L.gib()
+
+/obj/item/projectile/beam/laser/detective
+ name = "energy revolver shot"
+ icon_state = "omnilaser"
+ light_color = LIGHT_COLOR_CYAN
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
+ damage = 5
+ stamina = 25
+ eyeblur = 2 SECONDS
+
+/obj/item/projectile/beam/laser/detective/overcharged
+ name = "overcharged shot"
+ icon_state = "spark"
+ light_color = LIGHT_COLOR_DARKRED
+ color = LIGHT_COLOR_DARKRED
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser
+ damage = 45
+ stamina = 15
+ eyeblur = 4 SECONDS
+
+/obj/item/projectile/beam/laser/detective/tracker_warrant_shot
+ name = "tracker shot"
+ icon_state = "yellow_laser"
+ light_color = LIGHT_COLOR_YELLOW
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/yellow_laser
+ stamina = 0
+ reflectability = REFLECTABILITY_PHYSICAL //No mr cult juggernaught, please don't set me to search!
+
+/obj/item/projectile/beam/laser/detective/tracker_warrant_shot/on_hit(atom/target)
+ . = ..()
+ if(!ishuman(target))
+ no_worky(target)
+ return
+ start_tracking(target)
+ set_warrant(target)
+
+/obj/item/projectile/beam/laser/detective/tracker_warrant_shot/proc/start_tracking(atom/target)
+ var/obj/item/gun/energy/detective/D = firer_source_atom
+ if(!D)
+ no_worky(target)
+ return
+ if(D.tracking_target_UID)
+ no_worky(tracking_already = TRUE)
+ return
+ D.start_pointing(target.UID())
+
+/obj/item/projectile/beam/laser/detective/tracker_warrant_shot/proc/set_warrant(atom/target)
+ var/mob/living/carbon/human/target_to_mark = target
+ var/perpname = target_to_mark.get_visible_name(TRUE)
+ if(!perpname || perpname == "Unknown")
+ no_worky(target, warrant_fail = TRUE)
+ return
+ var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.security)
+ if(!R || (R.fields["criminal"] in list(SEC_RECORD_STATUS_EXECUTE, SEC_RECORD_STATUS_ARREST)))
+ no_worky(target, warrant_fail = TRUE)
+ return
+ set_criminal_status(firer, R, SEC_RECORD_STATUS_SEARCH, "Target tagged by Detective Revolver", "Detective Revolver")
+
+/obj/item/projectile/beam/laser/detective/tracker_warrant_shot/proc/no_worky(atom/target, tracking_already, warrant_fail)
+ if(tracking_already)
+ to_chat(firer, "Weapon Alert: You are already tracking a target!")
+ return
+ if(warrant_fail)
+ to_chat(firer, "Weapon Alert: unable to generate warrant on [target]!")
+ return
+ to_chat(firer, "Weapon Alert: unable to track [target]!")
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index 2600942c342..d9ed934b1c1 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -147,66 +147,3 @@
armour_penetration = 10 // It can have a little armor pen, as a treat. Bigger than it looks, energy armor is often low.
shield_buster = TRUE
reflectability = REFLECTABILITY_PHYSICAL //I will let eswords block it like a normal projectile, but it's not getting reflected, and eshields will take the hit hard. Carp still can reflect though, screw you.
-
-/obj/item/projectile/energy/detective
- name = "energy revolver shot"
- icon_state = "omnilaser"
- light_color = LIGHT_COLOR_CYAN
- damage = 5
- stamina = 25
- eyeblur = 2 SECONDS
-
-/obj/item/projectile/energy/detective/overcharged
- name = "overcharged shot"
- icon_state = "spark"
- light_color = LIGHT_COLOR_DARKRED
- color = LIGHT_COLOR_DARKRED
- damage = 45
- stamina = 15
- eyeblur = 4 SECONDS
-
-/obj/item/projectile/energy/detective/tracker_warrant_shot
- name = "tracker shot"
- icon_state = "yellow_laser"
- light_color = LIGHT_COLOR_YELLOW
- stamina = 0
- reflectability = REFLECTABILITY_PHYSICAL //No mr cult juggernaught, please don't set me to search!
-
-/obj/item/projectile/energy/detective/tracker_warrant_shot/on_hit(atom/target)
- . = ..()
- if(!ishuman(target))
- no_worky(target)
- return
- start_tracking(target)
- set_warrant(target)
-
-/obj/item/projectile/energy/detective/tracker_warrant_shot/proc/start_tracking(atom/target)
- var/obj/item/gun/energy/detective/D = firer_source_atom
- if(!D)
- no_worky(target)
- return
- if(D.tracking_target_UID)
- no_worky(tracking_already = TRUE)
- return
- D.start_pointing(target.UID())
-
-/obj/item/projectile/energy/detective/tracker_warrant_shot/proc/set_warrant(atom/target)
- var/mob/living/carbon/human/target_to_mark = target
- var/perpname = target_to_mark.get_visible_name(TRUE)
- if(!perpname || perpname == "Unknown")
- no_worky(target, warrant_fail = TRUE)
- return
- var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.security)
- if(!R || (R.fields["criminal"] in list(SEC_RECORD_STATUS_EXECUTE, SEC_RECORD_STATUS_ARREST)))
- no_worky(target, warrant_fail = TRUE)
- return
- set_criminal_status(firer, R, SEC_RECORD_STATUS_SEARCH, "Target tagged by Detective Revolver", "Detective Revolver")
-
-/obj/item/projectile/energy/detective/tracker_warrant_shot/proc/no_worky(atom/target, tracking_already, warrant_fail)
- if(tracking_already)
- to_chat(firer, "Weapon Alert: You are already tracking a target!")
- return
- if(warrant_fail)
- to_chat(firer, "Weapon Alert: unable to generate warrant on [target]!")
- return
- to_chat(firer, "Weapon Alert: unable to track [target]!")
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index ca22e157c9c..82fd651d595 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ