diff --git a/code/modules/projectiles/guns/energy/bsharpoon_vr.dm b/code/modules/projectiles/guns/energy/bsharpoon_vr.dm
index 005741bfe41..a8927dfc2ce 100644
--- a/code/modules/projectiles/guns/energy/bsharpoon_vr.dm
+++ b/code/modules/projectiles/guns/energy/bsharpoon_vr.dm
@@ -80,7 +80,7 @@
playsound(src, 'sound/weapons/wave.ogg', 60, 1)
return
var/turf/T = get_turf(A)
- if(!T || (T.check_density() && mode == 1))
+ if(!T || (T.check_density(ignore_mobs = TRUE) && mode == 1))
to_chat(user,"That's a little too solid to harpoon into!")
return
var/turf/ownturf = get_turf(src)
@@ -118,12 +118,45 @@
for(var/rider in L.buckled_mobs)
sendfailchance += 15
+ var/mob/living/living_user = user
+ var/can_dropnom = TRUE
+ if(!istype(living_user))
+ can_dropnom = FALSE
+
if(mode)
if(user in FromTurf)
if(prob(sendfailchance))
user.forceMove(pick(trange(24,user)))
else
user.forceMove(ToTurf)
+ if(can_dropnom && living_user.can_be_drop_pred)
+ var/obj/belly/belly_dest
+ if(living_user.vore_selected)
+ belly_dest = living_user.vore_selected
+ else if(living_user.vore_organs.len)
+ belly_dest = pick(living_user.vore_organs)
+ if(belly_dest)
+ for(var/mob/living/prey in ToTurf)
+ if(prey.can_be_drop_prey)
+ prey.forceMove(belly_dest)
+ to_chat(prey, "[living_user] materializes around you, as you end up in their [belly_dest]!")
+ to_chat(living_user, "You materialize around [prey] as they end up in your [belly_dest]!")
+ else if(can_dropnom && living_user.can_be_drop_prey)
+ var/mob/living/pred
+ for(var/mob/living/potential_pred in ToTurf)
+ if(potential_pred.can_be_drop_pred)
+ pred = potential_pred
+ if(pred)
+ var/obj/belly/belly_dest
+ if(pred.vore_selected)
+ belly_dest = pred.vore_selected
+ else if(pred.vore_organs.len)
+ belly_dest = pick(pred.vore_organs)
+ if(belly_dest)
+ living_user.forceMove(belly_dest)
+ to_chat(pred, "[living_user] materializes inside you as they end up in your [belly_dest]!")
+ to_chat(living_user, "You materialize inside [pred] as you end up in your [belly_dest]!")
+
else
for(var/obj/O in FromTurf)
if(O.anchored) continue
@@ -132,11 +165,35 @@
else
O.forceMove(ToTurf)
+ var/user_vored = FALSE
+
for(var/mob/living/M in FromTurf)
if(prob(recievefailchance))
M.forceMove(pick(trange(24,user)))
else
M.forceMove(ToTurf)
+ if(can_dropnom && living_user.can_be_drop_pred && M.can_be_drop_prey)
+ var/obj/belly/belly_dest
+ if(living_user.vore_selected)
+ belly_dest = living_user.vore_selected
+ else if(living_user.vore_organs.len)
+ belly_dest = pick(living_user.vore_organs)
+ if(belly_dest)
+ M.forceMove(belly_dest)
+ to_chat(living_user, "[M] materializes inside you as they end up in your [belly_dest]!")
+ to_chat(M, "You materialize inside [living_user] as you end up in your [belly_dest]!")
+ else if(can_dropnom && living_user.can_be_drop_prey && M.can_be_drop_pred && !user_vored)
+ var/obj/belly/belly_dest
+ if(M.vore_selected)
+ belly_dest = M.vore_selected
+ else if(M.vore_organs.len)
+ belly_dest = pick(M.vore_organs)
+ if(belly_dest)
+ living_user.forceMove(belly_dest)
+ user_vored = TRUE
+ to_chat(living_user, "[M] materializes around you, as you end up in their [belly_dest]!")
+ to_chat(M, "You materialize around [living_user] as they end up in your [belly_dest]!")
+
/obj/item/weapon/bluespace_harpoon/attack_self(mob/living/user as mob)
return chande_fire_mode(user)