/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 10:23:20 +00:00
committed by GitHub
parent e92a45369a
commit f96b26b75a
169 changed files with 858 additions and 851 deletions
@@ -198,7 +198,7 @@
lethal = 1;
scan_range = 12;
faction = "malf_drone";
initial_eprojectile = /obj/item/projectile/beam/laser/ai_turret/heavylaser;
initial_eprojectile = /obj/projectile/beam/laser/ai_turret/heavylaser;
ailock = 1;
check_borgs = 1
},
@@ -560,7 +560,7 @@
lethal = 1;
scan_range = 12;
faction = "malf_drone";
initial_eprojectile = /obj/item/projectile/beam/laser/ai_turret/heavylaser;
initial_eprojectile = /obj/projectile/beam/laser/ai_turret/heavylaser;
ailock = 1;
check_borgs = 1
},
+1 -1
View File
@@ -96,7 +96,7 @@
#define COMSIG_ATOM_HITBY "atom_hitby"
/// Called when an atom is sharpened or dulled.
#define COMSIG_ATOM_UPDATE_SHARPNESS "atom_update_sharpness"
///from base of atom/atom_prehit(obj/item/projectile/P):
///from base of atom/atom_prehit(obj/projectile/P):
#define COMSIG_ATOM_PREHIT "atom_prehit"
#define ATOM_PREHIT_SUCCESS (1<<0)
#define ATOM_PREHIT_FAILURE (1<<1)
+1 -1
View File
@@ -76,7 +76,7 @@
#define ismask(A) (istype(A, /obj/item/clothing/mask))
#define isprojectile(A) (istype(A, /obj/item/projectile))
#define isprojectile(A) (istype(A, /obj/projectile))
#define isgun(A) (istype(A, /obj/item/gun))
+3 -3
View File
@@ -9,7 +9,7 @@
/mob/dead,
/obj/effect,
/obj/docking_port,
/obj/item/projectile,
/obj/projectile,
/atom/movable/emissive_blocker,
))
var/list/processing_list = list(location)
@@ -54,7 +54,7 @@
/mob/dead,
/obj/effect,
/obj/docking_port,
/obj/item/projectile,
/obj/projectile,
/atom/movable/emissive_blocker,
))
var/list/processing_list = list(location)
@@ -109,7 +109,7 @@
/mob/dead,
/obj/effect,
/obj/docking_port,
/obj/item/projectile,
/obj/projectile,
/atom/movable/emissive_blocker,
))
var/list/processing_list = list(location) + location.contents
+1 -1
View File
@@ -1548,7 +1548,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
/obj/item/organ/internal = "INT_ORG",
/obj/item/organ = "ORGAN",
/obj/item/pda = "PDA",
/obj/item/projectile = "PROJ",
/obj/projectile = "PROJ",
/obj/item/radio/headset = "HEADSET",
/obj/item/reagent_containers/glass/beaker = "BEAKER",
/obj/item/reagent_containers/glass/bottle = "BOTTLE",
+1 -1
View File
@@ -443,7 +443,7 @@
var/turf/T = get_turf(src)
var/turf/U = get_turf(A)
var/obj/item/projectile/beam/LE = new /obj/item/projectile/beam(loc)
var/obj/projectile/beam/LE = new /obj/projectile/beam(loc)
LE.icon = 'icons/effects/genetics.dmi'
LE.icon_state = "eyelasers"
playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1)
+2 -2
View File
@@ -26,11 +26,11 @@
if(parent)
UnregisterSignal(parent, COMSIG_ATOM_BULLET_ACT)
/datum/component/debris/proc/register_for_impact(datum/source, obj/item/projectile/proj)
/datum/component/debris/proc/register_for_impact(datum/source, obj/projectile/proj)
SIGNAL_HANDLER // COMSIG_ATOM_BULLET_ACT
INVOKE_ASYNC(src, PROC_REF(on_impact), proj)
/datum/component/debris/proc/on_impact(obj/item/projectile/P)
/datum/component/debris/proc/on_impact(obj/projectile/P)
var/angle = !isnull(P.Angle) ? P.Angle : round(get_angle(P.starting, parent), 1)
var/x_component = sin(angle) * debris_velocity
var/y_component = cos(angle) * debris_velocity
@@ -148,7 +148,7 @@
if(rider.m_intent == MOVE_INTENT_WALK)
vehicle_move_delay += 0.6
/datum/component/riding/vehicle/scooter/skateboard/proc/check_knockoff(datum/source, obj/item/projectile)
/datum/component/riding/vehicle/scooter/skateboard/proc/check_knockoff(datum/source, obj/projectile)
SIGNAL_HANDLER // COMSIG_ATOM_BULLET_ACT
if(!istype(parent, /obj/tgvehicle/scooter/skateboard))
return
+1 -1
View File
@@ -154,7 +154,7 @@
var/charge_loss = 1 // how many charges do we lose
if(isprojectile(hitby))
var/obj/item/projectile/P = hitby
var/obj/projectile/P = hitby
if(P.shield_buster)
charge_loss = 3
if(lose_multiple_charges)
+1 -1
View File
@@ -94,7 +94,7 @@
if(I.flags & ABSTRACT)
return
if(isprojectile(entered))
var/obj/item/projectile/P = entered
var/obj/projectile/P = entered
if(P.original != parent)
return
if(ismob(source))
+1 -1
View File
@@ -156,7 +156,7 @@
/datum/disease/wand_rot/proc/sneeze_fireballs()
var/fuck_you_dir = pick(GLOB.alldirs)
var/turf/target_tile = get_edge_target_turf(affected_mob, fuck_you_dir)
var/obj/item/projectile/magic/fireball/FB = new /obj/item/projectile/magic/fireball(affected_mob.loc)
var/obj/projectile/magic/fireball/FB = new /obj/projectile/magic/fireball(affected_mob.loc)
FB.current = get_turf(affected_mob)
FB.original = target_tile
FB.firer = affected_mob
+1 -1
View File
@@ -65,7 +65,7 @@
return
/// Even if another component blocked this hit, someone still shot at us
/datum/element/relay_attackers/proc/on_bullet_act(atom/target, obj/item/projectile/hit_projectile)
/datum/element/relay_attackers/proc/on_bullet_act(atom/target, obj/projectile/hit_projectile)
SIGNAL_HANDLER // COMSIG_ATOM_BULLET_ACT
if(!hit_projectile.is_hostile_projectile())
return
@@ -8,7 +8,7 @@
var/angle_to_singulo = ATAN2(host.y - source.y, host.x - source.x)
var/distance_to_singulo = get_dist(source, host)
var/obj/item/projectile/P = entered
var/obj/projectile/P = entered
var/distance = distance_to_singulo
var/projectile_angle = P.Angle
var/angle_to_projectile = angle_to_singulo
@@ -5,7 +5,7 @@
plasma_cost = 50
selection_activated_message = "<span class='notice'><B>Your prepare some neurotoxin!</B></span>"
selection_deactivated_message = "<span class='notice'><B>You swallow your prepared neurotoxin.</B></span>"
var/neurotoxin_type = /obj/item/projectile/bullet/neurotoxin
var/neurotoxin_type = /obj/projectile/bullet/neurotoxin
action_icon_state = "alien_neurotoxin_0"
/datum/spell/alien_spell/neurotoxin/create_new_targeting()
@@ -24,7 +24,7 @@
if(!istype(U) || !istype(T))
return FALSE
var/obj/item/projectile/bullet/neurotoxin/neurotoxin = new neurotoxin_type(user.loc)
var/obj/projectile/bullet/neurotoxin/neurotoxin = new neurotoxin_type(user.loc)
neurotoxin.current = get_turf(user)
neurotoxin.original = target
neurotoxin.firer = user
@@ -36,5 +36,5 @@
/datum/spell/alien_spell/neurotoxin/death_to_xenos
desc = "This ability allows you to fire some neurotoxin. Knocks aliens down."
neurotoxin_type = /obj/item/projectile/bullet/anti_alien_toxin
neurotoxin_type = /obj/projectile/bullet/anti_alien_toxin
base_cooldown = 2 SECONDS
+2 -2
View File
@@ -126,7 +126,7 @@
holy_area_cancast = FALSE //Stops cult magic from working on holy ground eg: chapel
proj_lifespan = 10
proj_step_delay = 5
proj_type = /obj/item/projectile/magic/magic_missile/lesser
proj_type = /obj/projectile/magic/magic_missile/lesser
/datum/spell/projectile/magic_missile/lesser/create_new_targeting()
var/datum/spell_targeting/targeted/T = new()
@@ -135,7 +135,7 @@
T.max_targets = 6
return T
/obj/item/projectile/magic/magic_missile/lesser
/obj/projectile/magic/magic_missile/lesser
name = "lesser magic missile"
knockdown = 6 SECONDS
weaken = 0
+1 -1
View File
@@ -44,5 +44,5 @@
ammo_type = /obj/item/ammo_casing/magic/arcane_barrage/fireball
/obj/item/ammo_casing/magic/arcane_barrage/fireball
projectile_type = /obj/item/projectile/magic/fireball
projectile_type = /obj/projectile/magic/fireball
muzzle_flash_effect = null
+1 -1
View File
@@ -25,7 +25,7 @@
for(var/mob/living/target in targets)
spawn(0)
var/obj/item/projectile/projectile = new proj_type(get_turf(user))
var/obj/projectile/projectile = new proj_type(get_turf(user))
projectile.icon = proj_icon
projectile.icon_state = proj_icon_state
projectile.dir = get_dir(target, projectile)
+8 -8
View File
@@ -10,7 +10,7 @@
proj_icon_state = "magicm"
proj_name = "a magic missile"
proj_lingering = 1
proj_type = /obj/item/projectile/magic/magic_missile
proj_type = /obj/projectile/magic/magic_missile
proj_lifespan = 20
proj_step_delay = 2
@@ -29,7 +29,7 @@
T.max_targets = INFINITY
return T
/obj/item/projectile/magic/magic_missile
/obj/projectile/magic/magic_missile
name = "Magic Missile"
hitsound = 'sound/magic/mm_hit.ogg'
weaken = 6 SECONDS
@@ -48,7 +48,7 @@
proj_icon_state = "bike_horn"
proj_name = "A bike horn"
proj_lingering = 1
proj_type = /obj/item/projectile/magic/magic_missile/honk_missile
proj_type = /obj/projectile/magic/magic_missile/honk_missile
proj_lifespan = 20
proj_step_delay = 5
@@ -68,7 +68,7 @@
T.max_targets = INFINITY
return T
/obj/item/projectile/magic/magic_missile/honk_missile
/obj/projectile/magic/magic_missile/honk_missile
name = "Funny Missile"
hitsound = 'sound/items/bikehorn.ogg'
@@ -324,7 +324,7 @@
selection_activated_message = "<span class='notice'>You prepare to cast your fireball spell! <B>Left-click to cast at a target!</B></span>"
selection_deactivated_message = "<span class='notice'>You extinguish your fireball...for now.</span>"
var/fireball_type = /obj/item/projectile/magic/fireball
var/fireball_type = /obj/projectile/magic/fireball
action_icon_state = "fireball0"
sound = 'sound/magic/fireball.ogg'
@@ -350,7 +350,7 @@
if(!isturf(U) || !isturf(T))
return FALSE
var/obj/item/projectile/magic/fireball/FB = new fireball_type(user.loc)
var/obj/projectile/magic/fireball/FB = new fireball_type(user.loc)
FB.current = get_turf(user)
FB.original = target
FB.firer = user
@@ -364,7 +364,7 @@
name = "Homing Toolbox"
desc = "This spell summons and throws a magical homing toolbox at your opponent."
sound = 'sound/weapons/smash.ogg'
fireball_type = /obj/item/projectile/homing/magic/toolbox
fireball_type = /obj/projectile/homing/magic/toolbox
invocation = "ROBUSTIO!"
selection_activated_message = "<span class='notice'>You prepare to cast your homing toolbox! <B>Left-click to cast at a target!</B></span>"
@@ -374,7 +374,7 @@
name = "Greater Homing Fireball"
desc = "This spell fires a strong homing fireball at a target."
invocation = "ZI-ONI SOMA"
fireball_type = /obj/item/projectile/homing/magic/homing_fireball
fireball_type = /obj/projectile/homing/magic/homing_fireball
selection_activated_message = "<span class='notice'>You prepare to cast your greater homing fireball spell! <B>Left-click to cast at a target!</B></span>"
+2 -2
View File
@@ -922,8 +922,8 @@
if(L.affects_vampire(owner))
L.adjust_bodytemperature(-1.5 * TEMPERATURE_DAMAGE_COEFFICIENT)
continue
if(istype(AM, /obj/item/projectile))
var/obj/item/projectile/P = AM
if(istype(AM, /obj/projectile))
var/obj/projectile/P = AM
if(P.flag == ENERGY || P.flag == LASER)
P.damage *= 0.85
+3 -3
View File
@@ -381,7 +381,7 @@
/atom/proc/water_act(volume, temperature, source, method = REAGENT_TOUCH) //amount of water acting : temperature of water in kelvin : object that called it (for shennagins)
return TRUE
/atom/proc/bullet_act(obj/item/projectile/P, def_zone)
/atom/proc/bullet_act(obj/projectile/P, def_zone)
SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone)
. = P.on_hit(src, 0, def_zone)
@@ -1213,7 +1213,7 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
/atom/proc/zap_act(power, zap_flags)
return
/atom/proc/handle_ricochet(obj/item/projectile/ricocheting_projectile)
/atom/proc/handle_ricochet(obj/projectile/ricocheting_projectile)
var/turf/p_turf = get_turf(ricocheting_projectile)
var/face_direction = get_dir(src, p_turf) || get_dir(src, ricocheting_projectile)
var/face_angle = dir2angle(face_direction)
@@ -1451,7 +1451,7 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
. = !density
/atom/proc/atom_prehit(obj/item/projectile/P)
/atom/proc/atom_prehit(obj/projectile/P)
return SEND_SIGNAL(src, COMSIG_ATOM_PREHIT, P)
/// Passes Stat Browser Panel clicks to the game and calls client click on an atom
+4 -4
View File
@@ -461,7 +461,7 @@
// Hit by a projectile
if(isprojectile(hitby))
var/obj/item/projectile/P = hitby
var/obj/projectile/P = hitby
var/shatter_chance = 0 // Percent chance of the shield shattering on a projectile hit
var/threshold // Depends on the damage Type (Brute or Burn)
if(P.damage_type == BRUTE)
@@ -663,17 +663,17 @@
ammo_type = /obj/item/ammo_casing/magic/arcane_barrage/blood
/obj/item/ammo_casing/magic/arcane_barrage/blood
projectile_type = /obj/item/projectile/magic/arcane_barrage/blood
projectile_type = /obj/projectile/magic/arcane_barrage/blood
muzzle_flash_effect = /obj/effect/temp_visual/emp/cult
/obj/item/projectile/magic/arcane_barrage/blood
/obj/projectile/magic/arcane_barrage/blood
name = "blood bolt"
icon_state = "blood_bolt"
damage_type = BRUTE
impact_effect_type = /obj/effect/temp_visual/dir_setting/bloodsplatter
hitsound = 'sound/effects/splat.ogg'
/obj/item/projectile/magic/arcane_barrage/blood/prehit(atom/target)
/obj/projectile/magic/arcane_barrage/blood/prehit(atom/target)
if(IS_CULTIST(target))
damage = 0
nodamage = TRUE
@@ -359,7 +359,7 @@
var/turf/T = get_turf(turret)
if(is_station_level(T.z))
turret.health += 30
turret.eprojectile = /obj/item/projectile/beam/laser/ai_turret/heavylaser //Once you see it, you will know what it means to FEAR.
turret.eprojectile = /obj/projectile/beam/laser/ai_turret/heavylaser //Once you see it, you will know what it means to FEAR.
turret.eshot_sound = 'sound/weapons/lasercannonfire.ogg'
AI.turrets_upgraded = TRUE
@@ -691,7 +691,7 @@
//If turrets are already upgraded, beef it up
if(user.turrets_upgraded)
turret.health += 30
turret.eprojectile = /obj/item/projectile/beam/laser/ai_turret/heavylaser //Big gun
turret.eprojectile = /obj/projectile/beam/laser/ai_turret/heavylaser //Big gun
turret.eshot_sound = 'sound/weapons/lasercannonfire.ogg'
if(do_after_once(user, 5 SECONDS, target = T, allow_moving = TRUE)) //Once this is done, turret is armed and dangerous
@@ -201,7 +201,7 @@
name = "Shadow Grapple"
desc = "Fire one of your hands, if it hits a person it pulls them in. If you hit a structure you get pulled to the structure. Any light source hit with this will be disabled in a two tile radius."
base_cooldown = 10 SECONDS
fireball_type = /obj/item/projectile/magic/shadow_hand
fireball_type = /obj/projectile/magic/shadow_hand
selection_activated_message = "<span class='notice'>You raise your hand, full of demonic energy! <b>Left-click to cast at a target!</b></span>"
selection_deactivated_message = "<span class='notice'>You re-absorb the energy...for now.</span>"
@@ -215,20 +215,20 @@
/datum/spell/fireball/shadow_grapple/update_spell_icon()
return
/obj/item/projectile/magic/shadow_hand
/obj/projectile/magic/shadow_hand
name = "shadow hand"
icon_state = "shadow_hand"
plane = FLOOR_PLANE
hitsound = 'sound/shadowdemon/shadowattack1.ogg' // Plays when hitting something living or a light
var/hit = FALSE
/obj/item/projectile/magic/shadow_hand/pixel_move(trajectory_multiplier, hitscanning)
/obj/projectile/magic/shadow_hand/pixel_move(trajectory_multiplier, hitscanning)
. = ..()
var/obj/machinery/light/floor/floor_light = locate(/obj/machinery/light/floor) in get_turf(src)
if(floor_light)
Bump(floor_light)
/obj/item/projectile/magic/shadow_hand/fire(setAngle)
/obj/projectile/magic/shadow_hand/fire(setAngle)
if(firer)
var/mob/living/simple_animal/demon/shadow/current_demon = firer
if(istype(current_demon))
@@ -236,7 +236,7 @@
firer.Beam(src, icon_state = "grabber_beam", time = INFINITY, maxdistance = INFINITY, beam_type = /obj/effect/ebeam/floor)
return ..()
/obj/item/projectile/magic/shadow_hand/on_hit(atom/target, blocked, hit_zone)
/obj/projectile/magic/shadow_hand/on_hit(atom/target, blocked, hit_zone)
if(hit)
return
hit = TRUE // to prevent double hits from the pull
@@ -258,12 +258,12 @@
L.apply_damage(40, BRUTE, BODY_ZONE_CHEST)
L.throw_at(get_step(firer, get_dir(firer, target)), 50, 10)
/obj/item/projectile/magic/shadow_hand/Destroy()
/obj/projectile/magic/shadow_hand/Destroy()
if(!hit)
unblock_shadowdemon_crawl()
return ..()
/obj/item/projectile/magic/shadow_hand/proc/unblock_shadowdemon_crawl()
/obj/projectile/magic/shadow_hand/proc/unblock_shadowdemon_crawl()
var/mob/living/simple_animal/demon/shadow/current_demon = firer
if(istype(current_demon))
current_demon.unblock_shadow_crawl()
@@ -127,7 +127,7 @@
return TRUE
return FALSE
/obj/effect/guardianshield/bullet_act(obj/item/projectile/P)
/obj/effect/guardianshield/bullet_act(obj/projectile/P)
if(!P)
return
linked_guardian.apply_damage(P.damage, P.damage_type)
@@ -1,4 +1,4 @@
/obj/item/projectile/guardian
/obj/projectile/guardian
name = "crystal spray"
icon_state = "guardian"
damage = 20
@@ -8,7 +8,7 @@
friendly = "quietly assesses"
melee_damage_lower = 10
melee_damage_upper = 10
projectiletype = /obj/item/projectile/guardian
projectiletype = /obj/projectile/guardian
ranged_cooldown_time = 5 //fast!
projectilesound = 'sound/effects/hit_on_shattered_glass.ogg'
ranged = TRUE
@@ -829,10 +829,10 @@
/mob/living/simple_animal/demon/pulse_demon/CanPass(atom/movable/mover, border_dir)
. = ..()
if(istype(mover, /obj/item/projectile/ion))
if(istype(mover, /obj/projectile/ion))
return FALSE
/mob/living/simple_animal/demon/pulse_demon/bullet_act(obj/item/projectile/proj)
/mob/living/simple_animal/demon/pulse_demon/bullet_act(obj/projectile/proj)
if(proj.damage_type == BURN)
regen_lock = max(regen_lock, 1)
return ..()
+5 -5
View File
@@ -65,7 +65,7 @@
else if(isprojectile(mover))
if(!anchored)
return TRUE
var/obj/item/projectile/proj = mover
var/obj/projectile/proj = mover
if(directional_blockage)
if(one_eighty_check(mover))
return FALSE
@@ -275,7 +275,7 @@
..()
take_damage(40 / severity, BRUTE) //chances are the EMP will also hit the generator, we don't want it to double up too heavily
/obj/structure/barricade/dropwall/bullet_act(obj/item/projectile/P)
/obj/structure/barricade/dropwall/bullet_act(obj/projectile/P)
if(P.shield_buster)
qdel(src)
else
@@ -381,7 +381,7 @@
else
return ..()
/obj/structure/dropwall_generator/bullet_act(obj/item/projectile/P)
/obj/structure/dropwall_generator/bullet_act(obj/projectile/P)
if(!protected)
return ..()
else
@@ -455,7 +455,7 @@
/obj/structure/barricade/dropwall/firewall/proc/on_atom_entered(datum/source, atom/movable/entered)
if(!isprojectile(entered))
return
var/obj/item/projectile/P = entered
var/obj/projectile/P = entered
P.immolate ++
/obj/item/grenade/turret
@@ -497,7 +497,7 @@
. += "It would need [(5 - foam_level)] more blobs of foam to fully block the airlock."
/obj/structure/barricade/foam/CanPass(atom/movable/mover, border_dir)
return istype(mover, /obj/item/projectile/c_foam) // Only c_foam blobs hit the airlock underneat/pass through the foam. The rest is hitting the barricade
return istype(mover, /obj/projectile/c_foam) // Only c_foam blobs hit the airlock underneat/pass through the foam. The rest is hitting the barricade
/obj/structure/barricade/foam/welder_act(mob/user, obj/item/I)
return FALSE
+3 -3
View File
@@ -36,16 +36,16 @@
)
return data
/obj/machinery/porta_turret/tag/bullet_act(obj/item/projectile/P)
/obj/machinery/porta_turret/tag/bullet_act(obj/projectile/P)
..()
if(!disabled)
if(team_color == "blue")
if(istype(P, /obj/item/projectile/beam/lasertag/redtag))
if(istype(P, /obj/projectile/beam/lasertag/redtag))
disabled = TRUE
spawn(100)
disabled = FALSE
else if(team_color == "red")
if(istype(P, /obj/item/projectile/beam/lasertag/bluetag))
if(istype(P, /obj/projectile/beam/lasertag/bluetag))
disabled = TRUE
spawn(100)
disabled = FALSE
+24 -24
View File
@@ -150,7 +150,7 @@
if(/obj/item/gun/energy/laser/practice)
lethal_is_configurable = FALSE
iconholder = 1
eprojectile = /obj/item/projectile/beam
eprojectile = /obj/projectile/beam
if(/obj/item/gun/energy/laser/retro)
iconholder = 1
@@ -163,26 +163,26 @@
if(/obj/item/gun/energy/taser)
lethal_is_configurable = FALSE
eprojectile = /obj/item/projectile/beam
eprojectile = /obj/projectile/beam
eshot_sound = 'sound/weapons/laser.ogg'
if(/obj/item/gun/energy/gun)
eprojectile = /obj/item/projectile/beam //If it has, going to kill mode
eprojectile = /obj/projectile/beam //If it has, going to kill mode
eshot_sound = 'sound/weapons/laser.ogg'
egun = 1
if(/obj/item/gun/energy/gun/nuclear)
eprojectile = /obj/item/projectile/beam //If it has, going to kill mode
eprojectile = /obj/projectile/beam //If it has, going to kill mode
eshot_sound = 'sound/weapons/laser.ogg'
egun = 1
if(/obj/item/gun/energy/gun/turret)
eprojectile = /obj/item/projectile/beam //If it has, going to copypaste mode
eprojectile = /obj/projectile/beam //If it has, going to copypaste mode
eshot_sound = 'sound/weapons/laser.ogg'
egun = 1
if(/obj/item/gun/energy/pulse/turret)
eprojectile = /obj/item/projectile/beam/pulse/hitscan
eprojectile = /obj/projectile/beam/pulse/hitscan
eshot_sound = 'sound/weapons/pulse.ogg'
if(initial_eprojectile)
eprojectile = initial_eprojectile
@@ -535,7 +535,7 @@
if(health <= 0)
Destroy()
/obj/machinery/porta_turret/bullet_act(obj/item/projectile/Proj)
/obj/machinery/porta_turret/bullet_act(obj/projectile/Proj)
if(Proj.damage_type == STAMINA)
return
@@ -835,7 +835,7 @@
return
update_icon(UPDATE_ICON_STATE)
var/obj/item/projectile/A
var/obj/projectile/A
if(emagged || lethal)
if(eprojectile)
A = new eprojectile(loc)
@@ -868,11 +868,11 @@
return A
/obj/machinery/porta_turret/ai_turret
initial_eprojectile = /obj/item/projectile/beam/laser/ai_turret
initial_eprojectile = /obj/projectile/beam/laser/ai_turret
/obj/machinery/porta_turret/ai_turret/disable
name = "hallway turret"
initial_projectile = /obj/item/projectile/beam/disabler
initial_projectile = /obj/projectile/beam/disabler
/obj/machinery/porta_turret/centcom
name = "\improper Centcomm turret"
@@ -1123,8 +1123,8 @@
/obj/machinery/porta_turret/syndicate
icon_state = "syndie_off"
base_icon_state = "syndie"
projectile = /obj/item/projectile/bullet
eprojectile = /obj/item/projectile/bullet
projectile = /obj/projectile/bullet
eprojectile = /obj/projectile/bullet
// Syndicate turrets *always* operate in lethal mode.
// So, nothing, not even emagging them, makes them switch bullet type.
// So, its best to always have their projectile and eprojectile settings be the same. That way, you know what they will shoot.
@@ -1187,14 +1187,14 @@
/obj/machinery/porta_turret/syndicate/pod
health = 90
projectile = /obj/item/projectile/bullet/weakbullet3
eprojectile = /obj/item/projectile/bullet/weakbullet3
projectile = /obj/projectile/bullet/weakbullet3
eprojectile = /obj/projectile/bullet/weakbullet3
/obj/machinery/porta_turret/syndicate/interior
name = "machine gun turret (.45)"
desc = "Syndicate interior defense turret chambered for .45 rounds. Designed to down intruders without damaging the hull."
projectile = /obj/item/projectile/bullet/midbullet
eprojectile = /obj/item/projectile/bullet/midbullet
projectile = /obj/projectile/bullet/midbullet
eprojectile = /obj/projectile/bullet/midbullet
/obj/machinery/porta_turret/syndicate/exterior
name = "machine gun turret (7.62)"
@@ -1203,21 +1203,21 @@
/obj/machinery/porta_turret/syndicate/turret_outpost
name = "machine gun turret (5.56x45mm)"
desc = "Syndicate exterior defense turret chambered for 5.56x45mm rounds. Designed to down intruders with rifle caliber bullets."
projectile = /obj/item/projectile/bullet/heavybullet2
eprojectile = /obj/item/projectile/bullet/heavybullet2
projectile = /obj/projectile/bullet/heavybullet2
eprojectile = /obj/projectile/bullet/heavybullet2
/obj/machinery/porta_turret/syndicate/grenade
name = "mounted grenade launcher (40mm)"
desc = "Syndicate 40mm grenade launcher defense turret. If you've had this much time to look at it, you're probably already dead."
projectile = /obj/item/projectile/bullet/a40mm
eprojectile = /obj/item/projectile/bullet/a40mm
projectile = /obj/projectile/bullet/a40mm
eprojectile = /obj/projectile/bullet/a40mm
/obj/machinery/porta_turret/syndicate/assault_pod
name = "machine gun turret (4.6x30mm)"
desc = "Syndicate exterior defense turret chambered for 4.6x30mm rounds. Designed to be fitted to assault pods, it uses low calliber bullets to save space."
health = 150
projectile = /obj/item/projectile/bullet/weakbullet3
eprojectile = /obj/item/projectile/bullet/weakbullet3
projectile = /obj/projectile/bullet/weakbullet3
eprojectile = /obj/projectile/bullet/weakbullet3
/obj/machinery/porta_turret/syndicate/pod/nuke_ship_interior
health = 150
@@ -1227,8 +1227,8 @@
desc = "Looks cheaply made on the defensive side but the gun barrel still shoots."
icon_state = "syndie_off"
base_icon_state = "syndie"
projectile = /obj/item/projectile/bullet/weakbullet3
eprojectile = /obj/item/projectile/bullet/weakbullet3
projectile = /obj/projectile/bullet/weakbullet3
eprojectile = /obj/projectile/bullet/weakbullet3
shot_sound = 'sound/weapons/gunshots/gunshot_mg.ogg'
eshot_sound = 'sound/weapons/gunshots/gunshot_mg.ogg'
health = 100
+3 -3
View File
@@ -454,7 +454,7 @@
deactivate()
return ..()
/obj/machinery/shieldwallgen/bullet_act(obj/item/projectile/Proj)
/obj/machinery/shieldwallgen/bullet_act(obj/projectile/Proj)
stored_power -= Proj.damage
..()
return
@@ -506,7 +506,7 @@
gen_secondary.stored_power = max(gen_secondary.stored_power - 10, 0)
/obj/machinery/shieldwall/bullet_act(obj/item/projectile/Proj)
/obj/machinery/shieldwall/bullet_act(obj/projectile/Proj)
if(needs_power)
var/obj/machinery/shieldwallgen/G
if(prob(50))
@@ -590,7 +590,7 @@
phaseout()
return ..()
/obj/machinery/shieldwall/syndicate/bullet_act(obj/item/projectile/Proj)
/obj/machinery/shieldwall/syndicate/bullet_act(obj/projectile/Proj)
phaseout()
return ..()
+23 -23
View File
@@ -41,7 +41,7 @@
set_ready_state(0)
for(var/i=1 to get_shot_amount())
var/obj/item/projectile/A = new projectile(curloc)
var/obj/projectile/A = new projectile(curloc)
A.firer = chassis.occupant
A.firer_source_atom = src
A.original = target
@@ -75,7 +75,7 @@
icon_state = "mecha_firedart"
origin_tech = "magnets=3;combat=3;engineering=3"
energy_drain = 30
projectile = /obj/item/projectile/beam
projectile = /obj/projectile/beam
fire_sound = 'sound/weapons/laser.ogg'
harmful = TRUE
@@ -85,7 +85,7 @@
desc = "A weapon for combat exosuits. Shoots basic disablers."
icon_state = "mecha_disabler"
energy_drain = 30
projectile = /obj/item/projectile/beam/disabler
projectile = /obj/projectile/beam/disabler
fire_sound = 'sound/weapons/taser2.ogg'
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
@@ -94,7 +94,7 @@
icon_state = "mecha_solaris"
origin_tech = "magnets=4;combat=4;engineering=3"
energy_drain = 60
projectile = /obj/item/projectile/beam/laser/heavylaser
projectile = /obj/projectile/beam/laser/heavylaser
fire_sound = 'sound/weapons/lasercannonfire.ogg'
/obj/item/mecha_parts/mecha_equipment/weapon/energy/shotgun_disabler
@@ -104,7 +104,7 @@
icon_state = "mecha_disabler_shotgun"
origin_tech = "materials=4;combat=5;"
energy_drain = 30 // This is per shot + 1x cost, so 300 per shot
projectile = /obj/item/projectile/beam/disabler/pellet
projectile = /obj/projectile/beam/disabler/pellet
projectiles_per_shot = 9
variance = 40
fire_sound = 'sound/weapons/taser2.ogg'
@@ -116,7 +116,7 @@
icon_state = "mecha_laser_shotgun"
origin_tech = "materials=4;combat=5;"
energy_drain = 35 // This is per shot + 1x cost, so 560 per shot
projectile = /obj/item/projectile/beam/scatter/eshotgun
projectile = /obj/projectile/beam/scatter/eshotgun
projectiles_per_shot = 15
variance = 40
fire_sound = 'sound/weapons/lasercannonfire.ogg'
@@ -128,7 +128,7 @@
icon_state = "mecha_ion"
origin_tech = "materials=4;combat=5;magnets=4"
energy_drain = 215 // This is per shot + 1x cost, so ~1500 per shotgun shot
projectile = /obj/item/projectile/ion/weak
projectile = /obj/projectile/ion/weak
projectiles_per_shot = 6
variance = 40
fire_sound = 'sound/weapons/ionrifle.ogg'
@@ -145,7 +145,7 @@
icon_state = "mecha_teslacannon"
origin_tech = "materials=4;engineering=4;combat=6;magnets=6"
energy_drain = 500
projectile = /obj/item/projectile/energy/tesla_bolt
projectile = /obj/projectile/energy/tesla_bolt
fire_sound = 'sound/magic/lightningbolt.ogg'
harmful = TRUE
@@ -156,7 +156,7 @@
icon_state = "mecha_xray"
origin_tech = "materials=3;combat=5;magnets=2;syndicate=2"
energy_drain = 80
projectile = /obj/item/projectile/beam/xray
projectile = /obj/projectile/beam/xray
fire_sound = 'sound/weapons/laser3.ogg'
harmful = TRUE
@@ -172,7 +172,7 @@
icon_state = "mecha_immolator"
origin_tech = "materials=4;engineering=4;combat=6;magnets=6"
energy_drain = 80
projectile = /obj/item/projectile/beam/immolator
projectile = /obj/projectile/beam/immolator
fire_sound = 'sound/weapons/laser3.ogg'
harmful = TRUE
@@ -182,18 +182,18 @@
icon_state = "mecha_pulse"
energy_drain = 120
origin_tech = "materials=3;combat=6;powerstorage=4"
projectile = /obj/item/projectile/beam/pulse/hitscan/heavy
projectile = /obj/projectile/beam/pulse/hitscan/heavy
fire_sound = 'sound/weapons/marauder.ogg'
harmful = TRUE
/obj/item/projectile/beam/pulse/hitscan/heavy
/obj/projectile/beam/pulse/hitscan/heavy
name = "heavy pulse laser"
icon_state = "pulse1_bl"
var/life = 20
/obj/item/projectile/beam/pulse/hitscan/heavy/Bump(atom/A)
/obj/projectile/beam/pulse/hitscan/heavy/Bump(atom/A)
A.bullet_act(src, def_zone)
life -= 10
if(ismob(A))
@@ -212,7 +212,7 @@
icon_state = "mecha_taser"
origin_tech = "combat=3"
energy_drain = 20
projectile = /obj/item/projectile/energy/electrode
projectile = /obj/projectile/energy/electrode
fire_sound = 'sound/weapons/taser.ogg'
size = 1
@@ -303,7 +303,7 @@
name = "\improper FNX-66 Carbine"
icon_state = "mecha_carbine"
origin_tech = "materials=4;combat=4"
projectile = /obj/item/projectile/bullet/incendiary/shell/dragonsbreath
projectile = /obj/projectile/bullet/incendiary/shell/dragonsbreath
fire_sound = 'sound/weapons/gunshots/gunshot_rifle.ogg'
projectiles = 24
projectile_energy_cost = 15
@@ -314,7 +314,7 @@
name = "\improper S.H.H. \"Quietus\" Carbine"
fire_sound = 'sound/weapons/gunshots/gunshot_silenced.ogg'
icon_state = "mecha_mime"
projectile = /obj/item/projectile/bullet/mime/nonlethal
projectile = /obj/projectile/bullet/mime/nonlethal
projectiles = 20
projectile_energy_cost = 50
@@ -328,7 +328,7 @@
name = "\improper LBX AC 10 \"Scattershot\""
icon_state = "mecha_scatter"
origin_tech = "combat=4"
projectile = /obj/item/projectile/bullet/midbullet2
projectile = /obj/projectile/bullet/midbullet2
fire_sound = 'sound/weapons/gunshots/gunshot_shotgun.ogg'
projectiles = 40
projectile_energy_cost = 25
@@ -340,14 +340,14 @@
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot/syndie //Version used for Dark Gygax
name = "\improper LBX AC 20-r \"Scattershot .45\""
origin_tech = "combat=4;syndicate=2" //Crew is not going to get it normally anyways
projectile = /obj/item/projectile/bullet/midbullet
projectile = /obj/projectile/bullet/midbullet
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg
equip_cooldown = 1 SECONDS
name = "\improper Ultra AC 2"
icon_state = "mecha_uac2"
origin_tech = "combat=4"
projectile = /obj/item/projectile/bullet/weakbullet3
projectile = /obj/projectile/bullet/weakbullet3
fire_sound = 'sound/weapons/gunshots/gunshot_mg.ogg'
projectiles = 300
projectile_energy_cost = 20
@@ -365,7 +365,7 @@
name = "\improper SRM-8 Light Missile Rack"
icon_state = "mecha_missilerack_six"
origin_tech = "combat=5;materials=4;engineering=4"
projectile = /obj/item/projectile/missile/light
projectile = /obj/projectile/missile/light
fire_sound = 'sound/effects/bang.ogg'
projectiles = 6
projectile_energy_cost = 1000
@@ -376,7 +376,7 @@
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/heavy
name = "\improper SRX-13 Heavy Missile Launcher"
icon_state = "mecha_missilerack"
projectile = /obj/item/projectile/missile
projectile = /obj/projectile/missile
projectiles = 9
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
@@ -564,7 +564,7 @@
righthand_file = 'icons/mob/inhands/guns_righthand.dmi'
energy_drain = 30
origin_tech = "materials=3;plasmatech=4;engineering=3"
projectile = /obj/item/projectile/plasma/adv/mech
projectile = /obj/projectile/plasma/adv/mech
fire_sound = 'sound/weapons/laser.ogg'
harmful = TRUE
equip_cooldown = 1 SECONDS
@@ -579,7 +579,7 @@
name = "\improper \"Little boy\" Mining Grenade Launcher"
icon_state = "mining_launcher"
origin_tech = "combat=5;materials=4;engineering=4"
projectile = /obj/item/projectile/bullet/reusable/mining_bomb/mecha
projectile = /obj/projectile/bullet/reusable/mining_bomb/mecha
fire_sound = 'sound/effects/bang.ogg'
energy_drain = 150 // cost a lot, but powerful miner tool
equip_cooldown = 2 SECONDS
+1 -1
View File
@@ -642,7 +642,7 @@
add_attack_logs(locateUID(I.thrownby), OCCUPANT_LOGGING, "threw [AM] at mech [src]")
. = ..()
/obj/mecha/bullet_act(obj/item/projectile/Proj) //wrapper
/obj/mecha/bullet_act(obj/projectile/Proj) //wrapper
log_message("Hit by projectile. Type: [Proj.name]([Proj.flag]).")
add_attack_logs(Proj.firer, OCCUPANT_LOGGING, "shot [Proj.name]([Proj.flag]) at mech [src]")
if(Proj.shield_buster && istype(selected, /obj/item/mecha_parts/mecha_equipment/pulse_shield))
+1 -1
View File
@@ -464,7 +464,7 @@
var/turf/U = get_turf(target)
if(!T || !U)
return
var/obj/item/projectile/temp/basilisk/O = new /obj/item/projectile/temp/basilisk(T)
var/obj/projectile/temp/basilisk/O = new /obj/projectile/temp/basilisk(T)
playsound(get_turf(src), 'sound/weapons/taser2.ogg', 75, TRUE)
if(drops_core)
O.stun = 0.5 SECONDS
@@ -129,8 +129,8 @@
causes_coughing = TRUE
/obj/effect/particle_effect/smoke/bad/CanPass(atom/movable/mover, border_dir)
if(istype(mover, /obj/item/projectile/beam))
var/obj/item/projectile/beam/B = mover
if(istype(mover, /obj/projectile/beam))
var/obj/projectile/beam/B = mover
B.damage = (B.damage / 2)
return TRUE
+1 -1
View File
@@ -61,7 +61,7 @@
armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, RAD = 100, FIRE = 100, ACID = 100)
// Most of these overrides procs below are overkill, but better safe than sorry.
/obj/effect/abstract/bullet_act(obj/item/projectile/P)
/obj/effect/abstract/bullet_act(obj/projectile/P)
return
/obj/effect/abstract/decompile_act(obj/item/matter_decompiler/C, mob/user)
+3 -3
View File
@@ -286,10 +286,10 @@
* Creates an explosion of shrapnel at a turf.
* - /turf/epicenter - where the explosion occurs
* - shrapnel_number - the amount of shrapnel to create
* - /obj/item/projectile/shrapnel_type - the type of shrapnel bullets to shoot
* - /obj/projectile/shrapnel_type - the type of shrapnel bullets to shoot
* - chance_to_hit_same_turf - the probability to hit someone on the same turf, doubled for someone lying down
*/
/proc/create_shrapnel(turf/epicenter, shrapnel_number = 10, obj/item/projectile/shrapnel_type = /obj/item/projectile/bullet/shrapnel, chance_to_hit_same_turf = 50)
/proc/create_shrapnel(turf/epicenter, shrapnel_number = 10, obj/projectile/shrapnel_type = /obj/projectile/bullet/shrapnel, chance_to_hit_same_turf = 50)
epicenter = get_turf(epicenter)
if(!epicenter || !shrapnel_number || !shrapnel_type)
return
@@ -306,7 +306,7 @@
mob_lying_on_turf = M
for(var/i in 1 to shrapnel_number)
var/obj/item/projectile/Shrapnel = new shrapnel_type(epicenter)
var/obj/projectile/Shrapnel = new shrapnel_type(epicenter)
// You can't just stand over a shrapnel explosion to avoid it
if(mob_standing_on_turf && prob(chance_to_hit_same_turf))
+2
View File
@@ -217,6 +217,8 @@ GLOBAL_DATUM_INIT(welding_sparks, /mutable_appearance, mutable_appearance('icons
new path(src)
if(isstorage(loc)) //marks all items in storage as being such
in_storage = TRUE
if(sharp)
AddComponent(/datum/component/surgery_initiator)
/// This proc is used to add text for items with ABSTRACT flag after default examine text.
/obj/item/proc/customised_abstract_text(mob/living/carbon/owner)
+1 -1
View File
@@ -64,7 +64,7 @@
if(prob(I.force))
push_over()
/obj/item/cardboard_cutout/bullet_act(obj/item/projectile/P)
/obj/item/cardboard_cutout/bullet_act(obj/projectile/P)
visible_message("<span class='danger'>[src] is hit by [P]!</span>")
playsound(src, 'sound/weapons/slice.ogg', 50, 1)
if(prob(P.damage))
+1 -1
View File
@@ -49,7 +49,7 @@
if(prob(50))
qdel(src)
/obj/item/latexballon/bullet_act(obj/item/projectile/P)
/obj/item/latexballon/bullet_act(obj/projectile/P)
if(!P.nodamage)
burst()
return ..()
+3 -3
View File
@@ -78,11 +78,11 @@
#define DECALTYPE_SCORCH 1
#define DECALTYPE_BULLET 2
/obj/item/target/bullet_act(obj/item/projectile/P)
/obj/item/target/bullet_act(obj/projectile/P)
var/p_x = P.p_x + pick(0,0,0,0,0,-1,1) // really ugly way of coding "sometimes offset P.p_x!"
var/p_y = P.p_y + pick(0,0,0,0,0,-1,1)
var/decaltype = DECALTYPE_SCORCH
if(istype(P, /obj/item/projectile/bullet))
if(istype(P, /obj/projectile/bullet))
decaltype = DECALTYPE_BULLET
var/icon/C = icon(icon, icon_state)
@@ -96,7 +96,7 @@
bullet_hole.pixel_x = p_x - 1 //offset correction
bullet_hole.pixel_y = p_y - 1
if(decaltype == DECALTYPE_SCORCH)
if(P.damage >= 20 || istype(P, /obj/item/projectile/beam/practice))
if(P.damage >= 20 || istype(P, /obj/projectile/beam/practice))
bullet_hole.dir = pick(NORTH,SOUTH,EAST,WEST) // random scorch design. light_scorch does not have different directions
else
bullet_hole.icon_state = "light_scorch"
@@ -20,12 +20,12 @@
/obj/item/gun/projectile/c_foam_launcher/update_icon_state()
icon_state = "c_foam_launcher[magazine ? "_loaded" : ""]"
/obj/item/projectile/c_foam
/obj/projectile/c_foam
name = "blob of foam"
icon_state = "foam_blob"
damage = 0
/obj/item/projectile/c_foam/on_hit(atom/target, blocked, hit_zone)
/obj/projectile/c_foam/on_hit(atom/target, blocked, hit_zone)
. = ..()
if(isairlock(target))
var/obj/machinery/door/airlock = target
@@ -117,7 +117,7 @@
TED.pass_mind(M)
/obj/item/projectile/energy/chrono_beam
/obj/projectile/energy/chrono_beam
name = "eradication beam"
icon_state = "chronobolt"
range = CHRONO_BEAM_RANGE
@@ -125,21 +125,21 @@
nodamage = 1
var/obj/item/gun/energy/chrono_gun/gun = null
/obj/item/projectile/energy/chrono_beam/fire()
/obj/projectile/energy/chrono_beam/fire()
gun = firer.get_active_hand()
if(istype(gun))
return ..()
else
return 0
/obj/item/projectile/energy/chrono_beam/on_hit(atom/target)
/obj/projectile/energy/chrono_beam/on_hit(atom/target)
if(target && gun && isliving(target))
var/obj/structure/chrono_field/F = new(target.loc, target, gun)
gun.field_connect(F)
/obj/item/ammo_casing/energy/chrono_beam
name = "eradication beam"
projectile_type = /obj/item/projectile/energy/chrono_beam
projectile_type = /obj/projectile/energy/chrono_beam
muzzle_flash_color = null
icon = 'icons/obj/projectiles.dmi'
icon_state = "chronobolt"
@@ -228,9 +228,9 @@
qdel(src)
/obj/structure/chrono_field/bullet_act(obj/item/projectile/P)
if(istype(P, /obj/item/projectile/energy/chrono_beam))
var/obj/item/projectile/energy/chrono_beam/beam = P
/obj/structure/chrono_field/bullet_act(obj/projectile/P)
if(istype(P, /obj/projectile/energy/chrono_beam))
var/obj/projectile/energy/chrono_beam/beam = P
var/obj/item/gun/energy/chrono_gun/Pgun = beam.gun
if(Pgun && istype(Pgun))
Pgun.field_connect(src)
@@ -292,7 +292,7 @@
create_with_tank = TRUE
/obj/item/flamethrower/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
var/obj/item/projectile/P = hitby
var/obj/projectile/P = hitby
if(damage && attack_type == PROJECTILE_ATTACK && P.damage_type != STAMINA && prob(15))
owner.visible_message("<span class='danger'>[attack_text] hits the fueltank on [owner]'s [src], rupturing it! What a shot!</span>")
var/turf/target_turf = get_turf(owner)
@@ -115,7 +115,7 @@
prime()
/obj/item/grenade/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
var/obj/item/projectile/P = hitby
var/obj/projectile/P = hitby
if(damage && attack_type == PROJECTILE_ATTACK && P.damage_type != STAMINA && prob(15))
owner.visible_message("<span class='userdanger'>[hitby] hits [owner]'s [name], setting it off! What a shot!</span>")
var/turf/T = get_turf(src)
@@ -8,7 +8,7 @@
/// How much shrapnel the grenade will launch.
var/shrapnel_contained = 20
/// The type of projectile that will fired.
var/embedded_type = /obj/item/projectile/bullet/shrapnel
var/embedded_type = /obj/projectile/bullet/shrapnel
/obj/item/grenade/frag/prime()
update_mob()
@@ -22,7 +22,7 @@
icon_state = "stinger"
modifiable_timer = FALSE
shrapnel_contained = 50
embedded_type = /obj/item/projectile/bullet/pellet/rubber/stinger
embedded_type = /obj/projectile/bullet/pellet/rubber/stinger
/obj/item/grenade/frag/stinger/prime()
update_mob()
@@ -33,7 +33,7 @@
/**
* Shrapnel that flies through the air and hits you
*/
/obj/item/projectile/bullet/shrapnel
/obj/projectile/bullet/shrapnel
name = "shrapnel"
icon_state = "magspear"
gender = PLURAL
@@ -42,7 +42,7 @@
var/embed_prob = 100 //reduced by armor
var/embedded_type = /obj/item/shrapnel
/obj/item/projectile/bullet/shrapnel/on_hit(atom/target, blocked)
/obj/projectile/bullet/shrapnel/on_hit(atom/target, blocked)
. = ..()
var/obj/item/new_possible_embed = new embedded_type(get_turf(src)) // drop it on the floor if we hit somethig non-living
if(!.)
@@ -56,7 +56,7 @@
return
human.try_embed_object(new_possible_embed)
/obj/item/projectile/bullet/shrapnel/on_range()
/obj/projectile/bullet/shrapnel/on_range()
var/obj/item/we_missed = new embedded_type(get_turf(src)) // we missed, lets toss the shrapnel
var/range = gaussian(4, 2)
if(range > 0)
@@ -311,7 +311,7 @@
if(!.) // they did not block the attack
return
if(isprojectile(hitby))
var/obj/item/projectile/P = hitby
var/obj/projectile/P = hitby
if(P.reflectability == REFLECTABILITY_ENERGY)
owner.visible_message("<span class='danger'>[owner] parries [attack_text] with [src]!</span>")
add_attack_logs(P.firer, src, "hit by [P.type] but got parried by [src]")
+1 -1
View File
@@ -94,7 +94,7 @@
/obj/item/shield/energy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(isprojectile(hitby))
var/obj/item/projectile/P = hitby
var/obj/projectile/P = hitby
if(P.shield_buster && active)
toggle(owner, TRUE)
to_chat(owner, "<span class='warning'>[hitby] overloaded your [src]!</span>")
+1 -1
View File
@@ -85,7 +85,7 @@
if(3)
take_damage(rand(10, 90), BRUTE, BOMB, 0)
/obj/bullet_act(obj/item/projectile/P)
/obj/bullet_act(obj/projectile/P)
. = ..()
playsound(src, P.hitsound, 50, TRUE)
visible_message("<span class='danger'>[src] is hit by \a [P]!</span>")
+1 -3
View File
@@ -60,8 +60,6 @@
armor = getArmor()
else if(!istype(armor, /datum/armor))
stack_trace("Invalid type [armor.type] found in .armor during /obj Initialize()")
if(sharp)
AddComponent(/datum/component/surgery_initiator)
if(obj_integrity == null)
obj_integrity = max_integrity
@@ -296,7 +294,7 @@
C.take_organ_damage(damage)
C.KnockDown(3 SECONDS)
/obj/handle_ricochet(obj/item/projectile/P)
/obj/handle_ricochet(obj/projectile/P)
. = ..()
if(. && receive_ricochet_damage_coeff)
// pass along receive_ricochet_damage_coeff damage to the structure for the ricochet
@@ -50,7 +50,7 @@
igniting = FALSE
return ITEM_INTERACT_COMPLETE
/obj/structure/closet/coffin/vampire/bullet_act(obj/item/projectile/P)
/obj/structure/closet/coffin/vampire/bullet_act(obj/projectile/P)
if(!P.immolate)
return ..()
fire_act()
+4 -4
View File
@@ -106,11 +106,11 @@
max_integrity = 10
allow_walk = FALSE
/obj/structure/holosign/barrier/cyborg/bullet_act(obj/item/projectile/P)
/obj/structure/holosign/barrier/cyborg/bullet_act(obj/projectile/P)
take_damage((P.damage / 5) , BRUTE, MELEE, 1) //Doesn't really matter what damage flag it is.
if(istype(P, /obj/item/projectile/energy/electrode))
if(istype(P, /obj/projectile/energy/electrode))
take_damage(10, BRUTE, MELEE, 1) //Tasers aren't harmful.
if(istype(P, /obj/item/projectile/beam/disabler))
if(istype(P, /obj/projectile/beam/disabler))
take_damage(5, BRUTE, MELEE, 1) //Disablers aren't harmful.
/obj/structure/holosign/barrier/cyborg/hacked
@@ -119,7 +119,7 @@
max_integrity = 20
var/shockcd = 0
/obj/structure/holosign/barrier/cyborg/hacked/bullet_act(obj/item/projectile/P)
/obj/structure/holosign/barrier/cyborg/hacked/bullet_act(obj/projectile/P)
take_damage(P.damage, BRUTE, MELEE, 1) //Yeah no this doesn't get projectile resistance.
/obj/structure/holosign/barrier/cyborg/hacked/proc/cooldown()
@@ -47,7 +47,7 @@ GLOBAL_LIST_EMPTY(tendrils)
. = ..()
SEND_SIGNAL(src, COMSIG_SPAWNER_SET_TARGET, user)
/obj/structure/spawner/lavaland/bullet_act(obj/item/projectile/P)
/obj/structure/spawner/lavaland/bullet_act(obj/projectile/P)
. = ..()
if(P.firer)
SEND_SIGNAL(src, COMSIG_SPAWNER_SET_TARGET, P.firer)
+2 -2
View File
@@ -14,10 +14,10 @@
if(mapload)
anchored = TRUE
/obj/structure/reflector/bullet_act(obj/item/projectile/P)
/obj/structure/reflector/bullet_act(obj/projectile/P)
var/turf/reflector_turf = get_turf(src)
var/turf/reflect_turf
if(!istype(P, /obj/item/projectile/beam))
if(!istype(P, /obj/projectile/beam))
return ..()
var/new_dir = get_reflection(dir, P.dir)
if(new_dir && anchored)
+1 -1
View File
@@ -94,7 +94,7 @@
if(exposed_temperature > 300)
PlasmaBurn(exposed_temperature)
/obj/structure/statue/plasma/bullet_act(obj/item/projectile/P)
/obj/structure/statue/plasma/bullet_act(obj/projectile/P)
if(!QDELETED(src)) //wasn't deleted by the projectile's effects.
if(!P.nodamage && ((P.damage_type == BURN) || (P.damage_type == BRUTE)))
if(P.firer)
+2 -2
View File
@@ -129,7 +129,7 @@
return
/obj/structure/table/CanPass(atom/movable/mover, border_dir)
if(istype(mover,/obj/item/projectile))
if(istype(mover,/obj/projectile))
return check_cover(mover, border_dir)
var/mob/living/living_mover = mover
@@ -163,7 +163,7 @@
* * P - The projectile trying to cross.
* * proj_dir - The incoming direction of the projectile.
*/
/obj/structure/table/proc/check_cover(obj/item/projectile/P, proj_dir)
/obj/structure/table/proc/check_cover(obj/projectile/P, proj_dir)
. = TRUE
if(!flipped)
return
+1 -1
View File
@@ -17,7 +17,7 @@
/obj/docking_port,
/obj/structure/lattice,
/obj/structure/stone_tile,
/obj/item/projectile,
/obj/projectile,
/obj/effect/portal,
/obj/effect/hotspot,
/obj/effect/landmark,
+3 -3
View File
@@ -124,12 +124,12 @@
if(exposed_temperature > 300)
PlasmaBurn(exposed_temperature)
/turf/simulated/wall/mineral/plasma/bullet_act(obj/item/projectile/Proj)
/turf/simulated/wall/mineral/plasma/bullet_act(obj/projectile/Proj)
if(Proj.damage == 0)//lasertag guns and so on don't set off plasma anymore. can't use nodamage here because lasertag guns actually don't have it.
return
if(istype(Proj,/obj/item/projectile/beam))
if(istype(Proj,/obj/projectile/beam))
PlasmaBurn(2500)
else if(istype(Proj,/obj/item/projectile/ion))
else if(istype(Proj,/obj/projectile/ion))
PlasmaBurn(500)
..()
+2 -2
View File
@@ -16,7 +16,7 @@
new /obj/effect/temp_visual/cult/turf(src)
icon_state = GET_CULT_DATA(cult_wall_icon_state, initial(icon_state))
/turf/simulated/wall/cult/bullet_act(obj/item/projectile/Proj)
/turf/simulated/wall/cult/bullet_act(obj/projectile/Proj)
. = ..()
new /obj/effect/temp_visual/cult/turf(src)
@@ -58,7 +58,7 @@
new /obj/effect/temp_visual/ratvar/wall(src)
new /obj/effect/temp_visual/ratvar/beam(src)
/turf/simulated/wall/clockwork/bullet_act(obj/item/projectile/Proj)
/turf/simulated/wall/clockwork/bullet_act(obj/projectile/Proj)
. = ..()
new /obj/effect/temp_visual/ratvar/wall(get_turf(src))
new /obj/effect/temp_visual/ratvar/beam(get_turf(src))
+2 -2
View File
@@ -206,8 +206,8 @@
else if(our_rpd.mode == RPD_DELETE_MODE)
our_rpd.delete_all_pipes(user, src)
/turf/bullet_act(obj/item/projectile/Proj)
if(istype(Proj, /obj/item/projectile/bullet/gyro))
/turf/bullet_act(obj/projectile/Proj)
if(istype(Proj, /obj/projectile/bullet/gyro))
explosion(src, -1, 0, 2, cause = "[Proj.type] fired by [key_name(Proj.firer)] (hit turf)")
..()
return FALSE
@@ -253,7 +253,7 @@
/obj/item/ammo_casing/magic/tentacle
name = "tentacle"
desc = "a tentacle."
projectile_type = /obj/item/projectile/tentacle
projectile_type = /obj/projectile/tentacle
caliber = "tentacle"
icon = 'icons/obj/projectiles.dmi'
icon_state = "tentacle_end"
@@ -269,7 +269,7 @@
gun = null
return ..()
/obj/item/projectile/tentacle
/obj/projectile/tentacle
name = "tentacle"
icon_state = "tentacle_end"
damage = 0
@@ -278,11 +278,11 @@
reflectability = REFLECTABILITY_NEVER //Let us not reflect this ever. It's not quite a bullet, and a cling should never wrap its tentacle around itself, it controls its body well
var/obj/item/ammo_casing/magic/tentacle/source //the item that shot it
/obj/item/projectile/tentacle/New(obj/item/ammo_casing/magic/tentacle/tentacle_casing)
/obj/projectile/tentacle/New(obj/item/ammo_casing/magic/tentacle/tentacle_casing)
source = tentacle_casing
..()
/obj/item/projectile/tentacle/fire(setAngle)
/obj/projectile/tentacle/fire(setAngle)
if(firer)
chain = firer.Beam(src, icon_state = "tentacle", time = INFINITY, maxdistance = INFINITY)
..()
@@ -298,7 +298,7 @@
I.melee_attack_chain(src, C)//Hits the victim with whatever they are holding that is no the zero force tentacle
/obj/item/projectile/tentacle/on_hit(atom/target, blocked = 0)
/obj/projectile/tentacle/on_hit(atom/target, blocked = 0)
var/mob/living/carbon/human/H = firer
source.gun.hit_something = TRUE
source.gun.check_should_delete()
@@ -369,7 +369,7 @@
C.throw_at(get_step_towards(H,C), 8, 2, callback=CALLBACK(H, TYPE_PROC_REF(/mob, tentacle_stab), C))
return TRUE
/obj/item/projectile/tentacle/Destroy()
/obj/projectile/tentacle/Destroy()
qdel(chain)
source = null
return ..()
@@ -133,7 +133,7 @@
/obj/item/ammo_casing/magic/grapple_ammo
name = "grapple"
desc = "a hand"
projectile_type = /obj/item/projectile/tether/flayer
projectile_type = /obj/projectile/tether/flayer
icon = 'icons/obj/clothing/modsuit/mod_modules.dmi'
icon_state = "flayer_claw"
caliber = "grapple"
@@ -149,7 +149,7 @@
. = ..()
grapple = null
/obj/item/projectile/tether/flayer
/obj/projectile/tether/flayer
name = "Grapple Arm"
range = 10
damage = 15
@@ -160,20 +160,20 @@
/// The ammo this came from
var/obj/item/ammo_casing/magic/grapple_ammo/ammo
/obj/item/projectile/tether/flayer/Initialize(mapload, obj/item/ammo_casing/magic/grapple_ammo/grapple_casing)
/obj/projectile/tether/flayer/Initialize(mapload, obj/item/ammo_casing/magic/grapple_ammo/grapple_casing)
. = ..()
ammo = grapple_casing
/obj/item/projectile/tether/flayer/fire(setAngle)
/obj/projectile/tether/flayer/fire(setAngle)
. = ..()
make_chain()
SEND_SIGNAL(firer, COMSIG_FLAYER_RETRACT_IMPLANTS)
/obj/item/projectile/tether/flayer/Destroy()
/obj/projectile/tether/flayer/Destroy()
. = ..()
ammo = null
/obj/item/projectile/tether/flayer/on_hit(atom/target, blocked = 0)
/obj/projectile/tether/flayer/on_hit(atom/target, blocked = 0)
. = ..()
playsound(target, 'sound/items/zip.ogg', 75, TRUE)
if(isliving(target) && blocked < 100)
@@ -129,7 +129,7 @@
desc = "Summon a hand of demonic energy, snaring and throwing its target around, based on your intent. Disarm pushes, grab pulls."
gain_desc = "You have gained the ability to snare and disrupt people with demonic appendages."
base_cooldown = 30 SECONDS
fireball_type = /obj/item/projectile/magic/demonic_grasp
fireball_type = /obj/projectile/magic/demonic_grasp
selection_activated_message = "<span class='notice'>You raise your hand, full of demonic energy! <B>Left-click to cast at a target!</B></span>"
selection_deactivated_message = "<span class='notice'>You re-absorb the energy...for now.</span>"
@@ -149,17 +149,17 @@
V.required_blood = 20
return V
/obj/item/projectile/magic/demonic_grasp
/obj/projectile/magic/demonic_grasp
name = "demonic grasp"
// parry this you filthy casual
reflectability = REFLECTABILITY_NEVER
icon_state = null
/obj/item/projectile/magic/demonic_grasp/pixel_move(trajectory_multiplier)
/obj/projectile/magic/demonic_grasp/pixel_move(trajectory_multiplier)
. = ..()
new /obj/effect/temp_visual/demonic_grasp(loc)
/obj/item/projectile/magic/demonic_grasp/on_hit(atom/target, blocked, hit_zone)
/obj/projectile/magic/demonic_grasp/on_hit(atom/target, blocked, hit_zone)
. = ..()
if(!.)
return
@@ -184,7 +184,7 @@
throw_target = get_step(firer, get_dir(firer, L))
L.throw_at(throw_target, 2, 5, spin = FALSE, diagonals_first = TRUE, callback = CALLBACK(src, PROC_REF(create_snare), L)) // pull towards
/obj/item/projectile/magic/demonic_grasp/proc/create_snare(mob/target)
/obj/projectile/magic/demonic_grasp/proc/create_snare(mob/target)
new /obj/effect/temp_visual/demonic_snare(target.loc)
/obj/effect/temp_visual/demonic_grasp
@@ -323,7 +323,7 @@
for(var/mob/living/L in view(8, owner))
if(L.affects_vampire(owner))
L.adjust_bodytemperature(-3 * TEMPERATURE_DAMAGE_COEFFICIENT) //The dark is cold and unforgiving. Equivelnt to -60 with previous values.
for(var/obj/item/projectile/P in view(8, owner))
for(var/obj/projectile/P in view(8, owner))
if(P.flag == ENERGY || P.flag == LASER)
P.damage *= 0.7
+1 -1
View File
@@ -24,7 +24,7 @@
/turf/cordon/TerraformTurf(path, list/new_baseturfs, flags)
return
/turf/cordon/bullet_act(obj/item/projectile/hitting_projectile, def_zone, piercing_hit)
/turf/cordon/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit)
SHOULD_CALL_PARENT(FALSE) // Fuck you
return
@@ -229,7 +229,7 @@
ranged = TRUE
retreat_distance = 5
minimum_distance = 5
projectiletype = /obj/item/projectile/neurotox
projectiletype = /obj/projectile/neurotox
projectilesound = 'sound/weapons/pierce.ogg'
// Below here is ruin specific code
@@ -37,7 +37,7 @@
icon_state = "syndicate_harbinger"
icon_living = "syndicate_harbinger"
speak_emote = list("snarls")
projectiletype = /obj/item/projectile/bullet/heavybullet
projectiletype = /obj/projectile/bullet/heavybullet
projectilesound = 'sound/weapons/gunshots/gunshot_rifle.ogg'
internal_gps = null
faction = list("syndicate", "spawned_corpse")
@@ -190,7 +190,7 @@ GLOBAL_LIST_EMPTY(telecomms_trap_tank)
GLOB.telecomms_trap_tank -= src
return ..()
/obj/structure/telecomms_trap_tank/bullet_act(obj/item/projectile/P)
/obj/structure/telecomms_trap_tank/bullet_act(obj/projectile/P)
explode()
/obj/structure/telecomms_trap_tank/proc/explode()
@@ -337,7 +337,7 @@ GLOBAL_LIST_EMPTY(telecomms_trap_tank)
maxHealth = 200
faction = list("malf_drone")
speed = 0.5
projectile_type = /obj/item/projectile/beam/disabler/weak
projectile_type = /obj/projectile/beam/disabler/weak
projectile_sound = 'sound/weapons/taser2.ogg'
ranged_burst_count = 2
gold_core_spawnable = NO_SPAWN // Could you imagine xenobio with this? lmao.
@@ -150,7 +150,7 @@
/// Datum which keeps us hanging out with our parent
var/datum/movement_detector/tracker
/// Type of projectile we fire
var/projectile_type = /obj/item/projectile/baby_watcher_blast
var/projectile_type = /obj/projectile/baby_watcher_blast
/// Sound to make when we shoot
var/projectile_sound = 'sound/weapons/pierce.ogg'
/// Time between taking potshots at goliaths
@@ -193,7 +193,7 @@
var/turf/U = get_turf(target)
if(!T || !U)
return
var/obj/item/projectile/O = new projectile_type(T)
var/obj/projectile/O = new projectile_type(T)
playsound(get_turf(src), projectile_sound, 75, TRUE)
O.firer = parent // no hitting owner.
O.current = T
@@ -253,6 +253,6 @@
/// Beam fired by a baby watcher, doesn't actually do less damage than its parent
/obj/item/projectile/baby_watcher_blast
/obj/projectile/baby_watcher_blast
name = "hatchling beam"
icon_state = "ice_2"
+3 -3
View File
@@ -454,8 +454,8 @@
/obj/item/clothing/suit/armor/reactive/proc/reaction_check(hitby)
if(prob(hit_reaction_chance))
if(isprojectile(hitby))
var/obj/item/projectile/P = hitby
if(istype(P, /obj/item/projectile/ion))
var/obj/projectile/P = hitby
if(istype(P, /obj/projectile/ion))
return FALSE
if(!P.nodamage || P.stun || P.weaken)
return TRUE
@@ -550,7 +550,7 @@
var/turf/U = get_turf(target)
if(!T || !U)
return
var/obj/item/projectile/temp/basilisk/O = new /obj/item/projectile/temp/basilisk(T)
var/obj/projectile/temp/basilisk/O = new /obj/projectile/temp/basilisk(T)
playsound(get_turf(src), 'sound/weapons/taser2.ogg', 75, TRUE)
O.current = T
O.yo = U.y - T.y
+2 -2
View File
@@ -75,8 +75,8 @@ GLOBAL_LIST_EMPTY(blob_minions)
/obj/structure/blob/blob_act(obj/structure/blob/B)
return
/obj/structure/blob/bullet_act(obj/item/projectile/P)
if(istype(P, /obj/item/projectile/kinetic))
/obj/structure/blob/bullet_act(obj/projectile/P)
if(istype(P, /obj/projectile/kinetic))
P.damage /= 2
return ..()
+1 -1
View File
@@ -225,7 +225,7 @@
. = ..()
SEND_SIGNAL(src, COMSIG_SPAWNER_SET_TARGET, user)
/obj/structure/spawner/nether/demon_incursion/bullet_act(obj/item/projectile/P)
/obj/structure/spawner/nether/demon_incursion/bullet_act(obj/projectile/P)
. = ..()
if(P.firer)
SEND_SIGNAL(src, COMSIG_SPAWNER_SET_TARGET, P.firer)
+4 -4
View File
@@ -501,7 +501,7 @@
/obj/effect/hallucination/sniper/proc/fire_bullet(turf/shot_loc, mob/living/carbon/target)
// Fire the bullet
var/obj/item/projectile/bullet/sniper/penetrator/hallucination/bullet = new(shot_loc)
var/obj/projectile/bullet/sniper/penetrator/hallucination/bullet = new(shot_loc)
bullet.hallucinator = target
bullet.def_zone = BODY_ZONE_HEAD
bullet.suppressed = TRUE
@@ -537,7 +537,7 @@
hallucination_icon_state = pick("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7")
/obj/item/projectile/bullet/sniper/penetrator/hallucination
/obj/projectile/bullet/sniper/penetrator/hallucination
nodamage = TRUE
invisibility = INVISIBILITY_MAXIMUM // You no see boolet
/// The hallucinator
@@ -545,7 +545,7 @@
/// Handles only the victim seeing it
var/image/bullet_image = null
/obj/item/projectile/bullet/sniper/penetrator/hallucination/on_hit(atom/target, blocked, hit_zone)
/obj/projectile/bullet/sniper/penetrator/hallucination/on_hit(atom/target, blocked, hit_zone)
if(!isliving(target))
return
if(target != hallucinator)
@@ -560,7 +560,7 @@
new /obj/effect/hallucination/sniper_bloodsplatter(get_turf(src), hit_target)
to_chat(hit_target, "<span class='userdanger'>You're shot by \a [src][organ_hit_text]!</span>")
/obj/item/projectile/bullet/sniper/penetrator/hallucination/Bump(atom/A, yes)
/obj/projectile/bullet/sniper/penetrator/hallucination/Bump(atom/A, yes)
if(!yes) // prevents double bumps.
return
var/turf/target_turf = get_turf(A)
+3 -3
View File
@@ -169,13 +169,13 @@
update_state()
/obj/machinery/hydroponics/bullet_act(obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables.
/obj/machinery/hydroponics/bullet_act(obj/projectile/Proj) //Works with the Somatoray to modify plant variables.
if(!myseed)
return ..()
if(istype(Proj ,/obj/item/projectile/energy/floramut))
if(istype(Proj ,/obj/projectile/energy/floramut))
mut_beamed = TRUE
return ..()
else if(istype(Proj ,/obj/item/projectile/energy/florayield))
else if(istype(Proj ,/obj/projectile/energy/florayield))
yield_beamed = TRUE
return ..()
else
+2 -2
View File
@@ -174,8 +174,8 @@
if("weed chance")
adjust_weed_chance(mod)
/obj/item/seeds/bullet_act(obj/item/projectile/Proj) // Works with the Somatoray to modify plant variables.
if(istype(Proj, /obj/item/projectile/energy/florayield))
/obj/item/seeds/bullet_act(obj/projectile/Proj) // Works with the Somatoray to modify plant variables.
if(istype(Proj, /obj/projectile/energy/florayield))
var/rating = 1
if(istype(loc, /obj/machinery/hydroponics))
var/obj/machinery/hydroponics/H = loc
@@ -118,7 +118,7 @@
var/turf/proj_turf = get_turf_for_projectile(user)
if(!isturf(proj_turf))
return
var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(proj_turf)
var/obj/projectile/destabilizer/D = new /obj/projectile/destabilizer(proj_turf)
for(var/t in trophies)
var/obj/item/crusher_trophy/T = t
T.on_projectile_fire(D, user)
@@ -197,7 +197,7 @@
update_action_buttons()
//destablizing force
/obj/item/projectile/destabilizer
/obj/projectile/destabilizer
name = "destabilizing force"
icon_state = "pulse1"
nodamage = TRUE
@@ -207,11 +207,11 @@
log_override = TRUE
var/obj/item/kinetic_crusher/hammer_synced
/obj/item/projectile/destabilizer/Destroy()
/obj/projectile/destabilizer/Destroy()
hammer_synced = null
return ..()
/obj/item/projectile/destabilizer/on_hit(atom/target, blocked = FALSE)
/obj/projectile/destabilizer/on_hit(atom/target, blocked = FALSE)
if(isliving(target))
var/mob/living/L = target
var/had_effect = (L.has_status_effect(STATUS_EFFECT_CRUSHERMARK)) //used as a boolean
@@ -279,7 +279,7 @@
/obj/item/crusher_trophy/proc/on_melee_hit(mob/living/target, mob/living/user) //the target and the user
return
/obj/item/crusher_trophy/proc/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user) //the projectile fired and the user
/obj/item/crusher_trophy/proc/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user) //the projectile fired and the user
return
/obj/item/crusher_trophy/proc/on_mark_application(mob/living/target, datum/status_effect/crusher_mark/mark, had_mark) //the target, the mark applied, and if the target had a mark before
@@ -346,7 +346,7 @@
/obj/item/crusher_trophy/blaster_tubes/magma_wing/effect_desc()
return "mark detonation to make the next destabilizer shot deal <b>[bonus_value]</b> damage"
/obj/item/crusher_trophy/blaster_tubes/magma_wing/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user)
/obj/item/crusher_trophy/blaster_tubes/magma_wing/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user)
if(deadly_shot)
marker.name = "heated [marker.name]"
marker.icon_state = "lava"
@@ -479,7 +479,7 @@
/obj/item/crusher_trophy/blaster_tubes/effect_desc()
return "mark detonation to make the next destabilizer shot deal <b>[bonus_value]</b> damage but move slower"
/obj/item/crusher_trophy/blaster_tubes/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user)
/obj/item/crusher_trophy/blaster_tubes/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user)
if(deadly_shot)
marker.name = "deadly [marker.name]"
marker.icon_state = "chronobolt"
@@ -34,9 +34,9 @@
ActivationReaction(user, "weapon")
return ..()
/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, "magic", P.damage_type)
return
ActivationReaction(P.firer, P.flag, P.damage_type)
@@ -140,16 +140,16 @@
/// Generates a projectile when interacted with
/obj/machinery/anomalous_crystal/emitter
cooldown_add = 50
var/generated_projectile = /obj/item/projectile/beam/emitter
var/generated_projectile = /obj/projectile/beam/emitter
/obj/machinery/anomalous_crystal/emitter/Initialize(mapload)
. = ..()
generated_projectile = pick(/obj/item/projectile/magic/fireball/infernal,
/obj/item/projectile/bullet/meteorshot, /obj/item/projectile/beam/xray, /obj/item/projectile/colossus)
generated_projectile = pick(/obj/projectile/magic/fireball/infernal,
/obj/projectile/bullet/meteorshot, /obj/projectile/beam/xray, /obj/projectile/colossus)
/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.dir = dir
switch(dir)
if(NORTH)
@@ -349,13 +349,13 @@
/obj/item/ammo_casing/magic/hook
name = "hook"
desc = "a hook."
projectile_type = /obj/item/projectile/hook
projectile_type = /obj/projectile/hook
caliber = "hook"
icon = 'icons/obj/lavaland/artefacts.dmi'
icon_state = "hook"
muzzle_flash_effect = null
/obj/item/projectile/hook
/obj/projectile/hook
name = "hook"
icon_state = "hook"
icon = 'icons/obj/lavaland/artefacts.dmi'
@@ -365,13 +365,13 @@
weaken = 1 SECONDS
knockdown = 6 SECONDS
/obj/item/projectile/hook/fire(setAngle)
/obj/projectile/hook/fire(setAngle)
if(firer)
chain = firer.Beam(src, icon_state = "chain", time = INFINITY, maxdistance = INFINITY)
..()
//TODO: root the firer until the chain returns
/obj/item/projectile/hook/on_hit(atom/target)
/obj/projectile/hook/on_hit(atom/target)
. = ..()
if(isliving(target))
var/mob/living/L = target
@@ -382,7 +382,7 @@
L.forceMove(get_turf(firer))
L.density = old_density
/obj/item/projectile/hook/Destroy()
/obj/projectile/hook/Destroy()
QDEL_NULL(chain)
return ..()
@@ -243,7 +243,7 @@
if(berserk_active)
return
if(isprojectile(hitby))
var/obj/item/projectile/P = hitby
var/obj/projectile/P = hitby
if(P.damage_type == STAMINA)
return //no disabler rage
var/berserk_value = damage * DAMAGE_TO_CHARGE_SCALE
+2 -2
View File
@@ -311,7 +311,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
else
..()
/obj/item/gibtonite/bullet_act(obj/item/projectile/P)
/obj/item/gibtonite/bullet_act(obj/projectile/P)
GibtoniteReaction(P.firer)
..()
@@ -416,7 +416,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
materials = list(MAT_PLASMA = 400)
credits = 80
/obj/item/coin/plasma/bullet_act(obj/item/projectile/P)
/obj/item/coin/plasma/bullet_act(obj/projectile/P)
if(!QDELETED(src) && !P.nodamage && (P.damage_type == BURN))
log_and_set_aflame(P.firer, P)
@@ -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)

Some files were not shown because too many files have changed in this diff Show More