mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-15 18:14:22 +01:00
Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-sync
This commit is contained in:
@@ -23,15 +23,11 @@
|
||||
|
||||
dat += "<a href='byond://?src=[REF(src)];[HrefToken()];gamemode_panel=1'>Storyteller Panel</a><BR>" // BUBBER EDIT CHANGE - Storyteller - Dynamic Panel -> Storyteller Panel
|
||||
dat += "<hr/>"
|
||||
dat += {"
|
||||
<A href='byond://?src=[REF(src)];[HrefToken()];create_object=1'>Create Object</A><br>
|
||||
<A href='byond://?src=[REF(src)];[HrefToken()];quick_create_object=1'>Quick Create Object</A><br>
|
||||
<A href='byond://?src=[REF(src)];[HrefToken()];create_turf=1'>Create Turf</A><br>
|
||||
<A href='byond://?src=[REF(src)];[HrefToken()];create_mob=1'>Create Mob</A><br>
|
||||
"}
|
||||
|
||||
dat += "<a href='byond://?src=[REF(src)];[HrefToken()];spawn_panel=1'>Spawn Panel</a><br>"
|
||||
|
||||
if(marked_datum && istype(marked_datum, /atom))
|
||||
dat += "<A href='byond://?src=[REF(src)];[HrefToken()];dupe_marked_datum=1'>Duplicate Marked Datum</A><br>"
|
||||
dat += "<a href='byond://?src=[REF(src)];[HrefToken()];dupe_marked_datum=1'>Duplicate Marked Datum</a><br>"
|
||||
|
||||
var/datum/browser/browser = new(usr, "admin2", "Game Panel", 240, 280)
|
||||
browser.set_content(dat)
|
||||
|
||||
@@ -1,15 +1,3 @@
|
||||
|
||||
/datum/admins/proc/create_mob(mob/user)
|
||||
var/static/create_mob_html
|
||||
if (!create_mob_html)
|
||||
var/mobjs = null
|
||||
mobjs = jointext(typesof(/mob), ";")
|
||||
create_mob_html = file2text('html/create_object.html')
|
||||
create_mob_html = replacetext(create_mob_html, "Create Object", "Create Mob")
|
||||
create_mob_html = replacetext(create_mob_html, "null; /* object types */", "\"[mobjs]\";")
|
||||
|
||||
user << browse(create_panel_helper(create_mob_html), "window=create_mob;size=425x475")
|
||||
|
||||
/**
|
||||
* Fully randomizes everything about a human, including DNA and name.
|
||||
*/
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
/datum/admins/proc/create_panel_helper(template)
|
||||
var/final_html = replacetext(template, "/* ref src */", "[REF(src)];[HrefToken()]")
|
||||
final_html = replacetext(final_html,"/* hreftokenfield */","[HrefTokenFormField()]")
|
||||
return final_html
|
||||
|
||||
/datum/admins/proc/create_object(mob/user)
|
||||
var/static/create_object_html = null
|
||||
if (!create_object_html)
|
||||
var/objectjs = null
|
||||
objectjs = jointext(typesof(/obj), ";")
|
||||
create_object_html = file2text('html/create_object.html')
|
||||
create_object_html = replacetext(create_object_html, "null; /* object types */", "\"[objectjs]\";")
|
||||
|
||||
user << browse(create_panel_helper(create_object_html), "window=create_object;size=425x475")
|
||||
|
||||
/datum/admins/proc/quick_create_object(mob/user)
|
||||
var/static/list/create_object_forms = list(
|
||||
/obj, /obj/structure, /obj/machinery, /obj/effect,
|
||||
/obj/item, /obj/item/clothing, /obj/item/stack, /obj/item,
|
||||
/obj/item/reagent_containers, /obj/item/gun)
|
||||
|
||||
var/path = input("Select the path of the object you wish to create.", "Path", /obj) in sort_list(create_object_forms, GLOBAL_PROC_REF(cmp_typepaths_asc))
|
||||
var/html_form = create_object_forms[path]
|
||||
|
||||
if (!html_form)
|
||||
var/objectjs = jointext(typesof(path), ";")
|
||||
html_form = file2text('html/create_object.html')
|
||||
html_form = replacetext(html_form, "Create Object", "Create [path]")
|
||||
html_form = replacetext(html_form, "null; /* object types */", "\"[objectjs]\";")
|
||||
create_object_forms[path] = html_form
|
||||
|
||||
user << browse(create_panel_helper(html_form), "window=qco[path];size=425x475")
|
||||
@@ -1,10 +0,0 @@
|
||||
/datum/admins/proc/create_turf(mob/user)
|
||||
var/static/create_turf_html
|
||||
if (!create_turf_html)
|
||||
var/turfjs = null
|
||||
turfjs = jointext(typesof(/turf), ";")
|
||||
create_turf_html = file2text('html/create_object.html')
|
||||
create_turf_html = replacetext(create_turf_html, "Create Object", "Create Turf")
|
||||
create_turf_html = replacetext(create_turf_html, "null; /* object types */", "\"[turfjs]\";")
|
||||
|
||||
user << browse(create_panel_helper(create_turf_html), "window=create_turf;size=425x475")
|
||||
@@ -0,0 +1,9 @@
|
||||
// Open "View Variables" menu for target
|
||||
/mob/dead/observer/CtrlShiftClickOn(atom/target)
|
||||
if(check_rights(R_DEBUG))
|
||||
SSadmin_verbs.dynamic_invoke_verb(client, /datum/admin_verb/debug_variables, target)
|
||||
|
||||
// Open "Show Player Panel" menu for target mob
|
||||
/mob/dead/observer/CtrlClickOn(atom/target)
|
||||
if(check_rights(R_ADMIN) && ismob(target))
|
||||
SSadmin_verbs.dynamic_invoke_verb(client, /datum/admin_verb/show_player_panel, target)
|
||||
@@ -0,0 +1,51 @@
|
||||
/datum/asset/json/spawnpanel
|
||||
name = "spawnpanel_atom_data"
|
||||
|
||||
/datum/asset/json/spawnpanel/generate()
|
||||
var/list/data = list()
|
||||
|
||||
var/static/list/mapping_objects = typecacheof(list(
|
||||
/obj/effect/mapping_helpers,
|
||||
/obj/effect/landmark,
|
||||
/obj/effect/spawner,
|
||||
/obj/effect/mob_spawn,
|
||||
/obj/effect/holodeck_effect,
|
||||
/obj/docking_port,
|
||||
/obj/modular_map_connector,
|
||||
/obj/modular_map_root,
|
||||
/obj/pathfind_guy,
|
||||
))
|
||||
|
||||
data["atoms"] = list()
|
||||
|
||||
for(var/obj/each_object as anything in typesof(/obj))
|
||||
data["atoms"][each_object] = list(
|
||||
"icon" = each_object?.icon_preview || each_object?.icon || "none",
|
||||
"icon_state" = each_object?.icon_state_preview || each_object?.icon_state || "none",
|
||||
"name" = each_object.name,
|
||||
"description" = each_object.desc,
|
||||
"mapping" = is_type_in_typecache(each_object, mapping_objects),
|
||||
"type" = "Objects"
|
||||
)
|
||||
|
||||
for(var/turf/each_turf as anything in typesof(/turf))
|
||||
data["atoms"][each_turf] = list(
|
||||
"icon" = each_turf?.icon || "noneturf",
|
||||
"icon_state" = each_turf?.icon_state || "noneturf",
|
||||
"name" = each_turf.name,
|
||||
"description" = each_turf.desc,
|
||||
"mapping" = is_type_in_typecache(each_turf, mapping_objects),
|
||||
"type" = "Turfs"
|
||||
)
|
||||
|
||||
for(var/mob/each_mob as anything in typesof(/mob))
|
||||
data["atoms"][each_mob] = list(
|
||||
"icon" = each_mob?.icon || "nonemob",
|
||||
"icon_state" = each_mob?.icon_state || "nonemob",
|
||||
"name" = each_mob.name,
|
||||
"description" = each_mob.desc,
|
||||
"mapping" = is_type_in_typecache(each_mob, mapping_objects),
|
||||
"type" = "Mobs"
|
||||
)
|
||||
|
||||
return data
|
||||
@@ -0,0 +1,174 @@
|
||||
#define WHERE_FLOOR_BELOW_MOB "Current location"
|
||||
#define WHERE_SUPPLY_BELOW_MOB "Current location (droppod)"
|
||||
#define WHERE_MOB_HAND "In own mob's hand"
|
||||
#define WHERE_MARKED_OBJECT "At a marked object"
|
||||
#define WHERE_IN_MARKED_OBJECT "In the marked object"
|
||||
#define WHERE_TARGETED_LOCATION "Targeted location"
|
||||
#define WHERE_TARGETED_LOCATION_POD "Targeted location (droppod)"
|
||||
#define WHERE_TARGETED_MOB_HAND "In targeted mob's hand"
|
||||
|
||||
#define OFFSET_ABSOLUTE "Absolute offset"
|
||||
#define OFFSET_RELATIVE "Relative offset"
|
||||
|
||||
/*
|
||||
Handles spawning an atom. See the call examples for the proper spawn parameters fetching.
|
||||
*/
|
||||
/datum/spawnpanel/proc/spawn_atom(list/spawn_params, mob/user)
|
||||
if(!check_rights(R_SPAWN) || !spawn_params)
|
||||
return
|
||||
|
||||
var/atom/atom_to_spawn = spawn_params["selected_atom"]
|
||||
|
||||
if(!atom_to_spawn || (!ispath(atom_to_spawn, /obj) && !ispath(atom_to_spawn, /turf) && !ispath(atom_to_spawn, /mob)))
|
||||
return
|
||||
|
||||
var/amount = clamp(text2num(spawn_params["atom_amount"]), 1, ADMIN_SPAWN_CAP)
|
||||
|
||||
var/list/offset_data
|
||||
if(islist(spawn_params["offset"]))
|
||||
offset_data = spawn_params["offset"]
|
||||
else if(istext(spawn_params["offset"]))
|
||||
var/list/parsed = splittext(spawn_params["offset"], ",")
|
||||
if(length(parsed) >= 3)
|
||||
offset_data = list("X" = text2num(parsed[1]), "Y" = text2num(parsed[2]), "Z" = text2num(parsed[3]))
|
||||
else
|
||||
offset_data = list("X" = 0, "Y" = 0, "Z" = 0)
|
||||
else
|
||||
offset_data = list("X" = 0, "Y" = 0, "Z" = 0)
|
||||
|
||||
|
||||
var/X = offset_data["X"] || 0
|
||||
var/Y = offset_data["Y"] || 0
|
||||
var/Z = offset_data["Z"] || 0
|
||||
|
||||
var/atom_dir = text2num(spawn_params["atom_dir"]) || 1
|
||||
var/atom_name = sanitize(spawn_params["atom_name"])
|
||||
|
||||
var/where_target_type = spawn_params["where_target_type"]
|
||||
var/atom/target = null
|
||||
|
||||
if(where_target_type == WHERE_MOB_HAND || where_target_type == WHERE_TARGETED_MOB_HAND)
|
||||
target = (where_target_type == WHERE_TARGETED_MOB_HAND ? spawn_params["target"] : user)
|
||||
|
||||
if(!target)
|
||||
to_chat(user, span_warning("No target specified."))
|
||||
return
|
||||
|
||||
if(!ismob(target))
|
||||
to_chat(user, span_warning("The targeted atom is not a mob."))
|
||||
return
|
||||
|
||||
if(!iscarbon(target) && !iscyborg(target))
|
||||
to_chat(user, span_warning("Can only spawn in hand when the target is a carbon mob or a cyborg."))
|
||||
where_target_type = WHERE_FLOOR_BELOW_MOB
|
||||
|
||||
else if(where_target_type == WHERE_MARKED_OBJECT || where_target_type == WHERE_IN_MARKED_OBJECT)
|
||||
if(!user.client.holder.marked_datum)
|
||||
to_chat(user, span_warning("You don't have any object marked."))
|
||||
return
|
||||
else if(!istype(user.client.holder.marked_datum, /atom))
|
||||
to_chat(user, span_warning("The object you have marked cannot be used as a target. Target must be of type /atom."))
|
||||
return
|
||||
else
|
||||
target = (where_target_type == WHERE_MARKED_OBJECT ? get_turf(user.client.holder.marked_datum) : user.client.holder.marked_datum)
|
||||
|
||||
else if(where_target_type == WHERE_TARGETED_LOCATION || where_target_type == WHERE_TARGETED_LOCATION_POD)
|
||||
target = spawn_params["target"]
|
||||
else
|
||||
switch(spawn_params["offset_type"])
|
||||
if(OFFSET_ABSOLUTE)
|
||||
target = locate(X, Y, Z)
|
||||
|
||||
if(OFFSET_RELATIVE)
|
||||
var/turf/relative_turf
|
||||
var/atom/user_loc = user.loc
|
||||
|
||||
if (user_loc)
|
||||
relative_turf = get_turf(user_loc)
|
||||
|
||||
if (!relative_turf)
|
||||
if(isobserver(user))
|
||||
var/mob/dead/observer/user_observer = user
|
||||
relative_turf = get_turf(user_observer.client?.eye) || get_turf(user_observer)
|
||||
if (!relative_turf)
|
||||
relative_turf = locate(1, 1, 1)
|
||||
|
||||
if (!relative_turf)
|
||||
to_chat(user, span_warning("Could not determine a valid relative location."))
|
||||
return
|
||||
|
||||
target = locate(relative_turf.x + X, relative_turf.y + Y, relative_turf.z + Z)
|
||||
|
||||
if(!target)
|
||||
return
|
||||
|
||||
var/use_droppod = where_target_type == WHERE_SUPPLY_BELOW_MOB || where_target_type == WHERE_TARGETED_LOCATION_POD
|
||||
|
||||
var/obj/structure/closet/supplypod/centcompod/pod
|
||||
if(use_droppod)
|
||||
pod = new()
|
||||
|
||||
for(var/i in 1 to amount)
|
||||
if(istype(atom_to_spawn, /turf))
|
||||
var/turf/original_turf = target
|
||||
var/turf/created_turf = original_turf.ChangeTurf(atom_to_spawn.type)
|
||||
if(created_turf && atom_name)
|
||||
created_turf.name = atom_name
|
||||
continue
|
||||
|
||||
var/atom/created_atom = new atom_to_spawn(use_droppod ? pod : target)
|
||||
|
||||
if(QDELETED(created_atom))
|
||||
return
|
||||
|
||||
created_atom.flags_1 |= ADMIN_SPAWNED_1
|
||||
|
||||
if(spawn_params["apply_icon_override"])
|
||||
if(spawn_params["selected_atom_icon"])
|
||||
created_atom.icon = file(spawn_params["selected_atom_icon"])
|
||||
|
||||
if(spawn_params["selected_atom_icon_state"])
|
||||
created_atom.icon_state = spawn_params["selected_atom_icon_state"]
|
||||
|
||||
if(spawn_params["atom_icon_size"])
|
||||
if(ismob(created_atom))
|
||||
var/mob/living/created_mob = created_atom
|
||||
created_mob.current_size = spawn_params["atom_icon_size"] / 100
|
||||
|
||||
if(atom_dir)
|
||||
created_atom.setDir(atom_dir)
|
||||
|
||||
if(atom_name)
|
||||
created_atom.name = atom_name
|
||||
if(ismob(created_atom))
|
||||
var/mob/created_mob = created_atom
|
||||
created_mob.real_name = atom_name
|
||||
|
||||
if((where_target_type == WHERE_MOB_HAND || where_target_type == WHERE_TARGETED_MOB_HAND) && isliving(target) && isitem(created_atom))
|
||||
var/mob/living/living_target = target
|
||||
var/obj/item/created_item = created_atom
|
||||
living_target.put_in_hands(created_item)
|
||||
|
||||
if(iscyborg(living_target))
|
||||
var/mob/living/silicon/robot/target_robot = living_target
|
||||
if(target_robot.model)
|
||||
target_robot.model.add_module(created_item, TRUE, TRUE)
|
||||
target_robot.activate_module(created_item)
|
||||
|
||||
if(pod)
|
||||
new /obj/effect/pod_landingzone(target, pod)
|
||||
|
||||
log_admin("[key_name(user)] created [amount == 1 ? "an instance" : "[amount] instances"] of [atom_to_spawn.type]")
|
||||
if(istype(atom_to_spawn, /mob))
|
||||
message_admins("[key_name_admin(user)] created [amount == 1 ? "an instance" : "[amount] instances"] of [atom_to_spawn.type]")
|
||||
|
||||
#undef WHERE_FLOOR_BELOW_MOB
|
||||
#undef WHERE_SUPPLY_BELOW_MOB
|
||||
#undef WHERE_MOB_HAND
|
||||
#undef WHERE_MARKED_OBJECT
|
||||
#undef WHERE_IN_MARKED_OBJECT
|
||||
#undef WHERE_TARGETED_LOCATION
|
||||
#undef WHERE_TARGETED_LOCATION_POD
|
||||
#undef WHERE_TARGETED_MOB_HAND
|
||||
#undef OFFSET_ABSOLUTE
|
||||
#undef OFFSET_RELATIVE
|
||||
@@ -0,0 +1,336 @@
|
||||
#define WHERE_FLOOR_BELOW_MOB "Current location"
|
||||
#define WHERE_SUPPLY_BELOW_MOB "Current location (droppod)"
|
||||
#define WHERE_MOB_HAND "In own mob's hand"
|
||||
#define WHERE_MARKED_OBJECT "At a marked object"
|
||||
#define WHERE_IN_MARKED_OBJECT "In the marked object"
|
||||
#define WHERE_TARGETED_LOCATION "Targeted location"
|
||||
#define WHERE_TARGETED_LOCATION_POD "Targeted location (droppod)"
|
||||
#define WHERE_TARGETED_MOB_HAND "In targeted mob's hand"
|
||||
|
||||
#define PRECISE_MODE_OFF "Off"
|
||||
#define PRECISE_MODE_TARGET "Target"
|
||||
#define PRECISE_MODE_MARK "Mark"
|
||||
#define PRECISE_MODE_COPY "Copy"
|
||||
|
||||
#define OFFSET_ABSOLUTE "Absolute offset"
|
||||
#define OFFSET_RELATIVE "Relative offset"
|
||||
|
||||
GLOBAL_LIST_INIT(spawnpanels_by_ckey, list())
|
||||
|
||||
/*
|
||||
An instance of a /tg/UI™ Spawn Panel. Stores preferences, spawns things, controls the UI. Unique for each user (their ckey).
|
||||
*/
|
||||
/datum/spawnpanel
|
||||
/// Who this instance of spawn panel belongs to. The instances are unique to correctly keep modified values between multiple admins.
|
||||
var/owner_ckey
|
||||
/// Where and how the atom should be spawned.
|
||||
var/where_target_type = WHERE_FLOOR_BELOW_MOB
|
||||
/// The atom selected from the panel.
|
||||
var/atom/selected_atom = null
|
||||
/// The icon selected for the atom from the panel.
|
||||
var/selected_atom_icon = null
|
||||
/// The icon state selected for the atom from the panel.
|
||||
var/selected_atom_icon_state = null
|
||||
/// Should selected icon/icon state override the initial ones? Added as an edge case to not replace animated GAGS icons.
|
||||
var/apply_icon_override = FALSE
|
||||
/// A list of icon states to display in preview panels.
|
||||
var/list/available_icon_states = null
|
||||
/// Override for the icon size of the spawned mob.
|
||||
var/atom_icon_size = 100
|
||||
/// How many atoms will be spawned at once.
|
||||
var/atom_amount = 1
|
||||
/// Custom atom name (leave `null` for initial).
|
||||
var/atom_name = null
|
||||
/// Custom atom description (leave `null` for initial).
|
||||
var/atom_desc = null
|
||||
/// Custom atom dir (leave `null` for `2`).
|
||||
var/atom_dir = 1
|
||||
/// An associative list of x-y-z offsets.
|
||||
var/offset = list()
|
||||
/// The pivot point for offsetting — relative or absolute.
|
||||
var/offset_type = OFFSET_RELATIVE
|
||||
/// Precise mode toggle. Used for build-mode-like spawning experience and targeting datums.
|
||||
var/precise_mode = PRECISE_MODE_OFF
|
||||
|
||||
/datum/spawnpanel/New()
|
||||
. = ..()
|
||||
offset = list("X" = 0, "Y" = 0, "Z" = 0)
|
||||
|
||||
/datum/spawnpanel/ui_interact(mob/user, datum/tgui/ui)
|
||||
if(user.client.ckey != owner_ckey)
|
||||
return
|
||||
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "SpawnPanel")
|
||||
ui.open()
|
||||
|
||||
/// Returns a `spawnpanel` instance belonging to this `user`, or creates and registers a new one
|
||||
/proc/get_spawnpanel_for_admin(mob/user)
|
||||
if(!user?.client?.ckey)
|
||||
return null
|
||||
|
||||
var/ckey = user.client.ckey
|
||||
|
||||
if(GLOB.spawnpanels_by_ckey[ckey])
|
||||
return GLOB.spawnpanels_by_ckey[ckey]
|
||||
|
||||
var/datum/spawnpanel/new_panel = new()
|
||||
new_panel.owner_ckey = ckey
|
||||
GLOB.spawnpanels_by_ckey[ckey] = new_panel
|
||||
|
||||
return new_panel
|
||||
|
||||
/datum/spawnpanel/ui_close(mob/user)
|
||||
. = ..()
|
||||
if (precise_mode && precise_mode != PRECISE_MODE_OFF)
|
||||
toggle_precise_mode(PRECISE_MODE_OFF)
|
||||
|
||||
/datum/spawnpanel/ui_state(mob/user)
|
||||
if(user.client.ckey != owner_ckey)
|
||||
return GLOB.never_state
|
||||
return ADMIN_STATE(R_ADMIN)
|
||||
|
||||
/datum/spawnpanel/ui_act(action, params)
|
||||
if(..())
|
||||
return FALSE
|
||||
|
||||
if(usr.client.ckey != owner_ckey)
|
||||
return FALSE
|
||||
|
||||
switch(action)
|
||||
if("select-new-DMI")
|
||||
var/icon/new_icon = input("Select a new icon file:", "Icon") as null|icon
|
||||
if(new_icon)
|
||||
selected_atom_icon = new_icon
|
||||
available_icon_states = icon_states(selected_atom_icon)
|
||||
if(!(selected_atom_icon_state in available_icon_states))
|
||||
selected_atom_icon_state = available_icon_states[1]
|
||||
SStgui.update_uis(src)
|
||||
return TRUE
|
||||
|
||||
if("set-apply-icon-override")
|
||||
apply_icon_override = !!params["value"]
|
||||
SStgui.update_uis(src)
|
||||
return TRUE
|
||||
|
||||
if("reset-DMI-icon")
|
||||
selected_atom_icon = null
|
||||
selected_atom_icon_state = null
|
||||
if(selected_atom)
|
||||
selected_atom_icon = initial(selected_atom.icon)
|
||||
selected_atom_icon_state = initial(selected_atom.icon_state)
|
||||
available_icon_states = icon_states(selected_atom_icon)
|
||||
else
|
||||
available_icon_states = list()
|
||||
|
||||
SStgui.update_uis(src)
|
||||
return TRUE
|
||||
|
||||
if("select-new-icon-state")
|
||||
selected_atom_icon_state = params["new_state"]
|
||||
SStgui.update_uis(src)
|
||||
return TRUE
|
||||
|
||||
if("reset-icon-state")
|
||||
selected_atom_icon_state = null
|
||||
if(selected_atom)
|
||||
selected_atom_icon_state = initial(selected_atom.icon_state)
|
||||
SStgui.update_uis(src)
|
||||
return TRUE
|
||||
|
||||
if("set-icon-size")
|
||||
atom_icon_size = params["size"]
|
||||
SStgui.update_uis(src)
|
||||
return TRUE
|
||||
|
||||
if("reset-icon-size")
|
||||
atom_icon_size = 100
|
||||
SStgui.update_uis(src)
|
||||
return TRUE
|
||||
|
||||
if("get-icon-states")
|
||||
available_icon_states = icon_states(selected_atom_icon)
|
||||
SStgui.update_uis(src)
|
||||
return TRUE
|
||||
|
||||
if("selected-atom-changed")
|
||||
var/path = text2path(params["newObj"])
|
||||
if(path)
|
||||
var/atom/temp_atom = path
|
||||
selected_atom_icon = initial(temp_atom.icon)
|
||||
selected_atom_icon_state = initial(temp_atom.icon_state)
|
||||
available_icon_states = icon_states(selected_atom_icon)
|
||||
selected_atom = temp_atom
|
||||
return TRUE
|
||||
|
||||
if("create-atom-action")
|
||||
var/list/spawn_params = list(
|
||||
"selected_atom" = selected_atom,
|
||||
"offset" = params["offset"],
|
||||
"atom_dir" = text2num(params["dir"]) || 1,
|
||||
"atom_amount" = text2num(params["atom_amount"]) || 1,
|
||||
"atom_name" = params["atom_name"],
|
||||
"where_target_type" = params["where_target_type"] || WHERE_FLOOR_BELOW_MOB,
|
||||
"atom_icon_size" = params["atom_icon_size"],
|
||||
"offset_type" = params["offset_type"] || OFFSET_RELATIVE,
|
||||
"apply_icon_override" = apply_icon_override,
|
||||
)
|
||||
|
||||
if(apply_icon_override)
|
||||
spawn_params["selected_atom_icon"] = selected_atom_icon
|
||||
spawn_params["selected_atom_icon_state"] = selected_atom_icon_state
|
||||
|
||||
spawn_atom(spawn_params, usr)
|
||||
return TRUE
|
||||
|
||||
if("toggle-precise-mode")
|
||||
var/precise_type = params["newPreciseType"]
|
||||
if(precise_type == PRECISE_MODE_TARGET && params["where_target_type"])
|
||||
where_target_type = params["where_target_type"]
|
||||
toggle_precise_mode(precise_type)
|
||||
return TRUE
|
||||
|
||||
if("update-settings")
|
||||
if(params["atom_amount"])
|
||||
atom_amount = text2num(params["atom_amount"])
|
||||
if(params["atom_dir"])
|
||||
atom_dir = text2num(params["atom_dir"])
|
||||
if(params["offset"])
|
||||
var/list/temp_offset = params["offset"]
|
||||
offset["X"] = temp_offset[1]
|
||||
offset["Y"] = temp_offset[2]
|
||||
offset["Z"] = temp_offset[3]
|
||||
if(params["atom_name"])
|
||||
atom_name = params["atom_name"]
|
||||
if(params["where_target_type"])
|
||||
where_target_type = params["where_target_type"]
|
||||
if(params["offset_type"])
|
||||
offset_type = params["offset_type"]
|
||||
if(params["atom_icon_size"])
|
||||
atom_icon_size = text2num(params["atom_icon_size"])
|
||||
if(params["selected_atom_icon"])
|
||||
selected_atom_icon = params["selected_atom_icon"]
|
||||
if(params["selected_atom_icon_state"])
|
||||
selected_atom_icon_state = params["selected_atom_icon_state"]
|
||||
return TRUE
|
||||
|
||||
/datum/spawnpanel/proc/toggle_precise_mode(precise_type)
|
||||
precise_mode = precise_type
|
||||
var/client/admin_client = usr.client
|
||||
if (!admin_client)
|
||||
return
|
||||
|
||||
admin_client.mouse_up_icon = null
|
||||
admin_client.mouse_down_icon = null
|
||||
admin_client.mouse_override_icon = null
|
||||
admin_client.click_intercept = null
|
||||
|
||||
if (precise_mode != PRECISE_MODE_OFF)
|
||||
admin_client.mouse_up_icon = 'icons/effects/mouse_pointers/supplypod_pickturf.dmi'
|
||||
admin_client.mouse_down_icon = 'icons/effects/mouse_pointers/supplypod_pickturf_down.dmi'
|
||||
admin_client.mouse_override_icon = admin_client.mouse_up_icon
|
||||
admin_client.mouse_pointer_icon = admin_client.mouse_override_icon
|
||||
admin_client.click_intercept = src
|
||||
|
||||
winset(admin_client, "mapwindow.map", "right-click=true")
|
||||
else
|
||||
winset(admin_client, "mapwindow.map", "right-click=false")
|
||||
|
||||
var/mob/holder_mob = admin_client.mob
|
||||
holder_mob?.update_mouse_pointer()
|
||||
|
||||
/datum/spawnpanel/proc/InterceptClickOn(mob/user, params, atom/target)
|
||||
var/list/modifiers = params2list(params)
|
||||
var/left_click = LAZYACCESS(modifiers, LEFT_CLICK)
|
||||
var/right_click = LAZYACCESS(modifiers, RIGHT_CLICK)
|
||||
|
||||
if(right_click)
|
||||
toggle_precise_mode(PRECISE_MODE_OFF)
|
||||
SStgui.update_uis(src)
|
||||
return TRUE
|
||||
|
||||
if(left_click)
|
||||
if(istype(target,/atom/movable/screen))
|
||||
return FALSE
|
||||
|
||||
var/turf/clicked_turf = get_turf(target)
|
||||
if(!clicked_turf)
|
||||
return FALSE
|
||||
|
||||
switch(precise_mode)
|
||||
if(PRECISE_MODE_TARGET)
|
||||
var/list/spawn_params = list(
|
||||
"selected_atom" = selected_atom,
|
||||
"atom_amount" = atom_amount,
|
||||
"offset" = "0,0,0",
|
||||
"atom_dir" = atom_dir,
|
||||
"atom_name" = atom_name,
|
||||
"atom_desc" = atom_desc,
|
||||
"offset_type" = OFFSET_ABSOLUTE,
|
||||
"where_target_type" = where_target_type,
|
||||
"target" = target,
|
||||
"atom_icon_size" = atom_icon_size,
|
||||
"apply_icon_override" = apply_icon_override,
|
||||
)
|
||||
|
||||
if(apply_icon_override)
|
||||
spawn_params["selected_atom_icon"] = selected_atom_icon
|
||||
spawn_params["selected_atom_icon_state"] = selected_atom_icon_state
|
||||
|
||||
if(where_target_type == WHERE_TARGETED_LOCATION || where_target_type == WHERE_TARGETED_LOCATION_POD)
|
||||
spawn_params["X"] = clicked_turf.x
|
||||
spawn_params["Y"] = clicked_turf.y
|
||||
spawn_params["Z"] = clicked_turf.z
|
||||
|
||||
spawn_atom(spawn_params, user)
|
||||
|
||||
if(PRECISE_MODE_MARK)
|
||||
var/client/admin_client = user.client
|
||||
admin_client.mark_datum(target)
|
||||
to_chat(user, span_notice("Marked object: [icon2html(target, user)] [span_bold("[target]")]"))
|
||||
toggle_precise_mode(PRECISE_MODE_OFF)
|
||||
SStgui.update_uis(src)
|
||||
|
||||
if(PRECISE_MODE_COPY)
|
||||
to_chat(user, span_notice("Picked object: [icon2html(target, user)] [span_bold("[target]")]"))
|
||||
selected_atom = target
|
||||
toggle_precise_mode(PRECISE_MODE_OFF)
|
||||
SStgui.update_uis(src)
|
||||
|
||||
return TRUE
|
||||
|
||||
/datum/spawnpanel/ui_data(mob/user)
|
||||
var/data = list()
|
||||
data["icon"] = selected_atom_icon
|
||||
data["iconState"] = selected_atom_icon_state
|
||||
data["iconSize"] = atom_icon_size
|
||||
data["apply_icon_override"] = apply_icon_override
|
||||
var/list/states = list()
|
||||
if(available_icon_states)
|
||||
for(var/state in available_icon_states)
|
||||
states += state
|
||||
data["iconStates"] = states
|
||||
data["precise_mode"] = precise_mode
|
||||
data["selected_object"] = selected_atom ? "[selected_atom.type]" : ""
|
||||
return data
|
||||
|
||||
/datum/spawnpanel/ui_assets(mob/user)
|
||||
return list(
|
||||
get_asset_datum(/datum/asset/json/spawnpanel),
|
||||
)
|
||||
|
||||
#undef WHERE_FLOOR_BELOW_MOB
|
||||
#undef WHERE_SUPPLY_BELOW_MOB
|
||||
#undef WHERE_MOB_HAND
|
||||
#undef WHERE_MARKED_OBJECT
|
||||
#undef WHERE_IN_MARKED_OBJECT
|
||||
#undef WHERE_TARGETED_LOCATION
|
||||
#undef WHERE_TARGETED_LOCATION_POD
|
||||
#undef WHERE_TARGETED_MOB_HAND
|
||||
#undef PRECISE_MODE_OFF
|
||||
#undef PRECISE_MODE_TARGET
|
||||
#undef PRECISE_MODE_MARK
|
||||
#undef PRECISE_MODE_COPY
|
||||
#undef OFFSET_ABSOLUTE
|
||||
#undef OFFSET_RELATIVE
|
||||
+2
-145
@@ -1008,157 +1008,14 @@
|
||||
GLOB.player_ticket_history.ui_interact(usr)
|
||||
return
|
||||
|
||||
else if(href_list["create_object"])
|
||||
if(!check_rights(R_SPAWN))
|
||||
return
|
||||
return create_object(usr)
|
||||
|
||||
else if(href_list["quick_create_object"])
|
||||
if(!check_rights(R_SPAWN))
|
||||
return
|
||||
return quick_create_object(usr)
|
||||
|
||||
else if(href_list["create_turf"])
|
||||
if(!check_rights(R_SPAWN))
|
||||
return
|
||||
return create_turf(usr)
|
||||
|
||||
else if(href_list["create_mob"])
|
||||
if(!check_rights(R_SPAWN))
|
||||
return
|
||||
return create_mob(usr)
|
||||
else if(href_list["spawn_panel"])
|
||||
SSadmin_verbs.dynamic_invoke_verb(usr, /datum/admin_verb/spawn_panel)
|
||||
|
||||
else if(href_list["dupe_marked_datum"])
|
||||
if(!check_rights(R_SPAWN))
|
||||
return
|
||||
return duplicate_object(marked_datum, spawning_location = get_turf(usr))
|
||||
|
||||
else if(href_list["object_list"]) //this is the laggiest thing ever
|
||||
if(!check_rights(R_SPAWN))
|
||||
return
|
||||
|
||||
var/atom/loc = usr.loc
|
||||
|
||||
var/dirty_paths
|
||||
if (istext(href_list["object_list"]))
|
||||
dirty_paths = list(href_list["object_list"])
|
||||
else if (istype(href_list["object_list"], /list))
|
||||
dirty_paths = href_list["object_list"]
|
||||
|
||||
var/paths = list()
|
||||
|
||||
for(var/dirty_path in dirty_paths)
|
||||
var/path = text2path(dirty_path)
|
||||
if(!path)
|
||||
continue
|
||||
else if(!ispath(path, /obj) && !ispath(path, /turf) && !ispath(path, /mob))
|
||||
continue
|
||||
paths += path
|
||||
|
||||
if(!paths)
|
||||
tgui_alert(usr,"The path list you sent is empty.")
|
||||
return
|
||||
|
||||
var/number = clamp(text2num(href_list["object_count"]), 1, ADMIN_SPAWN_CAP)
|
||||
if(length(paths) * number > ADMIN_SPAWN_CAP)
|
||||
tgui_alert(usr,"Select fewer object types!")
|
||||
return
|
||||
|
||||
var/list/offset = splittext(href_list["offset"],",")
|
||||
var/X = offset.len > 0 ? text2num(offset[1]) : 0
|
||||
var/Y = offset.len > 1 ? text2num(offset[2]) : 0
|
||||
var/Z = offset.len > 2 ? text2num(offset[3]) : 0
|
||||
var/obj_dir = text2num(href_list["object_dir"])
|
||||
if(obj_dir && !(obj_dir in list(1,2,4,8,5,6,9,10)))
|
||||
obj_dir = null
|
||||
var/obj_name = sanitize(href_list["object_name"])
|
||||
|
||||
|
||||
var/atom/target //Where the object will be spawned
|
||||
var/where = href_list["object_where"]
|
||||
if (!( where in list("onfloor","frompod","inhand","inmarked") ))
|
||||
where = "onfloor"
|
||||
|
||||
|
||||
switch(where)
|
||||
if("inhand")
|
||||
if (!iscarbon(usr) && !iscyborg(usr))
|
||||
to_chat(usr, "Can only spawn in hand when you're a carbon mob or cyborg.", confidential = TRUE)
|
||||
where = "onfloor"
|
||||
target = usr
|
||||
|
||||
if("onfloor", "frompod")
|
||||
switch(href_list["offset_type"])
|
||||
if ("absolute")
|
||||
target = locate(0 + X,0 + Y,0 + Z)
|
||||
if ("relative")
|
||||
target = locate(loc.x + X,loc.y + Y,loc.z + Z)
|
||||
if("inmarked")
|
||||
if(!marked_datum)
|
||||
to_chat(usr, "You don't have any object marked. Abandoning spawn.", confidential = TRUE)
|
||||
return
|
||||
else if(!istype(marked_datum, /atom))
|
||||
to_chat(usr, "The object you have marked cannot be used as a target. Target must be of type /atom. Abandoning spawn.", confidential = TRUE)
|
||||
return
|
||||
else
|
||||
target = marked_datum
|
||||
|
||||
var/obj/structure/closet/supplypod/centcompod/pod
|
||||
|
||||
if(target)
|
||||
if(where == "frompod")
|
||||
pod = new()
|
||||
|
||||
for (var/path in paths)
|
||||
for (var/i = 0; i < number; i++)
|
||||
if(path in typesof(/turf))
|
||||
var/turf/O = target
|
||||
var/turf/N = O.ChangeTurf(path)
|
||||
if(N && obj_name)
|
||||
N.name = obj_name
|
||||
else
|
||||
var/atom/O
|
||||
if(where == "frompod")
|
||||
O = new path(pod)
|
||||
else
|
||||
O = new path(target)
|
||||
|
||||
if(!QDELETED(O))
|
||||
O.flags_1 |= ADMIN_SPAWNED_1
|
||||
if(obj_dir)
|
||||
O.setDir(obj_dir)
|
||||
if(obj_name)
|
||||
O.name = obj_name
|
||||
if(ismob(O))
|
||||
var/mob/M = O
|
||||
M.real_name = obj_name
|
||||
if(where == "inhand" && isliving(usr) && isitem(O))
|
||||
var/mob/living/L = usr
|
||||
var/obj/item/I = O
|
||||
L.put_in_hands(I)
|
||||
if(iscyborg(L))
|
||||
var/mob/living/silicon/robot/R = L
|
||||
if(R.model)
|
||||
R.model.add_module(I, TRUE, TRUE)
|
||||
R.activate_module(I)
|
||||
|
||||
if(pod)
|
||||
new /obj/effect/pod_landingzone(target, pod)
|
||||
|
||||
if (number == 1)
|
||||
log_admin("[key_name(usr)] created an instance of [english_list(paths)]")
|
||||
for(var/path in paths)
|
||||
if(ispath(path, /mob))
|
||||
message_admins("[key_name_admin(usr)] created an instance of [english_list(paths)]")
|
||||
break
|
||||
else
|
||||
log_admin("[key_name(usr)] created [number] instances of [english_list(paths)]")
|
||||
for(var/path in paths)
|
||||
if(ispath(path, /mob))
|
||||
message_admins("[key_name_admin(usr)] created [number] instances of [english_list(paths)]")
|
||||
break
|
||||
return
|
||||
|
||||
else if(href_list["check_antagonist"])
|
||||
SSadmin_verbs.dynamic_invoke_verb(usr, /datum/admin_verb/check_antagonists)
|
||||
|
||||
|
||||
@@ -444,3 +444,10 @@ ADMIN_VERB(lag_switch_panel, R_ADMIN, "Show Lag Switches", "Display the controls
|
||||
dat += "Disable character creator: <a href='byond://?_src_=holder;[HrefToken()];change_lag_switch=[DISABLE_CREATOR]'><b>[SSlag_switch.measures[DISABLE_CREATOR] ? "On" : "Off"]</b></a> - <span style='font-size:80%'>trait applies to all</span><br />" // SKYRAT EDIT ADDITION
|
||||
dat += "</body></html>"
|
||||
user << browse(dat.Join(), "window=lag_switch_panel;size=420x480")
|
||||
|
||||
ADMIN_VERB(spawn_panel, R_SPAWN, "Spawn Panel", "Spawn Panel (TGUI).", ADMIN_CATEGORY_GAME)
|
||||
var/datum/spawnpanel/panel = get_spawnpanel_for_admin(user.mob)
|
||||
if(panel)
|
||||
panel.ui_interact(user.mob)
|
||||
BLACKBOX_LOG_ADMIN_VERB("Spawn Panel")
|
||||
|
||||
|
||||
@@ -115,7 +115,7 @@ GLOBAL_PROTECT(lua_state_stack)
|
||||
if(timer_enabled)
|
||||
var/result = call_function("__Timer_timer_process", seconds_per_tick)
|
||||
log_result(result, verbose = FALSE)
|
||||
for(var/function as anything in functions_to_execute)
|
||||
for(var/function in functions_to_execute)
|
||||
result = call_function(list("__Timer_callbacks", function))
|
||||
log_result(result, verbose = FALSE)
|
||||
functions_to_execute.Cut()
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
var/list/plane_info = list()
|
||||
|
||||
var/list/our_planes = our_hud?.get_planes_from(current_group)
|
||||
for (var/plane_string as anything in our_planes)
|
||||
for (var/plane_string in our_planes)
|
||||
var/list/this_plane = list()
|
||||
var/atom/movable/screen/plane_master/plane = our_planes[plane_string]
|
||||
this_plane["name"] = plane.name
|
||||
|
||||
@@ -88,7 +88,7 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(select_equipment, R_FUN, "Select Equipment", mob/ta
|
||||
|
||||
/datum/select_equipment/proc/make_outfit_entries(category="General", list/outfit_list)
|
||||
var/list/entries = list()
|
||||
for(var/path as anything in outfit_list)
|
||||
for(var/path in outfit_list)
|
||||
var/datum/outfit/outfit = path
|
||||
entries += list(outfit_entry(category, path, initial(outfit.name)))
|
||||
return entries
|
||||
|
||||
@@ -74,8 +74,7 @@
|
||||
if("modify_icon_value")
|
||||
var/icon/new_icon = input("Pick icon:", "Icon") as null|icon
|
||||
if(new_icon)
|
||||
target.filter_data[params["name"]]["icon"] = new_icon
|
||||
target.update_filters()
|
||||
target.modify_filter(params["name"], list("icon" = new_icon))
|
||||
. = TRUE
|
||||
if("mass_apply")
|
||||
if(!check_rights_for(usr.client, R_FUN))
|
||||
|
||||
Reference in New Issue
Block a user