Merge remote-tracking branch 'citadel/master' into mobility_flags
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
/obj/item/ammo_casing/caseless/arrow
|
||||
name = "wooden arrow"
|
||||
desc = "An arrow made of wood, typically fired from a bow."
|
||||
projectile_type = /obj/item/projectile/bullet/reusable/arrow
|
||||
caliber = "arrow"
|
||||
icon_state = "arrow"
|
||||
throwforce = 3 //good luck hitting someone with the pointy end of the arrow
|
||||
throw_speed = 3
|
||||
@@ -15,15 +15,15 @@
|
||||
. = ..()
|
||||
|
||||
/obj/item/ammo_casing/energy/gravity/repulse
|
||||
projectile_type = /obj/item/projectile/gravityrepulse
|
||||
projectile_type = /obj/item/projectile/gravity/repulse
|
||||
select_name = "repulse"
|
||||
|
||||
/obj/item/ammo_casing/energy/gravity/attract
|
||||
projectile_type = /obj/item/projectile/gravityattract
|
||||
projectile_type = /obj/item/projectile/gravity/attract
|
||||
select_name = "attract"
|
||||
|
||||
/obj/item/ammo_casing/energy/gravity/chaos
|
||||
projectile_type = /obj/item/projectile/gravitychaos
|
||||
projectile_type = /obj/item/projectile/gravity/chaos
|
||||
select_name = "chaos"
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
/obj/item/ammo_box/magazine/internal/bow
|
||||
name = "bow... magazine?" //shouldn't be seeing this
|
||||
ammo_type = /obj/item/ammo_casing/caseless/arrow
|
||||
caliber = "arrow"
|
||||
max_ammo = 1
|
||||
start_empty = 1
|
||||
@@ -15,7 +15,7 @@
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
force = 5
|
||||
item_flags = NEEDS_PERMIT
|
||||
item_flags = NEEDS_PERMIT | NO_ATTACK_CHAIN_SOFT_STAMCRIT
|
||||
attack_verb = list("struck", "hit", "bashed")
|
||||
|
||||
var/fire_sound = "gunshot"
|
||||
@@ -51,6 +51,7 @@
|
||||
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
|
||||
|
||||
var/obj/item/firing_pin/pin = /obj/item/firing_pin //standard firing pin for most guns
|
||||
var/no_pin_required = FALSE //whether the gun can be fired without a pin
|
||||
|
||||
var/obj/item/flashlight/gun_light
|
||||
var/can_flashlight = 0
|
||||
@@ -79,7 +80,10 @@
|
||||
/obj/item/gun/Initialize()
|
||||
. = ..()
|
||||
if(pin)
|
||||
pin = new pin(src)
|
||||
if(no_pin_required)
|
||||
pin = null
|
||||
else
|
||||
pin = new pin(src)
|
||||
if(gun_light)
|
||||
alight = new (src)
|
||||
if(zoomable)
|
||||
@@ -107,6 +111,8 @@
|
||||
|
||||
/obj/item/gun/examine(mob/user)
|
||||
. = ..()
|
||||
if(no_pin_required)
|
||||
return
|
||||
if(pin)
|
||||
. += "It has \a [pin] installed."
|
||||
else
|
||||
@@ -162,6 +168,9 @@
|
||||
return
|
||||
if(firing)
|
||||
return
|
||||
if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) //respect stamina softcrit
|
||||
to_chat(user, "<span class='warning'>You are too exhausted to fire [src]!</span>")
|
||||
return
|
||||
if(flag) //It's adjacent, is the user, or is on the user's person
|
||||
if(target in user.contents) //can't shoot stuff inside us.
|
||||
return
|
||||
@@ -226,6 +235,8 @@
|
||||
return FALSE
|
||||
|
||||
/obj/item/gun/proc/handle_pins(mob/living/user)
|
||||
if(no_pin_required)
|
||||
return TRUE
|
||||
if(pin)
|
||||
if(pin.pin_auth(user) || (pin.obj_flags & EMAGGED))
|
||||
return TRUE
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
/obj/item/gun/ballistic/bow
|
||||
name = "wooden bow"
|
||||
desc = "Some sort of primitive projectile weapon. Used to fire arrows."
|
||||
icon_state = "bow"
|
||||
item_state = "bow"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
weapon_weight = WEAPON_HEAVY //need both hands to fire
|
||||
force = 5
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/bow
|
||||
fire_sound = 'sound/weapons/bowfire.wav'
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
item_flags = NONE
|
||||
casing_ejector = FALSE
|
||||
inaccuracy_modifier = 0.33 //to counteract the innaccuracy from WEAPON_HEAVY, bows are supposed to be accurate but only able to be fired with both hands
|
||||
pin = null
|
||||
no_pin_required = TRUE
|
||||
trigger_guard = TRIGGER_GUARD_NONE //so ashwalkers can use it
|
||||
|
||||
/obj/item/gun/ballistic/bow/shoot_with_empty_chamber()
|
||||
return
|
||||
|
||||
/obj/item/gun/ballistic/bow/chamber_round()
|
||||
chambered = magazine.get_round(1)
|
||||
|
||||
/obj/item/gun/ballistic/bow/afterattack()
|
||||
. = ..()
|
||||
if (chambered)
|
||||
chambered = null
|
||||
magazine.get_round(0)
|
||||
update_icon()
|
||||
|
||||
/obj/item/gun/ballistic/bow/attack_self(mob/living/user)
|
||||
if (chambered)
|
||||
var/obj/item/ammo_casing/AC = magazine.get_round(0)
|
||||
user.put_in_hands(AC)
|
||||
chambered = null
|
||||
to_chat(user, "<span class='notice'>You gently release the bowstring, removing the arrow.</span>")
|
||||
else if (get_ammo())
|
||||
to_chat(user, "<span class='notice'>You draw back the bowstring.</span>")
|
||||
playsound(src, 'sound/weapons/bowdraw.wav', 75, 0) //gets way too high pitched if the freq varies
|
||||
chamber_round()
|
||||
update_icon()
|
||||
|
||||
/obj/item/gun/ballistic/bow/attackby(obj/item/I, mob/user, params)
|
||||
if (magazine.attackby(I, user, params, 1))
|
||||
to_chat(user, "<span class='notice'>You notch the arrow.</span>")
|
||||
update_icon()
|
||||
|
||||
/obj/item/gun/ballistic/bow/update_icon()
|
||||
icon_state = "bow_[get_ammo() ? (chambered ? "firing" : "loaded") : "unloaded"]"
|
||||
|
||||
/obj/item/gun/ballistic/bow/can_shoot()
|
||||
return chambered
|
||||
@@ -61,7 +61,6 @@
|
||||
/obj/item/gun/ballistic/automatic/magrifle/nopin
|
||||
pin = null
|
||||
spawnwithmagazine = FALSE
|
||||
cell_type = /obj/item/stock_parts/cell/magnetic/empty
|
||||
|
||||
/obj/item/gun/ballistic/automatic/magrifle/hyperburst
|
||||
name = "\improper Hyper-Burst Rifle"
|
||||
@@ -100,4 +99,3 @@
|
||||
/obj/item/gun/ballistic/automatic/magrifle/pistol/nopin
|
||||
pin = null
|
||||
spawnwithmagazine = FALSE
|
||||
cell_type = /obj/item/stock_parts/cell/magnetic/pistol/empty
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
/obj/item/gun/ballistic/automatic/pistol/stickman
|
||||
name = "flat gun"
|
||||
desc = "A 2 dimensional gun.. what?"
|
||||
can_suppress = FALSE
|
||||
icon_state = "flatgun"
|
||||
|
||||
/obj/item/gun/ballistic/automatic/pistol/stickman/pickup(mob/living/user)
|
||||
|
||||
@@ -320,10 +320,10 @@
|
||||
if(C.setting == counter_setting)
|
||||
return BULLET_ACT_BLOCK
|
||||
|
||||
var/mob/living/L = target
|
||||
if(!istype(target))
|
||||
if(!isliving(target))
|
||||
return BULLET_ACT_BLOCK
|
||||
|
||||
var/mob/living/L = target
|
||||
switch(hugbox)
|
||||
if(DUEL_HUGBOX_NONE)
|
||||
var/obj/item/bodypart/B = L.get_bodypart(BODY_ZONE_HEAD)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
/obj/item/gun/energy/laser/practice
|
||||
name = "practice laser gun"
|
||||
icon_state = "laser-p"
|
||||
desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice."
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/laser/practice)
|
||||
clumsy_check = 0
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
if(proximity_flag)
|
||||
if(istype(target, /obj/item/gun))
|
||||
var/obj/item/gun/G = target
|
||||
if(G.no_pin_required)
|
||||
return
|
||||
if(G.pin && (force_replace || G.pin.pin_removeable))
|
||||
G.pin.forceMove(get_turf(G))
|
||||
G.pin.gun_remove(user)
|
||||
@@ -69,13 +71,10 @@
|
||||
if(gun)
|
||||
qdel(gun)
|
||||
|
||||
|
||||
|
||||
/obj/item/firing_pin/magic
|
||||
name = "magic crystal shard"
|
||||
desc = "A small enchanted shard which allows magical weapons to fire."
|
||||
|
||||
|
||||
// Test pin, works only near firing range.
|
||||
/obj/item/firing_pin/test_range
|
||||
name = "test-range firing pin"
|
||||
@@ -229,3 +228,16 @@
|
||||
if(gun)
|
||||
gun.pin = null
|
||||
return ..()
|
||||
|
||||
//Station Locked
|
||||
|
||||
/obj/item/firing_pin/away
|
||||
name = "station locked pin"
|
||||
desc = "A firing pin that only will fire when off the station."
|
||||
|
||||
/obj/item/firing_pin/away/pin_auth(mob/living/user)
|
||||
var/area/station_area = get_area(src)
|
||||
if(!station_area || is_station_level(station_area.z))
|
||||
to_chat(user, "<span class='warning'>The pin beeps, refusing to fire.</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -52,7 +52,6 @@
|
||||
var/hitscan = FALSE //Whether this is hitscan. If it is, speed is basically ignored.
|
||||
var/list/beam_segments //assoc list of datum/point or datum/point/vector, start = end. Used for hitscan effect generation.
|
||||
var/datum/point/beam_index
|
||||
var/turf/hitscan_last //last turf touched during hitscanning.
|
||||
var/tracer_type
|
||||
var/muzzle_type
|
||||
var/impact_type
|
||||
@@ -90,6 +89,10 @@
|
||||
var/decayedRange //stores original range
|
||||
var/reflect_range_decrease = 5 //amount of original range that falls off when reflecting, so it doesn't go forever
|
||||
var/is_reflectable = FALSE // Can it be reflected or not?
|
||||
|
||||
/// factor to multiply by for zone accuracy percent.
|
||||
var/zone_accuracy_factor = 1
|
||||
|
||||
//Effects
|
||||
var/stun = 0
|
||||
var/knockdown = 0
|
||||
@@ -185,10 +188,6 @@
|
||||
else
|
||||
new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, bloodtype_to_color())
|
||||
|
||||
if(iscarbon(L) && !HAS_TRAIT(L, TRAIT_NOMARROW))
|
||||
var/mob/living/carbon/C = L
|
||||
C.bleed(damage)
|
||||
else
|
||||
L.add_splatter_floor(target_loca)
|
||||
else if(impact_effect_type && !hitscan)
|
||||
new impact_effect_type(target_loca, hitx, hity)
|
||||
@@ -211,11 +210,8 @@
|
||||
L.on_hit(src)
|
||||
|
||||
var/reagent_note
|
||||
if(reagents && reagents.reagent_list)
|
||||
reagent_note = " REAGENTS:"
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
reagent_note += R.type + " ("
|
||||
reagent_note += num2text(R.volume) + ") "
|
||||
if(reagents)
|
||||
reagent_note = reagents.log_list()
|
||||
|
||||
if(ismob(firer))
|
||||
log_combat(firer, L, "shot", src, reagent_note)
|
||||
@@ -253,7 +249,8 @@
|
||||
return TRUE
|
||||
|
||||
var/distance = get_dist(T, starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations.
|
||||
def_zone = ran_zone(def_zone, max(100-(7*distance), 5)) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use.
|
||||
if(check_zone(def_zone) != BODY_ZONE_CHEST)
|
||||
def_zone = ran_zone(def_zone, max(100-(7*distance), 5) * zone_accuracy_factor) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use.
|
||||
|
||||
if(isturf(A) && hitsound_wall)
|
||||
var/volume = CLAMP(vol_by_damage() + 20, 0, 100)
|
||||
@@ -494,8 +491,6 @@
|
||||
process_homing()
|
||||
var/forcemoved = FALSE
|
||||
for(var/i in 1 to SSprojectiles.global_iterations_per_move)
|
||||
if(QDELETED(src))
|
||||
return
|
||||
trajectory.increment(trajectory_multiplier)
|
||||
var/turf/T = trajectory.return_turf()
|
||||
if(!istype(T))
|
||||
@@ -508,14 +503,16 @@
|
||||
forceMove(T)
|
||||
trajectory_ignore_forcemove = FALSE
|
||||
after_z_change(old, loc)
|
||||
forcemoved = TRUE
|
||||
if(QDELETED(src))
|
||||
return
|
||||
if(!hitscanning)
|
||||
pixel_x = trajectory.return_px()
|
||||
pixel_y = trajectory.return_py()
|
||||
forcemoved = TRUE
|
||||
hitscan_last = loc
|
||||
else if(T != loc)
|
||||
step_towards(src, T)
|
||||
hitscan_last = loc
|
||||
if(QDELETED(src))
|
||||
return
|
||||
if(!hitscanning && !forcemoved)
|
||||
pixel_x = trajectory.return_px() - trajectory.mpx * trajectory_multiplier * SSprojectiles.global_iterations_per_move
|
||||
pixel_y = trajectory.return_py() - trajectory.mpy * trajectory_multiplier * SSprojectiles.global_iterations_per_move
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
/obj/item/projectile/bullet/dart/Initialize()
|
||||
. = ..()
|
||||
create_reagents(50, NO_REACT)
|
||||
create_reagents(50, NO_REACT, NO_REAGENTS_VALUE)
|
||||
|
||||
/obj/item/projectile/bullet/dart/on_hit(atom/target, blocked = FALSE, skip = FALSE)
|
||||
if(iscarbon(target))
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
knockdown = 100
|
||||
dismemberment = 50
|
||||
armour_penetration = 50
|
||||
zone_accuracy_factor = 100 //guarunteed 100%
|
||||
var/breakthings = TRUE
|
||||
|
||||
/obj/item/projectile/bullet/p50/on_hit(atom/target, blocked = 0)
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
/obj/item/projectile/bullet/reusable/arrow
|
||||
name = "wooden arrow"
|
||||
desc = "Woosh!"
|
||||
damage = 15
|
||||
icon_state = "arrow"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/arrow
|
||||
@@ -1,90 +1,65 @@
|
||||
/obj/item/projectile/gravityrepulse
|
||||
/obj/item/projectile/gravity
|
||||
name = "gravity bolt"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "chronofield"
|
||||
hitsound = 'sound/weapons/wave.ogg'
|
||||
damage = 0
|
||||
damage_type = BRUTE
|
||||
nodamage = TRUE
|
||||
var/power = 4
|
||||
var/list/thrown = list() //normally we wouldn't need this but incase on_hit is called multiple times, yeah.. this is a good idea.
|
||||
|
||||
/obj/item/projectile/gravity/Initialize(mapload)
|
||||
. = ..()
|
||||
var/obj/item/ammo_casing/energy/gravity/G = loc
|
||||
if(istype(G))
|
||||
power = min(G.gun.power, 15)
|
||||
|
||||
/obj/item/projectile/gravity/on_hit()
|
||||
. = ..()
|
||||
var/turf/T = get_turf(src)
|
||||
var/list/tothrow = list()
|
||||
var/list/cachedrange = range(T, power)
|
||||
for(var/mob/M in cachedrange)
|
||||
tothrow += M
|
||||
for(var/obj/O in cachedrange)
|
||||
tothrow += O
|
||||
var/safety = 50
|
||||
for(var/i in tothrow)
|
||||
if(!safety)
|
||||
break
|
||||
var/atom/movable/AM = i
|
||||
if((AM == src) || (AM == firer) || (AM.move_resist > MOVE_FORCE_EXTREMELY_STRONG) || AM.anchored || thrown[AM])
|
||||
continue
|
||||
thrown[AM] = TRUE
|
||||
safety--
|
||||
var/target = get_target(T, AM)
|
||||
if(!target)
|
||||
return FALSE
|
||||
AM.throw_at(target, power + 1, 1)
|
||||
for(var/turf/F in range(T,power))
|
||||
new /obj/effect/temp_visual/gravpush(F)
|
||||
|
||||
/obj/item/projectile/gravity/proc/get_target(turf/origin, atom/movable/AM)
|
||||
return origin
|
||||
|
||||
/obj/item/projectile/gravity/repulse
|
||||
name = "repulsion bolt"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "chronofield"
|
||||
hitsound = 'sound/weapons/wave.ogg'
|
||||
damage = 0
|
||||
damage_type = BRUTE
|
||||
nodamage = 1
|
||||
color = "#33CCFF"
|
||||
var/turf/T
|
||||
var/power = 4
|
||||
var/list/thrown_items = list()
|
||||
|
||||
/obj/item/projectile/gravityrepulse/Initialize()
|
||||
. = ..()
|
||||
var/obj/item/ammo_casing/energy/gravity/repulse/C = loc
|
||||
if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
|
||||
power = min(C.gun.power, 15)
|
||||
/obj/item/projectile/gravity/repulse/get_target(turf/origin, atom/movable/AM)
|
||||
return get_turf_in_angle(Get_Angle(origin, AM), origin, power)
|
||||
|
||||
/obj/item/projectile/gravityrepulse/on_hit()
|
||||
. = ..()
|
||||
T = get_turf(src)
|
||||
for(var/atom/movable/A in range(T, power))
|
||||
if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A])
|
||||
continue
|
||||
var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(A, src)))
|
||||
A.throw_at(throwtarget,power+1,1)
|
||||
thrown_items[A] = A
|
||||
for(var/turf/F in range(T,power))
|
||||
new /obj/effect/temp_visual/gravpush(F)
|
||||
|
||||
/obj/item/projectile/gravityattract
|
||||
/obj/item/projectile/gravity/attract
|
||||
name = "attraction bolt"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "chronofield"
|
||||
hitsound = 'sound/weapons/wave.ogg'
|
||||
damage = 0
|
||||
damage_type = BRUTE
|
||||
nodamage = 1
|
||||
color = "#FF6600"
|
||||
var/turf/T
|
||||
var/power = 4
|
||||
var/list/thrown_items = list()
|
||||
|
||||
/obj/item/projectile/gravityattract/Initialize()
|
||||
. = ..()
|
||||
var/obj/item/ammo_casing/energy/gravity/attract/C = loc
|
||||
if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
|
||||
power = min(C.gun.power, 15)
|
||||
/obj/item/projectile/gravity/attract/get_target(turf/origin, atom/movable/AM)
|
||||
return origin
|
||||
|
||||
/obj/item/projectile/gravityattract/on_hit()
|
||||
. = ..()
|
||||
T = get_turf(src)
|
||||
for(var/atom/movable/A in range(T, power))
|
||||
if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A])
|
||||
continue
|
||||
A.throw_at(T, power+1, 1)
|
||||
thrown_items[A] = A
|
||||
for(var/turf/F in range(T,power))
|
||||
new /obj/effect/temp_visual/gravpush(F)
|
||||
|
||||
/obj/item/projectile/gravitychaos
|
||||
/obj/item/projectile/gravity/chaos
|
||||
name = "gravitational blast"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "chronofield"
|
||||
hitsound = 'sound/weapons/wave.ogg'
|
||||
damage = 0
|
||||
damage_type = BRUTE
|
||||
nodamage = 1
|
||||
color = "#101010"
|
||||
var/turf/T
|
||||
var/power = 4
|
||||
var/list/thrown_items = list()
|
||||
|
||||
/obj/item/projectile/gravitychaos/Initialize()
|
||||
. = ..()
|
||||
var/obj/item/ammo_casing/energy/gravity/chaos/C = loc
|
||||
if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
|
||||
power = min(C.gun.power, 15)
|
||||
|
||||
/obj/item/projectile/gravitychaos/on_hit()
|
||||
. = ..()
|
||||
T = get_turf(src)
|
||||
for(var/atom/movable/A in range(T, power))
|
||||
if(A == src|| (firer && A == src.firer) || A.anchored || thrown_items[A])
|
||||
continue
|
||||
A.throw_at(get_edge_target_turf(A, pick(GLOB.cardinals)), power+1, 1)
|
||||
thrown_items[A] = A
|
||||
for(var/turf/Z in range(T,power))
|
||||
new /obj/effect/temp_visual/gravpush(Z)
|
||||
/obj/item/projectile/gravity/chaos/get_target(turf/origin, atom/movable/AM)
|
||||
return get_turf_in_angle(rand(0, 359), origin, power)
|
||||
|
||||
@@ -43,4 +43,34 @@
|
||||
explosion(target, 0, 1, 2, 4)
|
||||
else
|
||||
explosion(target, 0, 0, 2, 4)
|
||||
return BULLET_ACT_HIT
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
/obj/item/projectile/bullet/a84mm_br
|
||||
name ="\improper HE missile"
|
||||
desc = "Boom."
|
||||
icon_state = "missile"
|
||||
damage = 30
|
||||
ricochets_max = 0 //it's a MISSILE
|
||||
var/sturdy = list(
|
||||
/turf/closed,
|
||||
/obj/mecha,
|
||||
/obj/machinery/door/,
|
||||
/obj/machinery/door/poddoor/shutters
|
||||
)
|
||||
|
||||
/obj/item/broken_missile
|
||||
name = "\improper broken missile"
|
||||
desc = "A missile that did not detonate. The tail has snapped and it is in no way fit to be used again."
|
||||
icon = 'icons/obj/projectiles.dmi'
|
||||
icon_state = "missile_broken"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
|
||||
|
||||
/obj/item/projectile/bullet/a84mm_br/on_hit(atom/target, blocked=0)
|
||||
..()
|
||||
for(var/i in sturdy)
|
||||
if(istype(target, i))
|
||||
explosion(target, 0, 1, 1, 2)
|
||||
return BULLET_ACT_HIT
|
||||
//if(istype(target, /turf/closed) || ismecha(target))
|
||||
new /obj/item/broken_missile(get_turf(src), 1)
|
||||
Reference in New Issue
Block a user