/obj/item/projectile --> /obj/projectile (#30411)

* yers

* vars

* map changes

* some comments (clearly not stolen from items)

* fix component

* summary
This commit is contained in:
kyunkyunkyun
2025-11-12 15:23:20 +05:00
committed by GitHub
parent e92a45369a
commit f96b26b75a
169 changed files with 858 additions and 851 deletions
@@ -12,7 +12,7 @@
ai_controller = /datum/ai_controller/basic_controller/alien/queen
is_ranged = TRUE
projectile_type = /obj/item/projectile/neurotox
projectile_type = /obj/projectile/neurotox
projectile_sound = 'sound/weapons/pierce.ogg'
ranged_cooldown = 3 SECONDS
@@ -11,7 +11,7 @@
ai_controller = /datum/ai_controller/basic_controller/alien/sentinel
is_ranged = TRUE
projectile_type = /obj/item/projectile/neurotox
projectile_type = /obj/projectile/neurotox
projectile_sound = 'sound/weapons/pierce.ogg'
ranged_cooldown = 3 SECONDS
@@ -1,4 +1,4 @@
/obj/item/projectile/hivebotbullet
/obj/projectile/hivebotbullet
/mob/living/basic/hivebot
name = "Hivebot"
@@ -28,7 +28,7 @@
basic_mob_flags = DEL_ON_DEATH
step_type = FOOTSTEP_MOB_CLAW
ai_controller = /datum/ai_controller/basic_controller/hivebot
projectile_type = /obj/item/projectile/hivebotbullet
projectile_type = /obj/projectile/hivebotbullet
projectile_sound = 'sound/weapons/gunshots/gunshot.ogg'
/mob/living/basic/hivebot/range
@@ -59,7 +59,7 @@
icon_state = "piratespaceranged"
icon_living = "piratespaceranged"
is_ranged = TRUE
projectile_type = /obj/item/projectile/beam
projectile_type = /obj/projectile/beam
projectile_sound = 'sound/weapons/laser.ogg'
ranged_burst_count = 2
ranged_burst_interval = 0.5 SECONDS // Same fire rate as people!
@@ -36,7 +36,7 @@
step_type = FOOTSTEP_MOB_SHOE
is_ranged = TRUE
projectile_type = /obj/item/projectile/plasma/adv
projectile_type = /obj/projectile/plasma/adv
projectile_sound = 'sound/weapons/laser.ogg'
ranged_cooldown = 1.75 SECONDS
@@ -73,7 +73,7 @@
icon_state = "vox_foreman"
icon_living = "vox_foreman"
ai_controller = /datum/ai_controller/basic_controller/simple/vox_foreman
projectile_type = /obj/item/projectile/bullet/spike
projectile_type = /obj/projectile/bullet/spike
projectile_sound = 'sound/weapons/bladeslice.ogg'
ranged_burst_count = 2
ranged_burst_interval = 0.5 SECONDS
@@ -130,14 +130,14 @@
return ..()
/mob/living/basic/mining_drone/CanPass(atom/movable/O)
if(istype(O, /obj/item/projectile/kinetic))
var/obj/item/projectile/kinetic/K = O
if(istype(O, /obj/projectile/kinetic))
var/obj/projectile/kinetic/K = O
if(K.kinetic_gun)
for(var/A in K.kinetic_gun.get_modkits())
var/obj/item/borg/upgrade/modkit/M = A
if(istype(M, /obj/item/borg/upgrade/modkit/minebot_passthrough))
return TRUE
if(istype(O, /obj/item/projectile/destabilizer))
if(istype(O, /obj/projectile/destabilizer))
return TRUE
return ..()
@@ -25,7 +25,7 @@
ai_controller = /datum/ai_controller/basic_controller/watcher
is_ranged = TRUE
ranged_cooldown = 3 SECONDS
projectile_type = /obj/item/projectile/temp/basilisk
projectile_type = /obj/projectile/temp/basilisk
projectile_sound = 'sound/weapons/pierce.ogg'
loot = list(/obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER},
@@ -35,12 +35,12 @@
. = ..()
AddElement(/datum/element/ai_retaliate)
/obj/item/projectile/temp/basilisk
/obj/projectile/temp/basilisk
name = "freezing blast"
icon_state = "ice_2"
temperature = 50
/obj/item/projectile/temp/basilisk/on_hit(atom/target, blocked)
/obj/projectile/temp/basilisk/on_hit(atom/target, blocked)
..()
if(isrobot(target))
var/mob/living/silicon/robot/cyborg = target
@@ -94,7 +94,7 @@
light_range = 3
light_power = 2.5
light_color = LIGHT_COLOR_LAVA
projectile_type = /obj/item/projectile/temp/basilisk/magmawing
projectile_type = /obj/projectile/temp/basilisk/magmawing
crusher_loot = /obj/item/crusher_trophy/blaster_tubes/magma_wing
crusher_drop_mod = 100 // These things are extremely rare (1/133 per spawner). You shouldn't have to hope for another stroke of luck to get it's trophy after finding it
@@ -107,12 +107,12 @@
icon_dead = "watcher_icewing_dead"
maxHealth = 170
health = 170
projectile_type = /obj/item/projectile/temp/basilisk/icewing
projectile_type = /obj/projectile/temp/basilisk/icewing
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/bone = 1) // No sinew; the wings are too fragile to be usable
crusher_loot = /obj/item/crusher_trophy/watcher_wing/ice_wing
crusher_drop_mod = 100 // These things are extremely rare (1/400 per spawner). You shouldn't have to hope for another stroke of luck to get it's trophy after finding it
/obj/item/projectile/temp/basilisk/magmawing
/obj/projectile/temp/basilisk/magmawing
name = "scorching blast"
icon_state = "lava"
damage = 5
@@ -120,11 +120,11 @@
temperature = 500 // Heats you up!
immolate = 1
/obj/item/projectile/temp/basilisk/icewing
/obj/projectile/temp/basilisk/icewing
damage = 5
nodamage = FALSE
/obj/item/projectile/temp/basilisk/icewing/on_hit(atom/target, blocked = FALSE)
/obj/projectile/temp/basilisk/icewing/on_hit(atom/target, blocked = FALSE)
. = ..()
if(.)
var/mob/living/L = target
@@ -48,7 +48,7 @@
for(var/obj/item/stack/ore/ore in src)
ore.forceMove(loc)
/mob/living/basic/mining/goldgrub/bullet_act(obj/item/projectile/P)
/mob/living/basic/mining/goldgrub/bullet_act(obj/projectile/P)
if(P.armor_penetration_flat + P.armor_penetration_percentage >= 100)
return ..()
visible_message("<span class='danger'>[P.name] was repelled by [name]'s girth!</span>")
@@ -27,7 +27,7 @@
/// Message to output if throwing damage is absorbed
var/throw_blocked_message = "bounces off"
/mob/living/basic/mining/bullet_act(obj/item/projectile/P) // Reduces damage from most projectiles to curb off-screen kills
/mob/living/basic/mining/bullet_act(obj/projectile/P) // Reduces damage from most projectiles to curb off-screen kills
if(P.damage < 30 && P.damage_type != BRUTE && has_laser_resist)
P.damage = (P.damage / 3)
visible_message("<span class='danger'>[P] has a reduced effect on [src]!</span>")
@@ -30,7 +30,7 @@
/mob/living/basic/netherworld/Initialize(mapload)
. = ..()
if(prob(grappler_chance))
AddComponent(/datum/component/ranged_attacks, projectile_type = /obj/item/projectile/energy/demonic_grappler, projectile_sound = 'sound/weapons/wave.ogg')
AddComponent(/datum/component/ranged_attacks, projectile_type = /obj/projectile/energy/demonic_grappler, projectile_sound = 'sound/weapons/wave.ogg')
name = "grappling " + name
ai_controller = new /datum/ai_controller/basic_controller/simple/simple_skirmisher/prowler(src)
update_appearance(UPDATE_NAME)
@@ -15,7 +15,7 @@
is_ranged = TRUE
ranged_burst_count = 3
ranged_burst_interval = 0.4
projectile_type = /obj/item/projectile/beam/immolator/weak/hitscan
projectile_type = /obj/projectile/beam/immolator/weak/hitscan
projectile_sound = 'sound/weapons/laser3.ogg'
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minimum_survivable_temperature = 0
@@ -88,7 +88,7 @@
update_icons()
/// We overide the basic effect, as malfunctioning drones are in space, and use jets to dodge. Also lets us do cool effects.
/mob/living/basic/malf_drone/advanced_bullet_dodge(mob/living/source, obj/item/projectile/hitting_projectile)
/mob/living/basic/malf_drone/advanced_bullet_dodge(mob/living/source, obj/projectile/hitting_projectile)
if(HAS_TRAIT(source, TRAIT_IMMOBILIZED))
return NONE
if(source.stat != CONSCIOUS)
@@ -8,7 +8,7 @@ emp_act
*/
/mob/living/carbon/human/bullet_act(obj/item/projectile/P, def_zone)
/mob/living/carbon/human/bullet_act(obj/projectile/P, def_zone)
if(!dna.species.bullet_act(P, src, def_zone))
add_attack_logs(P.firer, src, "hit by [P.type] but got deflected by species '[dna.species]'")
P.reflect_back(src) //It has to be here, not on species. Why? Who knows. Testing showed me no reason why it doesn't work on species, and neither did tracing. It has to be here, or it gets qdel'd by bump.
@@ -21,7 +21,7 @@ emp_act
if(1) // proper reflection
reflected = TRUE
if(2) //If target is holding a toy sword
var/static/list/safe_list = list(/obj/item/projectile/beam/lasertag, /obj/item/projectile/beam/practice)
var/static/list/safe_list = list(/obj/projectile/beam/lasertag, /obj/projectile/beam/practice)
reflected = is_type_in_list(P, safe_list) //And it's safe
if(reflected)
@@ -147,7 +147,7 @@ emp_act
log_game("[key_name(user)] set [key_name(src)] on fire with [I]")
/mob/living/carbon/human/check_projectile_dismemberment(obj/item/projectile/P, def_zone)
/mob/living/carbon/human/check_projectile_dismemberment(obj/projectile/P, def_zone)
var/obj/item/organ/external/affecting = get_organ(check_zone(def_zone))
if(affecting && !(affecting.limb_flags & CANNOT_DISMEMBER) && affecting.get_damage() >= (affecting.max_damage - P.dismemberment))
var/damtype = DROPLIMB_SHARP
@@ -826,7 +826,7 @@ emp_act
return FALSE
return TRUE
/mob/living/carbon/human/projectile_hit_check(obj/item/projectile/P)
/mob/living/carbon/human/projectile_hit_check(obj/projectile/P)
return (HAS_TRAIT(src, TRAIT_FLOORED) || HAS_TRAIT(src, TRAIT_NOKNOCKDOWNSLOWDOWN)) && !density && !(P.always_hit_living_nondense && (stat != DEAD) && !isLivingSSD(src)) // hit mobs that are intentionally lying down to prevent combat crawling.
/mob/living/carbon/human/canBeHandcuffed()
@@ -95,7 +95,7 @@
var/last_hit = 0
var/timer_id = TIMER_ID_NULL
/mob/living/carbon/human/dummy/bullet_act(obj/item/projectile/P, def_zone)
/mob/living/carbon/human/dummy/bullet_act(obj/projectile/P, def_zone)
if(!first_hit)
first_hit = world.time
visible_message("Started tracking hit at time [first_hit]!")
@@ -1071,7 +1071,7 @@ It'll return null if the organ doesn't correspond, so include null checks when u
/datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source, method = REAGENT_TOUCH)
M.adjust_bodytemperature(clamp((temperature + M.bodytemperature) * 0.5 - M.bodytemperature, BODYTEMP_COOLING_MAX, BODYTEMP_HEATING_MAX)) // Approximation for gradual heating or cooling.
/datum/species/proc/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H) //return TRUE if hit, FALSE if stopped/reflected/etc
/datum/species/proc/bullet_act(obj/projectile/P, mob/living/carbon/human/H) //return TRUE if hit, FALSE if stopped/reflected/etc
return TRUE
/datum/species/proc/spec_hitby(atom/movable/AM, mob/living/carbon/human/H)
@@ -114,8 +114,8 @@
H.adjustBruteLoss(2)
..()
/datum/species/diona/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H, def_zone)
if(istype(P, /obj/item/projectile/energy/floramut))
/datum/species/diona/bullet_act(obj/projectile/P, mob/living/carbon/human/H, def_zone)
if(istype(P, /obj/projectile/energy/floramut))
P.nodamage = TRUE
H.Weaken(1 SECONDS)
if(prob(80))
@@ -123,7 +123,7 @@
else
randmutg(H)
H.visible_message("[H] writhes for a moment as [H.p_their()] nymphs squirm and mutate.", "All of you squirm uncomfortably for a moment as you feel your genes changing.")
else if(istype(P, /obj/item/projectile/energy/florayield))
else if(istype(P, /obj/projectile/energy/florayield))
P.nodamage = TRUE
var/obj/item/organ/external/organ = H.get_organ(check_zone(def_zone))
if(!organ)
@@ -384,7 +384,7 @@
new /obj/item/stack/ore/glass(get_turf(H))
qdel(H)
/datum/species/golem/sand/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
/datum/species/golem/sand/bullet_act(obj/projectile/P, mob/living/carbon/human/H)
if(!(P.original == H && P.firer == H))
if((P.flag == BULLET || P.flag == BOMB) && P.armor_penetration_percentage < 100)
playsound(H, 'sound/effects/shovel_dig.ogg', 70, 1)
@@ -418,7 +418,7 @@
new /obj/item/shard(get_turf(H))
qdel(H)
/datum/species/golem/glass/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
/datum/species/golem/glass/bullet_act(obj/projectile/P, mob/living/carbon/human/H)
if(!(P.original == H && P.firer == H)) //self-shots don't reflect
if(P.is_reflectable(REFLECTABILITY_ENERGY))
H.visible_message("<span class='danger'>[P] gets reflected by [H]'s glass skin!</span>", \
@@ -485,7 +485,7 @@
if(world.time > last_teleport + teleport_cooldown && user != H)
reactive_teleport(H)
/datum/species/golem/bluespace/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
/datum/species/golem/bluespace/bullet_act(obj/projectile/P, mob/living/carbon/human/H)
if(world.time > last_teleport + teleport_cooldown)
reactive_teleport(H)
return TRUE
@@ -604,7 +604,7 @@
new/obj/item/grown/bananapeel/specialpeel(get_turf(H))
last_banana = world.time
/datum/species/golem/bananium/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
/datum/species/golem/bananium/bullet_act(obj/projectile/P, mob/living/carbon/human/H)
if(world.time > last_banana + banana_cooldown)
new/obj/item/grown/bananapeel/specialpeel(get_turf(H))
last_banana = world.time
+3 -3
View File
@@ -46,7 +46,7 @@
/mob/living/proc/is_eyes_covered(check_glasses = TRUE, check_head = TRUE, check_mask = TRUE)
return FALSE
/mob/living/bullet_act(obj/item/projectile/P, def_zone)
/mob/living/bullet_act(obj/projectile/P, def_zone)
SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone)
//Armor
var/armor = run_armor_check(def_zone, P.flag, armor_penetration_flat = P.armor_penetration_flat, armor_penetration_percentage = P.armor_penetration_percentage)
@@ -57,7 +57,7 @@
return P.on_hit(src, armor, def_zone)
/// Tries to dodge incoming bullets if we aren't disabled for any reasons. Advised to overide with advanced effects, this is as basic example admins can apply.
/mob/living/proc/advanced_bullet_dodge(mob/living/source, obj/item/projectile/hitting_projectile)
/mob/living/proc/advanced_bullet_dodge(mob/living/source, obj/projectile/hitting_projectile)
SIGNAL_HANDLER
if(HAS_TRAIT(source, TRAIT_IMMOBILIZED))
@@ -79,7 +79,7 @@
advanced_bullet_dodge_chance = 0
return ATOM_PREHIT_FAILURE
/mob/living/proc/check_projectile_dismemberment(obj/item/projectile/P, def_zone)
/mob/living/proc/check_projectile_dismemberment(obj/projectile/P, def_zone)
return 0
///As the name suggests, this should be called to apply electric shocks.
+1 -1
View File
@@ -904,7 +904,7 @@ GLOBAL_LIST_INIT(ai_verbs_default, list(
if(target)
open_nearest_door(target)
/mob/living/silicon/ai/bullet_act(obj/item/projectile/Proj)
/mob/living/silicon/ai/bullet_act(obj/projectile/Proj)
..(Proj)
return 2
+1 -1
View File
@@ -393,7 +393,7 @@
. += msg
/mob/living/silicon/pai/bullet_act(obj/item/projectile/Proj)
/mob/living/silicon/pai/bullet_act(obj/projectile/Proj)
..(Proj)
if(stat != 2)
spawn(1)
@@ -929,7 +929,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
return
/mob/living/silicon/robot/bullet_act(obj/item/projectile/Proj)
/mob/living/silicon/robot/bullet_act(obj/projectile/Proj)
..(Proj)
if(prob(75) && Proj.damage > 0) spark_system.start()
return 2
@@ -1212,7 +1212,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
if(emagged)
to_chat(user, "<span class='warning'>The emag sparks, and flashes red. [src] has already been emagged!</span>")
return
if(wiresexposed)
to_chat(user, "<span class='warning'>You must close the wiring panel first!</span>")
return
@@ -1614,7 +1614,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
else
to_chat(src, "<span class='boldwarning'>Your allegiance has not been compromised. Keep serving all Syndicate agents to the best of your abilities.</span>")
to_chat(src, "<span class='boldwarning'>Warning: Remote lockdown and detonation protections have been disabled due to system instability.</span>")
if(module)
module.emag_act(flayer)
module.module_type = "Malf" // For the cool factor.
@@ -1626,7 +1626,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
/mob/living/silicon/robot/proc/remove_robot_mindslave()
clear_zeroth_law()
if(mind)
if(mind)
mind.remove_antag_datum(/datum/antagonist/mindslave/malf_robot)
mind.remove_antag_datum(/datum/antagonist/mindslave/emagged_robot)
mind.remove_antag_datum(/datum/antagonist/mindslave/mindflayer_mindslave_robot)
@@ -1683,7 +1683,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
radio.recalculateChannels()
playsound(get_turf(src), 'sound/mecha/nominalnano.ogg', 75, FALSE)
/mob/living/silicon/robot/deathsquad/bullet_act(obj/item/projectile/P)
/mob/living/silicon/robot/deathsquad/bullet_act(obj/projectile/P)
if(istype(P) && P.is_reflectable(REFLECTABILITY_ENERGY) && P.starting)
visible_message("<span class='danger'>[P] gets reflected by [src]!</span>", "<span class='userdanger'>[P] gets reflected by [src]!</span>")
P.reflect_back(src)
@@ -421,7 +421,7 @@
if(!current_syringes || chambered?.BB)
return
chambered.BB = new /obj/item/projectile/bullet/dart/syringe/heavyduty(src)
chambered.BB = new /obj/projectile/bullet/dart/syringe/heavyduty(src)
chambered.BB.reagents.add_reagent_list(list("toxin" = 2))
chambered.BB.name = "heavy duty syringe"
current_syringes--
@@ -284,7 +284,7 @@
user.visible_message("<span class='alert'>[user] patches some dents on [src] with [I].</span>")
/mob/living/silicon/bullet_act(obj/item/projectile/Proj)
/mob/living/silicon/bullet_act(obj/projectile/Proj)
if(!Proj.nodamage)
var/damage = run_armor(Proj.damage, Proj.damage_type, Proj.flag, 0, Proj.armor_penetration_flat, Proj.armor_penetration_percentage)
switch(Proj.damage_type)
@@ -83,7 +83,7 @@
apply_damage(damage, damagetype, null, getarmor(armor_type = armorcheck))
return TRUE
/mob/living/simple_animal/bullet_act(obj/item/projectile/Proj)
/mob/living/simple_animal/bullet_act(obj/projectile/Proj)
if(!Proj)
return
apply_damage(Proj.damage, Proj.damage_type)
@@ -515,7 +515,7 @@
add_fingerprint(user)
user.visible_message("[user] repairs [src]!","<span class='notice'>You repair [src].</span>")
/mob/living/simple_animal/bot/bullet_act(obj/item/projectile/Proj)
/mob/living/simple_animal/bot/bullet_act(obj/projectile/Proj)
if(Proj && (Proj.damage_type == BRUTE || Proj.damage_type == BURN))
if(prob(75) && Proj.damage > 0)
do_sparks(5, 1, src)
@@ -38,7 +38,7 @@
var/weapons_check = TRUE //If true, arrest people for weapons if they don't have access
var/check_records = TRUE //Does it check security records?
var/no_handcuffs = FALSE //If true, don't handcuff
var/projectile = /obj/item/projectile/beam/disabler //Holder for projectile type
var/projectile = /obj/projectile/beam/disabler //Holder for projectile type
var/shoot_sound = 'sound/weapons/taser.ogg'
var/baton_delayed = FALSE
var/obj/item/melee/baton/infinite_cell/baton = null // stunbaton bot uses to melee attack
@@ -200,15 +200,15 @@
icon_state = "[lasercolor]ed209[on]"
set_weapon()
/mob/living/simple_animal/bot/ed209/bullet_act(obj/item/projectile/Proj)
/mob/living/simple_animal/bot/ed209/bullet_act(obj/projectile/Proj)
if(!disabled)
var/lasertag_check = FALSE
if(lasercolor == "b")
if(istype(Proj, /obj/item/projectile/beam/lasertag/redtag))
if(istype(Proj, /obj/projectile/beam/lasertag/redtag))
lasertag_check = TRUE
else if(lasercolor == "r")
if(istype(Proj, /obj/item/projectile/beam/lasertag/bluetag))
if(istype(Proj, /obj/projectile/beam/lasertag/bluetag))
lasertag_check = TRUE
if(lasertag_check)
@@ -219,7 +219,7 @@
addtimer(CALLBACK(src, PROC_REF(unset_disabled)), 10 SECONDS)
return TRUE
if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
if(istype(Proj ,/obj/projectile/beam)||istype(Proj,/obj/projectile/bullet))
if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))
if(!Proj.nodamage && Proj.damage < src.health)
retaliate(Proj.firer)
@@ -440,16 +440,16 @@
shoot_sound = 'sound/weapons/laser.ogg'
if(emagged)
if(lasercolor)
projectile = /obj/item/projectile/beam/disabler
projectile = /obj/projectile/beam/disabler
else
projectile = /obj/item/projectile/beam
projectile = /obj/projectile/beam
else
if(!lasercolor)
projectile = /obj/item/projectile/beam/disabler
projectile = /obj/projectile/beam/disabler
else if(lasercolor == "b")
projectile = /obj/item/projectile/beam/lasertag/bluetag
projectile = /obj/projectile/beam/lasertag/bluetag
else if(lasercolor == "r")
projectile = /obj/item/projectile/beam/lasertag/redtag
projectile = /obj/projectile/beam/lasertag/redtag
/mob/living/simple_animal/bot/ed209/proc/shootAt(mob/target)
if(lastfired && world.time - lastfired < shot_delay)
@@ -469,7 +469,7 @@
if(!isturf(U))
return
var/obj/item/projectile/A = new projectile(loc)
var/obj/projectile/A = new projectile(loc)
playsound(loc, shoot_sound, 50, 1)
A.current = U
A.yo = U.y - T.y
@@ -69,7 +69,7 @@
var/mob/living/carbon/C = A
sword_attack(C)
/mob/living/simple_animal/bot/secbot/griefsky/bullet_act(obj/item/projectile/P) //so uncivilized
/mob/living/simple_animal/bot/secbot/griefsky/bullet_act(obj/projectile/P) //so uncivilized
retaliate(P.firer)
if((icon_state == spin_icon) && (prob(block_chance_ranged))) //only when the eswords are on
visible_message("[src] deflects [P] with its energy swords!")
@@ -156,8 +156,8 @@
if(HAS_TRAIT(src, TRAIT_CMAGGED))
. += "<span class='warning'>Yellow ooze seems to be seeping from the case...</span>"
/mob/living/simple_animal/bot/honkbot/bullet_act(obj/item/projectile/Proj)
if((istype(Proj,/obj/item/projectile/beam)) || (istype(Proj,/obj/item/projectile/bullet) && (Proj.damage_type == BURN))||(Proj.damage_type == BRUTE) && (!Proj.nodamage && Proj.damage < health && ishuman(Proj.firer)))
/mob/living/simple_animal/bot/honkbot/bullet_act(obj/projectile/Proj)
if((istype(Proj,/obj/projectile/beam)) || (istype(Proj,/obj/projectile/bullet) && (Proj.damage_type == BURN))||(Proj.damage_type == BRUTE) && (!Proj.nodamage && Proj.damage < health && ishuman(Proj.firer)))
retaliate(Proj.firer)
..()
@@ -223,7 +223,7 @@
wires.cut_random()
return
/mob/living/simple_animal/bot/mulebot/bullet_act(obj/item/projectile/Proj)
/mob/living/simple_animal/bot/mulebot/bullet_act(obj/projectile/Proj)
if(..())
if(prob(50) && !isnull(load))
unload(0)
@@ -207,14 +207,14 @@
declare_arrests = FALSE
icon_state = "[base_icon][on]"
/mob/living/simple_animal/bot/secbot/bullet_act(obj/item/projectile/Proj)
if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
/mob/living/simple_animal/bot/secbot/bullet_act(obj/projectile/Proj)
if(istype(Proj ,/obj/projectile/beam)||istype(Proj,/obj/projectile/bullet))
if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))
if(!Proj.nodamage && Proj.damage < src.health)
retaliate(Proj.firer)
..()
/mob/living/simple_animal/bot/secbot/projectile_hit_check(obj/item/projectile/P)
/mob/living/simple_animal/bot/secbot/projectile_hit_check(obj/projectile/P)
return FALSE
@@ -150,7 +150,7 @@
if(lastfired && world.time - lastfired < shot_delay)
return
lastfired = world.time
var/obj/item/projectile/P = new projectile(loc)
var/obj/projectile/P = new projectile(loc)
playsound(loc, shoot_sound, 100, 1)
P.current = loc
P.starting = loc
@@ -176,7 +176,7 @@
qdel(src)
/mob/living/simple_animal/bot/ed209/syndicate/set_weapon()
projectile = /obj/item/projectile/bullet/a40mm
projectile = /obj/projectile/bullet/a40mm
/mob/living/simple_animal/bot/ed209/syndicate/emp_act(severity)
return
@@ -61,7 +61,7 @@
damage_shield()
playsound(src,'sound/hallucinations/veryfar_noise.ogg', 40, 1)
/mob/living/simple_animal/hostile/clockwork_construct/clockwork_marauder/bullet_act(obj/item/projectile/Proj)
/mob/living/simple_animal/hostile/clockwork_construct/clockwork_marauder/bullet_act(obj/projectile/Proj)
if(shield_health > 0)
damage_shield()
to_chat(src, "<span class='danger'>Your shield blocks the attack!</span>")
@@ -138,7 +138,7 @@
AIStatus = AI_ON
environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP
/mob/living/simple_animal/hostile/construct/armoured/bullet_act(obj/item/projectile/P)
/mob/living/simple_animal/hostile/construct/armoured/bullet_act(obj/projectile/P)
if(P.is_reflectable(REFLECTABILITY_ENERGY))
if(P.damage_type == BRUTE || P.damage_type == BURN)
adjustBruteLoss(P.damage * 0.8) // 16 hit with security laser gun
@@ -621,7 +621,7 @@
var/turf/U = get_turf(target)
if(!T || !U)
return
var/obj/item/projectile/beam/A = new /obj/item/projectile/beam(loc)
var/obj/projectile/beam/A = new /obj/projectile/beam(loc)
A.icon = 'icons/effects/genetics.dmi'
A.icon_state = "eyelasers"
playsound(src.loc, 'sound/weapons/taser2.ogg', 75, 1)
@@ -63,7 +63,7 @@
to_chat(src, "<span class='userdanger'>With our egg laid, our death approaches rapidly...</span>")
addtimer(CALLBACK(src, PROC_REF(death)), 25 SECONDS)
/mob/living/simple_animal/hostile/headslug/projectile_hit_check(obj/item/projectile/P)
/mob/living/simple_animal/hostile/headslug/projectile_hit_check(obj/projectile/P)
return (stat || FALSE)
/obj/item/organ/internal/body_egg/changeling_egg
@@ -122,7 +122,7 @@
if(stat == CONSCIOUS && !target && AIStatus != AI_OFF && !client && user)
FindTarget(list(user), 1)
/mob/living/simple_animal/hostile/bullet_act(obj/item/projectile/P)
/mob/living/simple_animal/hostile/bullet_act(obj/projectile/P)
if(stat == CONSCIOUS && !target && AIStatus != AI_OFF && !client)
if(P.firer && get_dist(src, P.firer) <= aggro_vision_range)
FindTarget(list(P.firer), 1)
@@ -397,7 +397,7 @@
playsound(src, projectilesound, 100, 1)
casing.fire(targeted_atom, src, zone_override = ran_zone(), firer_source_atom = src)
else if(projectiletype)
var/obj/item/projectile/P = new projectiletype(startloc)
var/obj/projectile/P = new projectiletype(startloc)
playsound(src, projectilesound, 100, 1)
P.current = startloc
P.starting = startloc
@@ -359,7 +359,7 @@ Difficulty: Hard
addtimer(CALLBACK(src, PROC_REF(body_shield)), BODY_SHIELD_COOLDOWN_TIME)
/mob/living/simple_animal/hostile/megafauna/ancient_robot/bullet_act(obj/item/projectile/P)
/mob/living/simple_animal/hostile/megafauna/ancient_robot/bullet_act(obj/projectile/P)
if(!body_shield_enabled)
return ..()
do_sparks(2, 1, src)
@@ -435,7 +435,7 @@ Difficulty: Hard
var/turf/S = get_turf(src)
if(!S || !T)
return
var/obj/item/projectile/energy/tesla_bolt/O = new /obj/item/projectile/energy/tesla_bolt(S)
var/obj/projectile/energy/tesla_bolt/O = new /obj/projectile/energy/tesla_bolt(S)
O.current = S
O.yo = T.y - S.y
O.xo = T.x - S.x
@@ -488,7 +488,7 @@ Difficulty: Hard
var/turf/T = get_turf(target)
if(!spot || !T)
return
var/obj/item/projectile/bullet/rock/O = new /obj/item/projectile/bullet/rock(spot)
var/obj/projectile/bullet/rock/O = new /obj/projectile/bullet/rock(spot)
O.current = spot
O.yo = T.y - spot.y
O.xo = T.x - spot.x
@@ -662,7 +662,7 @@ Difficulty: Hard
check_friendly_fire = 1
ranged = TRUE
projectilesound = 'sound/weapons/gunshots/gunshot.ogg'
projectiletype = /obj/item/projectile/bullet/ancient_robot_bullet
projectiletype = /obj/projectile/bullet/ancient_robot_bullet
attacktext = "stomps on"
armor_penetration_percentage = 50
melee_damage_lower = 15
@@ -707,7 +707,7 @@ Difficulty: Hard
..()
health_and_snap_check(TRUE)
/mob/living/simple_animal/hostile/ancient_robot_leg/bullet_act(obj/item/projectile/P)
/mob/living/simple_animal/hostile/ancient_robot_leg/bullet_act(obj/projectile/P)
if(core.stat == CONSCIOUS && !core.target && core.AIStatus != AI_OFF && !core.client)
if(P.firer && get_dist(core, P.firer) <= core.aggro_vision_range)
core.FindTarget(list(P.firer), 1)
@@ -809,10 +809,10 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/ancient_robot_leg/electrocute_act(shock_damage, source, siemens_coeff, flags)
return
/obj/item/projectile/bullet/ancient_robot_bullet
/obj/projectile/bullet/ancient_robot_bullet
damage = 8
/obj/item/projectile/bullet/rock
/obj/projectile/bullet/rock
name= "thrown rock"
damage = 25
icon = 'icons/obj/meteor.dmi'
@@ -827,7 +827,7 @@ Difficulty: Hard
/// Leaving here for adminbus / so vetus still uses it.
/obj/item/projectile/energy/tesla_bolt
/obj/projectile/energy/tesla_bolt
name = "shock bolt"
icon_state = "purple_laser"
impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser
@@ -838,16 +838,16 @@ Difficulty: Hard
/obj/item/ammo_casing/energy/tesla_bolt/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
..()
var/obj/item/projectile/energy/tesla_bolt/P = BB
var/obj/projectile/energy/tesla_bolt/P = BB
spawn(1)
P.chain = P.Beam(user, icon_state = "purple_lightning", icon = 'icons/effects/effects.dmi', time = 1000, maxdistance = 30)
/obj/item/projectile/energy/tesla_bolt/on_hit(atom/target)
/obj/projectile/energy/tesla_bolt/on_hit(atom/target)
. = ..()
tesla_zap(src, zap_range, power, zap_flags)
qdel(src)
/obj/item/projectile/energy/tesla_bolt/Bump(atom/A) // Don't want the projectile hitting the legs
/obj/projectile/energy/tesla_bolt/Bump(atom/A) // Don't want the projectile hitting the legs
if(!istype(/mob/living/simple_animal/hostile/ancient_robot_leg, A))
return ..()
var/turf/target_turf = get_turf(A)
@@ -32,7 +32,7 @@ Difficulty: Medium
light_color = "#E4C7C5"
speak_emote = list("roars")
speed = 3
projectiletype = /obj/item/projectile/kinetic/miner
projectiletype = /obj/projectile/kinetic/miner
projectilesound = 'sound/weapons/kenetic_accel.ogg'
ranged = TRUE
ranged_cooldown_time = 16
@@ -120,13 +120,13 @@ Difficulty: Medium
..()
target.remove_stun_absorption("miner")
/obj/item/projectile/kinetic/miner
/obj/projectile/kinetic/miner
damage = 20
speed = 0.9
icon_state = "ka_tracer"
range = MINER_DASH_RANGE
/obj/item/projectile/kinetic/miner/enraged
/obj/projectile/kinetic/miner/enraged
damage = 35
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/adjustHealth(amount, updating_health = TRUE)
@@ -201,7 +201,7 @@ Difficulty: Medium
miner_saw = new /obj/item/melee/energy/cleaving_saw(src) //Real saw for real men.
dash_cooldown_to_use = 0.5 SECONDS //Becomes a teleporting shit.
ranged_cooldown_time = 5 //They got some cooldown mods.
projectiletype = /obj/item/projectile/kinetic/miner/enraged
projectiletype = /obj/projectile/kinetic/miner/enraged
maxHealth = 1800
health = 1800 //Bit more of a challenge.
@@ -513,7 +513,7 @@ Difficulty: Hard
if(.)
recovery_time = world.time + 20 // can only attack melee once every 2 seconds but rapid_melee gives higher priority
/mob/living/simple_animal/hostile/megafauna/bubblegum/bullet_act(obj/item/projectile/P)
/mob/living/simple_animal/hostile/megafauna/bubblegum/bullet_act(obj/projectile/P)
if(BUBBLEGUM_IS_ENRAGED)
visible_message("<span class='danger'>[src] deflects the projectile; [p_they()] can't be hit with ranged weapons while enraged!</span>", "<span class='userdanger'>You deflect the projectile!</span>")
playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 300, TRUE)
@@ -654,7 +654,7 @@ Difficulty: Hard
second_life = TRUE
enraged = TRUE
rapid_melee = 12
projectiletype = /obj/item/projectile/magic/arcane_barrage/blood
projectiletype = /obj/projectile/magic/arcane_barrage/blood
projectilesound = 'sound/effects/splat.ogg'
deathmessage = null
death_sound = 'sound/hallucinations/veryfar_noise.ogg'
@@ -222,7 +222,7 @@ Difficulty: Very Hard
if(!startloc || !endloc || endloc == loc)
return
var/obj/item/projectile/P = new /obj/item/projectile/colossus(startloc)
var/obj/projectile/P = new /obj/projectile/colossus(startloc)
P.preparePixelProjectile(endloc, startloc)
P.firer = src
P.firer_source_atom = src
@@ -334,7 +334,7 @@ Difficulty: Very Hard
target = new_target
INVOKE_ASYNC(src, TYPE_PROC_REF(/atom/movable, orbit), target, 0, FALSE, 0, 0, FALSE, TRUE)
/mob/living/simple_animal/hostile/megafauna/colossus/bullet_act(obj/item/projectile/P)
/mob/living/simple_animal/hostile/megafauna/colossus/bullet_act(obj/projectile/P)
if(stat == CONSCIOUS)
var/obj/effect/temp_visual/at_shield/AT = new /obj/effect/temp_visual/at_shield(loc, src)
var/random_x = rand(-32, 32)
@@ -356,14 +356,14 @@ Difficulty: Very Hard
for(var/I in 1 to 2)
loot += pick_n_take(choices)
/obj/item/projectile/colossus
/obj/projectile/colossus
name = "death bolt"
icon_state = "chronobolt"
damage = 25
armor_penetration_percentage = 100
speed = 2
/obj/item/projectile/colossus/on_hit(atom/target, blocked = 0)
/obj/projectile/colossus/on_hit(atom/target, blocked = 0)
. = ..()
if(isturf(target) || isobj(target))
target.ex_act(EXPLODE_HEAVY)
@@ -549,7 +549,7 @@ Difficulty: Hard
burst_range = initial(burst_range) + round(anger_modifier * 0.08)
beam_range = initial(beam_range) + round(anger_modifier * 0.12)
/mob/living/simple_animal/hostile/megafauna/hierophant/bullet_act(obj/item/projectile/P)
/mob/living/simple_animal/hostile/megafauna/hierophant/bullet_act(obj/projectile/P)
if(stat == CONSCIOUS && !target && AIStatus != AI_OFF && !client)
if(P.firer && get_dist(src, P.firer) <= aggro_vision_range)
FindTarget(list(P.firer), 1)
@@ -608,7 +608,7 @@ Difficulty: Hard
if(mover == caster.pulledby)
return TRUE
if(isprojectile(mover))
var/obj/item/projectile/P = mover
var/obj/projectile/P = mover
if(P.firer == caster)
return TRUE
if(mover == caster)
@@ -19,7 +19,7 @@
environment_smash = ENVIRONMENT_SMASH_STRUCTURES
attacktext = "drills into"
attack_sound = 'sound/weapons/circsawhit.ogg'
projectiletype = /obj/item/projectile/kinetic
projectiletype = /obj/projectile/kinetic
projectilesound = 'sound/weapons/kenetic_accel.ogg'
speak_emote = list("states")
throw_message = "does not go through the armor of"
@@ -70,9 +70,9 @@
. += "<span class='notice'><b>[rand(-30, 110)]%</b> mod capacity remaining.\nThere is a module installed, using <b>[rand(-5, 35)]%</b> capacity.\n...or at least you think so.</span>"
/mob/living/simple_animal/hostile/asteroid/abandoned_minebot/CanPass(atom/movable/O)
if(!istype(O, /obj/item/projectile/kinetic))
if(!istype(O, /obj/projectile/kinetic))
return ..()
var/obj/item/projectile/kinetic/K = O
var/obj/projectile/kinetic/K = O
if(K.kinetic_gun)
for(var/A in K.kinetic_gun.get_modkits())
var/obj/item/borg/upgrade/modkit/M = A
@@ -128,7 +128,7 @@
/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/shoot_projectile(turf/marker, set_angle, is_teleshot, is_trishot)
var/turf/startloc = get_turf(src)
if(!is_teleshot)
var/obj/item/projectile/H = new /obj/item/projectile/herald(startloc)
var/obj/projectile/H = new /obj/projectile/herald(startloc)
H.preparePixelProjectile(marker, startloc)
H.firer = src
H.firer_source_atom = src
@@ -139,7 +139,7 @@
shoot_projectile(marker, set_angle + 15, FALSE, FALSE)
shoot_projectile(marker, set_angle - 15, FALSE, FALSE)
else
var/obj/item/projectile/H = new /obj/item/projectile/herald/teleshot(startloc)
var/obj/projectile/H = new /obj/projectile/herald/teleshot(startloc)
H.preparePixelProjectile(marker, startloc)
H.firer = src
H.firer_source_atom = src
@@ -222,19 +222,19 @@
my_master = null
. = ..()
/obj/item/projectile/herald
/obj/projectile/herald
name = "death bolt"
icon_state = "chronobolt"
damage = 15
armor_penetration_percentage = 50
speed = 2
/obj/item/projectile/herald/teleshot
/obj/projectile/herald/teleshot
name = "golden bolt"
damage = 0
color = rgb(255,255,102)
/obj/item/projectile/herald/prehit(atom/target)
/obj/projectile/herald/prehit(atom/target)
if(ismob(target) && ismob(firer))
var/mob/living/mob_target = target
if(mob_target.faction_check_mob(firer))
@@ -244,13 +244,13 @@
if(mob_target.buckled && mob_target.stat == DEAD)
mob_target.dust() //no body cheese
/obj/item/projectile/herald/on_hit(atom/target, blocked = FALSE)
/obj/projectile/herald/on_hit(atom/target, blocked = FALSE)
. = ..()
if(ismineralturf(target))
var/turf/simulated/mineral/M = target
M.gets_drilled()
/obj/item/projectile/herald/teleshot/on_hit(atom/target, blocked = FALSE)
/obj/projectile/herald/teleshot/on_hit(atom/target, blocked = FALSE)
. = ..()
if(!istype(target, /mob/living/simple_animal/hostile/asteroid/elite/herald))
firer.forceMove(get_turf(src))
@@ -32,7 +32,7 @@
return
icon_state = icon_living
/mob/living/simple_animal/hostile/asteroid/bullet_act(obj/item/projectile/P)//Reduces damage from most projectiles to curb off-screen kills
/mob/living/simple_animal/hostile/asteroid/bullet_act(obj/projectile/P)//Reduces damage from most projectiles to curb off-screen kills
if(stat == CONSCIOUS)
Aggro()
if(P.damage < 30 && P.damage_type != BRUTE && has_laser_resist)
@@ -511,7 +511,7 @@
return ..()
/mob/living/simple_animal/hostile/syndicate/bullet_act(obj/item/projectile/Proj)
/mob/living/simple_animal/hostile/syndicate/bullet_act(obj/projectile/Proj)
if(!Proj)
return
if(((melee_type == MELEE_WEAPON_DSWORD || syndie_flags & ESHIELD) || (melee_type == MELEE_WEAPON_ESWORD && prob(reflect_chance))) && Proj.is_reflectable(REFLECTABILITY_ENERGY))
@@ -172,7 +172,7 @@
/obj/structure/spider/terrorweb/CanPass(atom/movable/mover, border_dir)
if(isterrorspider(mover))
return TRUE
if(istype(mover, /obj/item/projectile/terrorqueenspit))
if(istype(mover, /obj/projectile/terrorqueenspit))
return TRUE
if(isliving(mover))
var/mob/living/M = mover
@@ -202,7 +202,7 @@
if(!QDELETED(C) && C.loc == loc)
qdel(src)
/obj/structure/spider/terrorweb/bullet_act(obj/item/projectile/Proj)
/obj/structure/spider/terrorweb/bullet_act(obj/projectile/Proj)
if(Proj.damage_type != BRUTE && Proj.damage_type != BURN)
visible_message("<span class='danger'>[src] is undamaged by [Proj]!</span>")
// Webs don't care about disablers, tasers, etc. Or toxin damage. They're organic, but not alive.
@@ -22,7 +22,7 @@
ai_playercontrol_allowtype = 0
canlay = 1000
spider_tier = TS_TIER_5
projectiletype = /obj/item/projectile/terrorqueenspit/empress
projectiletype = /obj/projectile/terrorqueenspit/empress
icon = 'icons/mob/terrorspider64.dmi'
pixel_x = -16
mob_size = MOB_SIZE_LARGE
@@ -107,6 +107,6 @@
qdel(T)
to_chat(src, "<span class='userdanger'>All Terror Spiders, except yourself, will die off shortly.</span>")
/obj/item/projectile/terrorqueenspit/empress
/obj/projectile/terrorqueenspit/empress
damage = 90
@@ -33,7 +33,7 @@
retreat_distance = 5
minimum_distance = 5
projectilesound = 'sound/weapons/pierce.ogg'
projectiletype = /obj/item/projectile/terrorqueenspit
projectiletype = /obj/projectile/terrorqueenspit
spider_tier = TS_TIER_4
loudspeaker = TRUE
spider_opens_doors = 2
@@ -352,7 +352,7 @@
if(is_station_level((get_turf(src)).z) && stat != DEAD)
return list(ASSIGNMENT_SECURITY = 3, ASSIGNMENT_CREW = 30, ASSIGNMENT_MEDICAL = 2)
/obj/item/projectile/terrorqueenspit
/obj/projectile/terrorqueenspit
name = "acid spit"
damage = 40
icon_state = "toxin"
@@ -49,7 +49,7 @@
ranged = TRUE
retreat_distance = 5
minimum_distance = 5
projectiletype = /obj/item/projectile/snowball
projectiletype = /obj/projectile/snowball
/mob/living/simple_animal/hostile/winter/reindeer
name = "reindeer"
@@ -104,7 +104,7 @@
maxHealth = 200 //DID YOU REALLY BELIEVE IT WOULD BE THIS EASY!??!!
health = 200
ranged = TRUE
projectiletype = /obj/item/projectile/ornament
projectiletype = /obj/projectile/ornament
retreat_distance = 5
minimum_distance = 5
@@ -118,7 +118,7 @@
ranged = TRUE
rapid = 3
speed = 0 //he's lost some weight from the fighting
projectiletype = /obj/item/projectile/ornament
projectiletype = /obj/projectile/ornament
retreat_distance = 3
minimum_distance = 3
@@ -192,7 +192,7 @@
drop_held_item(FALSE)
//Bullets
/mob/living/simple_animal/parrot/bullet_act(obj/item/projectile/P)
/mob/living/simple_animal/parrot/bullet_act(obj/projectile/P)
..()
if(stat == CONSCIOUS && !client)
if(parrot_state == PARROT_PERCH)
@@ -263,7 +263,7 @@
amount = -abs(amount)
return ..() //Heals them
/mob/living/simple_animal/slime/bullet_act(obj/item/projectile/Proj)
/mob/living/simple_animal/slime/bullet_act(obj/projectile/Proj)
if(!Proj)
return
attacked += 10
+1 -1
View File
@@ -20,7 +20,7 @@
return TRUE
return (!mover.density || !density || horizontal)
/mob/proc/projectile_hit_check(obj/item/projectile/P)
/mob/proc/projectile_hit_check(obj/projectile/P)
return !(P.always_hit_living_nondense && (stat != DEAD) && !isLivingSSD(src)) && !density
/client/verb/toggle_throw_mode()