mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-26 05:27:01 +01:00
Merge pull request #9044 from Fox-McCloud/camera-damage-refactor
Refactors Camera Damage and Disabling
This commit is contained in:
@@ -17,7 +17,7 @@
|
||||
return SendSignal(COMSIG_PARENT_ATTACKBY, W, user, params)
|
||||
|
||||
/obj/attackby(obj/item/I, mob/living/user, params)
|
||||
return ..() || I.attack_obj(src, user)
|
||||
return ..() || (can_be_hit && I.attack_obj(src, user))
|
||||
|
||||
/mob/living/attackby(obj/item/I, mob/living/user, params)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
|
||||
@@ -3,52 +3,33 @@
|
||||
/datum/wires/camera
|
||||
random = 0
|
||||
holder_type = /obj/machinery/camera
|
||||
wire_count = 6
|
||||
wire_count = 2
|
||||
|
||||
/datum/wires/camera/get_status()
|
||||
. = ..()
|
||||
var/obj/machinery/camera/C = holder
|
||||
. += "The focus light is [(C.view_range == initial(C.view_range)) ? "on" : "off"]."
|
||||
. += "The power link light is [C.can_use() ? "on" : "off"]."
|
||||
. += "The camera light is [C.light_disabled ? "off" : "on"]."
|
||||
. += "The alarm light is [C.alarm_on ? "on" : "off"]."
|
||||
|
||||
/datum/wires/camera/CanUse(mob/living/L)
|
||||
var/obj/machinery/camera/C = holder
|
||||
if(!C.panel_open)
|
||||
return 0
|
||||
return 1
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
var/const/CAMERA_WIRE_FOCUS = 1
|
||||
var/const/CAMERA_WIRE_POWER = 2
|
||||
var/const/CAMERA_WIRE_LIGHT = 4
|
||||
var/const/CAMERA_WIRE_ALARM = 8
|
||||
var/const/CAMERA_WIRE_NOTHING1 = 16
|
||||
var/const/CAMERA_WIRE_NOTHING2 = 32
|
||||
|
||||
/datum/wires/camera/GetWireName(index)
|
||||
switch(index)
|
||||
if(CAMERA_WIRE_FOCUS)
|
||||
return "Focus"
|
||||
|
||||
|
||||
if(CAMERA_WIRE_POWER)
|
||||
return "Power"
|
||||
|
||||
if(CAMERA_WIRE_LIGHT)
|
||||
return "Light"
|
||||
|
||||
if(CAMERA_WIRE_ALARM)
|
||||
return "Alarm"
|
||||
|
||||
if(CAMERA_WIRE_NOTHING1)
|
||||
return "Nothing"
|
||||
|
||||
if(CAMERA_WIRE_NOTHING2)
|
||||
return "Nothing"
|
||||
|
||||
/datum/wires/camera/UpdateCut(index, mended)
|
||||
var/obj/machinery/camera/C = holder
|
||||
|
||||
switch(index)
|
||||
if(CAMERA_WIRE_FOCUS)
|
||||
var/range = (mended ? initial(C.view_range) : C.short_range)
|
||||
@@ -56,16 +37,8 @@ var/const/CAMERA_WIRE_NOTHING2 = 32
|
||||
|
||||
if(CAMERA_WIRE_POWER)
|
||||
if(C.status && !mended || !C.status && mended)
|
||||
C.toggle_cam(usr, 1)
|
||||
|
||||
if(CAMERA_WIRE_LIGHT)
|
||||
C.light_disabled = !mended
|
||||
|
||||
if(CAMERA_WIRE_ALARM)
|
||||
if(!mended)
|
||||
C.triggerCameraAlarm()
|
||||
else
|
||||
C.cancelCameraAlarm()
|
||||
C.toggle_cam(usr, TRUE)
|
||||
C.obj_integrity = C.max_integrity //this is a pretty simplistic way to heal the camera, but there's no reason for this to be complex.
|
||||
..()
|
||||
|
||||
/datum/wires/camera/UpdatePulsed(index)
|
||||
@@ -79,16 +52,10 @@ var/const/CAMERA_WIRE_NOTHING2 = 32
|
||||
|
||||
if(CAMERA_WIRE_POWER)
|
||||
C.toggle_cam(null) // Deactivate the camera
|
||||
|
||||
if(CAMERA_WIRE_LIGHT)
|
||||
C.light_disabled = !C.light_disabled
|
||||
|
||||
if(CAMERA_WIRE_ALARM)
|
||||
C.visible_message("[bicon(C)] *beep*", "[bicon(C)] *beep*")
|
||||
..()
|
||||
|
||||
/datum/wires/camera/proc/CanDeconstruct()
|
||||
if(IsIndexCut(CAMERA_WIRE_POWER) && IsIndexCut(CAMERA_WIRE_FOCUS) && IsIndexCut(CAMERA_WIRE_LIGHT) && IsIndexCut(CAMERA_WIRE_NOTHING1) && IsIndexCut(CAMERA_WIRE_NOTHING2))
|
||||
return 1
|
||||
if(IsIndexCut(CAMERA_WIRE_POWER) && IsIndexCut(CAMERA_WIRE_FOCUS))
|
||||
return TRUE
|
||||
else
|
||||
return 0
|
||||
return FALSE
|
||||
@@ -6,15 +6,18 @@
|
||||
use_power = 2
|
||||
idle_power_usage = 5
|
||||
active_power_usage = 10
|
||||
layer = 5
|
||||
layer = WALL_OBJ_LAYER
|
||||
|
||||
armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0)
|
||||
var/datum/wires/camera/wires = null // Wires datum
|
||||
max_integrity = 100
|
||||
integrity_failure = 50
|
||||
var/list/network = list("SS13")
|
||||
var/c_tag = null
|
||||
var/c_tag_order = 999
|
||||
var/status = 1
|
||||
anchored = 1
|
||||
var/start_active = 0 //If it ignores the random chance to start broken on round start
|
||||
anchored = TRUE
|
||||
var/start_active = FALSE //If it ignores the random chance to start broken on round start
|
||||
var/invuln = null
|
||||
var/obj/item/camera_bug/bug = null
|
||||
var/obj/item/camera_assembly/assembly = null
|
||||
@@ -24,17 +27,14 @@
|
||||
var/view_range = 7
|
||||
var/short_range = 2
|
||||
|
||||
var/light_disabled = 0
|
||||
var/alarm_on = 0
|
||||
var/busy = 0
|
||||
var/emped = 0 //Number of consecutive EMP's on this camera
|
||||
var/busy = FALSE
|
||||
var/emped = FALSE //Number of consecutive EMP's on this camera
|
||||
|
||||
var/toggle_message = 'sound/items/Wirecutter.ogg'
|
||||
var/toggle_sound = 'sound/items/Wirecutter.ogg'
|
||||
|
||||
/obj/machinery/camera/New()
|
||||
..()
|
||||
wires = new(src)
|
||||
|
||||
assembly = new(src)
|
||||
assembly.state = 4
|
||||
assembly.anchored = 1
|
||||
@@ -46,14 +46,14 @@
|
||||
/obj/machinery/camera/Initialize()
|
||||
..()
|
||||
if(is_station_level(z) && prob(3) && !start_active)
|
||||
toggle_cam()
|
||||
toggle_cam(null, FALSE)
|
||||
wires.CutAll()
|
||||
|
||||
/obj/machinery/camera/Destroy()
|
||||
toggle_cam(null, 0) //kick anyone viewing out
|
||||
toggle_cam(null, FALSE) //kick anyone viewing out
|
||||
QDEL_NULL(assembly)
|
||||
if(istype(bug))
|
||||
bug.bugged_cameras -= src.c_tag
|
||||
bug.bugged_cameras -= c_tag
|
||||
if(bug.current == src)
|
||||
bug.current = null
|
||||
bug = null
|
||||
@@ -71,147 +71,124 @@
|
||||
return
|
||||
if(!isEmpProof())
|
||||
if(prob(150/severity))
|
||||
icon_state = "[initial(icon_state)]emp"
|
||||
update_icon()
|
||||
var/list/previous_network = network
|
||||
network = list()
|
||||
cameranet.removeCamera(src)
|
||||
stat |= EMPED
|
||||
set_light(0)
|
||||
emped = emped+1 //Increase the number of consecutive EMP's
|
||||
update_icon()
|
||||
var/thisemp = emped //Take note of which EMP this proc is for
|
||||
spawn(900)
|
||||
if(loc) //qdel limbo
|
||||
if(!QDELETED(src))
|
||||
triggerCameraAlarm() //camera alarm triggers even if multiple EMPs are in effect.
|
||||
if(emped == thisemp) //Only fix it if the camera hasn't been EMP'd again
|
||||
network = previous_network
|
||||
icon_state = initial(icon_state)
|
||||
stat &= ~EMPED
|
||||
cancelCameraAlarm()
|
||||
update_icon()
|
||||
if(can_use())
|
||||
cameranet.addCamera(src)
|
||||
emped = 0 //Resets the consecutive EMP count
|
||||
spawn(100)
|
||||
if(!QDELETED(src))
|
||||
cancelCameraAlarm()
|
||||
for(var/mob/O in mob_list)
|
||||
if(O.client && O.client.eye == src)
|
||||
O.unset_machine()
|
||||
O.reset_perspective(null)
|
||||
to_chat(O, "The screen bursts into static.")
|
||||
for(var/mob/M in player_list)
|
||||
if(M.client && M.client.eye == src)
|
||||
M.unset_machine()
|
||||
M.reset_perspective(null)
|
||||
to_chat(M, "The screen bursts into static.")
|
||||
..()
|
||||
|
||||
/obj/machinery/camera/tesla_act(var/power)//EMP proof upgrade also makes it tesla immune
|
||||
/obj/machinery/camera/tesla_act(power)//EMP proof upgrade also makes it tesla immune
|
||||
if(isEmpProof())
|
||||
return
|
||||
..()
|
||||
qdel(src)//to prevent bomb testing camera from exploding over and over forever
|
||||
|
||||
/obj/machinery/camera/ex_act(severity, target)
|
||||
if(src.invuln)
|
||||
/obj/machinery/camera/ex_act(severity)
|
||||
if(invuln)
|
||||
return
|
||||
else
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/machinery/camera/blob_act()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/machinery/camera/attack_ghost(mob/user)
|
||||
if(panel_open)
|
||||
wires.Interact(user)
|
||||
|
||||
/obj/machinery/camera/attack_alien(mob/living/carbon/alien/humanoid/user)
|
||||
if(!istype(user))
|
||||
return
|
||||
user.do_attack_animation(src)
|
||||
add_hiddenprint(user)
|
||||
status = 0
|
||||
visible_message("<span class='warning'>\The [user] slashes at [src]!</span>")
|
||||
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
|
||||
toggle_cam(user, 0)
|
||||
|
||||
..()
|
||||
|
||||
/obj/machinery/camera/proc/setViewRange(num = 7)
|
||||
src.view_range = num
|
||||
view_range = num
|
||||
cameranet.updateVisibility(src, 0)
|
||||
|
||||
/obj/machinery/camera/attackby(obj/item/W, mob/living/user as mob, params)
|
||||
var/msg = "<span class='notice'>You attach [W] into the assembly inner circuits.</span>"
|
||||
/obj/machinery/camera/attackby(obj/item/I, mob/living/user, params)
|
||||
var/msg = "<span class='notice'>You attach [I] into the assembly inner circuits.</span>"
|
||||
var/msg2 = "<span class='notice'>The camera already has that upgrade!</span>"
|
||||
|
||||
// DECONSTRUCTION
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
// to_chat(user, "<span class='notice'>You start to [panel_open ? "close" : "open"] the camera's panel.</span>")
|
||||
//if(toggle_panel(user)) // No delay because no one likes screwdrivers trying to be hip and have a duration cooldown
|
||||
if(isscrewdriver(I))
|
||||
panel_open = !panel_open
|
||||
user.visible_message("<span class='warning'>[user] screws the camera's panel [panel_open ? "open" : "closed"]!</span>",
|
||||
"<span class='notice'>You screw the camera's panel [panel_open ? "open" : "closed"].</span>")
|
||||
playsound(src.loc, W.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'>You screw the camera's panel [panel_open ? "open" : "closed"].</span>")
|
||||
playsound(loc, I.usesound, 50, 1)
|
||||
|
||||
else if((istype(W, /obj/item/wirecutters) || istype(W, /obj/item/multitool)) && panel_open)
|
||||
else if((iswirecutter(I) || ismultitool(I)) && panel_open)
|
||||
wires.Interact(user)
|
||||
|
||||
else if(istype(W, /obj/item/weldingtool) && wires.CanDeconstruct())
|
||||
if(weld(W, user))
|
||||
to_chat(user, "You unweld the camera leaving it as just a frame screwed to the wall.")
|
||||
if(!assembly)
|
||||
assembly = new()
|
||||
assembly.loc = src.loc
|
||||
assembly.state = 1
|
||||
assembly.dir = src.dir
|
||||
assembly.update_icon()
|
||||
assembly = null
|
||||
qdel(src)
|
||||
else if(iswelder(I) && panel_open && wires.CanDeconstruct())
|
||||
var/obj/item/weldingtool/WT = I
|
||||
if(!WT.remove_fuel(0, user))
|
||||
return
|
||||
else if(istype(W, /obj/item/analyzer) && panel_open) //XRay
|
||||
if(!user.unEquip(W))
|
||||
to_chat(user, "<span class='warning'>[W] is stuck!</span>")
|
||||
to_chat(user, "<span class='notice'>You start to weld [src]...</span>")
|
||||
playsound(loc, WT.usesound, 50, 1)
|
||||
if(do_after(user, 100 * WT.toolspeed, target = src))
|
||||
user.visible_message("<span class='warning'>[user] unwelds [src], leaving it as just a frame bolted to the wall.</span>",
|
||||
"<span class='warning'>You unweld [src], leaving it as just a frame bolted to the wall</span>")
|
||||
deconstruct(TRUE)
|
||||
|
||||
else if(istype(I, /obj/item/analyzer) && panel_open) //XRay
|
||||
if(!user.drop_item())
|
||||
to_chat(user, "<span class='warning'>[I] is stuck to your hand!</span>")
|
||||
return
|
||||
if(!isXRay())
|
||||
upgradeXRay()
|
||||
qdel(W)
|
||||
qdel(I)
|
||||
to_chat(user, "[msg]")
|
||||
else
|
||||
to_chat(user, "[msg2]")
|
||||
|
||||
else if(istype(W, /obj/item/stack/sheet/mineral/plasma) && panel_open)
|
||||
if(!user.unEquip(W))
|
||||
to_chat(user, "<span class='warning'>[W] is stuck!</span>")
|
||||
else if(istype(I, /obj/item/stack/sheet/mineral/plasma) && panel_open)
|
||||
if(!user.drop_item())
|
||||
to_chat(user, "<span class='warning'>[I] is stuck to your hand!</span>")
|
||||
return
|
||||
if(!isEmpProof())
|
||||
var/obj/item/stack/sheet/mineral/plasma/P = I
|
||||
upgradeEmpProof()
|
||||
to_chat(user, "[msg]")
|
||||
qdel(W)
|
||||
P.use(1)
|
||||
else
|
||||
to_chat(user, "[msg2]")
|
||||
else if(istype(W, /obj/item/assembly/prox_sensor) && panel_open)
|
||||
if(!user.unEquip(W))
|
||||
else if(istype(I, /obj/item/assembly/prox_sensor) && panel_open)
|
||||
if(!user.drop_item())
|
||||
to_chat(user, "<span class='warning'>[I] is stuck to your hand!</span>")
|
||||
return
|
||||
if(!isMotion())
|
||||
upgradeMotion()
|
||||
to_chat(user, "[msg]")
|
||||
qdel(W)
|
||||
qdel(I)
|
||||
else
|
||||
to_chat(user, "[msg2]")
|
||||
|
||||
// OTHER
|
||||
else if((istype(W, /obj/item/paper) || istype(W, /obj/item/pda)) && isliving(user))
|
||||
else if((istype(I, /obj/item/paper) || istype(I, /obj/item/pda)) && isliving(user))
|
||||
var/mob/living/U = user
|
||||
var/obj/item/paper/X = null
|
||||
var/obj/item/pda/P = null
|
||||
var/obj/item/pda/PDA = null
|
||||
|
||||
var/itemname = ""
|
||||
var/info = ""
|
||||
if(istype(W, /obj/item/paper))
|
||||
X = W
|
||||
if(istype(I, /obj/item/paper))
|
||||
X = I
|
||||
itemname = X.name
|
||||
info = X.info
|
||||
else
|
||||
P = W
|
||||
var/datum/data/pda/app/notekeeper/N = P.find_program(/datum/data/pda/app/notekeeper)
|
||||
PDA = I
|
||||
var/datum/data/pda/app/notekeeper/N = PDA.find_program(/datum/data/pda/app/notekeeper)
|
||||
if(N)
|
||||
itemname = P.name
|
||||
itemname = PDA.name
|
||||
info = N.notehtml
|
||||
to_chat(U, "You hold \the [itemname] up to the camera ...")
|
||||
U.changeNext_move(CLICK_CD_MELEE)
|
||||
@@ -229,37 +206,59 @@
|
||||
to_chat(O, "[U] holds \a [itemname] up to one of the cameras ...")
|
||||
O << browse(text("<HTML><HEAD><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", itemname, info), text("window=[]", itemname))
|
||||
|
||||
else if(istype(W, /obj/item/camera_bug))
|
||||
if(!src.can_use())
|
||||
else if(istype(I, /obj/item/camera_bug))
|
||||
if(!can_use())
|
||||
to_chat(user, "<span class='notice'>Camera non-functional.</span>")
|
||||
return
|
||||
if(istype(src.bug))
|
||||
if(istype(bug))
|
||||
to_chat(user, "<span class='notice'>Camera bug removed.</span>")
|
||||
src.bug.bugged_cameras -= src.c_tag
|
||||
src.bug = null
|
||||
bug.bugged_cameras -= c_tag
|
||||
bug = null
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Camera bugged.</span>")
|
||||
src.bug = W
|
||||
src.bug.bugged_cameras[src.c_tag] = src
|
||||
bug = I
|
||||
bug.bugged_cameras[c_tag] = src
|
||||
|
||||
else if(istype(W, /obj/item/melee/energy/blade))//Putting it here last since it's a special case. I wonder if there is a better way to do these than type casting.
|
||||
toggle_cam(user, 1)
|
||||
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
|
||||
spark_system.set_up(5, 0, loc)
|
||||
spark_system.start()
|
||||
playsound(loc, W.usesound, 50, 1)
|
||||
playsound(loc, "sparks", 50, 1)
|
||||
visible_message("<span class='notice'>[user] has sliced the camera apart with an energy blade!</span>")
|
||||
qdel(src)
|
||||
|
||||
else if(istype(W, /obj/item/laser_pointer))
|
||||
var/obj/item/laser_pointer/L = W
|
||||
else if(istype(I, /obj/item/laser_pointer))
|
||||
var/obj/item/laser_pointer/L = I
|
||||
L.laser_act(src, user)
|
||||
else
|
||||
..()
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/machinery/camera/proc/toggle_cam(mob/user, displaymessage = 1)
|
||||
/obj/machinery/camera/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
|
||||
if(damage_flag == "melee" && damage_amount < 12 && !(stat & BROKEN))
|
||||
return 0
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/camera/obj_break(damage_flag)
|
||||
if(status)
|
||||
triggerCameraAlarm()
|
||||
toggle_cam(null, FALSE)
|
||||
wires.CutAll()
|
||||
|
||||
/obj/machinery/camera/deconstruct(disassembled = TRUE)
|
||||
if(disassembled)
|
||||
if(!assembly)
|
||||
assembly = new()
|
||||
assembly.forceMove(loc)
|
||||
assembly.state = 1
|
||||
assembly.setDir(dir)
|
||||
assembly.update_icon()
|
||||
assembly = null
|
||||
else
|
||||
new /obj/item/camera_assembly(loc)
|
||||
new /obj/item/stack/cable_coil(loc, 2)
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/camera/update_icon()
|
||||
if(!status)
|
||||
icon_state = "[initial(icon_state)]1"
|
||||
else if(stat & EMPED)
|
||||
icon_state = "[initial(icon_state)]emp"
|
||||
else
|
||||
icon_state = "[initial(icon_state)]"
|
||||
|
||||
/obj/machinery/camera/proc/toggle_cam(mob/user, displaymessage = TRUE)
|
||||
status = !status
|
||||
if(can_use())
|
||||
cameranet.addCamera(src)
|
||||
@@ -268,10 +267,7 @@
|
||||
cameranet.removeCamera(src)
|
||||
cameranet.updateChunk(x, y, z)
|
||||
var/change_msg = "deactivates"
|
||||
if(!status)
|
||||
icon_state = "[initial(icon_state)]1"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
if(status)
|
||||
change_msg = "reactivates"
|
||||
triggerCameraAlarm()
|
||||
spawn(100)
|
||||
@@ -284,7 +280,8 @@
|
||||
else
|
||||
visible_message("<span class='danger'>\The [src] [change_msg]!</span>")
|
||||
|
||||
playsound(src.loc, toggle_message, 100, 1)
|
||||
playsound(loc, toggle_sound, 100, 1)
|
||||
update_icon()
|
||||
|
||||
// now disconnect anyone using the camera
|
||||
//Apparently, this will disconnect anyone even if the camera was re-activated.
|
||||
@@ -295,16 +292,11 @@
|
||||
O.reset_perspective(null)
|
||||
to_chat(O, "The screen bursts into static.")
|
||||
|
||||
/obj/machinery/camera/proc/triggerCameraAlarm(var/duration = 0)
|
||||
alarm_on = 1
|
||||
motion_alarm.triggerAlarm(loc, src)
|
||||
/obj/machinery/camera/proc/triggerCameraAlarm()
|
||||
camera_alarm.triggerAlarm(loc, src)
|
||||
|
||||
/obj/machinery/camera/proc/cancelCameraAlarm()
|
||||
if(wires.IsIndexCut(CAMERA_WIRE_ALARM))
|
||||
return
|
||||
|
||||
alarm_on = 0
|
||||
motion_alarm.clearAlarm(loc, src)
|
||||
camera_alarm.clearAlarm(loc, src)
|
||||
|
||||
/obj/machinery/camera/proc/can_use()
|
||||
if(!status)
|
||||
@@ -331,25 +323,25 @@
|
||||
//If someone knows a better way to do this, let me know. -Giacom
|
||||
switch(i)
|
||||
if(NORTH)
|
||||
src.dir = SOUTH
|
||||
setDir(SOUTH)
|
||||
if(SOUTH)
|
||||
src.dir = NORTH
|
||||
setDir(NORTH)
|
||||
if(WEST)
|
||||
src.dir = EAST
|
||||
setDir(EAST)
|
||||
if(EAST)
|
||||
src.dir = WEST
|
||||
setDir(WEST)
|
||||
break
|
||||
|
||||
//Return a working camera that can see a given mob
|
||||
//or null if none
|
||||
/proc/seen_by_camera(var/mob/M)
|
||||
/proc/seen_by_camera(mob/M)
|
||||
for(var/obj/machinery/camera/C in oview(4, M))
|
||||
if(C.can_use()) // check if camera disabled
|
||||
return C
|
||||
break
|
||||
return null
|
||||
|
||||
/proc/near_range_camera(var/mob/M)
|
||||
/proc/near_range_camera(mob/M)
|
||||
for(var/obj/machinery/camera/C in range(4, M))
|
||||
if(C.can_use()) // check if camera disabled
|
||||
return C
|
||||
@@ -357,32 +349,15 @@
|
||||
|
||||
return null
|
||||
|
||||
/obj/machinery/camera/proc/weld(var/obj/item/weldingtool/WT, var/mob/user)
|
||||
if(busy)
|
||||
return 0
|
||||
if(!WT.remove_fuel(0, user))
|
||||
return 0
|
||||
|
||||
to_chat(user, "<span class='notice'>You start to weld [src]...</span>")
|
||||
playsound(src.loc, WT.usesound, 50, 1)
|
||||
busy = 1
|
||||
if(do_after(user, 100 * WT.toolspeed, target = src))
|
||||
busy = 0
|
||||
if(!WT.isOn())
|
||||
return 0
|
||||
return 1
|
||||
busy = 0
|
||||
return 0
|
||||
|
||||
/obj/machinery/camera/proc/Togglelight(on=0)
|
||||
/obj/machinery/camera/proc/Togglelight(on = FALSE)
|
||||
for(var/mob/living/silicon/ai/A in ai_list)
|
||||
for(var/obj/machinery/camera/cam in A.lit_cameras)
|
||||
if(cam == src)
|
||||
return
|
||||
if(on)
|
||||
src.set_light(AI_CAMERA_LUMINOSITY)
|
||||
set_light(AI_CAMERA_LUMINOSITY)
|
||||
else
|
||||
src.set_light(0)
|
||||
set_light(0)
|
||||
|
||||
/obj/machinery/camera/proc/nano_structure()
|
||||
var/cam[0]
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
anchored = 0
|
||||
materials = list(MAT_METAL=400, MAT_GLASS=250)
|
||||
|
||||
max_integrity = 150
|
||||
can_be_hit = TRUE
|
||||
// Motion, EMP-Proof, X-Ray
|
||||
var/list/obj/item/possible_upgrades = list(/obj/item/assembly/prox_sensor, /obj/item/stack/sheet/mineral/plasma, /obj/item/analyzer)
|
||||
var/list/upgrades = list()
|
||||
@@ -24,13 +25,13 @@
|
||||
QDEL_LIST(upgrades)
|
||||
return ..()
|
||||
|
||||
/obj/item/camera_assembly/attackby(obj/item/W, mob/living/user, params)
|
||||
/obj/item/camera_assembly/attackby(obj/item/I, mob/living/user, params)
|
||||
|
||||
switch(state)
|
||||
if(0)
|
||||
// State 0
|
||||
if(iswrench(W) && isturf(src.loc))
|
||||
playsound(src.loc, W.usesound, 50, 1)
|
||||
if(iswrench(I) && isturf(loc))
|
||||
playsound(loc, I.usesound, 50, 1)
|
||||
to_chat(user, "You wrench the assembly into place.")
|
||||
anchored = 1
|
||||
state = 1
|
||||
@@ -40,15 +41,15 @@
|
||||
|
||||
if(1)
|
||||
// State 1
|
||||
if(iswelder(W))
|
||||
if(weld(W, user))
|
||||
if(iswelder(I))
|
||||
if(weld(I, user))
|
||||
to_chat(user, "You weld the assembly securely into place.")
|
||||
anchored = 1
|
||||
state = 2
|
||||
return
|
||||
|
||||
else if(iswrench(W))
|
||||
playsound(src.loc, W.usesound, 50, 1)
|
||||
else if(iswrench(I))
|
||||
playsound(loc, I.usesound, 50, 1)
|
||||
to_chat(user, "You unattach the assembly from it's place.")
|
||||
anchored = 0
|
||||
update_icon()
|
||||
@@ -57,19 +58,18 @@
|
||||
|
||||
if(2)
|
||||
// State 2
|
||||
if(iscoil(W))
|
||||
var/obj/item/stack/cable_coil/C = W
|
||||
if(iscoil(I))
|
||||
var/obj/item/stack/cable_coil/C = I
|
||||
if(C.use(2))
|
||||
to_chat(user, "<span class='notice'>You add wires to the assembly.</span>")
|
||||
playsound(loc, W.usesound, 50, 1)
|
||||
playsound(loc, I.usesound, 50, 1)
|
||||
state = 3
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need 2 coils of wire to wire the assembly.</span>")
|
||||
return
|
||||
|
||||
else if(iswelder(W))
|
||||
|
||||
if(weld(W, user))
|
||||
else if(iswelder(I))
|
||||
if(weld(I, user))
|
||||
to_chat(user, "You unweld the assembly from it's place.")
|
||||
state = 1
|
||||
anchored = 1
|
||||
@@ -78,8 +78,8 @@
|
||||
|
||||
if(3)
|
||||
// State 3
|
||||
if(isscrewdriver(W))
|
||||
playsound(src.loc, W.usesound, 50, 1)
|
||||
if(isscrewdriver(I))
|
||||
playsound(loc, I.usesound, 50, 1)
|
||||
|
||||
var/input = strip_html(input(usr, "Which networks would you like to connect this camera to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13"))
|
||||
if(!input)
|
||||
@@ -96,8 +96,8 @@
|
||||
input = strip_html(input(usr, "How would you like to name the camera?", "Set Camera Name", temptag))
|
||||
|
||||
state = 4
|
||||
var/obj/machinery/camera/C = new(src.loc)
|
||||
src.loc = C
|
||||
var/obj/machinery/camera/C = new(loc)
|
||||
loc = C
|
||||
C.assembly = src
|
||||
|
||||
C.auto_turn()
|
||||
@@ -119,35 +119,36 @@
|
||||
break
|
||||
return
|
||||
|
||||
else if(iswirecutter(W))
|
||||
else if(iswirecutter(I))
|
||||
new/obj/item/stack/cable_coil(get_turf(src), 2)
|
||||
playsound(src.loc, W.usesound, 50, 1)
|
||||
playsound(loc, I.usesound, 50, 1)
|
||||
to_chat(user, "You cut the wires from the circuits.")
|
||||
state = 2
|
||||
return
|
||||
|
||||
// Upgrades!
|
||||
if(is_type_in_list(W, possible_upgrades) && !is_type_in_list(W, upgrades)) // Is a possible upgrade and isn't in the camera already.
|
||||
if(!user.unEquip(W))
|
||||
to_chat(user, "<span class='warning'>[W] is stuck!</span>")
|
||||
if(is_type_in_list(I, possible_upgrades) && !is_type_in_list(I, upgrades)) // Is a possible upgrade and isn't in the camera already.
|
||||
if(!user.unEquip(I))
|
||||
to_chat(user, "<span class='warning'>[I] is stuck!</span>")
|
||||
return
|
||||
to_chat(user, "You attach \the [W] into the assembly inner circuits.")
|
||||
upgrades += W
|
||||
to_chat(user, "You attach [I] into the assembly inner circuits.")
|
||||
upgrades += I
|
||||
user.drop_item()
|
||||
W.loc = src
|
||||
I.loc = src
|
||||
return
|
||||
|
||||
// Taking out upgrades
|
||||
else if(iscrowbar(W) && upgrades.len)
|
||||
else if(iscrowbar(I) && upgrades.len)
|
||||
var/obj/U = locate(/obj) in upgrades
|
||||
if(U)
|
||||
to_chat(user, "You unattach an upgrade from the assembly.")
|
||||
playsound(src.loc, W.usesound, 50, 1)
|
||||
playsound(loc, I.usesound, 50, 1)
|
||||
U.loc = get_turf(src)
|
||||
upgrades -= U
|
||||
return
|
||||
|
||||
..()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/camera_assembly/update_icon()
|
||||
if(anchored)
|
||||
@@ -159,7 +160,7 @@
|
||||
if(!anchored)
|
||||
..()
|
||||
|
||||
/obj/item/camera_assembly/proc/weld(var/obj/item/weldingtool/WT, var/mob/living/user)
|
||||
/obj/item/camera_assembly/proc/weld(obj/item/weldingtool/WT, mob/living/user)
|
||||
|
||||
if(busy)
|
||||
return 0
|
||||
@@ -167,7 +168,7 @@
|
||||
return 0
|
||||
|
||||
to_chat(user, "<span class='notice'>You start to weld the [src]..</span>")
|
||||
playsound(src.loc, WT.usesound, 50, 1)
|
||||
playsound(loc, WT.usesound, 50, 1)
|
||||
busy = 1
|
||||
if(do_after(user, 20 * WT.toolspeed, target = src))
|
||||
busy = 0
|
||||
@@ -176,3 +177,7 @@
|
||||
return 1
|
||||
busy = 0
|
||||
return 0
|
||||
|
||||
/obj/item/camera_assembly/deconstruct(disassembled = TRUE)
|
||||
new /obj/item/stack/sheet/metal(loc)
|
||||
qdel(src)
|
||||
@@ -6,6 +6,7 @@
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
burn_state = LAVA_PROOF | FIRE_PROOF
|
||||
resistance_flags = INDESTRUCTIBLE
|
||||
can_be_hit = FALSE
|
||||
|
||||
/obj/effect/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
|
||||
return
|
||||
|
||||
+13
-11
@@ -15,6 +15,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
|
||||
var/inhand_x_dimension = 32
|
||||
var/inhand_y_dimension = 32
|
||||
|
||||
can_be_hit = FALSE
|
||||
|
||||
var/r_speed = 1.0
|
||||
var/health = null
|
||||
var/hitsound = null
|
||||
@@ -277,25 +279,25 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
|
||||
|
||||
// Due to storage type consolidation this should get used more now.
|
||||
// I have cleaned it up a little, but it could probably use more. -Sayu
|
||||
/obj/item/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
if(istype(W,/obj/item/storage))
|
||||
var/obj/item/storage/S = W
|
||||
/obj/item/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/storage))
|
||||
var/obj/item/storage/S = I
|
||||
if(S.use_to_pickup)
|
||||
if(S.collection_mode) //Mode is set to collect all items on a tile and we clicked on a valid one.
|
||||
if(isturf(src.loc))
|
||||
if(isturf(loc))
|
||||
var/list/rejections = list()
|
||||
var/success = 0
|
||||
var/failure = 0
|
||||
|
||||
for(var/obj/item/I in src.loc)
|
||||
if(I.type in rejections) // To limit bag spamming: any given type only complains once
|
||||
for(var/obj/item/IT in loc)
|
||||
if(IT.type in rejections) // To limit bag spamming: any given type only complains once
|
||||
continue
|
||||
if(!S.can_be_inserted(I)) // Note can_be_inserted still makes noise when the answer is no
|
||||
rejections += I.type // therefore full bags are still a little spammy
|
||||
if(!S.can_be_inserted(IT)) // Note can_be_inserted still makes noise when the answer is no
|
||||
rejections += IT.type // therefore full bags are still a little spammy
|
||||
failure = 1
|
||||
continue
|
||||
success = 1
|
||||
S.handle_item_insertion(I, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed.
|
||||
S.handle_item_insertion(IT, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed.
|
||||
if(success && !failure)
|
||||
to_chat(user, "<span class='notice'>You put everything in [S].</span>")
|
||||
else if(success)
|
||||
@@ -305,8 +307,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
|
||||
|
||||
else if(S.can_be_inserted(src))
|
||||
S.handle_item_insertion(src)
|
||||
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/proc/hit_reaction(mob/living/carbon/human/owner, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
if(prob(final_block_chance))
|
||||
|
||||
@@ -357,19 +357,22 @@
|
||||
remove_from_storage(Item, loc, burn)
|
||||
|
||||
//This proc is called when you want to place an item into the storage item.
|
||||
/obj/item/storage/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
/obj/item/storage/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
|
||||
if(istype(I, /obj/item/hand_labeler))
|
||||
var/obj/item/hand_labeler/labeler = I
|
||||
if(labeler.mode)
|
||||
return FALSE
|
||||
. = 1 //no afterattack
|
||||
if(isrobot(user))
|
||||
to_chat(user, "<span class='notice'>You're a robot. No.</span>")
|
||||
return 1//Robots can't interact with storage items.
|
||||
return //Robots can't interact with storage items.
|
||||
|
||||
if(!can_be_inserted(W))
|
||||
return 0
|
||||
|
||||
handle_item_insertion(W)
|
||||
return 1
|
||||
if(!can_be_inserted(I))
|
||||
if(contents.len >= storage_slots) //don't use items on the backpack if they don't fit
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
handle_item_insertion(I)
|
||||
|
||||
/obj/item/storage/attack_hand(mob/user as mob)
|
||||
playsound(src.loc, "rustle", 50, 1, -5)
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
var/integrity_failure = 0 //0 if we have no special broken behavior
|
||||
|
||||
var/resistance_flags = NONE // INDESTRUCTIBLE
|
||||
var/can_be_hit = TRUE //can this be bludgeoned by items?
|
||||
|
||||
var/Mtoollink = 0 // variable to decide if an object should show the multitool menu linking menu, not all objects use it
|
||||
|
||||
|
||||
@@ -7,30 +7,23 @@
|
||||
var/labels_left = 30
|
||||
var/mode = 0 //off or on.
|
||||
|
||||
/obj/item/hand_labeler/afterattack(atom/A, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
/obj/item/hand_labeler/afterattack(atom/A, mob/user, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
if(!mode) //if it's off, give up.
|
||||
return
|
||||
if(A == loc) // if placing the labeller into something (e.g. backpack)
|
||||
return // don't set a label
|
||||
|
||||
if(!labels_left)
|
||||
to_chat(user, "<span class='notice'>No labels left.</span>")
|
||||
to_chat(user, "<span class='warning'>No labels left!</span>")
|
||||
return
|
||||
if(!label || !length(label))
|
||||
to_chat(user, "<span class='notice'>No text set.</span>")
|
||||
to_chat(user, "<span class='warning'>No text set!</span>")
|
||||
return
|
||||
if(length(A.name) + length(label) > 64)
|
||||
to_chat(user, "<span class='notice'>Label too big.</span>")
|
||||
to_chat(user, "<span class='warning'>Label too big!</span>")
|
||||
return
|
||||
if(ishuman(A))
|
||||
to_chat(user, "<span class='notice'>You can't label humans.</span>")
|
||||
return
|
||||
if(issilicon(A))
|
||||
to_chat(user, "<span class='notice'>You can't label cyborgs.</span>")
|
||||
return
|
||||
if(istype(A, /obj/item/reagent_containers/glass))
|
||||
to_chat(user, "<span class='notice'>The label can't stick to the [A.name]. (Try using a pen)</span>")
|
||||
if(ismob(A))
|
||||
to_chat(user, "<span class='warning'>You can't label creatures!</span>") // use a collar
|
||||
return
|
||||
|
||||
user.visible_message("<span class='notice'>[user] labels [A] as [label].</span>", \
|
||||
|
||||
Reference in New Issue
Block a user