* Minor underwear fixes and tweaks. * Allows ghost mentors to orbit around the target instead of changing their view to the mob's. * Ports some hud and update_icon code updates. * contamination nerf * Fix * Stops humanoids whose skin_tone variable is set to "albino" from showing up as pale when examined should their species not use skintones anyway. * Hello darkness my old friend. * Ports "Refactors can_see_reagents" * F * MKUltra made double opt-in * ROBUST OPTING MECHANICS * Adds a hacky framework for digitigrade polyclothes also adds a digitigrade state for polychromic shorts * also adds aphrodisiacs, slaps, all hypno as prefs * errors * Modernizes Polychromic Uniform Code No more modular_citadel, but the neck polychrome crap needs more work in another PR * oh god please don't mess up * git y u do dis ;-; * Revert "Makes HE pipes realistically radiate away heat" * more coat stuff yes yes * woops * Wew * Steos are bad * new wings and fluff * Forgot a sprite * another one * I swear I had this in here orginally. * Fixes mistake in less commit. * reattaches missing antenna * Effectively removes the long unrequired roboticist encryption key. * updates ratvar coat * magazine metal cost tweaks, speedloader in AIB * the very shitty idea: "muh speedloader" * Updating dynamic config, some balancing * Automatic changelog generation for PR #10282 [ci skip] * unfucks short hair 80s so the left facing sprite doesnt make you look like a crackhead * Automatic changelog generation for PR #10266 [ci skip] * ah, the wonders of atomization * [s] fixes a little door assembly glass dupe exploit * Update BoxStation.dmm * Update pai_defense.dm * fixes bad sprite states * Automatic changelog generation for PR #10242 [ci skip] * Automatic changelog generation for PR #10237 [ci skip] * Added a ghost role with its own spawner for the purposes of chillling in the ninja holding facility. * holy shit i hope this compiles * e * yee * Automatic changelog generation for PR #10128 [ci skip] * Nope, it didn't compile, Harold. * Automatic changelog generation for PR #10283 [ci skip] * Automatic changelog generation for PR #10281 [ci skip] * Automatic changelog generation for PR #10250 [ci skip] * Applied suggestions and minor tweaks. * f * yeah fair enough Co-Authored-By: Ghom <42542238+Ghommie@users.noreply.github.com> * Update engine_goggles.dm * changes * Automatic changelog generation for PR #10264 [ci skip] * Automatic changelog generation for PR #10298 [ci skip] * Good idea, tbh. * Small touch-up. * Nerfs armor and antistun * Automatic changelog generation for PR #10296 [ci skip] * let the adminbus commence * sprites * clothing add * fix * vending * loadout * FIXEdD * Automatic changelog generation for PR #10265 [ci skip] * Automatic changelog generation for PR #10289 [ci skip] * Automatic changelog generation for PR #10268 [ci skip] * Update CentCom.dmm * ehh fine but why would you use this proc for that * Update language_holder.dm * Automatic changelog generation for PR #10315 [ci skip] * cocooooonuuuuuuts * excludes certain ghost roles from being affected by health events * fixes the thing * probably fixes pandoras attacking their owners * Update stamina.dm * Update sprint.dm * Update food_reagents.dm * Automatic changelog generation for PR #10322 [ci skip] * does the fix? * What about this? * Wait no its actually the other way around. * weh * Automatic changelog generation for PR #10297 [ci skip] * Automatic changelog generation for PR #10299 [ci skip] * more weh. * even more weh. * all of the weh. * ah * Automatic changelog generation for PR #10217 [ci skip] * maybe fixes? * Don't use named arguments on new, please. * Made a line use the dang macro * Made sure ghost cafe visitors don't get midround antags * Automatic changelog generation for PR #10328 [ci skip] * Physiology so species changes dont fuck it up * Whoops * Aarggghh small fucking differences * Makes ass slap attempts fail more loudly on opted-out mobs * Automatic changelog generation for PR #10318 [ci skip] * Automatic changelog generation for PR #10091 [ci skip] * Update borghydro.dm * Update grass_carpet.dm * Ports reflector blobs Ports reflectors from /TG/ * mouth * Fixes UI for poly collars AltClick for collars was seemingly forgotten so I've added it back * auto ooc * roundend too * hnnnnnng code improvements * marshmallow * telescopic IVs * tiny fix * Automatic changelog generation for PR #10324 [ci skip] * Automatic changelog generation for PR #10323 [ci skip] * Update code/modules/hydroponics/grown/grass_carpet.dm Co-Authored-By: Ghom <42542238+Ghommie@users.noreply.github.com> * got it * Update engine_goggles.dm * [s] Fixes ghost anti-ghostrole timers a little. * chestbursters deleting brains fix. * Wait a minute... * ...which var are you? * Update belt.dm * tiny fixes * makes it a trait * few fixes * wow divide by 0 very cool * Automatic changelog generation for PR #10095 [ci skip] * Automatic changelog generation for PR #10312 [ci skip] * Automatic changelog generation for PR #10243 [ci skip] * Automatic changelog generation for PR #10336 [ci skip] * Automatic changelog generation for PR #10335 [ci skip] * Automatic changelog generation for PR #10334 [ci skip] * Automatic changelog generation for PR #10239 [ci skip] * Automatic changelog generation for PR #10168 [ci skip] * Automatic changelog generation for PR #10331 [ci skip] * Automatic changelog generation for PR #10320 [ci skip] * Maybe he means this? * CE Locker Exodus: The Removaling Removes junk from the CE locker. Adds empty engineering lockers. I don't know how to do this as a child and not have populate contents fill the child. * ok * Automatic changelog generation for PR #10348 [ci skip] * Automatic changelog generation for PR #10333 [ci skip] * changelog.html * desc * hnnnng * weh * did this actually change anything * Automatic changelog generation for PR #10337 [ci skip] * yee. * yee2. * Automatic changelog generation for PR #10339 [ci skip] * Ghommies fixes * Automatic changelog generation for PR #10306 [ci skip] * amazing. * Automatic changelog generation for PR #10357 [ci skip] * Automatic changelog generation for PR #10301 [ci skip] * Update chem_master.dm * Automatic changelog generation for PR #10123 [ci skip] * Automatic changelog generation for PR #10165 [ci skip] * Automatic changelog generation for PR #10338 [ci skip] * Automatic changelog generation for PR #10344 [ci skip] * Oh god oh fuck * Update code/modules/hydroponics/seeds.dm Co-Authored-By: Ghom <42542238+Ghommie@users.noreply.github.com> * Update code/modules/hydroponics/seeds.dm Co-Authored-By: Ghom <42542238+Ghommie@users.noreply.github.com> * Update code/modules/hydroponics/gene_modder.dm Co-Authored-By: Ghom <42542238+Ghommie@users.noreply.github.com> * Update telescopic_iv.dm * Automatic changelog generation for PR #10364 [ci skip] * afwafwadjiwao * Automatic changelog generation for PR #10365 [ci skip] * Automatic changelog generation for PR #10319 [ci skip] * Automatic changelog generation for PR #10345 [ci skip] * Automatic changelog generation for PR #10362 [ci skip] * Automatic changelog generation for PR #10309 [ci skip] * Makes lockers into subtypes Adds new lockers cleanly at the bottom instead and as subtypes. * dab * dab 2x * Automatic changelog generation for PR #10349 [ci skip] Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> Co-authored-by: Putnam3145 <putnam3145@gmail.com> Co-authored-by: Michiyamenotehifunana <31995558+Michiyamenotehifunana@users.noreply.github.com> Co-authored-by: Seris02 <49109742+Seris02@users.noreply.github.com> Co-authored-by: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Co-authored-by: shellspeed1 <46614774+shellspeed1@users.noreply.github.com> Co-authored-by: Hatterhat <31829017+Hatterhat@users.noreply.github.com> Co-authored-by: kevinz000 <2003111+kevinz000@users.noreply.github.com> Co-authored-by: CitadelStationBot <citadelstationcommunity@gmail.com> Co-authored-by: Detective-Google <48196179+Detective-Google@users.noreply.github.com> Co-authored-by: LetterJay <9606363+LetterJay@users.noreply.github.com> Co-authored-by: Lin <linzolle@gmail.com> Co-authored-by: Useroth <37159550+Useroth@users.noreply.github.com> Co-authored-by: kappa-sama <44128284+kappa-sama@users.noreply.github.com> Co-authored-by: Arturlang <arturpaavooskari.lang@gmail.com> Co-authored-by: loginsandylogout <nintendofan356@gmail.com> Co-authored-by: BlackMajor <henrydyer6@hotmail.com> Co-authored-by: keronshb <54602815+keronshb@users.noreply.github.com> Co-authored-by: KathrinBailey <53862927+KathrinBailey@users.noreply.github.com> Co-authored-by: nik707 <38332985+nik707@users.noreply.github.com>
232 lines
7.4 KiB
Plaintext
232 lines
7.4 KiB
Plaintext
/obj/item/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/device.dmi'
|
|
icon_state = "firing_pin"
|
|
item_state = "pen"
|
|
flags_1 = CONDUCT_1
|
|
w_class = WEIGHT_CLASS_TINY
|
|
attack_verb = list("poked")
|
|
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_removeable = 0 // Can be replaced by any pin.
|
|
var/obj/item/gun/gun
|
|
|
|
/obj/item/firing_pin/New(newloc)
|
|
..()
|
|
if(istype(newloc, /obj/item/gun))
|
|
gun = newloc
|
|
|
|
/obj/item/firing_pin/afterattack(atom/target, mob/user, proximity_flag)
|
|
. = ..()
|
|
if(proximity_flag)
|
|
if(istype(target, /obj/item/gun))
|
|
var/obj/item/gun/G = target
|
|
if(G.pin && (force_replace || G.pin.pin_removeable))
|
|
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)
|
|
if(!user.temporarilyRemoveItemFromInventory(src))
|
|
return
|
|
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/firing_pin/emag_act(mob/user)
|
|
. = ..()
|
|
if(obj_flags & EMAGGED)
|
|
return
|
|
obj_flags |= EMAGGED
|
|
to_chat(user, "<span class='notice'>You override the authentication mechanism.</span>")
|
|
return TRUE
|
|
|
|
/obj/item/firing_pin/proc/gun_insert(mob/living/user, obj/item/gun/G)
|
|
gun = G
|
|
forceMove(gun)
|
|
gun.pin = src
|
|
return
|
|
|
|
/obj/item/firing_pin/proc/gun_remove(mob/living/user)
|
|
gun.pin = null
|
|
gun = null
|
|
return
|
|
|
|
/obj/item/firing_pin/proc/pin_auth(mob/living/user)
|
|
return TRUE
|
|
|
|
/obj/item/firing_pin/proc/auth_fail(mob/living/user)
|
|
if(user)
|
|
user.show_message(fail_message, MSG_VISUAL)
|
|
if(selfdestruct)
|
|
if(user)
|
|
user.show_message("<span class='danger'>SELF-DESTRUCTING...</span><br>", MSG_VISUAL)
|
|
to_chat(user, "<span class='userdanger'>[gun] explodes!</span>")
|
|
explosion(get_turf(gun), -1, 0, 2, 3)
|
|
if(gun)
|
|
qdel(gun)
|
|
|
|
|
|
|
|
/obj/item/firing_pin/magic
|
|
name = "magic crystal shard"
|
|
desc = "A small enchanted shard which allows magical weapons to fire."
|
|
|
|
|
|
// Test pin, works only near firing range.
|
|
/obj/item/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_removeable = TRUE
|
|
|
|
/obj/item/firing_pin/test_range/pin_auth(mob/living/user)
|
|
if(!istype(user))
|
|
return FALSE
|
|
for(var/obj/machinery/magnetic_controller/M in range(user, 3))
|
|
return TRUE
|
|
return FALSE
|
|
|
|
|
|
// Implant pin, checks for implant
|
|
/obj/item/firing_pin/implant
|
|
name = "implant-keyed firing pin"
|
|
desc = "This is a security firing pin which only authorizes users who are implanted with a certain device."
|
|
fail_message = "<span class='warning'>IMPLANT CHECK FAILED.</span>"
|
|
var/obj/item/implant/req_implant = null
|
|
|
|
/obj/item/firing_pin/implant/pin_auth(mob/living/user)
|
|
if(user)
|
|
for(var/obj/item/implant/I in user.implants)
|
|
if(req_implant && I.type == req_implant)
|
|
return TRUE
|
|
return FALSE
|
|
|
|
/obj/item/firing_pin/implant/mindshield
|
|
name = "mindshield firing pin"
|
|
desc = "This Security firing pin authorizes the weapon for only mindshield-implanted users."
|
|
icon_state = "firing_pin_loyalty"
|
|
req_implant = /obj/item/implant/mindshield
|
|
|
|
/obj/item/firing_pin/implant/pindicate
|
|
name = "syndicate firing pin"
|
|
icon_state = "firing_pin_pindi"
|
|
req_implant = /obj/item/implant/weapons_auth
|
|
|
|
|
|
|
|
// Honk pin, clown's joke item.
|
|
// Can replace other pins. Replace a pin in cap's laser for extra fun!
|
|
/obj/item/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 = TRUE
|
|
|
|
/obj/item/firing_pin/clown/pin_auth(mob/living/user)
|
|
playsound(src, 'sound/items/bikehorn.ogg', 50, 1)
|
|
return FALSE
|
|
|
|
// Ultra-honk pin, clown's deadly joke item.
|
|
// A gun with ultra-honk pin is useful for clown and useless for everyone else.
|
|
/obj/item/firing_pin/clown/ultra/pin_auth(mob/living/user)
|
|
playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1)
|
|
if(user && (!(HAS_TRAIT(user, TRAIT_CLUMSY)) && !(user.mind && HAS_TRAIT(user.mind, TRAIT_CLOWN_MENTALITY))))
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/obj/item/firing_pin/clown/ultra/gun_insert(mob/living/user, obj/item/gun/G)
|
|
..()
|
|
G.clumsy_check = FALSE
|
|
|
|
/obj/item/firing_pin/clown/ultra/gun_remove(mob/living/user)
|
|
gun.clumsy_check = initial(gun.clumsy_check)
|
|
..()
|
|
|
|
// Now two times deadlier!
|
|
/obj/item/firing_pin/clown/ultra/selfdestruct
|
|
desc = "Advanced clowntech that can convert any firearm into a far more useful object. It has a small nitrobananium charge on it."
|
|
selfdestruct = TRUE
|
|
|
|
|
|
// DNA-keyed pin.
|
|
// When you want to keep your toys for yourself.
|
|
/obj/item/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/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/firing_pin/dna/pin_auth(mob/living/carbon/user)
|
|
if(user && user.dna && user.dna.unique_enzymes)
|
|
if(user.dna.unique_enzymes == unique_enzymes)
|
|
return TRUE
|
|
return FALSE
|
|
|
|
/obj/item/firing_pin/dna/auth_fail(mob/living/carbon/user)
|
|
if(!unique_enzymes)
|
|
if(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/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 = TRUE
|
|
|
|
/obj/item/firing_pin/holy
|
|
name = "blessed pin"
|
|
desc = "A firing pin that only responds to those who are holier than thou."
|
|
|
|
/obj/item/firing_pin/holy/pin_auth(mob/living/user)
|
|
if(user.mind.isholy)
|
|
return TRUE
|
|
return FALSE
|
|
|
|
// Laser tag pins
|
|
/obj/item/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/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 TRUE
|
|
to_chat(user, "<span class='warning'>You need to be wearing [tagcolor] laser tag armor!</span>")
|
|
return FALSE
|
|
|
|
/obj/item/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/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/firing_pin/Destroy()
|
|
if(gun)
|
|
gun.pin = null
|
|
return ..()
|