mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-11 10:11:09 +00:00
* Adds a modular computer subsystem to shift modPCs away from radios (#71732) ## About The Pull Request Adds the modular computer subsystem which is meant to replace mod PC's reliance on networks and radios, specifically the network subsystem, the ntnet interface, and /datum/ntnet. This PR removes station_root ntnets entirely, but I tried to keep it small. This PR also removes a ton of unused vars and defines, such as NTNet channels that were unused (peer2peer and systemcontrol), atmos networks (as they were removed a while ago) and NTNet var on relays (its stated purpose is so admins can see it through varedits, but that's useless now that it's a subsystem) I also removed ``setting_disabled`` as a thing the RD can do, it turned off ALL ntnet systems. However, this was when there were 4 different ones, now that there's only 2 I thought it was redundant and he could just click 2 buttons to close them. ## Why It's Good For The Game ``/datum/ntnet``, ``/datum/component/ntnet_interface``, and ``/datum/controller/subsystem/networks`` are all old-code messes that depend on eachother and is hard for people to understand what exactly it adds to the game. 90% of its features is allowing the Wirecarp app to see all the ruins that spawned in-game, which I don't think is something that we even WANT (why does the RD need to know that oldstation spawned? Why should they know this anyway??) This hopefully starts to simplify networks/ntnet to make it easier to remove in the future, because surely there are better alternatives than **this** ## Changelog 🆑 refactor: Modular computers NTnet and applications run on its own subsystem, please report any new bugs you may find. /🆑 * Adds a modular computer subsystem to shift modPCs away from radios * Fixed contractor uplink Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Co-authored-by: tastyfish <crazychris32@gmail.com>
128 lines
4.9 KiB
Plaintext
128 lines
4.9 KiB
Plaintext
#define MAX_CHANNELS 1000
|
|
|
|
/datum/ntnet_conversation
|
|
///The title of the conversation, seen in the UI.
|
|
var/title = "Untitled Conversation"
|
|
//If a channel is strong, it cannot be renamed or deleted.
|
|
var/strong = FALSE
|
|
///The password to join a channel, set by an Administrator.
|
|
var/password
|
|
|
|
///A static UID to ensure no conversations are the same.
|
|
var/static/ntnrc_uid = 0
|
|
///ID using the UID.
|
|
var/id
|
|
|
|
///List of all messages sent in the conversation.
|
|
var/list/messages = list()
|
|
|
|
///The "Administrator" of the channel, the creator starts as channel's operator by default.
|
|
var/datum/computer_file/program/chatclient/channel_operator
|
|
///Chat clients who are active or minimized.
|
|
var/list/datum/computer_file/program/chatclient/active_clients = list()
|
|
///Chat clients who have exited out of the program.
|
|
var/list/datum/computer_file/program/chatclient/offline_clients = list()
|
|
///Chat clients currently muted by the operator, rendering them unable to ping other people.
|
|
var/list/datum/computer_file/program/chatclient/muted_clients = list()
|
|
|
|
/datum/ntnet_conversation/New(title, strong = FALSE)
|
|
src.title = title
|
|
src.strong = strong
|
|
|
|
id = ntnrc_uid
|
|
ntnrc_uid++
|
|
if(id > MAX_CHANNELS)
|
|
qdel(src)
|
|
return
|
|
SSmodular_computers.chat_channels.Add(src)
|
|
return ..()
|
|
|
|
/datum/ntnet_conversation/Destroy()
|
|
SSmodular_computers.chat_channels.Remove(src)
|
|
for(var/datum/computer_file/program/chatclient/chatterbox as anything in (active_clients | offline_clients))
|
|
purge_client(chatterbox)
|
|
return ..()
|
|
|
|
/datum/ntnet_conversation/proc/add_message(message, username)
|
|
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(format = "hh:mm")] -!- [message]")
|
|
trim_message_list()
|
|
|
|
/datum/ntnet_conversation/proc/trim_message_list()
|
|
if(messages.len <= 50)
|
|
return
|
|
messages = messages.Copy(messages.len-50 ,0)
|
|
|
|
/datum/ntnet_conversation/proc/add_client(datum/computer_file/program/chatclient/new_user, silent = FALSE)
|
|
if(!istype(new_user))
|
|
return
|
|
new_user.conversations |= src
|
|
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, without the message, since you're the creator.
|
|
if(!channel_operator)
|
|
changeop(new_user, silent = TRUE)
|
|
|
|
//Clear all of our references to a client, used for client deletion
|
|
/datum/ntnet_conversation/proc/purge_client(datum/computer_file/program/chatclient/forget)
|
|
remove_client(forget)
|
|
forget.conversations -= src
|
|
|
|
/datum/ntnet_conversation/proc/remove_client(datum/computer_file/program/chatclient/leaving)
|
|
if(!istype(leaving))
|
|
return
|
|
if(leaving in active_clients)
|
|
active_clients.Remove(leaving)
|
|
add_status_message("[leaving.username] has left the channel.")
|
|
muted_clients -= leaving
|
|
offline_clients -= leaving
|
|
|
|
// Channel operator left, pick new operator
|
|
if(leaving == channel_operator)
|
|
channel_operator = null
|
|
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(!op.netadmin_mode && (channel_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, silent = FALSE)
|
|
if(!istype(newop))
|
|
CRASH("[src] is attempting to add [newop] as the operator, but it isn't a chat client.")
|
|
channel_operator = newop
|
|
if(!silent)
|
|
add_status_message("Channel operator status transferred to [newop.username].")
|
|
|
|
/datum/ntnet_conversation/proc/change_title(newtitle, datum/computer_file/program/chatclient/renamer)
|
|
if((channel_operator != renamer) || strong) // Not Authorised or channel cannot be editted
|
|
return FALSE
|
|
add_status_message("[renamer.username] has changed channel title from [title] to [newtitle]")
|
|
title = newtitle
|
|
|
|
#undef MAX_CHANNELS
|