Hotfixes for March 3, 2017 (#260)
* fixes sterile mask box * fixes admin map templates https://github.com/tgstation/tgstation/pull/24581 * syndicate beacon refactor https://github.com/tgstation/tgstation/pull/24612 * singularity tracking https://github.com/tgstation/tgstation/pull/24609 * puddle description https://github.com/tgstation/tgstation/pull/24601 * aux base landing fix https://github.com/tgstation/tgstation/pull/24594 * comms console cooldown https://github.com/tgstation/tgstation/pull/24579 * cult fixes + pronouns https://github.com/tgstation/tgstation/pull/24590 * minebots now check for pressure https://github.com/tgstation/tgstation/pull/24604 * fixes a very annoying spawn https://github.com/tgstation/tgstation/pull/24588 * fixes false positive AI cheat check https://github.com/tgstation/tgstation/pull/24558 mso is bae * Fixes abductor surgery designs https://github.com/tgstation/tgstation/pull/24593 * Allows transit space shuttle repairs https://github.com/tgstation/tgstation/pull/24582 * fixes indentation error
This commit is contained in:
@@ -11,6 +11,7 @@ var/global/list/deliverybeacons = list() //list of all MULEbot delivery beacon
|
||||
var/global/list/deliverybeacontags = list() //list of all tags associated with delivery beacons.
|
||||
var/global/list/nuke_list = list()
|
||||
var/global/list/alarmdisplay = list() //list of all machines or programs that can display station alerts
|
||||
var/global/list/singularities = list() //list of all singularities on the station (actually technically all engines)
|
||||
|
||||
var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions
|
||||
var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff
|
||||
|
||||
+4
-3
@@ -42,9 +42,10 @@
|
||||
if(istype(loc, /obj/item/device/aicard) && (pixel_turf in view(client.view, loc)))
|
||||
turf_visible = TRUE
|
||||
else
|
||||
log_admin("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)])")
|
||||
message_admins("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))")
|
||||
send2irc("NOCHEAT", "[key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)]))")
|
||||
if (pixel_turf.obscured)
|
||||
log_admin("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)])")
|
||||
message_admins("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))")
|
||||
send2irc_adminless_only("NOCHEAT", "[key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)]))")
|
||||
return
|
||||
|
||||
var/list/modifiers = params2list(params)
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
T.ratvar_act(1)
|
||||
var/dir_to_step_in = pick(cardinal)
|
||||
if(!prey)
|
||||
for(var/obj/singularity/narsie/N in poi_list)
|
||||
for(var/obj/singularity/narsie/N in singularities)
|
||||
if(N.z == z)
|
||||
prey = N
|
||||
break
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
user << "<span class='warning'>An overwhelming sense of nausea overpowers you!</span>"
|
||||
user.Dizzy(120)
|
||||
else
|
||||
user << "<span class='cultlarge'>\"One of Ratvar's toys is trying to play with things [user.gender == FEMALE ? "s" : ""]he shouldn't. Cute.\"</span>"
|
||||
user << "<span class='cultlarge'>\"One of Ratvar's toys is trying to play with things [user.p_they()] shouldn't. Cute.\"</span>"
|
||||
user << "<span class='userdanger'>A horrible force yanks at your arm!</span>"
|
||||
user.emote("scream")
|
||||
user.apply_damage(30, BRUTE, pick("l_arm", "r_arm"))
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
/obj/structure/destructible/cult/attack_animal(mob/living/simple_animal/M)
|
||||
if(istype(M, /mob/living/simple_animal/hostile/construct/builder))
|
||||
if(obj_integrity < max_integrity)
|
||||
M.changeNext_move(CLICK_CD_MELEE)
|
||||
obj_integrity = min(max_integrity, obj_integrity + 5)
|
||||
Beam(M, icon_state="sendbeam", time=4)
|
||||
M.visible_message("<span class='danger'>[M] repairs \the <b>[src]</b>.</span>", \
|
||||
|
||||
@@ -35,6 +35,11 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
|
||||
var/stat_msg1
|
||||
var/stat_msg2
|
||||
|
||||
/obj/machinery/computer/communications/proc/checkCCcooldown()
|
||||
var/obj/item/weapon/circuitboard/computer/communications/CM = circuit
|
||||
if(CM.lastTimeUsed + 600 > world.time)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/communications/New()
|
||||
shuttle_caller_list += src
|
||||
@@ -264,11 +269,11 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
|
||||
// OMG CENTCOM LETTERHEAD
|
||||
if("MessageCentcomm")
|
||||
if(src.authenticated==2)
|
||||
if(CM.lastTimeUsed + 600 > world.time)
|
||||
if(!checkCCcooldown())
|
||||
usr << "<span class='warning'>Arrays recycling. Please stand by.</span>"
|
||||
return
|
||||
var/input = stripped_input(usr, "Please choose a message to transmit to Centcom via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "Send a message to Centcomm.", "")
|
||||
if(!input || !(usr in view(1,src)))
|
||||
if(!input || !(usr in view(1,src)) || !checkCCcooldown())
|
||||
return
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
|
||||
Centcomm_announce(input, usr)
|
||||
@@ -280,12 +285,12 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
|
||||
// OMG SYNDICATE ...LETTERHEAD
|
||||
if("MessageSyndicate")
|
||||
if((src.authenticated==2) && (src.emagged))
|
||||
if(CM.lastTimeUsed + 600 > world.time)
|
||||
if(!checkCCcooldown())
|
||||
usr << "<span class='warning'>Arrays recycling. Please stand by.</span>"
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
return
|
||||
var/input = stripped_input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING COORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "Send a message to /??????/.", "")
|
||||
if(!input || !(usr in view(1,src)))
|
||||
if(!input || !(usr in view(1,src)) || !checkCCcooldown())
|
||||
return
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
|
||||
Syndicate_announce(input, usr)
|
||||
@@ -301,11 +306,11 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
|
||||
|
||||
if("nukerequest") //When there's no other way
|
||||
if(src.authenticated==2)
|
||||
if(CM.lastTimeUsed + 600 > world.time)
|
||||
if(!checkCCcooldown())
|
||||
usr << "<span class='warning'>Arrays recycling. Please stand by.</span>"
|
||||
return
|
||||
var/input = stripped_input(usr, "Please enter the reason for requesting the nuclear self-destruct codes. Misuse of the nuclear request system will not be tolerated under any circumstances. Transmission does not guarantee a response.", "Self Destruct Code Request.","")
|
||||
if(!input || !(usr in view(1,src)))
|
||||
if(!input || !(usr in view(1,src)) || !checkCCcooldown())
|
||||
return
|
||||
Nuke_request(input, usr)
|
||||
usr << "<span class='notice'>Request sent.</span>"
|
||||
@@ -687,4 +692,4 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
|
||||
|
||||
/obj/machinery/computer/communications/proc/overrideCooldown()
|
||||
var/obj/item/weapon/circuitboard/computer/communications/CM = circuit
|
||||
CM.lastTimeUsed = 0
|
||||
CM.lastTimeUsed = 0
|
||||
@@ -11,6 +11,8 @@
|
||||
density = 1
|
||||
layer = BELOW_MOB_LAYER //so people can't hide it and it's REALLY OBVIOUS
|
||||
stat = 0
|
||||
verb_say = "states"
|
||||
var/cooldown = 0
|
||||
|
||||
var/active = 0
|
||||
var/icontype = "beacon"
|
||||
@@ -20,18 +22,17 @@
|
||||
if(surplus() < 1500)
|
||||
if(user) user << "<span class='notice'>The connected wire doesn't have enough current.</span>"
|
||||
return
|
||||
for(var/obj/singularity/singulo in world)
|
||||
for(var/obj/singularity/singulo in singularities)
|
||||
if(singulo.z == z)
|
||||
singulo.target = src
|
||||
icon_state = "[icontype]1"
|
||||
active = 1
|
||||
machines |= src
|
||||
if(user)
|
||||
user << "<span class='notice'>You activate the beacon.</span>"
|
||||
|
||||
|
||||
/obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user = null)
|
||||
for(var/obj/singularity/singulo in world)
|
||||
for(var/obj/singularity/singulo in singularities)
|
||||
if(singulo.target == src)
|
||||
singulo.target = null
|
||||
icon_state = "[icontype]0"
|
||||
@@ -81,12 +82,18 @@
|
||||
//stealth direct power usage
|
||||
/obj/machinery/power/singularity_beacon/process()
|
||||
if(!active)
|
||||
return PROCESS_KILL
|
||||
return
|
||||
|
||||
if(surplus() > 1500)
|
||||
add_load(1500)
|
||||
if(cooldown <= world.time)
|
||||
cooldown = world.time + 100
|
||||
for(var/obj/singularity/singulo in singularities)
|
||||
if(singulo.z == z)
|
||||
say("The [singulo] is now [get_dist(src,singulo)] standard lengths away to the [dir2text(get_dir(src,singulo))]")
|
||||
else
|
||||
if(surplus() > 1500)
|
||||
add_load(1500)
|
||||
else
|
||||
Deactivate()
|
||||
Deactivate()
|
||||
say("Insufficient charge detected - powering down")
|
||||
|
||||
|
||||
/obj/machinery/power/singularity_beacon/syndicate
|
||||
@@ -120,4 +127,4 @@
|
||||
/obj/item/device/sbeacondrop/powersink
|
||||
desc = "A label on it reads: <i>Warning: Activating this device will send a power draining device to your location</i>."
|
||||
droptype = /obj/item/device/powersink
|
||||
origin_tech = "bluespace=4;syndicate=5"
|
||||
origin_tech = "bluespace=4;syndicate=5"
|
||||
@@ -156,10 +156,7 @@
|
||||
//BubbleWrap END
|
||||
|
||||
if (src && usr.machine==src) //do not reopen closed window
|
||||
spawn( 0 )
|
||||
src.interact(usr)
|
||||
return
|
||||
return
|
||||
addtimer(CALLBACK(src, /atom/.proc/interact, usr), 0)
|
||||
|
||||
/obj/item/stack/proc/building_checks(datum/stack_recipe/R, multiplier)
|
||||
if (src.get_amount() < R.req_amount*multiplier)
|
||||
|
||||
@@ -147,7 +147,7 @@
|
||||
/obj/item/weapon/storage/box/masks
|
||||
name = "box of sterile masks"
|
||||
desc = "This box contains sterile medical masks."
|
||||
icon_state = "sterile"
|
||||
illustration = "sterile"
|
||||
|
||||
/obj/item/weapon/storage/box/masks/New()
|
||||
..()
|
||||
|
||||
@@ -520,6 +520,7 @@
|
||||
|
||||
/obj/structure/sink/puddle //splishy splashy ^_^
|
||||
name = "puddle"
|
||||
desc = "A puddle used for washing one's hands and face."
|
||||
icon_state = "puddle"
|
||||
|
||||
/obj/structure/sink/puddle/attack_hand(mob/M)
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
/turf/open/space/Initialize()
|
||||
icon_state = SPACE_ICON_STATE
|
||||
air = space_gas
|
||||
|
||||
|
||||
if(initialized)
|
||||
stack_trace("Warning: [src]([type]) initialized multiple times!")
|
||||
initialized = TRUE
|
||||
@@ -60,9 +60,11 @@
|
||||
/turf/open/space/attack_paw(mob/user)
|
||||
return src.attack_hand(user)
|
||||
|
||||
/turf/open/space/attackby(obj/item/C, mob/user, params)
|
||||
/turf/open/space/attackby(obj/item/C, mob/user, area_restriction)
|
||||
..()
|
||||
if(istype(C, /obj/item/stack/rods))
|
||||
if(area_restriction && !istype(get_area(src), area_restriction))
|
||||
return
|
||||
var/obj/item/stack/rods/R = C
|
||||
var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
|
||||
var/obj/structure/lattice/catwalk/W = locate(/obj/structure/lattice/catwalk, src)
|
||||
|
||||
@@ -57,9 +57,9 @@
|
||||
AM.loc = T
|
||||
AM.newtonian_move(dir)
|
||||
|
||||
//Overwrite because we dont want people building rods in space.
|
||||
/turf/open/space/transit/attackby()
|
||||
return
|
||||
//Overwrite because we dont want people building rods
|
||||
/turf/open/space/transit/attackby(obj/item/C, mob/user)
|
||||
..(C, user, /area/shuttle)
|
||||
|
||||
/turf/open/space/transit/Initialize()
|
||||
..()
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
usr << "Bad map file: [map]"
|
||||
return
|
||||
|
||||
var/datum/map_template/M = new(map=map, rename="[map]")
|
||||
var/datum/map_template/M = new(map, "[map]")
|
||||
if(M.preload_size(map))
|
||||
usr << "Map template '[map]' ready to place ([M.width]x[M.height])"
|
||||
SSmapping.map_templates[M.name] = M
|
||||
|
||||
@@ -302,19 +302,16 @@ obj/docking_port/stationary/public_mining_dock/onShuttleMove()
|
||||
if(!Mport)
|
||||
user << "<span class='warning'>This station is not equipped with an approprite mining shuttle. Please contact Nanotrasen Support.</span>"
|
||||
return
|
||||
var/search_radius = max(Mport.width, Mport.height)*0.5
|
||||
var/list/landing_areas = get_areas_in_range(search_radius, landing_spot)
|
||||
for(var/area/shuttle/auxillary_base/AB in landing_areas) //You land NEAR the base, not IN it.
|
||||
user << "<span class='warning'>The mining shuttle must not land within the mining base itself.</span>"
|
||||
SSshuttle.stationary.Remove(Mport)
|
||||
qdel(Mport)
|
||||
return
|
||||
|
||||
var/obj/docking_port/mobile/mining_shuttle
|
||||
var/list/landing_turfs = list() //List of turfs where the mining shuttle may land.
|
||||
for(var/S in SSshuttle.mobile)
|
||||
var/obj/docking_port/mobile/MS = S
|
||||
if(MS.id != "mining")
|
||||
continue
|
||||
mining_shuttle = MS
|
||||
landing_turfs = mining_shuttle.return_ordered_turfs(x,y,z,dir)
|
||||
break
|
||||
|
||||
if(!mining_shuttle) //Not having a mining shuttle is a map issue
|
||||
user << "<span class='warning'>No mining shuttle signal detected. Please contact Nanotrasen Support.</span>"
|
||||
@@ -322,6 +319,13 @@ obj/docking_port/stationary/public_mining_dock/onShuttleMove()
|
||||
qdel(Mport)
|
||||
return
|
||||
|
||||
for(var/L in landing_turfs) //You land NEAR the base, not IN it.
|
||||
if(istype(get_area(L), /area/shuttle/auxillary_base))
|
||||
user << "<span class='warning'>The mining shuttle must not land within the mining base itself.</span>"
|
||||
SSshuttle.stationary.Remove(Mport)
|
||||
qdel(Mport)
|
||||
return
|
||||
|
||||
if(!mining_shuttle.canDock(Mport))
|
||||
user << "<span class='warning'>Unable to secure a valid docking zone. Please try again in an open area near, but not within the aux. mining base.</span>"
|
||||
SSshuttle.stationary.Remove(Mport)
|
||||
@@ -331,7 +335,7 @@ obj/docking_port/stationary/public_mining_dock/onShuttleMove()
|
||||
aux_base_console.set_mining_mode() //Lets the colony park the shuttle there, now that it has a dock.
|
||||
user << "<span class='notice'>Mining shuttle calibration successful! Shuttle interface available at base console.</span>"
|
||||
anchored = 1 //Locks in place to mark the landing zone.
|
||||
playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
|
||||
playsound(loc, 'sound/machines/ping.ogg', 50, 0)
|
||||
|
||||
/obj/structure/mining_shuttle_beacon/proc/clear_cooldown()
|
||||
anti_spam_cd = 0
|
||||
|
||||
@@ -319,7 +319,7 @@ field_generator power level display
|
||||
//I want to avoid using global variables.
|
||||
spawn(1)
|
||||
var/temp = 1 //stops spam
|
||||
for(var/obj/singularity/O in world)
|
||||
for(var/obj/singularity/O in singularities)
|
||||
if(O.last_warning && temp)
|
||||
if((world.time - O.last_warning) > 50) //to stop message-spam
|
||||
temp = 0
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
poi_list |= src
|
||||
singularities |= src
|
||||
for(var/obj/machinery/power/singularity_beacon/singubeacon in machines)
|
||||
if(singubeacon.active)
|
||||
target = singubeacon
|
||||
@@ -45,6 +46,7 @@
|
||||
/obj/singularity/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
poi_list.Remove(src)
|
||||
singularities.Remove(src)
|
||||
return ..()
|
||||
|
||||
/obj/singularity/Move(atom/newloc, direct)
|
||||
|
||||
@@ -138,7 +138,6 @@
|
||||
iconF = "flight_on"
|
||||
add_overlay(image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset))
|
||||
|
||||
|
||||
//Casing
|
||||
/obj/item/ammo_casing/energy/kinetic
|
||||
projectile_type = /obj/item/projectile/kinetic
|
||||
@@ -152,17 +151,6 @@
|
||||
var/obj/item/weapon/gun/energy/kinetic_accelerator/KA = loc
|
||||
KA.modify_projectile(BB)
|
||||
|
||||
var/turf/proj_turf = get_turf(BB)
|
||||
if(!isturf(proj_turf))
|
||||
return
|
||||
var/datum/gas_mixture/environment = proj_turf.return_air()
|
||||
var/pressure = environment.return_pressure()
|
||||
if(pressure > 50)
|
||||
BB.name = "weakened [BB.name]"
|
||||
var/obj/item/projectile/kinetic/K = BB
|
||||
K.damage *= K.pressure_decrease
|
||||
|
||||
|
||||
//Projectiles
|
||||
/obj/item/projectile/kinetic
|
||||
name = "kinetic force"
|
||||
@@ -178,6 +166,17 @@
|
||||
var/mob_aoe = 0
|
||||
var/list/hit_overlays = list()
|
||||
|
||||
/obj/item/projectile/kinetic/prehit(atom/target)
|
||||
var/turf/target_turf = get_turf(target)
|
||||
if(!isturf(target_turf))
|
||||
return
|
||||
var/datum/gas_mixture/environment = target_turf.return_air()
|
||||
var/pressure = environment.return_pressure()
|
||||
if(pressure > 50)
|
||||
name = "weakened [name]"
|
||||
damage = damage * pressure_decrease
|
||||
. = ..()
|
||||
|
||||
/obj/item/projectile/kinetic/on_range()
|
||||
strike_thing()
|
||||
..()
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
name = "Alien Scalpel"
|
||||
desc = "An advanced scalpel obtained through Abductor technology."
|
||||
id = "alien_scalpel"
|
||||
req_tech = list("bio" = 4, "materials" = 4, "abductor" = 3)
|
||||
req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
|
||||
build_path = /obj/item/weapon/scalpel/alien
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
|
||||
@@ -129,7 +129,7 @@
|
||||
name = "Alien Hemostat"
|
||||
desc = "An advanced hemostat obtained through Abductor technology."
|
||||
id = "alien_hemostat"
|
||||
req_tech = list("bio" = 4, "materials" = 4, "abductor" = 3)
|
||||
req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
|
||||
build_path = /obj/item/weapon/hemostat/alien
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
|
||||
@@ -139,7 +139,7 @@
|
||||
name = "Alien Retractor"
|
||||
desc = "An advanced retractor obtained through Abductor technology."
|
||||
id = "alien_retractor"
|
||||
req_tech = list("bio" = 4, "materials" = 4, "abductor" = 3)
|
||||
req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
|
||||
build_path = /obj/item/weapon/retractor/alien
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
|
||||
@@ -149,7 +149,7 @@
|
||||
name = "Alien Circular Saw"
|
||||
desc = "An advanced surgical saw obtained through Abductor technology."
|
||||
id = "alien_saw"
|
||||
req_tech = list("bio" = 4, "materials" = 4, "abductor" = 3)
|
||||
req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
|
||||
build_path = /obj/item/weapon/circular_saw/alien
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 1500)
|
||||
@@ -159,7 +159,7 @@
|
||||
name = "Alien Drill"
|
||||
desc = "An advanced drill obtained through Abductor technology."
|
||||
id = "alien_drill"
|
||||
req_tech = list("bio" = 4, "materials" = 4, "abductor" = 3)
|
||||
req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
|
||||
build_path = /obj/item/weapon/surgicaldrill/alien
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 1500)
|
||||
@@ -169,7 +169,7 @@
|
||||
name = "Alien Cautery"
|
||||
desc = "An advanced cautery obtained through Abductor technology."
|
||||
id = "alien_cautery"
|
||||
req_tech = list("bio" = 4, "materials" = 4, "abductor" = 3)
|
||||
req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
|
||||
build_path = /obj/item/weapon/cautery/alien
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
|
||||
|
||||
Reference in New Issue
Block a user