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 ..()