mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-21 04:57:57 +01:00
Add #cargobus and gauntlets (also modernizes ntchat) (#58609)
* cargobus, start of gloves * basics of the HAUL gauntlets * fully mapped in * almost forgot the gauntlets * ntnet improvements * cargo gaunts, tablet cargobus * excludes body bags * dmis and map back * readd icons
This commit is contained in:
@@ -5,7 +5,14 @@
|
||||
var/title = "Untitled Conversation"
|
||||
var/datum/computer_file/program/chatclient/operator // "Administrator" of this channel. Creator starts as channel's operator,
|
||||
var/list/messages = list()
|
||||
var/list/clients = list()
|
||||
///chat clients who are active or minimized
|
||||
var/list/active_clients = list()
|
||||
///chat clients who have exited out of the program.
|
||||
var/list/offline_clients = list()
|
||||
///clients muted by operator
|
||||
var/list/muted_clients = list()
|
||||
//if a channel is strong, it cannot be renamed or deleted.
|
||||
var/strong = FALSE
|
||||
var/password
|
||||
var/static/ntnrc_uid = 0
|
||||
|
||||
@@ -25,12 +32,12 @@
|
||||
return ..()
|
||||
|
||||
/datum/ntnet_conversation/proc/add_message(message, username)
|
||||
message = "[station_time_timestamp()] [username]: [message]"
|
||||
message = "[station_time_timestamp(format = "hh:mm")] [username]: [message]"
|
||||
messages.Add(message)
|
||||
trim_message_list()
|
||||
|
||||
/datum/ntnet_conversation/proc/add_status_message(message)
|
||||
messages.Add("[station_time_timestamp()] -!- [message]")
|
||||
messages.Add("[station_time_timestamp(format = "hh:mm")] -!- [message]")
|
||||
trim_message_list()
|
||||
|
||||
/datum/ntnet_conversation/proc/trim_message_list()
|
||||
@@ -38,39 +45,61 @@
|
||||
return
|
||||
messages = messages.Copy(messages.len-50 ,0)
|
||||
|
||||
/datum/ntnet_conversation/proc/add_client(datum/computer_file/program/chatclient/C)
|
||||
if(!istype(C))
|
||||
/datum/ntnet_conversation/proc/add_client(datum/computer_file/program/chatclient/new_user, silent = FALSE)
|
||||
if(!istype(new_user))
|
||||
return
|
||||
clients.Add(C)
|
||||
add_status_message("[C.username] has joined the channel.")
|
||||
active_clients.Add(new_user)
|
||||
if(!silent)
|
||||
add_status_message("[new_user.username] has joined the channel.")
|
||||
// No operator, so we assume the channel was empty. Assign this user as operator.
|
||||
if(!operator)
|
||||
changeop(C)
|
||||
changeop(new_user)
|
||||
|
||||
/datum/ntnet_conversation/proc/remove_client(datum/computer_file/program/chatclient/C)
|
||||
if(!istype(C) || !(C in clients))
|
||||
/datum/ntnet_conversation/proc/remove_client(datum/computer_file/program/chatclient/leaving)
|
||||
if(!istype(leaving) || !(leaving in active_clients))
|
||||
return
|
||||
clients.Remove(C)
|
||||
add_status_message("[C.username] has left the channel.")
|
||||
active_clients.Remove(leaving)
|
||||
add_status_message("[leaving.username] has left the channel.")
|
||||
|
||||
// Channel operator left, pick new operator
|
||||
if(C == operator)
|
||||
if(leaving == operator)
|
||||
operator = null
|
||||
if(clients.len)
|
||||
var/datum/computer_file/program/chatclient/newop = pick(clients)
|
||||
if(active_clients.len)
|
||||
var/datum/computer_file/program/chatclient/newop = pick(active_clients)
|
||||
changeop(newop)
|
||||
|
||||
/datum/ntnet_conversation/proc/go_offline(datum/computer_file/program/chatclient/offline)
|
||||
if(!istype(offline) || !(offline in active_clients))
|
||||
return
|
||||
active_clients.Remove(offline)
|
||||
offline_clients.Add(offline)
|
||||
|
||||
/datum/ntnet_conversation/proc/mute_user(datum/computer_file/program/chatclient/op, datum/computer_file/program/chatclient/muted)
|
||||
if(operator != op) //sanity even if the person shouldn't be able to see the mute button
|
||||
return
|
||||
if(muted in muted_clients)
|
||||
muted_clients.Remove(muted)
|
||||
muted.computer.alert_call(muted, "You have been unmuted from [title]!", 'sound/machines/ping.ogg')
|
||||
else
|
||||
muted_clients.Add(muted)
|
||||
muted.computer.alert_call(muted, "You have been muted from [title]!")
|
||||
|
||||
/datum/ntnet_conversation/proc/ping_user(datum/computer_file/program/chatclient/pinger, datum/computer_file/program/chatclient/pinged)
|
||||
if(pinger in muted_clients) //oh my god fuck off
|
||||
return
|
||||
add_status_message("[pinger.username] pinged [pinged.username].")
|
||||
pinged.computer.alert_call(pinged, "You have been pinged in [title] by [pinger.username]!", 'sound/machines/ping.ogg')
|
||||
|
||||
/datum/ntnet_conversation/proc/changeop(datum/computer_file/program/chatclient/newop)
|
||||
if(istype(newop))
|
||||
operator = newop
|
||||
add_status_message("Channel operator status transferred to [newop.username].")
|
||||
|
||||
/datum/ntnet_conversation/proc/change_title(newtitle, datum/computer_file/program/chatclient/client)
|
||||
if(operator != client)
|
||||
return FALSE // Not Authorised
|
||||
/datum/ntnet_conversation/proc/change_title(newtitle, datum/computer_file/program/chatclient/renamer)
|
||||
if(operator != renamer || strong)
|
||||
return FALSE // Not Authorised or channel cannot be editted
|
||||
|
||||
add_status_message("[client.username] has changed channel title from [title] to [newtitle]")
|
||||
add_status_message("[renamer.username] has changed channel title from [title] to [newtitle]")
|
||||
title = newtitle
|
||||
|
||||
#undef MAX_CHANNELS
|
||||
|
||||
@@ -30,6 +30,16 @@
|
||||
install_component(new /obj/item/computer_hardware/network_card)
|
||||
install_component(new /obj/item/computer_hardware/printer/mini)
|
||||
hard_drive.store_file(new /datum/computer_file/program/shipping)
|
||||
var/datum/computer_file/program/chatclient/chatprogram
|
||||
chatprogram = new
|
||||
hard_drive.store_file(chatprogram)
|
||||
chatprogram.username = get_cargochat_username()
|
||||
|
||||
/obj/item/modular_computer/tablet/preset/cargo/proc/get_cargochat_username()
|
||||
return "cargonian_[rand(1,999)]"
|
||||
|
||||
/obj/item/modular_computer/tablet/preset/cargo/quartermaster/get_cargochat_username()
|
||||
return "quartermaster"
|
||||
|
||||
/obj/item/modular_computer/tablet/preset/advanced/atmos/Initialize() //This will be defunct and will be replaced when NtOS PDAs are done
|
||||
. = ..()
|
||||
|
||||
@@ -106,3 +106,68 @@
|
||||
var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
|
||||
hard_drive.store_file(new/datum/computer_file/program/chatclient())
|
||||
hard_drive.store_file(new/datum/computer_file/program/arcade())
|
||||
|
||||
// ===== CARGO CHAT CONSOLES =====
|
||||
/obj/machinery/modular_computer/console/preset/cargochat
|
||||
name = "cargo chatroom console"
|
||||
desc = "A stationary computer. This one comes preloaded with a chatroom for your cargo requests."
|
||||
///chat client installed on this computer, just helpful for linking all the computers
|
||||
var/datum/computer_file/program/chatclient/chatprogram
|
||||
|
||||
/obj/machinery/modular_computer/console/preset/cargochat/install_programs()
|
||||
var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
|
||||
chatprogram = new
|
||||
chatprogram.computer = cpu
|
||||
hard_drive.store_file(chatprogram)
|
||||
chatprogram.username = "[lowertext(console_department)]_department"
|
||||
chatprogram.program_state = PROGRAM_STATE_ACTIVE
|
||||
cpu.active_program = chatprogram
|
||||
|
||||
//ONE PER MAP PLEASE, IT MAKES A CARGOBUS FOR EACH ONE OF THESE
|
||||
/obj/machinery/modular_computer/console/preset/cargochat/cargo
|
||||
console_department = "Cargo"
|
||||
name = "department chatroom console"
|
||||
desc = "A stationary computer. This one comes preloaded with a chatroom for incoming cargo requests. You may moderate it from this computer."
|
||||
|
||||
/obj/machinery/modular_computer/console/preset/cargochat/cargo/install_programs()
|
||||
var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
|
||||
|
||||
//adding chat, setting it as the active window immediately
|
||||
chatprogram = new
|
||||
chatprogram.computer = cpu
|
||||
hard_drive.store_file(chatprogram)
|
||||
chatprogram.program_state = PROGRAM_STATE_ACTIVE
|
||||
cpu.active_program = chatprogram
|
||||
|
||||
//setting up chat
|
||||
chatprogram.username = "cargo_requests_operator"
|
||||
var/datum/ntnet_conversation/cargochat = new
|
||||
cargochat.operator = chatprogram //adding operator before joining the chat prevents an unnecessary message about switching op from showing
|
||||
cargochat.add_client(chatprogram)
|
||||
cargochat.title = "#cargobus"
|
||||
cargochat.strong = TRUE
|
||||
chatprogram.active_channel = cargochat.id
|
||||
|
||||
/obj/machinery/modular_computer/console/preset/cargochat/cargo/LateInitialize()
|
||||
. = ..()
|
||||
var/datum/ntnet_conversation/cargochat = SSnetworks.station_network.get_chat_channel_by_id(chatprogram.active_channel)
|
||||
for(var/obj/machinery/modular_computer/console/preset/cargochat/cargochat_console in GLOB.machines)
|
||||
if(cargochat_console == src)
|
||||
continue
|
||||
cargochat_console.chatprogram.active_channel = chatprogram.active_channel
|
||||
cargochat.add_client(cargochat_console.chatprogram, silent = TRUE)
|
||||
|
||||
/obj/machinery/modular_computer/console/preset/cargochat/service
|
||||
console_department = "Service"
|
||||
|
||||
/obj/machinery/modular_computer/console/preset/cargochat/engineering
|
||||
console_department = "Engineering"
|
||||
|
||||
/obj/machinery/modular_computer/console/preset/cargochat/science
|
||||
console_department = "Science"
|
||||
|
||||
/obj/machinery/modular_computer/console/preset/cargochat/security
|
||||
console_department = "Security"
|
||||
|
||||
/obj/machinery/modular_computer/console/preset/cargochat/medical
|
||||
console_department = "Medical"
|
||||
|
||||
@@ -4,28 +4,41 @@
|
||||
name = "modular computer"
|
||||
desc = "An advanced computer."
|
||||
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 5
|
||||
var/hardware_flag = 0 // A flag that describes this device type
|
||||
var/last_power_usage = 0 // Power usage during last tick
|
||||
|
||||
// Modular computers can run on various devices. Each DEVICE (Laptop, Console, Tablet,..)
|
||||
// must have it's own DMI file. Icon states must be called exactly the same in all files, but may look differently
|
||||
// If you create a program which is limited to Laptops and Consoles you don't have to add it's icon_state overlay for Tablets too, for example.
|
||||
|
||||
icon = null
|
||||
icon_state = null
|
||||
var/icon_state_unpowered = null // Icon state when the computer is turned off.
|
||||
var/icon_state_powered = null // Icon state when the computer is turned on.
|
||||
var/screen_icon_state_menu = "menu" // Icon state overlay when the computer is turned on, but no program is loaded that would override the screen.
|
||||
var/screen_icon_screensaver = "standby" // Icon state overlay when the computer is powered, but not 'switched on'.
|
||||
var/max_hardware_size = 0 // Maximal hardware size. Currently, tablets have 1, laptops 2 and consoles 3. Limits what hardware types can be installed.
|
||||
var/steel_sheet_cost = 10 // Amount of steel sheets refunded when disassembling an empty frame of this computer.
|
||||
var/light_strength = 0 // Light luminosity when turned on
|
||||
var/base_active_power_usage = 100 // Power usage when the computer is open (screen is active) and can be interacted with. Remember hardware can use power too.
|
||||
var/base_idle_power_usage = 10 // Power usage when the computer is idle and screen is off (currently only applies to laptops)
|
||||
|
||||
var/obj/item/modular_computer/processor/cpu = null // CPU that handles most logic while this type only handles power and other specific things.
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 5
|
||||
///A flag that describes this device type
|
||||
var/hardware_flag = 0
|
||||
///Power usage during last tick
|
||||
var/last_power_usage = 0
|
||||
|
||||
|
||||
///Icon state when the computer is turned off.
|
||||
var/icon_state_unpowered = null
|
||||
///Icon state when the computer is turned on.
|
||||
var/icon_state_powered = null
|
||||
///Icon state overlay when the computer is turned on, but no program is loaded that would override the screen.
|
||||
var/screen_icon_state_menu = "menu"
|
||||
///Icon state overlay when the computer is powered, but not 'switched on'.
|
||||
var/screen_icon_screensaver = "standby"
|
||||
///Maximal hardware size. Currently, tablets have 1, laptops 2 and consoles 3. Limits what hardware types can be installed.
|
||||
var/max_hardware_size = 0
|
||||
///Amount of steel sheets refunded when disassembling an empty frame of this computer.
|
||||
var/steel_sheet_cost = 10
|
||||
///Light luminosity when turned on
|
||||
var/light_strength = 0
|
||||
///Power usage when the computer is open (screen is active) and can be interacted with. Remember hardware can use power too.
|
||||
var/base_active_power_usage = 100
|
||||
///Power usage when the computer is idle and screen is off (currently only applies to laptops)
|
||||
var/base_idle_power_usage = 10
|
||||
|
||||
///CPU that handles most logic while this type only handles power and other specific things.
|
||||
var/obj/item/modular_computer/processor/cpu = null
|
||||
|
||||
/obj/machinery/modular_computer/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
light_strength = 2
|
||||
max_integrity = 300
|
||||
integrity_failure = 0.5
|
||||
var/console_department = "" // Used in New() to set network tag according to our area.
|
||||
///Used in New() to set network tag according to our area.
|
||||
var/console_department = ""
|
||||
|
||||
/obj/machinery/modular_computer/console/buildable/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -27,10 +27,10 @@
|
||||
var/ntnet_status = 1
|
||||
/// Bitflags (PROGRAM_CONSOLE, PROGRAM_LAPTOP, PROGRAM_TABLET combination) or PROGRAM_ALL
|
||||
var/usage_flags = PROGRAM_ALL
|
||||
/// Whether the program can be downloaded from NTNet. Set to 0 to disable.
|
||||
var/available_on_ntnet = 1
|
||||
/// Whether the program can be downloaded from SyndiNet (accessible via emagging the computer). Set to 1 to enable.
|
||||
var/available_on_syndinet = 0
|
||||
/// Whether the program can be downloaded from NTNet. Set to FALSE to disable.
|
||||
var/available_on_ntnet = TRUE
|
||||
/// Whether the program can be downloaded from SyndiNet (accessible via emagging the computer). Set to TRUE to enable.
|
||||
var/available_on_syndinet = FALSE
|
||||
/// Name of the tgui interface
|
||||
var/tgui_id
|
||||
/// Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images are taken from /icons/program_icons. Be careful not to use too large images!
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
/datum/computer_file/program/chatclient
|
||||
filename = "ntnrc_client"
|
||||
filedesc = "Chat Client"
|
||||
@@ -5,12 +6,13 @@
|
||||
program_icon_state = "command"
|
||||
extended_desc = "This program allows communication over NTNRC network"
|
||||
size = 8
|
||||
requires_ntnet = 1
|
||||
requires_ntnet = TRUE
|
||||
requires_ntnet_feature = NTNET_COMMUNICATION
|
||||
ui_header = "ntnrc_idle.gif"
|
||||
available_on_ntnet = 1
|
||||
available_on_ntnet = TRUE
|
||||
tgui_id = "NtosNetChat"
|
||||
program_icon = "comment-alt"
|
||||
alert_able = TRUE
|
||||
var/last_message // Used to generate the toolbar icon
|
||||
var/username
|
||||
var/active_channel
|
||||
@@ -37,7 +39,7 @@
|
||||
var/message = reject_bad_text(params["message"])
|
||||
if(!message)
|
||||
return
|
||||
if(channel.password && !(src in channel.clients))
|
||||
if(channel.password && (!(src in channel.active_clients) && !(src in channel.offline_clients)))
|
||||
if(channel.password == message)
|
||||
channel.add_client(src)
|
||||
return TRUE
|
||||
@@ -57,7 +59,7 @@
|
||||
|
||||
active_channel = new_target
|
||||
channel = SSnetworks.station_network.get_chat_channel_by_id(new_target)
|
||||
if(!(src in channel.clients) && !channel.password)
|
||||
if((!(src in channel.active_clients) && !(src in channel.offline_clients)) && !channel.password)
|
||||
channel.add_client(src)
|
||||
return TRUE
|
||||
if("PRG_leavechannel")
|
||||
@@ -90,12 +92,12 @@
|
||||
return TRUE
|
||||
if("PRG_changename")
|
||||
var/newname = sanitize(params["new_name"])
|
||||
if(!newname)
|
||||
newname = replacetext(newname, " ", "_")
|
||||
if(!newname || newname == username)
|
||||
return
|
||||
for(var/C in SSnetworks.station_network.chat_channels)
|
||||
var/datum/ntnet_conversation/chan = C
|
||||
if(src in chan.clients)
|
||||
chan.add_status_message("[username] is now known as [newname].")
|
||||
for(var/datum/ntnet_conversation/anychannel as anything in SSnetworks.station_network.chat_channels)
|
||||
if(src in anychannel.active_clients)
|
||||
anychannel.add_status_message("[username] is now known as [newname].")
|
||||
username = newname
|
||||
return TRUE
|
||||
if("PRG_savelog")
|
||||
@@ -146,6 +148,18 @@
|
||||
|
||||
channel.password = new_password
|
||||
return TRUE
|
||||
if("PRG_mute_user")
|
||||
if(!authed)
|
||||
return
|
||||
var/datum/computer_file/program/chatclient/muted = locate(params["ref"]) in channel.active_clients + channel.offline_clients
|
||||
channel.mute_user(src, muted)
|
||||
return TRUE
|
||||
if("PRG_ping_user")
|
||||
if(!authed)
|
||||
return
|
||||
var/datum/computer_file/program/chatclient/pinged = locate(params["ref"]) in channel.active_clients + channel.offline_clients
|
||||
channel.ping_user(src, pinged)
|
||||
return TRUE
|
||||
|
||||
/datum/computer_file/program/chatclient/process_tick()
|
||||
. = ..()
|
||||
@@ -163,10 +177,19 @@
|
||||
else
|
||||
ui_header = "ntnrc_idle.gif"
|
||||
|
||||
/datum/computer_file/program/chatclient/run_program(mob/living/user)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
for(var/datum/ntnet_conversation/channel as anything in SSnetworks.station_network.chat_channels)
|
||||
if(src in channel.offline_clients)
|
||||
channel.offline_clients.Remove(src)
|
||||
channel.active_clients.Add(src)
|
||||
|
||||
/datum/computer_file/program/chatclient/kill_program(forced = FALSE)
|
||||
for(var/C in SSnetworks.station_network.chat_channels)
|
||||
var/datum/ntnet_conversation/channel = C
|
||||
channel.remove_client(src)
|
||||
for(var/datum/ntnet_conversation/channel as anything in SSnetworks.station_network.chat_channels)
|
||||
channel.go_offline(src)
|
||||
active_channel = null
|
||||
..()
|
||||
|
||||
/datum/computer_file/program/chatclient/ui_static_data(mob/user)
|
||||
@@ -193,6 +216,7 @@
|
||||
data["all_channels"] = all_channels
|
||||
|
||||
data["active_channel"] = active_channel
|
||||
data["selfref"] = REF(src) //used to verify who is you, as usernames can be copied.
|
||||
data["username"] = username
|
||||
data["adminmode"] = netadmin_mode
|
||||
var/datum/ntnet_conversation/channel = SSnetworks.station_network.get_chat_channel_by_id(active_channel)
|
||||
@@ -204,21 +228,25 @@
|
||||
if(netadmin_mode)
|
||||
authed = TRUE
|
||||
var/list/clients = list()
|
||||
for(var/C in channel.clients)
|
||||
if(C == src)
|
||||
for(var/datum/computer_file/program/chatclient/channel_client as anything in channel.active_clients + channel.offline_clients)
|
||||
if(channel_client == src)
|
||||
authed = TRUE
|
||||
var/datum/computer_file/program/chatclient/cl = C
|
||||
clients.Add(list(list(
|
||||
"name" = cl.username
|
||||
"name" = channel_client.username,
|
||||
"status" = channel_client.program_state,
|
||||
"muted" = (channel_client in channel.muted_clients),
|
||||
"operator" = channel.operator == channel_client,
|
||||
"ref" = REF(channel_client)
|
||||
)))
|
||||
data["authed"] = authed
|
||||
//no fishing for ui data allowed
|
||||
if(authed)
|
||||
data["strong"] = channel.strong
|
||||
data["clients"] = clients
|
||||
var/list/messages = list()
|
||||
for(var/M in channel.messages)
|
||||
for(var/message in channel.messages)
|
||||
messages.Add(list(list(
|
||||
"msg" = M
|
||||
"msg" = message
|
||||
)))
|
||||
data["messages"] = messages
|
||||
data["is_operator"] = (channel.operator == src) || netadmin_mode
|
||||
|
||||
Reference in New Issue
Block a user