Merge branch 'master' into upstream-merge-12029

This commit is contained in:
Nadyr
2022-01-09 20:18:25 -05:00
committed by GitHub
12 changed files with 273 additions and 132 deletions
+2 -1
View File
@@ -1,8 +1,9 @@
/datum/category_item/autolathe/medical/autoinjector
name = "empty autoinjector"
path =/obj/item/weapon/reagent_containers/hypospray/autoinjector/empty
resources = list(MAT_PLASTIC = 10) //for recycling purposes mostly
/datum/category_item/autolathe/medical/autoinjector/biginjector
name = "empty large autoinjector"
path =/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/empty
resources = list(MAT_PLASTIC = 2000)
resources = list(MAT_PLASTIC = 500)
@@ -159,16 +159,12 @@
/obj/item/weapon/cell, //this is a bigger belt, might as well make it hold bigger cells too
/obj/item/weapon/pipe_dispenser, //bigger belt for bigger tools
/obj/item/weapon/rcd, //see above
<<<<<<< HEAD
/obj/item/device/quantum_pad_booster
=======
/obj/item/device/quantum_pad_booster,
/obj/item/weapon/inducer,
/obj/item/stack/material/steel,
/obj/item/stack/material/glass,
/obj/item/device/lightreplacer,
/obj/item/weapon/pickaxe/plasmacutter
>>>>>>> 22a34d927bf... Merge pull request #12029 from PastelPrinceDan/beltstufftake2
)
@@ -533,4 +529,4 @@
name = "ranger belt"
desc = "The fancy utility-belt holding the tools, cuffs and gadgets of the Go Go ERT-Rangers. The belt buckle is not real phoron, but it is still surprisingly comfortable to wear."
icon = 'icons/obj/clothing/ranger.dmi'
icon_state = "ranger_belt"
icon_state = "ranger_belt"
@@ -73,7 +73,7 @@
/obj/item/rig_module/rad_shield/advanced
name = "advanced radiation absorption device"
desc = "The acronym of this device - R.A.D. - and its full name both convey the application of the module. It has additional quality notices \
desc = "The acronym of this device - R.A.D. - and its full name both convey the application of the module. It has a changelog inscribed \
on the underside of the casing."
use_power_cost = 5
active_power_cost = 5
@@ -86,6 +86,10 @@
//The actual top-level ranged attack proc
/mob/living/simple_mob/proc/shoot_target(atom/A)
set waitfor = FALSE
if(!istype(A) || QDELETED(A))
return
setClickCooldown(get_attack_speed())
face_atom(A)
@@ -304,6 +304,10 @@
/mob/living/simple_mob/humanoid/merc/ranged/sniper/shoot_target(atom/A)
set waitfor = FALSE
if(!istype(A) || QDELETED(A))
return
setClickCooldown(get_attack_speed())
face_atom(A)
@@ -62,4 +62,11 @@
icon_state = "Guilmon_Horns"
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
/datum/sprite_accessory/ears/una_bighorns
name = "Unathi Big Horns"
icon = 'icons/mob/Human_face_m.dmi'
icon_state = "unathi_bighorn"
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
-122
View File
@@ -1,122 +0,0 @@
/obj/structure/portal_subtle
name = "portal"
desc = "Looks unstable. Best to test it with the clown."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "portal"
density = TRUE
unacidable = TRUE//Can't destroy energy portals.
var/failchance = 0
anchored = TRUE
var/obj/structure/portal_subtle/target
/obj/structure/portal_subtle/Destroy()
if(target)
target.target = null
target = null
return ..()
/obj/structure/portal_subtle/Bumped(mob/M as mob|obj)
if(istype(M,/mob) && !(istype(M,/mob/living)))
return //do not send ghosts, zshadows, ai eyes, etc
spawn(0)
src.teleport(M)
return
return
/obj/structure/portal_subtle/Crossed(AM as mob|obj)
if(istype(AM,/mob) && !(istype(AM,/mob/living)))
return //do not send ghosts, zshadows, ai eyes, etc
spawn(0)
src.teleport(AM)
return
return
/obj/structure/portal_subtle/attack_hand(mob/user as mob)
if(istype(user) && !(istype(user,/mob/living)))
return //do not send ghosts, zshadows, ai eyes, etc
spawn(0)
src.teleport(user)
return
return
/obj/structure/portal_subtle/proc/teleport(atom/movable/M as mob|obj)
if(istype(M, /obj/effect)) //sparks don't teleport
return
if (M.anchored&&istype(M, /obj/mecha))
return
if (icon_state == "portal1")
return
if (!( target ))
qdel(src)
return
if (istype(target, /obj/structure/portal_subtle))
qdel(src)
return
if (istype(M, /atom/movable))
if(prob(failchance)) //oh dear a problem, put em in deep space
src.icon_state = "portal1"
do_noeffect_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0)
else
do_noeffect_teleport(M, target, 0) ///You will appear on the beacon
/obj/structure/portal_gateway
name = "portal"
desc = "Looks unstable. Best to test it with the clown."
icon = 'icons/obj/stationobjs_vr.dmi'
icon_state = "portalgateway"
density = TRUE
unacidable = TRUE//Can't destroy energy portals.
anchored = TRUE
/obj/structure/portal_gateway/Bumped(mob/M as mob|obj)
if(istype(M,/mob) && !(istype(M,/mob/living)))
return //do not send ghosts, zshadows, ai eyes, etc
var/obj/effect/landmark/dest = pick(eventdestinations)
if(dest)
M << 'sound/effects/phasein.ogg'
playsound(src, 'sound/effects/phasein.ogg', 100, 1)
M.forceMove(dest.loc)
if(istype(M, /mob/living) && dest.abductor)
var/mob/living/L = M
//Situations to get the mob out of
if(L.buckled)
L.buckled.unbuckle_mob()
if(istype(L.loc,/obj/mecha))
var/obj/mecha/ME = L.loc
ME.go_out()
else if(istype(L.loc,/obj/machinery/sleeper))
var/obj/machinery/sleeper/SL = L.loc
SL.go_out()
else if(istype(L.loc,/obj/machinery/recharge_station))
var/obj/machinery/recharge_station/RS = L.loc
RS.go_out()
if(!issilicon(L)) //Don't drop borg modules...
var/list/mob_contents = list() //Things which are actually drained as a result of the above not being null.
mob_contents |= L // The recursive check below does not add the object being checked to its list.
mob_contents |= recursive_content_check(L, mob_contents, recursion_limit = 3, client_check = 0, sight_check = 0, include_mobs = 1, include_objects = 1, ignore_show_messages = 1)
for(var/obj/item/weapon/holder/I in mob_contents)
var/obj/item/weapon/holder/H = I
var/mob/living/MI = H.held_mob
MI.forceMove(get_turf(H))
if(!issilicon(MI)) //Don't drop borg modules...
for(var/obj/item/II in MI)
if(istype(II,/obj/item/weapon/implant) || istype(II,/obj/item/device/nif))
continue
MI.drop_from_inventory(II, dest.loc)
var/obj/effect/landmark/finaldest = pick(awayabductors)
MI.forceMove(finaldest.loc)
sleep(1)
MI.Paralyse(10)
MI << 'sound/effects/bamf.ogg'
to_chat(MI,"<span class='warning'>You're starting to come to. You feel like you've been out for a few minutes, at least...</span>")
for(var/obj/item/I in L)
if(istype(I,/obj/item/weapon/implant) || istype(I,/obj/item/device/nif))
continue
L.drop_from_inventory(I, dest.loc)
var/obj/effect/landmark/finaldest = pick(awayabductors)
L.forceMove(finaldest.loc)
sleep(1)
L.Paralyse(10)
L << 'sound/effects/bamf.ogg'
to_chat(L,"<span class='warning'>You're starting to come to. You feel like you've been out for a few minutes, at least...</span>")
return
+227
View File
@@ -0,0 +1,227 @@
/obj/structure/portal_event
name = "portal"
desc = "It leads to someplace else!"
icon = 'icons/obj/stationobjs_vr.dmi'
icon_state = "type-d-portal"
density = TRUE
unacidable = TRUE//Can't destroy energy portals.
var/failchance = 0
anchored = TRUE
var/obj/structure/portal_event/target
/obj/structure/portal_event/Destroy()
if(target)
target.target = null
target = null
return ..()
/obj/structure/portal_event/Bumped(mob/M as mob|obj)
if(istype(M,/mob) && !(istype(M,/mob/living)))
return //do not send ghosts, zshadows, ai eyes, etc
spawn(0)
src.teleport(M)
return
return
/obj/structure/portal_event/Crossed(AM as mob|obj)
if(istype(AM,/mob) && !(istype(AM,/mob/living)))
return //do not send ghosts, zshadows, ai eyes, etc
spawn(0)
src.teleport(AM)
return
return
/obj/structure/portal_event/attack_hand(mob/user as mob)
if(!istype(user))
return
if(!target)
if(isliving(user))
to_chat(user, "<span class='notice'>Your hand scatters \the [src]...</span>")
qdel(src) //Delete portals which aren't set that people mess with.
else return //do not send ghosts, zshadows, ai eyes, etc
else if(isliving(user) || istype(user, /mob/observer/dead) && user?.client?.holder) //unless they're staff
spawn(0)
src.teleport(user)
/obj/structure/portal_event/attack_ghost(var/mob/observer/dead/user)
if(!target && user?.client?.holder)
to_chat(user, "<span class='notice'>Selecting 'Portal Here' will create and link a portal at your location, while 'Target Here' will create an object that is only visible to ghosts which will act as the target, again at your location. Each option will give you the ability to change portal types, but for all options except 'Select Type' you only get one shot at it, so be sure to experiment with 'Select Type' first if you're not familiar with them.</span>")
var/response = tgui_alert(user, "You appear to be staff. This portal has no exit point. If you want to make one, move to where you want it to go, and click the appropriate option, see chat for more info, otherwise click 'Cancel'", "Unbound Portal", list("Cancel","Portal Here","Target Here", "Select Type"))
if(response == "Portal Here")
target = new type(get_turf(user), src)
target.target = src
target.icon_state = icon_state
var/letsportal = tgui_alert(user, "Would you like to select a different portal type for these portals?", "Change portal", list("No","Yes"))
if(letsportal == "Yes")
var/portal_icon_selection = select_portal_subtype(user)
icon_state = portal_icon_selection
target.icon_state = portal_icon_selection
if(response == "Target Here")
var/obj/structure/portal_target/newtarg = new(get_turf(user))
target = newtarg
newtarg.target = src
var/letsportal = tgui_alert(user, "Would you like to select a different portal type?", "Change portal", list("No","Yes"))
if(letsportal == "Yes")
user.forceMove(src)
icon_state = select_portal_subtype(user)
if(response == "Select Type")
icon_state = select_portal_subtype(user)
return
message_admins("The [src]([x],[y],[z]) was given [target]([target.x],[target.y],[target.z]) as a target, and should be ready to use.")
else if(user?.client?.holder)
src.teleport(user)
else return
/obj/structure/portal_event/proc/select_portal_subtype(user)
var/portal_type = tgui_alert(user, "What kind of portal would you like it to be?", "Type Selection", list("Tech (Default)","Star","Weird Green","Pulsing"))
var/portal_icon_selection = "type-d-portal"
if(portal_type == "Tech (Default)")
portal_icon_selection = "type-d-portal"
if(portal_type == "Star")
var/portal_subtype = tgui_alert(user, "Which subtype would you prefer?", "Subtype Selection", list("Blue","Blue Pulse","Blue Unstable","Red","Red Unstable"))
if(portal_subtype == "Blue")
portal_icon_selection = "type-a-blue-portal"
if(portal_subtype == "Blue Pulse")
portal_icon_selection = "type-a-blue-portal-b"
if(portal_subtype == "Blue Unstable")
portal_icon_selection = "type-a-blue-portal-c"
if(portal_subtype == "Red")
portal_icon_selection = "type-a-red-portal"
if(portal_subtype == "Red Unstable")
portal_icon_selection = "type-a-red-portal-b"
if(portal_type == "Weird Green")
portal_icon_selection = "type-b-portal"
if(portal_type == "Pulsing")
var/portal_subtype = tgui_alert(user, "Which subtype would you prefer?", "Subtype Selection", list("Blue","Red","Blue/Red Mix", "Yellow"))
if(portal_subtype == "Blue")
portal_icon_selection = "type-c-blue-portal"
if(portal_subtype == "Red")
portal_icon_selection = "type-c-red-portal"
if(portal_subtype == "Blue/Red Mix")
portal_icon_selection = "type-c-mix-portal"
if(portal_subtype == "Yellow")
portal_icon_selection = "type-c-yellow-portal"
return portal_icon_selection
/obj/structure/portal_event/proc/teleport(atom/movable/M as mob|obj)
if(istype(M, /obj/effect)) //sparks don't teleport
return
if (M.anchored&&istype(M, /obj/mecha))
return
if (!target)
to_chat(M, "<span class='notice'>\The [src] scatters as you pass through it...</span>")
qdel(src)
return
if (!istype(M, /atom/movable))
return
var/turf/place
if(isturf(target))
place = src
else
place = target.loc
var/portalfind = FALSE
for(var/obj/structure/S in place.contents)
if(istype(S, /obj/structure/portal_event))
portalfind = TRUE
else if (S.density)
portalfind = TRUE
var/temptarg
if(portalfind)
var/possible_turfs = place.AdjacentTurfs()
if(isemptylist(possible_turfs))
to_chat(M, "<span class='notice'>Something blocks your way.</span>")
return
temptarg = pick(possible_turfs)
do_noeffect_teleport(M, temptarg, 0)
else if (istype(M, /atom/movable))
do_noeffect_teleport(M, target, 0)
/obj/structure/portal_event/Destroy()
if(target)
if(istype(target, /obj/structure/portal_event))
var/obj/structure/portal_event/P = target
P.target = null
if(istype(target, /obj/structure/portal_target))
var/obj/structure/portal_target/P = target
P.target = null
qdel_null(target)
. = ..()
/obj/structure/portal_target
name = "portal destination"
desc = "you shouldn't see this unless you're a ghost"
icon = 'icons/obj/stationobjs_vr.dmi'
icon_state = "type-b-portal"
density = 0
alpha = 100
invisibility = INVISIBILITY_OBSERVER
var/target
/obj/structure/portal_target/Destroy()
if(target)
var/obj/structure/portal_event/T = target
T.target = null
target = null
. = ..()
/obj/structure/portal_gateway
name = "portal"
desc = "It leads to someplace else!"
icon = 'icons/obj/stationobjs_vr.dmi'
icon_state = "portalgateway"
density = TRUE
unacidable = TRUE//Can't destroy energy portals.
anchored = TRUE
/obj/structure/portal_gateway/Bumped(mob/M as mob|obj)
if(istype(M,/mob) && !(istype(M,/mob/living)))
return //do not send ghosts, zshadows, ai eyes, etc
var/obj/effect/landmark/dest = pick(eventdestinations)
if(dest)
M << 'sound/effects/phasein.ogg'
playsound(src, 'sound/effects/phasein.ogg', 100, 1)
M.forceMove(dest.loc)
if(istype(M, /mob/living) && dest.abductor)
var/mob/living/L = M
//Situations to get the mob out of
if(L.buckled)
L.buckled.unbuckle_mob()
if(istype(L.loc,/obj/mecha))
var/obj/mecha/ME = L.loc
ME.go_out()
else if(istype(L.loc,/obj/machinery/sleeper))
var/obj/machinery/sleeper/SL = L.loc
SL.go_out()
else if(istype(L.loc,/obj/machinery/recharge_station))
var/obj/machinery/recharge_station/RS = L.loc
RS.go_out()
if(!issilicon(L)) //Don't drop borg modules...
var/list/mob_contents = list() //Things which are actually drained as a result of the above not being null.
mob_contents |= L // The recursive check below does not add the object being checked to its list.
mob_contents |= recursive_content_check(L, mob_contents, recursion_limit = 3, client_check = 0, sight_check = 0, include_mobs = 1, include_objects = 1, ignore_show_messages = 1)
for(var/obj/item/weapon/holder/I in mob_contents)
var/obj/item/weapon/holder/H = I
var/mob/living/MI = H.held_mob
MI.forceMove(get_turf(H))
if(!issilicon(MI)) //Don't drop borg modules...
for(var/obj/item/II in MI)
if(istype(II,/obj/item/weapon/implant) || istype(II,/obj/item/device/nif))
continue
MI.drop_from_inventory(II, dest.loc)
var/obj/effect/landmark/finaldest = pick(awayabductors)
MI.forceMove(finaldest.loc)
sleep(1)
MI.Paralyse(10)
MI << 'sound/effects/bamf.ogg'
to_chat(MI,"<span class='warning'>You're starting to come to. You feel like you've been out for a few minutes, at least...</span>")
for(var/obj/item/I in L)
if(istype(I,/obj/item/weapon/implant) || istype(I,/obj/item/device/nif))
continue
L.drop_from_inventory(I, dest.loc)
var/obj/effect/landmark/finaldest = pick(awayabductors)
L.forceMove(finaldest.loc)
sleep(1)
L.Paralyse(10)
L << 'sound/effects/bamf.ogg'
to_chat(L,"<span class='warning'>You're starting to come to. You feel like you've been out for a few minutes, at least...</span>")
return
+24
View File
@@ -1048,6 +1048,30 @@
materials = list(MAT_DURASTEEL = 5000, MAT_GRAPHITE = 3000, MAT_MORPHIUM = 1500, MAT_OSMIUM = 1500, MAT_PHORON = 1750, MAT_VERDANTIUM = 3000, MAT_SUPERMATTER = 2000)
build_path = /obj/item/rig_module/teleporter
/datum/design/item/mechfab/rigsuit/radshield
name = "hardsuit radiation absorption device"
desc = "A miniaturized radiation absorption array, for use in hardsuits and providing full radiation protection."
id = "rig_component_radshield"
req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 3, TECH_MAGNET = 4, TECH_POWER = 3, TECH_BLUESPACE = 4)
materials = list(MAT_STEEL = 8000, MAT_GRAPHITE = 3000, MAT_OSMIUM = 1500, MAT_PHORON = 2250, MAT_SILVER = 1500, MAT_GOLD = 1500)
build_path = /obj/item/rig_module/rad_shield
/datum/design/item/mechfab/rigsuit/radshield_adv
name = "hardsuit advanced radiation absorption device"
desc = "An optimized, miniaturized radiation absorption array, for use in hardsuits and providing full radiation protection. Reduced power draw."
id = "rig_component_radshield_adv"
req_tech = list(TECH_MATERIAL = 7, TECH_ENGINEERING = 5, TECH_MAGNET = 5, TECH_POWER = 6, TECH_BLUESPACE = 4)
materials = list(MAT_PLASTEEL = 8000, MAT_GRAPHITE = 4000, MAT_OSMIUM = 2000, MAT_PHORON = 3250, MAT_SILVER = 2250, MAT_GOLD = 2250)
build_path = /obj/item/rig_module/rad_shield/advanced
/datum/design/item/mechfab/rigsuit/atmosshield
name = "hardsuit atmospheric protection enhancement suite"
desc = "An advanced atmospheric protection suite, providing protection against both pressure and heat. At the cost of concerningly high power draw."
id = "rig_component_atmosshield"
req_tech = list(TECH_MATERIAL = 7, TECH_ENGINEERING = 5, TECH_MAGNET = 5, TECH_POWER = 6, TECH_BLUESPACE = 4)
materials = list(MAT_PLASTEEL = 8000, MAT_DURASTEEL = 4000, MAT_GRAPHITE = 8000, MAT_OSMIUM = 6000, MAT_PHORON = 6000, MAT_SILVER = 4000, MAT_GOLD = 4000)
build_path = /obj/item/rig_module/atmos_shield
/datum/design/item/mechfab/uav/basic
name = "UAV - Recon Skimmer"
id = "recon_skimmer"
+1 -1
View File
@@ -173,7 +173,7 @@
var/mob/living/simple_mob/SA = M
if(!SA.has_hands)
return 0
if(size_diff >= 0.50 || mob_size < MOB_SMALL)
if(size_diff >= 0.50 || mob_size < MOB_SMALL || size_diff >= get_effective_size())
if(buckled)
to_chat(usr,"<span class='notice'>You have to unbuckle \the [src] before you pick them up.</span>")
return 0
Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 80 KiB

+1 -1
View File
@@ -3471,11 +3471,11 @@
#include "code\modules\multiz\hoist.dm"
#include "code\modules\multiz\ladder_assembly_vr.dm"
#include "code\modules\multiz\ladders.dm"
#include "code\modules\multiz\ladders_vr.dm"
#include "code\modules\multiz\misc.dm"
#include "code\modules\multiz\movement.dm"
#include "code\modules\multiz\movement_vr.dm"
#include "code\modules\multiz\pipes.dm"
#include "code\modules\multiz\portals_vr.dm"
#include "code\modules\multiz\stairs.dm"
#include "code\modules\multiz\turf.dm"
#include "code\modules\multiz\turf_yw.dm"