mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-21 07:32:02 +00:00
[Ready for review until the inevitable map conflicts] Firing pins (#3375)
I'm going full steam ahead with this. Adds firing pins/ Authentication mechanisms. these are needed to fire any specific weapon. Weapons generally spawn with firing pins in them. or at least should. The exception to this is anything made in R&D - which needs to secure a firing pin from somewhere. There's currently the following firing pins: One that checks for a specific implant, EG a loyalty implant one. One that always fails, and can replace other pins. (this one would likely be admin only. it's clown themed) The Laser tag code got refactored to the pins. so each gun has a different pin. if you somehow got this pin, you could make it so you could only shoot a gun while wearing a laser tag vest, for example. A Testing range pin, which only allows firing in specific areas - of which are mapped in currently. A DNA locked one. and a subtype which will explode if someone else tries to use it. the system's designed to be easy enough to add on to. Feedback fourm is here:
This commit is contained in:
@@ -1938,6 +1938,7 @@
|
||||
#include "code\modules\projectiles\ammunition.dm"
|
||||
#include "code\modules\projectiles\effects.dm"
|
||||
#include "code\modules\projectiles\gun.dm"
|
||||
#include "code\modules\projectiles\pins.dm"
|
||||
#include "code\modules\projectiles\projectile.dm"
|
||||
#include "code\modules\projectiles\ammunition\boxes.dm"
|
||||
#include "code\modules\projectiles\ammunition\bullets.dm"
|
||||
|
||||
@@ -174,6 +174,7 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
|
||||
#define RAD_SHIELDED 1 //shielded from radiation, clearly
|
||||
#define SPAWN_ROOF 2 // if we should attempt to spawn a roof above us.
|
||||
#define HIDE_FROM_HOLOMAP 4 // if we shouldn't be drawn on station holomaps
|
||||
#define FIRING_RANGE 8
|
||||
|
||||
// Convoluted setup so defines can be supplied by Bay12 main server compile script.
|
||||
// Should still work fine for people jamming the icons into their repo.
|
||||
|
||||
@@ -15,6 +15,13 @@
|
||||
path = /obj/item/weapon/storage/secure/briefcase/money
|
||||
desc = "A briefcase with 10,000 untraceable credits for funding your sneaky activities."
|
||||
|
||||
/datum/uplink_item/item/tools/firingpin //todo, make this a special syndicate one instead of just a normal one?
|
||||
name = "Firing Pin"
|
||||
item_cost = 2
|
||||
path = /obj/item/device/firing_pin
|
||||
desc = "A Syndicate-branded Firing pin - It should be compatible with nearly every weapon onboard."
|
||||
|
||||
|
||||
/datum/uplink_item/item/tools/clerical
|
||||
name = "Morphic Clerical Kit"
|
||||
item_cost = 3
|
||||
|
||||
@@ -650,7 +650,8 @@
|
||||
/obj/item/ammo_magazine/c45x = 6,
|
||||
/obj/item/ammo_magazine/a556 = 12,
|
||||
/obj/item/ammo_magazine/a556/ap = 4,
|
||||
/obj/item/weapon/material/hatchet/tacknife = 4
|
||||
/obj/item/weapon/material/hatchet/tacknife = 4,
|
||||
/obj/item/device/firing_pin = 12
|
||||
)
|
||||
|
||||
//This one's from bay12
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
* Kitchen utensil box
|
||||
* Random preserved snack box
|
||||
* For syndicate call-ins see uplink_kits.dm
|
||||
* Firing pin boxes - Testing and Normal. one for sec, one for science.
|
||||
*/
|
||||
|
||||
/obj/item/weapon/storage/box
|
||||
@@ -338,6 +339,46 @@
|
||||
new /obj/item/weapon/grenade/flashbang(src)
|
||||
new /obj/item/weapon/grenade/flashbang(src)
|
||||
|
||||
/obj/item/weapon/storage/box/firingpins
|
||||
name = "box of firing pins"
|
||||
desc = "A box of NT brand Firearm authentication pins; Needed to operate most weapons."
|
||||
|
||||
/obj/item/weapon/storage/box/firingpins/fill()
|
||||
..()
|
||||
new /obj/item/device/firing_pin(src)
|
||||
new /obj/item/device/firing_pin(src)
|
||||
new /obj/item/device/firing_pin(src)
|
||||
new /obj/item/device/firing_pin(src)
|
||||
new /obj/item/device/firing_pin(src)
|
||||
new /obj/item/device/firing_pin(src)
|
||||
new /obj/item/device/firing_pin(src)
|
||||
|
||||
/obj/item/weapon/storage/box/testpins
|
||||
name = "box of firing pins"
|
||||
desc = "A box of NT brand Testing Authentication pins; allows guns to fire in designated firing ranges."
|
||||
|
||||
/obj/item/weapon/storage/box/testpins/fill()
|
||||
..()
|
||||
new /obj/item/device/firing_pin/test_range(src)
|
||||
new /obj/item/device/firing_pin/test_range(src)
|
||||
new /obj/item/device/firing_pin/test_range(src)
|
||||
new /obj/item/device/firing_pin/test_range(src)
|
||||
new /obj/item/device/firing_pin/test_range(src)
|
||||
new /obj/item/device/firing_pin/test_range(src)
|
||||
new /obj/item/device/firing_pin/test_range(src)
|
||||
new /obj/item/device/firing_pin/test_range(src)
|
||||
|
||||
/obj/item/weapon/storage/box/loyaltypins
|
||||
name = "box of firing pins"
|
||||
desc = "A box of specialised \"loyalty\" authentication pins produced by Nanotrasen; these check to see if the user of the gun it's installed in has been implanted with a loyalty implant. Often used in ERTs."
|
||||
|
||||
/obj/item/weapon/storage/box/loyaltypins/fill()
|
||||
..()
|
||||
new /obj/item/device/firing_pin/implant/loyalty(src)
|
||||
new /obj/item/device/firing_pin/implant/loyalty(src)
|
||||
new /obj/item/device/firing_pin/implant/loyalty(src)
|
||||
new /obj/item/device/firing_pin/implant/loyalty(src)
|
||||
|
||||
/obj/item/weapon/storage/box/teargas
|
||||
name = "box of pepperspray grenades"
|
||||
desc = "A box containing 7 tear gas grenades. A gas mask is printed on the label.<br> WARNING: Exposure carries risk of serious injury or death. Keep away from persons with lung conditions."
|
||||
|
||||
@@ -811,7 +811,8 @@
|
||||
/obj/random/hoodie = 0.5,
|
||||
/obj/random/junk = 0.9,
|
||||
/obj/item/weapon/spacecash/ewallet/lotto = 0.3,
|
||||
/obj/random/spacecash = 0.3
|
||||
/obj/random/spacecash = 0.3,
|
||||
/obj/item/device/firing_pin = 0.3
|
||||
)
|
||||
|
||||
/obj/random/hoodie
|
||||
|
||||
@@ -165,6 +165,7 @@ var/list/global/random_stock_uncommon = list(
|
||||
"sord" = 1,
|
||||
"policebaton" = 1.5,
|
||||
"stunbaton" = 0.75,//batons spawn with no powercell
|
||||
"firingpin" = 3,
|
||||
"watches" = 3,
|
||||
"MMI" = 1.5,
|
||||
"voidsuit" = 2,
|
||||
@@ -1062,6 +1063,8 @@ var/list/global/random_stock_large = list(
|
||||
new /obj/random/action_figure(L)
|
||||
if("plushie")
|
||||
new /obj/random/plushie(L)
|
||||
if("firingpin")
|
||||
new /obj/item/weapon/storage/box/firingpins(L)
|
||||
if("mediumcell")
|
||||
var/number = rand(1,2)
|
||||
while (number > 0)
|
||||
|
||||
@@ -344,3 +344,5 @@ var/list/slot_equipment_priority = list( \
|
||||
for(var/entry in get_equipped_items(include_carried))
|
||||
drop_from_inventory(entry)
|
||||
qdel(entry)
|
||||
|
||||
|
||||
|
||||
@@ -65,6 +65,8 @@
|
||||
var/list/dispersion = list(0)
|
||||
var/reliability = 100
|
||||
|
||||
var/obj/item/device/firing_pin/pin = /obj/item/device/firing_pin//standard firing pin for most guns.
|
||||
|
||||
|
||||
var/next_fire_time = 0
|
||||
|
||||
@@ -76,6 +78,7 @@
|
||||
var/recoil_wielded = 0
|
||||
var/accuracy_wielded = 0
|
||||
var/wielded = 0
|
||||
var/needspin = TRUE
|
||||
|
||||
|
||||
//aiming system stuff
|
||||
@@ -84,7 +87,7 @@
|
||||
var/tmp/mob/living/last_moved_mob //Used to fire faster at more than one person.
|
||||
var/tmp/lock_time = -100
|
||||
|
||||
/obj/item/weapon/gun/Initialize()
|
||||
/obj/item/weapon/gun/Initialize(mapload)
|
||||
. = ..()
|
||||
for(var/i in 1 to firemodes.len)
|
||||
firemodes[i] = new /datum/firemode(src, firemodes[i])
|
||||
@@ -92,8 +95,15 @@
|
||||
if(isnull(scoped_accuracy))
|
||||
scoped_accuracy = accuracy
|
||||
|
||||
if (mapload && !pin && needspin)
|
||||
pin = /obj/item/device/firing_pin
|
||||
|
||||
if(pin && needspin)
|
||||
pin = new pin(src)
|
||||
|
||||
queue_icon_update()
|
||||
|
||||
|
||||
//Checks whether a given mob can use the gun
|
||||
//Any checks that shouldn't result in handle_click_empty() being called if they fail should go here.
|
||||
//Otherwise, if you want handle_click_empty() to be called, check in consume_next_projectile() and return null there.
|
||||
@@ -102,6 +112,7 @@
|
||||
return 0
|
||||
if(!user.IsAdvancedToolUser())
|
||||
return 0
|
||||
|
||||
if(user.disabilities & PACIFIST)
|
||||
to_chat(user, "<span class='notice'>You don't want to risk harming anyone!</span>")
|
||||
return 0
|
||||
@@ -124,6 +135,20 @@
|
||||
else
|
||||
handle_click_empty(user)
|
||||
return 0
|
||||
|
||||
if(pin && needspin)
|
||||
if(pin.pin_auth(user) || pin.emagged)
|
||||
return 1
|
||||
else
|
||||
pin.auth_fail(user)
|
||||
return 0
|
||||
else
|
||||
if(needspin)
|
||||
to_chat(user, "<span class='warning'>[src]'s trigger is locked. This weapon doesn't have a firing pin installed!</span>")
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/gun/emp_act(severity)
|
||||
@@ -397,6 +422,14 @@
|
||||
var/obj/item/projectile/in_chamber = consume_next_projectile()
|
||||
if (istype(in_chamber))
|
||||
user.visible_message("<span class = 'warning'>[user] pulls the trigger.</span>")
|
||||
if (!pin && needspin)//Checks the pin of the gun.
|
||||
user.visible_message("<span class = 'warning'>*click click*</span>")
|
||||
mouthshoot = 0
|
||||
return
|
||||
if (!pin.pin_auth() && needspin)
|
||||
user.visible_message("<span class = 'warning'>*click click*</span>")
|
||||
mouthshoot = 0
|
||||
return
|
||||
if(silenced)
|
||||
playsound(user, fire_sound, 10, 1)
|
||||
else
|
||||
@@ -607,6 +640,20 @@
|
||||
mob_can_equip(M as mob, slot)
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/gun/examine(mob/user)
|
||||
..()
|
||||
if(needspin)
|
||||
if(pin)
|
||||
user << "There is a \[pin] in the trigger mechanism."
|
||||
else
|
||||
user << "It doesn't have a firing pin installed, and won't fire."
|
||||
|
||||
obj/item/weapon/gun/Destroy()
|
||||
if (istype(pin))
|
||||
QDEL_NULL(pin)
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/weapon/gun/proc/handle_reliability_fail(var/mob/user)
|
||||
var/severity = 1
|
||||
if(prob(100-reliability))
|
||||
@@ -629,3 +676,23 @@
|
||||
|
||||
/obj/item/weapon/gun/proc/critical_fail(var/mob/user)
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/attackby(var/obj/item/I as obj, var/mob/user as mob)
|
||||
if(!pin)
|
||||
return ..()
|
||||
|
||||
if(isscrewdriver(I))
|
||||
visible_message("<span class = 'warning'>[user] begins to try and pry out [src]'s firing pin!</span>")
|
||||
if(do_after(user,45 SECONDS,act_target = src))
|
||||
if(pin.durable)
|
||||
visible_message("<span class = 'notice'>[user] pops the [pin] out of [src]!</span>")
|
||||
pin.forceMove(get_turf(src))
|
||||
pin = null//clear it out.
|
||||
else
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user] breaks some electronics free from [src] with a crack.</span>",
|
||||
"<span class='alert'>You apply a bit too much force to [pin], and it breaks in two. Oops.</span>",
|
||||
"You hear a metallic crack.")
|
||||
qdel(pin)
|
||||
pin = null
|
||||
.=..()
|
||||
@@ -65,6 +65,7 @@ obj/item/weapon/gun/energy/retro
|
||||
charge_cost = 400
|
||||
max_shots = 5
|
||||
fire_delay = 20
|
||||
pin = null
|
||||
can_turret = 1
|
||||
turret_sprite_set = "cannon"
|
||||
|
||||
@@ -86,6 +87,7 @@ obj/item/weapon/gun/energy/retro
|
||||
charge_cost = 100
|
||||
max_shots = 20
|
||||
fire_delay = 1
|
||||
pin = null
|
||||
can_turret = 1
|
||||
turret_sprite_set = "xray"
|
||||
|
||||
@@ -158,6 +160,7 @@ obj/item/weapon/gun/energy/retro
|
||||
move_delay = 0
|
||||
fire_delay = 2
|
||||
dispersion = list(1.0, -1.0, 2.0, -2.0)
|
||||
pin = null
|
||||
can_turret = 1
|
||||
turret_sprite_set = "laser"
|
||||
|
||||
@@ -186,6 +189,7 @@ obj/item/weapon/gun/energy/retro
|
||||
item_state = "bluetag"
|
||||
projectile_type = /obj/item/projectile/beam/lastertag/blue
|
||||
required_vest = /obj/item/clothing/suit/bluetag
|
||||
pin = /obj/item/device/firing_pin/tag/blue
|
||||
can_turret = 1
|
||||
turret_is_lethal = 0
|
||||
turret_sprite_set = "blue"
|
||||
@@ -195,6 +199,7 @@ obj/item/weapon/gun/energy/retro
|
||||
item_state = "redtag"
|
||||
projectile_type = /obj/item/projectile/beam/lastertag/red
|
||||
required_vest = /obj/item/clothing/suit/redtag
|
||||
pin = /obj/item/device/firing_pin/tag/red
|
||||
can_turret = 1
|
||||
turret_is_lethal = 0
|
||||
turret_sprite_set = "red"
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
var/message_enabled = 0 //If playing the message should be enabled
|
||||
var/message_disable = 0 //If the loop should be stopped
|
||||
var/default_desc = "A highly advanced firearm for the modern police force. It has multiple voice-activated firing modes."
|
||||
pin = null
|
||||
|
||||
firemodes = list(
|
||||
list(
|
||||
@@ -122,7 +123,7 @@
|
||||
message_enabled = 0
|
||||
message_disable = 0
|
||||
|
||||
/obj/item/weapon/gun/energy/lawgiver/attack_self(mob/living/carbon/user as mob)
|
||||
/obj/item/weapon/gun/energy/lawgiver/attack_self(mob/living/carbon/user as mob) //can probably remove this in favor of the DNA locked firing pins. not touching that now though. edit: lol nevermind snowflake code of the year
|
||||
if(dna != null)
|
||||
return
|
||||
else
|
||||
@@ -144,7 +145,7 @@
|
||||
user << "<span class='danger'>You hear a soft beep from the gun and 'ID FAIL' flashes across the screen.</span>"
|
||||
user << "<span class='danger'>You feel a tiny prick in your hand!</span>"
|
||||
user.drop_item()
|
||||
//Blow up Unauthorized Users Hand
|
||||
//Blow up Unauthorized Users Hand//todo, delet this, as it's duplicate behaviour from Firing pins.
|
||||
sleep(60)
|
||||
if(active_hand)
|
||||
LA.droplimb(0,DROPLIMB_BLUNT)
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
origin_tech = list(TECH_COMBAT = 7, TECH_MAGNET = 5, TECH_BLUESPACE = 7)
|
||||
self_recharge = 1
|
||||
charge_meter = 0
|
||||
pin = /obj/item/device/firing_pin/magic
|
||||
|
||||
|
||||
obj/item/weapon/gun/energy/staff/special_check(var/mob/living/user)
|
||||
if(HULK in user.mutations)
|
||||
@@ -187,6 +189,7 @@ obj/item/weapon/gun/energy/staff/focus/attack_self(mob/living/user as mob)
|
||||
projectile_type = /obj/item/projectile/magic
|
||||
origin_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 5, TECH_BLUESPACE = 6)
|
||||
charge_meter = 0
|
||||
pin = /obj/item/device/firing_pin/magic
|
||||
charge_failure_message = null
|
||||
|
||||
/obj/item/weapon/gun/energy/wand/get_cell()
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 4, TECH_POWER = 4)
|
||||
projectile_type = /obj/item/projectile/kinetic
|
||||
fire_sound = 'sound/weapons/Kenetic_accel.ogg'
|
||||
|
||||
var/max_mod_capacity = 100
|
||||
var/list/modkits = list()
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
fire_sound = 'sound/weapons/Taser.ogg'
|
||||
slot_flags = SLOT_BELT
|
||||
max_shots = 10
|
||||
pin = null
|
||||
can_turret = 1
|
||||
secondary_projectile_type = /obj/item/projectile/beam
|
||||
secondary_fire_sound = 'sound/weapons/Laser.ogg'
|
||||
@@ -38,6 +39,7 @@
|
||||
force = 8 //looks heavier than a pistol
|
||||
self_recharge = 1
|
||||
modifystate = null
|
||||
pin = null
|
||||
reliability = 95
|
||||
turret_sprite_set = "nuclear"
|
||||
charge_failure_message = "'s charging socket was removed to make room for a minaturized reactor."
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
projectile_type = /obj/item/projectile/beam
|
||||
sel_mode = 2
|
||||
max_shots = 10
|
||||
pin = null
|
||||
can_turret = 1
|
||||
secondary_projectile_type = /obj/item/projectile/beam/pulse
|
||||
secondary_fire_sound = 'sound/weapons/pulse.ogg'
|
||||
@@ -37,3 +38,4 @@
|
||||
icon_state = "pulse_pistol"
|
||||
item_state = "pulse_pistol"
|
||||
max_shots = 5
|
||||
pin = null
|
||||
@@ -41,6 +41,7 @@
|
||||
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_POWER = 3)
|
||||
max_shots = 10
|
||||
projectile_type = /obj/item/projectile/energy/declone
|
||||
pin = null
|
||||
|
||||
/obj/item/weapon/gun/energy/floragun
|
||||
name = "floral somatoray"
|
||||
@@ -111,6 +112,7 @@
|
||||
w_class = 3.0
|
||||
origin_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4)
|
||||
projectile_type = /obj/item/projectile/energy/phoron
|
||||
pin = null
|
||||
can_turret = 1
|
||||
turret_is_lethal = 0
|
||||
turret_sprite_set = "net"
|
||||
@@ -133,6 +135,7 @@
|
||||
move_delay = 3
|
||||
fire_delay = 0
|
||||
dispersion = list(0.0, 0.2, -0.2)
|
||||
pin = null
|
||||
|
||||
/obj/item/weapon/gun/energy/mousegun
|
||||
name = "\improper NT \"Arodentia\" Exterminator ray"
|
||||
@@ -223,6 +226,7 @@
|
||||
burst_delay = 1
|
||||
fire_delay = 10
|
||||
dispersion = list(0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9)
|
||||
pin = null
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="concentrated burst", burst=10, burst_delay = 1, fire_delay = 10, dispersion = list(0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9)),
|
||||
@@ -285,9 +289,9 @@
|
||||
burst = 1
|
||||
burst_delay = 1
|
||||
fire_delay = 0
|
||||
pin = null
|
||||
can_turret = 1
|
||||
turret_sprite_set = "laser"
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="single shot", burst=1, burst_delay = 1, fire_delay = 0),
|
||||
list(mode_name="concentrated burst", burst=3, burst_delay = 1, fire_delay = 5)
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
|
||||
projectile_type = /obj/item/projectile/energy/electrode
|
||||
max_shots = 8
|
||||
pin = null
|
||||
|
||||
|
||||
/obj/item/weapon/gun/energy/crossbow
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
multi_aim = 1
|
||||
burst_delay = 2
|
||||
sel_mode = 1
|
||||
pin = null
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
|
||||
@@ -321,6 +322,7 @@
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/trodpack)
|
||||
auto_eject = 1
|
||||
auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
|
||||
pin = null
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="single coil", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
|
||||
|
||||
@@ -118,6 +118,7 @@
|
||||
handle_casings = CYCLE_CASINGS
|
||||
max_shells = 7
|
||||
ammo_type = /obj/item/ammo_casing/cap
|
||||
needspin = FALSE
|
||||
|
||||
/obj/item/weapon/gun/projectile/revolver/capgun/attackby(obj/item/W, mob/user)
|
||||
if(!iswirecutter(W) || icon_state == "revolver")
|
||||
|
||||
207
code/modules/projectiles/pins.dm
Normal file
207
code/modules/projectiles/pins.dm
Normal file
@@ -0,0 +1,207 @@
|
||||
/*
|
||||
Alright boys, Firing pins. hopefully with minimal shitcode.
|
||||
"pin_auth(mob/living/user)" is the check to see if it fires, put the snowflake code here. return one to fire, zero to flop. ezpz
|
||||
|
||||
Firing pins as a rule can't be removed without replacing them, blame a really shitty mechanism for it by NT or something idk, this is to stop people from just taking pins from like a capgun or something.
|
||||
*/
|
||||
|
||||
/obj/item/device/firing_pin
|
||||
name = "electronic firing pin"
|
||||
desc = "A small authentication device, to be inserted into a firearm receiver to allow operation. NT safety regulations require all new designs to incorporate one."
|
||||
icon = 'icons/obj/firingpins.dmi'
|
||||
icon_state = "firing_pin"
|
||||
item_state = "pen"
|
||||
origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 2)
|
||||
flags = CONDUCT
|
||||
w_class = 1
|
||||
attack_verb = list("poked")
|
||||
var/emagged = FALSE
|
||||
var/fail_message = "<span class='warning'>INVALID USER.</span>"
|
||||
var/selfdestruct = 0 // Explode when user check is failed.
|
||||
var/force_replace = 0 // Can forcefully replace other pins.
|
||||
var/pin_replaceable = 0 // Can be replaced by any pin.
|
||||
var/durable = FALSE //is destroyed when it's pried out with a screwdriver, see gun.dm
|
||||
var/obj/item/weapon/gun/gun
|
||||
|
||||
|
||||
|
||||
/obj/item/device/firing_pin/Initialize(mapload)
|
||||
.=..()
|
||||
if(istype(loc, /obj/item/weapon/gun))
|
||||
gun = loc
|
||||
|
||||
/obj/item/device/firing_pin/afterattack(atom/target, mob/user, proximity_flag)
|
||||
if(proximity_flag)
|
||||
if(istype(target, /obj/item/weapon/gun))
|
||||
var/obj/item/weapon/gun/G = target
|
||||
if(G.pin && (force_replace || G.pin.pin_replaceable))
|
||||
G.pin.forceMove(get_turf(G))
|
||||
G.pin.gun_remove(user)
|
||||
to_chat(user, "<span class ='notice'>You remove [G]'s old pin.</span>")
|
||||
|
||||
if(!G.pin)
|
||||
gun_insert(user, G)
|
||||
to_chat(user, "<span class ='notice'>You insert [src] into [G].</span>")
|
||||
else
|
||||
to_chat(user, "<span class ='notice'>This firearm already has a firing pin installed.</span>")
|
||||
|
||||
/obj/item/device/firing_pin/emag_act(mob/user)
|
||||
if(!emagged)
|
||||
emagged = TRUE
|
||||
to_chat(user, "<span class='notice'>You override the authentication mechanism.</span>")
|
||||
|
||||
/obj/item/device/firing_pin/proc/gun_insert(mob/living/user, obj/item/weapon/gun/G)
|
||||
gun = G
|
||||
user.drop_from_inventory(src)
|
||||
forceMove(gun)
|
||||
gun.pin = src
|
||||
return
|
||||
|
||||
/obj/item/device/firing_pin/proc/gun_remove(mob/living/user)
|
||||
gun.pin = null
|
||||
gun = null
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/device/firing_pin/proc/pin_auth(mob/living/user)
|
||||
return 1
|
||||
|
||||
/obj/item/device/firing_pin/proc/auth_fail(mob/living/carbon/human/user)
|
||||
user.show_message(fail_message, 1)
|
||||
if(selfdestruct)//sound stolen from the lawgiver. todo, remove this from the lawgiver. there can only be one.
|
||||
user.show_message("<span class='danger'>SELF-DESTRUCTING...</span><br>", 1)
|
||||
visible_message("<span class='danger'>[gun] explodes!</span>")
|
||||
playsound(user, 'sound/weapons/lawgiver_idfail.ogg', 40, 1)
|
||||
var/obj/item/organ/external/E = user.organs_by_name[user.hand ? "l_hand" : "r_hand"]
|
||||
E.droplimb(0,DROPLIMB_BLUNT)
|
||||
explosion(get_turf(gun), -1, 0, 2, 3)
|
||||
if(gun)
|
||||
qdel(gun)
|
||||
|
||||
/*
|
||||
Pins Below.
|
||||
*/
|
||||
|
||||
//only used in wizard staffs/wands.
|
||||
/obj/item/device/firing_pin/magic
|
||||
name = "magic crystal shard"
|
||||
desc = "A small enchanted shard which allows magical weapons to fire."
|
||||
icon_state = "firing_pin_wizwoz"
|
||||
|
||||
// Test pin, works only near firing ranges.
|
||||
/obj/item/device/firing_pin/test_range
|
||||
name = "test-range firing pin"
|
||||
desc = "This safety firing pin allows weapons to be fired within proximity to a firing range."
|
||||
fail_message = "<span class='warning'>TEST RANGE CHECK FAILED.</span>"
|
||||
pin_replaceable = 1
|
||||
durable = TRUE
|
||||
origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 2)
|
||||
|
||||
/obj/item/device/firing_pin/test_range/pin_auth(mob/living/user)
|
||||
var/area/A = get_area(src)
|
||||
if (A && (A.flags & FIRING_RANGE))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
// Implant pin, checks for implant
|
||||
/obj/item/device/firing_pin/implant
|
||||
name = "implant-keyed firing pin"
|
||||
desc = "This is a implant-locked firing pin which only authorizes users who are implanted with a certain device."
|
||||
fail_message = "<span class='warning'>IMPLANT CHECK FAILED.</span>"
|
||||
var/req_implant
|
||||
|
||||
/obj/item/device/firing_pin/implant/pin_auth(mob/living/user)
|
||||
if (locate(req_implant) in user)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
/obj/item/device/firing_pin/implant/loyalty
|
||||
name = "loyalty firing pin"
|
||||
desc = "This implant-locked firing pin authorizes the weapon for only loyalty-implanted users."
|
||||
icon_state = "firing_pin_loyalty"
|
||||
req_implant = /obj/item/weapon/implant/loyalty
|
||||
|
||||
// Honk pin, clown joke item.
|
||||
// Can replace other pins. Replace a pin in cap's laser for extra fun! This is generally adminbus only unless someone thinks of a use for it.
|
||||
/obj/item/device/firing_pin/clown
|
||||
name = "hilarious firing pin"
|
||||
desc = "Advanced clowntech that can convert any firearm into a far more useful object."
|
||||
color = "#FFFF00"
|
||||
fail_message = "<span class='warning'>HONK!</span>"
|
||||
force_replace = 1
|
||||
|
||||
/obj/item/device/firing_pin/clown/pin_auth(mob/living/user)
|
||||
playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1)
|
||||
return 0
|
||||
|
||||
// DNA-keyed pin.
|
||||
// When you want to keep your toys for youself.
|
||||
/obj/item/device/firing_pin/dna
|
||||
name = "DNA-keyed firing pin"
|
||||
desc = "This is a DNA-locked firing pin which only authorizes one user. Attempt to fire once to DNA-link."
|
||||
icon_state = "firing_pin_dna"
|
||||
fail_message = "<span class='warning'>DNA CHECK FAILED.</span>"
|
||||
var/unique_enzymes = null
|
||||
|
||||
/obj/item/device/firing_pin/dna/afterattack(atom/target, mob/user, proximity_flag)
|
||||
..()
|
||||
if(proximity_flag && iscarbon(target))
|
||||
var/mob/living/carbon/M = target
|
||||
if(M.dna && M.dna.unique_enzymes)
|
||||
unique_enzymes = M.dna.unique_enzymes
|
||||
to_chat(user, "<span class='notice'>DNA-LOCK SET.</span>")
|
||||
|
||||
/obj/item/device/firing_pin/dna/pin_auth(mob/living/carbon/user)
|
||||
if(istype(user) && user.dna && user.dna.unique_enzymes)
|
||||
if(user.dna.unique_enzymes == unique_enzymes)
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
/obj/item/device/firing_pin/dna/auth_fail(mob/living/carbon/user)
|
||||
if(!unique_enzymes)
|
||||
if(istype(user) && user.dna && user.dna.unique_enzymes)
|
||||
unique_enzymes = user.dna.unique_enzymes
|
||||
to_chat(user, "<span class='notice'>DNA-LOCK SET.</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/device/firing_pin/dna/dredd
|
||||
desc = "This is a DNA-locked firing pin which only authorizes one user. Attempt to fire once to DNA-link. It has a small explosive charge on it."
|
||||
selfdestruct = 1
|
||||
|
||||
|
||||
// Laser tag pins
|
||||
/obj/item/device/firing_pin/tag
|
||||
name = "laser tag firing pin"
|
||||
desc = "A recreational firing pin, used in laser tag units to ensure users have their vests on."
|
||||
fail_message = "<span class='warning'>SUIT CHECK FAILED.</span>"
|
||||
var/obj/item/clothing/suit/suit_requirement = null
|
||||
var/tagcolor = ""
|
||||
|
||||
/obj/item/device/firing_pin/tag/pin_auth(mob/living/user)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/M = user
|
||||
if(istype(M.wear_suit, suit_requirement))
|
||||
return 1
|
||||
to_chat(user, "<span class='warning'>You need to be wearing [tagcolor] laser tag armor!</span>")
|
||||
return 0
|
||||
|
||||
/obj/item/device/firing_pin/tag/red
|
||||
name = "red laser tag firing pin"
|
||||
icon_state = "firing_pin_red"
|
||||
suit_requirement = /obj/item/clothing/suit/redtag
|
||||
tagcolor = "red"
|
||||
|
||||
/obj/item/device/firing_pin/tag/blue
|
||||
name = "blue laser tag firing pin"
|
||||
icon_state = "firing_pin_blue"
|
||||
suit_requirement = /obj/item/clothing/suit/bluetag
|
||||
tagcolor = "blue"
|
||||
|
||||
/obj/item/device/firing_pin/Destroy()
|
||||
if(gun)
|
||||
gun.pin = null
|
||||
return ..()
|
||||
5
html/changelogs/PMD-Pins.yml
Normal file
5
html/changelogs/PMD-Pins.yml
Normal file
@@ -0,0 +1,5 @@
|
||||
author: Pacmandevil
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "Firing pins. Guns now need an Authentication device to fire. there are several different types."
|
||||
- rscadd: "Science now has a testing range to test guns in."
|
||||
BIN
icons/obj/firingpins.dmi
Normal file
BIN
icons/obj/firingpins.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
@@ -76,6 +76,10 @@
|
||||
name = "\improper Research - Miscellaneous Research"
|
||||
icon_state = "toxmisc"
|
||||
|
||||
/area/rnd/test_range
|
||||
name = "\improper Research - Weapons Testing Range"
|
||||
flags = FIRING_RANGE
|
||||
|
||||
/area/toxins
|
||||
station_area = 1
|
||||
|
||||
|
||||
@@ -60,6 +60,7 @@
|
||||
/area/security/range
|
||||
name = "\improper Security - Firing Range"
|
||||
icon_state = "firingrange"
|
||||
flags = FIRING_RANGE
|
||||
|
||||
/area/security/tactical
|
||||
name = "\improper Security - Tactical Equipment"
|
||||
|
||||
@@ -17503,14 +17503,24 @@
|
||||
/turf/simulated/floor/plating,
|
||||
/area/medical/patient_wing)
|
||||
"FP" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
|
||||
/obj/structure/cable/green{
|
||||
d1 = 1;
|
||||
d2 = 2;
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/effect/floor_decal/corner/mauve,
|
||||
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
|
||||
icon_state = "map-scrubbers";
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable/green{
|
||||
d1 = 1;
|
||||
d2 = 8;
|
||||
icon_state = "1-8"
|
||||
},
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/outpost/research/hallway)
|
||||
"FQ" = (
|
||||
@@ -24812,8 +24822,7 @@
|
||||
/obj/machinery/atmospherics/valve/digital{
|
||||
dir = 4;
|
||||
icon_state = "map_valve0";
|
||||
name = "Air Bypass valve";
|
||||
|
||||
name = "Air Bypass valve"
|
||||
},
|
||||
/turf/simulated/floor/tiled,
|
||||
/area/engineering/atmos)
|
||||
@@ -25041,6 +25050,435 @@
|
||||
},
|
||||
/turf/simulated/floor/tiled/freezer,
|
||||
/area/crew_quarters/medbreak)
|
||||
"TS" = (
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/rnd/test_range)
|
||||
"TT" = (
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/rnd/test_range)
|
||||
"TU" = (
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/rnd/test_range)
|
||||
"TV" = (
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/rnd/test_range)
|
||||
"TW" = (
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/rnd/test_range)
|
||||
"TX" = (
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/rnd/test_range)
|
||||
"TY" = (
|
||||
/obj/effect/floor_decal/corner/mauve{
|
||||
icon_state = "corner_white";
|
||||
dir = 5
|
||||
},
|
||||
/obj/effect/floor_decal/corner/mauve{
|
||||
icon_state = "corner_white";
|
||||
dir = 9
|
||||
},
|
||||
/obj/machinery/bodyscanner{
|
||||
tag = "icon-body_scanner_0 (WEST)";
|
||||
icon_state = "body_scanner_0";
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/rnd/test_range)
|
||||
"TZ" = (
|
||||
/obj/effect/floor_decal/corner/mauve{
|
||||
icon_state = "corner_white";
|
||||
dir = 5
|
||||
},
|
||||
/obj/machinery/body_scanconsole{
|
||||
tag = "icon-body_scannerconsole (WEST)";
|
||||
icon_state = "body_scannerconsole";
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/rnd/test_range)
|
||||
"Ua" = (
|
||||
/obj/effect/floor_decal/corner/mauve{
|
||||
icon_state = "corner_white";
|
||||
dir = 5
|
||||
},
|
||||
/obj/structure/bed/chair/office/light{
|
||||
tag = "icon-officechair_white (EAST)";
|
||||
icon_state = "officechair_white";
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/firealarm/north,
|
||||
/obj/machinery/light{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/rnd/test_range)
|
||||
"Ub" = (
|
||||
/obj/effect/floor_decal/corner/mauve{
|
||||
icon_state = "corner_white";
|
||||
dir = 5
|
||||
},
|
||||
/obj/effect/floor_decal/corner/mauve{
|
||||
icon_state = "corner_white";
|
||||
dir = 6
|
||||
},
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/weapon/paper_bin,
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/rnd/test_range)
|
||||
"Uc" = (
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/rnd/test_range)
|
||||
"Ud" = (
|
||||
/obj/effect/floor_decal/corner/mauve{
|
||||
icon_state = "corner_white";
|
||||
dir = 9
|
||||
},
|
||||
/obj/machinery/alarm{
|
||||
dir = 4;
|
||||
pixel_x = -23;
|
||||
pixel_y = 0
|
||||
},
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/rnd/test_range)
|
||||
"Ue" = (
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/rnd/test_range)
|
||||
"Uf" = (
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/rnd/test_range)
|
||||
"Ug" = (
|
||||
/obj/effect/floor_decal/corner/mauve{
|
||||
icon_state = "corner_white";
|
||||
dir = 6
|
||||
},
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/weapon/pen,
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/rnd/test_range)
|
||||
"Uh" = (
|
||||
/obj/structure/grille,
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/window/reinforced{
|
||||
icon_state = "rwindow";
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/machinery/door/blast/regular{
|
||||
density = 0;
|
||||
dir = 1;
|
||||
icon_state = "pdoor0";
|
||||
id = "Biohazard";
|
||||
name = "Biohazard Shutter";
|
||||
opacity = 0
|
||||
},
|
||||
/obj/structure/window/reinforced,
|
||||
/turf/simulated/floor/plating,
|
||||
/area/outpost/research/hallway)
|
||||
"Ui" = (
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/rnd/test_range)
|
||||
"Uj" = (
|
||||
/obj/effect/floor_decal/corner/mauve{
|
||||
icon_state = "corner_white";
|
||||
dir = 9
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
icon_state = "intact-supply";
|
||||
dir = 6
|
||||
},
|
||||
/obj/machinery/power/apc{
|
||||
dir = 8;
|
||||
name = "west bump";
|
||||
pixel_x = -24
|
||||
},
|
||||
/obj/structure/cable/green{
|
||||
d2 = 4;
|
||||
icon_state = "0-4"
|
||||
},
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/rnd/test_range)
|
||||
"Uk" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable/green{
|
||||
d1 = 4;
|
||||
d2 = 8;
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/rnd/test_range)
|
||||
"Ul" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/rnd/test_range)
|
||||
"Um" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
|
||||
dir = 6
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable/green{
|
||||
d1 = 4;
|
||||
d2 = 8;
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/rnd/test_range)
|
||||
"Un" = (
|
||||
/obj/machinery/door/airlock/glass_research{
|
||||
name = "Test Range"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable/green{
|
||||
d1 = 4;
|
||||
d2 = 8;
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/outpost/research/hallway)
|
||||
"Uo" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/outpost/research/hallway)
|
||||
"Up" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/outpost/research/hallway)
|
||||
"Uq" = (
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/rnd/test_range)
|
||||
"Ur" = (
|
||||
/obj/effect/floor_decal/corner/mauve{
|
||||
icon_state = "corner_white";
|
||||
dir = 9
|
||||
},
|
||||
/obj/effect/floor_decal/industrial/warning,
|
||||
/obj/machinery/atmospherics/unary/vent_pump/on{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/rnd/test_range)
|
||||
"Us" = (
|
||||
/obj/effect/floor_decal/industrial/warning,
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/rnd/test_range)
|
||||
"Ut" = (
|
||||
/obj/effect/floor_decal/industrial/warning,
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/rnd/test_range)
|
||||
"Uu" = (
|
||||
/obj/effect/floor_decal/corner/mauve{
|
||||
icon_state = "corner_white";
|
||||
dir = 6
|
||||
},
|
||||
/obj/effect/floor_decal/industrial/warning,
|
||||
/obj/machinery/atmospherics/unary/vent_scrubber/on{
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/rnd/test_range)
|
||||
"Uv" = (
|
||||
/obj/structure/grille,
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/window/reinforced{
|
||||
icon_state = "rwindow";
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/machinery/door/blast/regular{
|
||||
density = 0;
|
||||
dir = 1;
|
||||
icon_state = "pdoor0";
|
||||
id = "Biohazard";
|
||||
name = "Biohazard Shutter";
|
||||
opacity = 0
|
||||
},
|
||||
/obj/effect/floor_decal/industrial/warning,
|
||||
/obj/structure/window/reinforced{
|
||||
icon_state = "rwindow";
|
||||
dir = 1
|
||||
},
|
||||
/turf/simulated/floor/plating,
|
||||
/area/outpost/research/hallway)
|
||||
"Uw" = (
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/rnd/test_range)
|
||||
"Ux" = (
|
||||
/obj/machinery/door/window/southright,
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"Uy" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/structure/window/reinforced{
|
||||
icon_state = "rwindow";
|
||||
dir = 8
|
||||
},
|
||||
/obj/item/device/firing_pin/test_range,
|
||||
/obj/item/device/firing_pin/test_range,
|
||||
/obj/item/device/firing_pin/test_range,
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"Uz" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/effect/floor_decal/industrial/warning{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/floor_decal/industrial/warning{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"UA" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/target,
|
||||
/obj/item/target,
|
||||
/obj/item/target,
|
||||
/obj/structure/closet/crate{
|
||||
name = "Target Crate"
|
||||
},
|
||||
/obj/item/weapon/storage/box/monkeycubes,
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"UB" = (
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/rnd/test_range)
|
||||
"UC" = (
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"UD" = (
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"UE" = (
|
||||
/obj/effect/floor_decal/industrial/warning{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/floor_decal/industrial/warning{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"UF" = (
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"UG" = (
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/rnd/test_range)
|
||||
"UH" = (
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/rnd/test_range)
|
||||
"UI" = (
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"UJ" = (
|
||||
/obj/effect/floor_decal/industrial/warning{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/floor_decal/industrial/warning{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"UK" = (
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"UL" = (
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/rnd/test_range)
|
||||
"UM" = (
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"UN" = (
|
||||
/obj/effect/floor_decal/industrial/warning{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/floor_decal/industrial/warning{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"UO" = (
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"UP" = (
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/rnd/test_range)
|
||||
"UQ" = (
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"UR" = (
|
||||
/obj/effect/floor_decal/industrial/warning{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/floor_decal/industrial/warning{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"US" = (
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"UT" = (
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/rnd/test_range)
|
||||
"UU" = (
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"UV" = (
|
||||
/obj/structure/target_stake,
|
||||
/obj/effect/floor_decal/industrial/warning{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/floor_decal/industrial/warning{
|
||||
dir = 4
|
||||
},
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"UW" = (
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"UX" = (
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"UY" = (
|
||||
/obj/machinery/light{
|
||||
dir = 4;
|
||||
status = 2
|
||||
},
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
"UZ" = (
|
||||
/obj/effect/decal/cleanable/blood,
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/rnd/test_range)
|
||||
|
||||
(1,1,1) = {"
|
||||
aa
|
||||
@@ -42154,16 +42592,16 @@ aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
TS
|
||||
TS
|
||||
TS
|
||||
TS
|
||||
TS
|
||||
TS
|
||||
TS
|
||||
TS
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
mb
|
||||
aa
|
||||
KO
|
||||
Ls
|
||||
@@ -42411,17 +42849,17 @@ aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
aa
|
||||
aa
|
||||
TS
|
||||
TY
|
||||
Ud
|
||||
Uj
|
||||
Ur
|
||||
Ux
|
||||
UC
|
||||
TS
|
||||
TS
|
||||
TS
|
||||
TS
|
||||
KO
|
||||
Lt
|
||||
LV
|
||||
@@ -42668,17 +43106,17 @@ aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
aa
|
||||
aa
|
||||
TS
|
||||
TZ
|
||||
Ue
|
||||
Uk
|
||||
Us
|
||||
Uy
|
||||
UC
|
||||
UX
|
||||
UC
|
||||
UC
|
||||
UZ
|
||||
KO
|
||||
Lu
|
||||
LW
|
||||
@@ -42925,17 +43363,17 @@ aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
TS
|
||||
Ua
|
||||
Ue
|
||||
Uk
|
||||
Us
|
||||
Uz
|
||||
UE
|
||||
UE
|
||||
UE
|
||||
UE
|
||||
UV
|
||||
KO
|
||||
KO
|
||||
KO
|
||||
@@ -43182,17 +43620,17 @@ aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
ac
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
TS
|
||||
Ub
|
||||
Ug
|
||||
Um
|
||||
Uu
|
||||
UA
|
||||
UC
|
||||
UY
|
||||
UC
|
||||
UC
|
||||
UC
|
||||
KP
|
||||
Lv
|
||||
Lv
|
||||
@@ -43441,9 +43879,9 @@ xv
|
||||
xv
|
||||
xv
|
||||
uZ
|
||||
vs
|
||||
vs
|
||||
vs
|
||||
Uh
|
||||
Un
|
||||
Uv
|
||||
vs
|
||||
xe
|
||||
xy
|
||||
@@ -43699,7 +44137,7 @@ Db
|
||||
SQ
|
||||
Ex
|
||||
Ff
|
||||
vt
|
||||
vv
|
||||
Co
|
||||
Hp
|
||||
HY
|
||||
@@ -43956,7 +44394,7 @@ Dc
|
||||
SQ
|
||||
vb
|
||||
uD
|
||||
uD
|
||||
vv
|
||||
GK
|
||||
Hq
|
||||
HZ
|
||||
@@ -63763,7 +64201,7 @@ OM
|
||||
Pn
|
||||
PI
|
||||
PZ
|
||||
TR
|
||||
TQ
|
||||
Ko
|
||||
aa
|
||||
aa
|
||||
|
||||
@@ -12813,6 +12813,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/table/rack,
|
||||
/obj/item/weapon/storage/box/firingpins,
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/security/armoury)
|
||||
"axm" = (
|
||||
@@ -14647,6 +14648,7 @@
|
||||
pixel_y = -2
|
||||
},
|
||||
/obj/item/weapon/storage/box/teargas,
|
||||
/obj/item/weapon/storage/box/firingpins,
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/security/armoury)
|
||||
"aAp" = (
|
||||
|
||||
Reference in New Issue
Block a user