mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-11 16:14:08 +01:00
65bd5e581a
## About The Pull Request Makes Beaker Panel a TGUI so it actually works <img width="787" height="295" alt="image" src="https://github.com/user-attachments/assets/343056d2-f059-473d-a1eb-5604d2c3a38e" /> There's a lot more I want to do to this UI, namely UX and more features (like changing grenade types) but I figured I should PR it now that it's bare minimum functional so I don't get eaten by scope creep Fixes #89954 ## Changelog 🆑 Melbert admin: Spawn-reagent-container works again, and it's a TGUI /🆑
94 lines
3.4 KiB
Plaintext
94 lines
3.4 KiB
Plaintext
/datum/beaker_panel
|
|
|
|
/datum/beaker_panel/ui_state(mob/user)
|
|
return ADMIN_STATE(R_ADMIN)
|
|
|
|
/datum/beaker_panel/ui_close()
|
|
qdel(src)
|
|
|
|
/datum/beaker_panel/ui_interact(mob/user, datum/tgui/ui)
|
|
ui = SStgui.try_update_ui(user, src, ui)
|
|
if(!ui)
|
|
ui = new(user, src, "BeakerPanel")
|
|
ui.open()
|
|
|
|
/datum/beaker_panel/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
|
|
var/mob/user = ui.user
|
|
switch(action)
|
|
if("spawn")
|
|
var/obj/created = spawn_container_from_data(user, params["spawn_info"])
|
|
user.log_message("spawned a [created] containing [pretty_string_from_reagent_list(created.reagents.reagent_list)]", LOG_ADMIN)
|
|
return TRUE
|
|
if("spawngrenade")
|
|
var/obj/item/grenade/chem_grenade/grenade = spawn_grenade_from_data(user, params["spawn_info"], params["grenade_info"])
|
|
var/log_string = list()
|
|
for(var/obj/beaker as anything in grenade.beakers)
|
|
log_string += pretty_string_from_reagent_list(beaker.reagents.reagent_list)
|
|
user.log_message("spawned a [grenade] containing [english_list(log_string)]", LOG_ADMIN)
|
|
return TRUE
|
|
|
|
/datum/beaker_panel/ui_static_data(mob/user)
|
|
var/list/data = list()
|
|
|
|
data["reagents"] = list()
|
|
data["containers"] = list()
|
|
|
|
for(var/datum/reagent/reagent_type as anything in subtypesof(/datum/reagent))
|
|
if(!reagent_type::name)
|
|
continue
|
|
data["reagents"] += list(list("id" = reagent_type, "text" = reagent_type::name))
|
|
|
|
for(var/obj/item/reagent_containers/container_type as anything in subtypesof(/obj/item/reagent_containers))
|
|
if(!container_type::name)
|
|
continue
|
|
data["containers"] += list(list("id" = container_type, "text" = container_type::name, "volume" = container_type::volume))
|
|
|
|
return data
|
|
|
|
/datum/beaker_panel/proc/spawn_container_from_data(mob/user, list/spawn_info)
|
|
var/container_type = text2path(spawn_info["container"])
|
|
var/list/container_reagents = list()
|
|
for(var/reagent_string, reagent_amount in spawn_info["reagents"])
|
|
container_reagents[text2path(reagent_string)] = text2num(reagent_amount)
|
|
|
|
return spawn_container(user, container_type, container_reagents)
|
|
|
|
/datum/beaker_panel/proc/spawn_container(mob/user, container_type, list/container_reagents)
|
|
var/obj/item/reagent_containers/container = new container_type(user.drop_location())
|
|
container.reagents.maximum_volume = INFINITY
|
|
container.reagents.clear_reagents()
|
|
container.reagents.add_reagent_list(container_reagents)
|
|
container.reagents.maximum_volume = max(container.reagents.total_volume, initial(container.volume))
|
|
return container
|
|
|
|
/datum/beaker_panel/proc/spawn_grenade_from_data(mob/user, list/all_spawn_info, list/grenade_info)
|
|
var/list/containers = list()
|
|
for(var/list/container_info as anything in all_spawn_info)
|
|
containers += spawn_container_from_data(user, container_info)
|
|
|
|
return spawn_grenade(user, containers, grenade_info)
|
|
|
|
/datum/beaker_panel/proc/spawn_grenade(mob/user, list/beakers, list/grenade_info)
|
|
var/obj/item/grenade/chem_grenade/grenade = new(user.drop_location())
|
|
grenade.beakers = beakers
|
|
grenade.stage_change(GRENADE_READY)
|
|
|
|
for(var/obj/beaker as anything in grenade.beakers)
|
|
beaker.forceMove(grenade)
|
|
|
|
switch(grenade_info["detonation_type"])
|
|
if("normal")
|
|
var/det_time = text2num(grenade_info["detonation_timer"]) * 1 SECONDS
|
|
if(det_time)
|
|
grenade.det_time = det_time
|
|
|
|
return grenade
|
|
|
|
ADMIN_VERB(beaker_panel, R_SPAWN, "Spawn Reagent Container", "Spawn a reagent container.", ADMIN_CATEGORY_EVENTS)
|
|
var/datum/beaker_panel/panel = new
|
|
panel.ui_interact(user.mob)
|