diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index bf481d4e747..71cb7bc9cc0 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -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) diff --git a/code/datums/wires/camera.dm b/code/datums/wires/camera.dm index ee25f8c3898..609dce59e84 100644 --- a/code/datums/wires/camera.dm +++ b/code/datums/wires/camera.dm @@ -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 \ No newline at end of file + return FALSE \ No newline at end of file diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 0e9f261d73d..e555ee91ce8 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -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("\The [user] slashes at [src]!") - 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 = "You attach [W] into the assembly inner circuits." +/obj/machinery/camera/attackby(obj/item/I, mob/living/user, params) + var/msg = "You attach [I] into the assembly inner circuits." var/msg2 = "The camera already has that upgrade!" // DECONSTRUCTION - if(istype(W, /obj/item/screwdriver)) -// to_chat(user, "You start to [panel_open ? "close" : "open"] the camera's panel.") - //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("[user] screws the camera's panel [panel_open ? "open" : "closed"]!", - "You screw the camera's panel [panel_open ? "open" : "closed"].") - playsound(src.loc, W.usesound, 50, 1) + to_chat(user, "You screw the camera's panel [panel_open ? "open" : "closed"].") + 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, "[W] is stuck!") + to_chat(user, "You start to weld [src]...") + playsound(loc, WT.usesound, 50, 1) + if(do_after(user, 100 * WT.toolspeed, target = src)) + user.visible_message("[user] unwelds [src], leaving it as just a frame bolted to the wall.", + "You unweld [src], leaving it as just a frame bolted to the wall") + deconstruct(TRUE) + + else if(istype(I, /obj/item/analyzer) && panel_open) //XRay + if(!user.drop_item()) + to_chat(user, "[I] is stuck to your hand!") 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, "[W] is stuck!") + else if(istype(I, /obj/item/stack/sheet/mineral/plasma) && panel_open) + if(!user.drop_item()) + to_chat(user, "[I] is stuck to your hand!") 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, "[I] is stuck to your hand!") 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("[][]", 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, "Camera non-functional.") return - if(istype(src.bug)) + if(istype(bug)) to_chat(user, "Camera bug removed.") - src.bug.bugged_cameras -= src.c_tag - src.bug = null + bug.bugged_cameras -= c_tag + bug = null else to_chat(user, "Camera bugged.") - 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("[user] has sliced the camera apart with an energy blade!") - 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("\The [src] [change_msg]!") - 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, "You start to weld [src]...") - 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] diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index dc5a0141b27..8baf02088bb 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -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, "You add wires to the assembly.") - playsound(loc, W.usesound, 50, 1) + playsound(loc, I.usesound, 50, 1) state = 3 else to_chat(user, "You need 2 coils of wire to wire the assembly.") 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, "[W] is stuck!") + 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, "[I] is stuck!") 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, "You start to weld the [src]..") - 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) \ No newline at end of file diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 0e8bd6691f2..5836136401e 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -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 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 646c93977fc..03b4f4adfaa 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -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, "You put everything in [S].") 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)) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 93f230a07e8..66316b6f7ef 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -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, "You're a robot. No.") - 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) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index fe9e8444378..dc642dcbde5 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -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 diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index e3cceb9738a..74bee9867ab 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -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, "No labels left.") + to_chat(user, "No labels left!") return if(!label || !length(label)) - to_chat(user, "No text set.") + to_chat(user, "No text set!") return if(length(A.name) + length(label) > 64) - to_chat(user, "Label too big.") + to_chat(user, "Label too big!") return - if(ishuman(A)) - to_chat(user, "You can't label humans.") - return - if(issilicon(A)) - to_chat(user, "You can't label cyborgs.") - return - if(istype(A, /obj/item/reagent_containers/glass)) - to_chat(user, "The label can't stick to the [A.name]. (Try using a pen)") + if(ismob(A)) + to_chat(user, "You can't label creatures!") // use a collar return user.visible_message("[user] labels [A] as [label].", \