mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-24 21:48:39 +01:00
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:
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user