mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-23 12:07:27 +01:00
/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:
@@ -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
|
||||
},
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>"
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -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]")
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user