Kills obj/item/projectile in favour of obj/projectile (#46692)

* Kills obj/item/projectile in favour of obj/projectile

* Resolves conflicts properly

* fixes that one map

* it lives
This commit is contained in:
nemvar
2019-10-06 13:37:24 -04:00
committed by moo
parent 85d16cf11a
commit a148cae769
204 changed files with 1014 additions and 1013 deletions
@@ -228,7 +228,7 @@ Doesn't work on other aliens/AI.*/
return FALSE
user.visible_message("<span class='danger'>[user] spits neurotoxin!", "<span class='alertalien'>You spit neurotoxin.</span>")
var/obj/item/projectile/bullet/neurotoxin/A = new /obj/item/projectile/bullet/neurotoxin(user.loc)
var/obj/projectile/bullet/neurotoxin/A = new /obj/projectile/bullet/neurotoxin(user.loc)
A.preparePixelProjectile(target, user, params)
A.fire()
user.newtonian_move(get_dir(U, T))
@@ -37,7 +37,7 @@
if(check_mask &&(wear_mask?.flags_cover & PEPPERPROOF))
return wear_mask
/mob/living/carbon/check_projectile_dismemberment(obj/item/projectile/P, def_zone)
/mob/living/carbon/check_projectile_dismemberment(obj/projectile/P, def_zone)
var/obj/item/bodypart/affecting = get_bodypart(def_zone)
if(affecting && affecting.dismemberable && affecting.get_damage() >= (affecting.max_damage - P.dismemberment))
affecting.dismember(P.damtype)
@@ -35,12 +35,12 @@
protection += physiology.armor.getRating(d_type)
return protection
/mob/living/carbon/human/on_hit(obj/item/projectile/P)
/mob/living/carbon/human/on_hit(obj/projectile/P)
if(dna && dna.species)
dna.species.on_hit(P, src)
/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 && dna.species)
var/spec_return = dna.species.bullet_act(P, src)
if(spec_return)
@@ -1606,15 +1606,15 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_amount)
return 1
/datum/species/proc/on_hit(obj/item/projectile/P, mob/living/carbon/human/H)
/datum/species/proc/on_hit(obj/projectile/P, mob/living/carbon/human/H)
// called when hit by a projectile
switch(P.type)
if(/obj/item/projectile/energy/floramut) // overwritten by plants/pods
if(/obj/projectile/energy/floramut) // overwritten by plants/pods
H.show_message("<span class='notice'>The radiation beam dissipates harmlessly through your body.</span>")
if(/obj/item/projectile/energy/florayield)
if(/obj/projectile/energy/florayield)
H.show_message("<span class='notice'>The radiation beam dissipates harmlessly through your body.</span>")
/datum/species/proc/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
/datum/species/proc/bullet_act(obj/projectile/P, mob/living/carbon/human/H)
// called before a projectile hit
return 0
@@ -354,7 +354,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")
playsound(H, 'sound/effects/shovel_dig.ogg', 70, TRUE)
@@ -386,7 +386,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.flag == "laser" || P.flag == "energy")
H.visible_message("<span class='danger'>The [P.name] gets reflected by [H]'s glass skin!</span>", \
@@ -443,7 +443,7 @@
if(world.time > last_teleport + teleport_cooldown && user != H)
reactive_teleport(H)
/datum/species/golem/bluespace/on_hit(obj/item/projectile/P, mob/living/carbon/human/H)
/datum/species/golem/bluespace/on_hit(obj/projectile/P, mob/living/carbon/human/H)
..()
if(world.time > last_teleport + teleport_cooldown)
reactive_teleport(H)
@@ -542,7 +542,7 @@
new/obj/item/grown/bananapeel/specialpeel(get_turf(H))
last_banana = world.time
/datum/species/golem/bananium/on_hit(obj/item/projectile/P, mob/living/carbon/human/H)
/datum/species/golem/bananium/on_hit(obj/projectile/P, mob/living/carbon/human/H)
..()
if(world.time > last_banana + banana_cooldown)
new/obj/item/grown/bananapeel/specialpeel(get_turf(H))
@@ -826,7 +826,7 @@
var/last_gong_time = 0
var/gong_cooldown = 150
/datum/species/golem/bronze/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
/datum/species/golem/bronze/bullet_act(obj/projectile/P, mob/living/carbon/human/H)
if(!(world.time > last_gong_time + gong_cooldown))
return ..()
if(P.flag == "bullet" || P.flag == "bomb")
@@ -848,7 +848,7 @@
if(world.time > last_gong_time + gong_cooldown)
gong(H)
/datum/species/golem/bronze/on_hit(obj/item/projectile/P, mob/living/carbon/human/H)
/datum/species/golem/bronze/on_hit(obj/projectile/P, mob/living/carbon/human/H)
..()
if(world.time > last_gong_time + gong_cooldown)
gong(H)
@@ -40,9 +40,9 @@
H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM)
return 1
/datum/species/pod/on_hit(obj/item/projectile/P, mob/living/carbon/human/H)
/datum/species/pod/on_hit(obj/projectile/P, mob/living/carbon/human/H)
switch(P.type)
if(/obj/item/projectile/energy/floramut)
if(/obj/projectile/energy/floramut)
if(prob(15))
H.rad_act(rand(30,80))
H.Paralyze(100)
@@ -56,5 +56,5 @@
else
H.adjustFireLoss(rand(5,15))
H.show_message("<span class='userdanger'>The radiation beam singes you!</span>")
if(/obj/item/projectile/energy/florayield)
if(/obj/projectile/energy/florayield)
H.set_nutrition(min(H.nutrition+30, NUTRITION_LEVEL_FULL))
@@ -50,7 +50,7 @@
C.fully_replace_character_name("[pick(GLOB.nightmare_names)]")
/datum/species/shadow/nightmare/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
/datum/species/shadow/nightmare/bullet_act(obj/projectile/P, mob/living/carbon/human/H)
var/turf/T = H.loc
if(istype(T))
var/light_amount = T.get_lumcount()
@@ -393,8 +393,8 @@
if((W.force) && (!target) && (W.damtype != STAMINA) )
retaliate(user)
/mob/living/carbon/monkey/bullet_act(obj/item/projectile/Proj)
if(istype(Proj , /obj/item/projectile/beam)||istype(Proj, /obj/item/projectile/bullet))
/mob/living/carbon/monkey/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 && isliving(Proj.firer))
retaliate(Proj.firer)
+3 -3
View File
@@ -40,10 +40,10 @@
return FALSE
/mob/living/proc/is_pepper_proof(check_head = TRUE, check_mask = TRUE)
return FALSE
/mob/living/proc/on_hit(obj/item/projectile/P)
/mob/living/proc/on_hit(obj/projectile/P)
return BULLET_ACT_HIT
/mob/living/bullet_act(obj/item/projectile/P, def_zone)
/mob/living/bullet_act(obj/projectile/P, def_zone)
var/armor = run_armor_check(def_zone, P.flag, "","",P.armour_penetration)
var/on_hit_state = P.on_hit(src, armor)
if(!P.nodamage && on_hit_state != BULLET_ACT_BLOCK)
@@ -53,7 +53,7 @@
check_projectile_dismemberment(P, def_zone)
return on_hit_state ? BULLET_ACT_HIT : BULLET_ACT_BLOCK
/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
/obj/item/proc/get_volume_by_throwforce_and_or_w_class()
+2 -2
View File
@@ -5,8 +5,8 @@
/mob/living/CanPass(atom/movable/mover, turf/target)
if((mover.pass_flags & PASSMOB))
return TRUE
if(istype(mover, /obj/item/projectile))
var/obj/item/projectile/P = mover
if(istype(mover, /obj/projectile))
var/obj/projectile/P = mover
return !P.can_hit_target(src, P.permutated, src == P.original, TRUE)
if(mover.throwing)
return (!density || !(mobility_flags & MOBILITY_STAND) || (mover.throwing.thrower == src && !ismob(mover)))
@@ -47,7 +47,7 @@
/mob/living/silicon/ai/bullet_act(obj/item/projectile/Proj)
/mob/living/silicon/ai/bullet_act(obj/projectile/Proj)
. = ..(Proj)
updatehealth()
@@ -58,7 +58,7 @@
visible_message("<span class='danger'>[user] stomps on [src]!.</span>")
take_holo_damage(2)
/mob/living/silicon/pai/bullet_act(obj/item/projectile/Proj)
/mob/living/silicon/pai/bullet_act(obj/projectile/Proj)
if(Proj.stun)
fold_in(force = TRUE)
src.visible_message("<span class='warning'>The electrically-charged projectile disrupts [src]'s holomatrix, forcing [src] to fold in!</span>")
@@ -181,7 +181,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real
if (stat != DEAD)
adjustBruteLoss(30)
/mob/living/silicon/robot/bullet_act(var/obj/item/projectile/Proj, def_zone)
/mob/living/silicon/robot/bullet_act(obj/projectile/Proj, def_zone)
. = ..()
updatehealth()
if(prob(75) && Proj.damage > 0)
@@ -117,7 +117,7 @@
M.visible_message("<span class='boldwarning'>[M] is thrown off of [src]!</span>")
flash_act(affect_silicon = 1)
/mob/living/silicon/bullet_act(obj/item/projectile/Proj, def_zone)
/mob/living/silicon/bullet_act(obj/projectile/Proj, def_zone)
SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, Proj, def_zone)
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
adjustBruteLoss(Proj.damage)
@@ -109,7 +109,7 @@
apply_damage(damage, damagetype, null, getarmor(null, armorcheck))
return TRUE
/mob/living/simple_animal/bullet_act(obj/item/projectile/Proj)
/mob/living/simple_animal/bullet_act(obj/projectile/Proj)
apply_damage(Proj.damage, Proj.damage_type)
Proj.on_hit(src)
return BULLET_ACT_HIT
@@ -19,7 +19,7 @@
baton_type = /obj/item/toy/sword
weapon_force = 0
/mob/living/simple_animal/bot/secbot/grievous/bullet_act(obj/item/projectile/P)
/mob/living/simple_animal/bot/secbot/grievous/bullet_act(obj/projectile/P)
visible_message("<span class='warning'>[src] deflects [P] with its energy swords!</span>")
playsound(src, 'sound/weapons/blade1.ogg', 50, TRUE)
return BULLET_ACT_BLOCK
@@ -312,7 +312,7 @@
do_sparks(5, TRUE, src)
..()
/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, TRUE, src)
@@ -1,124 +1,124 @@
/mob/living/simple_animal/bot/secbot/ed209
name = "\improper ED-209 Security Robot"
desc = "A security robot. He looks less than thrilled."
icon_state = "ed209"
density = TRUE
health = 100
maxHealth = 100
obj_damage = 60
environment_smash = ENVIRONMENT_SMASH_WALLS //Walls can't stop THE LAW
mob_size = MOB_SIZE_LARGE
model = "ED-209"
window_id = "autoed209"
window_name = "Automatic Security Unit v2.6"
ranged = TRUE
var/lastfired = 0
var/shot_delay = 15
var/shoot_sound = 'sound/weapons/laser.ogg'
var/projectile = /obj/item/projectile/beam/disabler
var/fair_market_projectile = /obj/item/projectile/bullet/c38 // For shooting the worst scumbags of all: the poor
do_footstep = TRUE
/mob/living/simple_animal/bot/secbot/ed209/Initialize(mapload)
. = ..()
set_weapon() //giving it the right projectile and firing sound.
/mob/living/simple_animal/bot/secbot/ed209/bot_reset()
..()
set_weapon()
/mob/living/simple_animal/bot/secbot/ed209/set_custom_texts()
text_hack = "You disable [name]'s combat inhibitor."
text_dehack = "You restore [name]'s combat inhibitor."
text_dehack_fail = "[name] ignores your attempts to restrict him!"
/mob/living/simple_animal/bot/secbot/ed209/emag_act(mob/user)
..()
icon_state = "ed209[on]"
set_weapon()
/mob/living/simple_animal/bot/secbot/ed209/handle_automated_action()
var/judgement_criteria = judgement_criteria()
var/list/targets = list()
for(var/mob/living/carbon/C in view(7,src)) //Let's find us a target
var/threatlevel = 0
if(C.incapacitated())
continue
threatlevel = C.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons))
//speak(C.real_name + text(": threat: []", threatlevel))
if(threatlevel < 4 )
continue
var/dst = get_dist(src, C)
if(dst <= 1 || dst > 7)
continue
targets += C
if(targets.len>0)
var/mob/living/carbon/t = pick(targets)
if(t.stat != DEAD && !t.handcuffed) //we don't shoot people who are dead, cuffed or lying down.
shootAt(t)
..()
/mob/living/simple_animal/bot/secbot/ed209/proc/set_weapon() //used to update the projectile type and firing sound
shoot_sound = 'sound/weapons/laser.ogg'
if(emagged == 2)
projectile = /obj/item/projectile/beam
else
projectile = /obj/item/projectile/beam/disabler
/mob/living/simple_animal/bot/secbot/ed209/proc/shootAt(mob/target)
if(world.time <= lastfired + shot_delay)
return
lastfired = world.time
var/turf/T = loc
var/turf/U = get_turf(target)
if(!U)
return
if(!isturf(T))
return
if(!projectile)
return
var/obj/item/projectile/A = new projectile (loc)
playsound(src, shoot_sound, 50, TRUE)
A.preparePixelProjectile(target, src)
A.fire()
/mob/living/simple_animal/bot/secbot/ed209/emp_act(severity)
if(severity == 2 && prob(70))
severity = 1
. = ..()
if(. & EMP_PROTECT_SELF)
return
if (severity >= 2)
new /obj/effect/temp_visual/emp(loc)
var/list/mob/living/carbon/targets = new
for(var/mob/living/carbon/C in view(12,src))
if(C.stat==DEAD)
continue
targets += C
if(targets.len)
if(prob(50))
var/mob/toshoot = pick(targets)
if(toshoot)
targets-=toshoot
if(prob(50) && emagged < 2)
emagged = 2
set_weapon()
shootAt(toshoot)
emagged = FALSE
set_weapon()
else
shootAt(toshoot)
else if(prob(50))
if(targets.len)
var/mob/toarrest = pick(targets)
if(toarrest)
target = toarrest
mode = BOT_HUNT
/mob/living/simple_animal/bot/secbot/ed209/RangedAttack(atom/A)
if(!on)
return
shootAt(A)
/mob/living/simple_animal/bot/secbot/ed209
name = "\improper ED-209 Security Robot"
desc = "A security robot. He looks less than thrilled."
icon_state = "ed209"
density = TRUE
health = 100
maxHealth = 100
obj_damage = 60
environment_smash = ENVIRONMENT_SMASH_WALLS //Walls can't stop THE LAW
mob_size = MOB_SIZE_LARGE
model = "ED-209"
window_id = "autoed209"
window_name = "Automatic Security Unit v2.6"
ranged = TRUE
var/lastfired = 0
var/shot_delay = 15
var/shoot_sound = 'sound/weapons/laser.ogg'
var/projectile = /obj/projectile/beam/disabler
var/fair_market_projectile = /obj/projectile/bullet/c38 // For shooting the worst scumbags of all: the poor
do_footstep = TRUE
/mob/living/simple_animal/bot/secbot/ed209/Initialize(mapload)
. = ..()
set_weapon() //giving it the right projectile and firing sound.
/mob/living/simple_animal/bot/secbot/ed209/bot_reset()
..()
set_weapon()
/mob/living/simple_animal/bot/secbot/ed209/set_custom_texts()
text_hack = "You disable [name]'s combat inhibitor."
text_dehack = "You restore [name]'s combat inhibitor."
text_dehack_fail = "[name] ignores your attempts to restrict him!"
/mob/living/simple_animal/bot/secbot/ed209/emag_act(mob/user)
..()
icon_state = "ed209[on]"
set_weapon()
/mob/living/simple_animal/bot/secbot/ed209/handle_automated_action()
var/judgement_criteria = judgement_criteria()
var/list/targets = list()
for(var/mob/living/carbon/C in view(7,src)) //Let's find us a target
var/threatlevel = 0
if(C.incapacitated())
continue
threatlevel = C.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons))
//speak(C.real_name + text(": threat: []", threatlevel))
if(threatlevel < 4 )
continue
var/dst = get_dist(src, C)
if(dst <= 1 || dst > 7)
continue
targets += C
if(targets.len>0)
var/mob/living/carbon/t = pick(targets)
if(t.stat != DEAD && !t.handcuffed) //we don't shoot people who are dead, cuffed or lying down.
shootAt(t)
..()
/mob/living/simple_animal/bot/secbot/ed209/proc/set_weapon() //used to update the projectile type and firing sound
shoot_sound = 'sound/weapons/laser.ogg'
if(emagged == 2)
projectile = /obj/projectile/beam
else
projectile = /obj/projectile/beam/disabler
/mob/living/simple_animal/bot/secbot/ed209/proc/shootAt(mob/target)
if(world.time <= lastfired + shot_delay)
return
lastfired = world.time
var/turf/T = loc
var/turf/U = get_turf(target)
if(!U)
return
if(!isturf(T))
return
if(!projectile)
return
var/obj/projectile/A = new projectile (loc)
playsound(src, shoot_sound, 50, TRUE)
A.preparePixelProjectile(target, src)
A.fire()
/mob/living/simple_animal/bot/secbot/ed209/emp_act(severity)
if(severity == 2 && prob(70))
severity = 1
. = ..()
if(. & EMP_PROTECT_SELF)
return
if (severity >= 2)
new /obj/effect/temp_visual/emp(loc)
var/list/mob/living/carbon/targets = new
for(var/mob/living/carbon/C in view(12,src))
if(C.stat==DEAD)
continue
targets += C
if(targets.len)
if(prob(50))
var/mob/toshoot = pick(targets)
if(toshoot)
targets-=toshoot
if(prob(50) && emagged < 2)
emagged = 2
set_weapon()
shootAt(toshoot)
emagged = FALSE
set_weapon()
else
shootAt(toshoot)
else if(prob(50))
if(targets.len)
var/mob/toarrest = pick(targets)
if(toarrest)
target = toarrest
mode = BOT_HUNT
/mob/living/simple_animal/bot/secbot/ed209/RangedAttack(atom/A)
if(!on)
return
shootAt(A)
@@ -135,8 +135,8 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
playsound(src, 'sound/machines/honkbot_evil_laugh.ogg', 75, TRUE, -1) // evil laughter
update_icon()
/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)
return ..()
@@ -152,7 +152,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))
@@ -222,8 +222,8 @@ Auto Patrol: []"},
declare_arrests = FALSE
update_icon()
/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 && ishuman(Proj.firer))
retaliate(Proj.firer)
@@ -144,8 +144,8 @@
AIStatus = AI_ON
environment_smash = ENVIRONMENT_SMASH_STRUCTURES //only token destruction, don't smash the cult wall NO STOP
/mob/living/simple_animal/hostile/construct/armored/bullet_act(obj/item/projectile/P)
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
/mob/living/simple_animal/hostile/construct/armored/bullet_act(obj/projectile/P)
if(istype(P, /obj/projectile/energy) || istype(P, /obj/projectile/beam))
var/reflectchance = 40 - round(P.damage/3)
if(prob(reflectchance))
apply_damage(P.damage * 0.5, P.damage_type)
@@ -1,5 +1,5 @@
//Ranged
/obj/item/projectile/guardian
/obj/projectile/guardian
name = "crystal spray"
icon_state = "guardian"
damage = 5
@@ -12,7 +12,7 @@
melee_damage_lower = 10
melee_damage_upper = 10
damage_coeff = list(BRUTE = 0.9, BURN = 0.9, TOX = 0.9, CLONE = 0.9, STAMINA = 0, OXY = 0.9)
projectiletype = /obj/item/projectile/guardian
projectiletype = /obj/projectile/guardian
ranged_cooldown_time = 1 //fast!
projectilesound = 'sound/effects/hit_on_shattered_glass.ogg'
ranged = 1
@@ -54,8 +54,8 @@
/mob/living/simple_animal/hostile/guardian/ranged/Shoot(atom/targeted_atom)
. = ..()
if(istype(., /obj/item/projectile))
var/obj/item/projectile/P = .
if(istype(., /obj/projectile))
var/obj/projectile/P = .
if(namedatum)
P.color = namedatum.colour
@@ -69,7 +69,7 @@
ranged = 1
retreat_distance = 5
minimum_distance = 5
projectiletype = /obj/item/projectile/neurotox
projectiletype = /obj/projectile/neurotox
projectilesound = 'sound/weapons/pierce.ogg'
@@ -88,7 +88,7 @@
move_to_delay = 4
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno = 4,
/obj/item/stack/sheet/animalhide/xeno = 1)
projectiletype = /obj/item/projectile/neurotox
projectiletype = /obj/projectile/neurotox
projectilesound = 'sound/weapons/pierce.ogg'
status_flags = 0
unique_name = 0
@@ -141,7 +141,7 @@
mob_size = MOB_SIZE_LARGE
gold_core_spawnable = NO_SPAWN
/obj/item/projectile/neurotox
/obj/projectile/neurotox
name = "neurotoxin"
damage = 30
icon_state = "toxin"
@@ -18,7 +18,7 @@
health = 1000
maxHealth = 1000
loot = list(/obj/effect/temp_visual/paperwiz_dying)
projectiletype = /obj/item/projectile/temp
projectiletype = /obj/projectile/temp
projectilesound = 'sound/weapons/emitter.ogg'
attack_sound = 'sound/hallucinations/growl1.ogg'
var/list/copies = list()
@@ -5,7 +5,7 @@
icon_state = "dark_wizard"
icon_living = "dark_wizard"
move_to_delay = 10
projectiletype = /obj/item/projectile/temp/earth_bolt
projectiletype = /obj/projectile/temp/earth_bolt
projectilesound = 'sound/magic/ethereal_enter.ogg'
ranged = TRUE
ranged_message = "earth bolts"
@@ -28,11 +28,11 @@
weather_immunities = list("lava","ash")
minbodytemp = 0
maxbodytemp = INFINITY
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)
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)
loot = list(/obj/effect/decal/remains/human)
del_on_death = TRUE
/obj/item/projectile/temp/earth_bolt
/obj/projectile/temp/earth_bolt
name = "earth bolt"
icon_state = "declone"
damage = 4
@@ -1,4 +1,4 @@
/obj/item/projectile/hivebotbullet
/obj/projectile/hivebotbullet
damage = 10
damage_type = BRUTE
@@ -19,7 +19,7 @@
attacktext = "claws"
attack_sound = 'sound/weapons/bladeslice.ogg'
projectilesound = 'sound/weapons/gun/pistol/shot.ogg'
projectiletype = /obj/item/projectile/hivebotbullet
projectiletype = /obj/projectile/hivebotbullet
faction = list("hivebot")
check_friendly_fire = 1
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)
@@ -118,7 +118,7 @@
FindTarget(list(user), 1)
return ..()
/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)
@@ -409,7 +409,7 @@
playsound(src, projectilesound, 100, TRUE)
casing.fire_casing(targeted_atom, src, null, null, null, ran_zone(), 0, src)
else if(projectiletype)
var/obj/item/projectile/P = new projectiletype(startloc)
var/obj/projectile/P = new projectiletype(startloc)
playsound(src, projectilesound, 100, TRUE)
P.starting = startloc
P.firer = src
@@ -14,7 +14,7 @@
maxHealth = 300
health = 300
ranged = TRUE
projectiletype = /obj/item/projectile/leaper
projectiletype = /obj/projectile/leaper
projectilesound = 'sound/weapons/pierce.ogg'
ranged_cooldown_time = 30
pixel_x = -16
@@ -28,7 +28,7 @@
do_footstep = TRUE
/obj/item/projectile/leaper
/obj/projectile/leaper
name = "leaper bubble"
icon_state = "leaper"
paralyze = 50
@@ -38,7 +38,7 @@
nondirectional_sprite = TRUE
impact_effect_type = /obj/effect/temp_visual/leaper_projectile_impact
/obj/item/projectile/leaper/on_hit(atom/target, blocked = FALSE)
/obj/projectile/leaper/on_hit(atom/target, blocked = FALSE)
..()
if(iscarbon(target))
var/mob/living/carbon/C = target
@@ -48,7 +48,7 @@
var/mob/living/simple_animal/L = target
L.adjustHealth(25)
/obj/item/projectile/leaper/on_range()
/obj/projectile/leaper/on_range()
var/turf/T = get_turf(src)
..()
new /obj/structure/leaper_bubble(T)
@@ -20,7 +20,7 @@
speak_emote = list("chitters")
attack_sound = 'sound/weapons/bladeslice.ogg'
ranged_cooldown_time = 60
projectiletype = /obj/item/projectile/mega_arachnid
projectiletype = /obj/projectile/mega_arachnid
projectilesound = 'sound/weapons/pierce.ogg'
alpha = 50
@@ -48,13 +48,13 @@
..()
alpha = 50
/obj/item/projectile/mega_arachnid
/obj/projectile/mega_arachnid
name = "flesh snare"
nodamage = TRUE
damage = 0
icon_state = "tentacle_end"
/obj/item/projectile/mega_arachnid/on_hit(atom/target, blocked = FALSE)
/obj/projectile/mega_arachnid/on_hit(atom/target, blocked = FALSE)
if(iscarbon(target) && blocked < 100)
var/obj/item/restraints/legcuffs/beartrap/mega_arachnid/B = new /obj/item/restraints/legcuffs/beartrap/mega_arachnid(get_turf(target))
B.Crossed(target)
@@ -25,7 +25,7 @@
aggro_vision_range = 15
ranged = TRUE
ranged_cooldown_time = 10
projectiletype = /obj/item/projectile/seedling
projectiletype = /obj/projectile/seedling
projectilesound = 'sound/weapons/pierce.ogg'
robust_searching = TRUE
stat_attack = UNCONSCIOUS
@@ -35,7 +35,7 @@
var/mob/living/beam_debuff_target
var/solar_beam_identifier = 0
/obj/item/projectile/seedling
/obj/projectile/seedling
name = "solar energy"
icon_state = "seedling"
damage = 10
@@ -47,7 +47,7 @@
hitsound_wall = 'sound/weapons/effects/searwall.ogg'
nondirectional_sprite = TRUE
/obj/item/projectile/seedling/Bump(atom/A)//Stops seedlings from destroying other jungle mobs through FF
/obj/projectile/seedling/Bump(atom/A)//Stops seedlings from destroying other jungle mobs through FF
if(isliving(A))
var/mob/living/L = A
if("jungle" in L.faction)
@@ -181,7 +181,7 @@
Shoot(target)
return
var/turf/our_turf = get_turf(src)
var/obj/item/projectile/seedling/readied_shot = new /obj/item/projectile/seedling(our_turf)
var/obj/projectile/seedling/readied_shot = new /obj/projectile/seedling(our_turf)
readied_shot.preparePixelProjectile(target, src, null, rand(-10, 10))
readied_shot.fire()
playsound(src, projectilesound, 100, TRUE)
@@ -34,7 +34,7 @@ Difficulty: Medium
speak_emote = list("roars")
speed = 3
move_to_delay = 3
projectiletype = /obj/item/projectile/kinetic/miner
projectiletype = /obj/projectile/kinetic/miner
projectilesound = 'sound/weapons/kenetic_accel.ogg'
ranged = TRUE
ranged_cooldown_time = 16
@@ -111,7 +111,7 @@ Difficulty: Medium
..()
target.stun_absorption -= "miner"
/obj/item/projectile/kinetic/miner
/obj/projectile/kinetic/miner
damage = 20
speed = 0.9
icon_state = "ka_tracer"
@@ -417,7 +417,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)
@@ -171,7 +171,7 @@ Difficulty: Very Hard
if(!isnum(set_angle) && (!marker || marker == loc))
return
var/turf/startloc = get_turf(src)
var/obj/item/projectile/P = new /obj/item/projectile/colossus(startloc)
var/obj/projectile/P = new /obj/projectile/colossus(startloc)
P.preparePixelProjectile(marker, startloc)
P.firer = src
if(target)
@@ -233,7 +233,7 @@ Difficulty: Very Hard
target = new_target
INVOKE_ASYNC(src, /atom/movable/proc/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)
var/obj/effect/temp_visual/at_shield/AT = new /obj/effect/temp_visual/at_shield(loc, src)
var/random_x = rand(-32, 32)
@@ -243,7 +243,7 @@ Difficulty: Very Hard
AT.pixel_y += random_y
return ..()
/obj/item/projectile/colossus
/obj/projectile/colossus
name ="death bolt"
icon_state= "chronobolt"
damage = 25
@@ -253,7 +253,7 @@ Difficulty: Very Hard
damage_type = BRUTE
pass_flags = PASSTABLE
/obj/item/projectile/colossus/on_hit(atom/target, blocked = FALSE)
/obj/projectile/colossus/on_hit(atom/target, blocked = FALSE)
. = ..()
if(isturf(target) || isobj(target))
target.ex_act(EXPLODE_HEAVY)
@@ -426,9 +426,9 @@ Difficulty: Very Hard
ActivationReaction(user, ACTIVATE_WEAPON)
..()
/obj/machinery/anomalous_crystal/bullet_act(obj/item/projectile/P, def_zone)
/obj/machinery/anomalous_crystal/bullet_act(obj/projectile/P, def_zone)
. = ..()
if(istype(P, /obj/item/projectile/magic))
if(istype(P, /obj/projectile/magic))
ActivationReaction(P.firer, ACTIVATE_MAGIC, P.damage_type)
return
ActivationReaction(P.firer, P.flag, P.damage_type)
@@ -541,18 +541,18 @@ Difficulty: Very Hard
observer_desc = "This crystal generates a projectile when activated."
activation_method = ACTIVATE_TOUCH
cooldown_add = 50
var/obj/item/projectile/generated_projectile = /obj/item/projectile/beam/emitter
var/obj/projectile/generated_projectile = /obj/projectile/beam/emitter
/obj/machinery/anomalous_crystal/emitter/Initialize()
. = ..()
generated_projectile = pick(/obj/item/projectile/colossus)
generated_projectile = pick(/obj/projectile/colossus)
var/proj_name = initial(generated_projectile.name)
observer_desc = "This crystal generates \a [proj_name] when activated."
/obj/machinery/anomalous_crystal/emitter/ActivationReaction(mob/user, method)
if(..())
var/obj/item/projectile/P = new generated_projectile(get_turf(src))
var/obj/projectile/P = new generated_projectile(get_turf(src))
P.setDir(dir)
switch(dir)
if(NORTH)
@@ -689,7 +689,7 @@ Difficulty: Very Hard
activation_method = ACTIVATE_TOUCH
cooldown_add = 50
activation_sound = 'sound/magic/timeparadox2.ogg'
var/static/list/banned_items_typecache = typecacheof(list(/obj/item/storage, /obj/item/implant, /obj/item/implanter, /obj/item/disk/nuclear, /obj/item/projectile, /obj/item/spellbook))
var/static/list/banned_items_typecache = typecacheof(list(/obj/item/storage, /obj/item/implant, /obj/item/implanter, /obj/item/disk/nuclear, /obj/projectile, /obj/item/spellbook))
/obj/machinery/anomalous_crystal/refresher/ActivationReaction(mob/user, method)
if(..())
@@ -530,8 +530,8 @@ Difficulty: Hard
return FALSE
if(mover == caster.pulledby)
return TRUE
if(istype(mover, /obj/item/projectile))
var/obj/item/projectile/P = mover
if(istype(mover, /obj/projectile))
var/obj/projectile/P = mover
if(P.firer == caster)
return TRUE
if(mover == caster)
@@ -317,7 +317,7 @@
layer = ABOVE_OBJ_LAYER
armor = list("melee" = 0, "bullet" = 0, "laser" = 100,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
///What kind of projectile the actual damaging part should be.
var/projectile_type = /obj/item/projectile/beam/legion
var/projectile_type = /obj/projectile/beam/legion
///Time until the tracer gets shot
var/initial_firing_time = 18
///How long it takes between shooting the tracer and the projectile.
@@ -355,14 +355,14 @@
///Called shot_delay after the turret shot the tracer. Shoots a projectile into the same direction.
/obj/structure/legionturret/proc/fire_beam(angle)
var/obj/item/projectile/ouchie = new projectile_type(loc)
var/obj/projectile/ouchie = new projectile_type(loc)
ouchie.firer = src
ouchie.fire(angle)
playsound(src, 'sound/effects/bin_close.ogg', 100, TRUE)
QDEL_IN(src, 5)
///Used for the legion turret.
/obj/item/projectile/beam/legion
/obj/projectile/beam/legion
name = "blood pulse"
hitsound = 'sound/magic/magic_missile.ogg'
damage = 19
@@ -238,7 +238,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa
/mob/living/simple_animal/hostile/swarmer/ai/ranged_combat
icon_state = "swarmer_ranged"
icon_living = "swarmer_ranged"
projectiletype = /obj/item/projectile/beam/laser
projectiletype = /obj/projectile/beam/laser
projectilesound = 'sound/weapons/laser.ogg'
check_friendly_fire = TRUE //you're supposed to protect the resource swarmers, you poop
retreat_distance = 3
@@ -10,7 +10,7 @@
icon_gib = "syndicate_gib"
mob_biotypes = MOB_ORGANIC|MOB_BEAST
move_to_delay = 20
projectiletype = /obj/item/projectile/temp/basilisk
projectiletype = /obj/projectile/temp/basilisk
projectilesound = 'sound/weapons/pierce.ogg'
ranged = 1
ranged_message = "stares"
@@ -35,7 +35,7 @@
loot = list(/obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER},
/obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER})
/obj/item/projectile/temp/basilisk
/obj/projectile/temp/basilisk
name = "freezing blast"
icon_state = "ice_2"
damage = 0
@@ -103,7 +103,7 @@
light_range = 3
light_power = 2.5
light_color = LIGHT_COLOR_LAVA
projectiletype = /obj/item/projectile/temp/basilisk/magmawing
projectiletype = /obj/projectile/temp/basilisk/magmawing
crusher_loot = /obj/item/crusher_trophy/blaster_tubes/magma_wing
crusher_drop_mod = 60
@@ -116,12 +116,12 @@
icon_dead = "watcher_icewing_dead"
maxHealth = 170
health = 170
projectiletype = /obj/item/projectile/temp/basilisk/icewing
projectiletype = /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 = 30
/obj/item/projectile/temp/basilisk/magmawing
/obj/projectile/temp/basilisk/magmawing
name = "scorching blast"
icon_state = "lava"
damage = 5
@@ -129,7 +129,7 @@
nodamage = FALSE
temperature = 500 //Heats you up!
/obj/item/projectile/temp/basilisk/magmawing/on_hit(atom/target, blocked = FALSE)
/obj/projectile/temp/basilisk/magmawing/on_hit(atom/target, blocked = FALSE)
. = ..()
if(.)
var/mob/living/L = target
@@ -137,12 +137,12 @@
L.adjust_fire_stacks(0.1)
L.IgniteMob()
/obj/item/projectile/temp/basilisk/icewing
/obj/projectile/temp/basilisk/icewing
damage = 5
damage_type = BURN
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
@@ -73,8 +73,8 @@
/mob/living/simple_animal/hostile/asteroid/curseblob/CanPass(atom/movable/mover, turf/target)
if(mover == set_target)
return FALSE
if(istype(mover, /obj/item/projectile))
var/obj/item/projectile/P = mover
if(istype(mover, /obj/projectile))
var/obj/projectile/P = mover
if(P.firer == set_target)
return FALSE
return TRUE
@@ -95,7 +95,7 @@ IGNORE_PROC_IF_NOT_TARGET(attack_animal)
IGNORE_PROC_IF_NOT_TARGET(attack_slime)
/mob/living/simple_animal/hostile/asteroid/curseblob/bullet_act(obj/item/projectile/Proj)
/mob/living/simple_animal/hostile/asteroid/curseblob/bullet_act(obj/projectile/Proj)
if(Proj.firer != set_target)
return
return ..()
@@ -72,7 +72,7 @@
visible_message("<span class='danger'>The [name] buries into the ground, vanishing from sight!</span>")
qdel(src)
/mob/living/simple_animal/hostile/asteroid/goldgrub/bullet_act(obj/item/projectile/P)
/mob/living/simple_animal/hostile/asteroid/goldgrub/bullet_act(obj/projectile/P)
visible_message("<span class='danger'>The [P.name] was repelled by [name]'s girth!</span>")
return BULLET_ACT_BLOCK
@@ -37,7 +37,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)
Aggro()
if(P.damage < 30 && P.damage_type != BRUTE)
@@ -177,7 +177,7 @@
if(T.throwforce)
Bruise()
/mob/living/simple_animal/hostile/mushroom/bullet_act(obj/item/projectile/P)
/mob/living/simple_animal/hostile/mushroom/bullet_act(obj/projectile/P)
. = ..()
if(P.nodamage)
Bruise()
@@ -76,7 +76,7 @@
rapid_fire_delay = 6
retreat_distance = 5
minimum_distance = 5
projectiletype = /obj/item/projectile/beam/laser
projectiletype = /obj/projectile/beam/laser
loot = list(/obj/effect/mob_spawn/human/corpse/pirate/ranged,
/obj/item/gun/energy/laser)
@@ -131,7 +131,7 @@
QDEL_NULL(sord)
return ..()
/mob/living/simple_animal/hostile/syndicate/melee/bullet_act(obj/item/projectile/Proj)
/mob/living/simple_animal/hostile/syndicate/melee/bullet_act(obj/projectile/Proj)
if(prob(projectile_deflect_chance))
visible_message("<span class='danger'>[src] blocks [Proj] with its shield!</span>")
return BULLET_ACT_BLOCK
@@ -336,7 +336,7 @@
return
//Bullets
/mob/living/simple_animal/parrot/bullet_act(obj/item/projectile/Proj)
/mob/living/simple_animal/parrot/bullet_act(obj/projectile/Proj)
. = ..()
if(!stat && !client)
if(parrot_state == PARROT_PERCH)
@@ -250,7 +250,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)
attacked += 10
if((Proj.damage_type == BURN))
adjustBruteLoss(-abs(Proj.damage)) //fire projectiles heals slimes.