Merge remote-tracking branch 'origin/master' into rustsql
This commit is contained in:
@@ -168,7 +168,7 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
datum/atom_hud/alternate_appearance/basic/onePerson
|
||||
/datum/atom_hud/alternate_appearance/basic/onePerson
|
||||
var/mob/seer
|
||||
|
||||
/datum/atom_hud/alternate_appearance/basic/onePerson/mobShouldSee(mob/M)
|
||||
|
||||
+4
-1
@@ -99,6 +99,9 @@
|
||||
///Mobs that are currently do_after'ing this atom, to be cleared from on Destroy()
|
||||
var/list/targeted_by
|
||||
|
||||
///Reference to atom being orbited
|
||||
var/atom/orbit_target
|
||||
|
||||
/**
|
||||
* Called when an atom is created in byond (built in engine proc)
|
||||
*
|
||||
@@ -548,7 +551,7 @@
|
||||
/atom/proc/contents_explosion(severity, target)
|
||||
return //For handling the effects of explosions on contents that would not normally be effected
|
||||
|
||||
/atom/proc/ex_act(severity, target)
|
||||
/atom/proc/ex_act(severity, target, datum/explosion/E)
|
||||
set waitfor = FALSE
|
||||
contents_explosion(severity, target)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target)
|
||||
|
||||
@@ -31,7 +31,14 @@
|
||||
var/list/client_mobs_in_contents // This contains all the client mobs within this container
|
||||
var/list/acted_explosions //for explosion dodging
|
||||
var/datum/forced_movement/force_moving = null //handled soley by forced_movement.dm
|
||||
var/movement_type = GROUND //Incase you have multiple types, you automatically use the most useful one. IE: Skating on ice, flippers on water, flying over chasm/space, etc.
|
||||
|
||||
/**
|
||||
* In case you have multiple types, you automatically use the most useful one.
|
||||
* IE: Skating on ice, flippers on water, flying over chasm/space, etc.
|
||||
* I reccomend you use the movetype_handler system and not modify this directly, especially for living mobs.
|
||||
*/
|
||||
var/movement_type = GROUND
|
||||
|
||||
var/atom/movable/pulling
|
||||
var/grab_state = 0
|
||||
var/throwforce = 0
|
||||
@@ -567,8 +574,8 @@
|
||||
return TRUE
|
||||
|
||||
//TODO: Better floating
|
||||
/atom/movable/proc/float(on)
|
||||
if(throwing)
|
||||
/atom/movable/proc/float(on, throw_override)
|
||||
if(throwing || !throw_override)
|
||||
return
|
||||
if(on && !(movement_type & FLOATING))
|
||||
animate(src, pixel_y = 2, time = 10, loop = -1, flags = ANIMATION_RELATIVE)
|
||||
|
||||
@@ -133,7 +133,7 @@
|
||||
icon_state = "knuckles"
|
||||
w_class = 3
|
||||
|
||||
datum/gang_item/clothing/shades //Addition: Why not have cool shades on a gang member anyways?
|
||||
/datum/gang_item/clothing/shades //Addition: Why not have cool shades on a gang member anyways?
|
||||
name = "Cool Sunglasses"
|
||||
id = "glasses"
|
||||
cost = 5
|
||||
@@ -313,13 +313,13 @@ datum/gang_item/clothing/shades //Addition: Why not have cool shades on a gang m
|
||||
permeability_coefficient = 0.01
|
||||
clothing_flags = NOSLIP
|
||||
|
||||
datum/gang_item/equipment/shield
|
||||
/datum/gang_item/equipment/shield
|
||||
name = "Riot Shield"
|
||||
id = "riot_shield"
|
||||
cost = 25
|
||||
item_path = /obj/item/shield/riot
|
||||
|
||||
datum/gang_item/equipment/gangsheild
|
||||
/datum/gang_item/equipment/gangsheild
|
||||
name = "Tower Shield"
|
||||
id = "metal"
|
||||
cost = 45 //High block of melee and even higher for bullets
|
||||
|
||||
@@ -455,7 +455,7 @@ If not set, defaults to check_completion instead. Set it. It's used by cryo.
|
||||
var/target_real_name // Has to be stored because the target's real_name can change over the course of the round
|
||||
var/target_missing_id
|
||||
|
||||
/datum/objective/escape/escape_with_identity/find_target()
|
||||
/datum/objective/escape/escape_with_identity/find_target(dupe_search_range, blacklist)
|
||||
target = ..()
|
||||
update_explanation_text()
|
||||
|
||||
@@ -553,7 +553,7 @@ GLOBAL_LIST_EMPTY(possible_items)
|
||||
for(var/I in subtypesof(/datum/objective_item/steal))
|
||||
new I
|
||||
|
||||
/datum/objective/steal/find_target()
|
||||
/datum/objective/steal/find_target(dupe_search_range, blacklist)
|
||||
var/list/datum/mind/owners = get_owners()
|
||||
var/approved_targets = list()
|
||||
check_items:
|
||||
@@ -631,7 +631,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
||||
for(var/I in subtypesof(/datum/objective_item/special) + subtypesof(/datum/objective_item/stack))
|
||||
new I
|
||||
|
||||
/datum/objective/steal/special/find_target()
|
||||
/datum/objective/steal/special/find_target(dupe_search_range, blacklist)
|
||||
return set_target(pick(GLOB.possible_items_special))
|
||||
|
||||
/datum/objective/steal/exchange
|
||||
@@ -844,7 +844,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
||||
name = "destroy AI"
|
||||
martyr_compatible = 1
|
||||
|
||||
/datum/objective/destroy/find_target()
|
||||
/datum/objective/destroy/find_target(dupe_search_range, blacklist)
|
||||
var/list/possible_targets = active_ais(1)
|
||||
var/mob/living/silicon/ai/target_ai = pick(possible_targets)
|
||||
target = target_ai.mind
|
||||
@@ -1124,7 +1124,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
||||
/datum/objective/hoard/heirloom
|
||||
name = "steal heirloom"
|
||||
|
||||
/datum/objective/hoard/heirloom/find_target()
|
||||
/datum/objective/hoard/heirloom/find_target(dupe_search_range, blacklist)
|
||||
set_target(pick(GLOB.family_heirlooms))
|
||||
|
||||
GLOBAL_LIST_EMPTY(traitor_contraband)
|
||||
@@ -1141,7 +1141,7 @@ GLOBAL_LIST_EMPTY(cult_contraband)
|
||||
if(!GLOB.cult_contraband.len)
|
||||
GLOB.cult_contraband = list(/obj/item/clockwork/slab,/obj/item/clockwork/component/belligerent_eye,/obj/item/clockwork/component/belligerent_eye/lens_gem,/obj/item/shuttle_curse,/obj/item/cult_shift)
|
||||
|
||||
/datum/objective/hoard/collector/find_target()
|
||||
/datum/objective/hoard/collector/find_target(dupe_search_range, blacklist)
|
||||
var/obj/item/I
|
||||
var/I_type
|
||||
if(prob(50))
|
||||
@@ -1172,7 +1172,7 @@ GLOBAL_LIST_EMPTY(possible_sabotages)
|
||||
for(var/I in subtypesof(/datum/sabotage_objective))
|
||||
new I
|
||||
|
||||
/datum/objective/sabotage/find_target()
|
||||
/datum/objective/sabotage/find_target(dupe_search_range, blacklist)
|
||||
var/list/datum/mind/owners = get_owners()
|
||||
var/approved_targets = list()
|
||||
check_sabotages:
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
/datum/sabotage_objective/processing/check_conditions()
|
||||
return won
|
||||
|
||||
/*
|
||||
/datum/sabotage_objective/processing/power_sink
|
||||
name = "Drain at least 100 megajoules of power using a power sink."
|
||||
sabotage_type = "powersink"
|
||||
@@ -44,6 +45,7 @@
|
||||
for(var/s in GLOB.power_sinks)
|
||||
var/obj/item/powersink/sink = s
|
||||
won = max(won,sink.power_drained/1e8)
|
||||
*/
|
||||
|
||||
/obj/item/paper/guides/antag/supermatter_sabotage
|
||||
info = "Ways to sabotage a supermatter:<br>\
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
circuit = /obj/item/circuitboard/machine/cell_charger
|
||||
pass_flags = PASSTABLE
|
||||
var/obj/item/stock_parts/cell/charging = null
|
||||
var/charge_rate = 500
|
||||
var/recharge_coeff = 1
|
||||
|
||||
/obj/machinery/cell_charger/update_overlays()
|
||||
. += ..()
|
||||
@@ -28,9 +28,10 @@
|
||||
. = ..()
|
||||
. += "There's [charging ? "a" : "no"] cell in the charger."
|
||||
if(charging)
|
||||
. += "Current charge: [round(charging.percent(), 1)]%."
|
||||
var/obj/item/stock_parts/cell/C = charging.get_cell()
|
||||
. += "Current charge: [C.percent()]%."
|
||||
if(in_range(user, src) || isobserver(user))
|
||||
. += "<span class='notice'>The status display reads: Charge rate at <b>[charge_rate]J</b> per cycle.</span>"
|
||||
. += "<span class='notice'>The status display reads: Charge rate at <b>[recharge_coeff*10]J</b> per cycle.</span>"
|
||||
|
||||
/obj/machinery/cell_charger/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/stock_parts/cell) && !panel_open)
|
||||
@@ -122,17 +123,18 @@
|
||||
charging.emp_act(severity)
|
||||
|
||||
/obj/machinery/cell_charger/RefreshParts()
|
||||
charge_rate = 500
|
||||
for(var/obj/item/stock_parts/capacitor/C in component_parts)
|
||||
charge_rate *= C.rating
|
||||
recharge_coeff = C.rating
|
||||
|
||||
/obj/machinery/cell_charger/process()
|
||||
if(!charging || !anchored || (stat & (BROKEN|NOPOWER)))
|
||||
return
|
||||
|
||||
if(charging.percent() >= 100)
|
||||
return
|
||||
use_power(charge_rate)
|
||||
charging.give(charge_rate) //this is 2558, efficient batteries exist
|
||||
if(charging)
|
||||
var/obj/item/stock_parts/cell/C = charging.get_cell()
|
||||
if(C)
|
||||
if(C.charge < C.maxcharge)
|
||||
C.give(C.chargerate * recharge_coeff)
|
||||
use_power(250 * recharge_coeff)
|
||||
|
||||
update_icon()
|
||||
|
||||
@@ -6,10 +6,12 @@
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
circuit = /obj/item/circuitboard/machine/colormate
|
||||
var/obj/item/inserted
|
||||
var/atom/movable/inserted
|
||||
var/activecolor = "#FFFFFF"
|
||||
var/list/color_matrix_last
|
||||
var/matrix_mode = FALSE
|
||||
/// Allow holder'd mobs
|
||||
var/allow_mobs = TRUE
|
||||
/// Minimum lightness for normal mode
|
||||
var/minimum_normal_lightness = 50
|
||||
/// Minimum lightness for matrix mode, tested using 4 test colors of full red, green, blue, white.
|
||||
@@ -57,11 +59,22 @@
|
||||
return
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
return ..()
|
||||
if(allow_mobs && istype(I, /obj/item/clothing/head/mob_holder))
|
||||
var/obj/item/clothing/head/mob_holder/H = I
|
||||
var/mob/victim = H.held_mob
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
to_chat(user, "<span class='warning'>[I] is stuck to your hand!</span>")
|
||||
return
|
||||
if(!QDELETED(H))
|
||||
H.release()
|
||||
insert_mob(victim, user)
|
||||
|
||||
if(is_type_in_list(I, allowed_types) && is_operational())
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
to_chat(user, "<span class='warning'>[I] is stuck to your hand!</span>")
|
||||
return
|
||||
if(QDELETED(I))
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user] inserts [I] into [src]'s receptable.</span>")
|
||||
|
||||
inserted = I
|
||||
@@ -69,9 +82,22 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/gear_painter/proc/insert_mob(mob/victim, mob/user)
|
||||
if(inserted)
|
||||
return
|
||||
if(user)
|
||||
visible_message("<span class='warning'>[user] stuffs [victim] into [src]!</span>")
|
||||
inserted = victim
|
||||
inserted.forceMove(src)
|
||||
|
||||
/obj/machinery/gear_painter/AllowDrop()
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/gear_painter/handle_atom_del(atom/movable/AM)
|
||||
if(AM == inserted)
|
||||
inserted = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/gear_painter/AltClick(mob/user)
|
||||
. = ..()
|
||||
if(!user.CanReach(src))
|
||||
|
||||
@@ -151,7 +151,14 @@
|
||||
var/obj/machinery/power/apc/target = locate(ref) in GLOB.apcs_list
|
||||
if(!target)
|
||||
return
|
||||
target.vars[type] = target.setsubsystem(text2num(value))
|
||||
value = target.setsubsystem(text2num(value))
|
||||
switch(type) // Sanity check
|
||||
if("equipment", "lighting", "environ")
|
||||
target.vars[type] = value
|
||||
else
|
||||
message_admins("Warning: possible href exploit by [key_name(usr)] - attempted to set [type] on [target] to [value]")
|
||||
log_game("Warning: possible href exploit by [key_name(usr)] - attempted to set [type] on [target] to [value]")
|
||||
return
|
||||
target.update_icon()
|
||||
target.update()
|
||||
var/setTo = ""
|
||||
|
||||
@@ -264,6 +264,8 @@ What a mess.*/
|
||||
active1 = null
|
||||
if(!( GLOB.data_core.security.Find(active2) ))
|
||||
active2 = null
|
||||
if(!authenticated && href_list["choice"] != "Log In") // logging in is the only action you can do if not logged in
|
||||
return
|
||||
if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || hasSiliconAccessInArea(usr) || IsAdminGhost(usr))
|
||||
usr.set_machine(src)
|
||||
switch(href_list["choice"])
|
||||
|
||||
@@ -393,6 +393,27 @@
|
||||
spark_system.start() //creates some sparks because they look cool
|
||||
qdel(cover) //deletes the cover - no need on keeping it there!
|
||||
|
||||
//turret healing
|
||||
/obj/machinery/porta_turret/examine(mob/user)
|
||||
. = ..()
|
||||
if(obj_integrity < max_integrity)
|
||||
. += "<span class='notice'>[src] is damaged, use a lit welder to fix it.</span>"
|
||||
|
||||
/obj/machinery/porta_turret/welder_act(mob/living/user, obj/item/I)
|
||||
. = TRUE
|
||||
if(cover && obj_integrity < max_integrity)
|
||||
if(!I.tool_start_check(user, amount=0))
|
||||
return
|
||||
user.visible_message("[user] is welding the turret.", \
|
||||
"<span class='notice'>You begin repairing the turret...</span>", \
|
||||
"<span class='italics'>You hear welding.</span>")
|
||||
if(I.use_tool(src, user, 40, volume=50))
|
||||
obj_integrity = max_integrity
|
||||
user.visible_message("[user.name] has repaired [src].", \
|
||||
"<span class='notice'>You finish repairing the turret.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>The turret doesn't need repairing.</span>")
|
||||
|
||||
/obj/machinery/porta_turret/process()
|
||||
//the main machinery process
|
||||
if(cover == null && anchored) //if it has no cover and is anchored
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
icon_state = "mecha_ion"
|
||||
energy_drain = 120
|
||||
projectile = /obj/item/projectile/ion
|
||||
fire_sound = 'sound/weapons/laser.ogg'
|
||||
fire_sound = 'sound/weapons/IonRifle.ogg'
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla
|
||||
equip_cooldown = 35
|
||||
@@ -195,7 +195,7 @@
|
||||
//Base ballistic weapon type
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic
|
||||
name = "general ballistic weapon"
|
||||
fire_sound = 'sound/weapons/gunshot.ogg'
|
||||
fire_sound = 'sound/weapons/lmgshot.ogg'
|
||||
var/projectiles
|
||||
var/projectiles_cache //ammo to be loaded in, if possible.
|
||||
var/projectiles_cache_max
|
||||
@@ -285,6 +285,7 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
|
||||
name = "\improper LBX AC 10 \"Scattershot\""
|
||||
desc = "A weapon for combat exosuits. Shoots a spread of pellets."
|
||||
fire_sound = 'sound/weapons/gunshotshotgunshot.ogg'
|
||||
icon_state = "mecha_scatter"
|
||||
equip_cooldown = 20
|
||||
projectile = /obj/item/projectile/bullet/scattershot
|
||||
@@ -299,6 +300,7 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/seedscatter
|
||||
name = "\improper Melon Seed \"Scattershot\""
|
||||
desc = "A weapon for combat exosuits. Shoots a spread of pellets, shaped as seed."
|
||||
fire_sound = 'sound/weapons/gunshotshotgunshot.ogg'
|
||||
icon_state = "mecha_scatter"
|
||||
equip_cooldown = 20
|
||||
projectile = /obj/item/projectile/bullet/seed
|
||||
@@ -331,7 +333,7 @@
|
||||
desc = "A weapon for combat exosuits. Launches light explosive missiles."
|
||||
icon_state = "mecha_missilerack"
|
||||
projectile = /obj/item/projectile/bullet/a84mm_he
|
||||
fire_sound = 'sound/weapons/grenadelaunch.ogg'
|
||||
fire_sound = 'sound/weapons/rocketlaunch.ogg'
|
||||
projectiles = 8
|
||||
projectiles_cache = 0
|
||||
projectiles_cache_max = 0
|
||||
@@ -345,7 +347,7 @@
|
||||
desc = "A weapon for combat exosuits. Launches low-explosive breaching missiles designed to explode only when striking a sturdy target."
|
||||
icon_state = "mecha_missilerack_six"
|
||||
projectile = /obj/item/projectile/bullet/a84mm_br
|
||||
fire_sound = 'sound/weapons/grenadelaunch.ogg'
|
||||
fire_sound = 'sound/weapons/rocketlaunch.ogg'
|
||||
projectiles = 6
|
||||
projectiles_cache = 0
|
||||
projectiles_cache_max = 0
|
||||
|
||||
@@ -81,6 +81,7 @@
|
||||
|
||||
/obj/effect/decal/cleanable/trail_holder //not a child of blood on purpose
|
||||
name = "blood"
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "ltrails_1"
|
||||
desc = "Your instincts say you shouldn't be following these."
|
||||
random_icon_states = null
|
||||
|
||||
@@ -49,6 +49,42 @@
|
||||
/obj/effect/overlay/vis
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
anchored = TRUE
|
||||
vis_flags = NONE
|
||||
var/unused = 0 //When detected to be unused it gets set to world.time, after a while it gets removed
|
||||
var/cache_expiration = 2 MINUTES // overlays which go unused for 2 minutes get cleaned up
|
||||
vis_flags = VIS_INHERIT_DIR
|
||||
///When detected to be unused it gets set to world.time, after a while it gets removed
|
||||
var/unused = 0
|
||||
///overlays which go unused for this amount of time get cleaned up
|
||||
var/cache_expiration = 2 MINUTES
|
||||
|
||||
// /obj/effect/overlay/atmos_excited
|
||||
// name = "excited group"
|
||||
// icon = null
|
||||
// icon_state = null
|
||||
// anchored = TRUE // should only appear in vis_contents, but to be safe
|
||||
// appearance_flags = RESET_TRANSFORM | TILE_BOUND
|
||||
// invisibility = INVISIBILITY_ABSTRACT
|
||||
// mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
|
||||
// layer = ATMOS_GROUP_LAYER
|
||||
// plane = ATMOS_GROUP_PLANE
|
||||
|
||||
// /obj/effect/overlay/light_visible
|
||||
// name = ""
|
||||
// icon = 'icons/effects/light_overlays/light_32.dmi'
|
||||
// icon_state = "light"
|
||||
// layer = O_LIGHTING_VISUAL_LAYER
|
||||
// plane = O_LIGHTING_VISUAL_PLANE
|
||||
// appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
|
||||
// mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
// alpha = 0
|
||||
// vis_flags = NONE
|
||||
|
||||
// /obj/effect/overlay/light_cone
|
||||
// name = ""
|
||||
// icon = 'icons/effects/light_overlays/light_cone.dmi'
|
||||
// icon_state = "light"
|
||||
// layer = O_LIGHTING_VISUAL_LAYER
|
||||
// plane = O_LIGHTING_VISUAL_PLANE
|
||||
// appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
|
||||
// mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
// vis_flags = NONE
|
||||
// alpha = 110
|
||||
|
||||
@@ -468,6 +468,10 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
melee_attack_chain(usr, over)
|
||||
usr.FlushCurrentAction()
|
||||
return TRUE //returning TRUE as a "is this overridden?" flag
|
||||
if(isrevenant(usr))
|
||||
if(RevenantThrow(over, usr, src))
|
||||
return
|
||||
|
||||
if(!Adjacent(usr) || !over.Adjacent(usr))
|
||||
return // should stop you from dragging through windows
|
||||
|
||||
@@ -939,6 +943,10 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
/obj/item/proc/get_part_rating()
|
||||
return 0
|
||||
|
||||
//Can this item be given to people?
|
||||
/obj/item/proc/can_give()
|
||||
return TRUE
|
||||
|
||||
/obj/item/doMove(atom/destination)
|
||||
if (ismob(loc))
|
||||
var/mob/M = loc
|
||||
|
||||
@@ -166,7 +166,7 @@
|
||||
last = C
|
||||
break
|
||||
|
||||
obj/item/rcl/proc/getMobhook(mob/to_hook)
|
||||
/obj/item/rcl/proc/getMobhook(mob/to_hook)
|
||||
if(listeningTo == to_hook)
|
||||
return
|
||||
if(listeningTo)
|
||||
|
||||
@@ -10,35 +10,41 @@
|
||||
/obj/item/armorkit/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
// yeah have fun making subtypes and modifying the afterattack if you want to make variants
|
||||
// idiot
|
||||
// - hatter
|
||||
var/used = FALSE
|
||||
|
||||
if(isobj(target) && istype(target, /obj/item/clothing/under))
|
||||
var/obj/item/clothing/under/C = target
|
||||
if(C.armor.melee < 10)
|
||||
C.armor.melee = 10
|
||||
if(C.damaged_clothes)
|
||||
to_chat(user,"<span class='warning'>You should repair the damage done to [C] first.</span>")
|
||||
return
|
||||
if(C.attached_accessory)
|
||||
to_chat(user,"<span class='warning'>Kind of hard to sew around [C.attached_accessory].</span>")
|
||||
return
|
||||
if(C.armor.getRating("melee") < 10)
|
||||
C.armor = C.armor.setRating("melee" = 10)
|
||||
used = TRUE
|
||||
if(C.armor.laser < 10)
|
||||
C.armor.laser = 10
|
||||
if(C.armor.getRating("laser") < 10)
|
||||
C.armor = C.armor.setRating("laser" = 10)
|
||||
used = TRUE
|
||||
if(C.armor.fire < 40)
|
||||
C.armor.fire = 40
|
||||
if(C.armor.getRating("fire") < 40)
|
||||
C.armor = C.armor.setRating("fire" = 40)
|
||||
used = TRUE
|
||||
if(C.armor.acid < 10)
|
||||
C.armor.acid = 10
|
||||
if(C.armor.getRating("acid") < 10)
|
||||
C.armor = C.armor.setRating("acid" = 10)
|
||||
used = TRUE
|
||||
if(C.armor.bomb < 5)
|
||||
C.armor.bomb = 5
|
||||
if(C.armor.getRating("bomb") < 5)
|
||||
C.armor = C.armor.setRating("bomb" = 5)
|
||||
used = TRUE
|
||||
|
||||
if(used)
|
||||
user.visible_message("<span class = 'notice'>[user] uses [src] on [C], reinforcing it and tossing the empty case away afterwards.</span>", \
|
||||
"<span class = 'notice'>You reinforce [C] with [src], making it a little more protective! You toss the empty casing away afterwards.</span>")
|
||||
C.name = "durathread [C.name]" // this disappears if it gets repaired, which is annoying
|
||||
user.visible_message("<span class = 'notice'>[user] reinforces [C] with [src].</span>", \
|
||||
"<span class = 'notice'>You reinforce [C] with [src], making it as protective as a durathread jumpsuit.</span>")
|
||||
C.name = "durathread [C.name]"
|
||||
C.upgrade_prefix = "durathread" // god i hope this works
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class = 'notice'>You stare at [src] and [C], coming to the conclusion that you probably don't need to reinforce it any further.")
|
||||
to_chat(user, "<span class = 'notice'>You don't need to reinforce [C] any further.")
|
||||
return
|
||||
else
|
||||
return
|
||||
|
||||
@@ -82,4 +82,8 @@
|
||||
/obj/item/candle/infinite/hugbox
|
||||
heats_space = FALSE
|
||||
|
||||
/obj/item/candle/DoRevenantThrowEffects(atom/target)
|
||||
if(!infinite)
|
||||
put_out_candle()
|
||||
|
||||
#undef CANDLE_LUMINOSITY
|
||||
|
||||
@@ -779,16 +779,40 @@
|
||||
/obj/item/card/id/departmental_budget/update_label()
|
||||
return
|
||||
|
||||
/obj/item/card/id/departmental_budget/civ
|
||||
department_ID = ACCOUNT_CIV
|
||||
department_name = ACCOUNT_CIV_NAME
|
||||
|
||||
/obj/item/card/id/departmental_budget/eng
|
||||
department_ID = ACCOUNT_ENG
|
||||
department_name = ACCOUNT_ENG_NAME
|
||||
|
||||
/obj/item/card/id/departmental_budget/sci
|
||||
department_ID = ACCOUNT_SCI
|
||||
department_name = ACCOUNT_SCI_NAME
|
||||
|
||||
/obj/item/card/id/departmental_budget/med
|
||||
department_ID = ACCOUNT_MED
|
||||
department_name = ACCOUNT_MED_NAME
|
||||
|
||||
/obj/item/card/id/departmental_budget/srv
|
||||
department_ID = ACCOUNT_SRV
|
||||
department_name = ACCOUNT_SRV_NAME
|
||||
|
||||
/obj/item/card/id/departmental_budget/car
|
||||
department_ID = ACCOUNT_CAR
|
||||
department_name = ACCOUNT_CAR_NAME
|
||||
|
||||
/obj/item/card/id/departmental_budget/sec
|
||||
department_ID = ACCOUNT_SEC
|
||||
department_name = ACCOUNT_SEC_NAME
|
||||
|
||||
//Polychromatic Knight Badge
|
||||
|
||||
/obj/item/card/id/knight
|
||||
name = "knight badge"
|
||||
icon_state = "knight"
|
||||
desc = "A badge denoting the owner as a knight! It has a strip for swiping like an ID"
|
||||
desc = "A badge denoting the owner as a knight! It has a strip for swiping like an ID."
|
||||
var/id_color = "#00FF00" //defaults to green
|
||||
var/mutable_appearance/id_overlay
|
||||
|
||||
|
||||
@@ -136,6 +136,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
. = ..()
|
||||
|
||||
/obj/item/clothing/mask/cigarette/DoRevenantThrowEffects(atom/target)
|
||||
if(lit)
|
||||
attackby()
|
||||
else
|
||||
light()
|
||||
|
||||
/obj/item/clothing/mask/cigarette/attackby(obj/item/W, mob/user, params)
|
||||
if(!lit && smoketime > 0)
|
||||
var/lighting_text = W.ignition_effect(src, user)
|
||||
@@ -517,6 +523,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
overlay_state = pick(overlay_list)
|
||||
update_icon()
|
||||
|
||||
/obj/item/lighter/DoRevenantThrowEffects(atom/target)
|
||||
set_lit()
|
||||
|
||||
/obj/item/lighter/suicide_act(mob/living/carbon/user)
|
||||
if (lit)
|
||||
user.visible_message("<span class='suicide'>[user] begins holding \the [src]'s flame up to [user.p_their()] face! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
|
||||
@@ -37,11 +37,14 @@
|
||||
/obj/item/flashlight/attack_self(mob/user)
|
||||
on = !on
|
||||
update_brightness(user)
|
||||
playsound(user, on ? 'sound/weapons/magin.ogg' : 'sound/weapons/magout.ogg', 40, 1)
|
||||
playsound(src, on ? 'sound/weapons/magin.ogg' : 'sound/weapons/magout.ogg', 40, TRUE)
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/flashlight/DoRevenantThrowEffects(atom/target)
|
||||
attack_self()
|
||||
|
||||
/obj/item/flashlight/suicide_act(mob/living/carbon/human/user)
|
||||
if (user.eye_blind)
|
||||
|
||||
@@ -8,10 +8,12 @@
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
obj_flags = UNIQUE_RENAME
|
||||
var/gpstag = "COM0"
|
||||
var/emp_proof = FALSE
|
||||
var/starton = TRUE
|
||||
|
||||
/obj/item/gps/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/gps/item, gpstag)
|
||||
AddComponent(/datum/component/gps/item, gpstag, emp_proof, starton)
|
||||
|
||||
/obj/item/gps/science
|
||||
icon_state = "gps-s"
|
||||
@@ -26,6 +28,9 @@
|
||||
gpstag = "MINE0"
|
||||
desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life."
|
||||
|
||||
/obj/item/gps/mining/off
|
||||
starton = FALSE
|
||||
|
||||
/obj/item/gps/cyborg
|
||||
icon_state = "gps-b"
|
||||
gpstag = "BORG0"
|
||||
|
||||
@@ -69,7 +69,8 @@ GLOBAL_LIST_INIT(channel_tokens, list(
|
||||
/obj/item/radio/headset/talk_into(mob/living/M, message, channel, list/spans,datum/language/language)
|
||||
if (!listening)
|
||||
return ITALICS | REDUCE_RANGE
|
||||
return ..()
|
||||
if (language != /datum/language/signlanguage)
|
||||
return ..()
|
||||
|
||||
/obj/item/radio/headset/can_receive(freq, level, AIuser)
|
||||
if(ishuman(src.loc))
|
||||
@@ -283,14 +284,12 @@ GLOBAL_LIST_INIT(channel_tokens, list(
|
||||
SSradio.remove_object(src, GLOB.radiochannels[ch_name])
|
||||
secure_radio_connections[ch_name] = null
|
||||
|
||||
var/turf/T = user.drop_location()
|
||||
if(T)
|
||||
if(keyslot)
|
||||
keyslot.forceMove(T)
|
||||
keyslot = null
|
||||
if(keyslot2)
|
||||
keyslot2.forceMove(T)
|
||||
keyslot2 = null
|
||||
if(keyslot)
|
||||
user.put_in_hands(keyslot)
|
||||
keyslot = null
|
||||
if(keyslot2)
|
||||
user.put_in_hands(keyslot2)
|
||||
keyslot2 = null
|
||||
|
||||
recalculateChannels()
|
||||
to_chat(user, "<span class='notice'>You pop out the encryption keys in the headset.</span>")
|
||||
|
||||
@@ -208,6 +208,8 @@
|
||||
return
|
||||
if(!M.IsVocal())
|
||||
return
|
||||
if(language == /datum/language/signlanguage)
|
||||
return
|
||||
|
||||
if(use_command)
|
||||
spans |= commandspan
|
||||
|
||||
@@ -306,18 +306,6 @@ GENETICS SCANNER
|
||||
if(T.name == "fluffy tongue")
|
||||
temp_message += " <span class='danger'>Subject is suffering from a fluffified tongue. Suggested cure: Yamerol or a tongue transplant.</span>"
|
||||
|
||||
//HECK
|
||||
else if(istype(O, /obj/item/organ/genital/penis))
|
||||
var/obj/item/organ/genital/penis/P = O
|
||||
if(P.length>20)
|
||||
temp_message += " <span class='info'>Subject has a sizeable gentleman's organ at [P.length] inches.</span>"
|
||||
|
||||
else if(istype(O, /obj/item/organ/genital/breasts))
|
||||
var/obj/item/organ/genital/breasts/Br = O
|
||||
if(Br.cached_size>5)
|
||||
temp_message += " <span class='info'>Subject has a sizeable bosom with a [Br.size] cup.</span>"
|
||||
|
||||
|
||||
|
||||
//GENERAL HANDLER
|
||||
if(!damage_message)
|
||||
|
||||
@@ -46,6 +46,9 @@
|
||||
if(.)
|
||||
new /obj/item/toy/eightball/haunted(loc)
|
||||
|
||||
/obj/item/toy/eightball/DoRevenantThrowEffects(atom/target)
|
||||
MakeHaunted()
|
||||
|
||||
/obj/item/toy/eightball/attack_self(mob/user)
|
||||
if(shaking)
|
||||
return
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
name = "advanced fire extinguisher"
|
||||
desc = "Used to stop thermonuclear fires from spreading inside your engine."
|
||||
icon_state = "foam_extinguisher0"
|
||||
//item_state = "foam_extinguisher" needs sprite
|
||||
item_state = "foam_extinguisher"
|
||||
dog_fashion = null
|
||||
chem = /datum/reagent/firefighting_foam
|
||||
tanktype = /obj/structure/reagent_dispensers/foamtank
|
||||
@@ -235,16 +235,23 @@
|
||||
return
|
||||
EmptyExtinguisher(user)
|
||||
|
||||
/obj/item/extinguisher/proc/EmptyExtinguisher(var/mob/user)
|
||||
if(loc == user && reagents.total_volume)
|
||||
/obj/item/extinguisher/DoRevenantThrowEffects(atom/target)
|
||||
EmptyExtinguisher()
|
||||
|
||||
/obj/item/extinguisher/proc/EmptyExtinguisher(mob/user)
|
||||
if(!reagents.total_volume)
|
||||
return
|
||||
if(loc == user || !user)
|
||||
reagents.clear_reagents()
|
||||
|
||||
var/turf/T = get_turf(loc)
|
||||
if(isopenturf(T))
|
||||
var/turf/open/theturf = T
|
||||
theturf.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
|
||||
|
||||
user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "<span class='info'>You quietly empty out \the [src] by using its release valve.</span>")
|
||||
if(user)
|
||||
user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "<span class='info'>You quietly empty out \the [src] by using its release valve.</span>")
|
||||
else
|
||||
user.visible_message("The release valve of \the [src] suddenly opens and sprays it's contents on the floor!")
|
||||
|
||||
//firebot assembly
|
||||
/obj/item/extinguisher/attackby(obj/O, mob/user, params)
|
||||
|
||||
@@ -245,6 +245,9 @@
|
||||
slowdown = 7
|
||||
breakouttime = 300 //Deciseconds = 30s = 0.5 minute
|
||||
|
||||
/obj/item/restraints/legcuffs/proc/on_removed()
|
||||
return
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap
|
||||
name = "bear trap"
|
||||
throw_speed = 1
|
||||
@@ -376,4 +379,8 @@
|
||||
icon_state = "ebola"
|
||||
hitsound = 'sound/weapons/taserhit.ogg'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
breakouttime = 60
|
||||
breakouttime = 25
|
||||
|
||||
/obj/item/restraints/legcuffs/bola/energy/on_removed()
|
||||
do_sparks(1, TRUE, src)
|
||||
qdel(src)
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
icon_state = "warp"
|
||||
uses = -1
|
||||
var/total_delay = 10 SECONDS
|
||||
var/cooldown = 10 SECONDS
|
||||
var/cooldown = 30 SECONDS
|
||||
var/last_use = 0
|
||||
var/list/positions = list()
|
||||
var/next_prune = 0
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
var/minimum_range = 0 //at what range the pinpointer declares you to be at your destination
|
||||
var/ignore_suit_sensor_level = FALSE // Do we find people even if their suit sensors are turned off
|
||||
var/alert = FALSE // TRUE to display things more seriously
|
||||
/// resets target on toggle
|
||||
var/resets_target = TRUE
|
||||
|
||||
/obj/item/pinpointer/Initialize()
|
||||
. = ..()
|
||||
@@ -27,17 +29,22 @@
|
||||
/obj/item/pinpointer/Destroy()
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
GLOB.pinpointer_list -= src
|
||||
target = null
|
||||
unset_target()
|
||||
return ..()
|
||||
|
||||
/obj/item/pinpointer/DoRevenantThrowEffects(atom/target)
|
||||
attack_self()
|
||||
|
||||
/obj/item/pinpointer/attack_self(mob/living/user)
|
||||
active = !active
|
||||
user.visible_message("<span class='notice'>[user] [active ? "" : "de"]activates [user.p_their()] pinpointer.</span>", "<span class='notice'>You [active ? "" : "de"]activate your pinpointer.</span>")
|
||||
if(user)
|
||||
user.visible_message("<span class='notice'>[user] [active ? "" : "de"]activates [user.p_their()] pinpointer.</span>", "<span class='notice'>You [active ? "" : "de"]activate your pinpointer.</span>")
|
||||
playsound(src, 'sound/items/screwdriver2.ogg', 50, 1)
|
||||
if(active)
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
else
|
||||
target = null
|
||||
if(resets_target)
|
||||
unset_target()
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
update_icon()
|
||||
|
||||
@@ -50,6 +57,18 @@
|
||||
/obj/item/pinpointer/proc/scan_for_target()
|
||||
return
|
||||
|
||||
/obj/item/pinpointer/proc/set_target(atom/movable/newtarget)
|
||||
if(target)
|
||||
unset_target()
|
||||
target = newtarget
|
||||
RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/unset_target)
|
||||
|
||||
/obj/item/pinpointer/proc/unset_target()
|
||||
if(!target)
|
||||
return
|
||||
UnregisterSignal(target, COMSIG_PARENT_QDELETING)
|
||||
target = null
|
||||
|
||||
/obj/item/pinpointer/update_overlays()
|
||||
. = ..()
|
||||
if(!active)
|
||||
@@ -101,7 +120,8 @@
|
||||
active = FALSE
|
||||
user.visible_message("<span class='notice'>[user] deactivates [user.p_their()] pinpointer.</span>", "<span class='notice'>You deactivate your pinpointer.</span>")
|
||||
playsound(src, 'sound/items/screwdriver2.ogg', 50, 1)
|
||||
target = null //Restarting the pinpointer forces a target reset
|
||||
if(resets_target)
|
||||
unset_target() //Restarting the pinpointer forces a target reset
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
update_icon()
|
||||
return
|
||||
@@ -137,7 +157,7 @@
|
||||
if(!A || QDELETED(src) || !user || !user.is_holding(src) || user.incapacitated())
|
||||
return
|
||||
|
||||
target = names[A]
|
||||
set_target(names[A])
|
||||
active = TRUE
|
||||
user.visible_message("<span class='notice'>[user] activates [user.p_their()] pinpointer.</span>", "<span class='notice'>You activate your pinpointer.</span>")
|
||||
playsound(src, 'sound/items/screwdriver2.ogg', 50, 1)
|
||||
@@ -149,7 +169,7 @@
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(!trackable(H))
|
||||
target = null
|
||||
unset_target()
|
||||
if(!target) //target can be set to null from above code, or elsewhere
|
||||
active = FALSE
|
||||
|
||||
@@ -163,7 +183,7 @@
|
||||
. = ..()
|
||||
|
||||
/obj/item/pinpointer/pair/scan_for_target()
|
||||
target = other_pair
|
||||
set_target(other_pair)
|
||||
|
||||
/obj/item/pinpointer/pair/examine(mob/user)
|
||||
. = ..()
|
||||
@@ -195,7 +215,7 @@
|
||||
shuttleport = SSshuttle.getShuttle("huntership")
|
||||
|
||||
/obj/item/pinpointer/shuttle/scan_for_target()
|
||||
target = shuttleport
|
||||
set_target(shuttleport)
|
||||
|
||||
/obj/item/pinpointer/shuttle/Destroy()
|
||||
shuttleport = null
|
||||
@@ -207,4 +227,8 @@
|
||||
icon_state = "pinpointer_ian"
|
||||
|
||||
/obj/item/pinpointer/ian/scan_for_target()
|
||||
target = locate(/mob/living/simple_animal/pet/dog/corgi/Ian) in GLOB.mob_living_list
|
||||
set_target(locate(/mob/living/simple_animal/pet/dog/corgi/Ian) in GLOB.mob_living_list)
|
||||
|
||||
/obj/item/pinpointer/custom
|
||||
resets_target = FALSE
|
||||
|
||||
|
||||
@@ -45,6 +45,10 @@
|
||||
return
|
||||
set_snowflake_from_config(id)
|
||||
|
||||
/obj/item/toy/plush/DoRevenantThrowEffects(atom/target)
|
||||
var/datum/component/squeak/squeaker = GetComponent(/datum/component/squeak)
|
||||
squeaker.do_play_squeak(TRUE)
|
||||
|
||||
/obj/item/toy/plush/Initialize(mapload, set_snowflake_id)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/squeak, squeak_override)
|
||||
|
||||
@@ -43,6 +43,13 @@
|
||||
/obj/item/pneumatic_cannon/proc/init_charge() //wrapper so it can be vv'd easier
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/pneumatic_cannon/DoRevenantThrowEffects(atom/target)
|
||||
var/picked_target
|
||||
var/list/possible_targets = range(3,src)
|
||||
picked_target = pick(possible_targets)
|
||||
if(target)
|
||||
Fire(null, picked_target)
|
||||
|
||||
/obj/item/pneumatic_cannon/process()
|
||||
if(++charge_tick >= charge_ticks && charge_type)
|
||||
fill_with_type(charge_type, charge_amount)
|
||||
@@ -134,21 +141,29 @@
|
||||
Fire(user, target)
|
||||
|
||||
/obj/item/pneumatic_cannon/proc/Fire(mob/living/user, var/atom/target)
|
||||
if(!istype(user) && !target)
|
||||
if(!target)
|
||||
return
|
||||
if(user)
|
||||
if(!isliving(user))
|
||||
return
|
||||
var/discharge = 0
|
||||
if(!can_trigger_gun(user))
|
||||
if(user && !can_trigger_gun(user))
|
||||
return
|
||||
if(!loadedItems || !loadedWeightClass)
|
||||
to_chat(user, "<span class='warning'>\The [src] has nothing loaded.</span>")
|
||||
if(user)
|
||||
to_chat(user, "<span class='warning'>\The [src] has nothing loaded.</span>")
|
||||
return
|
||||
if(!tank && checktank)
|
||||
to_chat(user, "<span class='warning'>\The [src] can't fire without a source of gas.</span>")
|
||||
if(user)
|
||||
to_chat(user, "<span class='warning'>\The [src] can't fire without a source of gas.</span>")
|
||||
return
|
||||
if(tank && !tank.air_contents.remove(gasPerThrow * pressureSetting))
|
||||
to_chat(user, "<span class='warning'>\The [src] lets out a weak hiss and doesn't react!</span>")
|
||||
if(user)
|
||||
to_chat(user, "<span class='warning'>\The [src] lets out a weak hiss and doesn't react!</span>")
|
||||
else
|
||||
visible_message(src, "<span class='warning'>\The [src] lets out a weak hiss and doesn't react!</span>")
|
||||
return
|
||||
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(75) && clumsyCheck && iscarbon(user))
|
||||
if(user && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(75) && clumsyCheck && iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.visible_message("<span class='warning'>[C] loses [C.p_their()] grip on [src], causing it to go off!</span>", "<span class='userdanger'>[src] slips out of your hands and goes off!</span>")
|
||||
C.dropItemToGround(src, TRUE)
|
||||
@@ -157,15 +172,18 @@
|
||||
else
|
||||
var/list/possible_targets = range(3,src)
|
||||
target = pick(possible_targets)
|
||||
discharge = 1
|
||||
if(!discharge)
|
||||
discharge = TRUE
|
||||
if(!discharge && user)
|
||||
user.visible_message("<span class='danger'>[user] fires \the [src]!</span>", \
|
||||
"<span class='danger'>You fire \the [src]!</span>")
|
||||
log_combat(user, target, "fired at", src)
|
||||
var/turf/T = get_target(target, get_turf(src))
|
||||
playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, 1)
|
||||
fire_items(T, user)
|
||||
if(pressureSetting >= 3 && iscarbon(user))
|
||||
playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, TRUE)
|
||||
if(user)
|
||||
log_combat(user, target, "fired at", src)
|
||||
fire_items(T, user)
|
||||
else
|
||||
fire_items(T)
|
||||
if(user && pressureSetting >= 3 && iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.visible_message("<span class='warning'>[C] is thrown down by the force of the cannon!</span>", "<span class='userdanger'>[src] slams into your shoulder, knocking you down!")
|
||||
C.DefaultCombatKnockdown(60)
|
||||
|
||||
@@ -258,7 +258,7 @@
|
||||
shield_flags = SHIELD_FLAGS_DEFAULT
|
||||
max_integrity = 300
|
||||
|
||||
obj/item/shield/riot/bullet_proof
|
||||
/obj/item/shield/riot/bullet_proof
|
||||
name = "bullet resistant shield"
|
||||
desc = "A far more frail shield made of resistant plastics and kevlar meant to block ballistics."
|
||||
armor = list("melee" = 30, "bullet" = 80, "laser" = 0, "energy" = 0, "bomb" = -40, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50)
|
||||
|
||||
@@ -20,7 +20,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \
|
||||
custom_materials = list(/datum/material/iron=1000)
|
||||
max_amount = 50
|
||||
attack_verb = list("hit", "bludgeoned", "whacked")
|
||||
hitsound = 'sound/weapons/grenadelaunch.ogg'
|
||||
hitsound = 'sound/items/trayhit1.ogg'
|
||||
embedding = list()
|
||||
novariants = TRUE
|
||||
|
||||
|
||||
@@ -466,6 +466,7 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \
|
||||
new/datum/stack_recipe("cardboard cutout", /obj/item/cardboard_cutout, 5), \
|
||||
new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \
|
||||
new/datum/stack_recipe("folder", /obj/item/folder), \
|
||||
new/datum/stack_recipe("cardboard card", /obj/item/cardboard_card, 1), \
|
||||
// holy fuck why are there so many boxes
|
||||
new/datum/stack_recipe_list("fancy boxes", list ( \
|
||||
new /datum/stack_recipe("donut box", /obj/item/storage/fancy/donut_box), \
|
||||
|
||||
@@ -639,7 +639,7 @@
|
||||
new /obj/item/bikehorn(src)
|
||||
new /obj/item/implanter/sad_trombone(src)
|
||||
|
||||
obj/item/storage/backpack/duffelbag/syndie/shredderbundle
|
||||
/obj/item/storage/backpack/duffelbag/syndie/shredderbundle
|
||||
desc = "A large duffel bag containing two CX Shredders, some magazines, an elite hardsuit, and a chest rig."
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/shredderbundle/PopulateContents()
|
||||
|
||||
@@ -857,7 +857,7 @@
|
||||
icon_state = "2sheath"
|
||||
item_state = "katana" //this'll do.
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
fitting_swords = list(/obj/item/melee/smith/wakizashi, /obj/item/melee/smith/twohand/katana, /obj/item/melee/bokken)
|
||||
fitting_swords = list(/obj/item/melee/smith/wakizashi, /obj/item/melee/smith/twohand/katana, /obj/item/melee/bokken, /obj/item/katana)
|
||||
starting_sword = null
|
||||
|
||||
/obj/item/storage/belt/sabre/twin/ComponentInitialize()
|
||||
|
||||
@@ -275,7 +275,7 @@
|
||||
for(var/i in 1 to 7)
|
||||
new /obj/item/grenade/flashbang(src)
|
||||
|
||||
obj/item/storage/box/stingbangs
|
||||
/obj/item/storage/box/stingbangs
|
||||
name = "box of stingbangs (WARNING)"
|
||||
desc = "<B>WARNING: These devices are extremely dangerous and can cause severe injuries or death in repeated use.</B>"
|
||||
icon_state = "secbox"
|
||||
|
||||
@@ -526,3 +526,8 @@
|
||||
new /obj/item/book/granter/martial/carp(src)
|
||||
new /obj/item/clothing/suit/hooded/carp_costume(src)
|
||||
new /obj/item/staff/bostaff(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/sleepytime/cardpack/PopulateContents()
|
||||
. = ..()
|
||||
new /obj/item/cardpack/syndicate(src)
|
||||
new /obj/item/cardpack/syndicate(src)
|
||||
|
||||
@@ -47,6 +47,9 @@
|
||||
cell = new preload_cell_type(src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/melee/baton/DoRevenantThrowEffects(atom/target)
|
||||
switch_status()
|
||||
|
||||
/obj/item/melee/baton/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
|
||||
..()
|
||||
//Only mob/living types have stun handling
|
||||
@@ -236,6 +239,12 @@
|
||||
if(!iscyborg(loc))
|
||||
deductcharge(severity*10, TRUE, FALSE)
|
||||
|
||||
/obj/item/melee/baton/can_give()
|
||||
if(turned_on)
|
||||
return FALSE
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/melee/baton/stunsword
|
||||
name = "stunsword"
|
||||
desc = "Not actually sharp, this sword is functionally identical to its baton counterpart."
|
||||
@@ -269,21 +278,22 @@
|
||||
icon_state = "refill_donksoft"
|
||||
var/product = /obj/item/melee/baton/stunsword //what it makes
|
||||
var/list/fromitem = list(/obj/item/melee/baton, /obj/item/melee/baton/loaded) //what it needs
|
||||
afterattack(obj/O, mob/user as mob)
|
||||
if(istype(O, product))
|
||||
to_chat(user,"<span class='warning'>[O] is already modified!")
|
||||
else if(O.type in fromitem) //makes sure O is the right thing
|
||||
var/obj/item/melee/baton/B = O
|
||||
if(!B.cell) //checks for a powercell in the baton. If there isn't one, continue. If there is, warn the user to take it out
|
||||
new product(usr.loc) //spawns the product
|
||||
user.visible_message("<span class='warning'>[user] modifies [O]!","<span class='warning'>You modify the [O]!")
|
||||
qdel(O) //Gets rid of the baton
|
||||
qdel(src) //gets rid of the kit
|
||||
|
||||
else
|
||||
to_chat(user,"<span class='warning'>Remove the powercell first!</span>") //We make this check because the stunsword starts without a battery.
|
||||
/obj/item/ssword_kit/afterattack(obj/O, mob/user as mob)
|
||||
if(istype(O, product))
|
||||
to_chat(user,"<span class='warning'>[O] is already modified!")
|
||||
return
|
||||
if(O.type in fromitem) //makes sure O is the right thing
|
||||
var/obj/item/melee/baton/B = O
|
||||
if(!B.cell) //checks for a powercell in the baton. If there isn't one, continue. If there is, warn the user to take it out
|
||||
new product(usr.loc) //spawns the product
|
||||
user.visible_message("<span class='warning'>[user] modifies [O]!","<span class='warning'>You modify the [O]!")
|
||||
qdel(O) //Gets rid of the baton
|
||||
qdel(src) //gets rid of the kit
|
||||
else
|
||||
to_chat(user, "<span class='warning'> You can't modify [O] with this kit!</span>")
|
||||
to_chat(user,"<span class='warning'>Remove the powercell first!</span>") //We make this check because the stunsword starts without a battery.
|
||||
else
|
||||
to_chat(user, "<span class='warning'> You can't modify [O] with this kit!</span>")
|
||||
|
||||
//Makeshift stun baton. Replacement for stun gloves.
|
||||
/obj/item/melee/baton/cattleprod
|
||||
|
||||
@@ -73,6 +73,15 @@
|
||||
/obj/item/tank/proc/populate_gas()
|
||||
return
|
||||
|
||||
/obj/item/tank/DoRevenantThrowEffects(atom/target)
|
||||
if(air_contents)
|
||||
var/turf/open/location = get_turf(src)
|
||||
if(istype(location))
|
||||
location.assume_air(air_contents)
|
||||
air_contents.clear()
|
||||
SSair.add_to_active(location)
|
||||
visible_message("<span class='warning'[src] leaks gas!")
|
||||
|
||||
/obj/item/tank/Destroy()
|
||||
if(air_contents)
|
||||
qdel(air_contents)
|
||||
|
||||
@@ -57,6 +57,9 @@
|
||||
else
|
||||
item_state = "[initial(item_state)]"
|
||||
|
||||
/obj/item/weldingtool/DoRevenantThrowEffects(atom/target)
|
||||
attack_self()
|
||||
|
||||
/obj/item/weldingtool/update_overlays()
|
||||
. = ..()
|
||||
if(change_icons)
|
||||
@@ -208,12 +211,14 @@
|
||||
//Switches the welder on
|
||||
/obj/item/weldingtool/proc/switched_on(mob/user)
|
||||
if(!status)
|
||||
to_chat(user, "<span class='warning'>[src] can't be turned on while unsecured!</span>")
|
||||
if(user)
|
||||
to_chat(user, "<span class='warning'>[src] can't be turned on while unsecured!</span>")
|
||||
return
|
||||
welding = !welding
|
||||
if(welding)
|
||||
if(get_fuel() >= 1)
|
||||
to_chat(user, "<span class='notice'>You switch [src] on.</span>")
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>You switch [src] on.</span>")
|
||||
playsound(loc, acti_sound, 50, 1)
|
||||
force = 15
|
||||
damtype = "fire"
|
||||
|
||||
@@ -302,7 +302,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
damtype = STAMINA
|
||||
attack_verb = list("whacked", "smacked", "struck")
|
||||
total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
|
||||
hitsound = 'sound/weapons/grenadelaunch.ogg' // no good wood thunk sounds
|
||||
hitsound = 'sound/weapons/woodbonk.ogg'
|
||||
var/harm = FALSE // TRUE = brute, FALSE = stam
|
||||
var/reinforced = FALSE
|
||||
var/burnt = FALSE
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
return 1
|
||||
|
||||
var/mob/living/M = caller
|
||||
if(!M.ventcrawler && M.mob_size != MOB_SIZE_TINY)
|
||||
if(!(SEND_SIGNAL(M, COMSIG_CHECK_VENTCRAWL)) && M.mob_size != MOB_SIZE_TINY)
|
||||
return 0
|
||||
var/atom/movable/M = caller
|
||||
if(M && M.pulling)
|
||||
@@ -91,7 +91,7 @@
|
||||
return 1
|
||||
if(M.buckled && istype(M.buckled, /mob/living/simple_animal/bot/mulebot)) // mulebot passenger gets a free pass.
|
||||
return 1
|
||||
if(!M.lying && !M.ventcrawler && M.mob_size != MOB_SIZE_TINY) //If your not laying down, or a ventcrawler or a small creature, no pass.
|
||||
if(!M.lying && !(SEND_SIGNAL(M, COMSIG_CHECK_VENTCRAWL)) && M.mob_size != MOB_SIZE_TINY) //If your not laying down, or a ventcrawler or a small creature, no pass.
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -56,17 +56,17 @@
|
||||
desc = "A direction sign, pointing out which way the Cafe is."
|
||||
icon_state = "direction_cafe"
|
||||
|
||||
obj/structure/sign/directions/rooms
|
||||
/obj/structure/sign/directions/rooms
|
||||
name = "room"
|
||||
desc = "Room numbers, helps others find you!"
|
||||
icon_state = "roomnum"
|
||||
|
||||
obj/structure/sign/directions/dorms
|
||||
/obj/structure/sign/directions/dorms
|
||||
name = "dorm"
|
||||
desc = "Dorm numbers, help others find you, or you find others."
|
||||
icon_state = "dormnum"
|
||||
|
||||
obj/structure/sign/directions/cells
|
||||
/obj/structure/sign/directions/cells
|
||||
name = "room"
|
||||
desc = "So the less fortunate amongst us know where they'll be staying."
|
||||
icon_state = "cellnum"
|
||||
|
||||
@@ -1,12 +1,5 @@
|
||||
/turf/open
|
||||
plane = FLOOR_PLANE
|
||||
/// Does dirt buildup happen on us?
|
||||
var/dirt_buildup_allowed = FALSE
|
||||
/// Dirt level.
|
||||
var/dirtyness = 0
|
||||
/// Dirt level to spawn dirt. Null to use config.
|
||||
var/dirt_spawn_threshold
|
||||
/// Slowdown applied to mobs on us.
|
||||
var/slowdown = 0 //negative for faster, positive for slower
|
||||
|
||||
var/postdig_icon_change = FALSE
|
||||
@@ -18,6 +11,15 @@
|
||||
var/clawfootstep = null
|
||||
var/heavyfootstep = null
|
||||
|
||||
/// Dirtyness system, cit specific.
|
||||
|
||||
/// Does dirt buildup happen on us?
|
||||
var/dirt_buildup_allowed = FALSE
|
||||
/// Dirt level.
|
||||
var/dirtyness = 0
|
||||
/// Dirt level to spawn dirt. Null to use config.
|
||||
var/dirt_spawn_threshold
|
||||
|
||||
/turf/open/ComponentInitialize()
|
||||
. = ..()
|
||||
if(wet)
|
||||
|
||||
@@ -10,6 +10,8 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr
|
||||
plane = OPENSPACE_BACKDROP_PLANE
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
layer = SPLASHSCREEN_LAYER
|
||||
//I don't know why the others are aligned but I shall do the same.
|
||||
vis_flags = VIS_INHERIT_ID
|
||||
|
||||
/turf/open/transparent/openspace
|
||||
name = "open space"
|
||||
@@ -17,6 +19,7 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr
|
||||
icon_state = "transparent"
|
||||
baseturfs = /turf/open/transparent/openspace
|
||||
CanAtmosPassVertical = ATMOS_PASS_YES
|
||||
intact = FALSE //this means wires go on top
|
||||
//mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
var/can_cover_up = TRUE
|
||||
var/can_build_on = TRUE
|
||||
@@ -32,10 +35,14 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr
|
||||
/turf/open/transparent/openspace/show_bottom_level()
|
||||
return FALSE
|
||||
|
||||
/turf/open/transparent/openspace/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker
|
||||
/turf/open/openspace/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker
|
||||
. = ..()
|
||||
|
||||
vis_contents += GLOB.openspace_backdrop_one_for_all //Special grey square for projecting backdrop darkness filter on it.
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/turf/open/openspace/LateInitialize()
|
||||
. = ..()
|
||||
// AddElement(/datum/element/turf_z_transparency, FALSE)
|
||||
|
||||
/turf/open/transparent/openspace/can_have_cabling()
|
||||
if(locate(/obj/structure/lattice/catwalk, src))
|
||||
@@ -95,6 +102,7 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr
|
||||
return
|
||||
if(L)
|
||||
if(R.use(1))
|
||||
qdel(L)
|
||||
to_chat(user, "<span class='notice'>You construct a catwalk.</span>")
|
||||
playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE)
|
||||
new/obj/structure/lattice/catwalk(src)
|
||||
@@ -148,9 +156,22 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr
|
||||
/turf/open/transparent/openspace/icemoon
|
||||
name = "ice chasm"
|
||||
baseturfs = /turf/open/transparent/openspace/icemoon
|
||||
can_cover_up = TRUE
|
||||
can_build_on = TRUE
|
||||
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
|
||||
planetary_atmos = TRUE
|
||||
var/replacement_turf = /turf/open/floor/plating/asteroid/snow/icemoon
|
||||
|
||||
/turf/open/transparent/openspace/icemoon/Initialize()
|
||||
. = ..()
|
||||
var/turf/T = below()
|
||||
// if(T.flags_1 & NO_RUINS_1)
|
||||
// ChangeTurf(replacement_turf, null, CHANGETURF_IGNORE_AIR)
|
||||
// return
|
||||
// if(!ismineralturf(T))
|
||||
// return
|
||||
var/turf/closed/mineral/M = T
|
||||
M.mineralAmt = 0
|
||||
M.gets_drilled()
|
||||
baseturfs = /turf/open/transparent/openspace/icemoon //This is to ensure that IF random turf generation produces a openturf, there won't be other turfs assigned other than openspace.
|
||||
|
||||
/turf/open/transparent/openspace/icemoon/can_zFall(atom/movable/A, levels = 1, turf/target)
|
||||
return TRUE
|
||||
|
||||
@@ -66,7 +66,12 @@
|
||||
|
||||
/turf/open/transparent/glass/Initialize()
|
||||
icon_state = "" //Prevent the normal icon from appearing behind the smooth overlays
|
||||
return ..()
|
||||
..()
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/turf/open/floor/glass/LateInitialize()
|
||||
. = ..()
|
||||
// AddElement(/datum/element/turf_z_transparency, TRUE)
|
||||
|
||||
/turf/open/transparent/glass/wrench_act(mob/living/user, obj/item/I)
|
||||
to_chat(user, "<span class='notice'>You begin removing glass...</span>")
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
|
||||
bullet_bounce_sound = null
|
||||
|
||||
vis_flags = VIS_INHERIT_ID //when this be added to vis_contents of something it be associated with something on clicking, important for visualisation of turf in openspace and interraction with openspace that show you turf.
|
||||
|
||||
/turf/open/space/basic/New() //Do not convert to Initialize
|
||||
//This is used to optimize the map loader
|
||||
|
||||
@@ -197,6 +197,14 @@ GLOBAL_LIST(topic_status_cache)
|
||||
/world/Topic(T, addr, master, key)
|
||||
TGS_TOPIC //redirect to server tools if necessary
|
||||
|
||||
if(!SSfail2topic)
|
||||
return "Server not initialized."
|
||||
if(SSfail2topic.IsRateLimited(addr))
|
||||
return "Rate limited."
|
||||
|
||||
if(length(T) > CONFIG_GET(number/topic_max_size))
|
||||
return "Payload too large!"
|
||||
|
||||
var/static/list/topic_handlers = TopicHandlers()
|
||||
|
||||
var/list/input = params2list(T)
|
||||
|
||||
Reference in New Issue
Block a user