diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index d86f0351d75..9cb3d4945e5 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -128,7 +128,7 @@ var/const/tk_maxrange = 15 else apply_focus_overlay() - focus.throw_at(target, 10, 1) + focus.throw_at(target, 10, 1,user) last_throw = world.time return diff --git a/code/datums/martial.dm b/code/datums/martial.dm index 8c5c136980e..a1c92bd97d0 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -225,7 +225,7 @@ "[A] has hit [D] with Plasma Punch!") playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1) var/atom/throw_target = get_edge_target_turf(D, get_dir(D, get_step_away(D, A))) - D.throw_at(throw_target, 200, 4) + D.throw_at(throw_target, 200, 4,A) A.say("HYAH!") return diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm index d6cdfe7c872..f7624463fe0 100644 --- a/code/datums/spells/wizard.dm +++ b/code/datums/spells/wizard.dm @@ -343,4 +343,4 @@ var/mob/living/M = AM M.Weaken(2) M << "You're thrown back by a mystical force!" - spawn(0) AM.throw_at(throwtarget, ((Clamp((maxthrow - (Clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1)//So stuff gets tossed around at the same time. \ No newline at end of file + spawn(0) AM.throw_at(throwtarget, ((Clamp((maxthrow - (Clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user)//So stuff gets tossed around at the same time. \ No newline at end of file diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 41ebb2b02b2..33b0400ac41 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -6,6 +6,7 @@ var/throw_speed = 2 var/throw_range = 7 var/mob/pulledby = null + var/mob/thrownby = null var/languages = 0 //For say() and Hear() var/verb_say = "says" var/verb_ask = "asks" @@ -168,10 +169,15 @@ src.throw_impact(A) src.throwing = 0 -/atom/movable/proc/throw_at(atom/target, range, speed) +/atom/movable/proc/throw_at(atom/target, range, speed, mob/user) if(!target || !src || (flags & NODROP)) return 0 //use a modified version of Bresenham's algorithm to get from the atom's current position to that of the target + if(user) + thrownby = user + else + thrownby = null + src.throwing = 1 if(target.allow_spin) // turns out 1000+ spinning objects being thrown at the singularity creates lag - Iamgoofball SpinAnimation(5, 1) diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm index f4af87c3f10..e8d9be3948b 100644 --- a/code/game/objects/items/weapons/pneumaticCannon.dm +++ b/code/game/objects/items/weapons/pneumaticCannon.dm @@ -92,7 +92,7 @@ loadedWeightClass -= ITD.w_class ITD.throw_speed = pressureSetting * 2 ITD.loc = get_turf(src) - ITD.throw_at(target, pressureSetting * 5, pressureSetting * 2) + ITD.throw_at(target, pressureSetting * 5, pressureSetting * 2,user) if(pressureSetting >= 3) user << "\The [src]'s recoil knocks you down!" user.Weaken(2) diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm index d06bd7e61c8..a3912ae24c0 100644 --- a/code/modules/admin/verbs/buildmode.dm +++ b/code/modules/admin/verbs/buildmode.dm @@ -189,10 +189,10 @@ var/type = input(usr,"Select Generator Type","Type") as null|anything in gen_paths if(!type) return - + master.generator_path = type master.cornerA = null - master.cornerB = null + master.cornerB = null return 1 @@ -292,7 +292,7 @@ holder.throw_atom = object if(pa.Find("right")) if(holder.throw_atom) - holder.throw_atom.throw_at(object, 10, 1) + holder.throw_atom.throw_at(object, 10, 1,user) log_admin("Build Mode: [key_name(usr)] threw [holder.throw_atom] at [object] ([object.x],[object.y],[object.z])") if(AREA_BUILDMODE) if(!holder.cornerA) @@ -300,7 +300,7 @@ return if(holder.cornerA && !holder.cornerB) holder.cornerB = get_turf(object) - + if(pa.Find("left")) //rectangular if(holder.cornerA && holder.cornerB) if(!holder.generator_path) diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index a39c6f54dc0..932c4f2a174 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -104,7 +104,7 @@ H.update_icon() source.visible_message("\The [source] deals a card to \the [target].") - H.throw_at(get_step(target, target.dir), 10, 1, H) + H.throw_at(get_step(target, target.dir), 10, 1, source) /* Hand */ diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 5ff331cb104..d43041dac13 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -278,7 +278,7 @@ newtonian_move(get_dir(target, src)) - item.throw_at(target, item.throw_range, item.throw_speed) + item.throw_at(target, item.throw_range, item.throw_speed, src) /mob/living/carbon/can_use_hands() if(handcuffed) @@ -531,7 +531,7 @@ var/const/GALOSHES_DONT_HELP = 8 target = new_turf if(new_turf.density) break - I.throw_at(target,I.throw_range,I.throw_speed) + I.throw_at(target,I.throw_range,I.throw_speed,src) if(61 to 90) //throw it down to the floor var/turf/target = get_turf(loc) - I.throw_at(target,I.throw_range,I.throw_speed) \ No newline at end of file + I.throw_at(target,I.throw_range,I.throw_speed,src) \ No newline at end of file diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index af8b231f78a..7533ad9df49 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -71,12 +71,9 @@ "[src] has been hit by [I].") var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].",I.armour_penetration) apply_damage(I.throwforce, dtype, zone, armor, I) - if(!I.fingerprintslast) - return - var/client/assailant = directory[ckey(I.fingerprintslast)] - if(assailant && assailant.mob && istype(assailant.mob,/mob)) - var/mob/M = assailant.mob - add_logs(M, src, "hit", object="[I]") + + if(I.thrownby) + add_logs(I.thrownby, src, "hit", object="[I]") /mob/living/mech_melee_attack(obj/mecha/M) if(M.occupant.a_intent == "harm") diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm index c117cd40d8e..fb38a3fbdd7 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm @@ -41,7 +41,7 @@ energyKatana.spark_system.start() playsound(H, "sparks", 50, 1) H.visible_message("\the [energyKatana] flies towards [H]!","You hold out your hand and \the [energyKatana] flies towards you!") - energyKatana.throw_at(H, distance+1, energyKatana.throw_speed) + energyKatana.throw_at(H, distance+1, energyKatana.throw_speed,H) else //Else just TP it to us. energyKatana.returnToOwner(H,1) diff --git a/code/modules/projectiles/guns/grenade_launcher.dm b/code/modules/projectiles/guns/grenade_launcher.dm index 2075ebeaa60..0c8cc54a66e 100644 --- a/code/modules/projectiles/guns/grenade_launcher.dm +++ b/code/modules/projectiles/guns/grenade_launcher.dm @@ -51,7 +51,7 @@ var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta! grenades -= F F.loc = user.loc - F.throw_at(target, 30, 2) + F.throw_at(target, 30, 2,user) message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") log_game("[key_name(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") F.active = 1 diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index c79142c6a32..bf6c53c0671 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -84,8 +84,6 @@ if(!reagents.total_volume || !is_open_container()) return - var/client/thrower = directory[ckey(src.fingerprintslast)] - if(ismob(target) && target.reagents) reagents.total_volume *= rand(5,10) * 0.1 //Not all of it makes contact with the target var/mob/M = target @@ -97,12 +95,12 @@ R += A.id + " (" R += num2text(A.volume) + ")," - if(thrower && thrower.mob) - add_logs(thrower.mob, M, "splashed", object="[R]") + if(thrownby) + add_logs(thrownby, M, "splashed", object="[R]") reagents.reaction(target, TOUCH) else if(!target.density || target.throwpass) - if(thrower && thrower.mob && thrower.mob.mind && thrower.mob.mind.assigned_role == "Bartender") + if(thrownby && thrownby.mind && thrownby.mind.assigned_role == "Bartender") visible_message("[src] lands onto the [target.name] without spilling a single drop.") return