From c42510c309f5cb899d8a0cdec0fcceac8ef1b09e Mon Sep 17 00:00:00 2001 From: Sharkmare <34294231+Sharkmare@users.noreply.github.com> Date: Fri, 17 Mar 2023 22:46:01 +0100 Subject: [PATCH] Adding an ID slot to the Communicator Allows you to slot your scanned ID into your communicator --- .../devices/communicator/communicator.dm | 104 +++++++++++++++++- vorestation.dme | 2 +- 2 files changed, 103 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index 8ecd9a5007..4c18038b26 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -72,6 +72,8 @@ var/global/list/obj/item/device/communicator/all_communicators = list() var/update_ticks = 0 var/newsfeed_channel = 0 + var/obj/item/weapon/card/id/id = null //CHOMPADDITION: Making it possible to slot an ID card into the Communicator so it can function as both. + // If you turn this on, it changes the way communicator video works. User configurable option. var/selfie_mode = FALSE @@ -108,6 +110,89 @@ var/global/list/obj/item/device/communicator/all_communicators = list() //This is a pretty terrible way of doing this. addtimer(CALLBACK(src, .proc/register_to_holder), 5 SECONDS) + + + +//CHOMPADDITION START: Ayo communicator are better than PDAs /obj/item/device/communicator +// Proc: AltClick() +// Parameters: None +// Description: Checks if the user is made of silicon and returns if they are. If the user is not made of silicon and can use the communicator, +// removes the ID from the communicator if it has one, or sends a chat message indicating that the communicator does not have an ID. + +/obj/item/device/communicator/AltClick() + if(issilicon(usr)) + return + + if(id) + remove_id() + else + to_chat(usr, "This Communicator does not have an ID in it.") +// Proc: GetAccess() +// Parameters: None +// Description: Returns the access level of the communicator's ID, if it has one. If the communicator does not have an ID, the procedure returns the +// access level of the object that contains the communicator. +/obj/item/device/communicator/GetAccess() + if(id) + return id.GetAccess() + else + return ..() + +// Proc: GetID() +// Parameters: None +// Description: Returns the ID object associated with the communicator. If the communicator does not have an ID, the procedure returns null. +/obj/item/device/communicator/GetID() + return id + +// Proc: remove_id() +// Parameters: None +// Description: If the communicator has an ID, and it is held by a mob, the ID is placed in the mob's hands, a chat message is sent indicating that +// the ID has been removed, and a sound effect is played. If the ID is not held by a mob, it is moved to the turf where the communicator +// is located. The "pda-id" overlay is removed, and the communicator's ID is set to null. +/obj/item/device/communicator/proc/remove_id() + if (id) + if (ismob(loc)) + var/mob/M = loc + M.put_in_hands(id) + to_chat(usr, "You remove the ID from the [name].") + playsound(src, 'sound/machines/id_swipe.ogg', 100, 1) + else + id.loc = get_turf(src) + cut_overlay("pda-id") + id = null + +// Proc: id_check(mob/user as mob, choice as num) +// Parameters: mob/user - the user who is attempting to check for an ID +// choice - an integer indicating whether the check is for in-pda use (1) or out-of-pda use (2) +// Description: Checks for an ID in the communicator. If choice is 1 and an ID is present, the ID is removed and the procedure returns 1. +// If choice is 1 and no ID is present, the user's active hand is checked for an ID card. If an ID card is found and unequipped +// successfully, it is added to the communicator's inventory and the procedure returns 1. If choice is 2 and the user's active hand +// contains a valid registered ID card that can be unequipped, the card is moved to the communicator's inventory and replaces the +// current ID, which is moved to the user's hands. The procedure returns 1. If no ID card can be found or equipped, the procedure +// returns 0. +/obj/item/device/communicator/proc/id_check(mob/user as mob, choice as num) + if(choice == 1) + if (id) + remove_id() + return 1 + else + var/obj/item/I = user.get_active_hand() + if (istype(I, /obj/item/weapon/card/id) && user.unEquip(I)) + I.loc = src + id = I + return 1 + else + var/obj/item/weapon/card/I = user.get_active_hand() + if (istype(I, /obj/item/weapon/card/id) && I:registered_name && user.unEquip(I)) + var/obj/old_id = id + I.loc = src + id = I + user.put_in_hands(old_id) + return 1 + return 0 + + +//CHOMPADDITION END + // Proc: register_to_holder() // Parameters: None // Description: Tries to register ourselves to the mob that we've presumably spawned in. Not the most amazing way of doing this. @@ -216,6 +301,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list() // Proc: attackby() // Parameters: 2 (C - what is used on the communicator. user - the mob that has the communicator) // Description: When an ID is swiped on the communicator, the communicator reads the job and checks it against the Owner name, if success, the occupation is added. +//CHOMPADDITION: If the ID has already been scanned it is instead inserted into the communicator /obj/item/device/communicator/attackby(obj/item/C as obj, mob/user as mob) ..() if(istype(C, /obj/item/weapon/card/id)) @@ -224,10 +310,17 @@ var/global/list/obj/item/device/communicator/all_communicators = list() to_chat(user, "\The [src] rejects the ID.") else if(!owner) to_chat(user, "\The [src] rejects the ID.") - else if(owner == idcard.registered_name) + else if(owner == idcard.registered_name && occupation != idcard.assignment) //CHMPEDIT only edit assigment if different occupation = idcard.assignment to_chat(user, "Occupation updated.") - + //CHOMPADDITION START Communicator ID slotting if we have an ID thats also already scanned + else if(((src in user.contents) && (C in user.contents)) || (istype(loc, /turf) && in_range(src, user) && (C in user.contents)) ) + if(id_check(user, 2)) + to_chat(user, "You put the ID into \the [src]'s slot.") + add_overlay("pda-id") + updateSelfDialog()//Update self dialog on success. + return //Return in case of failed check or when successful. + //CHOMPADDITION END return // Proc: attack_self() @@ -299,7 +392,14 @@ var/global/list/obj/item/device/communicator/all_communicators = list() // Proc: Destroy() // Parameters: None // Description: Deletes all the voice mobs, disconnects all linked communicators, and cuts lists to allow successful qdel() +// CHOMPADDITION: Remvovess any slotted in IDs before deleting /obj/item/device/communicator/Destroy() + //CHOMPADDITION START ID handling + if (src.id) + src.id.forceMove(get_turf(src.loc)) + else + QDEL_NULL(src.id) + //CHOMPADDITION END for(var/mob/living/voice/voice in contents) voice_mobs.Remove(voice) to_chat(voice, "\icon[src][bicon(src)] Connection timed out with remote host.") diff --git a/vorestation.dme b/vorestation.dme index 30b0b84da4..1424bf73ef 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -3202,8 +3202,8 @@ #include "code\modules\mob\living\simple_mob\simple_mob_vr.dm" #include "code\modules\mob\living\simple_mob\taming.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\animal.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\vox.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\squirrel.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\vox.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\alien animals\catslug.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\alien animals\jellyfish.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\alien animals\skeleton.dm"