diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index c8eb8440241..7e9e07055e0 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -110,9 +110,10 @@ if(A.ClickAccessible(src, depth=INVENTORY_DEPTH)) // No adjacency needed if(W) - var/resolved = A.attackby(W,src) - if(!resolved && A && W) - W.afterattack(A,src,1,params) // 1 indicates adjacency + if(W.pre_attackby(A,src,params)) + var/resolved = A.attackby(W,src) + if(!resolved && A && W) + W.afterattack(A,src,1,params) // 1 indicates adjacency else if(ismob(A)) changeNext_move(CLICK_CD_MELEE) @@ -126,10 +127,11 @@ if(isturf(A) || isturf(A.loc) || (A.loc && isturf(A.loc.loc))) if(A.Adjacent(src)) // see adjacent.dm if(W) - // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example) - var/resolved = A.attackby(W,src,params) - if(!resolved && A && W) - W.afterattack(A,src,1,params) // 1: clicking something Adjacent + if(W.pre_attackby(A,src,params)) + // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example) + var/resolved = A.attackby(W,src,params) + if(!resolved && A && W) + W.afterattack(A,src,1,params) // 1: clicking something Adjacent else if(ismob(A)) changeNext_move(CLICK_CD_MELEE) @@ -234,7 +236,7 @@ var/mob/living/carbon/human/H = user H.dna.species.grab(H, src, H.martial_art) H.next_click = world.time + CLICK_CD_MELEE - else + else ..() /* Alt click diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 738abb63718..1cac6b1d939 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -3,6 +3,9 @@ /obj/item/proc/attack_self(mob/user) return +/obj/item/proc/pre_attackby(obj/O, mob/living/user, params) //do stuff before attackby! + return TRUE //return FALSE to avoid calling attackby after this proc does stuff + // No comment /atom/proc/attackby(obj/item/W, mob/user, params) return diff --git a/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm b/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm index 04d739c8ff8..3132e935a40 100644 --- a/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm +++ b/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm @@ -47,6 +47,8 @@ return FALSE /turf/open/floor/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) + if(locate(/obj/structure/table) in loc) + return FALSE if(is_blocked_turf(src, TRUE)) user << "Something is in the way, preventing you from proselytizing [src] into a clockwork wall." return TRUE @@ -169,6 +171,33 @@ /obj/machinery/door/airlock/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) return FALSE +//Table conversion +/obj/structure/table/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) + var/prosel_cost = POWER_STANDARD + if(framestack == /obj/item/stack/rods) + prosel_cost -= POWER_ROD*framestackamount + else if(framestack == /obj/item/stack/tile/brass) + prosel_cost -= POWER_FLOOR*framestackamount + if(buildstack == /obj/item/stack/sheet/metal) + prosel_cost -= POWER_METAL*buildstackamount + else if(buildstack == /obj/item/stack/sheet/plasteel) + prosel_cost -= POWER_PLASTEEL*buildstackamount + return list("operation_time" = 20, "new_obj_type" = /obj/structure/table/reinforced/brass, "power_cost" = prosel_cost, "spawn_dir" = SOUTH) + +/obj/structure/table/reinforced/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) + return FALSE + +/obj/structure/table_frame/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) + var/prosel_cost = POWER_FLOOR + if(framestack == /obj/item/stack/rods) + prosel_cost -= POWER_ROD*framestackamount + else if(framestack == /obj/item/stack/tile/brass) + prosel_cost -= POWER_FLOOR*framestackamount + return list("operation_time" = 10, "new_obj_type" = /obj/structure/table_frame/brass, "power_cost" = prosel_cost, "spawn_dir" = SOUTH) + +/obj/structure/table_frame/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) + return FALSE + //Window conversion /obj/structure/window/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) var/windowtype = /obj/structure/window/reinforced/clockwork diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm index defda399fbc..f67e49802fc 100644 --- a/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm +++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm @@ -144,12 +144,10 @@ new/obj/item/stack/tile/brass(user.loc, 5) user << "You user [stored_power ? "some":"all"] of [src]'s power to produce some brass sheets. It now stores [get_power()]W/[get_max_power()]W of power." -/obj/item/clockwork/clockwork_proselytizer/afterattack(atom/target, mob/living/user, proximity_flag, params) - if(!target || !user || !proximity_flag) - return 0 - if(!is_servant_of_ratvar(user)) - return ..() - proselytize(target, user) +/obj/item/clockwork/clockwork_proselytizer/pre_attackby(atom/target, mob/living/user, params) + if(!target || !user || !is_servant_of_ratvar(user) || istype(target, /obj/item/weapon/storage)) + return TRUE + return proselytize(target, user) /obj/item/clockwork/clockwork_proselytizer/proc/get_power() return stored_power @@ -173,7 +171,8 @@ return FALSE return TRUE -/obj/item/clockwork/clockwork_proselytizer/proc/proselytize(atom/target, mob/living/user) +//A note here; return values are for if we CAN BE PUT ON A TABLE, not IF WE ARE SUCCESSFUL, unless no_table_check is TRUE +/obj/item/clockwork/clockwork_proselytizer/proc/proselytize(atom/target, mob/living/user, no_table_check) if(!target || !user) return FALSE if(repairing) @@ -183,8 +182,10 @@ if(!islist(proselytize_values)) if(proselytize_values != TRUE) //if we get true, fail, but don't send a message for whatever reason if(!isturf(target)) //otherwise, if we didn't get TRUE and the original target wasn't a turf, try to proselytize the turf - return proselytize(get_turf(target), user) + return proselytize(get_turf(target), user, no_table_check) user << "[target] cannot be proselytized!" + if(!no_table_check) + return TRUE return FALSE if(can_use_power(RATVAR_POWER_CHECK)) proselytize_values["power_cost"] = 0 @@ -202,12 +203,11 @@ user << "Your [name] contains too much power to proselytize [target]!" return FALSE - var/target_type = target.type - proselytize_values["operation_time"] *= speed_multiplier playsound(target, 'sound/machines/click.ogg', 50, 1) if(proselytize_values["operation_time"]) + var/target_type = target.type user.visible_message("[user]'s [name] begins tearing apart [target]!", "You begin proselytizing [target]...") if(!do_after(user, proselytize_values["operation_time"], target = target)) return FALSE @@ -231,4 +231,6 @@ if(!proselytize_values["no_target_deletion"]) qdel(target) modify_stored_power(-proselytize_values["power_cost"]) - return TRUE + if(no_table_check) + return TRUE + return FALSE diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm index e54aa08016f..559463d6040 100644 --- a/code/game/objects/structures/table_frames.dm +++ b/code/game/objects/structures/table_frames.dm @@ -36,8 +36,7 @@ return user << "You start adding [P] to [src]..." if(do_after(user, 50, target = src) && P.use(1)) - new /obj/structure/table/reinforced(src.loc) - qdel(src) + make_new_table(/obj/structure/table/reinforced) else if(istype(I, /obj/item/stack/sheet/metal)) var/obj/item/stack/sheet/metal/M = I if(M.get_amount() < 1) @@ -45,8 +44,7 @@ return user << "You start adding [M] to [src]..." if(do_after(user, 20, target = src) && M.use(1)) - new /obj/structure/table(src.loc) - qdel(src) + make_new_table(/obj/structure/table) else if(istype(I, /obj/item/stack/sheet/glass)) var/obj/item/stack/sheet/glass/G = I if(G.get_amount() < 1) @@ -54,8 +52,7 @@ return user << "You start adding [G] to [src]..." if(do_after(user, 20, target = src) && G.use(1)) - new /obj/structure/table/glass(src.loc) - qdel(src) + make_new_table(/obj/structure/table/glass) else if(istype(I, /obj/item/stack/sheet/mineral/silver)) var/obj/item/stack/sheet/mineral/silver/S = I if(S.get_amount() < 1) @@ -63,8 +60,7 @@ return user << "You start adding [S] to [src]..." if(do_after(user, 20, target = src) && S.use(1)) - new /obj/structure/table/optable(src.loc) - qdel(src) + make_new_table(/obj/structure/table/optable) else if(istype(I, /obj/item/stack/tile/carpet)) var/obj/item/stack/tile/carpet/C = I if(C.get_amount() < 1) @@ -72,11 +68,17 @@ return user << "You start adding [C] to [src]..." if(do_after(user, 20, target = src) && C.use(1)) - new /obj/structure/table/wood/fancy(src.loc) - qdel(src) + make_new_table(/obj/structure/table/wood/fancy) else return ..() +/obj/structure/table_frame/proc/make_new_table(table_type) //makes sure the new table made retains what we had as a frame + var/obj/structure/table/T = new table_type(loc) + T.frame = type + T.framestack = framestack + T.framestackamount = framestackamount + qdel(src) + /obj/structure/table_frame/deconstruct(disassembled = TRUE) new framestack(get_turf(src), framestackamount) qdel(src) @@ -110,8 +112,7 @@ return user << "You start adding [W] to [src]..." if(do_after(user, 20, target = src) && W.use(1)) - new /obj/structure/table/wood(src.loc) - qdel(src) + make_new_table(/obj/structure/table/wood) return else if(istype(I, /obj/item/stack/tile/carpet)) var/obj/item/stack/tile/carpet/C = I @@ -120,8 +121,7 @@ return user << "You start adding [C] to [src]..." if(do_after(user, 20, target = src) && C.use(1)) - new /obj/structure/table/wood/poker(src.loc) - qdel(src) + make_new_table(/obj/structure/table/wood/poker) else return ..() @@ -149,8 +149,7 @@ return user << "You start adding [W] to [src]..." if(do_after(user, 20, target = src) && W.use(1)) - new /obj/structure/table/reinforced/brass(src.loc) - qdel(src) + make_new_table(/obj/structure/table/reinforced/brass) else return ..()