[Testmerge ready] Ports tool behaviours; refactors all tools; adds functionality for self-filling reagent containers (#11700)

* Adds support for self-filling reagent containers

* Sets tool_behaviour on the default set of tools

* Fixing merge conflicts

* Refactors welder to use tool behaviour

* The refactor: part I

* The refactor: part II

* Tool Refactor Part III: Revenge of the Maint

* Tool Refactor Part IV: A New Hope

* Tool Refactor Part V: The Oldcoder Strikes Back

* Tool Refactor Part VI: Return of the Coder

* VII

* Holy shit, it compiles?!

* Nannek I completed your TODO, you owe me ice cream

* Tool helpers; telepad is compliant

* Bugtest, Round 1: Fight

Fuck refactoring disposals

* Buggfixing, Round 2: Electric Boogaloo

* Personal crafting uses tool behaviours now

* Construction datums use new tool behaviours; better way of handling fueltank refuelling; more bugfixing

* multitool_check_buffer change; removes some useless things in tool_helpers

* proc name change

* TRUE/FALSE changes

* Bugfixing, Round 3: A Good Day To Bugfix Hard

Fixes multiple issues raised by the testmerge

* Minor style changes
This commit is contained in:
Citinited
2020-02-15 13:31:08 -07:00
committed by GitHub
parent 5b1941e784
commit fddff1049b
238 changed files with 6681 additions and 5544 deletions
+4 -2
View File
@@ -12,6 +12,7 @@ var/const/INGEST = 2
var/chem_temp = T20C
var/list/datum/reagent/addiction_list = new/list()
var/flags
var/list/reagents_generated_per_cycle = new/list()
/datum/reagents/New(maximum = 100)
maximum_volume = maximum
@@ -209,7 +210,7 @@ var/const/INGEST = 2
return
var/datum/reagents/R = target.reagents
if(get_reagent_amount(reagent)<amount)
if(get_reagent_amount(reagent) < amount)
amount = get_reagent_amount(reagent)
amount = min(amount, R.maximum_volume-R.total_volume)
var/trans_data = null
@@ -348,7 +349,8 @@ var/const/INGEST = 2
if(flags & REAGENT_NOREACT)
STOP_PROCESSING(SSobj, src)
return
for(var/thing in reagents_generated_per_cycle)
add_reagent(thing, reagents_generated_per_cycle[thing])
for(var/datum/reagent/R in reagent_list)
R.on_tick()
@@ -242,46 +242,10 @@
return TRUE // update UIs attached to this object
/obj/machinery/chem_dispenser/attackby(obj/item/I, mob/user, params)
if(ismultitool(I))
if(!hackedcheck)
to_chat(user, hack_message)
dispensable_reagents += hacked_reagents
hackedcheck = TRUE
else
to_chat(user, unhack_message)
dispensable_reagents -= hacked_reagents
hackedcheck = FALSE
SSnanoui.update_uis(src)
return
if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", "[initial(icon_state)]", I))
return
if(exchange_parts(user, I))
SSnanoui.update_uis(src)
return
if(iswrench(I))
playsound(src, I.usesound, 50, 1)
if(anchored)
anchored = FALSE
to_chat(user, "<span class='caution'>[src] can now be moved.</span>")
else if(!anchored)
anchored = TRUE
to_chat(user, "<span class='caution'>[src] is now secured.</span>")
return
if(panel_open)
if(iscrowbar(I))
if(beaker)
beaker.forceMove(loc)
beaker = null
if(cell)
cell.forceMove(loc)
cell = null
default_deconstruction_crowbar(I)
return TRUE
if(isrobot(user))
return
@@ -307,6 +271,48 @@
return
return ..()
/obj/machinery/chem_dispenser/crowbar_act(mob/user, obj/item/I)
if(!panel_open)
return
if(default_deconstruction_crowbar(user, I))
if(beaker)
beaker.forceMove(loc)
beaker = null
if(cell)
cell.forceMove(loc)
cell = null
return TRUE
/obj/machinery/chem_dispenser/multitool_act(mob/user, obj/item/I)
. = TRUE
if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
if(!hackedcheck)
to_chat(user, hack_message)
dispensable_reagents += hacked_reagents
hackedcheck = TRUE
else
to_chat(user, unhack_message)
dispensable_reagents -= hacked_reagents
hackedcheck = FALSE
SSnanoui.update_uis(src)
/obj/machinery/chem_dispenser/screwdriver_act(mob/user, obj/item/I)
if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", "[initial(icon_state)]", I))
return TRUE
/obj/machinery/chem_dispenser/wrench_act(mob/user, obj/item/I)
. = TRUE
if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
if(anchored)
anchored = FALSE
WRENCH_UNANCHOR_MESSAGE
else if(!anchored)
anchored = TRUE
WRENCH_ANCHOR_MESSAGE
/obj/machinery/chem_dispenser/attack_ai(mob/user)
return attack_hand(user)
@@ -58,9 +58,6 @@
SSnanoui.update_uis(src)
/obj/machinery/chem_heater/attackby(obj/item/I, mob/user)
if(default_unfasten_wrench(user, I))
power_change()
return
if(isrobot(user))
return
@@ -77,19 +74,26 @@
SSnanoui.update_uis(src)
return
if(default_deconstruction_screwdriver(user, "mixer0b", "mixer0b", I))
return
if(exchange_parts(user, I))
return
if(panel_open)
if(istype(I, /obj/item/crowbar))
eject_beaker()
default_deconstruction_crowbar(I)
return 1
return ..()
/obj/machinery/chem_heater/wrench_act(mob/user, obj/item/I)
. = TRUE
default_unfasten_wrench(user, I)
/obj/machinery/chem_heater/screwdriver_act(mob/user, obj/item/I)
. = TRUE
default_deconstruction_screwdriver(user, "mixer0b", "mixer0b", I)
/obj/machinery/chem_heater/crowbar_act(mob/user, obj/item/I)
if(!panel_open)
return
. = TRUE
eject_beaker()
default_deconstruction_crowbar(user, I)
/obj/machinery/chem_heater/attack_hand(mob/user)
ui_interact(user)
@@ -77,30 +77,12 @@
update_icon()
/obj/machinery/chem_master/attackby(obj/item/I, mob/user, params)
if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", I))
if(beaker)
beaker.forceMove(get_turf(src))
beaker = null
reagents.clear_reagents()
if(loaded_pill_bottle)
loaded_pill_bottle.forceMove(get_turf(src))
loaded_pill_bottle = null
return
if(exchange_parts(user, I))
return
if(panel_open)
if(iscrowbar(I))
default_deconstruction_crowbar(I)
return TRUE
else
to_chat(user, "<span class='warning'>You can't use the [name] while it's panel is opened!</span>")
return TRUE
if(default_unfasten_wrench(user, I))
power_change()
return
to_chat(user, "<span class='warning'>You can't use the [name] while it's panel is opened!</span>")
return TRUE
if(istype(I, /obj/item/reagent_containers/glass) || istype(I, /obj/item/reagent_containers/food/drinks/drinkingglass))
if(beaker)
@@ -131,6 +113,35 @@
else
return ..()
/obj/machinery/chem_master/crowbar_act(mob/user, obj/item/I)
if(!panel_open)
return
if(default_deconstruction_crowbar(user, I))
return TRUE
/obj/machinery/chem_master/screwdriver_act(mob/user, obj/item/I)
. = TRUE
if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", I))
if(beaker)
beaker.forceMove(get_turf(src))
beaker = null
reagents.clear_reagents()
if(loaded_pill_bottle)
loaded_pill_bottle.forceMove(get_turf(src))
loaded_pill_bottle = null
return TRUE
/obj/machinery/chem_master/wrench_act(mob/user, obj/item/I)
if(panel_open)
return
if(default_unfasten_wrench(user, I))
power_change()
return TRUE
/obj/machinery/chem_master/Topic(href, href_list)
if(..())
return TRUE
@@ -133,21 +133,35 @@
else
icon_state = "juicer0"
/obj/machinery/reagentgrinder/attackby(obj/item/I, mob/user, params)
if(default_unfasten_wrench(user, I))
/obj/machinery/reagentgrinder/crowbar_act(mob/user, obj/item/I)
. = TRUE
if(!anchored || beaker)
return
if(!panel_open)
return
if(!I.tool_use_check(user, 0))
return
default_deconstruction_crowbar(I)
/obj/machinery/reagentgrinder/screwdriver_act(mob/user, obj/item/I)
. = TRUE
if(!anchored || beaker)
return
if(!I.tool_use_check(user, 0))
return
default_deconstruction_screwdriver(user, "juicer_open", "juicer0", I)
/obj/machinery/reagentgrinder/wrench_act(mob/user, obj/item/I)
. = TRUE
if(!I.tool_use_check(user, 0))
return
default_unfasten_wrench(user, I)
/obj/machinery/reagentgrinder/attackby(obj/item/I, mob/user, params)
if(exchange_parts(user, I))
return
if(anchored && !beaker)
if(default_deconstruction_screwdriver(user, "juicer_open", "juicer0", I))
return
if(panel_open && istype(I, /obj/item/crowbar))
default_deconstruction_crowbar(I)
return
if(istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER) )
if(beaker)
to_chat(user, "<span class='warning'>There's already a container inside.</span>")
@@ -214,6 +228,8 @@
src.updateUsrDialog()
return FALSE
/obj/machinery/reagentgrinder/attack_ai(mob/user)
return FALSE
+19 -48
View File
@@ -151,29 +151,24 @@
test.Shift(NORTH, 1)
test.Shift(EAST, 6)
overlays += test
if(istype(I, /obj/item/weldingtool))
if(!reagents.has_reagent("fuel"))
to_chat(user, "<span class='warning'>[src] is out of fuel!</span>")
return
var/obj/item/weldingtool/W = I
if(!W.welding)
if(W.reagents.has_reagent("fuel", W.max_fuel))
to_chat(user, "<span class='warning'>Your [W] is already full!</span>")
return
reagents.trans_to(W, W.max_fuel)
user.visible_message("<span class='notice'>[user] refills [user.p_their()] [W].</span>", "<span class='notice'>You refill [W].</span>")
playsound(src, 'sound/effects/refill.ogg', 50, 1)
W.update_icon()
else
user.visible_message("<span class='warning'>[user] catastrophically fails at refilling [user.p_their()] [W]!</span>", "<span class='userdanger'>That was stupid of you.</span>")
message_admins("[key_name_admin(user)] triggered a fueltank explosion at [COORD(loc)]")
log_game("[key_name(user)] triggered a fueltank explosion at [COORD(loc)]")
investigate_log("[key_name(user)] triggered a fueltank explosion at [COORD(loc)]", INVESTIGATE_BOMB)
boom()
else
return ..()
obj/structure/reagent_dispensers/fueltank/welder_act(mob/user, obj/item/I)
. = TRUE
if(!reagents.has_reagent("fuel"))
to_chat(user, "<span class='warning'>[src] is out of fuel!</span>")
return
if(I.tool_enabled && I.use_tool(src, user, volume = I.tool_volume)) //check it's enabled first to prevent duplicate messages when refuelling
user.visible_message("<span class='danger'>[user] catastrophically fails at refilling [user.p_their()] [I]!</span>", "<span class='userdanger'>That was stupid of you.</span>")
message_admins("[key_name_admin(user)] triggered a fueltank explosion at [COORD(loc)]")
log_game("[key_name(user)] triggered a fueltank explosion at [COORD(loc)]")
investigate_log("[key_name(user)] triggered a fueltank explosion at [COORD(loc)]", INVESTIGATE_BOMB)
boom()
else
I.refill(user, src, reagents.get_reagent_amount("fuel")) //Try dump all fuel into the welder
/obj/structure/reagent_dispensers/fueltank/Move()
..()
if(rig)
@@ -233,35 +228,11 @@
user.put_in_hands(S)
paper_cups--
/obj/structure/reagent_dispensers/water_cooler/attackby(obj/item/W, mob/living/user, params)
add_fingerprint(user)
user.changeNext_move(CLICK_CD_MELEE)
if(iswrench(W))
if(anchored)
playsound(loc, W.usesound, 100, 1)
user.visible_message("[user] starts loosening [src]'s floor casters.", \
"<span class='notice'>You start loosening [src]'s floor casters...</span>")
if(do_after(user, 40 * W.toolspeed, target = src))
if(!loc || !anchored)
return
user.visible_message("[user] loosened [src]'s floor casters.", \
"<span class='notice'>You loosen [src]'s floor casters.</span>")
anchored = 0
else
if(!isfloorturf(loc))
user.visible_message("<span class='warning'>A floor must be present to secure [src]!</span>")
return
playsound(loc, W.usesound, 100, 1)
user.visible_message("[user] start securing [src]'s floor casters...", \
"<span class='notice'>You start securing [src]'s floor casters...</span>")
if(do_after(user, 40 * W.toolspeed, target = src))
if(!loc || anchored)
return
user.visible_message("[user] has secured [src]'s floor casters.", \
"<span class='notice'>You have secured [src]'s floor casters.</span>")
anchored = 1
/obj/structure/reagent_dispensers/water_cooler/wrench_act(mob/user, obj/item/I)
. = TRUE
if(!I.tool_use_check(user, 0))
return
return ..()
default_unfasten_wrench(user, I, 40)
/obj/structure/reagent_dispensers/beerkeg
name = "beer keg"