mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-30 16:47:13 +01:00
Merge branch 'master' of https://github.com/tgstation/-tg-station into EmergencyResponseTeam
Conflicts: code/modules/projectiles/guns/energy/nuclear.dm icons/obj/gun.dmi
This commit is contained in:
@@ -796,7 +796,7 @@ var/global/list/g_fancy_list_of_types = null
|
||||
qdel(briefcase_item)
|
||||
for(var/i=3, i>0, i--)
|
||||
sec_briefcase.contents += new /obj/item/weapon/spacecash/c1000
|
||||
sec_briefcase.contents += new /obj/item/weapon/gun/energy/crossbow
|
||||
sec_briefcase.contents += new /obj/item/weapon/gun/projectile/automatic/crossbow
|
||||
sec_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/mateba
|
||||
sec_briefcase.contents += new /obj/item/ammo_box/a357
|
||||
sec_briefcase.contents += new /obj/item/weapon/c4
|
||||
|
||||
@@ -342,7 +342,7 @@ mob/living/carbon/proc/handle_hallucinations()
|
||||
return
|
||||
|
||||
var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/item/ammo_box/a357,\
|
||||
/obj/item/weapon/gun/energy/crossbow, /obj/item/weapon/melee/energy/sword/saber,\
|
||||
/obj/item/weapon/gun/projectile/automatic/crossbow, /obj/item/weapon/melee/energy/sword/saber,\
|
||||
/obj/item/weapon/storage/box/syndicate, /obj/item/weapon/storage/box/emps,\
|
||||
/obj/item/weapon/cartridge/syndicate, /obj/item/clothing/under/chameleon,\
|
||||
/obj/item/clothing/shoes/syndigaloshes, /obj/item/weapon/card/id/syndicate,\
|
||||
|
||||
@@ -471,13 +471,6 @@
|
||||
force = 10
|
||||
throwforce = 10
|
||||
var/cooldown = 0
|
||||
var/list/can_be_placed_into = list(
|
||||
/obj/structure/table,
|
||||
/obj/structure/closet,
|
||||
/obj/item/weapon/storage,
|
||||
/obj/structure/safe,
|
||||
/obj/machinery/disposal
|
||||
)
|
||||
|
||||
/obj/item/weapon/resonator/proc/CreateResonance(var/target, var/creator)
|
||||
if(cooldown <= 0)
|
||||
@@ -493,12 +486,8 @@
|
||||
..()
|
||||
|
||||
/obj/item/weapon/resonator/afterattack(atom/target, mob/user, proximity_flag)
|
||||
if(target in user.contents)
|
||||
return
|
||||
if(proximity_flag)
|
||||
for(var/type in can_be_placed_into)
|
||||
if(istype(target, type))
|
||||
return
|
||||
if(!check_allowed_items(target, 1)) return
|
||||
CreateResonance(target, user)
|
||||
|
||||
/obj/effect/resonance
|
||||
|
||||
@@ -313,11 +313,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
dat += "<h4>Crew Manifest</h4>"
|
||||
dat += data_core.get_manifest()
|
||||
|
||||
src << browse(dat, "window=manifest;size=370x420;can_close=1")
|
||||
|
||||
/mob/dead/observer/Topic(href, href_list)
|
||||
if(href_list["follow"])
|
||||
var/atom/movable/target = locate(href_list["follow"])
|
||||
if((usr == src) && istype(target) && (target != src)) //for safety against href exploits
|
||||
ManualFollow(target)
|
||||
|
||||
src << browse(dat, "window=manifest;size=387x420;can_close=1")
|
||||
|
||||
/mob/dead/observer/Topic(href, href_list)
|
||||
if(href_list["follow"])
|
||||
var/atom/movable/target = locate(href_list["follow"])
|
||||
if((usr == src) && istype(target) && (target != src)) //for safety against href exploits
|
||||
ManualFollow(target)
|
||||
|
||||
|
||||
@@ -248,9 +248,9 @@
|
||||
..()
|
||||
modules += new /obj/item/device/flashlight(src)
|
||||
modules += new /obj/item/weapon/melee/energy/sword/cyborg(src)
|
||||
modules += new /obj/item/weapon/gun/energy/crossbow/cyborg(src)
|
||||
modules += new /obj/item/weapon/gun/energy/printer(src)
|
||||
modules += new /obj/item/weapon/gun/projectile/revolver/grenadelauncher/cyborg(src)
|
||||
modules += new /obj/item/weapon/card/emag(src)
|
||||
modules += new /obj/item/weapon/gun/energy/laser/cyborg(src)
|
||||
modules += new /obj/item/weapon/tank/jetpack/carbondioxide(src)
|
||||
modules += new /obj/item/weapon/crowbar(src)
|
||||
emag = null
|
||||
|
||||
+47
-21
@@ -82,24 +82,37 @@ var/next_mob_id = 0
|
||||
// blind_message (optional) is what blind people will hear e.g. "You hear something!"
|
||||
|
||||
/mob/visible_message(var/message, var/self_message, var/blind_message)
|
||||
var/list/atom_viewers = list()
|
||||
for(var/atom/movable/A in view(src))
|
||||
atom_viewers |= recursive_hear_check(A)
|
||||
atom_viewers |= src
|
||||
for(var/mob/M in atom_viewers)
|
||||
var/list/mob_viewers = list()
|
||||
var/list/possible_viewers = list()
|
||||
mob_viewers |= src
|
||||
mob_viewers |= viewers(src)
|
||||
var/heard = get_hear(7, src)
|
||||
for(var/atom/movable/A in heard)
|
||||
possible_viewers |= recursive_hear_check(A)
|
||||
for(var/mob/B in possible_viewers)
|
||||
if(B in mob_viewers)
|
||||
continue
|
||||
if(isturf(B.loc))
|
||||
continue
|
||||
var/turf/T = get_turf(B)
|
||||
if(src in view(T))
|
||||
mob_viewers |= B
|
||||
|
||||
for(var/mob/M in mob_viewers)
|
||||
if(M.see_invisible < invisibility)
|
||||
continue //can't view the invisible
|
||||
var/msg = message
|
||||
if(self_message && M==src)
|
||||
msg = self_message
|
||||
M.show_message( msg, 1)
|
||||
M.show_message(msg, 1)
|
||||
|
||||
if(blind_message)
|
||||
var/list/atom_hearers = list()
|
||||
for(var/atom/movable/O in get_hearers_in_view(7, src))
|
||||
if(O in atom_viewers)
|
||||
var/list/mob_hearers = list()
|
||||
for(var/mob/C in get_hearers_in_view(7, src))
|
||||
if(C in mob_viewers)
|
||||
continue
|
||||
atom_hearers |= O
|
||||
for(var/mob/MOB in atom_hearers)
|
||||
mob_hearers |= C
|
||||
for(var/mob/MOB in mob_hearers)
|
||||
MOB.show_message(blind_message, 2)
|
||||
|
||||
// Show a message to all mobs who sees this atom
|
||||
@@ -108,18 +121,31 @@ var/next_mob_id = 0
|
||||
// blind_message (optional) is what blind people will hear e.g. "You hear something!"
|
||||
|
||||
/atom/proc/visible_message(var/message, var/blind_message)
|
||||
var/list/atom_viewers = list()
|
||||
for(var/atom/movable/A in view(src))
|
||||
atom_viewers |= recursive_hear_check(A)
|
||||
for(var/mob/M in atom_viewers)
|
||||
M.show_message( message, 1)
|
||||
var/list/mob_viewers = list()
|
||||
var/list/possible_viewers = list()
|
||||
mob_viewers |= viewers(src)
|
||||
var/heard = get_hear(7, src)
|
||||
for(var/atom/movable/A in heard)
|
||||
possible_viewers |= recursive_hear_check(A)
|
||||
for(var/mob/B in possible_viewers)
|
||||
if(B in mob_viewers)
|
||||
continue
|
||||
if(isturf(B.loc))
|
||||
continue
|
||||
var/turf/T = get_turf(B)
|
||||
if(src in view(T))
|
||||
mob_viewers |= B
|
||||
|
||||
for(var/mob/M in mob_viewers)
|
||||
M.show_message(message, 1)
|
||||
|
||||
if(blind_message)
|
||||
var/list/atom_hearers = list()
|
||||
for(var/atom/movable/O in get_hearers_in_view(7, src))
|
||||
if(O in atom_viewers)
|
||||
var/list/mob_hearers = list()
|
||||
for(var/mob/C in get_hearers_in_view(7, src))
|
||||
if(C in mob_viewers)
|
||||
continue
|
||||
atom_hearers |= O
|
||||
for(var/mob/MOB in atom_hearers)
|
||||
mob_hearers |= C
|
||||
for(var/mob/MOB in mob_hearers)
|
||||
MOB.show_message(blind_message, 2)
|
||||
|
||||
// Show a message to all mobs in earshot of this one
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
output += "<p>\[ <a href='byond://?src=\ref[src];ready=1'>Ready</a> | <b>Not Ready</b> \]</p>"
|
||||
|
||||
else
|
||||
output += "<a href='byond://?src=\ref[src];manifest=1'>View the Crew Manifest</A><br><br>"
|
||||
output += "<p><a href='byond://?src=\ref[src];manifest=1'>View the Crew Manifest</A></p>"
|
||||
output += "<p><a href='byond://?src=\ref[src];late_join=1'>Join Game!</A></p>"
|
||||
|
||||
output += "<p><a href='byond://?src=\ref[src];observe=1'>Observe</A></p>"
|
||||
@@ -56,7 +56,7 @@
|
||||
output += "</center>"
|
||||
|
||||
//src << browse(output,"window=playersetup;size=210x240;can_close=0")
|
||||
var/datum/browser/popup = new(src, "playersetup", "<div align='center'>New Player Options</div>", 220, 250)
|
||||
var/datum/browser/popup = new(src, "playersetup", "<div align='center'>New Player Options</div>", 220, 265)
|
||||
popup.set_window_options("can_close=0")
|
||||
popup.set_content(output)
|
||||
popup.open(0)
|
||||
@@ -370,7 +370,7 @@
|
||||
dat += "<h4>Crew Manifest</h4>"
|
||||
dat += data_core.get_manifest(OOC = 1)
|
||||
|
||||
src << browse(dat, "window=manifest;size=370x420;can_close=1")
|
||||
src << browse(dat, "window=manifest;size=387x420;can_close=1")
|
||||
|
||||
/mob/new_player/Move()
|
||||
return 0
|
||||
|
||||
@@ -34,8 +34,6 @@
|
||||
BB = new projectile_type(src)
|
||||
return
|
||||
|
||||
|
||||
|
||||
//Boxes of ammo
|
||||
/obj/item/ammo_box
|
||||
name = "ammo box (null_reference_exception)"
|
||||
|
||||
@@ -136,9 +136,9 @@
|
||||
caliber = "a762"
|
||||
projectile_type = /obj/item/projectile/bullet
|
||||
|
||||
/obj/item/ammo_casing/a545
|
||||
desc = "A 5.45mm bullet casing."
|
||||
caliber = "a545"
|
||||
/obj/item/ammo_casing/a556
|
||||
desc = "A 5.56mm bullet casing."
|
||||
caliber = "a556"
|
||||
projectile_type = /obj/item/projectile/bullet/heavybullet
|
||||
|
||||
/obj/item/ammo_casing/caseless
|
||||
@@ -164,3 +164,11 @@
|
||||
caliber = "40mm"
|
||||
icon_state = "40mmHE"
|
||||
projectile_type = /obj/item/projectile/bullet/a40mm
|
||||
|
||||
/obj/item/ammo_casing/caseless/bolt //xbow
|
||||
name = "poison crossbow bolt"
|
||||
desc = "A reusable crossbow bolt tipped with specialized carpotoxin."
|
||||
projectile_type = /obj/item/projectile/energy/bolt
|
||||
caliber = "crossbow"
|
||||
icon = 'icons/obj/projectiles.dmi'
|
||||
icon_state = "cbbolt"
|
||||
@@ -38,4 +38,10 @@
|
||||
icon_state = "40mm"
|
||||
ammo_type = /obj/item/ammo_casing/a40mm
|
||||
max_ammo = 4
|
||||
multiple_sprites = 1
|
||||
multiple_sprites = 1
|
||||
|
||||
/obj/item/ammo_box/crossbow
|
||||
name = "ammo box (crossbow bolts)"
|
||||
icon_state = "xbow"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/bolt
|
||||
max_ammo = 4
|
||||
@@ -64,15 +64,6 @@
|
||||
projectile_type = /obj/item/projectile/lasertag/redtag
|
||||
select_name = "redtag"
|
||||
|
||||
/obj/item/ammo_casing/energy/bolt
|
||||
projectile_type = /obj/item/projectile/energy/bolt
|
||||
select_name = "bolt"
|
||||
fire_sound = 'sound/weapons/Genhit.ogg'
|
||||
|
||||
/obj/item/ammo_casing/energy/bolt/large
|
||||
projectile_type = /obj/item/projectile/energy/bolt/large
|
||||
select_name = "heavy bolt"
|
||||
|
||||
/obj/item/ammo_casing/energy/xray
|
||||
projectile_type = /obj/item/projectile/beam/xray
|
||||
e_cost = 50
|
||||
@@ -82,9 +73,11 @@
|
||||
projectile_type = /obj/item/projectile/energy/electrode
|
||||
select_name = "stun"
|
||||
fire_sound = 'sound/weapons/taser.ogg'
|
||||
e_cost = 200
|
||||
|
||||
/obj/item/ammo_casing/energy/electrode/gun
|
||||
fire_sound = 'sound/weapons/gunshot.ogg'
|
||||
e_cost = 100
|
||||
|
||||
/obj/item/ammo_casing/energy/ion
|
||||
projectile_type = /obj/item/projectile/ion
|
||||
@@ -149,5 +142,4 @@
|
||||
|
||||
/obj/item/ammo_casing/energy/wormhole/orange
|
||||
projectile_type = /obj/item/projectile/beam/wormhole/orange
|
||||
select_name = "orange"
|
||||
|
||||
select_name = "orange"
|
||||
|
||||
@@ -90,6 +90,15 @@
|
||||
ammo_type = /obj/item/ammo_casing/a40mm
|
||||
max_ammo = 6
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/cylinder/crossbow
|
||||
name = "autocrossbow internal magazine"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/bolt
|
||||
caliber = "crossbow"
|
||||
max_ammo = 10
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/cylinder/crossbow/large
|
||||
max_ammo = 15
|
||||
|
||||
///////////EXTERNAL MAGAZINES////////////////
|
||||
|
||||
/obj/item/ammo_box/magazine/m10mm
|
||||
@@ -159,17 +168,14 @@ obj/item/ammo_box/magazine/tommygunm45
|
||||
multiple_sprites = 2
|
||||
max_ammo = 8
|
||||
|
||||
/obj/item/ammo_box/magazine/m545
|
||||
name = "box magazine (5.45mm)"
|
||||
icon_state = "5.45m"
|
||||
/obj/item/ammo_box/magazine/m556
|
||||
name = "toploader magazine (5.56mm)"
|
||||
icon_state = "5.56m"
|
||||
origin_tech = "combat=5;syndicate=1"
|
||||
ammo_type = /obj/item/ammo_casing/a545
|
||||
caliber = "a545"
|
||||
ammo_type = /obj/item/ammo_casing/a556
|
||||
caliber = "a556"
|
||||
max_ammo = 30
|
||||
|
||||
/obj/item/ammo_box/magazine/m545/update_icon()
|
||||
..()
|
||||
icon_state = "[initial(icon_state)]-[round(ammo_count(),10)]"
|
||||
multiple_sprites = 2
|
||||
|
||||
/obj/item/ammo_box/magazine/m762
|
||||
name = "box magazine (7.62mm)"
|
||||
|
||||
@@ -34,4 +34,10 @@
|
||||
/obj/item/ammo_casing/syringegun
|
||||
name = "syringe gun spring"
|
||||
desc = "A high-power spring that throws syringes."
|
||||
projectile_type = null
|
||||
projectile_type = null
|
||||
|
||||
/obj/item/ammo_casing/energy/c3dbullet
|
||||
projectile_type = /obj/item/projectile/bullet/midbullet3
|
||||
select_name = "spraydown"
|
||||
fire_sound = 'sound/weapons/gunshot_smg.ogg'
|
||||
e_cost = 20
|
||||
@@ -30,6 +30,8 @@
|
||||
var/sawn_state = SAWN_INTACT
|
||||
var/burst_size = 1
|
||||
var/fire_delay = 0
|
||||
var/obj/item/device/flashlight/F = null
|
||||
var/can_flashlight = 0
|
||||
|
||||
/obj/item/weapon/gun/proc/process_chamber()
|
||||
return 0
|
||||
@@ -145,4 +147,83 @@
|
||||
if(user.a_intent == "harm") //Flogging
|
||||
..()
|
||||
else
|
||||
return
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/attackby(var/obj/item/A as obj, mob/user as mob)
|
||||
if(istype(A, /obj/item/device/flashlight/seclite))
|
||||
var/obj/item/device/flashlight/seclite/S = A
|
||||
if(can_flashlight)
|
||||
if(!F)
|
||||
if(user.l_hand != src && user.r_hand != src)
|
||||
user << "<span class='notice'>You'll need [src] in your hands to do that.</span>"
|
||||
return
|
||||
user.drop_item()
|
||||
user << "<span class='notice'>You click [S] into place on [src].</span>"
|
||||
if(S.on)
|
||||
SetLuminosity(0)
|
||||
F = S
|
||||
A.loc = src
|
||||
update_icon()
|
||||
update_gunlight(user)
|
||||
if(istype(A, /obj/item/weapon/screwdriver))
|
||||
if(F)
|
||||
if(user.l_hand != src && user.r_hand != src)
|
||||
user << "<span class='notice'>You'll need [src] in your hands to do that.</span>"
|
||||
return
|
||||
for(var/obj/item/device/flashlight/seclite/S in src)
|
||||
user << "<span class='notice'>You unscrew the seclite from [src].</span>"
|
||||
F = null
|
||||
S.loc = get_turf(user)
|
||||
update_gunlight(user)
|
||||
S.update_brightness(user)
|
||||
update_icon()
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/verb/toggle_gunlight()
|
||||
set name = "Toggle Gunlight"
|
||||
set category = "Object"
|
||||
set desc = "Click to toggle your weapon's attached flashlight."
|
||||
var/mob/living/carbon/human/user = usr
|
||||
if(!isturf(user.loc))
|
||||
user << "You cannot turn the light on while in this [user.loc]."
|
||||
F.on = !F.on
|
||||
user << "<span class='notice'>You toggle the gunlight [F.on ? "on":"off"].</span>"
|
||||
|
||||
playsound(user, 'sound/weapons/empty.ogg', 100, 1)
|
||||
update_gunlight(user)
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/proc/update_gunlight(var/mob/user = null)
|
||||
if(F)
|
||||
action_button_name = "Toggle Gunlight"
|
||||
if(F.on)
|
||||
if(loc == user)
|
||||
user.AddLuminosity(F.brightness_on)
|
||||
else if(isturf(loc))
|
||||
SetLuminosity(F.brightness_on)
|
||||
else
|
||||
if(loc == user)
|
||||
user.AddLuminosity(-F.brightness_on)
|
||||
else if(isturf(loc))
|
||||
SetLuminosity(0)
|
||||
update_icon()
|
||||
else
|
||||
action_button_name = null
|
||||
if(loc == user)
|
||||
user.AddLuminosity(-5)
|
||||
else if(isturf(loc))
|
||||
SetLuminosity(0)
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/pickup(mob/user)
|
||||
if(F)
|
||||
if(F.on)
|
||||
user.AddLuminosity(F.brightness_on)
|
||||
SetLuminosity(0)
|
||||
|
||||
/obj/item/weapon/gun/dropped(mob/user)
|
||||
if(F)
|
||||
if(F.on)
|
||||
user.AddLuminosity(-F.brightness_on)
|
||||
SetLuminosity(F.brightness_on)
|
||||
|
||||
@@ -79,4 +79,13 @@
|
||||
icon_state = "[initial(icon_state)][shot.mod_name][ratio]"
|
||||
if (2)
|
||||
icon_state = "[initial(icon_state)][shot.select_name][ratio]"
|
||||
return
|
||||
overlays.Cut()
|
||||
if(F)
|
||||
if(F.on)
|
||||
overlays += "flight-on"
|
||||
else
|
||||
overlays += "flight"
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/energy/ui_action_click()
|
||||
toggle_gunlight()
|
||||
@@ -6,6 +6,7 @@
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser)
|
||||
origin_tech = "combat=3;magnets=2"
|
||||
modifystate = 2
|
||||
can_flashlight = 1
|
||||
|
||||
/obj/item/weapon/gun/energy/gun/attack_self(mob/living/user as mob)
|
||||
select_fire(user)
|
||||
@@ -20,6 +21,7 @@
|
||||
var/charge_tick = 0
|
||||
modifystate = 0
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
|
||||
can_flashlight = 0
|
||||
|
||||
/obj/item/weapon/gun/energy/gun/nuclear/New()
|
||||
..()
|
||||
|
||||
@@ -134,7 +134,6 @@
|
||||
icon_state = "disabler"
|
||||
item_state = null
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/disabler)
|
||||
cell_type = "/obj/item/weapon/stock_parts/cell"
|
||||
|
||||
|
||||
/obj/item/weapon/gun/energy/wormhole_projector
|
||||
@@ -180,3 +179,42 @@
|
||||
if(orange && blue)
|
||||
blue.target = get_turf(orange)
|
||||
orange.target = get_turf(blue)
|
||||
|
||||
|
||||
/* 3d printer 'pseudo guns' for borgs */
|
||||
|
||||
/obj/item/weapon/gun/energy/printer
|
||||
name = "cyborg lmg"
|
||||
desc = "A machinegun that fires 3d-printed flachettes slowly regenerated using a cyborg's internal power source."
|
||||
icon_state = "l6closed0"
|
||||
cell_type = "/obj/item/weapon/stock_parts/cell/secborg"
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/c3dbullet)
|
||||
var/charge_tick = 0
|
||||
var/recharge_time = 5
|
||||
|
||||
/obj/item/weapon/gun/energy/printer/update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/energy/printer/New()
|
||||
..()
|
||||
SSobj.processing.Add(src)
|
||||
|
||||
|
||||
/obj/item/weapon/gun/energy/printer/Destroy()
|
||||
SSobj.processing.Remove(src)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/gun/energy/printer/process()
|
||||
charge_tick++
|
||||
if(charge_tick < recharge_time) return 0
|
||||
charge_tick = 0
|
||||
|
||||
if(!power_supply) return 0 //sanity
|
||||
if(isrobot(src.loc))
|
||||
var/mob/living/silicon/robot/R = src.loc
|
||||
if(R && R.cell)
|
||||
var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot
|
||||
if(R.cell.use(shot.e_cost)) //Take power from the borg...
|
||||
power_supply.give(shot.e_cost) //...to recharge the shot
|
||||
|
||||
return 1
|
||||
|
||||
@@ -5,30 +5,29 @@
|
||||
icon_state = "taser"
|
||||
item_state = null //so the human update icon uses the icon_state instead.
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/electrode)
|
||||
cell_type = "/obj/item/weapon/stock_parts/cell/crap"
|
||||
|
||||
/obj/item/weapon/gun/energy/stunrevolver
|
||||
name = "stun revolver"
|
||||
desc = "A high-tech revolver that fires internal, reusable stun cartidges in a revolving cylinder."
|
||||
desc = "A high-tech revolver that fires internal, reusable stun cartidges in a revolving cylinder. Holds twice as many electrodes as a standard taser."
|
||||
icon_state = "stunrevolver"
|
||||
origin_tech = "combat=3;materials=3;powerstorage=2"
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/electrode/gun)
|
||||
cell_type = "/obj/item/weapon/stock_parts/cell"
|
||||
can_flashlight = 0
|
||||
|
||||
/obj/item/weapon/gun/energy/gun/advtaser
|
||||
name = "advanced taser"
|
||||
desc = "A hybrid taser designed to fire both short-range high-power electrodes and long-range disabler beams."
|
||||
name = "hybrid taser"
|
||||
desc = "A dual-mode taser designed to fire both short-range high-power electrodes and long-range disabler beams."
|
||||
icon_state = "advtaser"
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/disabler)
|
||||
cell_type = "/obj/item/weapon/stock_parts/cell/crap"
|
||||
origin_tech = null
|
||||
|
||||
/obj/item/weapon/gun/energy/gun/advtaser/cyborg
|
||||
name = "advanced taser"
|
||||
desc = "An integrated advanced taser that draws directly from a cyborg's power cell. The weapon contains a limiter to prevent the cyborg's power cell from overheating."
|
||||
cell_type = "/obj/item/weapon/stock_parts/cell/secborg"
|
||||
name = "cyborg taser"
|
||||
desc = "An integrated hybrid taser that draws directly from a cyborg's power cell. The weapon contains a limiter to prevent the cyborg's power cell from overheating."
|
||||
var/charge_tick = 0
|
||||
var/recharge_time = 10
|
||||
can_flashlight = 0
|
||||
|
||||
/obj/item/weapon/gun/energy/gun/advtaser/cyborg/New()
|
||||
..()
|
||||
@@ -54,59 +53,3 @@
|
||||
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
|
||||
/obj/item/weapon/gun/energy/crossbow
|
||||
name = "mini energy crossbow"
|
||||
desc = "A weapon favored by syndicate stealth specialists."
|
||||
icon_state = "crossbow"
|
||||
item_state = "crossbow"
|
||||
w_class = 2.0
|
||||
m_amt = 2000
|
||||
origin_tech = "combat=2;magnets=2;syndicate=5"
|
||||
suppressed = 1
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/bolt)
|
||||
cell_type = "/obj/item/weapon/stock_parts/cell/crap"
|
||||
var/charge_tick = 0
|
||||
|
||||
|
||||
/obj/item/weapon/gun/energy/crossbow/New()
|
||||
..()
|
||||
SSobj.processing.Add(src)
|
||||
|
||||
|
||||
/obj/item/weapon/gun/energy/crossbow/Destroy()
|
||||
SSobj.processing.Remove(src)
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/weapon/gun/energy/crossbow/process()
|
||||
charge_tick++
|
||||
if(charge_tick < 4) return 0
|
||||
charge_tick = 0
|
||||
if(!power_supply) return 0
|
||||
power_supply.give(100)
|
||||
return 1
|
||||
|
||||
|
||||
/obj/item/weapon/gun/energy/crossbow/update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/energy/crossbow/cyborg/newshot()
|
||||
if(isrobot(src.loc))
|
||||
var/mob/living/silicon/robot/R = src.loc
|
||||
if(R && R.cell)
|
||||
var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot
|
||||
if(R.cell.use(shot.e_cost))
|
||||
chambered = shot
|
||||
chambered.newshot()
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/energy/crossbow/largecrossbow
|
||||
name = "energy crossbow"
|
||||
desc = "A weapon favored by syndicate carp hunters."
|
||||
icon_state = "crossbowlarge"
|
||||
w_class = 3.0
|
||||
force = 10
|
||||
m_amt = 4000
|
||||
suppressed = 0
|
||||
@@ -9,8 +9,8 @@
|
||||
can_suppress = 1
|
||||
burst_size = 3
|
||||
fire_delay = 1
|
||||
var/select = 0
|
||||
action_button_name = "Toggle Fire Mode"
|
||||
var/select = 1
|
||||
action_button_name = "Toggle Firemode"
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/update_icon()
|
||||
..()
|
||||
@@ -23,28 +23,40 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/attackby(var/obj/item/A as obj, mob/user as mob)
|
||||
if(..() && chambered)
|
||||
alarmed = 0
|
||||
if(istype(A, /obj/item/ammo_box/magazine))
|
||||
var/obj/item/ammo_box/magazine/AM = A
|
||||
if(istype(AM, mag_type))
|
||||
if(magazine)
|
||||
user << "<span class='notice'>You perform a tactical reload on \the [src], replacing the magazine.</span>"
|
||||
magazine.loc = get_turf(src.loc)
|
||||
magazine.update_icon()
|
||||
magazine = null
|
||||
else
|
||||
user << "<span class='notice'>You insert the magazine into \the [src].</span>"
|
||||
user.remove_from_mob(AM)
|
||||
magazine = AM
|
||||
magazine.loc = src
|
||||
chamber_round()
|
||||
A.update_icon()
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/ui_action_click()
|
||||
burst_select()
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/verb/burst_select()
|
||||
set name = "Toggle Fire Mode"
|
||||
set category = "Object"
|
||||
set desc = "Click to switch fire modes."
|
||||
/obj/item/weapon/gun/projectile/automatic/proc/burst_select()
|
||||
var/mob/living/carbon/human/user = usr
|
||||
select = !select
|
||||
if(select)
|
||||
select = 0
|
||||
burst_size = 1
|
||||
fire_delay = 0
|
||||
user << "<span class='notice'>You switch to semi-automatic.</span>"
|
||||
else
|
||||
select = 1
|
||||
burst_size = initial(burst_size)
|
||||
fire_delay = initial(fire_delay)
|
||||
user << "<span class='notice'>You switch to [burst_size]-rnd burst.</span>"
|
||||
|
||||
playsound(user, 'sound/weapons/empty.ogg', 100, 1)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
@@ -98,12 +110,8 @@
|
||||
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
|
||||
var/cover_open = 0
|
||||
can_suppress = 0
|
||||
burst_size = 1
|
||||
fire_delay = 0
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/l6_saw/burst_select()
|
||||
return
|
||||
|
||||
burst_size = 5
|
||||
fire_delay = 3
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/l6_saw/attack_self(mob/user as mob)
|
||||
cover_open = !cover_open
|
||||
@@ -145,71 +153,70 @@
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/c90gl
|
||||
name = "syndicate assault rifle"
|
||||
desc = "A bullpup three-round burst 5.45x39 assault rifle with a unique toploading design, designated 'C-90gl'. Has an attached underbarrel grenade launcher which can be toggled on and off."
|
||||
icon_state = "c90gl"
|
||||
item_state = "c90gl"
|
||||
/obj/item/weapon/gun/projectile/automatic/m90
|
||||
name = "syndicate carbine"
|
||||
desc = "A three-round burst 5.56 toploading carbine, designated 'M-90gl'. Has an attached underbarrel grenade launcher which can be toggled on and off."
|
||||
icon_state = "m90"
|
||||
item_state = "m90"
|
||||
origin_tech = "combat=5;materials=2;syndicate=8"
|
||||
mag_type = /obj/item/ammo_box/magazine/m545
|
||||
mag_type = /obj/item/ammo_box/magazine/m556
|
||||
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
|
||||
action_button_name = "Toggle Grenade Launcher"
|
||||
can_suppress = 0
|
||||
var/obj/item/weapon/gun/projectile/revolver/grenadelauncher/underbarrel
|
||||
burst_size = 3
|
||||
fire_delay = 2
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/c90gl/New()
|
||||
/obj/item/weapon/gun/projectile/automatic/m90/New()
|
||||
..()
|
||||
underbarrel = new /obj/item/weapon/gun/projectile/revolver/grenadelauncher(src)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/c90gl/afterattack(var/atom/target, var/mob/living/user, flag, params)
|
||||
/obj/item/weapon/gun/projectile/automatic/m90/afterattack(var/atom/target, var/mob/living/user, flag, params)
|
||||
if(select == 2)
|
||||
underbarrel.afterattack(target, user, flag, params)
|
||||
else
|
||||
..()
|
||||
empty_alarm()
|
||||
return
|
||||
/obj/item/weapon/gun/projectile/automatic/c90gl/attackby(var/obj/item/A, mob/user)
|
||||
if(select == 2)
|
||||
underbarrel.attackby(A, user)
|
||||
else
|
||||
..()
|
||||
/obj/item/weapon/gun/projectile/automatic/c90gl/attack_self(var/mob/living/user)
|
||||
if(select == 2)
|
||||
underbarrel.attack_self(user)
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/m90/attackby(var/obj/item/A, mob/user)
|
||||
if(istype(A, /obj/item/ammo_casing))
|
||||
if(istype(A, underbarrel.magazine.ammo_type))
|
||||
underbarrel.attack_self()
|
||||
underbarrel.attackby(A, user)
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/c90gl/update_icon()
|
||||
/obj/item/weapon/gun/projectile/automatic/m90/update_icon()
|
||||
..()
|
||||
overlays.Cut()
|
||||
if(!select)
|
||||
overlays += "[initial(icon_state)]semi"
|
||||
if(select == 1)
|
||||
overlays += "[initial(icon_state)]burst"
|
||||
if(select == 2)
|
||||
overlays += "[initial(icon_state)]gren"
|
||||
icon_state = "c90gl[magazine ? "-[Ceiling(get_ammo(0)/6)*6]" : ""][chambered ? "" : "-e"]"
|
||||
switch(select)
|
||||
if(0)
|
||||
overlays += "[initial(icon_state)]semi"
|
||||
if(1)
|
||||
overlays += "[initial(icon_state)]burst"
|
||||
if(2)
|
||||
overlays += "[initial(icon_state)]gren"
|
||||
icon_state = "[initial(icon_state)][magazine ? "" : "-e"]"
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/c90gl/burst_select()
|
||||
/obj/item/weapon/gun/projectile/automatic/m90/burst_select()
|
||||
var/mob/living/carbon/human/user = usr
|
||||
if(!select)
|
||||
select = 1
|
||||
burst_size = initial(burst_size)
|
||||
fire_delay = initial(fire_delay)
|
||||
user << "<span class='notice'>You switch to [burst_size]-rnd burst.</span>"
|
||||
if(select == 1)
|
||||
select = 2
|
||||
user << "<span class='notice'>You switch to grenades.</span>"
|
||||
if(select == 2)
|
||||
select = 0
|
||||
burst_size = 1
|
||||
fire_delay = 0
|
||||
user << "<span class='notice'>You switch to semi-auto.</span>"
|
||||
switch(select)
|
||||
if(0)
|
||||
select = 1
|
||||
burst_size = initial(burst_size)
|
||||
fire_delay = initial(fire_delay)
|
||||
user << "<span class='notice'>You switch to [burst_size]-rnd burst.</span>"
|
||||
if(1)
|
||||
select = 2
|
||||
user << "<span class='notice'>You switch to grenades.</span>"
|
||||
if(2)
|
||||
select = 0
|
||||
burst_size = 1
|
||||
fire_delay = 0
|
||||
user << "<span class='notice'>You switch to semi-auto.</span>"
|
||||
playsound(user, 'sound/weapons/empty.ogg', 100, 1)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
@@ -217,7 +224,7 @@
|
||||
name = "tommy gun"
|
||||
desc = "A genuine 'Chicago Typewriter'."
|
||||
icon_state = "tommygun"
|
||||
item_state = "tommygun"
|
||||
item_state = "shotgun"
|
||||
slot_flags = 0
|
||||
origin_tech = "combat=5;materials=1;syndicate=2"
|
||||
mag_type = /obj/item/ammo_box/magazine/tommygunm45
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
icon_state = "dshotgun-sawn"
|
||||
item_state = "gun"
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/grenadelauncher
|
||||
fire_sound = 'sound/weapons/grenadelaunch.ogg'
|
||||
w_class = 3
|
||||
|
||||
/obj/item/weapon/gun/projectile/revolver/grenadelauncher/attackby(var/obj/item/A, mob/user)
|
||||
@@ -14,22 +15,26 @@
|
||||
if(istype(A, /obj/item/ammo_box) || istype(A, /obj/item/ammo_casing))
|
||||
chamber_round()
|
||||
|
||||
/obj/item/weapon/gun/projectile/revolver/grenadelauncher/multi
|
||||
desc = "A revolving 6-shot grenade launcher."
|
||||
/obj/item/weapon/gun/projectile/revolver/grenadelauncher/cyborg
|
||||
desc = "A 6-shot grenade launcher."
|
||||
name = "multi grenade launcher"
|
||||
icon_state = "bulldog"
|
||||
item_state = "bulldog"
|
||||
icon = 'icons/mecha/mecha_equipment.dmi'
|
||||
icon_state = "mecha_grenadelnchr"
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/grenadelauncher/multi
|
||||
|
||||
/obj/item/weapon/gun/projectile/revolver/grenadelauncher/cyborg/attack_self()
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/gyropistol
|
||||
name = "gyrojet pistol"
|
||||
desc = "A prototype pistol designed to fire self propelled rockets."
|
||||
icon_state = "gyropistol"
|
||||
fire_sound = 'sound/effects/Explosion1.ogg'
|
||||
fire_sound = 'sound/weapons/grenadelaunch.ogg'
|
||||
origin_tech = "combat=3"
|
||||
mag_type = /obj/item/ammo_box/magazine/m75
|
||||
burst_size = 1
|
||||
fire_delay = 0
|
||||
action_button_name = null
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/gyropistol/process_chamber(var/eject_casing = 0, var/empty_chamber = 1)
|
||||
..()
|
||||
@@ -37,4 +42,46 @@
|
||||
/obj/item/weapon/gun/projectile/automatic/gyropistol/update_icon()
|
||||
..()
|
||||
icon_state = "[initial(icon_state)][magazine ? "loaded" : ""]"
|
||||
return
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/crossbow
|
||||
name = "mini auto-crossbow"
|
||||
desc = "A weapon favored by syndicate stealth specialists. Fires specialized poison bolts."
|
||||
icon_state = "crossbow"
|
||||
item_state = "crossbow"
|
||||
w_class = 2
|
||||
m_amt = 2000
|
||||
origin_tech = "combat=2;magnets=2;syndicate=5"
|
||||
suppressed = 1
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/crossbow
|
||||
fire_sound = 'sound/weapons/genhit.ogg'
|
||||
burst_size = 1
|
||||
fire_delay = 0
|
||||
select = 0
|
||||
action_button_name = null
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/crossbow/update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/crossbow/attack_self()
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/crossbow/process_chamber(var/eject_casing = 0, var/empty_chamber = 1)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/crossbow/attackby(var/obj/item/A, mob/user)
|
||||
var/num_loaded = magazine.attackby(A, user, 1)
|
||||
if(num_loaded)
|
||||
user << "<span class='notice'>You load [num_loaded] bolt\s into \the [src].</span>"
|
||||
update_icon()
|
||||
chamber_round()
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/crossbow/large //holds twice the ammo of mini crossbows but can't be pocketed
|
||||
name = "auto crossbow"
|
||||
desc = "A weapon favored by carp hunters. Fires specialized poison bolts."
|
||||
icon_state = "crossbowlarge"
|
||||
w_class = 3
|
||||
force = 10
|
||||
m_amt = 4000
|
||||
suppressed = 0
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/crossbow/large
|
||||
@@ -8,6 +8,7 @@
|
||||
can_suppress = 1
|
||||
burst_size = 1
|
||||
fire_delay = 0
|
||||
action_button_name = null
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/pistol/update_icon()
|
||||
..()
|
||||
|
||||
@@ -204,8 +204,9 @@
|
||||
mag_type = /obj/item/ammo_box/magazine/m12g
|
||||
fire_sound = 'sound/weapons/Gunshot.ogg'
|
||||
can_suppress = 0
|
||||
burst_size = 2
|
||||
fire_delay = 1
|
||||
burst_size = 1
|
||||
fire_delay = 0
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/New()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
icon_state = "omnilaser"
|
||||
damage = 36
|
||||
damage_type = STAMINA
|
||||
flag = "energy"
|
||||
hitsound = 'sound/weapons/tap.ogg'
|
||||
eyeblur = 0
|
||||
|
||||
|
||||
@@ -7,14 +7,15 @@
|
||||
flag = "bullet"
|
||||
|
||||
|
||||
/obj/item/projectile/bullet/weakbullet
|
||||
/obj/item/projectile/bullet/weakbullet //beanbag, heavy stamina damage
|
||||
damage = 5
|
||||
stamina = 33
|
||||
stamina = 80
|
||||
|
||||
|
||||
/obj/item/projectile/bullet/weakbullet2
|
||||
/obj/item/projectile/bullet/weakbullet2 //detective revolver instastuns, but multiple shots are better for keeping punks down
|
||||
damage = 15
|
||||
stamina = 75 //the detective can't shoot in bursts and will get yelled at if he sinks 50 rounds into perps to stun 'em
|
||||
weaken = 3
|
||||
stamina = 50
|
||||
|
||||
/obj/item/projectile/bullet/weakbullet3
|
||||
damage = 20
|
||||
@@ -28,7 +29,8 @@
|
||||
|
||||
/obj/item/projectile/bullet/midbullet
|
||||
damage = 20
|
||||
stamina = 50 //two round bursts from the c20r
|
||||
stamina = 65 //two round bursts from the c20r knocks people down
|
||||
|
||||
|
||||
/obj/item/projectile/bullet/midbullet2
|
||||
damage = 25
|
||||
@@ -40,10 +42,16 @@
|
||||
damage = 35
|
||||
|
||||
|
||||
/obj/item/projectile/bullet/stunshot
|
||||
/obj/item/projectile/bullet/stunshot //taser slugs for shotguns, nothing special
|
||||
name = "stunshot"
|
||||
damage = 5
|
||||
stamina = 50 //two round bursts from the bulldog
|
||||
stun = 5
|
||||
weaken = 5
|
||||
stutter = 5
|
||||
jitter = 20
|
||||
range = 7
|
||||
icon_state = "spark"
|
||||
color = "#FFFF00"
|
||||
|
||||
/obj/item/projectile/bullet/incendiary/on_hit(var/atom/target, var/blocked = 0)
|
||||
..()
|
||||
|
||||
@@ -4,18 +4,18 @@
|
||||
damage = 0
|
||||
damage_type = BURN
|
||||
flag = "energy"
|
||||
color = "#FFFF00"
|
||||
|
||||
|
||||
/obj/item/projectile/energy/electrode
|
||||
name = "electrode"
|
||||
icon_state = "spark"
|
||||
color = "#FFFF00"
|
||||
nodamage = 1
|
||||
stun = 5
|
||||
weaken = 5
|
||||
stutter = 5
|
||||
jitter = 20
|
||||
hitsound = "sparks"
|
||||
hitsound = 'sound/weapons/taserhit.ogg'
|
||||
range = 7
|
||||
|
||||
/obj/item/projectile/energy/electrode/on_hit(var/atom/target, var/blocked = 0)
|
||||
@@ -51,7 +51,7 @@
|
||||
weaken = 5
|
||||
range = 7
|
||||
|
||||
/obj/item/projectile/energy/bolt //ebow bolts
|
||||
/obj/item/projectile/energy/bolt //xbow bolts
|
||||
name = "bolt"
|
||||
icon_state = "cbbolt"
|
||||
damage = 15
|
||||
@@ -59,8 +59,15 @@
|
||||
nodamage = 0
|
||||
weaken = 5
|
||||
stutter = 5
|
||||
range = 10
|
||||
range = 7
|
||||
|
||||
/obj/item/projectile/energy/bolt/large
|
||||
name = "largebolt"
|
||||
damage = 20
|
||||
/obj/item/projectile/energy/bolt/on_hit(var/atom/target, var/blocked = 0) //drop a bolt on hitting basically anything
|
||||
if(!proj_hit)
|
||||
proj_hit = 1
|
||||
new /obj/item/ammo_casing/caseless/bolt(src.loc)
|
||||
..()
|
||||
|
||||
/obj/item/projectile/energy/bolt/on_range() //drop a bolt after 7 tiles
|
||||
if(!proj_hit)
|
||||
new /obj/item/ammo_casing/caseless/bolt(src.loc)
|
||||
..()
|
||||
@@ -28,7 +28,6 @@
|
||||
icon_state= "bolter"
|
||||
damage = 60
|
||||
flag = "bullet"
|
||||
range = 7
|
||||
|
||||
/obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = 0)
|
||||
explosion(target, -1, 0, 2, 1, 0, flame_range = 3)
|
||||
@@ -178,4 +177,4 @@ obj/item/projectile/kinetic/New()
|
||||
/obj/item/projectile/bullet/frag12
|
||||
name ="explosive slug"
|
||||
damage = 25
|
||||
weaken = 5
|
||||
weaken = 5
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
var/beaker = null
|
||||
var/recharged = 0
|
||||
var/recharge_delay = 15 //Time it game ticks between recharges
|
||||
var/image/icon_beaker = null //cached overlay
|
||||
var/list/dispensable_reagents = list("hydrogen","lithium","carbon","nitrogen","oxygen","fluorine",
|
||||
"sodium","aluminium","silicon","phosphorus","sulfur","chlorine","potassium","iron",
|
||||
"copper","mercury","radium","water","ethanol","sugar","sacid")
|
||||
@@ -138,7 +139,7 @@
|
||||
var/obj/item/weapon/reagent_containers/glass/B = beaker
|
||||
B.loc = loc
|
||||
beaker = null
|
||||
overlays -= "disp_beaker"
|
||||
overlays.Cut()
|
||||
|
||||
add_fingerprint(usr)
|
||||
return 1 // update UIs attached to this object
|
||||
@@ -159,7 +160,11 @@
|
||||
B.loc = src
|
||||
user << "You add the beaker to the machine!"
|
||||
SSnano.update_uis(src) // update all UIs attached to src
|
||||
overlays += "disp_beaker"
|
||||
|
||||
if(!icon_beaker)
|
||||
icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position.
|
||||
icon_beaker.pixel_x = rand(-10,5)
|
||||
overlays += icon_beaker
|
||||
|
||||
/obj/machinery/chem_dispenser/attack_ai(mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
@@ -12,11 +12,13 @@
|
||||
volume = 50
|
||||
flags = OPENCONTAINER
|
||||
|
||||
var/list/can_be_placed_into = list(
|
||||
can_be_placed_into = list(
|
||||
/obj/machinery/chem_master/,
|
||||
/obj/machinery/chem_dispenser/,
|
||||
/obj/machinery/reagentgrinder,
|
||||
/obj/machinery/biogenerator,
|
||||
/obj/structure/table,
|
||||
/obj/structure/rack,
|
||||
/obj/structure/closet,
|
||||
/obj/structure/sink,
|
||||
/obj/item/weapon/storage,
|
||||
@@ -35,10 +37,7 @@
|
||||
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/afterattack(obj/target, mob/user, proximity)
|
||||
if(!proximity) return // not adjacent
|
||||
for(var/type in can_be_placed_into)
|
||||
if(istype(target, type))
|
||||
return
|
||||
if((!proximity) || !check_allowed_items(target)) return
|
||||
|
||||
if(ismob(target) && target.reagents && reagents.total_volume)
|
||||
var/mob/M = target
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
possible_transfer_amounts = null //list(5, 10, 15)
|
||||
volume = 15
|
||||
var/mode = SYRINGE_DRAW
|
||||
var/busy = 0 // needed for delayed drawing of blood
|
||||
g_amt = 20
|
||||
m_amt = 10
|
||||
|
||||
@@ -43,6 +44,8 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/reagent_containers/syringe/afterattack(obj/target, mob/user , proximity)
|
||||
if(busy)
|
||||
return
|
||||
if(!proximity) return
|
||||
if(!target.reagents) return
|
||||
|
||||
@@ -81,8 +84,11 @@
|
||||
if(target != user)
|
||||
target.visible_message("<span class='danger'>[user] is trying to take a blood sample from [target]!</span>", \
|
||||
"<span class='userdanger'>[user] is trying to take a blood sample from [target]!</span>")
|
||||
busy = 1
|
||||
if(!do_mob(user, target))
|
||||
busy = 0
|
||||
return
|
||||
busy = 0
|
||||
B.holder = src
|
||||
B.volume = amount
|
||||
//set reagent data
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
req_tech = list("combat" = 5, "materials" = 5, "engineering" = 3, "biotech" = 4, "syndicate" = 3)
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 5000, "$glass" = 1500, "$uranium" = 1500, "$silver" = 1500)
|
||||
build_path = /obj/item/weapon/gun/energy/crossbow/largecrossbow
|
||||
build_path = /obj/item/weapon/gun/projectile/automatic/crossbow/large
|
||||
locked = 1
|
||||
category = list("Weapons")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user