diff --git a/aurorastation.dme b/aurorastation.dme
index f17dca66d65..48f613ddabf 100644
--- a/aurorastation.dme
+++ b/aurorastation.dme
@@ -755,6 +755,7 @@
#include "code\game\objects\items\devices\floor_painter.dm"
#include "code\game\objects\items\devices\hacktool.dm"
#include "code\game\objects\items\devices\holowarrant.dm"
+#include "code\game\objects\items\devices\laserpointer.dm"
#include "code\game\objects\items\devices\lightmeter.dm"
#include "code\game\objects\items\devices\lightreplacer.dm"
#include "code\game\objects\items\devices\magnetic_lock.dm"
diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm
new file mode 100644
index 00000000000..807d7af9898
--- /dev/null
+++ b/code/game/objects/items/devices/laserpointer.dm
@@ -0,0 +1,128 @@
+
+
+/obj/item/device/laser_pointer
+ name = "laser pointer"
+ desc = "Don't shine it in your eyes!"
+ icon = 'icons/obj/device.dmi'
+ icon_state = "pointer"
+ item_state = "pen"
+ var/pointer_icon_state
+ slot_flags = SLOT_BELT
+ w_class = 1
+ var/turf/pointer_loc
+ var/obj/item/weapon/stock_parts/micro_laser/diode //cant use the laser without it
+
+
+
+
+/obj/item/device/laser_pointer/red
+ pointer_icon_state = "red_laser"
+/obj/item/device/laser_pointer/green
+ pointer_icon_state = "green_laser"
+/obj/item/device/laser_pointer/blue
+ pointer_icon_state = "blue_laser"
+/obj/item/device/laser_pointer/purple
+ pointer_icon_state = "purple_laser"
+
+
+/obj/item/device/laser_pointer/Initialize()
+ . = ..()
+ diode = new(src)
+ icon_state = "pointer"
+ if(!pointer_icon_state)
+ pointer_icon_state = pick("red_laser","green_laser","blue_laser","purple_laser")
+
+/obj/item/device/laser_pointer/upgraded/Initialize()
+ . = ..()
+ diode = new /obj/item/weapon/stock_parts/micro_laser/ultra
+
+
+
+/obj/item/device/laser_pointer/attack(mob/living/M, mob/user)
+ laser_act(M, user)
+
+/obj/item/device/laser_pointer/attackby(obj/item/W, mob/user)
+ if(istype(W, /obj/item/weapon/stock_parts/micro_laser))
+ if(!diode)
+ user.drop_item()
+ W.forceMove(src)
+ diode = W
+ to_chat(user, "You install a [diode.name] in [src].")
+ else
+ to_chat(user, "[src] already has a laser diode.")
+
+ else if(istype(W, /obj/item/weapon/screwdriver))
+ if(diode)
+ to_chat(user, "You remove the [diode.name] from the [src].")
+ diode.forceMove(get_turf(user))
+ diode = null
+ return
+ ..()
+ return
+
+/obj/item/device/laser_pointer/afterattack(var/atom/target, var/mob/living/user, flag, params)
+ if(flag) //we're placing the object on a table or in backpack
+ return
+ laser_act(target, user)
+
+/obj/item/device/laser_pointer/proc/laser_act(var/atom/target, var/mob/living/user)
+ if( !(user in (viewers(7,target))) )
+ return
+ if (!diode)
+ to_chat(user, "You point [src] at [target], but nothing happens!")
+ return
+ if (!user.IsAdvancedToolUser())
+ to_chat(user, "You don't have the dexterity to do this!")
+ return
+
+ add_fingerprint(user)
+
+
+ var/outmsg
+ var/turf/targloc = get_turf(target)
+
+ if(istype(target, /obj/machinery/camera))
+ var/obj/machinery/camera/C = target
+
+ if(prob(25))
+ C.emp_act(28)
+ outmsg = "You hit the lens of [C] with [src], temporarily disabling the camera!"
+
+ admin_attack_log(user, src,"hits the camera with a laser pointer", "EMPd a camera with a laser pointer")
+
+ else
+ outmsg = "You fail to hit the lens of [C] with [src]."
+
+ if(iscarbon(target))
+ if(user.zone_sel.selecting == "eyes")
+ var/mob/living/carbon/C = target
+ if(C.eyecheck() <= 0 && prob(30))
+ outmsg = "You blind [C] with [src]"
+ C.eye_blind = 3
+ else
+ outmsg = "You fail to blind [C] with [src]"
+
+ //laser pointer image
+ icon_state = "pointer_[pointer_icon_state]"
+ var/list/showto = list()
+ for(var/mob/M in range(7,targloc))
+ if(M.client)
+ showto += M.client
+ var/image/I = image('icons/obj/projectiles.dmi',targloc,pointer_icon_state,10)
+ I.pixel_x = target.pixel_x + rand(-5,5)
+ I.pixel_y = target.pixel_y + rand(-5,5)
+
+ if(outmsg)
+ to_chat(user, outmsg)
+ else
+ to_chat(user, "You point [src] at [target].")
+
+
+ flick_overlay(I, showto, 10)
+ icon_state = "pointer"
+
+/obj/item/device/laser_pointer/Destroy()
+ if (diode)
+ QDEL_NULL(diode)
+
+ . = ..()
\ No newline at end of file
diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm
index 2e28e5471ee..69c798ce110 100644
--- a/code/game/objects/random/random.dm
+++ b/code/game/objects/random/random.dm
@@ -1005,7 +1005,10 @@
/obj/item/eightball = 11,
/obj/item/eightball/haunted = 1,
/obj/item/eightball/broken = 1,
- /obj/item/weapon/spirit_board = 5
+ /obj/item/weapon/spirit_board = 5,
+ /obj/item/device/laser_pointer = 1
+
+
)
/obj/random/arcade/orion
diff --git a/html/changelogs/laserpointers.yml b/html/changelogs/laserpointers.yml
new file mode 100644
index 00000000000..0d73ae9ab40
--- /dev/null
+++ b/html/changelogs/laserpointers.yml
@@ -0,0 +1,37 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+# balance
+#################################
+
+# Your name.
+author: Drago
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Adds laser pointers."
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index 3a46959f49f..718a93f5be6 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ