From 7feea76eee7ee20f22179efb61a9b2df20a3ac94 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 30 Apr 2018 02:56:18 -0700 Subject: [PATCH 1/2] Fixes circuits being able to detect ghosts and fix pinless guns (#37437) * Circuit exploit fixes * Update input.dm --- .../integrated_electronics/subtypes/input.dm | 70 +++++++++++-------- .../subtypes/manipulation.dm | 3 +- code/modules/projectiles/pins.dm | 47 ++++++------- 3 files changed, 64 insertions(+), 56 deletions(-) diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index a61dc18d34..0309fcd55a 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -524,28 +524,38 @@ var/datum/integrated_io/I = inputs[1] var/datum/integrated_io/O = outputs[1] O.data = null - var/turf/T = get_turf(src) - var/list/nearby_things = view(radius,T) - var/list/valid_things = list() var/list/input_list = list() input_list = I.data - for(var/item in input_list) - if(!isnull(item) && !isnum(item)) - if(istext(item)) - for(var/atom/thing in nearby_things) - if(findtext(addtext(thing.name," ",thing.desc), item, 1, 0) ) + if(length(input_list)) //if there is no input don't do anything. + var/turf/T = get_turf(src) + var/list/nearby_things = view(radius,T) + var/list/valid_things = list() + for(var/item in input_list) + if(!isnull(item) && !isnum(item)) + if(istext(item)) + for(var/i in nearby_things) + var/atom/thing = i + if(ismob(thing) && !isliving(thing)) + continue + if(findtext(addtext(thing.name," ",thing.desc), item, 1, 0) ) + valid_things.Add(WEAKREF(thing)) + else + var/atom/A = item + var/desired_type = A.type + for(var/i in nearby_things) + var/atom/thing = i + if(thing.type != desired_type) + continue + if(ismob(thing) && !isliving(thing)) + continue valid_things.Add(WEAKREF(thing)) - else - var/atom/A = item - var/desired_type = A.type - for(var/atom/thing in nearby_things) - if(thing.type != desired_type) - continue - valid_things.Add(WEAKREF(thing)) - if(valid_things.len) - O.data = valid_things - O.push_data() - activate_pin(2) + if(valid_things.len) + O.data = valid_things + O.push_data() + activate_pin(2) + else + O.push_data() + activate_pin(3) else O.push_data() activate_pin(3) @@ -583,12 +593,18 @@ var/atom/A = I.data.resolve() var/desired_type = A.type if(desired_type) - for(var/atom/thing in nearby_things) + for(var/i in nearby_things) + var/atom/thing = i + if(ismob(thing) && !isliving(thing)) + continue if(thing.type == desired_type) valid_things.Add(thing) else if(istext(I.data)) var/DT = I.data - for(var/atom/thing in nearby_things) + for(var/i in nearby_things) + var/atom/thing = i + if(ismob(thing) && !isliving(thing)) + continue if(findtext(addtext(thing.name," ",thing.desc), DT, 1, 0) ) valid_things.Add(thing) if(valid_things.len) @@ -599,10 +615,6 @@ O.push_data() activate_pin(3) - - - - /obj/item/integrated_circuit/input/signaler name = "integrated signaler" desc = "Signals from a signaler can be received with this, allowing for remote control. Additionally, it can send signals as well." @@ -810,8 +822,8 @@ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH power_draw_per_use = 120 -/obj/item/integrated_circuit/input/sensor/sense(var/atom/A,mob/user,prox) - if(!prox) +/obj/item/integrated_circuit/input/sensor/sense(atom/A, mob/user, prox) + if(!prox || !A || (ismob(A) && !isliving(A))) return FALSE if(!check_then_do_work()) return FALSE @@ -837,8 +849,8 @@ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH power_draw_per_use = 120 -/obj/item/integrated_circuit/input/sensor/ranged/sense(var/atom/A,mob/user) - if(!user) +/obj/item/integrated_circuit/input/sensor/ranged/sense(atom/A, mob/user) + if(!user || !A || (ismob(A) && !isliving(A))) return FALSE if(user.client) if(!(A in view(user.client))) diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index 7e45902fe1..592dbe4a81 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -45,7 +45,6 @@ if(installed_gun) to_chat(user, "There's already a weapon installed.") return - user.transferItemToLoc(gun,src) installed_gun = gun var/list/gun_properties = gun.get_turret_properties() @@ -79,7 +78,7 @@ to_chat(user, "There's no weapon to remove from the mechanism.") /obj/item/integrated_circuit/manipulation/weapon_firing/do_work() - if(!installed_gun) + if(!installed_gun || !installed_gun.handle_pins()) return set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun)) push_data() diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index 6c175340bc..b5cd9b70a7 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -13,7 +13,6 @@ var/pin_removeable = 0 // Can be replaced by any pin. var/obj/item/gun/gun - /obj/item/firing_pin/New(newloc) ..() if(istype(newloc, /obj/item/gun)) @@ -54,7 +53,7 @@ return /obj/item/firing_pin/proc/pin_auth(mob/living/user) - return 1 + return TRUE /obj/item/firing_pin/proc/auth_fail(mob/living/user) user.show_message(fail_message, 1) @@ -77,12 +76,12 @@ name = "test-range firing pin" desc = "This safety firing pin allows weapons to be fired within proximity to a firing range." fail_message = "TEST RANGE CHECK FAILED." - pin_removeable = 1 + pin_removeable = TRUE /obj/item/firing_pin/test_range/pin_auth(mob/living/user) for(var/obj/machinery/magnetic_controller/M in range(user, 3)) - return 1 - return 0 + return TRUE + return FALSE // Implant pin, checks for implant @@ -93,11 +92,11 @@ var/obj/item/implant/req_implant = null /obj/item/firing_pin/implant/pin_auth(mob/living/user) - if(istype(user)) + if(user) for(var/obj/item/implant/I in user.implants) if(req_implant && I.type == req_implant) - return 1 - return 0 + return TRUE + return FALSE /obj/item/firing_pin/implant/mindshield name = "mindshield firing pin" @@ -119,23 +118,23 @@ desc = "Advanced clowntech that can convert any firearm into a far more useful object." color = "#FFFF00" fail_message = "HONK!" - force_replace = 1 + force_replace = TRUE /obj/item/firing_pin/clown/pin_auth(mob/living/user) - playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1) - return 0 + playsound(src, 'sound/items/bikehorn.ogg', 50, 1) + return FALSE // Ultra-honk pin, clown's deadly joke item. // A gun with ultra-honk pin is useful for clown and useless for everyone else. /obj/item/firing_pin/clown/ultra/pin_auth(mob/living/user) playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1) - if(!(user.has_trait(TRAIT_CLUMSY)) && !(user.mind && user.mind.assigned_role == "Clown")) - return 0 - return 1 + if(user && (!(user.has_trait(TRAIT_CLUMSY)) && !(user.mind && user.mind.assigned_role == "Clown"))) + return FALSE + return TRUE /obj/item/firing_pin/clown/ultra/gun_insert(mob/living/user, obj/item/gun/G) ..() - G.clumsy_check = 0 + G.clumsy_check = FALSE /obj/item/firing_pin/clown/ultra/gun_remove(mob/living/user) gun.clumsy_check = initial(gun.clumsy_check) @@ -144,7 +143,7 @@ // Now two times deadlier! /obj/item/firing_pin/clown/ultra/selfdestruct desc = "Advanced clowntech that can convert any firearm into a far more useful object. It has a small nitrobananium charge on it." - selfdestruct = 1 + selfdestruct = TRUE // DNA-keyed pin. @@ -165,15 +164,14 @@ to_chat(user, "DNA-LOCK SET.") /obj/item/firing_pin/dna/pin_auth(mob/living/carbon/user) - if(istype(user) && user.dna && user.dna.unique_enzymes) + if(user && user.dna && user.dna.unique_enzymes) if(user.dna.unique_enzymes == unique_enzymes) - return 1 - - return 0 + return TRUE + return FALSE /obj/item/firing_pin/dna/auth_fail(mob/living/carbon/user) if(!unique_enzymes) - if(istype(user) && user.dna && user.dna.unique_enzymes) + if(user && user.dna && user.dna.unique_enzymes) unique_enzymes = user.dna.unique_enzymes to_chat(user, "DNA-LOCK SET.") else @@ -181,8 +179,7 @@ /obj/item/firing_pin/dna/dredd desc = "This is a DNA-locked firing pin which only authorizes one user. Attempt to fire once to DNA-link. It has a small explosive charge on it." - selfdestruct = 1 - + selfdestruct = TRUE // Laser tag pins /obj/item/firing_pin/tag @@ -196,9 +193,9 @@ if(ishuman(user)) var/mob/living/carbon/human/M = user if(istype(M.wear_suit, suit_requirement)) - return 1 + return TRUE to_chat(user, "You need to be wearing [tagcolor] laser tag armor!") - return 0 + return FALSE /obj/item/firing_pin/tag/red name = "red laser tag firing pin"