diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index d9d232ea1cd..eca4abf1043 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -720,53 +720,88 @@ var/global/list/obj/item/device/pda/PDAs = list()
t = Gibberish(t, 100)
return t
-/obj/item/device/pda/proc/send_to_all(mob/living/U = usr)
- var/message = msg_input(U)
+/obj/item/device/pda/proc/send_message(mob/living/user = usr,list/obj/item/device/pda/targets)
+ var/message = msg_input(user)
+ if(!message || !targets.len)
+ return
+
if(last_text && world.time < last_text + 5)
return
- var/datum/data_pda_msg/msg_ref = null
- for(var/obj/item/device/pda/P in get_viewable_pdas())
+ var/multiple = targets.len > 1
+
+ var/datum/data_pda_msg/last_sucessful_msg
+ for(var/obj/item/device/pda/P in targets)
if(P == src)
continue
- var/temp_ref = create_message(U,P,message,skip_spam = 1)
- if(temp_ref)
- msg_ref = temp_ref
+ var/obj/machinery/message_server/MS = null
+ MS = can_send(P)
+ if(MS)
+ var/datum/data_pda_msg/msg = MS.send_pda_message("[P.owner]","[owner]","[message]",photo)
+ if(msg)
+ last_sucessful_msg = msg
+ if(!multiple)
+ show_to_sender(msg)
+ P.show_recieved_message(msg,src)
+ if(!multiple)
+ show_to_ghosts(msg)
+ log_pda("[user] (PDA: [src.name]) sent \"[message]\" to [P.name]")
+ else
+ if(!multiple)
+ user << "ERROR: Server isn't responding."
+ return
+ photo = null
+
+ if(multiple)
+ show_to_sender(last_sucessful_msg,1)
+ show_to_ghosts(last_sucessful_msg,1)
+ log_pda("[user] (PDA: [src.name]) sent \"[message]\" to Everyone")
- var/photo_ref = msg_ref.photo ? "(Photo)" : ""
+/obj/item/device/pda/proc/show_to_sender(datum/data_pda_msg/msg,multiple = 0)
+ tnote += "→ To [multiple ? "Everyone" : msg.recipient]:
[msg.message][msg.get_photo_ref()]
"
+
+/obj/item/device/pda/proc/show_recieved_message(datum/data_pda_msg/msg,obj/item/device/pda/source)
+ tnote += "← From [source.owner] ([source.ownjob]):
[msg.message][msg.get_photo_ref()]
"
+
+ if (!silent)
+ playsound(loc, 'sound/machines/twobeep.ogg', 50, 1)
+ audible_message("\icon[src] *[ttone]*", null, 3)
+ //Search for holder of the PDA.
+ var/mob/living/L = null
+ if(loc && isliving(loc))
+ L = loc
+ //Maybe they are a pAI!
+ else
+ L = get(src, /mob/living/silicon)
+
+ if(L)
+ L << "\icon[src] Message from [source.owner] ([source.ownjob]), \"[msg.message]\"[msg.get_photo_ref()] (Reply)"
+
+ overlays.Cut()
+ overlays += image('icons/obj/pda.dmi', "pda-r")
+
+/obj/item/device/pda/proc/show_to_ghosts(datum/data_pda_msg/msg,multiple = 0)
for(var/mob/M in player_list)
if(isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTPDA))
- M.show_message("PDA Message - [owner] -> ALL: [message][photo_ref]")
+ M.show_message("PDA Message - [msg.sender] -> [multiple ? "Everyone" : msg.recipient]: [msg.message][msg.get_photo_ref()]")
- log_pda("[usr] (PDA: [src.name]) sent \"[message]\" to Everyone")
+/obj/item/device/pda/proc/can_send(obj/item/device/pda/P)
+ if(!P || qdeleted(P) || P.toff)
+ return null
-/obj/item/device/pda/proc/create_message(mob/living/U = usr, obj/item/device/pda/P, message = null , skip_spam = 0)
- var/t = message
- if(!t)
- t = msg_input(U)
-
- if (!t)
- return
-
- if (!skip_spam && last_text && world.time < last_text + 5)
- return
-
- if (!istype(P) || P.toff || qdeleted(P))
- return
-
- last_text = world.time
var/obj/machinery/message_server/useMS = null
if(message_servers)
for (var/obj/machinery/message_server/MS in message_servers)
//PDAs are now dependant on the Message Server.
if(MS.active)
useMS = MS
+ break
var/datum/signal/signal = src.telecomms_process()
- if(!P || qdeleted(P) || !U) //in case the PDA or mob gets destroyed during telecomms_process()
- return
+ if(!P || qdeleted(P) || P.toff) //in case the PDA or mob gets destroyed during telecomms_process()
+ return null
var/useTC = 0
if(signal)
@@ -775,47 +810,18 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/turf/pos = get_turf(P)
if(pos.z in signal.data["level"])
useTC = 2
- //Let's make this barely readable
- if(signal.data["compression"] > 0)
- t = Gibberish(t, signal.data["compression"] + 50)
- if(useMS && useTC) // only send the message if it's stable
- if(useTC != 2) // Does our recipient have a broadcaster on their level?
- U << "ERROR: Cannot reach recipient."
- return
- var/msg_ref = useMS.send_pda_message("[P.owner]","[owner]","[t]",photo)
- var/photo_ref = ""
- if(photo)
- photo_ref = "(Photo)"
- tnote += "→ To [P.owner]:
[t][photo_ref]
"
- P.tnote += "← From [owner] ([ownjob]):
[t][photo_ref]
"
- for(var/mob/M in player_list)
- if(!skip_spam && isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTPDA))
- M.show_message("PDA Message - [owner] -> [P.owner]: [t][photo_ref]")
-
- if (!P.silent)
- playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1)
- P.audible_message("\icon[P] *[P.ttone]*", null, 3)
- //Search for holder of the PDA.
- var/mob/living/L = null
- if(P.loc && isliving(P.loc))
- L = P.loc
- //Maybe they are a pAI!
- else
- L = get(P, /mob/living/silicon)
-
- if(L)
- L << "\icon[P] Message from [src.owner] ([ownjob]), \"[t]\"[photo_ref] (Reply)"
-
- if(!skip_spam)
- log_pda("[usr] (PDA: [src.name]) sent \"[t]\" to [P.name]")
- photo = null
- P.overlays.Cut()
- P.overlays += image('icons/obj/pda.dmi', "pda-r")
- return msg_ref
+ if(useTC == 2)
+ return useMS
else
- U << "ERROR: Server isn't responding."
- return null
+ return null
+
+
+/obj/item/device/pda/proc/send_to_all(mob/living/U = usr)
+ send_message(U,get_viewable_pdas())
+
+/obj/item/device/pda/proc/create_message(mob/living/U = usr, obj/item/device/pda/P)
+ send_message(U,list(P))
/obj/item/device/pda/AltClick()
..()
diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm
index 364e9bb392e..2feff376587 100644
--- a/code/modules/research/message_server.dm
+++ b/code/modules/research/message_server.dm
@@ -17,6 +17,11 @@ var/global/list/obj/machinery/message_server/message_servers = list()
if(param_photo)
photo = param_photo
+/datum/data_pda_msg/proc/get_photo_ref()
+ if(photo)
+ return "(Photo)"
+ return ""
+
/datum/data_pda_msg/Topic(href,href_list)
..()
if(href_list["photo"])