diff --git a/baystation12.dme b/baystation12.dme index 4887f131f1..4b86c0bcd8 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -486,6 +486,7 @@ #include "code\game\objects\items\toys.dm" #include "code\game\objects\items\trash.dm" #include "code\game\objects\items\devices\aicard.dm" +#include "code\game\objects\items\devices\binoculars.dm" #include "code\game\objects\items\devices\chameleonproj.dm" #include "code\game\objects\items\devices\debugger.dm" #include "code\game\objects\items\devices\flash.dm" diff --git a/code/game/objects/items/devices/binoculars.dm b/code/game/objects/items/devices/binoculars.dm new file mode 100644 index 0000000000..c756f6f311 --- /dev/null +++ b/code/game/objects/items/devices/binoculars.dm @@ -0,0 +1,94 @@ +/obj/item/device/binoculars + + name = "binoculars" + desc = "A pair of binoculars." + icon_state = "binoculars" + + flags = FPRINT | TABLEPASS| CONDUCT + force = 5.0 + w_class = 2.0 + throwforce = 5.0 + throw_range = 15 + throw_speed = 3 + + //matter = list("metal" = 50,"glass" = 50) + + var/tileoffset = 11 //client view offset in the direction the user is facing + var/viewsize = 12 //how far out this thing zooms. 7 is normal view + + var/zoom = 0 + +/obj/item/device/binoculars/dropped(mob/user) + user.client.view = world.view + user.client.pixel_x = 0 + user.client.pixel_y = 0 + + + +/* +This is called from +modules/mob/mob_movement.dm if you move you will be zoomed out +modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. +*/ + +/obj/item/device/binoculars/verb/zoom() + set category = "Object" + set name = "Use" + set popup_menu = 1 + + if(usr.stat || !(istype(usr,/mob/living/carbon/human))) + usr << "You are unable to focus through the binoculars." + return + if(!zoom && global_hud.darkMask[1] in usr.client.screen) + usr << "Your welding equipment gets in the way of you looking through the binoculars" + return + if(!zoom && usr.get_active_hand() != src) + usr << "You are too distracted to look through the binoculars, perhaps if it was in your active hand this might work better" + return + + if(usr.client.view == world.view) + if(!usr.hud_used.hud_shown) + usr.button_pressed_F12(1) // If the user has already limited their HUD this avoids them having a HUD when they zoom in + usr.button_pressed_F12(1) + usr.client.view = viewsize + zoom = 1 + + var/tilesize = 32 + var/viewoffset = tilesize * tileoffset + + switch(usr.dir) + if (NORTH) + usr.client.pixel_x = 0 + usr.client.pixel_y = viewoffset + if (SOUTH) + usr.client.pixel_x = 0 + usr.client.pixel_y = -viewoffset + if (EAST) + usr.client.pixel_x = viewoffset + usr.client.pixel_y = 0 + if (WEST) + usr.client.pixel_x = -viewoffset + usr.client.pixel_y = 0 + + if(istype(usr,/mob/living/carbon/human/)) + var/mob/living/carbon/human/H = usr + usr.visible_message("[usr] holds [src] up to [H.get_visible_gender() == MALE ? "his" : H.get_visible_gender() == FEMALE ? "her" : "their"] eyes.") + else + usr.visible_message("[usr] holds [src] up to its eyes.") + + else + usr.client.view = world.view + if(!usr.hud_used.hud_shown) + usr.button_pressed_F12(1) + zoom = 0 + + usr.client.pixel_x = 0 + usr.client.pixel_y = 0 + + usr.visible_message("[usr] lowers [src].") + + return + + +/obj/item/device/binoculars/attack_self(mob/user) + zoom() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index e15a622950..a3d508b022 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1306,6 +1306,10 @@ var/obj/item/weapon/gun/energy/sniperrifle/s = locate() in src if(s.zoom) s.zoom() + if(locate(/obj/item/device/binoculars, contents)) + var/obj/item/device/binoculars/b = locate() in src + if(b.zoom) + b.zoom() else sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index ee7ae00560..3b1b0b1cb8 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -194,6 +194,10 @@ var/obj/item/weapon/gun/energy/sniperrifle/s = locate() in mob if(s.zoom) s.zoom() + if(locate(/obj/item/device/binoculars, mob.contents)) // If mob moves while zoomed in with binoculars, unzoom them. + var/obj/item/device/binoculars/b = locate() in mob + if(b.zoom) + b.zoom() if(Process_Grab()) return diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 2992b4c274..a2151f12a5 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -229,6 +229,8 @@ obj/item/weapon/gun/energy/staff/focus /obj/item/weapon/gun/energy/sniperrifle/dropped(mob/user) user.client.view = world.view + user.client.pixel_x = 0 + user.client.pixel_y = 0 @@ -241,7 +243,8 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. /obj/item/weapon/gun/energy/sniperrifle/verb/zoom() set category = "Object" set name = "Use Sniper Scope" - set popup_menu = 0 + set popup_menu = 1 + if(usr.stat || !(istype(usr,/mob/living/carbon/human))) usr << "You are unable to focus down the scope of the rifle." return @@ -258,10 +261,33 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. usr.button_pressed_F12(1) usr.client.view = 12 zoom = 1 + + var/tileoffset = 11 //client view offset in the direction the user is facing + var/tilesize = 32 + var/viewoffset = tilesize * tileoffset + + switch(usr.dir) + if (NORTH) + usr.client.pixel_x = 0 + usr.client.pixel_y = viewoffset + if (SOUTH) + usr.client.pixel_x = 0 + usr.client.pixel_y = -viewoffset + if (EAST) + usr.client.pixel_x = viewoffset + usr.client.pixel_y = 0 + if (WEST) + usr.client.pixel_x = -viewoffset + usr.client.pixel_y = 0 + else usr.client.view = world.view if(!usr.hud_used.hud_shown) usr.button_pressed_F12(1) zoom = 0 + + usr.client.pixel_x = 0 + usr.client.pixel_y = 0 + usr << "Zoom mode [zoom?"en":"dis"]abled." return diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index bf2b6c4d5b..afc7c69532 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ