Merged upstream

This commit is contained in:
PKPenguin321
2015-11-28 15:49:41 -08:00
224 changed files with 36654 additions and 18142 deletions
+2 -11
View File
@@ -362,17 +362,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
if(usr.stat || usr.restrained() || !Adjacent(usr) || usr.stunned || usr.weakened || usr.lying)
return
if(ishuman(usr) || ismonkey(usr))
if(usr.get_active_hand() == null)
usr.UnarmedAttack(src) // Let me know if this has any problems -Giacom | Actually let me know now. -Sayu
/*
if(usr.get_active_hand() == null)
src.attack_hand(usr)
else
usr << "\red You already have something in your hand."
*/
else
usr << "<span class='warning'>This mob type can't use this verb!</span>"
if(usr.get_active_hand() == null) // Let me know if this has any problems -Yota
usr.UnarmedAttack(src)
//This proc is executed when someone clicks the on-screen UI button. To make the UI button show, set the 'action_button_name'.
//The default action is attack_self().
+83 -48
View File
@@ -375,7 +375,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
dat += "<h4><img src=pda_menu.png> Detected PDAs</h4>"
dat += "<ul>"
var/count = 0
if (!toff)
@@ -393,6 +392,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
dat += "</ul>"
if (count == 0)
dat += "None detected.<br>"
else if(cartridge && cartridge.spam_enabled)
dat += "<a href='byond://?src=\ref[src];choice=MessageAll'>Send To All</a>"
if(21)
dat += "<h4><img src=pda_mail.png> SpaceMessenger V3.9.6</h4>"
@@ -578,6 +579,9 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/obj/item/device/pda/P = locate(href_list["target"])
src.create_message(U, P)
if("MessageAll")
src.send_to_all(U)
if("Send Honk")//Honk virus
if(istype(cartridge, /obj/item/weapon/cartridge/clown))//Cartridge checks are kind of unnecessary since everything is done through switch.
var/obj/item/device/pda/P = locate(href_list["target"])//Leaving it alone in case it may do something useful, I guess.
@@ -708,31 +712,88 @@ var/global/list/obj/item/device/pda/PDAs = list()
t = Gibberish(t, 100)
return t
/obj/item/device/pda/proc/create_message(mob/living/U = usr, obj/item/device/pda/P)
/obj/item/device/pda/proc/send_message(mob/living/user = usr,list/obj/item/device/pda/targets)
var/message = msg_input(user)
var/t = msg_input(U)
if (!t)
if(!message || !targets.len)
return
if(last_text && world.time < last_text + 5)
return
if (last_text && world.time < last_text + 5)
return
var/multiple = targets.len > 1
if (!istype(P) || P.toff || qdeleted(P))
return
var/datum/data_pda_msg/last_sucessful_msg
for(var/obj/item/device/pda/P in targets)
if(P == src)
continue
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 << "<span class='notice'>ERROR: Server isn't responding.</span>"
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")
/obj/item/device/pda/proc/show_to_sender(datum/data_pda_msg/msg,multiple = 0)
tnote += "<i><b>&rarr; To [multiple ? "Everyone" : msg.recipient]:</b></i><br>[msg.message][msg.get_photo_ref()]<br>"
/obj/item/device/pda/proc/show_recieved_message(datum/data_pda_msg/msg,obj/item/device/pda/source)
tnote += "<i><b>&larr; From <a href='byond://?src=\ref[src];choice=Message;target=\ref[source]'>[source.owner]</a> ([source.ownjob]):</b></i><br>[msg.message][msg.get_photo_ref()]<br>"
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] <b>Message from [source.owner] ([source.ownjob]), </b>\"[msg.message]\"[msg.get_photo_ref()] (<a href='byond://?src=\ref[src];choice=Message;skiprefresh=1;target=\ref[source]'>Reply</a>)"
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("<span class='game say'>PDA Message - <span class='name'>[msg.sender]</span> -> <span class='name'>[multiple ? "Everyone" : msg.recipient]</span>: <span class='message'>[msg.message][msg.get_photo_ref()]</span></span>")
/obj/item/device/pda/proc/can_send(obj/item/device/pda/P)
if(!P || qdeleted(P) || P.toff)
return null
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)
@@ -741,44 +802,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 = "<a href='byond://?src=\ref[msg_ref];photo=1'>(Photo)</a>"
tnote += "<i><b>&rarr; To [P.owner]:</b></i><br>[t][photo_ref]<br>"
P.tnote += "<i><b>&larr; From <a href='byond://?src=\ref[P];choice=Message;target=\ref[src]'>[owner]</a> ([ownjob]):</b></i><br>[t][photo_ref]<br>"
for(var/mob/M in player_list)
if(isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTPDA))
M.show_message("<span class='game say'>PDA Message - <span class='name'>[owner]</span> -> <span class='name'>[P.owner]</span>: <span class='message'>[t][photo_ref]</span></span>")
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] <b>Message from [src.owner] ([ownjob]), </b>\"[t]\"[photo_ref] (<a href='byond://?src=\ref[P];choice=Message;skiprefresh=1;target=\ref[src]'>Reply</a>)"
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")
if(useTC == 2)
return useMS
else
U << "<span class='notice'>ERROR: Server isn't responding.</span>"
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()
..()
+8 -5
View File
@@ -24,6 +24,7 @@
var/access_quartermaster = 0
var/access_hydroponics = 0
var/bot_access_flags = 0 //Bit flags. Selection: SEC_BOT|MULE_BOT|FLOOR_BOT|CLEAN_BOT|MED_BOT
var/spam_enabled = 0 //Enables "Send to All" Option
var/mode = null
var/menu
@@ -37,7 +38,7 @@
var/list/stored_data = list()
var/current_channel
var/obj/machinery/bot/active_bot
var/mob/living/simple_animal/bot/active_bot
var/list/botlist = list()
/obj/item/weapon/cartridge/engineering
@@ -89,6 +90,7 @@
name = "\improper P.R.O.V.E. cartridge"
icon_state = "cart-s"
access_security = 1
spam_enabled = 1
/obj/item/weapon/cartridge/clown
name = "\improper Honkworks 5.0 cartridge"
@@ -215,6 +217,7 @@
access_quartermaster = 1
access_janitor = 1
bot_access_flags = SEC_BOT|MULE_BOT|FLOOR_BOT|CLEAN_BOT|MED_BOT
spam_enabled = 1
/obj/item/weapon/cartridge/captain/New()
..()
@@ -549,7 +552,7 @@ Code:
menu += "<h4>Located Cleanbots:</h4>"
ldat = null
for (var/obj/machinery/bot/cleanbot/B in SSbot.processing)
for (var/mob/living/simple_animal/bot/cleanbot/B in living_mob_list)
var/turf/bl = get_turf(B)
if(bl)
@@ -710,7 +713,7 @@ Code:
/obj/item/weapon/cartridge/proc/bot_control()
var/obj/machinery/bot/Bot
var/mob/living/simple_animal/bot/Bot
// if(!SC)
// menu = "Interlink Error - Please reinsert cartridge."
@@ -723,7 +726,7 @@ Code:
//MULEs!
if(active_bot.bot_type == MULE_BOT)
var/obj/machinery/bot/mulebot/MULE = active_bot
var/mob/living/simple_animal/bot/mulebot/MULE = active_bot
var/atom/Load = MULE.load
menu += "<BR>Current Load: [ !Load ? "<i>none</i>" : "[Load.name] (<A href='byond://?src=\ref[src];mule=unload'><i>unload</i></A>)" ]<BR>"
menu += "Destination: [MULE.destination ? MULE.destination : "<i>None</i>"] (<A href='byond://?src=\ref[src];mule=destination'><i>set</i></A>)<BR>"
@@ -750,7 +753,7 @@ Code:
var/turf/current_turf = get_turf(src)
var/zlevel = current_turf.z
var/botcount = 0
for(Bot in SSbot.processing) //Git da botz
for(Bot in living_mob_list) //Git da botz
if(!Bot.on || Bot.z != zlevel || Bot.remote_disabled || !(bot_access_flags & Bot.bot_type)) //Only non-emagged bots on the same Z-level are detected!
continue //Also, the PDA must have access to the bot type.
menu += "<A href='byond://?src=\ref[src];op=control;bot=\ref[Bot]'><b>[Bot.name]</b> ([Bot.get_mode()])<BR>"
+1 -1
View File
@@ -15,7 +15,7 @@
throw_speed = 3
materials = list(MAT_METAL=50, MAT_GLASS=20)
origin_tech = "magnets=1;engineering=1"
var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage
var/obj/machinery/buffer // simple machine buffer for device linkage
hitsound = 'sound/weapons/tap.ogg'
@@ -9,4 +9,10 @@
/obj/item/weapon/grenade/syndieminibomb/prime()
update_mob()
explosion(src.loc,1,2,4,flame_range = 2)
qdel(src)
qdel(src)
/obj/item/weapon/grenade/syndieminibomb/concussion
name = "HE Grenade"
desc = "A compact shrapnel grenade meant to devestate nearby organisms and cause some damage in the process. Pull pin and throw opposite direction."
icon_state = "concussion"
origin_tech = "materials=3;magnets=4;syndicate=2"
+45 -51
View File
@@ -1,4 +1,5 @@
#define TANK_MAX_RELEASE_PRESSURE (3*ONE_ATMOSPHERE)
#define TANK_MAX_RELEASE_PRESSURE (ONE_ATMOSPHERE*3)
#define TANK_MIN_RELEASE_PRESSURE 0
#define TANK_DEFAULT_RELEASE_PRESSURE (ONE_ATMOSPHERE*O2STANDARD)
/obj/item/weapon/tank
@@ -99,7 +100,7 @@
/obj/item/weapon/tank/attackby(obj/item/weapon/W, mob/user, params)
..()
src.add_fingerprint(user)
add_fingerprint(user)
if (istype(src.loc, /obj/item/assembly))
icon = src.loc
@@ -110,16 +111,18 @@
bomb_assemble(W,user)
/obj/item/weapon/tank/attack_self(mob/user)
if (!(src.air_contents))
return
if (!user) return
interact(user)
/obj/item/weapon/tank/interact(mob/user)
add_fingerprint(user)
ui_interact(user)
/obj/item/weapon/tank/interact(mob/user, ui_key = "main")
SSnano.try_update_ui(user, src, ui_key, null, src.get_ui_data())
/obj/item/weapon/tank/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "tanks.tmpl", "Tank", 500, 300, 0)
/obj/item/weapon/tank/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, force_open = 0)
SSnano.try_update_ui(user, src, ui_key, ui, force_open = force_open)
if (!ui)
ui = new(user, src, ui_key, "tanks.tmpl", name, 525, 175, state = inventory_state)
ui.open()
/obj/item/weapon/tank/get_ui_data()
var/mob/living/carbon/location = null
@@ -133,6 +136,7 @@
data["tankPressure"] = round(air_contents.return_pressure() ? air_contents.return_pressure() : 0)
data["releasePressure"] = round(distribute_pressure ? distribute_pressure : 0)
data["defaultReleasePressure"] = round(TANK_DEFAULT_RELEASE_PRESSURE)
data["minReleasePressure"] = round(TANK_MIN_RELEASE_PRESSURE)
data["maxReleasePressure"] = round(TANK_MAX_RELEASE_PRESSURE)
data["valveOpen"] = 0
data["maskConnected"] = 0
@@ -153,51 +157,41 @@
return data
/obj/item/weapon/tank/Topic(href, href_list)
..()
if (usr.stat|| usr.restrained())
return
if (src.loc == usr)
usr.set_machine(src)
if (href_list["dist_p"])
if (href_list["dist_p"] == "reset")
src.distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE
else if (href_list["dist_p"] == "max")
src.distribute_pressure = TANK_MAX_RELEASE_PRESSURE
else
var/cp = text2num(href_list["dist_p"])
src.distribute_pressure += cp
src.distribute_pressure = min(max(round(src.distribute_pressure), 0), 3*ONE_ATMOSPHERE)
if (href_list["stat"])
if(istype(loc,/mob/living/carbon))
var/mob/living/carbon/location = loc
if(location.internal == src)
location.internal = null
if (..()) return
if (usr.stat|| usr.restrained()) return
if (href_list["dist_p"])
if (href_list["dist_p"] == "custom")
var/custom = input(usr, "What rate do you set the regulator to? The dial reads from 0 to [TANK_MAX_RELEASE_PRESSURE].") as null|num
if(isnum(custom))
href_list["dist_p"] = custom
.()
else if (href_list["dist_p"] == "reset")
distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE
else if (href_list["dist_p"] == "min")
distribute_pressure = TANK_MIN_RELEASE_PRESSURE
else if (href_list["dist_p"] == "max")
distribute_pressure = TANK_MAX_RELEASE_PRESSURE
else
distribute_pressure = text2num(href_list["dist_p"])
distribute_pressure = min(max(round(distribute_pressure), TANK_MIN_RELEASE_PRESSURE), TANK_MAX_RELEASE_PRESSURE)
if (href_list["stat"])
if(istype(loc,/mob/living/carbon))
var/mob/living/carbon/location = loc
if(location.internal == src)
location.internal = null
location.internals.icon_state = "internal0"
usr << "<span class='notice'>You close the tank release valve.</span>"
if (location.internals)
location.internals.icon_state = "internal0"
usr << "<span class='notice'>You close the tank release valve.</span>"
else
if(location.wear_mask && (location.wear_mask.flags & MASKINTERNALS))
location.internal = src
usr << "<span class='notice'>You open \the [src] valve.</span>"
if (location.internals)
location.internals.icon_state = "internal0"
location.internals.icon_state = "internal1"
else
if(location.wear_mask && (location.wear_mask.flags & MASKINTERNALS))
location.internal = src
usr << "<span class='notice'>You open \the [src] valve.</span>"
if (location.internals)
location.internals.icon_state = "internal1"
else
usr << "<span class='warning'>You need something to connect to \the [src]!</span>"
src.add_fingerprint(usr)
/*
* the following is needed for a tank lying on the floor. But currently we restrict players to use not weared tanks as intrals. --rastaf
for(var/mob/M in viewers(1, src.loc))
if ((M.client && M.machine == src))
src.attack_self(M)
*/
src.attack_self(usr)
else
usr << browse(null, "window=tank")
return
return
usr << "<span class='warning'>You need something to connect to \the [src]!</span>"
/obj/item/weapon/tank/remove_air(amount)
return air_contents.remove(amount)
@@ -25,8 +25,8 @@
/obj/item/weapon/watertank/verb/toggle_mister()
set name = "Toggle Mister"
set category = "Object"
if (usr.get_item_by_slot(slot_back) != src)
usr << "<span class='warning'>The watertank needs to be on your back to use!</span>"
if (usr.get_item_by_slot(usr.getWatertankSlot()) != src)
usr << "<span class='warning'>The watertank must be worn properly to use!</span>"
return
if(usr.incapacitated())
return
@@ -75,8 +75,8 @@
..()
/obj/item/weapon/watertank/MouseDrop(obj/over_object)
if(ishuman(src.loc))
var/mob/living/carbon/human/H = src.loc
var/mob/H = src.loc
if(istype(H))
switch(over_object.name)
if("r_hand")
if(H.r_hand)
@@ -98,6 +98,12 @@
return
..()
/mob/proc/getWatertankSlot()
return slot_back
/mob/living/simple_animal/drone/getWatertankSlot()
return slot_drone_storage
// This mister item is intended as an extension of the watertank and always attached to it.
// Therefore, it's designed to be "locked" to the player's hands or extended back onto
// the watertank backpack. Allowing it to be placed elsewhere or created without a parent
+13 -12
View File
@@ -276,15 +276,16 @@
return (OXYLOSS)
/obj/item/weapon/mounted_chainsaw
name = "mounted chainsaw"
desc = "A chainsaw that has replaced your arm."
icon_state = "chainsaw_on"
flags = ABSTRACT | NODROP
w_class = 5.0
force = 21
throwforce = 0
throw_range = 0
throw_speed = 0
sharpness = IS_SHARP
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
hitsound = "sound/weapons/chainsawhit.ogg"
name = "mounted chainsaw"
desc = "A chainsaw that has replaced your arm."
icon_state = "chainsaw_on"
item_state = "mounted_chainsaw"
flags = ABSTRACT | NODROP
w_class = 5.0
force = 21
throwforce = 0
throw_range = 0
throw_speed = 0
sharpness = IS_SHARP
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
hitsound = "sound/weapons/chainsawhit.ogg"
@@ -107,6 +107,8 @@
new /obj/item/clothing/suit/hooded/chaplain_hoodie(src)
new /obj/item/clothing/suit/holidaypriest(src)
new /obj/item/weapon/storage/backpack/cultpack (src)
new /obj/item/clothing/head/helmet/knight/templar(src)
new /obj/item/clothing/suit/armor/riot/knight/templar(src)
new /obj/item/weapon/storage/fancy/candle_box(src)
new /obj/item/weapon/storage/fancy/candle_box(src)
return
@@ -5,7 +5,7 @@
/obj/structure/closet/secure_closet/quartermaster/New()
..()
new /obj/item/clothing/cloak/qm(src)
new /obj/item/clothing/suit/cloak/qm(src)
new /obj/item/clothing/under/rank/cargo(src)
new /obj/item/clothing/shoes/sneakers/brown(src)
new /obj/item/device/radio/headset/headset_cargo(src)
@@ -5,7 +5,7 @@
/obj/structure/closet/secure_closet/engineering_chief/New()
..()
new /obj/item/clothing/cloak/ce(src)
new /obj/item/clothing/suit/cloak/ce(src)
new /obj/item/clothing/under/rank/chief_engineer(src)
new /obj/item/clothing/head/hardhat/white(src)
new /obj/item/clothing/head/welding(src)
@@ -58,7 +58,7 @@
/obj/structure/closet/secure_closet/CMO/New()
..()
new /obj/item/clothing/cloak/cmo(src)
new /obj/item/clothing/suit/cloak/cmo(src)
new /obj/item/weapon/storage/backpack/dufflebag/med(src)
new /obj/item/clothing/suit/bio_suit/cmo(src)
new /obj/item/clothing/head/bio_hood/cmo(src)
@@ -47,7 +47,7 @@
new /obj/item/weapon/storage/firstaid/brute(src)
new /obj/item/weapon/storage/firstaid/regular(src)
new /obj/item/weapon/defibrillator/compact/combat/loaded(src)
new /obj/machinery/bot/medbot(src)
new /mob/living/simple_animal/bot/medbot(src)
/obj/structure/closet/secure_closet/ertEngi
name = "engineer closet"
@@ -5,7 +5,7 @@
/obj/structure/closet/secure_closet/RD/New()
..()
new /obj/item/clothing/cloak/rd(src)
new /obj/item/clothing/suit/cloak/rd(src)
new /obj/item/clothing/suit/bio_suit/scientist(src)
new /obj/item/clothing/head/bio_hood/scientist(src)
new /obj/item/clothing/suit/toggle/labcoat(src)
@@ -10,7 +10,7 @@
new /obj/item/weapon/storage/backpack/captain(src)
else
new /obj/item/weapon/storage/backpack/satchel_cap(src)
new /obj/item/clothing/cloak/cap(src)
new /obj/item/clothing/suit/cloak/cap(src)
new /obj/item/weapon/storage/backpack/dufflebag/captain(src)
new /obj/item/clothing/suit/captunic(src)
new /obj/item/clothing/under/captainparade(src)
@@ -57,7 +57,7 @@
/obj/structure/closet/secure_closet/hos/New()
..()
new /obj/item/clothing/cloak/hos(src)
new /obj/item/clothing/suit/cloak/hos(src)
new /obj/item/weapon/cartridge/hos(src)
new /obj/item/device/radio/headset/heads/hos(src)
new /obj/item/clothing/under/hosparadefem(src)
+10 -1
View File
@@ -8,6 +8,11 @@
var/obj/structure/ladder/down = null //the ladder below this one
var/obj/structure/ladder/up = null //the ladder above this one
/obj/structure/ladder/unbreakable //mostly useful for awaymissions to prevent halting progress in a mission
name = "sturdy ladder"
desc = "An extremely sturdy metal ladder."
/obj/structure/ladder/New()
spawn(8)
for(var/obj/structure/ladder/L in world)
@@ -70,4 +75,8 @@
return attack_hand(user)
/obj/structure/ladder/attackby(obj/item/weapon/W, mob/user, params)
return attack_hand(user)
return attack_hand(user)
/obj/structure/ladder/unbreakable/Destroy()
return QDEL_HINT_LETMELIVE
+3 -1
View File
@@ -22,7 +22,9 @@
else if(istype(A, /mob/living)) // You Shall Not Pass!
var/mob/living/M = A
if(M.buckled && istype(M.buckled, /obj/machinery/bot/mulebot)) // mulebot passenger gets a free pass.
if(istype(A,/mob/living/simple_animal/bot/mulebot)) //mulebots can pass
return 1
if(M.buckled && istype(M.buckled, /mob/living/simple_animal/bot/mulebot)) // mulebot passenger gets a free pass.
return 1
if(!M.lying && !M.ventcrawler && M.mob_size != MOB_SIZE_TINY) //If your not laying down, or a ventcrawler or a small creature, no pass.
return 0