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.dm b/code/game/objects/items.dm index c7f8fadfcb..c121bf746f 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -38,6 +38,8 @@ var/armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) var/list/allowed = null //suit storage stuff. var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers. + var/zoomdevicename = null //name used for message when binoculars/scope is used + var/zoom = 0 //1 if item is actively being used to zoom. For scoped guns and binoculars. /* Species-specific sprites, concept stolen from Paradise//vg/. ex: @@ -218,6 +220,11 @@ // apparently called whenever an item is removed from a slot, container, or anything else. /obj/item/proc/dropped(mob/user as mob) ..() + if(zoom) //binoculars, scope, etc + user.client.view = world.view + user.client.pixel_x = 0 + user.client.pixel_y = 0 + zoom = 0 // called just as an item is picked up (loc is not yet changed) /obj/item/proc/pickup(mob/user) @@ -619,3 +626,78 @@ var/obj/item/I = get_active_hand() if(I && !I.abstract) I.showoff(src) + +/* +For zooming with scope or binoculars. 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/proc/zoom(var/tileoffset = 11,var/viewsize = 12) //tileoffset is client view offset in the direction the user is facing. viewsize is how far out this thing zooms. 7 is normal view + + var/devicename + + if(zoomdevicename) + devicename = zoomdevicename + else + devicename = src.name + + var/cannotzoom + + if(usr.stat || !(istype(usr,/mob/living/carbon/human))) + usr << "You are unable to focus through the [devicename]" + cannotzoom = 1 + else if(!zoom && global_hud.darkMask[1] in usr.client.screen) + usr << "Your welding equipment gets in the way of you looking through the [devicename]" + cannotzoom = 1 + else if(!zoom && usr.get_active_hand() != src) + usr << "You are too distracted to look through the [devicename], perhaps if it was in your active hand this might work better" + cannotzoom = 1 + + if(!zoom && !cannotzoom) + 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 + + usr.visible_message("[usr] peers through the [devicename].") + + /* + if(istype(usr,/mob/living/carbon/human/)) + var/mob/living/carbon/human/H = usr + usr.visible_message("[usr] holds [devicename] up to [H.get_visible_gender() == MALE ? "his" : H.get_visible_gender() == FEMALE ? "her" : "their"] eyes.") + else + usr.visible_message("[usr] holds [devicename] 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 + + if(!cannotzoom) + usr.visible_message("[usr] lowers the [devicename].") + + return \ No newline at end of file diff --git a/code/game/objects/items/devices/binoculars.dm b/code/game/objects/items/devices/binoculars.dm new file mode 100644 index 0000000000..e1c7b18a72 --- /dev/null +++ b/code/game/objects/items/devices/binoculars.dm @@ -0,0 +1,18 @@ +/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) + + +/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..70ba0805f5 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1301,11 +1301,22 @@ if(!druggy) see_invisible = SEE_INVISIBLE_LEVEL_TWO if(healths) healths.icon_state = "health7" //DEAD healthmeter if(client) - if(client.view != world.view) + if(client.view != world.view) // If mob moves while zoomed in with device, unzoom them. + for(var/obj/item/item in contents) + if(item.zoom) + item.zoom() + break + + /* if(locate(/obj/item/weapon/gun/energy/sniperrifle, contents)) 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..9244b55e48 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -189,11 +189,21 @@ Process_Incorpmove(direct) return if(mob.client) - if(mob.client.view != world.view) + if(mob.client.view != world.view) // If mob moves while zoomed in with device, unzoom them. + for(var/obj/item/item in mob.contents) + if(item.zoom) + item.zoom() + break + /* if(locate(/obj/item/weapon/gun/energy/sniperrifle, mob.contents)) // If mob moves while zoomed in with sniper rifle, unzoom them. 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..cfb5e2cf3d 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -225,43 +225,11 @@ obj/item/weapon/gun/energy/staff/focus charge_cost = 250 fire_delay = 35 w_class = 4.0 - var/zoom = 0 + zoomdevicename = "sniper scope" -/obj/item/weapon/gun/energy/sniperrifle/dropped(mob/user) - user.client.view = world.view - - - -/* -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/weapon/gun/energy/sniperrifle/verb/zoom() +/obj/item/weapon/gun/energy/sniperrifle/verb/scope() set category = "Object" - set name = "Use Sniper Scope" - set popup_menu = 0 - if(usr.stat || !(istype(usr,/mob/living/carbon/human))) - usr << "You are unable to focus down the scope of the rifle." - return - if(!zoom && global_hud.darkMask[1] in usr.client.screen) - usr << "Your welding equipment gets in the way of you looking down the scope" - return - if(!zoom && usr.get_active_hand() != src) - usr << "You are too distracted to look down the scope, perhaps if it was in your active hand this might work better" - return + set name = "Use Scope" + set popup_menu = 1 - 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 = 12 - zoom = 1 - else - usr.client.view = world.view - if(!usr.hud_used.hud_shown) - usr.button_pressed_F12(1) - zoom = 0 - usr << "Zoom mode [zoom?"en":"dis"]abled." - return + zoom() 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