From a1583f24ae77b5f629b292fdc628c807d48100c4 Mon Sep 17 00:00:00 2001 From: AnturK Date: Tue, 9 Feb 2016 09:17:48 +0100 Subject: [PATCH 1/2] Buildmode Refactor Adds generic click intercept to clients --- code/_onclick/ai.dm | 12 +- code/_onclick/click.dm | 7 +- code/_onclick/cyborg.dm | 6 +- code/_onclick/observer.dm | 14 +- code/modules/admin/verbs/buildmode.dm | 558 ++++++++++++++------------ code/modules/client/client defines.dm | 2 +- icons/misc/buildmode.dmi | Bin 944 -> 1004 bytes 7 files changed, 326 insertions(+), 273 deletions(-) diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index 719f7718977..7f526e126af 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -10,9 +10,9 @@ Note that AI have no need for the adjacency proc, and so this proc is a lot cleaner. */ /mob/living/silicon/ai/DblClickOn(var/atom/A, params) - if(client.buildmode) // comes after object.Click to allow buildmode gui objects to be clicked - build_click(src, client.buildmode, params, A) - return + if(client.click_intercept) + if(call(client.click_intercept,"ClickOn")(src,params,A)) + return if(control_disabled || stat) return @@ -27,9 +27,9 @@ return next_click = world.time + 1 - if(client.buildmode) // comes after object.Click to allow buildmode gui objects to be clicked - build_click(src, client.buildmode, params, A) - return + if(client.click_intercept) + if(call(client.click_intercept,"ClickOn")(src,params,A)) + return if(control_disabled || stat) return diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index e8297662c85..423357d71f2 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -52,9 +52,10 @@ if(world.time <= next_click) return next_click = world.time + 1 - if(client.buildmode) - build_click(src, client.buildmode, params, A) - return + + if(client.click_intercept) + if(call(client.click_intercept,"ClickOn")(src,params,A)) + return var/list/modifiers = params2list(params) if(modifiers["shift"] && modifiers["ctrl"]) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 4cb6a641ba8..3d32ee284cb 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -11,9 +11,9 @@ return next_click = world.time + 1 - if(client.buildmode) // comes after object.Click to allow buildmode gui objects to be clicked - build_click(src, client.buildmode, params, A) - return + if(client.click_intercept) + if(call(client.click_intercept,"ClickOn")(src,params,A)) + return if(stat || lockcharge || weakened || stunned || paralysis) return diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 411f562888b..ba3c1c05783 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -1,7 +1,8 @@ /mob/dead/observer/DblClickOn(var/atom/A, var/params) - if(client.buildmode) - build_click(src, client.buildmode, params, A) - return + if(client.click_intercept) + if(call(client.click_intercept,"ClickOn")(src,params,A)) + return + if(can_reenter_corpse && mind && mind.current) if(A == mind.current || (mind.current in A)) // double click your corpse or whatever holds it reenter_corpse() // (cloning scanner, body bag, closet, mech, etc) @@ -16,9 +17,10 @@ loc = get_turf(A) /mob/dead/observer/ClickOn(var/atom/A, var/params) - if(client.buildmode) - build_click(src, client.buildmode, params, A) - return + + if(client.click_intercept) + if(call(client.click_intercept,"ClickOn")(src,params,A)) + return var/list/modifiers = params2list(params) if(modifiers["middle"]) diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm index 934ba3d6df4..6c94138ab51 100644 --- a/code/modules/admin/verbs/buildmode.dm +++ b/code/modules/admin/verbs/buildmode.dm @@ -3,215 +3,269 @@ #define VAR_BUILDMODE 3 #define THROW_BUILDMODE 4 #define AREA_BUILDMODE 5 -#define NUM_BUILDMODES 5 +#define COPY_BUILDMODE 6 +#define NUM_BUILDMODES 6 + +//Buildmode Shuttle +//Builmode Move + +/obj/screen/buildmode + icon = 'icons/misc/buildmode.dmi' + var/datum/buildmode/bd + +/obj/screen/buildmode/New(bd) + ..() + src.bd = bd + +/obj/screen/buildmode/mode + icon_state = "buildmode1" + name = "Toggle Mode" + screen_loc = "NORTH,WEST" + +/obj/screen/buildmode/mode/Click(location, control, params) + var/list/pa = params2list(params) + + if(pa.Find("left")) + bd.toggle_modes() + else if(pa.Find("right")) + bd.change_settings(usr) + update_icon() + return 1 + +/obj/screen/buildmode/mode/update_icon() + icon_state = "buildmode[bd.mode]" + return + +/obj/screen/buildmode/help + icon_state = "buildhelp" + screen_loc = "NORTH,WEST+1" + name = "Buildmode Help" + +/obj/screen/buildmode/help/Click() + bd.show_help(usr) + return 1 + +/obj/screen/buildmode/bdir + icon_state = "build" + screen_loc = "NORTH,WEST+2" + name = "Change Dir" + + +/obj/screen/buildmode/bdir/update_icon() + dir = bd.build_dir + return + +/obj/screen/buildmode/quit + icon_state = "buildquit" + screen_loc = "NORTH,WEST+3" + name = "Quit Buildmode" + +/obj/screen/buildmode/quit/Click() + bd.quit() + return 1 + +/obj/screen/buildmode/dir/Click() + bd.change_dir() + update_icon() + return 1 + +/datum/buildmode + var/mode = BASIC_BUILDMODE + var/client/holder = null + var/list/obj/screen/buttons = list() + var/build_dir = SOUTH + var/atom/movable/throw_atom = null + var/turf/cornerA = null + var/turf/cornerB = null + var/generator_path = null + var/varholder = "name" + var/valueholder = "derp" + var/objholder = /obj/structure/closet + var/atom/movable/stored = null + +/datum/buildmode/New(client/c) + create_buttons() + holder = c + holder.click_intercept = src + holder.show_popup_menus = 0 + holder.screen += buttons + +/datum/buildmode/proc/quit() + holder.screen -= buttons + holder.click_intercept = null + holder.show_popup_menus = 1 + qdel(src) + return + +/datum/buildmode/Destroy() + stored = null + for(var/button in buttons) + qdel(button) + +/datum/buildmode/proc/create_buttons() + buttons += new /obj/screen/buildmode/mode(src) + buttons += new /obj/screen/buildmode/help(src) + buttons += new /obj/screen/buildmode/bdir(src) + buttons += new /obj/screen/buildmode/quit(src) + +/datum/buildmode/proc/toggle_modes() + mode = (mode % NUM_BUILDMODES) +1 + Reset() + return + +/datum/buildmode/proc/show_help(mob/user) + switch(mode) + if(BASIC_BUILDMODE) + user << "\blue ***********************************************************" + user << "\blue Left Mouse Button = Construct / Upgrade" + user << "\blue Right Mouse Button = Deconstruct / Delete / Downgrade" + user << "\blue Left Mouse Button + ctrl = R-Window" + user << "\blue Left Mouse Button + alt = Airlock" + user << "" + user << "\blue Use the button in the upper left corner to" + user << "\blue change the direction of built objects." + user << "\blue ***********************************************************" + if(ADV_BUILDMODE) + user << "\blue ***********************************************************" + user << "\blue Right Mouse Button on buildmode button = Set object type" + user << "\blue Left Mouse Button on turf/obj = Place objects" + user << "\blue Right Mouse Button = Delete objects" + user << "" + user << "\blue Use the button in the upper left corner to" + user << "\blue change the direction of built objects." + user << "\blue ***********************************************************" + if(VAR_BUILDMODE) + user << "\blue ***********************************************************" + user << "\blue Right Mouse Button on buildmode button = Select var(type) & value" + user << "\blue Left Mouse Button on turf/obj/mob = Set var(type) & value" + user << "\blue Right Mouse Button on turf/obj/mob = Reset var's value" + user << "\blue ***********************************************************" + if(THROW_BUILDMODE) + user << "\blue ***********************************************************" + user << "\blue Left Mouse Button on turf/obj/mob = Select" + user << "\blue Right Mouse Button on turf/obj/mob = Throw" + user << "\blue ***********************************************************" + if(AREA_BUILDMODE) + user << "\blue ***********************************************************" + user << "\blue Left Mouse Button on turf/obj/mob = Select corner" + user << "\blue Right Mouse Button on buildmode button = Select generator" + user << "\blue ***********************************************************" + if(COPY_BUILDMODE) + user << "\blue ***********************************************************" + user << "\blue Left Mouse Button on obj/turf/mob = Spawn a Copy of selected target" + user << "\blue Right Mouse Button on obj/mob = Select target to copy" + user << "\blue ***********************************************************" + + +/datum/buildmode/proc/pick_closest_path(value) + var/list/matches = get_fancy_list_of_types() + if (!isnull(value) && value!="") + matches = filter_fancy_list(matches, value) + + if(matches.len==0) + return + + var/chosen + if(matches.len==1) + chosen = matches[1] + else + chosen = input("Select an atom type", "Spawn Atom", matches[1]) as null|anything in matches + if(!chosen) + return + chosen = matches[chosen] + return chosen + +/datum/buildmode/proc/change_settings(mob/user) + switch(mode) + if(BASIC_BUILDMODE) + return 1 + if(ADV_BUILDMODE) + var/target_path = input(user,"Enter typepath:" ,"Typepath","/obj/structure/closet") + objholder = text2path(target_path) + if(!ispath(objholder)) + objholder = pick_closest_path(target_path) + if(!objholder) + objholder = /obj/structure/closet + alert("That path is not allowed.") + else + if(ispath(objholder,/mob) && !check_rights(R_DEBUG,0)) + objholder = /obj/structure/closet + if(VAR_BUILDMODE) + var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "viruses", "cuffed", "ka", "last_eaten", "urine") + + varholder = input(user,"Enter variable name:" ,"Name", "name") + if(varholder in locked && !check_rights(R_DEBUG,0)) + return 1 + var/thetype = input(user,"Select variable type:" ,"Type") in list("text","number","mob-reference","obj-reference","turf-reference") + if(!thetype) return 1 + switch(thetype) + if("text") + valueholder = input(user,"Enter variable value:" ,"Value", "value") as text + if("number") + valueholder = input(user,"Enter variable value:" ,"Value", 123) as num + if("mob-reference") + valueholder = input(user,"Enter variable value:" ,"Value") as mob in mob_list + if("obj-reference") + valueholder = input(user,"Enter variable value:" ,"Value") as obj in world + if("turf-reference") + valueholder = input(user,"Enter variable value:" ,"Value") as turf in world + if(AREA_BUILDMODE) + var/list/gen_paths = subtypesof(/datum/mapGenerator) + + var/type = input(user,"Select Generator Type","Type") as null|anything in gen_paths + if(!type) return + + generator_path = type + cornerA = null + cornerB = null + +/datum/buildmode/proc/change_dir() + switch(build_dir) + if(NORTH) + build_dir = EAST + if(EAST) + build_dir = SOUTH + if(SOUTH) + build_dir = WEST + if(WEST) + build_dir = NORTHWEST + if(NORTHWEST) + build_dir = NORTH + return 1 + +/datum/buildmode/proc/Reset()//Reset temporary variables + cornerA = null + cornerB = null + +/datum/buildmode/proc/ClickOn(mob/user,params,A) + world << "[user] clicking on [A]. Interceptin" + return 1 /proc/togglebuildmode(mob/M in player_list) set name = "Toggle Build Mode" set category = "Special Verbs" if(M.client) - if(M.client.buildmode) + if(istype(M.client.click_intercept,/datum/buildmode)) + var/datum/buildmode/B = M.client.click_intercept + B.quit() log_admin("[key_name(usr)] has left build mode.") - M.client.buildmode = 0 - M.client.show_popup_menus = 1 - for(var/obj/effect/bmode/buildholder/H) - if(H.cl == M.client) - qdel(H) else + new/datum/buildmode(M.client) message_admins("[key_name(usr)] has entered build mode.") log_admin("[key_name(usr)] has entered build mode.") - M.client.buildmode = 1 - M.client.show_popup_menus = 0 - var/obj/effect/bmode/buildholder/H = new/obj/effect/bmode/buildholder() - var/obj/effect/bmode/builddir/A = new/obj/effect/bmode/builddir(H) - A.master = H - var/obj/effect/bmode/buildhelp/B = new/obj/effect/bmode/buildhelp(H) - B.master = H - var/obj/effect/bmode/buildmode/C = new/obj/effect/bmode/buildmode(H) - C.master = H - var/obj/effect/bmode/buildquit/D = new/obj/effect/bmode/buildquit(H) - D.master = H - H.builddir = A - H.buildhelp = B - H.buildmode = C - H.buildquit = D - M.client.screen += A - M.client.screen += B - M.client.screen += C - M.client.screen += D - H.cl = M.client - -/obj/effect/bmode //Cleaning up the tree a bit - density = 1 - anchored = 1 - layer = 20 - dir = NORTH - icon = 'icons/misc/buildmode.dmi' - var/obj/effect/bmode/buildholder/master = null - -/obj/effect/bmode/builddir - icon_state = "build" - screen_loc = "NORTH,WEST" - -/obj/effect/bmode/builddir/Click() - switch(dir) - if(NORTH) - dir = EAST - if(EAST) - dir = SOUTH - if(SOUTH) - dir = WEST - if(WEST) - dir = NORTHWEST - if(NORTHWEST) - dir = NORTH - return 1 - -/obj/effect/bmode/buildhelp - icon = 'icons/misc/buildmode.dmi' - icon_state = "buildhelp" - screen_loc = "NORTH,WEST+1" - -/obj/effect/bmode/buildhelp/Click() - switch(master.cl.buildmode) - if(BASIC_BUILDMODE) - usr << "\blue ***********************************************************" - usr << "\blue Left Mouse Button = Construct / Upgrade" - usr << "\blue Right Mouse Button = Deconstruct / Delete / Downgrade" - usr << "\blue Left Mouse Button + ctrl = R-Window" - usr << "\blue Left Mouse Button + alt = Airlock" - usr << "" - usr << "\blue Use the button in the upper left corner to" - usr << "\blue change the direction of built objects." - usr << "\blue ***********************************************************" - if(ADV_BUILDMODE) - usr << "\blue ***********************************************************" - usr << "\blue Right Mouse Button on buildmode button = Set object type" - usr << "\blue Left Mouse Button on turf/obj = Place objects" - usr << "\blue Right Mouse Button = Delete objects" - usr << "" - usr << "\blue Use the button in the upper left corner to" - usr << "\blue change the direction of built objects." - usr << "\blue ***********************************************************" - if(VAR_BUILDMODE) - usr << "\blue ***********************************************************" - usr << "\blue Right Mouse Button on buildmode button = Select var(type) & value" - usr << "\blue Left Mouse Button on turf/obj/mob = Set var(type) & value" - usr << "\blue Right Mouse Button on turf/obj/mob = Reset var's value" - usr << "\blue ***********************************************************" - if(THROW_BUILDMODE) - usr << "\blue ***********************************************************" - usr << "\blue Left Mouse Button on turf/obj/mob = Select" - usr << "\blue Right Mouse Button on turf/obj/mob = Throw" - usr << "\blue ***********************************************************" - if(AREA_BUILDMODE) - usr << "\blue ***********************************************************" - usr << "\blue Left Mouse Button on turf/obj/mob = Select corner" - usr << "\blue Right Mouse Button on buildmode button = Select generator" - usr << "\blue ***********************************************************" - - return 1 - -/obj/effect/bmode/buildquit - icon_state = "buildquit" - screen_loc = "NORTH,WEST+3" - -/obj/effect/bmode/buildquit/Click() - togglebuildmode(master.cl.mob) - return 1 - -/obj/effect/bmode/buildholder - density = 0 - anchored = 1 - var/client/cl = null - var/obj/effect/bmode/builddir/builddir = null - var/obj/effect/bmode/buildhelp/buildhelp = null - var/obj/effect/bmode/buildmode/buildmode = null - var/obj/effect/bmode/buildquit/buildquit = null - var/atom/movable/throw_atom = null - var/turf/cornerA = null - var/turf/cornerB = null - var/generator_path = null - -/obj/effect/bmode/buildholder/proc/Reset()//Reset temporary variables - cornerA = null - cornerB = null - -/obj/effect/bmode/buildmode - icon_state = "buildmode1" - screen_loc = "NORTH,WEST+2" - var/varholder = "name" - var/valueholder = "derp" - var/objholder = /obj/structure/closet - -/obj/effect/bmode/buildmode/Click(location, control, params) +/datum/buildmode/ClickOn(user,params,atom/object) //Click Intercept var/list/pa = params2list(params) + var/right_click = pa.Find("right") + var/left_click = pa.Find("left") + var/alt_click = pa.Find("alt") + var/ctrl_click = pa.Find("ctrl") - if(pa.Find("left")) - master.cl.buildmode = (master.cl.buildmode % NUM_BUILDMODES) +1 - master.Reset() - src.icon_state = "buildmode[master.cl.buildmode]" - - else if(pa.Find("right")) - switch(master.cl.buildmode) - if(BASIC_BUILDMODE) - return 1 - if(ADV_BUILDMODE) - objholder = text2path(input(usr,"Enter typepath:" ,"Typepath","/obj/structure/closet")) - if(!ispath(objholder)) - objholder = /obj/structure/closet - alert("That path is not allowed.") - else - if(ispath(objholder,/mob) && !check_rights(R_DEBUG,0)) - objholder = /obj/structure/closet - if(VAR_BUILDMODE) - var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "viruses", "cuffed", "ka", "last_eaten", "urine") - - master.buildmode.varholder = input(usr,"Enter variable name:" ,"Name", "name") - if(master.buildmode.varholder in locked && !check_rights(R_DEBUG,0)) - return 1 - var/thetype = input(usr,"Select variable type:" ,"Type") in list("text","number","mob-reference","obj-reference","turf-reference") - if(!thetype) return 1 - switch(thetype) - if("text") - master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value", "value") as text - if("number") - master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value", 123) as num - if("mob-reference") - master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as mob in mob_list - if("obj-reference") - master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as obj in world - if("turf-reference") - master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as turf in world - if(AREA_BUILDMODE) - var/list/gen_paths = subtypesof(/datum/mapGenerator) - - var/type = input(usr,"Select Generator Type","Type") as null|anything in gen_paths - if(!type) return - - master.generator_path = type - master.cornerA = null - master.cornerB = null - - return 1 - - -/proc/build_click(mob/user, buildmode, params, obj/object) - var/obj/effect/bmode/buildholder/holder = null - for(var/obj/effect/bmode/buildholder/H) - if(H.cl == user.client) - holder = H - break - if(!holder) return - var/list/pa = params2list(params) - - if(istype(object,/obj/effect/bmode)) - return - - switch(buildmode) + . = 1 + switch(mode) if(BASIC_BUILDMODE) - if(istype(object,/turf) && pa.Find("left") && !pa.Find("alt") && !pa.Find("ctrl") ) + if(istype(object,/turf) && left_click && !alt_click && !ctrl_click ) var/turf/T = object if(istype(object,/turf/space)) T.ChangeTurf(/turf/simulated/floor/plasteel) @@ -219,10 +273,10 @@ T.ChangeTurf(/turf/simulated/wall) else if(istype(object,/turf/simulated/wall)) T.ChangeTurf(/turf/simulated/wall/r_wall) - log_admin("Build Mode: [key_name(usr)] built [T] at ([T.x],[T.y],[T.z])") + log_admin("Build Mode: [key_name(user)] built [T] at ([T.x],[T.y],[T.z])") return - else if(pa.Find("right")) - log_admin("Build Mode: [key_name(usr)] deleted [object] at ([object.x],[object.y],[object.z])") + else if(right_click) + log_admin("Build Mode: [key_name(user)] deleted [object] at ([object.x],[object.y],[object.z])") if(istype(object,/turf/simulated/wall)) var/turf/T = object T.ChangeTurf(/turf/simulated/floor/plasteel) @@ -235,11 +289,11 @@ else if(istype(object,/obj)) qdel(object) return - else if(istype(object,/turf) && pa.Find("alt") && pa.Find("left")) - log_admin("Build Mode: [key_name(usr)] built an airlock at ([object.x],[object.y],[object.z])") + else if(istype(object,/turf) && alt_click && left_click) + log_admin("Build Mode: [key_name(user)] built an airlock at ([object.x],[object.y],[object.z])") new/obj/machinery/door/airlock(get_turf(object)) - else if(istype(object,/turf) && pa.Find("ctrl") && pa.Find("left")) - switch(holder.builddir.dir) + else if(istype(object,/turf) && ctrl_click && left_click) + switch(build_dir) if(NORTH) var/obj/structure/window/reinforced/WIN = new/obj/structure/window/reinforced(get_turf(object)) WIN.dir = NORTH @@ -255,74 +309,70 @@ if(NORTHWEST) var/obj/structure/window/reinforced/WIN = new/obj/structure/window/reinforced(get_turf(object)) WIN.dir = NORTHWEST - log_admin("Build Mode: [key_name(usr)] built a window at ([object.x],[object.y],[object.z])") + log_admin("Build Mode: [key_name(user)] built a window at ([object.x],[object.y],[object.z])") if(ADV_BUILDMODE) - if(pa.Find("left")) - if(ispath(holder.buildmode.objholder,/turf)) + if(left_click) + if(ispath(objholder,/turf)) var/turf/T = get_turf(object) - log_admin("Build Mode: [key_name(usr)] modified [T] ([T.x],[T.y],[T.z]) to [holder.buildmode.objholder]") - T.ChangeTurf(holder.buildmode.objholder) + log_admin("Build Mode: [key_name(user)] modified [T] ([T.x],[T.y],[T.z]) to [objholder]") + T.ChangeTurf(objholder) else - var/obj/A = new holder.buildmode.objholder (get_turf(object)) - A.dir = holder.builddir.dir - log_admin("Build Mode: [key_name(usr)] modified [A]'s ([A.x],[A.y],[A.z]) dir to [holder.builddir.dir]") - else if(pa.Find("right")) + var/obj/A = new objholder (get_turf(object)) + A.dir = build_dir + log_admin("Build Mode: [key_name(user)] modified [A]'s ([A.x],[A.y],[A.z]) dir to [build_dir]") + else if(right_click) if(isobj(object)) - log_admin("Build Mode: [key_name(usr)] deleted [object] at ([object.x],[object.y],[object.z])") + log_admin("Build Mode: [key_name(user)] deleted [object] at ([object.x],[object.y],[object.z])") qdel(object) if(VAR_BUILDMODE) - if(pa.Find("left")) //I cant believe this shit actually compiles. - if(object.vars.Find(holder.buildmode.varholder)) - log_admin("Build Mode: [key_name(usr)] modified [object.name]'s [holder.buildmode.varholder] to [holder.buildmode.valueholder]") - object.vars[holder.buildmode.varholder] = holder.buildmode.valueholder + if(left_click) //I cant believe this shit actually compiles. + if(object.vars.Find(varholder)) + log_admin("Build Mode: [key_name(user)] modified [object.name]'s [varholder] to [valueholder]") + object.vars[varholder] = valueholder else - usr << "[initial(object.name)] does not have a var called '[holder.buildmode.varholder]'" - if(pa.Find("right")) - if(object.vars.Find(holder.buildmode.varholder)) - log_admin("Build Mode: [key_name(usr)] modified [object.name]'s [holder.buildmode.varholder] to [holder.buildmode.valueholder]") - object.vars[holder.buildmode.varholder] = initial(object.vars[holder.buildmode.varholder]) + user << "[initial(object.name)] does not have a var called '[varholder]'" + if(right_click) + if(object.vars.Find(varholder)) + log_admin("Build Mode: [key_name(user)] modified [object.name]'s [varholder] to [valueholder]") + object.vars[varholder] = initial(object.vars[varholder]) else - usr << "[initial(object.name)] does not have a var called '[holder.buildmode.varholder]'" + user << "[initial(object.name)] does not have a var called '[varholder]'" if(THROW_BUILDMODE) - if(pa.Find("left")) + if(left_click) if(isturf(object)) return - holder.throw_atom = object - if(pa.Find("right")) - if(holder.throw_atom) - holder.throw_atom.throw_at(object, 10, 1,user) - log_admin("Build Mode: [key_name(usr)] threw [holder.throw_atom] at [object] ([object.x],[object.y],[object.z])") + throw_atom = object + if(right_click) + if(throw_atom) + throw_atom.throw_at(object, 10, 1,user) + log_admin("Build Mode: [key_name(user)] threw [throw_atom] at [object] ([object.x],[object.y],[object.z])") if(AREA_BUILDMODE) - if(!holder.cornerA) - holder.cornerA = get_turf(object) + if(!cornerA) + cornerA = get_turf(object) return - if(holder.cornerA && !holder.cornerB) - holder.cornerB = get_turf(object) + if(cornerA && !cornerB) + cornerB = get_turf(object) - if(pa.Find("left")) //rectangular - if(holder.cornerA && holder.cornerB) - if(!holder.generator_path) - usr << "Select generator type first." - var/datum/mapGenerator/G = new holder.generator_path - G.defineRegion(holder.cornerA,holder.cornerB,1) + if(left_click) //rectangular + if(cornerA && cornerB) + if(!generator_path) + user << "Select generator type first." + var/datum/mapGenerator/G = new generator_path + G.defineRegion(cornerA,cornerB,1) G.generate() - holder.cornerA = null - holder.cornerB = null + cornerA = null + cornerB = null return - /* Something wrong with this, will check later - if(pa.Find("right")) // circular - if(holder.cornerA && holder.cornerB) - if(!holder.generator_path) - usr << "Select generator type first." - var/datum/mapGenerator/G = new holder.generator_path - G.defineCircularRegion(holder.cornerA,holder.cornerB,1) - G.generate() - holder.cornerA = null - holder.cornerB = null - return - */ //Something wrong - Reset - holder.cornerA = null - holder.cornerB = null \ No newline at end of file + cornerA = null + cornerB = null + if(COPY_BUILDMODE) + if(left_click) + var/turf/T = get_turf(object) + if(stored) + DuplicateObject(stored,perfectcopy=1,newloc=T) + else if(right_click) + if(ismovableatom(object)) // No copying turfs for now. + stored = object \ No newline at end of file diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 72679562098..05ee9cfe3bc 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -4,7 +4,7 @@ //ADMIN THINGS// //////////////// var/datum/admins/holder = null - var/buildmode = 0 + var/click_intercept = null // Needs to implement ClickOn(user,params,atom) proc var/AI_Interact = 0 var/jobbancache = null //Used to cache this client's jobbans to save on DB queries diff --git a/icons/misc/buildmode.dmi b/icons/misc/buildmode.dmi index 089427111f2f5bc779167b3c22ce191d71f82ff5..649a77265693dbdd6626c90fef14583fcd717200 100644 GIT binary patch delta 852 zcmV-a1FQV72kZxsBrFn8OjJd{z`y`r005`}0KEVJ0A>IHnHe90Px3t5$tn|bpQYY=t)FDRA_2T2tc$303uuh5U~kY0YHGxgsT8TK!2bWfL(&FuDl*h%i+A9P`)|fT_3z=eNdiAT73$@%>^3RucM_kj}@ zfU{WuAonrA7-^35^MLG)CVY`Qp}>L$U`rSeU{~Jo5Kzp41y}>JV3Gjb93aIxV1QW* zntvQZJ0$1!*8#`+T^~H9y;yyK*8nkt@Hf*5fZF#x0a67*lNKm#F85?X_(mGOnJSOZ z0sfV&wY#MwAefN0Z-cOZs|eV0pyF#40p0{i;i~wja-9I$3tbi%4l@Ag7O*=b(>GO5 zDFHf6S}}>r_qVf>ima?g@^92f0ObHWIe!vivAtIS-2irO2~ZvD&H%~-^yr)FQviO9 z0T4`ffIYN>A-GknEKp$?TR=OBGC*e;b3j-|9bCBqRE`uKu@BgE4X9nY2KX@~U=65) zNySkV!K90Xk}YEs&MLS;5zhNI0@Mkm11J+p<;ug9mIE?R+_pNHQc|5y>s2_PcO7Un ekLg_>*!CaRjVEL-)nzCE0000WDTPL z)6r>O;Q@f@X?0?N764>*Vn6~YJDfDR_V023%ir+50p*a?L#P6JlPCdnmr(-fI+6&` zc4bBI)PqS8zIA{ifi%Kdp28Xcc@k|U6mc4F0mOym445r#)5Y}@w9mRfQ2W6PaEeB` z_6Y@jIE5XGe_S&FZ8*d6fI>R}a7M!LfJQUGRX#i(P-q80{sF=R8qEMMxW@wu{bc~N zlQ_MM(~dOl%JacA9nSL!<(mUu`-88!KgdrcXMG94#RVGJu&?PV0Ftfl2msREI(L8q z09}CX9nT9sSHupbt^nLL#gv8iZD2lxRb2yM4FC&PfAxC+T!VBDOxcMhm)eZjFkM#9 z0P-^v@{}%+0YD4z7Da&K&}FL<@gR~jlj6{YwmzQ#_&fk!0n94!5by#J$~p1(I#6H% zIGYs!a+d+dNOPo@1ClqI@I~%~3JXpEyM^%pcI5@TfNTydz#5PQlLp}C04dG^1I${G za0urie>t}w2lVx8fAEwxYqEaQN`Q9Rx&Ryl#0H(YA(SRlZ(mj%Y8IUBZG@Gl@DtWf@aISjJ82NYN3cfYOyq zfFHvu4yHAZA`7NX9L{TSgDjl)rXQ3Er2^ Date: Tue, 9 Feb 2016 15:16:56 +0100 Subject: [PATCH 2/2] Cleanup --- code/__HELPERS/unsorted.dm | 20 +++++++++++++++++++- code/_onclick/ai.dm | 4 ++-- code/_onclick/click.dm | 2 +- code/modules/admin/admin.dm | 16 +--------------- code/modules/admin/verbs/buildmode.dm | 27 ++------------------------- code/modules/client/client defines.dm | 2 +- 6 files changed, 26 insertions(+), 45 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 7b20b42e8f3..f3c3e4ae279 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1228,4 +1228,22 @@ proc/shift_proximity(atom/checker, atom/A, range, atom/B, newrange) if(closest_distance > distance) closest_distance = distance closest_atom = A - return closest_atom \ No newline at end of file + return closest_atom + +proc/pick_closest_path(value) + var/list/matches = get_fancy_list_of_types() + if (!isnull(value) && value!="") + matches = filter_fancy_list(matches, value) + + if(matches.len==0) + return + + var/chosen + if(matches.len==1) + chosen = matches[1] + else + chosen = input("Select an atom type", "Spawn Atom", matches[1]) as null|anything in matches + if(!chosen) + return + chosen = matches[chosen] + return chosen \ No newline at end of file diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index 7f526e126af..e354fbbe2d4 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -11,7 +11,7 @@ */ /mob/living/silicon/ai/DblClickOn(var/atom/A, params) if(client.click_intercept) - if(call(client.click_intercept,"ClickOn")(src,params,A)) + if(call(client.click_intercept, "ClickOn")(src, params, A)) return if(control_disabled || stat) return @@ -28,7 +28,7 @@ next_click = world.time + 1 if(client.click_intercept) - if(call(client.click_intercept,"ClickOn")(src,params,A)) + if(call(client.click_intercept, "ClickOn")(src, params, A)) return if(control_disabled || stat) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 423357d71f2..d500428a29f 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -54,7 +54,7 @@ next_click = world.time + 1 if(client.click_intercept) - if(call(client.click_intercept,"ClickOn")(src,params,A)) + if(call(client.click_intercept, "ClickOn")(src, params, A)) return var/list/modifiers = params2list(params) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index f023e7de493..0672ba1437f 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -619,21 +619,7 @@ var/global/BSACooldown = 0 if(!check_rights(R_SPAWN)) return - var/list/matches = get_fancy_list_of_types() - if (!isnull(object) && object!="") - matches = filter_fancy_list(matches, object) - - if(matches.len==0) - return - - var/chosen - if(matches.len==1) - chosen = matches[1] - else - chosen = input("Select an atom type", "Spawn Atom", matches[1]) as null|anything in matches - if(!chosen) - return - chosen = matches[chosen] + var/chosen = pick_closest_path(object) if(ispath(chosen,/turf)) var/turf/T = get_turf(usr.loc) diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm index 6c94138ab51..bd04c75653b 100644 --- a/code/modules/admin/verbs/buildmode.dm +++ b/code/modules/admin/verbs/buildmode.dm @@ -156,25 +156,6 @@ user << "\blue Right Mouse Button on obj/mob = Select target to copy" user << "\blue ***********************************************************" - -/datum/buildmode/proc/pick_closest_path(value) - var/list/matches = get_fancy_list_of_types() - if (!isnull(value) && value!="") - matches = filter_fancy_list(matches, value) - - if(matches.len==0) - return - - var/chosen - if(matches.len==1) - chosen = matches[1] - else - chosen = input("Select an atom type", "Spawn Atom", matches[1]) as null|anything in matches - if(!chosen) - return - chosen = matches[chosen] - return chosen - /datum/buildmode/proc/change_settings(mob/user) switch(mode) if(BASIC_BUILDMODE) @@ -237,10 +218,6 @@ cornerA = null cornerB = null -/datum/buildmode/proc/ClickOn(mob/user,params,A) - world << "[user] clicking on [A]. Interceptin" - return 1 - /proc/togglebuildmode(mob/M in player_list) set name = "Toggle Build Mode" set category = "Special Verbs" @@ -255,7 +232,7 @@ log_admin("[key_name(usr)] has entered build mode.") -/datum/buildmode/ClickOn(user,params,atom/object) //Click Intercept +/datum/buildmode/proc/ClickOn(user,params,atom/object) //Click Intercept var/list/pa = params2list(params) var/right_click = pa.Find("right") var/left_click = pa.Find("left") @@ -265,7 +242,7 @@ . = 1 switch(mode) if(BASIC_BUILDMODE) - if(istype(object,/turf) && left_click && !alt_click && !ctrl_click ) + if(istype(object,/turf) && left_click && !alt_click && !ctrl_click) var/turf/T = object if(istype(object,/turf/space)) T.ChangeTurf(/turf/simulated/floor/plasteel) diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 05ee9cfe3bc..ca9ced5dc8e 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -4,7 +4,7 @@ //ADMIN THINGS// //////////////// var/datum/admins/holder = null - var/click_intercept = null // Needs to implement ClickOn(user,params,atom) proc + var/datum/click_intercept = null // Needs to implement ClickOn(user,params,atom) proc var/AI_Interact = 0 var/jobbancache = null //Used to cache this client's jobbans to save on DB queries