diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 153d56be43..62fef2744d 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -472,7 +472,7 @@ emp_act
mass = I.w_class/THROWNOBJ_KNOCKBACK_DIVISOR
var/momentum = speed*mass
- if(O.throw_source && momentum >= THROWNOBJ_KNOCKBACK_SPEED)
+ if(O.throw_source && momentum >= THROWNOBJ_KNOCKBACK_SPEED && !buckled)
var/dir = get_dir(O.throw_source, src)
visible_message("[src] staggers under the impact!","You stagger under the impact!")
diff --git a/code/modules/projectiles/guns/launcher/bows.dm b/code/modules/projectiles/guns/launcher/bows.dm
index 7787ea027e..a56e390c87 100644
--- a/code/modules/projectiles/guns/launcher/bows.dm
+++ b/code/modules/projectiles/guns/launcher/bows.dm
@@ -17,13 +17,21 @@
item_state = "bolt"
throwforce = 10
w_class = ITEMSIZE_NORMAL
- sharp = FALSE
+ sharp = TRUE
edge = TRUE
+ embed_chance = 0 // it fizzles!
+ catchable = FALSE // oh god
/obj/item/weapon/arrow/energy/throw_impact(atom/hit_atom)
. = ..()
qdel(src)
+/obj/item/weapon/arrow/energy/equipped()
+ if(isliving(loc))
+ var/mob/living/L = loc
+ L.drop_from_inventory(src)
+ qdel(src) // noh
+
/obj/item/weapon/gun/launcher/crossbow/bow
name = "shortbow"
desc = "A common shortbow, capable of firing arrows at high speed towards a target. Useful for hunting while keeping quiet."
@@ -35,15 +43,20 @@
fire_sound_text = "a solid thunk"
fire_delay = 25
slot_flags = SLOT_BACK
- tension = 3
+ release_force = 20
+ release_speed = 15
var/drawn = FALSE
+/obj/item/weapon/gun/launcher/crossbow/bow/update_release_force(obj/item/projectile)
+ return 0
+
/obj/item/weapon/gun/launcher/crossbow/bow/proc/unload(mob/user)
var/obj/item/weapon/arrow/A = bolt
bolt = null
drawn = FALSE
A.forceMove(get_turf(user))
user.put_in_hands(A)
+ update_icon()
/obj/item/weapon/gun/launcher/crossbow/bow/consume_next_projectile(mob/user)
if(!drawn)
@@ -57,10 +70,17 @@
update_icon()
..()
-/obj/item/weapon/gun/launcher/crossbow/bow/attack_self(mob/living/user)
- if(bolt)
- user.visible_message("[user] relaxes the tension on [src]'s string and removes [bolt].","You relax the tension on [src]'s string and remove [bolt].")
+/obj/item/weapon/gun/launcher/crossbow/bow/attack_hand(mob/living/user)
+ if(loc == user && bolt && !drawn)
+ user.visible_message("[user] removes [bolt] from [src].","You remove [bolt] from [src].")
unload(user)
+ else
+ return ..()
+
+/obj/item/weapon/gun/launcher/crossbow/bow/attack_self(mob/living/user)
+ if(drawn)
+ user.visible_message("[user] relaxes the tension on [src]'s string.","You relax the tension on [src]'s string.")
+ drawn = FALSE
update_icon()
else
draw(user)
@@ -75,13 +95,9 @@
current_user = user
user.visible_message("[user] begins to draw back the string of [src].","You begin to draw back the string of [src].")
-
if(do_after(user, 25, src, exclusive = TASK_ALL_EXCLUSIVE))
drawn = TRUE
user.visible_message("[user] draws the string on [src] back fully!", "You draw the string on [src] back fully!")
- else
- user.visible_message("[user] stops drawing and relaxes the string of [src].","You stop drawing back and relax the string of [src].")
- drawn = FALSE
update_icon()
/obj/item/weapon/gun/launcher/crossbow/bow/attackby(obj/item/W as obj, mob/user)
@@ -109,6 +125,7 @@
/obj/item/weapon/gun/launcher/crossbow/bow/hardlight/unload(mob/user)
qdel_null(bolt)
+ update_icon()
/obj/item/weapon/gun/launcher/crossbow/bow/hardlight/attack_self(mob/living/user)
if(drawn)