[s] Fixes altclick exploits (#35456)

* Fixes altclick exploits

* Removed free spam, fixes monkey altclicks

* replaced named args with proper defines

* More cleanup and fixes

* Better yet

* Another exploit fix

* pet carrier fix
This commit is contained in:
ShizCalev
2018-02-11 16:06:12 +13:00
committed by oranges
parent bf1f56e93b
commit bfde5ac057
60 changed files with 115 additions and 133 deletions
@@ -160,7 +160,7 @@
access_display(user)
/obj/item/clockwork/slab/AltClick(mob/living/user)
if(is_servant_of_ratvar(user) && linking)
if(is_servant_of_ratvar(user) && linking && user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
linking = null
to_chat(user, "<span class='notice'>Object link canceled.</span>")
@@ -94,10 +94,10 @@
/mob/living/carbon/true_devil/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
if(incapacitated())
return 0
return FALSE
if(be_close && !in_range(M, src))
return 0
return 1
return FALSE
return TRUE
/mob/living/carbon/true_devil/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null)
return 666
@@ -157,7 +157,7 @@
if(!istype(M))
return ..()
if(!istype(user) || !user.canUseTopic(M,1))
if(!istype(user) || !user.canUseTopic(M, BE_CLOSE))
return
if(M.stat != DEAD)
+2 -5
View File
@@ -161,17 +161,14 @@
set category = "Object"
set src in usr
if(usr.incapacitated())
if(!usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
return
setDir(turn(dir, -90))
/obj/item/device/assembly/infra/AltClick(mob/user)
..()
if(user.incapacitated())
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
return
if(!in_range(src, user))
if(!user.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
return
else
rotate()
@@ -734,8 +734,7 @@
/obj/machinery/airalarm/AltClick(mob/user)
..()
if(!issilicon(user) && (!user.canUseTopic(src, be_close=TRUE) || !isturf(loc)))
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc))
return
else
togglelock(user)
+2 -2
View File
@@ -90,7 +90,7 @@
return ..()
/obj/item/clothing/AltClick(mob/user)
if(pockets && pockets.quickdraw && pockets.contents.len && !user.incapacitated())
if(istype(user) && user.canUseTopic(src, BE_CLOSE, ismonkey(user)) && pockets && pockets.quickdraw && pockets.contents.len)
var/obj/item/I = pockets.contents[1]
if(!I)
return
@@ -244,7 +244,7 @@ BLIND // can't see anything
if(..())
return 1
if(!user.canUseTopic(src, be_close=TRUE))
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
return
else
+1 -1
View File
@@ -87,7 +87,7 @@
to_chat(user, "<span class='notice'>Alt-click to take a candy corn.</span>")
/obj/item/clothing/head/fedora/det_hat/AltClick(mob/user)
if(user.canUseTopic(src, be_close=TRUE))
if(user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
..()
if(loc == user)
if(candy_cooldown < world.time)
+2 -3
View File
@@ -23,15 +23,14 @@
/obj/item/clothing/head/soft/AltClick(mob/user)
..()
if(!user.canUseTopic(src, be_close=TRUE))
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
else
flip(user)
/obj/item/clothing/head/soft/proc/flip(mob/user)
if(user.canmove && !user.stat && !user.restrained())
if(!user.incapacitated())
src.flipped = !src.flipped
if(src.flipped)
icon_state = "[item_color]soft_flipped"
+1 -2
View File
@@ -23,8 +23,7 @@ obj/item/clothing/mask/breath/suicide_act(mob/living/carbon/user)
/obj/item/clothing/mask/breath/AltClick(mob/user)
..()
if(!user.canUseTopic(src, be_close=TRUE))
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
else
adjustmask(user)
+1 -2
View File
@@ -93,8 +93,7 @@
/obj/item/clothing/suit/toggle/AltClick(mob/user)
..()
if(!user.canUseTopic(src, be_close=TRUE))
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
else
suit_toggle(user)
+1 -1
View File
@@ -69,7 +69,7 @@
return
/obj/item/clothing/accessory/AltClick(mob/user)
if(user.canUseTopic(src, be_close=TRUE))
if(istype(user) && user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
if(initial(above_suit))
above_suit = !above_suit
to_chat(user, "[src] will be worn [above_suit ? "above" : "below"] your suit.")
@@ -169,7 +169,7 @@
interact(user)
/obj/machinery/microwave/AltClick(mob/user)
if(user.canUseTopic(src, be_close=TRUE) && !(operating || broken > 0 || panel_open || !anchored || dirty == 100))
if(user.canUseTopic(src, BE_CLOSE) && !(operating || broken > 0 || panel_open || !anchored || dirty == 100))
cook()
/*******************
+2 -2
View File
@@ -117,7 +117,7 @@
set name = "Flip Card"
set category = "Object"
set src in range(1)
if(!usr.canUseTopic(src,1))
if(!ishuman(usr) || !usr.canUseTopic(src, BE_CLOSE))
return
if(!flipped)
name = "CAS card"
@@ -127,7 +127,7 @@
update_icon()
/obj/item/toy/cards/singlecard/cas/AltClick(mob/living/user)
if(!user.canUseTopic(src,1))
if(!ishuman(user) || !user.canUseTopic(src, BE_CLOSE))
return
Flip()
@@ -24,7 +24,7 @@
armor = list(melee = 50, bullet = 70, laser = 70, energy = 100, bomb = 10, bio = 100, rad = 100, fire = 0, acid = 0)
/obj/item/device/electronic_assembly/proc/check_interactivity(mob/user)
return user.canUseTopic(src,be_close = TRUE)
return user.canUseTopic(src, BE_CLOSE)
/obj/item/device/electronic_assembly/Initialize()
@@ -68,7 +68,7 @@ a creative player the means to solve many problems. Circuits are held inside an
if(assembly)
return assembly.check_interactivity(user)
else
return user.canUseTopic(src,be_close = TRUE)
return user.canUseTopic(src, BE_CLOSE)
/obj/item/integrated_circuit/Initialize()
displayed_name = name
@@ -10,7 +10,7 @@
var/list/program // Currently loaded save, in form of list
/obj/item/device/integrated_circuit_printer/proc/check_interactivity(mob/user)
return user.canUseTopic(src, be_close = TRUE)
return user.canUseTopic(src, BE_CLOSE)
/obj/item/device/integrated_circuit_printer/upgraded
upgraded = TRUE
+2 -2
View File
@@ -154,7 +154,7 @@
if(locked)
to_chat(user, "<span class='notice'>The crate is locked with a Deca-code lock.</span>")
var/input = input(usr, "Enter [codelen] digits. All digits must be unique.", "Deca-Code Lock", "") as text
if(user.canUseTopic(src, 1))
if(user.canUseTopic(src, BE_CLOSE))
var/list/sanitised = list()
var/sanitycheck = 1
for(var/i=1,i<=length(input),i++) //put the guess into a list
@@ -180,7 +180,7 @@
return ..()
/obj/structure/closet/crate/secure/loot/AltClick(mob/living/user)
if(!user.canUseTopic(src))
if(!user.canUseTopic(src, BE_CLOSE))
return
attack_hand(user) //this helps you not blow up so easily by overriding unlocking which results in an immediate boom.
@@ -57,13 +57,10 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list(
transfer_fingerprints_to(M)
/obj/item/stack/marker_beacon/AltClick(mob/living/user)
if(user.incapacitated() || !istype(user))
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
return
if(!in_range(src, user))
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return
var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors
if(user.incapacitated() || !istype(user) || !in_range(src, user))
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return
if(input_color)
picked_color = input_color
@@ -129,13 +126,10 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list(
/obj/structure/marker_beacon/AltClick(mob/living/user)
..()
if(user.incapacitated() || !istype(user))
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
return
if(!in_range(src, user))
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return
var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors
if(user.incapacitated() || !istype(user) || !in_range(src, user))
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return
if(input_color)
picked_color = input_color
@@ -719,13 +719,13 @@
/mob/living/carbon/human/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
if(incapacitated() || lying )
return
return FALSE
if(!Adjacent(M) && (M.loc != src))
if((be_close == 0) && (dna.check_mutation(TK)))
if(tkMaxRangeCheck(src, M))
return 1
return
return 1
return TRUE
return FALSE
return TRUE
/mob/living/carbon/human/resist_restraints()
if(wear_suit && wear_suit.breakouttime)
+4 -3
View File
@@ -784,13 +784,14 @@
/mob/living/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
if(incapacitated())
return
return FALSE
if(no_dextery)
if(be_close && in_range(M, src))
return 1
return TRUE
else
to_chat(src, "<span class='warning'>You don't have the dexterity to do this!</span>")
return
return FALSE
/mob/living/proc/can_use_guns(obj/item/G)
if(G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser())
to_chat(src, "<span class='warning'>You don't have the dexterity to do this!</span>")
@@ -185,6 +185,8 @@
// See software.dm for Topic()
/mob/living/silicon/pai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
if(be_close && !in_range(M, src))
return FALSE
return TRUE
/mob/proc/makePAI(delold)
@@ -849,10 +849,10 @@
/mob/living/silicon/robot/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
if(stat || lockcharge || low_power_mode)
return
return FALSE
if(be_close && !in_range(M, src))
return
return 1
return FALSE
return TRUE
/mob/living/silicon/robot/updatehealth()
..()
@@ -374,23 +374,23 @@
/mob/living/simple_animal/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
if(incapacitated())
return 0
return FALSE
if(no_dextery || dextrous)
if(be_close && !in_range(M, src))
return 0
return FALSE
else
to_chat(src, "<span class='warning'>You don't have the dexterity to do this!</span>")
return 0
return 1
return FALSE
return TRUE
/mob/living/simple_animal/stripPanelUnequip(obj/item/what, mob/who, where)
if(!canUseTopic(who, TRUE))
if(!canUseTopic(who, BE_CLOSE))
return
else
..()
/mob/living/simple_animal/stripPanelEquip(obj/item/what, mob/who, where)
if(!canUseTopic(who, TRUE))
if(!canUseTopic(who, BE_CLOSE))
return
else
..()
+6 -9
View File
@@ -99,12 +99,9 @@
H.emote("scream")
/obj/item/paper/AltClick(mob/living/carbon/user, obj/item/I)
if ( istype(user) )
if( (!in_range(src, user)) || user.stat || user.restrained() )
return
to_chat(user, "<span class='notice'>You fold [src] into the shape of a plane!</span>")
user.temporarilyRemoveItemFromInventory(src)
I = new /obj/item/paperplane(user, src)
user.put_in_hands(I)
else
to_chat(user, "<span class='notice'> You lack the dexterity to fold \the [src]. </span>")
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
to_chat(user, "<span class='notice'>You fold [src] into the shape of a plane!</span>")
user.temporarilyRemoveItemFromInventory(src)
I = new /obj/item/paperplane(user, src)
user.put_in_hands(I)
+3 -3
View File
@@ -128,12 +128,12 @@
if(isobj(O) && proximity)
if(O.obj_flags & UNIQUE_RENAME)
var/penchoice = input(user, "What would you like to edit?", "Rename or change description?") as null|anything in list("Rename","Change description")
if(!QDELETED(O) && user.canUseTopic(O, be_close = TRUE))
if(!QDELETED(O) && user.canUseTopic(O, BE_CLOSE))
if(penchoice == "Rename")
var/input = stripped_input(user,"What do you want to name \the [O.name]?", ,"", MAX_NAME_LEN)
var/oldname = O.name
if(!QDELETED(O) && user.canUseTopic(O, be_close = TRUE))
if(!QDELETED(O) && user.canUseTopic(O, BE_CLOSE))
if(oldname == input)
to_chat(user, "You changed \the [O.name] to... well... \the [O.name].")
return
@@ -146,7 +146,7 @@
if(penchoice == "Change description")
var/input = stripped_input(user,"Describe \the [O.name] here", ,"", 100)
if(!QDELETED(O) && user.canUseTopic(O, be_close = TRUE))
if(!QDELETED(O) && user.canUseTopic(O, BE_CLOSE))
O.desc = input
to_chat(user, "You have successfully changed \the [O.name]'s description.")
return
+1 -1
View File
@@ -313,7 +313,7 @@
/obj/machinery/photocopier/MouseDrop_T(mob/target, mob/user)
check_ass() //Just to make sure that you can re-drag somebody onto it after they moved off.
if (!istype(target) || target.anchored || target.buckled || !Adjacent(user) || !Adjacent(target) || !user.canUseTopic(src, 1) || target == ass || copier_blocked())
if (!istype(target) || target.anchored || target.buckled || !Adjacent(target) || !user.canUseTopic(src, BE_CLOSE) || target == ass || copier_blocked())
return
src.add_fingerprint(user)
if(target == user)
+1 -2
View File
@@ -656,8 +656,7 @@
/obj/machinery/power/apc/AltClick(mob/user)
..()
if(!issilicon(user) && (!user.canUseTopic(src, be_close=TRUE) || !isturf(loc)))
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc))
return
else
togglelock(user)
@@ -240,7 +240,7 @@
to_chat(user, "You switch to tube A.")
/obj/item/gun/ballistic/shotgun/automatic/dual_tube/AltClick(mob/living/user)
if(user.incapacitated() || !Adjacent(user) || !istype(user))
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
pump()
@@ -223,7 +223,7 @@
return
vol_each = min(reagents.total_volume / amount, 50)
var/name = stripped_input(usr,"Name:","Name your pill!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN)
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE))
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE))
return
var/obj/item/reagent_containers/pill/P
@@ -237,7 +237,7 @@
reagents.trans_to(P,vol_each)
else
var/name = stripped_input(usr, "Name:", "Name your pack!", reagents.get_master_reagent_name(), MAX_NAME_LEN)
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE))
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE))
return
var/obj/item/reagent_containers/food/condiment/pack/P = new/obj/item/reagent_containers/food/condiment/pack(drop_location())
@@ -259,7 +259,7 @@
return
vol_each = min(reagents.total_volume / amount, 40)
var/name = stripped_input(usr,"Name:","Name your patch!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN)
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE))
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE))
return
var/obj/item/reagent_containers/pill/P
@@ -277,7 +277,7 @@
if(condi)
var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE))
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE))
return
var/obj/item/reagent_containers/food/condiment/P = new(drop_location())
P.originalname = name
@@ -290,7 +290,7 @@
amount_full = round(reagents.total_volume / 30)
vol_part = reagents.total_volume % 30
var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE))
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE))
return
var/obj/item/reagent_containers/glass/bottle/P
+1 -1
View File
@@ -42,7 +42,7 @@
return ..()
/obj/vehicle/ridden/AltClick(mob/user)
if(user.Adjacent(src) && inserted_key)
if(inserted_key && user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
if(!is_occupant(user))
to_chat(user, "<span class='notice'>You must be riding the [src] to remove [src]'s key!</span>")
return