mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-19 20:15:47 +01:00
Merge branch 'master' into seperate-job-files
This commit is contained in:
@@ -52,25 +52,22 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
var/procname = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null
|
||||
if(!procname)
|
||||
return
|
||||
|
||||
//hascall() doesn't support proc paths (eg: /proc/gib(), it only supports "gib")
|
||||
var/testname = procname
|
||||
if(targetselected)
|
||||
//Find one of the 3 possible ways they could have written /proc/PROCNAME
|
||||
if(findtext(procname, "/proc/"))
|
||||
testname = replacetext(procname, "/proc/", "")
|
||||
else if(findtext(procname, "/proc"))
|
||||
testname = replacetext(procname, "/proc", "")
|
||||
else if(findtext(procname, "proc/"))
|
||||
testname = replacetext(procname, "proc/", "")
|
||||
//Clear out any parenthesis if they're a dummy
|
||||
testname = replacetext(testname, "()", "")
|
||||
|
||||
if(targetselected && !hascall(target,testname))
|
||||
to_chat(usr, "<font color='red'>Error: callproc(): type [target.type] has no proc named [procname].</font>")
|
||||
|
||||
//strip away everything but the proc name
|
||||
var/list/proclist = splittext(procname, "/")
|
||||
if (!length(proclist))
|
||||
return
|
||||
procname = proclist[proclist.len]
|
||||
|
||||
var/proctype = "proc"
|
||||
if ("verb" in proclist)
|
||||
proctype = "verb"
|
||||
|
||||
if(targetselected && !hascall(target, procname))
|
||||
to_chat(usr, "<font color='red'>Error: callproc(): type [target.type] has no [proctype] named [procname].</font>")
|
||||
return
|
||||
else
|
||||
var/procpath = text2path(procname)
|
||||
var/procpath = text2path("[proctype]/[procname]")
|
||||
if (!procpath)
|
||||
to_chat(usr, "<font color='red'>Error: callproc(): proc [procname] does not exist. (Did you forget the /proc/ part?)</font>")
|
||||
return
|
||||
|
||||
@@ -176,7 +176,7 @@
|
||||
|
||||
/datum/action/innate/cult/blood_spell/construction
|
||||
name = "Twisted Construction"
|
||||
desc = "<u>A sinister spell used to convert:</u><br>Plasteel into runed metal<br>25 metal into a construct shell<br>Cyborgs directly into constructs<br>Cyborg shells into construct shells<br>Airlocks into runed airlocks (harm intent)"
|
||||
desc = "<u>A sinister spell used to convert:</u><br>Plasteel into runed metal<br>50 metal into a construct shell<br>Cyborgs directly into constructs<br>Cyborg shells into construct shells<br>Airlocks into runed airlocks (harm intent)"
|
||||
button_icon_state = "transmute"
|
||||
magic_path = "/obj/item/melee/blood_magic/construction"
|
||||
health_cost = 12
|
||||
@@ -549,7 +549,7 @@
|
||||
. = ..()
|
||||
|
||||
|
||||
//Construction: Creates a construct shell out of 50 metal sheets, or converts plasteel into runed metal
|
||||
//Construction: Converts 50 metal to a construct shell, plasteel to runed metal, airlock to brittle runed airlock, a borg to a construct, or borg shell to a construct shell
|
||||
/obj/item/melee/blood_magic/construction
|
||||
name = "Corrupting Aura"
|
||||
desc = "Corrupts metal and plasteel into more sinister forms."
|
||||
@@ -561,13 +561,14 @@
|
||||
var/turf/T = get_turf(target)
|
||||
if(istype(target, /obj/item/stack/sheet/metal))
|
||||
var/obj/item/stack/sheet/candidate = target
|
||||
if(candidate.use(50))
|
||||
if(candidate.use(METAL_TO_CONSTRUCT_SHELL_CONVERSION))
|
||||
uses--
|
||||
to_chat(user, "<span class='warning'>A dark cloud emanates from your hand and swirls around the metal, twisting it into a construct shell!</span>")
|
||||
new /obj/structure/constructshell(T)
|
||||
SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need 50 metal to produce a construct shell!</span>")
|
||||
to_chat(user, "<span class='warning'>You need [METAL_TO_CONSTRUCT_SHELL_CONVERSION] metal to produce a construct shell!</span>")
|
||||
return
|
||||
else if(istype(target, /obj/item/stack/sheet/plasteel))
|
||||
var/obj/item/stack/sheet/plasteel/candidate = target
|
||||
var/quantity = candidate.amount
|
||||
@@ -600,6 +601,7 @@
|
||||
qdel(candidate)
|
||||
else
|
||||
candidate.color = prev_color
|
||||
return
|
||||
else
|
||||
uses--
|
||||
to_chat(user, "<span class='warning'>A dark cloud emanates from you hand and swirls around [candidate] - twisting it into a construct shell!</span>")
|
||||
@@ -613,6 +615,8 @@
|
||||
uses--
|
||||
user.visible_message("<span class='warning'>Black ribbons suddenly emanate from [user]'s hand and cling to the airlock - twisting and corrupting it!</span>")
|
||||
SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
|
||||
else
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The spell will not work on [target]!</span>")
|
||||
return
|
||||
@@ -762,10 +766,10 @@
|
||||
return
|
||||
switch(choice)
|
||||
if("Blood Spear (150)")
|
||||
if(uses < 150)
|
||||
to_chat(user, "<span class='cultitalic'>You need 150 charges to perform this rite.</span>")
|
||||
if(uses < BLOOD_SPEAR_COST)
|
||||
to_chat(user, "<span class='cultitalic'>You need [BLOOD_SPEAR_COST] charges to perform this rite.</span>")
|
||||
else
|
||||
uses -= 150
|
||||
uses -= BLOOD_SPEAR_COST
|
||||
var/turf/T = get_turf(user)
|
||||
qdel(src)
|
||||
var/datum/action/innate/cult/spear/S = new(user)
|
||||
@@ -778,11 +782,11 @@
|
||||
user.visible_message("<span class='warning'>A [rite.name] appears at [user]'s feet!</span>", \
|
||||
"<span class='cultitalic'>A [rite.name] materializes at your feet.</span>")
|
||||
if("Blood Bolt Barrage (300)")
|
||||
if(uses < 300)
|
||||
to_chat(user, "<span class='cultitalic'>You need 300 charges to perform this rite.</span>")
|
||||
if(uses < BLOOD_BARRAGE_COST)
|
||||
to_chat(user, "<span class='cultitalic'>You need [BLOOD_BARRAGE_COST] charges to perform this rite.</span>")
|
||||
else
|
||||
var/obj/rite = new /obj/item/gun/ballistic/shotgun/boltaction/enchanted/arcane_barrage/blood()
|
||||
uses -= 300
|
||||
uses -= BLOOD_BARRAGE_COST
|
||||
qdel(src)
|
||||
if(user.put_in_hands(rite))
|
||||
to_chat(user, "<span class='cult'><b>Your hands glow with power!</b></span>")
|
||||
@@ -790,11 +794,11 @@
|
||||
to_chat(user, "<span class='cultitalic'>You need a free hand for this rite!</span>")
|
||||
qdel(rite)
|
||||
if("Blood Beam (500)")
|
||||
if(uses < 500)
|
||||
to_chat(user, "<span class='cultitalic'>You need 500 charges to perform this rite.</span>")
|
||||
if(uses < BLOOD_BEAM_COST)
|
||||
to_chat(user, "<span class='cultitalic'>You need [BLOOD_BEAM_COST] charges to perform this rite.</span>")
|
||||
else
|
||||
var/obj/rite = new /obj/item/blood_beam()
|
||||
uses -= 500
|
||||
uses -= BLOOD_BEAM_COST
|
||||
qdel(src)
|
||||
if(user.put_in_hands(rite))
|
||||
to_chat(user, "<span class='cultlarge'><b>Your hands glow with POWER OVERWHELMING!!!</b></span>")
|
||||
|
||||
@@ -1942,7 +1942,6 @@
|
||||
/obj/item/clothing/shoes/sneakers/black,
|
||||
/obj/item/clothing/gloves/color/white,
|
||||
/obj/item/clothing/mask/gas/mime,
|
||||
/obj/item/clothing/head/beret,
|
||||
/obj/item/clothing/head/frenchberet,
|
||||
/obj/item/clothing/suit/suspenders,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing,
|
||||
|
||||
@@ -273,12 +273,13 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
|
||||
connection_timeofday = world.timeofday
|
||||
winset(src, null, "command=\".configure graphics-hwmode on\"")
|
||||
var/cev = CONFIG_GET(number/client_error_version)
|
||||
var/ceb = CONFIG_GET(number/client_error_build)
|
||||
var/cwv = CONFIG_GET(number/client_warn_version)
|
||||
if (byond_version < cev) //Out of date client.
|
||||
if (byond_version < cev || byond_build < ceb) //Out of date client.
|
||||
to_chat(src, "<span class='danger'><b>Your version of BYOND is too old:</b></span>")
|
||||
to_chat(src, CONFIG_GET(string/client_error_message))
|
||||
to_chat(src, "Your version: [byond_version]")
|
||||
to_chat(src, "Required version: [cev] or later")
|
||||
to_chat(src, "Your version: [byond_version].[byond_build]")
|
||||
to_chat(src, "Required version: [cev].[ceb] or later")
|
||||
to_chat(src, "Visit <a href=\"https://secure.byond.com/download\">BYOND's website</a> to get the latest version of BYOND.")
|
||||
if (connecting_admin)
|
||||
to_chat(src, "Because you are an admin, you are being allowed to walk past this limitation, But it is still STRONGLY suggested you upgrade")
|
||||
@@ -697,8 +698,14 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
|
||||
/client/Click(atom/object, atom/location, control, params)
|
||||
var/ab = FALSE
|
||||
var/list/L = params2list(params)
|
||||
|
||||
var/dragged = L["drag"]
|
||||
if(dragged && !L[dragged])
|
||||
return
|
||||
|
||||
if (object && object == middragatom && L["left"])
|
||||
ab = max(0, 5 SECONDS-(world.time-middragtime)*0.1)
|
||||
|
||||
var/mcl = CONFIG_GET(number/minute_click_limit)
|
||||
if (!holder && mcl)
|
||||
var/minute = round(world.time, 600)
|
||||
@@ -718,7 +725,6 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
|
||||
log_game("[key_name(src)] is using the middle click aimbot exploit")
|
||||
message_admins("[ADMIN_LOOKUPFLW(src)] [ADMIN_KICK(usr)] is using the middle click aimbot exploit</span>")
|
||||
add_system_note("aimbot", "Is using the middle click aimbot exploit")
|
||||
|
||||
log_game("[key_name(src)] Has hit the per-minute click limit of [mcl] clicks in a given game minute")
|
||||
message_admins("[ADMIN_LOOKUPFLW(src)] [ADMIN_KICK(usr)] Has hit the per-minute click limit of [mcl] clicks in a given game minute")
|
||||
to_chat(src, "<span class='danger'>[msg]</span>")
|
||||
|
||||
@@ -14,19 +14,27 @@
|
||||
|
||||
dog_fashion = /datum/dog_fashion/head
|
||||
|
||||
/obj/item/clothing/head/hardhat/attack_self(mob/user)
|
||||
on = !on
|
||||
icon_state = "hardhat[on]_[item_color]"
|
||||
item_state = "hardhat[on]_[item_color]"
|
||||
user.update_inv_head() //so our mob-overlays update
|
||||
/obj/item/clothing/head/hardhat/attack_self(mob/living/user)
|
||||
toggle_helmet_light(user)
|
||||
|
||||
/obj/item/clothing/head/hardhat/proc/toggle_helmet_light(mob/living/user)
|
||||
on = !on
|
||||
if(on)
|
||||
turn_on(user)
|
||||
else
|
||||
turn_off(user)
|
||||
update_icon()
|
||||
|
||||
/obj/item/clothing/head/hardhat/update_icon()
|
||||
icon_state = "hardhat[on]_[item_color]"
|
||||
item_state = "hardhat[on]_[item_color]"
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
H.update_inv_head()
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
A.UpdateButtonIcon(force = TRUE)
|
||||
..()
|
||||
|
||||
/obj/item/clothing/head/hardhat/proc/turn_on(mob/user)
|
||||
set_light(brightness_on)
|
||||
@@ -81,4 +89,69 @@
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
|
||||
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat
|
||||
name = "welding hard hat"
|
||||
desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight AND welding shield! The bulb seems a little smaller though."
|
||||
brightness_on = 3 //Needs a little bit of tradeoff
|
||||
dog_fashion = null
|
||||
actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/toggle_welding_screen)
|
||||
flash_protect = 2
|
||||
tint = 2
|
||||
flags_inv = HIDEEYES | HIDEFACE
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT
|
||||
visor_flags_inv = HIDEEYES | HIDEFACE
|
||||
visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/Initialize()
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/attack_self(mob/living/user)
|
||||
toggle_helmet_light(user)
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/AltClick(mob/user)
|
||||
if(user.canUseTopic(src, BE_CLOSE))
|
||||
toggle_welding_screen(user)
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/proc/toggle_welding_screen(mob/living/user)
|
||||
if(weldingvisortoggle(user))
|
||||
playsound(src, 'sound/mecha/mechmove03.ogg', 50, 1) //Visors don't just come from nothing
|
||||
update_icon()
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/worn_overlays(isinhands)
|
||||
. = ..()
|
||||
if(!isinhands)
|
||||
. += mutable_appearance('icons/mob/head.dmi', "weldhelmet")
|
||||
if(!up)
|
||||
. += mutable_appearance('icons/mob/head.dmi', "weldvisor")
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/update_icon()
|
||||
cut_overlays()
|
||||
if(!up)
|
||||
add_overlay("weldvisor")
|
||||
..()
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/orange
|
||||
icon_state = "hardhat0_orange"
|
||||
item_state = "hardhat0_orange"
|
||||
item_color = "orange"
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/white
|
||||
desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight AND welding shield!" //This bulb is not smaller
|
||||
icon_state = "hardhat0_white"
|
||||
item_state = "hardhat0_white"
|
||||
brightness_on = 4 //Boss always takes the best stuff
|
||||
item_color = "white"
|
||||
clothing_flags = STOPSPRESSUREDAMAGE
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/dblue
|
||||
icon_state = "hardhat0_dblue"
|
||||
item_state = "hardhat0_dblue"
|
||||
item_color = "dblue"
|
||||
@@ -145,6 +145,21 @@
|
||||
strip_delay = 60
|
||||
dog_fashion = /datum/dog_fashion/head/warden
|
||||
|
||||
/obj/item/clothing/head/warden/drill
|
||||
name = "warden's drill hat"
|
||||
desc = "A special armored campaign hat with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficient protection. Has the letters 'FMJ' enscribed on its side."
|
||||
icon_state = "wardendrill"
|
||||
item_state = "wardendrill"
|
||||
dog_fashion = null
|
||||
|
||||
/obj/item/clothing/head/warden/drill/equipped(mob/living/carbon/human/user, slot)
|
||||
..()
|
||||
if(slot == SLOT_HEAD)
|
||||
user.dna.add_mutation(YELLING)
|
||||
|
||||
/obj/item/clothing/head/warden/drill/dropped(mob/living/carbon/human/user)
|
||||
user.dna.remove_mutation(YELLING)
|
||||
|
||||
/obj/item/clothing/head/beret/sec
|
||||
name = "security beret"
|
||||
desc = "A robust beret with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficient protection."
|
||||
|
||||
@@ -347,7 +347,7 @@
|
||||
/obj/item/clothing/head/frenchberet
|
||||
name = "french beret"
|
||||
desc = "A quality beret, infused with the aroma of chain-smoking, wine-swilling Parisians. You feel less inclined to engage military conflict, for some reason."
|
||||
icon_state = "beretblack"
|
||||
icon_state = "beret"
|
||||
dynamic_hair_suffix = ""
|
||||
|
||||
/obj/item/clothing/head/frenchberet/speechModification(M)
|
||||
|
||||
@@ -244,6 +244,7 @@
|
||||
if(paranoia)
|
||||
QDEL_NULL(paranoia)
|
||||
paranoia = new()
|
||||
paranoia.clonable = FALSE
|
||||
|
||||
user.gain_trauma(paranoia, TRAUMA_RESILIENCE_MAGIC)
|
||||
to_chat(user, "<span class='warning'>As you don the foiled hat, an entire world of conspiracy theories and seemingly insane ideas suddenly rush into your mind. What you once thought unbelievable suddenly seems.. undeniable. Everything is connected and nothing happens just by accident. You know too much and now they're out to get you. </span>")
|
||||
|
||||
@@ -288,4 +288,4 @@
|
||||
icon_state = "empoweredburger"
|
||||
list_reagents = list("nutriment" = 8, "liquidelectricity" = 5)
|
||||
tastes = list("bun" = 2, "pure electricity" = 4)
|
||||
foodtype = GRAIN | TOXIC
|
||||
foodtype = GRAIN | TOXIC
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
suit = /obj/item/clothing/suit/suspenders
|
||||
backpack_contents = list(/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing=1)
|
||||
|
||||
accessory = /obj/item/clothing/accessory/pocketprotector/cosmetology
|
||||
backpack = /obj/item/storage/backpack/mime
|
||||
satchel = /obj/item/storage/backpack/mime
|
||||
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
if(get_dist(user, src) <= 1) //people with TK won't get smeared with blood
|
||||
user.add_mob_blood(src)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/dirtyboy
|
||||
var/mob/living/carbon/human/dirtyboy = user
|
||||
dirtyboy.adjust_hygiene(-10)
|
||||
if(affecting.body_zone == BODY_ZONE_HEAD)
|
||||
if(wear_mask)
|
||||
|
||||
@@ -7,9 +7,7 @@
|
||||
return TRUE
|
||||
if(istype(mover, /obj/item/projectile))
|
||||
var/obj/item/projectile/P = mover
|
||||
if(P.can_hit_target(src, P.permutated, src == P.original, TRUE))
|
||||
P.Bump(src)
|
||||
return TRUE
|
||||
return !P.can_hit_target(src, P.permutated, src == P.original, TRUE)
|
||||
if(mover.throwing)
|
||||
return (!density || !(mobility_flags & MOBILITY_STAND))
|
||||
if(buckled == mover)
|
||||
|
||||
@@ -179,10 +179,7 @@
|
||||
/obj/effect/decal/cleanable/vomit,
|
||||
/obj/effect/decal/cleanable/robot_debris,
|
||||
/obj/effect/decal/cleanable/molten_object,
|
||||
/obj/effect/decal/cleanable/food/tomato_smudge,
|
||||
/obj/effect/decal/cleanable/food/egg_smudge,
|
||||
/obj/effect/decal/cleanable/food/pie_smudge,
|
||||
/obj/effect/decal/cleanable/food/flour,
|
||||
/obj/effect/decal/cleanable/food,
|
||||
/obj/effect/decal/cleanable/ash,
|
||||
/obj/effect/decal/cleanable/greenglow,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
var/icon_aggro = null
|
||||
var/crusher_drop_mod = 5
|
||||
var/crusher_drop_mod = 25
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -58,7 +58,7 @@
|
||||
/mob/living/simple_animal/hostile/asteroid/death(gibbed)
|
||||
SSblackbox.record_feedback("tally", "mobs_killed_mining", 1, type)
|
||||
var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
|
||||
if(C && crusher_loot && prob((C.total_damage/maxHealth) * crusher_drop_mod)) //on average, you'll need to kill 20 creatures before getting the item
|
||||
if(C && crusher_loot && prob((C.total_damage/maxHealth) * crusher_drop_mod)) //on average, you'll need to kill 4 creatures before getting the item
|
||||
spawn_crusher_loot()
|
||||
..(gibbed)
|
||||
|
||||
|
||||
@@ -214,7 +214,7 @@
|
||||
|
||||
/obj/item/suppressor
|
||||
name = "suppressor"
|
||||
desc = "A nigh-universal syndicate small-arms suppressor for maximum espionage."
|
||||
desc = "A syndicate small-arms suppressor for maximum espionage."
|
||||
icon = 'icons/obj/guns/projectile.dmi'
|
||||
icon_state = "suppressor"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
|
||||
@@ -565,7 +565,7 @@
|
||||
|
||||
/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/prehit(atom/target)
|
||||
qdel(src)
|
||||
return BULLET_ACT_HIT
|
||||
return FALSE
|
||||
|
||||
/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/on_hit()
|
||||
qdel(src)
|
||||
|
||||
@@ -230,13 +230,6 @@
|
||||
if(hitscan)
|
||||
store_hitscan_collision(pcache)
|
||||
return TRUE
|
||||
if(firer && !ignore_source_check)
|
||||
var/mob/checking = firer
|
||||
if((A == firer) || (((A in firer.buckled_mobs) || (istype(checking) && (A == checking.buckled))) && (A != original)) || (A == firer.loc && ismecha(A))) //cannot shoot yourself or your mech
|
||||
trajectory_ignore_forcemove = TRUE
|
||||
forceMove(T)
|
||||
trajectory_ignore_forcemove = FALSE
|
||||
return FALSE
|
||||
|
||||
var/distance = get_dist(T, starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations.
|
||||
def_zone = ran_zone(def_zone, max(100-(7*distance), 5)) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use.
|
||||
@@ -529,6 +522,10 @@
|
||||
/obj/item/projectile/proc/can_hit_target(atom/target, list/passthrough, direct_target = FALSE, ignore_loc = FALSE)
|
||||
if(QDELETED(target))
|
||||
return FALSE
|
||||
if(!ignore_source_check && firer)
|
||||
var/mob/M = firer
|
||||
if((target == firer) || ((target == firer.loc) && ismecha(firer.loc)) || (target in firer.buckled_mobs) || (istype(M) && (M.buckled == target)))
|
||||
return FALSE
|
||||
if(!ignore_loc && (loc != target.loc))
|
||||
return FALSE
|
||||
if(target in passthrough)
|
||||
|
||||
@@ -128,7 +128,6 @@
|
||||
return
|
||||
replace_beaker(user, B)
|
||||
to_chat(user, "<span class='notice'>You add [B] to [src].</span>")
|
||||
updateUsrDialog()
|
||||
update_icon()
|
||||
return TRUE //no afterattack
|
||||
|
||||
|
||||
@@ -1169,6 +1169,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
|
||||
/datum/reagent/consumable/ethanol/silencer/on_mob_life(mob/living/carbon/M)
|
||||
if(ishuman(M) && M.job == "Mime")
|
||||
M.silent = max(M.silent, MIMEDRINK_SILENCE_DURATION)
|
||||
M.heal_bodypart_damage(1,1)
|
||||
. = 1
|
||||
return ..() || .
|
||||
@@ -1855,6 +1856,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
|
||||
/datum/reagent/consumable/ethanol/blank_paper/on_mob_life(mob/living/carbon/M)
|
||||
if(ishuman(M) && M.job == "Mime")
|
||||
M.silent = max(M.silent, MIMEDRINK_SILENCE_DURATION)
|
||||
M.heal_bodypart_damage(1,1)
|
||||
. = 1
|
||||
return ..()
|
||||
|
||||
@@ -154,6 +154,7 @@
|
||||
|
||||
/datum/reagent/consumable/nothing/on_mob_life(mob/living/carbon/M)
|
||||
if(ishuman(M) && M.job == "Mime")
|
||||
M.silent = max(M.silent, MIMEDRINK_SILENCE_DURATION)
|
||||
M.heal_bodypart_damage(1,1, 0)
|
||||
. = 1
|
||||
..()
|
||||
|
||||
@@ -52,12 +52,11 @@
|
||||
var/smoke_message = pick("You feel relaxed.", "You feel calmed.","You feel alert.","You feel rugged.")
|
||||
to_chat(M, "<span class='notice'>[smoke_message]</span>")
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "smoked", /datum/mood_event/smoked, name)
|
||||
M.AdjustStun(-20, FALSE)
|
||||
M.AdjustKnockdown(-20, FALSE)
|
||||
M.AdjustUnconscious(-20, FALSE)
|
||||
M.AdjustParalyzed(-20, FALSE)
|
||||
M.AdjustImmobilized(-20, FALSE)
|
||||
M.adjustStaminaLoss(-0.5*REM, 0)
|
||||
M.AdjustStun(-5, FALSE)
|
||||
M.AdjustKnockdown(-5, FALSE)
|
||||
M.AdjustUnconscious(-5, FALSE)
|
||||
M.AdjustParalyzed(-5, FALSE)
|
||||
M.AdjustImmobilized(-5, FALSE)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
|
||||
@@ -914,7 +914,6 @@
|
||||
toxpwr = 0
|
||||
taste_description = "bone hurting"
|
||||
overdose_threshold = 50
|
||||
metabolization_rate = 2
|
||||
|
||||
/datum/reagent/toxin/bonehurtingjuice/on_mob_add(mob/living/carbon/M)
|
||||
M.say("oof ouch my bones", forced = "bonehurtingjuice")
|
||||
|
||||
@@ -265,8 +265,8 @@
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/suppressor
|
||||
name = "Universal Suppressor"
|
||||
desc = "A reverse-engineered universal suppressor that fits on most small arms with threaded barrels."
|
||||
name = "Suppressor"
|
||||
desc = "A reverse-engineered suppressor that fits on most small arms with threaded barrels."
|
||||
id = "suppressor"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_SILVER = 500)
|
||||
|
||||
@@ -131,7 +131,7 @@ Slimecrossing Armor
|
||||
desc = "A full suit of adamantine plate armor. Impressively resistant to damage, but weighs about as much as you do."
|
||||
icon_state = "adamsuit"
|
||||
item_state = "adamsuit"
|
||||
flags_inv = list()
|
||||
flags_inv = NONE
|
||||
obj_flags = IMMUTABLE_SLOW
|
||||
slowdown = 4
|
||||
var/hit_reflect_chance = 40
|
||||
|
||||
@@ -547,10 +547,15 @@
|
||||
if(can_interact(usr))
|
||||
return ..()
|
||||
|
||||
/obj/item/storage/pod/AltClick(mob/user)
|
||||
if(!can_interact(user))
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/storage/pod/can_interact(mob/user)
|
||||
if(!..())
|
||||
return FALSE
|
||||
if(GLOB.security_level == SEC_LEVEL_RED || GLOB.security_level == SEC_LEVEL_DELTA || unlocked)
|
||||
if(GLOB.security_level >= SEC_LEVEL_RED || unlocked)
|
||||
return TRUE
|
||||
to_chat(user, "The storage unit will only unlock during a Red or Delta security alert.")
|
||||
|
||||
|
||||
@@ -581,9 +581,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
exclude_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/stealthy_weapons/suppressor
|
||||
name = "Universal Suppressor"
|
||||
desc = "Fitted for use on any small caliber weapon with a threaded barrel, this suppressor will silence the \
|
||||
shots of the weapon for increased stealth and superior ambushing capability."
|
||||
name = "Suppressor"
|
||||
desc = "This suppressor will silence the shots of the weapon it is attached to for increased stealth and superior ambushing capability. It is compatible with many small ballistic guns including the Stechkin and C-20r, but not revolvers or energy guns."
|
||||
item = /obj/item/suppressor
|
||||
cost = 3
|
||||
surplus = 10
|
||||
|
||||
@@ -43,7 +43,9 @@
|
||||
addtimer(VARSET_CALLBACK(src, canmove , TRUE), 20)
|
||||
return FALSE
|
||||
var/datum/component/riding/D = GetComponent(/datum/component/riding)
|
||||
D.vehicle_move_delay = 10/H.get_num_arms()
|
||||
//1.5 (movespeed as of this change) multiplied by 6.7 gets ABOUT 10 (rounded), the old constant for the wheelchair that gets divided by how many arms they have
|
||||
//if that made no sense this simply makes the wheelchair speed change along with movement speed delay
|
||||
D.vehicle_move_delay = round(CONFIG_GET(number/movedelay/run_delay) * 6.7) / min(H.get_num_arms(), 2)
|
||||
..()
|
||||
|
||||
/obj/vehicle/ridden/wheelchair/Moved()
|
||||
@@ -100,3 +102,10 @@
|
||||
if(isobserver(user) && CONFIG_GET(flag/ghost_interaction))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/vehicle/ridden/wheelchair/the_whip/driver_move(mob/living/user, direction)
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(istype(H))
|
||||
var/datum/component/riding/D = GetComponent(/datum/component/riding)
|
||||
D.vehicle_move_delay = round(CONFIG_GET(number/movedelay/run_delay) * 6.7) / H.get_num_arms()
|
||||
..()
|
||||
|
||||
@@ -77,7 +77,8 @@
|
||||
/obj/item/clothing/under/rank/engineer/hazard = 3,
|
||||
/obj/item/clothing/suit/hazardvest = 3,
|
||||
/obj/item/clothing/shoes/workboots = 3,
|
||||
/obj/item/clothing/head/hardhat = 3)
|
||||
/obj/item/clothing/head/hardhat = 3,
|
||||
/obj/item/clothing/head/hardhat/weldhat = 3)
|
||||
refill_canister = /obj/item/vending_refill/wardrobe/engi_wardrobe
|
||||
payment_department = ACCOUNT_ENG
|
||||
/obj/item/vending_refill/wardrobe/engi_wardrobe
|
||||
|
||||
Reference in New Issue
Block a user