diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index e39c1eebe6..304a614c0f 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -59,12 +59,10 @@
if(!istype(id_card))
return ..()
- if(!scan && access_change_ids in id_card.access)
- user.drop_item()
+ if(!scan && (access_change_ids in id_card.access) && user.unEquip(id_card))
id_card.loc = src
scan = id_card
else if(!modify)
- user.drop_item()
id_card.loc = src
modify = id_card
@@ -157,8 +155,7 @@
modify = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
+ if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I))
I.loc = src
modify = I
diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm
index 7258fc543b..ccbce91b61 100644
--- a/code/game/machinery/computer/guestpass.dm
+++ b/code/game/machinery/computer/guestpass.dm
@@ -62,13 +62,14 @@
/obj/machinery/computer/guestpass/attackby(obj/O, mob/user)
if(istype(O, /obj/item/weapon/card/id))
- if(!giver)
- user.drop_item()
+ if(!giver && user.unEquip(O))
O.loc = src
giver = O
updateUsrDialog()
- else
+ else if(giver)
user << "There is already ID card inside."
+ return
+ ..()
/obj/machinery/computer/guestpass/attack_ai(var/mob/user as mob)
return attack_hand(user)
@@ -151,8 +152,7 @@
accesses.Cut()
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
+ if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I))
I.loc = src
giver = I
updateUsrDialog()
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 92d9e9a83f..72746775a7 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -35,13 +35,13 @@
usr << "There is nothing to remove from the console."
return
-/obj/machinery/computer/med_data/attackby(obj/item/O as obj, user as mob)
- if(istype(O, /obj/item/weapon/card/id) && !scan)
- usr.drop_item()
+/obj/machinery/computer/med_data/attackby(var/obj/item/O, var/mob/user)
+ if(istype(O, /obj/item/weapon/card/id) && !scan && user.unEquip(O))
O.loc = src
scan = O
- user << "You insert [O]."
- ..()
+ user << "You insert \the [O]."
+ else
+ ..()
/obj/machinery/computer/med_data/attack_ai(user as mob)
return src.attack_hand(user)
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 090e02c908..eba129df26 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -248,8 +248,7 @@ What a mess.*/
scan = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
+ if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I))
I.loc = src
scan = I
diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm
index fb2d4ef095..fca6cf4024 100644
--- a/code/game/machinery/computer/skills.dm
+++ b/code/game/machinery/computer/skills.dm
@@ -24,13 +24,13 @@
var/sortBy = "name"
var/order = 1 // -1 = Descending - 1 = Ascending
-/obj/machinery/computer/skills/attackby(obj/item/O as obj, user as mob)
- if(istype(O, /obj/item/weapon/card/id) && !scan)
- usr.drop_item()
+/obj/machinery/computer/skills/attackby(obj/item/O as obj, var/mob/user)
+ if(istype(O, /obj/item/weapon/card/id) && !scan && user.unEquip(O))
O.loc = src
scan = O
user << "You insert [O]."
- ..()
+ else
+ ..()
/obj/machinery/computer/skills/attack_ai(mob/user as mob)
return attack_hand(user)
@@ -185,8 +185,7 @@ What a mess.*/
scan = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
+ if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I))
I.loc = src
scan = I
diff --git a/code/game/machinery/computer3/computers/medical.dm b/code/game/machinery/computer3/computers/medical.dm
index f39dd54de8..7cf89a3fce 100644
--- a/code/game/machinery/computer3/computers/medical.dm
+++ b/code/game/machinery/computer3/computers/medical.dm
@@ -181,7 +181,7 @@
scan = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if (istype(I, /obj/item/weapon/card/id) && usr.drop_item(I))
computer.cardslot.insert(I, 1)
scan = I
@@ -194,7 +194,7 @@
scan2 = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if (istype(I, /obj/item/weapon/card/id) && usr.drop_item(I))
computer.cardslot.insert(I, 2)
scan2 = I
diff --git a/code/game/machinery/computer3/computers/security.dm b/code/game/machinery/computer3/computers/security.dm
index a346c12fac..1ba0c08cf7 100644
--- a/code/game/machinery/computer3/computers/security.dm
+++ b/code/game/machinery/computer3/computers/security.dm
@@ -254,7 +254,7 @@ What a mess.*/
scan = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if (istype(I, /obj/item/weapon/card/id) && usr.drop_item(I))
computer.cardslot.insert(I, 1)
scan = I
@@ -267,7 +267,7 @@ What a mess.*/
scan2 = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if (istype(I, /obj/item/weapon/card/id) && usr.drop_item(I))
computer.cardslot.insert(I, 2)
scan2 = I
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index a01dc224c3..57c5dd95af 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -1142,21 +1142,22 @@ var/global/list/obj/item/device/pda/PDAs = list()
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.drop_item()
+ 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)
+ if (istype(I, /obj/item/weapon/card/id) && I:registered_name && user.unEquip(I))
var/obj/old_id = id
- user.drop_item()
I.loc = src
id = I
user.put_in_hands(old_id)
- return
+ return 1
+ return 0
// access to status display signals
/obj/item/device/pda/attackby(obj/item/C as obj, mob/user as mob)
@@ -1184,9 +1185,9 @@ var/global/list/obj/item/device/pda/PDAs = list()
else
//Basic safety check. If either both objects are held by user or PDA is on ground and card is in hand.
if(((src in user.contents) && (C in user.contents)) || (istype(loc, /turf) && in_range(src, user) && (C in user.contents)) )
- id_check(user, 2)
- user << "You put the ID into \the [src]'s slot."
- updateSelfDialog()//Update self dialog on success.
+ if(id_check(user, 2))
+ user << "You put the ID into \the [src]'s slot."
+ updateSelfDialog()//Update self dialog on success.
return //Return in case of failed check or when successful.
updateSelfDialog()//For the non-input related code.
else if(istype(C, /obj/item/device/paicard) && !src.pai)
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index a63a0f14cb..dbac808c04 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -122,8 +122,9 @@
return 0
/obj/item/weapon/card/id/proc/show(mob/user as mob)
- user << browse_rsc(front, "front.png")
- user << browse_rsc(side, "side.png")
+ if(front && side)
+ user << browse_rsc(front, "front.png")
+ user << browse_rsc(side, "side.png")
var/datum/browser/popup = new(user, "idcard", name, 600, 250)
popup.set_content(dat())
popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state))
@@ -148,11 +149,6 @@
id_card.dna_hash = dna.unique_enzymes
id_card.fingerprint_hash= md5(dna.uni_identity)
id_card.update_name()
-
-/mob/living/silicon/set_id_info(var/obj/item/weapon/card/id/id_card)
- id_card.assignment = "Synthetic"
- id_card.rank = "Synthetic"
- ..()
/mob/living/carbon/human/set_id_info(var/obj/item/weapon/card/id/id_card)
..()
@@ -222,9 +218,20 @@
item_state = "gold_id"
registered_name = "Captain"
assignment = "Captain"
- New()
- access = get_all_station_access()
- ..()
+/obj/item/weapon/card/id/captains_spare/New()
+ access = get_all_station_access()
+ ..()
+
+/obj/item/weapon/card/id/synthetic
+ name = "\improper Synthetic ID"
+ desc = "Access module for NanoTrasen Synthetics"
+ icon_state = "id-robot"
+ item_state = "tdgreen"
+ assignment = "Synthetic"
+
+/obj/item/weapon/card/id/synthetic/New()
+ access = get_all_station_access()
+ ..()
/obj/item/weapon/card/id/centcom
name = "\improper CentCom. ID"
diff --git a/code/game/objects/items/weapons/cards_ids_syndicate.dm b/code/game/objects/items/weapons/cards_ids_syndicate.dm
index 1642766a0e..3496607ffa 100644
--- a/code/game/objects/items/weapons/cards_ids_syndicate.dm
+++ b/code/game/objects/items/weapons/cards_ids_syndicate.dm
@@ -39,7 +39,7 @@ var/global/list/syndicate_ids = list()
if(!registered_user)
registered_user = user
user.set_id_info(src)
- user << "The microscanner marks you as its owner, preventing others some accessing its internals."
+ user << "The microscanner marks you as its owner, preventing others from accessing its internals."
if(registered_user == user)
switch(alert("Would you like edit the ID, or show it?","Show or Edit?", "Edit","Show"))
if("Edit")
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 131347ac29..c1022c55d0 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -224,6 +224,9 @@
//Set the stop_messages to stop it from printing messages
/obj/item/weapon/storage/proc/can_be_inserted(obj/item/W as obj, stop_messages = 0)
if(!istype(W)) return //Not an item
+
+ if(!usr.canUnEquip(W))
+ return 0
if(src.loc == W)
return 0 //Means the item is already in the storage item
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index 1115826be8..a23cc18aef 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -216,11 +216,9 @@ var/list/slot_equipment_priority = list( \
update_inv_wear_mask(0)
return
-//This differs from remove_from_mob() in that it checks if the item can be unequipped first.
-/mob/proc/unEquip(obj/item/I, force = 0) //Force overrides NODROP for things like wizarditis and admin undress.
+/mob/proc/canUnEquip(obj/item/I)
if(!I) //If there's nothing to drop, the drop is automatically successful.
return 1
-
var/slot
for(var/s in slot_back to slot_tie) //kind of worries me
if(get_equipped_item(s) == I)
@@ -230,6 +228,12 @@ var/list/slot_equipment_priority = list( \
if(slot && !I.mob_can_unequip(src, slot))
return 0
+ return 1
+
+//This differs from remove_from_mob() in that it checks if the item can be unequipped first.
+/mob/proc/unEquip(obj/item/I, force = 0) //Force overrides NODROP for things like wizarditis and admin undress.
+ if(!force && canUnEquip(I))
+ return
drop_from_inventory(I)
return 1
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 08e56dc905..8e6f3207fb 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -52,6 +52,9 @@ var/global/list/robot_modules = list(
R.set_module_sprites(sprites)
R.choose_icon(R.module_sprites.len + 1, R.module_sprites)
+ for(var/obj/item/I in modules)
+ I.canremove = 0
+
/obj/item/weapon/robot_module/proc/Reset(var/mob/living/silicon/robot/R)
remove_camera_networks(R)
remove_languages(R)
@@ -146,7 +149,6 @@ var/global/list/robot_modules = list(
)
/obj/item/weapon/robot_module/standard/New()
- ..()
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/weapon/melee/baton/loaded(src)
src.modules += new /obj/item/weapon/extinguisher(src)
@@ -154,7 +156,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/device/healthanalyzer(src)
src.emag = new /obj/item/weapon/melee/energy/sword(src)
- return
+ ..()
/obj/item/weapon/robot_module/medical
name = "medical robot module"
@@ -174,7 +176,6 @@ var/global/list/robot_modules = list(
)
/obj/item/weapon/robot_module/medical/surgeon/New()
- ..()
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/device/healthanalyzer(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo/surgeon(src)
@@ -206,7 +207,7 @@ var/global/list/robot_modules = list(
src.modules += N
src.modules += B
- return
+ ..()
/obj/item/weapon/robot_module/medical/surgeon/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
if(src.emag)
@@ -226,7 +227,6 @@ var/global/list/robot_modules = list(
)
/obj/item/weapon/robot_module/medical/crisis/New()
- ..()
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/borg/sight/hud/med(src)
src.modules += new /obj/item/device/healthanalyzer(src)
@@ -260,7 +260,7 @@ var/global/list/robot_modules = list(
src.modules += B
src.modules += S
- return
+ ..()
/obj/item/weapon/robot_module/medical/crisis/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
@@ -296,7 +296,6 @@ var/global/list/robot_modules = list(
no_slip = 1
/obj/item/weapon/robot_module/engineering/construction/New()
- ..()
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/weapon/extinguisher(src)
@@ -330,8 +329,9 @@ var/global/list/robot_modules = list(
RG.synths = list(metal, glass)
src.modules += RG
-/obj/item/weapon/robot_module/engineering/general/New()
..()
+
+/obj/item/weapon/robot_module/engineering/general/New()
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/weapon/extinguisher(src)
@@ -384,7 +384,7 @@ var/global/list/robot_modules = list(
RG.synths = list(metal, glass)
src.modules += RG
- return
+ ..()
/obj/item/weapon/robot_module/security
name = "security robot module"
@@ -405,7 +405,6 @@ var/global/list/robot_modules = list(
)
/obj/item/weapon/robot_module/security/general/New()
- ..()
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/borg/sight/hud/sec(src)
src.modules += new /obj/item/weapon/handcuffs/cyborg(src)
@@ -413,7 +412,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg(src)
src.modules += new /obj/item/taperoll/police(src)
src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src)
- return
+ ..()
/obj/item/weapon/robot_module/security/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
var/obj/item/device/flash/F = locate() in src.modules
@@ -444,7 +443,6 @@ var/global/list/robot_modules = list(
)
/obj/item/weapon/robot_module/janitor/New()
- ..()
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/weapon/soap/nanotrasen(src)
src.modules += new /obj/item/weapon/storage/bag/trash(src)
@@ -453,7 +451,7 @@ var/global/list/robot_modules = list(
src.emag = new /obj/item/weapon/reagent_containers/spray(src)
src.emag.reagents.add_reagent("lube", 250)
src.emag.name = "Lube spray"
- return
+ ..()
/obj/item/weapon/robot_module/janitor/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
var/obj/item/device/lightreplacer/LR = locate() in src.modules
@@ -487,7 +485,6 @@ var/global/list/robot_modules = list(
)
/obj/item/weapon/robot_module/clerical/butler/New()
- ..()
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/weapon/gripper/service(src)
src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src)
@@ -516,7 +513,7 @@ var/global/list/robot_modules = list(
R.my_atom = src.emag
R.add_reagent("beer2", 50)
src.emag.name = "Mickey Finn's Special Brew"
- return
+ ..()
/obj/item/weapon/robot_module/clerical/general
name = "clerical robot module"
@@ -530,13 +527,13 @@ var/global/list/robot_modules = list(
)
/obj/item/weapon/robot_module/clerical/general/New()
- ..()
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/weapon/pen/robopen(src)
src.modules += new /obj/item/weapon/form_printer(src)
src.modules += new /obj/item/weapon/gripper/paperwork(src)
src.modules += new /obj/item/weapon/hand_labeler(src)
src.emag = new /obj/item/weapon/stamp/denied(src)
+ ..()
/obj/item/weapon/robot_module/general/butler/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules
@@ -558,7 +555,6 @@ var/global/list/robot_modules = list(
supported_upgrades = list(/obj/item/borg/upgrade/jetpack)
/obj/item/weapon/robot_module/miner/New()
- ..()
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/weapon/wrench(src)
@@ -570,7 +566,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/mining_scanner(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src)
- return
+ ..()
/obj/item/weapon/robot_module/research
name = "research module"
@@ -581,7 +577,6 @@ var/global/list/robot_modules = list(
)
/obj/item/weapon/robot_module/research/New()
- ..()
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/weapon/portable_destructive_analyzer(src)
src.modules += new /obj/item/weapon/gripper/research(src)
@@ -607,7 +602,7 @@ var/global/list/robot_modules = list(
N.synths = list(nanite)
src.modules += N
- return
+ ..()
/obj/item/weapon/robot_module/syndicate
name = "illegal robot module"
@@ -625,7 +620,6 @@ var/global/list/robot_modules = list(
var/id
/obj/item/weapon/robot_module/syndicate/New(var/mob/living/silicon/robot/R)
- ..()
loc = R
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/weapon/melee/energy/sword(src)
@@ -637,7 +631,7 @@ var/global/list/robot_modules = list(
id = R.idcard
src.modules += id
- return
+ ..()
/obj/item/weapon/robot_module/syndicate/Destroy()
src.modules -= id
@@ -649,7 +643,6 @@ var/global/list/robot_modules = list(
sprites = list("Combat Android" = "droid-combat")
/obj/item/weapon/robot_module/combat/New()
- ..()
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/borg/sight/thermal(src)
src.modules += new /obj/item/weapon/gun/energy/laser/mounted(src)
@@ -657,7 +650,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/borg/combat/shield(src)
src.modules += new /obj/item/borg/combat/mobility(src)
src.emag = new /obj/item/weapon/gun/energy/lasercannon/mounted(src)
- return
+ ..()
/obj/item/weapon/robot_module/drone
name = "drone module"
@@ -665,7 +658,6 @@ var/global/list/robot_modules = list(
networks = list(NETWORK_ENGINEERING)
/obj/item/weapon/robot_module/drone/New()
- ..()
src.modules += new /obj/item/weapon/weldingtool(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/wrench(src)
@@ -732,14 +724,16 @@ var/global/list/robot_modules = list(
P.synths = list(plastic)
src.modules += P
+ ..()
+
/obj/item/weapon/robot_module/drone/construction
name = "construction drone module"
channels = list("Engineering" = 1)
languages = list()
/obj/item/weapon/robot_module/drone/construction/New()
- ..()
src.modules += new /obj/item/weapon/rcd/borg(src)
+ ..()
/obj/item/weapon/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
var/obj/item/device/lightreplacer/LR = locate() in src.modules
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index ac3feba076..25b321a9a7 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -25,7 +25,7 @@
var/list/access_rights
var/obj/item/weapon/card/id/idcard
- var/idcard_type = /obj/item/weapon/card/id/captains_spare
+ var/idcard_type = /obj/item/weapon/card/id/synthetic
#define SEC_HUD 1 //Security HUD mode
#define MED_HUD 2 //Medical HUD mode
diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm
index 44d42e1b9d..160eb5cde2 100644
--- a/code/modules/paperwork/faxmachine.dm
+++ b/code/modules/paperwork/faxmachine.dm
@@ -114,8 +114,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
scan = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
+ if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I))
I.loc = src
scan = I
authenticated = 0