diff --git a/baystation12.dme b/baystation12.dme
index de04cfec400..3143cb39c7c 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -831,6 +831,7 @@
#include "code\modules\admin\verbs\adminsay.dm"
#include "code\modules\admin\verbs\antag-ooc.dm"
#include "code\modules\admin\verbs\atmosdebug.dm"
+#include "code\modules\admin\verbs\bluespacetech.dm"
#include "code\modules\admin\verbs\BrokenInhands.dm"
#include "code\modules\admin\verbs\buildmode.dm"
#include "code\modules\admin\verbs\check_customitem_activity.dm"
diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm
index 499dc7f7150..168471c3c27 100644
--- a/code/_onclick/hud/ai.dm
+++ b/code/_onclick/hud/ai.dm
@@ -10,7 +10,7 @@
using.icon = 'icons/mob/screen_ai.dmi'
using.icon_state = "ai_core"
using.screen_loc = ui_ai_core
- using.layer = 20
+ using.layer = 21
adding += using
//Camera list
@@ -19,7 +19,7 @@
using.icon = 'icons/mob/screen_ai.dmi'
using.icon_state = "camera"
using.screen_loc = ui_ai_camera_list
- using.layer = 20
+ using.layer = 21
adding += using
//Track
@@ -28,7 +28,7 @@
using.icon = 'icons/mob/screen_ai.dmi'
using.icon_state = "track"
using.screen_loc = ui_ai_track_with_camera
- using.layer = 20
+ using.layer = 21
adding += using
//Camera light
@@ -37,7 +37,7 @@
using.icon = 'icons/mob/screen_ai.dmi'
using.icon_state = "camera_light"
using.screen_loc = ui_ai_camera_light
- using.layer = 20
+ using.layer = 21
adding += using
//Crew Monitorting
@@ -46,7 +46,7 @@
using.icon = 'icons/mob/screen_ai.dmi'
using.icon_state = "crew_monitor"
using.screen_loc = ui_ai_crew_monitor
- using.layer = 20
+ using.layer = 21
adding += using
//Crew Manifest
@@ -55,7 +55,7 @@
using.icon = 'icons/mob/screen_ai.dmi'
using.icon_state = "manifest"
using.screen_loc = ui_ai_crew_manifest
- using.layer = 20
+ using.layer = 21
adding += using
//Alerts
@@ -64,7 +64,7 @@
using.icon = 'icons/mob/screen_ai.dmi'
using.icon_state = "alerts"
using.screen_loc = ui_ai_alerts
- using.layer = 20
+ using.layer = 21
adding += using
//Announcement
@@ -73,7 +73,7 @@
using.icon = 'icons/mob/screen_ai.dmi'
using.icon_state = "announcement"
using.screen_loc = ui_ai_announcement
- using.layer = 20
+ using.layer = 21
adding += using
//Shuttle
@@ -82,7 +82,7 @@
using.icon = 'icons/mob/screen_ai.dmi'
using.icon_state = "call_shuttle"
using.screen_loc = ui_ai_shuttle
- using.layer = 20
+ using.layer = 21
adding += using
//Laws
@@ -91,7 +91,7 @@
using.icon = 'icons/mob/screen_ai.dmi'
using.icon_state = "state_laws"
using.screen_loc = ui_ai_state_laws
- using.layer = 20
+ using.layer = 21
adding += using
//PDA message
@@ -100,7 +100,7 @@
using.icon = 'icons/mob/screen_ai.dmi'
using.icon_state = "pda_send"
using.screen_loc = ui_ai_pda_send
- using.layer = 20
+ using.layer = 21
adding += using
//PDA log
@@ -109,7 +109,7 @@
using.icon = 'icons/mob/screen_ai.dmi'
using.icon_state = "pda_receive"
using.screen_loc = ui_ai_pda_log
- using.layer = 20
+ using.layer = 21
adding += using
//Take image
@@ -118,7 +118,7 @@
using.icon = 'icons/mob/screen_ai.dmi'
using.icon_state = "take_picture"
using.screen_loc = ui_ai_take_picture
- using.layer = 20
+ using.layer = 21
adding += using
//View images
@@ -127,7 +127,7 @@
using.icon = 'icons/mob/screen_ai.dmi'
using.icon_state = "view_images"
using.screen_loc = ui_ai_view_images
- using.layer = 20
+ using.layer = 21
adding += using
//Medical/Security sensors
@@ -136,7 +136,7 @@
using.icon = 'icons/mob/screen_ai.dmi'
using.icon_state = "ai_sensor"
using.screen_loc = ui_ai_sensor
- using.layer = 20
+ using.layer = 21
adding += using
mymob.client.screen += adding + other
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 7b272aff879..19c06f9be34 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -163,6 +163,8 @@
var/amounts = list(5, 10)
var/obj/item/weapon/reagent_containers/glass/beaker = null
var/filtering = 0
+ var/allow_occupant_types = list(/mob/living/carbon/human)
+ var/disallow_occupant_types = list()
use_power = 1
idle_power_usage = 15
@@ -251,6 +253,57 @@
return
return
+ MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
+ if(!check_occupant_allowed(O))
+ return
+
+ if(src.occupant)
+ user << "\blue The sleeper is already occupied!"
+ return
+
+ for(var/mob/living/carbon/slime/M in range(1,O))
+ if(M.Victim == O)
+ usr << "[O.name] will not fit into the sleeper because they have a slime latched onto their head."
+ return
+
+ var/mob/living/L = O
+ if(L == user)
+ visible_message("[user] starts climbing into the sleeper.", 3)
+ else
+ visible_message("[user] starts putting [L.name] into the sleeper.", 3)
+ if(do_after(user, 20))
+ if(src.occupant)
+ user << "\blue The sleeper is already occupied!"
+ return
+ if(!L) return
+
+ if(L.client)
+ L.client.perspective = EYE_PERSPECTIVE
+ L.client.eye = src
+ L.loc = src
+ src.occupant = L
+ src.icon_state = (orient == "RIGHT") ? "sleeper_1-r" : "sleeper_1"
+ L << "\blue You feel cool air surround you. You go numb as your senses turn inward."
+ src.add_fingerprint(user)
+ if(user.pulling == L)
+ user.pulling = null
+ return
+ return
+
+ proc/check_occupant_allowed(mob/M)
+ var/correct_type = 0
+ for(var/type in allow_occupant_types)
+ if(istype(M, type))
+ correct_type = 1
+ break
+
+ if(!correct_type) return 0
+
+ for(var/type in disallow_occupant_types)
+ if(istype(M, type))
+ return 0
+
+ return 1
ex_act(severity)
if(filtering)
@@ -318,6 +371,8 @@
toggle_filter()
if(!src.occupant)
return
+ for(var/obj/O in src) //once again, why wasn't this here?
+ O.loc = src.loc
if(src.occupant.client)
src.occupant.client.eye = src.occupant.client.mob
src.occupant.client.perspective = MOB_PERSPECTIVE
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 51e577b596b..e7ac271c409 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -98,6 +98,30 @@
qdel(G)
return
+/obj/machinery/bodyscanner/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
+ if(!ismob(O))
+ return
+ var/mob/M = O
+ if (src.occupant)
+ user << "\blue The scanner is already occupied!"
+ return
+ if (M.abiotic())
+ user << "\blue Subject cannot have abiotic items on."
+ return
+ if (M.client)
+ M.client.perspective = EYE_PERSPECTIVE
+ M.client.eye = src
+ M.loc = src
+ src.occupant = M
+ update_use_power(2)
+ src.icon_state = "body_scanner_1"
+ for(var/obj/Obj in src)
+ Obj.loc = src.loc
+ //Foreach goto(154)
+ src.add_fingerprint(user)
+ //G = null
+ return
+
/obj/machinery/bodyscanner/ex_act(severity)
switch(severity)
if(1.0)
@@ -256,7 +280,7 @@
usr << "\icon[src]The body scanner cannot scan that lifeform."
return
var/obj/item/weapon/paper/R = new(src.loc)
- R.name = "Body scan report"
+ R.name = "Scan ([occupant])"
R.info = format_occupant_data(src.connected.get_occupant_data())
@@ -443,4 +467,4 @@
dat += text("Cataracts detected.
")
if(occ["sdisabilities"] & NEARSIGHTED)
dat += text("Retinal misalignment detected.
")
- return dat
\ No newline at end of file
+ return dat
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 0f1b0a2844f..5a9b7b476f8 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -187,9 +187,26 @@
return
var/mob/M = G:affecting
if(put_mob(M))
+ visible_message("[user] puts [M.name] into the cryo cell.", 3)
qdel(G)
return
+/obj/machinery/atmospherics/unary/cryo_cell/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
+ if(!ismob(O))
+ return
+ var/mob/living/L = O
+ for(var/mob/living/carbon/slime/M in range(1,L))
+ if(M.Victim == L)
+ usr << "[L.name] will not fit into the cryo because they have a slime latched onto their head."
+ return
+ if(put_mob(L))
+ if(L == user)
+ visible_message("[user] climbs into the cryo cell.", 3)
+ else
+ visible_message("[user] puts [L.name] into the cryo cell.", 3)
+ if(user.pulling == L)
+ user.pulling = null
+
/obj/machinery/atmospherics/unary/cryo_cell/update_icon()
overlays.Cut()
icon_state = "pod[on]"
@@ -327,6 +344,7 @@
return
if (usr.stat != 0)
return
+ visible_message("[usr] climbs into the cryo cell.", 3)
put_mob(usr)
return
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index cf6b142ad09..b5600196d84 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -452,6 +452,72 @@
//Despawning occurs when process() is called with an occupant without a client.
src.add_fingerprint(M)
+/obj/machinery/cryopod/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
+ if(!check_occupant_allowed(O))
+ return
+
+ if(occupant)
+ user << "\The [src] is in use."
+ return
+
+ var/mob/living/L = O
+
+ if(L.stat == DEAD)
+ user << "Dead people can not be put into cryo."
+ return
+
+ for(var/mob/living/carbon/slime/M in range(1,L))
+ if(M.Victim == L)
+ usr << "[L.name] will not fit into the cryo pod because they have a slime latched onto their head."
+ return
+
+ var/willing = null //We don't want to allow people to be forced into despawning.
+
+ if(L.client)
+ if(alert(L,"Would you like to enter cryosleep?",,"Yes","No") == "Yes")
+ if(!L) return
+ willing = 1
+ else
+ willing = 1
+
+ if(willing)
+ if(L == user)
+ visible_message("[user] starts climbing into the cryo pod.", 3)
+ else
+ visible_message("[user] starts putting [L] into the cryo pod.", 3)
+
+ if(do_after(user, 20))
+ if(!L) return
+
+ L.loc = src
+
+ if(L.client)
+ L.client.perspective = EYE_PERSPECTIVE
+ L.client.eye = src
+ else
+ user << "You stop [L == user ? "climbing into the cryo pod." : "putting [L] into the cryo pod."]"
+ return
+
+ if(orient_right)
+ icon_state = "[occupied_icon_state]-r"
+ else
+ icon_state = occupied_icon_state
+
+ L << "\blue You feel cool air surround you. You go numb as your senses turn inward."
+ L << "\blue If you ghost, log out or close your client now, your character will shortly be permanently removed from the round."
+ occupant = L
+ time_entered = world.time
+
+ // Book keeping!
+ var/turf/location = get_turf(src)
+ log_admin("[key_name_admin(L)] has entered a stasis pod.")
+ message_admins("\blue [key_name_admin(L)] has entered a stasis pod.(JMP)")
+
+ //Despawning occurs when process() is called with an occupant without a client.
+ src.add_fingerprint(L)
+
+ return
+
/obj/machinery/cryopod/verb/eject()
set name = "Eject Pod"
set category = "Object"
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index 23aba341697..50c27d431a8 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -40,6 +40,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
// 8 = view messages
// 9 = authentication before sending
// 10 = send announcement
+ //11 = Form Database
var/silent = 0 // set to 1 for it not to beep all the time
// var/hackState = 0
// 0 = not hacked
@@ -55,6 +56,11 @@ var/list/obj/machinery/requests_console/allConsoles = list()
var/dpt = ""; //the department which will be receiving the message
var/priority = -1 ; //Priority of the message being sent
light_range = 0
+ //Form intregration
+ var/SQLquery
+ var/paperstock = 10
+ var/lid = 0
+ //End Form Integration
var/datum/announcement/announcement = new
/obj/machinery/requests_console/power_change()
@@ -203,6 +209,35 @@ var/list/obj/machinery/requests_console/allConsoles = list()
dat += text("Announce
");
dat += text("
Back
")
+ if(11) //form database
+ dat += text("NanoTrasen Corporate Forms
")
+ establish_db_connection()
+ if(!dbcon.IsConnected())
+ dat += text("ERROR: Unable to contact external database. Please contact your system administrator for assistance.")
+ log_game("SQL database connection failed. Attempted to fetch form information.")
+ else
+ dat += {"
| NCF ID | Form Name | Dept. | Print | ? |
"}
+
+ //For reference:
+ //Command forms, 01xx series
+ //Security forms, 02xx series
+ //Medical forms, 03xx series
+ //Engineer forms, 04xx series
+ //Science forms, 05xx series
+ //Supply forms, 06xx series
+ //General forms, 10xx series
+
+ var/DBQuery/query = dbcon.NewQuery(SQLquery)
+ query.Execute()
+ while(query.NextRow())
+ var/id = query.item[1]
+ var/name = query.item[2]
+ var/department = query.item[3]
+ dat += "| NCF-[id] | [name] | [department] | Print | ? |
"
+ dat += "
"
+ dat += text("
Reset Search")
+ dat += text("
Back
")
+
else //main menu
screen = 0
reset_announce()
@@ -214,13 +249,22 @@ var/list/obj/machinery/requests_console/allConsoles = list()
dat += text("Request Assistance
")
dat += text("Request Supplies
")
- dat += text("Relay Anonymous Information
")
+ dat += text("Relay Anonymous Information
")
+ dat += text("NanoTrasen Corporate Form Database
")
if(announcementConsole)
dat += text("Send station-wide announcement
")
if (silent)
dat += text("Speaker OFF")
else
dat += text("Speaker ON")
+ if(paperstock)
+ dat += text("
[paperstock] papers in stock.")
+ else
+ dat += text("
No paper in stock.")
+ if(lid)
+ dat += text("
Paper container lid OPEN.")
+ else
+ dat += text("
Paper container lid CLOSE.")
user << browse("[dat]", "window=request_console")
onclose(user, "req_console")
@@ -326,6 +370,66 @@ var/list/obj/machinery/requests_console/allConsoles = list()
for (var/mob/O in hearers(4, src.loc))
O.show_message(text("\icon[src] *The Requests Console beeps: 'NOTICE: No server detected!'"))
+ if(href_list["sort"])
+ var/sortdep = sanitizeSQL(href_list["sort"])
+ SQLquery = " Select id, name, department FROM aurora_forms WHERE department LIKE '%[sortdep]%'"
+ screen = 11
+
+ if(href_list["print"])
+ var/printid = sanitizeSQL(href_list["print"])
+ establish_db_connection()
+
+ if(!dbcon.IsConnected())
+ alert("Connection to the database lost. Aborting.")
+ if(!printid)
+ alert("Invalid query. Try again.")
+ var/DBQuery/query = dbcon.NewQuery("SELECT id, name, data FROM aurora_forms WHERE id=[printid]")
+ query.Execute()
+
+ while(query.NextRow())
+ var/id = query.item[1]
+ var/name = query.item[2]
+ var/data = query.item[3]
+ var/obj/item/weapon/paper/C = new(src.loc)
+
+ //Let's start the BB >> HTML conversion!
+
+ data = html_encode(data)
+ data = replacetext(data, "\n", "
")
+
+ C.info += data
+ C.info = C.parsepencode(C.info)
+ C.updateinfolinks()
+ C.name = "NFC-[id] - [name]"
+ paperstock--
+
+ if(href_list["whatis"])
+ var/whatisid = sanitizeSQL(href_list["whatis"])
+ establish_db_connection()
+ if(!dbcon.IsConnected())
+ alert("Connection to the database lost. Aborting.")
+ if(!whatisid)
+ alert("Invalid query. Try again.")
+ var/DBQuery/query = dbcon.NewQuery("SELECT id, name, department, info FROM aurora_forms WHERE id=[whatisid]")
+ query.Execute()
+ var/dat = "NanoTrasen Corporate Form
"
+ while(query.NextRow())
+ var/id = query.item[1]
+ var/name = query.item[2]
+ var/department = query.item[3]
+ var/info = query.item[4]
+
+ dat += "NCF-[id]
"
+ dat += "[name]
"
+ dat += "[department] Department
"
+ dat += "[info]"
+ dat += ""
+ usr << browse(dat, "window=Information;size=560x240")
+
+ switch( href_list["setLid"] )
+ if(null) //skip
+ if("1") lid = 1
+ else lid = 0
//Handle screen switching
switch(text2num(href_list["setScreen"]))
@@ -351,6 +455,9 @@ var/list/obj/machinery/requests_console/allConsoles = list()
if(10) //send announcement
if(!announcementConsole) return
screen = 10
+ if(11) //form database
+ SQLquery = "SELECT id, name, department FROM aurora_forms"
+ screen = 11
else //main menu
dpt = ""
msgVerified = ""
@@ -411,6 +518,76 @@ var/list/obj/machinery/requests_console/allConsoles = list()
var/obj/item/weapon/stamp/T = O
msgStamped = text("Stamped with the [T.name]")
updateUsrDialog()
+ if (istype(O, /obj/item/weapon/paper_bundle))
+ if(lid) //More of that restocking business
+ var/obj/item/weapon/paper_bundle/C = O
+ paperstock += C.amount
+ user.drop_item(C)
+ del(C)
+ for (var/mob/U in hearers(4, src.loc))
+ U.show_message(text("\icon[src] *The Requests Console beeps: 'Paper added.'"))
+ else
+ user << "\blue I should open the lid to add more paper, or try faxing one paper at a time."
+ if (istype(O, /obj/item/weapon/paper))
+ if(lid) //Stocking them papers
+ var/obj/item/weapon/paper/C = O
+ user.drop_item(C)
+ del(C)
+ paperstock++
+ for (var/mob/U in hearers(4, src.loc))
+ U.show_message(text("\icon[src] *The Requests Console beeps: 'Paper added.'"))
+ else if(screen == 0) //Faxing them papers
+ var/pass = 0
+ var/sendto = input("Select department.", "Send Fax", null, null) in allConsoles
+ for (var/obj/machinery/message_server/MS in world)
+ if(!MS.active) continue
+ pass = 1
+ if(pass)
+ var/sent = 0
+ for(var/obj/machinery/requests_console/Console in world)
+ if(Console == sendto)
+ if(Console.paperstock == 0)
+ alert("Error! Receiving console out of paper! Aborting!")
+ return
+ if(!sent)
+ sent = 1
+ var/obj/item/weapon/paper/C = O
+ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(Console.loc)
+ P.info = ""
+ var/copied = html_decode(C.info)
+ copied = replacetext(copied, ""
+ P.name = C.name
+ P.fields = C.fields
+ P.stamps = C.stamps
+ P.stamped = C.stamped
+ P.ico = C.ico
+ P.offset_x = C.offset_x
+ P.offset_y = C.offset_y
+ var/list/temp_overlays = C.overlays
+ var/image/img
+ for (var/j = 1, j <= temp_overlays.len, j++)
+ if (findtext(C.ico[j], "cap") || findtext(C.ico[j], "cent"))
+ img = image('icons/obj/bureaucracy.dmi', "paper_stamp-circle")
+ else if (findtext(C.ico[j], "deny"))
+ img = image('icons/obj/bureaucracy.dmi', "paper_stamp-x")
+ else
+ img = image('icons/obj/bureaucracy.dmi', "paper_stamp-dots")
+ img.pixel_x = C.offset_x[j]
+ img.pixel_y = C.offset_y[j]
+ P.overlays += img
+ P.updateinfolinks()
+ playsound(Console.loc, 'sound/machines/twobeep.ogg', 50, 1)
+ for (var/mob/player in hearers(4, Console.loc))
+ player.show_message(text("\icon[Console] *The Requests Console beeps: 'Fax received'"))
+ Console.paperstock--
+ if(sent == 1)
+ user.show_message(text("\icon[src] *The Requests Console beeps: 'Message Sent.'"))
+ else
+ user.show_message(text("\icon[src] *The Requests Console beeps: 'NOTICE: No server detected!'"))
+
return
/obj/machinery/requests_console/proc/reset_announce()
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index a6459ee44c2..a3f97328eb2 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -98,6 +98,7 @@ var/list/admin_verbs_admin = list(
/client/proc/cmd_cciaa_say,
/client/proc/cmd_dev_say,
/client/proc/view_duty_log
+ /client/proc/cmd_dev_bst
)
var/list/admin_verbs_ban = list(
/client/proc/unban_panel,
@@ -299,7 +300,6 @@ var/list/admin_verbs_mod = list(
var/list/admin_verbs_dev = list( //will need to be altered - Ryan784
///datum/admins/proc/restart,
/datum/admins/proc/spawn_atom, //allows us to spawn instances,
- /datum/admins/proc/delay,
/client/proc/Jump,
/client/proc/jumptokey, /*allows us to jump to the location of a mob with a certain ckey*/
/client/proc/jumptomob, /*allows us to jump to a specific mob*/
@@ -330,7 +330,8 @@ var/list/admin_verbs_dev = list( //will need to be altered - Ryan784
/client/proc/restart_controller,
/client/proc/togglebuildmodeself,
/client/proc/toggledebuglogs,
- /client/proc/ZASSettings
+ /client/proc/ZASSettings,
+ /client/proc/cmd_dev_bst
)
var/list/admin_verbs_cciaa = list(
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/
diff --git a/code/modules/admin/verbs/bluespacetech.dm b/code/modules/admin/verbs/bluespacetech.dm
new file mode 100644
index 00000000000..e7f74e47877
--- /dev/null
+++ b/code/modules/admin/verbs/bluespacetech.dm
@@ -0,0 +1,456 @@
+/*
+// Bluespace Technition and all their items.
+// Only avaliable to people with +DEV and +DEVELOPER
+// All items are ave canremove = 0 to avoid loos and thefts
+// They are invincible.
+// Suicide with them to exit in an rp way
+//
+// I really didn't expect most of this to work right but hey it does.
+// - SoundScopes
+*/
+
+/client/proc/cmd_dev_bst()
+ set category = "Debug"
+ set name = "Spawn Bluespace Tech"
+ set desc = "Spawns a Bluespace Tech to debug stuff"
+
+ if(!check_rights(R_DEV|R_ADMIN)) return
+
+ if(!holder)
+ return //how did they get here?
+
+ if(!ticker)
+ alert("Wait until the game starts")
+ return
+
+ if(ticker.current_state < GAME_STATE_PLAYING)
+ src << "\red The game hasn't started yet!"
+ return
+
+ if(istype(mob, /mob/living))
+ if(!holder.original_mob)
+ holder.original_mob = mob
+
+ //I couldn't get the normal way to work so this works.
+ //This whole section looks like a hack, I don't like it.
+ var/T = get_turf(usr)
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(3, 1, T)
+ s.start()
+ var/mob/living/carbon/human/bst/bst = new(get_turf(T))
+// bst.original_mob = usr
+ bst.anchored = 1
+ bst.ckey = usr.ckey
+ bst.name = "Bluespace Technician"
+ bst.real_name = "Bluespace Technician"
+ bst.voice_name = "Bluespace Technician"
+ bst.h_style = "Crewcut"
+
+ //Items
+ var/obj/item/clothing/under/U = new /obj/item/clothing/under/rank/centcom_officer/bst(bst)
+ bst.equip_to_slot_or_del(U, slot_w_uniform)
+ bst.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert/bst(bst), slot_l_ear)
+ bst.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/holding/bst(bst), slot_back)
+ bst.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(bst.back), slot_in_backpack)
+ bst.equip_to_slot_or_del(new /obj/item/clothing/shoes/black/bst(bst), slot_shoes)
+ bst.equip_to_slot_or_del(new /obj/item/clothing/head/beret(bst), slot_head)
+ bst.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/bst(bst), slot_glasses)
+ bst.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(bst), slot_belt)
+ bst.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat/bst(bst), slot_gloves)
+ if(bst.backbag == 1)
+ bst.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(bst), slot_r_hand)
+ else
+ bst.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(bst.back), slot_in_backpack)
+ bst.equip_to_slot_or_del(new /obj/item/device/t_scanner(bst.back), slot_in_backpack)
+ bst.equip_to_slot_or_del(new /obj/item/device/pda/captain/bst(bst.back), slot_in_backpack)
+ bst.equip_to_slot_or_del(new /obj/item/device/multitool(bst.back), slot_in_backpack)
+
+ var/obj/item/weapon/storage/box/pills = new /obj/item/weapon/storage/box
+ pills.name = "adminordrazine"
+ for(var/i = 1, i < 12, i++)
+ new /obj/item/weapon/reagent_containers/pill/adminordrazine(pills)
+ bst.equip_to_slot_or_del(pills, slot_in_backpack)
+
+ //Implant because access
+ bst.implant_loyalty(bst,TRUE)
+
+ //Sort out ID
+ var/obj/item/weapon/card/id/bst/id = new/obj/item/weapon/card/id/bst(bst)
+ id.registered_name = bst.real_name
+ id.assignment = "Bluespace Technician"
+ id.name = "[id.assignment]"
+ bst.equip_to_slot_or_del(id, slot_wear_id)
+ bst.update_inv_wear_id()
+ bst.regenerate_icons()
+
+ //Add the rest of the languages
+ //Because universal speak doesn't work right.
+ bst.add_language("Sinta'unathi")
+ bst.add_language("Siik'Maas")
+ bst.add_language("Skrellian")
+ bst.add_language("Vox-pidgin")
+ bst.add_language("Rootspeak")
+ bst.add_language("Ceti Basic")
+ bst.add_language("Sol Common")
+ bst.add_language("Tradeband")
+ bst.add_language("Gutter")
+ bst.add_language("Sini")
+ bst.add_language("Sign language")
+ bst.add_language("Xenomorph")
+ bst.add_language("Hivemind")
+ bst.add_language("Changeling")
+ bst.add_language("Cortical Link")
+ bst.add_language("Robot Talk")
+ bst.add_language("Drone Talk")
+
+ spawn(5)
+ s.start()
+ bst.anchored = 0
+ spawn(10)
+ qdel(s)
+ log_debug("Bluespace Tech Spawned: X:[bst.x] Y:[bst.y] Z:[bst.z] User:[src]")
+
+ feedback_add_details("admin_verb","BST")
+ return 1
+
+/mob/living/carbon/human/bst
+ universal_understand = 1
+ status_flags = GODMODE
+
+ can_inject(var/mob/user, var/error_msg, var/target_zone)
+ user << "The [src] disarms you before you can inject them."
+ user.drop_item()
+ return 0
+
+ binarycheck()
+ return 1
+
+ suicide()
+ if(key && species.name != "Human")
+ switch(species.name)
+ if("Tajaran")
+ bsc()
+ if("Machine")
+ bsb()
+ if("Diona")
+ bsd()
+ if("Unathi")
+ bsu()
+ if("Skrell")
+ bss()
+ return
+
+ src.custom_emote(1,"presses a button on their suit, followed by a polite bow.")
+ spawn(10)
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(5, 1, src)
+ s.start()
+ spawn(5)
+ qdel(s)
+ if(key)
+ if(client.holder && client.holder.original_mob)
+ client.holder.original_mob.key = key
+ else
+ var/mob/dead/observer/ghost = new(src) //Transfer safety to observer spawning proc.
+ ghost.key = key
+ ghost.mind.name = "[ghost.key] BSTech"
+ ghost.name = "[ghost.key] BSTech"
+ ghost.real_name = "[ghost.key] BSTech"
+ ghost.voice_name = "[ghost.key] BSTech"
+ qdel(src)
+ return
+
+ proc/bsc() //because we all have our unrealistic snowflakes right?
+ if(set_species("Tajaran"))
+ h_style = "Tajaran Ears"
+ name = "Bluespace Cat"
+ voice_name = "Bluespace Cat"
+ real_name = "Bluespace Cat"
+ mind.name = "Bluespace Cat"
+ if(wear_id)
+ var/obj/item/weapon/card/id/id = wear_id
+ if(istype(wear_id, /obj/item/device/pda))
+ var/obj/item/device/pda/pda = wear_id
+ id = pda.id
+ id.registered_name = "Bluespace Cat"
+ gender = "female"
+ regenerate_icons()
+ else
+ ghostize(0)
+ key = null
+ suicide()
+
+ proc/bsb()
+ if(set_species("Machine"))
+ h_style = "blue IPC screen"
+ name = "Bluespace Bot"
+ voice_name = "Bluespace Bot"
+ real_name = "Bluespace Bot"
+ mind.name = "Bluespace Bot"
+ if(wear_id)
+ var/obj/item/weapon/card/id/id = wear_id
+ if(istype(wear_id, /obj/item/device/pda))
+ var/obj/item/device/pda/pda = wear_id
+ id = pda.id
+ id.registered_name = "Bluespace Bot"
+ regenerate_icons()
+ else
+ ghostize(0)
+ key = null
+ suicide()
+
+ proc/bsd()
+ if(set_species("Diona"))
+ name = "Bluespace Tree"
+ voice_name = "Bluespace Tree"
+ real_name = "Bluespace Tree"
+ mind.name = "Bluespace Tree"
+ if(wear_id)
+ var/obj/item/weapon/card/id/id = wear_id
+ if(istype(wear_id, /obj/item/device/pda))
+ var/obj/item/device/pda/pda = wear_id
+ id = pda.id
+ id.registered_name = "Bluespace Tree"
+ regenerate_icons()
+ else
+ ghostize(0)
+ key = null
+ suicide()
+
+ proc/bsu()
+ if(set_species("Unathi"))
+ h_style = "Unathi Horns"
+ name = "Bluespace Snake"
+ voice_name = "Bluespace Snake"
+ real_name = "Bluespace Snake"
+ mind.name = "Bluespace Snake"
+ if(wear_id)
+ var/obj/item/weapon/card/id/id = wear_id
+ if(istype(wear_id, /obj/item/device/pda))
+ var/obj/item/device/pda/pda = wear_id
+ id = pda.id
+ id.registered_name = "Bluespace Snake"
+ regenerate_icons()
+ else
+ ghostize(0)
+ key = null
+ suicide()
+
+ proc/bss()
+ if(set_species("Skrell"))
+ h_style = "Skrell Male Tentacles"
+ name = "Bluespace Squid"
+ voice_name = "Bluespace Squid"
+ real_name = "Bluespace Squid"
+ mind.name = "Bluespace Squid"
+ if(wear_id)
+ var/obj/item/weapon/card/id/id = wear_id
+ if(istype(wear_id, /obj/item/device/pda))
+ var/obj/item/device/pda/pda = wear_id
+ id = pda.id
+ id.registered_name = "Bluespace Squid"
+ gender = "female"
+ regenerate_icons()
+ else
+ ghostize(0)
+ key = null
+ suicide()
+
+ say(var/message)
+ var/verb = "says in a subdued tone"
+ ..(message, verb)
+
+ verb/bstwalk()
+ set name = "Ruin Everything"
+ set desc = "Uses bluespace technology to phase through solid matter and also move fast."
+ set category = "BST"
+ set popup_menu = 0
+
+ if(!src.incorporeal_move)
+ src.incorporeal_move = 2
+ src << "\blue You will now phase through solid matter."
+ else
+ src.incorporeal_move = 0
+ src << "\blue You will no-longer phase through solid matter."
+ return
+
+ verb/bstrecover()
+ set name = "Rejuv"
+ set desc = "Use the bluespace within you to restore your health"
+ set category = "BST"
+ set popup_menu = 0
+
+ src.revive()
+
+ verb/bstawake()
+ set name = "Wake up"
+ set desc = "This is a quick fix to the reloging sleep bug"
+ set category = "BST"
+ set popup_menu = 0
+
+ src.sleeping = 0
+
+ verb/bstquit()
+ set name = "Teleport out"
+ set desc = "Activate bluespace to leave (and return to your original mob(if you have one))"
+ set category = "BST"
+
+ var/client/C = src.client
+ if(C.holder && C.holder.original_mob)
+ if(C.holder.original_mob.key)//Thanks for kicking Tish off the Server Meow, wouldn't have spotted this otherwise.
+ suicide()
+ return
+
+ C.holder.original_mob.key = key
+ C.holder.original_mob = null
+ suicide()
+
+//Equipment. All should have canremove set to 0
+//All items with a /bst need the attack_hand() proc overrided to stop people getting overpowered items.
+
+//Bag o Holding
+/obj/item/weapon/storage/backpack/holding/bst
+ canremove = 0
+ storage_slots = 56
+ max_w_class = 400
+
+ attack_hand()
+ if(!usr)
+ return
+ if(!istype(usr, /mob/living/carbon/human/bst))
+ usr << "Your hand seems to go right through the [src]. It's like it doesn't exist."
+ return
+ else
+ ..()
+
+//Headset
+/obj/item/device/radio/headset/ert/bst
+ name = "Bluespace Technician's headset"
+ desc = "Bluespace Technician's headset, 'BST' marked on the side."
+ translate_binary = 1
+ translate_hive = 1
+ canremove = 0
+ keyslot1 = new /obj/item/device/encryptionkey/binary
+ keyslot2 = new /obj/item/device/encryptionkey/ert
+
+ attack_hand()
+ if(!usr)
+ return
+ if(!istype(usr, /mob/living/carbon/human/bst))
+ usr << "Your hand seems to go right through the [src]. It's like it doesn't exist."
+ return
+ else
+ ..()
+
+//Clothes
+/obj/item/clothing/under/rank/centcom_officer/bst
+ name = "Bluespace Technician's Uniform"
+ desc = "Bluespace Technician's Uniform, there is a logo on the sleve, it reads 'BST'."
+ has_sensor = 0
+ sensor_mode = 0
+ canremove = 0
+ siemens_coefficient = 0
+ cold_protection = FULL_BODY
+ heat_protection = FULL_BODY
+
+ attack_hand()
+ if(!usr)
+ return
+ if(!istype(usr, /mob/living/carbon/human/bst))
+ usr << "Your hand seems to go right through the [src]. It's like it doesn't exist."
+ return
+ else
+ ..()
+
+//Gloves
+/obj/item/clothing/gloves/swat/bst
+ name = "Bluespace Technician's gloves"
+ desc = "A pair of modified gloves, 'BST' marked on the side."
+ siemens_coefficient = 0
+ permeability_coefficient = 0
+ canremove = 0
+
+ attack_hand()
+ if(!usr)
+ return
+ if(!istype(usr, /mob/living/carbon/human/bst))
+ usr << "Your hand seems to go right through the [src]. It's like it doesn't exist."
+ return
+ else
+ ..()
+
+//Sunglasses
+/obj/item/clothing/glasses/sunglasses/bst
+ name = "Bluespace Technician's Glasses"
+ desc = "A pair of sunglasses, these look modified, 'BST' marked on the side."
+// var/list/obj/item/clothing/glasses/hud/health/hud = null
+ vision_flags = (SEE_TURFS|SEE_OBJS|SEE_MOBS)
+ canremove = 0
+/* New()
+ ..()
+ src.hud += new/obj/item/clothing/glasses/hud/security(src)
+ src.hud += new/obj/item/clothing/glasses/hud/health(src)
+ return
+*/
+ attack_hand()
+ if(!usr)
+ return
+ if(!istype(usr, /mob/living/carbon/human/bst))
+ usr << "Your hand seems to go right through the [src]. It's like it doesn't exist."
+ return
+ else
+ ..()
+
+//Shoes
+/obj/item/clothing/shoes/black/bst
+ name = "Bluespace Technician's shoes"
+ name = "Bluespace Technician's shoes, 'BST' marked on the side."
+ icon_state = "black"
+ desc = "A pair of black shoes. 'BST' marked on the side."
+ flags = NOSLIP
+ canremove = 0
+
+ attack_hand()
+ if(!usr)
+ return
+ if(!istype(usr, /mob/living/carbon/human/bst))
+ usr << "Your hand seems to go right through the [src]. It's like it doesn't exist."
+ return
+ else
+ ..()
+
+ return 1 //Because Bluespace
+
+//ID
+/obj/item/weapon/card/id/bst
+ icon_state = "centcom"
+ desc = "An ID straight from Cent. Com, this one looks highly classified"
+// canremove = 0
+ New()
+ access = get_all_accesses()+get_all_centcom_access()+get_all_syndicate_access()
+
+ attack_hand()
+ if(!usr)
+ return
+ if(!istype(usr, /mob/living/carbon/human/bst))
+ usr << "Your hand seems to go right through the [src] ID. It's like it doesn't exist."
+ return
+ else
+ ..()
+
+/obj/item/device/pda/captain/bst
+ hidden = 1
+ message_silent = 1
+// ttone = "DO SOMETHING HERE"
+
+ attack_hand()
+ if(!usr)
+ return
+ if(!istype(usr, /mob/living/carbon/human/bst))
+ usr << "Your hand seems to go right through the pda. It's like it doesn't exist."
+ return
+ else
+ ..()
+
+/mob/living/carbon/human/bst/restrained()
+ return 0
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 8474d39eea8..c9de540257d 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -51,11 +51,12 @@
/obj/item/clothing/glasses/science
name = "Science Goggles"
- desc = "The goggles do nothing!"
+ desc = "Used to protect your eyes against harmful chemicals!"
icon_state = "purple"
item_state = "glasses"
toggleable = 1
icon_action_button = "action_science"
+ unacidable = 1
/obj/item/clothing/glasses/science/New()
..()
@@ -108,7 +109,7 @@
item_state = "glasses"
prescription = 1
body_parts_covered = 0
-
+
/obj/item/clothing/glasses/regular/scanners
name = "Scanning Goggles"
desc = "A very oddly shaped pair of goggles with bits of wire poking out the sides. A soft humming sound emanates from it."
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index aedfe6bdf97..35fa1a19360 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -86,16 +86,16 @@
item_state = "browngloves"
/obj/item/clothing/gloves/yellow/specialt
- desc = "These gloves will protect the wearer from electric shock. Made special for Tajaran use"
+ desc = "These gloves will protect the wearer from electric shock. Made special for Tajaran use."
name = "Tajaran electrical gloves"
icon_state = "yellow"
item_state = "ygloves"
siemens_coefficient = 0
permeability_coefficient = 0.05
- species_restricted = list("Tajaran")
+ species_restricted = list("Tajara")
/obj/item/clothing/gloves/yellow/specialu
- desc = "These gloves will protect the wearer from electric shock. Made special for Unathi use"
+ desc = "These gloves will protect the wearer from electric shock. Made special for Unathi use."
name = "Unathi electrical gloves"
icon_state = "yellow"
item_state = "ygloves"
@@ -111,4 +111,4 @@
/obj/item/clothing/gloves/black/tajara
name = "black gloves"
desc = "black gloves made for Tajara use."
- species_restricted = list("Tajaran")
+ species_restricted = list("Tajara")
diff --git a/code/modules/clothing/gloves/stungloves.dm b/code/modules/clothing/gloves/stungloves.dm
index 02ca6e7a731..caf0db0b7dd 100644
--- a/code/modules/clothing/gloves/stungloves.dm
+++ b/code/modules/clothing/gloves/stungloves.dm
@@ -73,7 +73,7 @@
desc = "[desc]
They have had the fingertips cut off of them."
if("exclude" in species_restricted)
species_restricted -= "Unathi"
- species_restricted -= "Tajaran"
+ species_restricted -= "Tajara"
return
else
user << "The [src] have already been clipped!"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index f01f1e98002..5f756dea128 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -224,7 +224,7 @@
/mob/living/carbon/human/show_inv(mob/user as mob)
// TODO : Change to incapacitated() on merge.
- if(user.stat || user.lying || user.resting || user.buckled || !user.Adjacent(src))
+ if(user.stat || user.lying || user.resting || user.buckled || !user.Adjacent(src) || user.restrained())
return
var/obj/item/clothing/under/suit = null
diff --git a/code/modules/mob/living/carbon/human/stripping.dm b/code/modules/mob/living/carbon/human/stripping.dm
index 00a8f8113a1..b8f1c8c9214 100644
--- a/code/modules/mob/living/carbon/human/stripping.dm
+++ b/code/modules/mob/living/carbon/human/stripping.dm
@@ -4,7 +4,7 @@
return
// TODO : Change to incapacitated() on merge.
- if(user.stat || user.lying || user.resting || user.buckled || !user.Adjacent(src))
+ if(user.stat || user.lying || user.resting || user.buckled || !user.Adjacent(src) || user.restrained())
user << browse(null, text("window=mob[src.name]"))
return
diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm
index cee9a7d9273..7758c12724e 100644
--- a/code/modules/organs/blood.dm
+++ b/code/modules/organs/blood.dm
@@ -223,7 +223,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
if (!injected || !our)
return
- if(blood_incompatible(injected.data["blood_type"],our.data["blood_type"],injected.data["species"],our.data["species"]) )
+ if(blood_incompatible(injected.data["blood_type"],our.data["blood_type"],injected.data["species"],our.data["species"]) && !(mind.vampire))
reagents.add_reagent("toxin",amount * 0.5)
reagents.update_total()
else
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 14079c8a7d2..b495bd94cbb 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -429,6 +429,7 @@
B.pages.Add(src)
B.pages.Add(P)
+ B.amount = 2
B.update_icon()
else if(istype(P, /obj/item/weapon/pen))
diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm
index 7da55f1f056..461f4a2fdac 100644
--- a/code/modules/paperwork/paper_bundle.dm
+++ b/code/modules/paperwork/paper_bundle.dm
@@ -13,7 +13,7 @@
attack_verb = list("bapped")
var/page = 1 // current page
var/list/pages = list() // Ordered list of pages as they are to be displayed. Can be different order than src.contents.
-
+ var amount = 0 // How many sheet
/obj/item/weapon/paper_bundle/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
@@ -24,14 +24,15 @@
user << "Take off the carbon copy first."
add_fingerprint(user)
return
- // adding sheets
+ // adding sheets
if(istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/weapon/photo))
insert_sheet_at(user, pages.len+1, W)
-
- // burning
+ amount++
+
+ // burning
else if(istype(W, /obj/item/weapon/flame))
burnpaper(W, user)
-
+
// merging bundles
else if(istype(W, /obj/item/weapon/paper_bundle))
user.drop_from_inventory(W)
@@ -39,6 +40,7 @@
O.loc = src
O.add_fingerprint(usr)
pages.Add(O)
+ amount++
user << "You add \the [W.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name]."
qdel(W)
@@ -55,17 +57,16 @@
add_fingerprint(usr)
return
-/obj/item/weapon/paper_bundle/proc/insert_sheet_at(mob/user, var/index, obj/item/weapon/sheet)
+/obj/item/weapon/paper_bundle/proc/insert_sheet_at(mob/user, var/index, obj/item/weapon/sheet)
if(istype(sheet, /obj/item/weapon/paper))
user << "You add [(sheet.name == "paper") ? "the paper" : sheet.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name]."
else if(istype(sheet, /obj/item/weapon/photo))
user << "You add [(sheet.name == "photo") ? "the photo" : sheet.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name]."
-
+
user.drop_from_inventory(sheet)
sheet.loc = src
-
+
pages.Insert(index, sheet)
-
if(index <= page)
page++
@@ -150,7 +151,7 @@
if(href_list["next_page"])
if(in_hand && (istype(in_hand, /obj/item/weapon/paper) || istype(in_hand, /obj/item/weapon/photo)))
insert_sheet_at(usr, page+1, in_hand)
- else if(page != pages.len)
+ else if(page != pages.len)
page++
playsound(src.loc, "pageturn", 50, 1)
if(href_list["prev_page"])
@@ -163,20 +164,20 @@
var/obj/item/weapon/W = pages[page]
usr.put_in_hands(W)
pages.Remove(pages[page])
-
+
usr << "You remove the [W.name] from the bundle."
-
+
if(pages.len <= 1)
var/obj/item/weapon/paper/P = src[1]
usr.drop_from_inventory(src)
usr.put_in_hands(P)
qdel(src)
-
+
return
-
+
if(page > pages.len)
page = pages.len
-
+
update_icon()
else
usr << "You need to hold it in hands!"
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index 84b01539ade..e2dd24c4a61 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -66,16 +66,21 @@
return
-/obj/item/weapon/paper_bin/attackby(obj/item/weapon/paper/i as obj, mob/user as mob)
- if(!istype(i))
- return
-
- user.drop_item()
- i.loc = src
- user << "You put [i] in [src]."
- papers.Add(i)
- update_icon()
- amount++
+/obj/item/weapon/paper_bin/attackby(obj/item/weapon/O as obj, mob/user as mob)
+ if(istype(O, /obj/item/weapon/paper))
+ var/obj/item/weapon/paper/i = O
+ user.drop_item()
+ i.loc = src
+ user << "You put [i] in [src]."
+ papers.Add(i)
+ amount++
+ /* if(istype(O, /obj/item/weapon/paper_pack)) WIP written in.
+ var/obj/item/weapon/paper_bundle/j = O
+ user.drop_item()
+ amount += j.amount
+ user << "You add paper from [j] into [src]."
+ del(j)
+ */
/obj/item/weapon/paper_bin/examine(mob/user)
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 5b36998d166..5143e139e31 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -146,6 +146,18 @@
return ..()
+/obj/structure/reagent_dispensers/fueltank/attack_ghost(mob/user as mob)
+ if(user.client && user.client.inquisitive_ghost)
+ examine()
+ if(!user.client.holder)
+ return
+ if(!src.defuse && ((user.client.holder.rights & R_ADMIN) || (user.client.holder.rights & R_MOD)))
+ src.defuse = 1
+ message_admins("[key_name_admin(user)] defused fueltank at ([loc.x],[loc.y],[loc.z]).")
+ else
+ if(!src.armed && ((user.client.holder.rights & R_ADMIN) || (user.client.holder.rights & R_MOD)))
+ src.defuse = 0
+ message_admins("[key_name_admin(user)] reset fuse on fueltank at ([loc.x],[loc.y],[loc.z]).")
/obj/structure/reagent_dispensers/fueltank/bullet_act(var/obj/item/projectile/Proj)
if(Proj.damage_type == BRUTE || Proj.damage_type == BURN)
diff --git a/code/modules/spells/general/area_teleport.dm b/code/modules/spells/general/area_teleport.dm
index 77e1ee47c43..408cc334b51 100644
--- a/code/modules/spells/general/area_teleport.dm
+++ b/code/modules/spells/general/area_teleport.dm
@@ -54,6 +54,9 @@
return
if(user && user.buckled)
+ var/obj/structure/bed/B = user.buckled
+ if(B && B.buckled_mob)
+ B.user_unbuckle_mob(user)
user.buckled = null
var/attempt = null
@@ -82,4 +85,4 @@
else
invocation += "[uppertext(chosenarea.name)]"
..()
- return
\ No newline at end of file
+ return