139 lines
2.8 KiB
Lua
139 lines
2.8 KiB
Lua
Tool = script.Parent
|
|
VELOCITY = 85 -- constant
|
|
|
|
local Pellet = Instance.new("Part")
|
|
Pellet.Locked = true
|
|
Pellet.BottomSurface = 0
|
|
Pellet.TopSurface = 0
|
|
Pellet.Shape = 0
|
|
Pellet.Size = Vector3.new(1,1,1)
|
|
Pellet.BrickColor = BrickColor.new(2)
|
|
|
|
Tool.PelletScript:clone().Parent = Pellet
|
|
|
|
function spawnSound(sound)
|
|
local s = sound:clone()
|
|
s.Parent = sound.Parent
|
|
s:Play()
|
|
s.Ended:connect(function ()
|
|
s:Destroy()
|
|
end)
|
|
end
|
|
|
|
function fire(mouse_pos)
|
|
|
|
spawnSound(Tool.Handle.SlingshotSound)
|
|
|
|
-- find player's head pos
|
|
|
|
local vCharacter = Tool.Parent
|
|
local vPlayer = game.Players:playerFromCharacter(vCharacter)
|
|
|
|
local head = vCharacter:findFirstChild("Head")
|
|
if head == nil then return end
|
|
|
|
local dir = mouse_pos - head.Position
|
|
dir = computeDirection(dir)
|
|
|
|
local launch = head.Position + 5 * dir
|
|
|
|
local delta = mouse_pos - launch
|
|
|
|
local dy = delta.y
|
|
|
|
local new_delta = Vector3.new(delta.x, 0, delta.z)
|
|
delta = new_delta
|
|
|
|
local dx = delta.magnitude
|
|
local unit_delta = delta.unit
|
|
|
|
-- acceleration due to gravity in RBX units
|
|
local g = (-9.81 * 20)
|
|
|
|
local theta = computeLaunchAngle( dx, dy, g)
|
|
|
|
local vy = math.sin(theta)
|
|
local xz = math.cos(theta)
|
|
local vx = unit_delta.x * xz
|
|
local vz = unit_delta.z * xz
|
|
|
|
|
|
local missile = Pellet:clone()
|
|
|
|
|
|
|
|
|
|
missile.Position = launch
|
|
missile.Velocity = Vector3.new(vx,vy,vz) * VELOCITY
|
|
|
|
missile.PelletScript.Disabled = false
|
|
|
|
local creator_tag = Instance.new("ObjectValue")
|
|
creator_tag.Value = vPlayer
|
|
creator_tag.Name = "creator"
|
|
creator_tag.Parent = missile
|
|
|
|
missile.Parent = game.Workspace
|
|
missile:SetNetworkOwner(vPlayer)
|
|
end
|
|
|
|
|
|
function computeLaunchAngle(dx,dy,grav)
|
|
-- arcane
|
|
-- http://en.wikipedia.org/wiki/Trajectory_of_a_projectile
|
|
|
|
local g = math.abs(grav)
|
|
local inRoot = (VELOCITY*VELOCITY*VELOCITY*VELOCITY) - (g * ((g*dx*dx) + (2*dy*VELOCITY*VELOCITY)))
|
|
if inRoot <= 0 then
|
|
return .25 * math.pi
|
|
end
|
|
local root = math.sqrt(inRoot)
|
|
local inATan1 = ((VELOCITY*VELOCITY) + root) / (g*dx)
|
|
|
|
local inATan2 = ((VELOCITY*VELOCITY) - root) / (g*dx)
|
|
local answer1 = math.atan(inATan1)
|
|
local answer2 = math.atan(inATan2)
|
|
if answer1 < answer2 then return answer1 end
|
|
return answer2
|
|
end
|
|
|
|
function computeDirection(vec)
|
|
local lenSquared = vec.magnitude * vec.magnitude
|
|
local invSqrt = 1 / math.sqrt(lenSquared)
|
|
return Vector3.new(vec.x * invSqrt, vec.y * invSqrt, vec.z * invSqrt)
|
|
end
|
|
|
|
|
|
|
|
|
|
Tool.Enabled = true
|
|
function onActivated()
|
|
|
|
if not Tool.Enabled then
|
|
return
|
|
end
|
|
|
|
Tool.Enabled = false
|
|
|
|
local character = Tool.Parent;
|
|
local humanoid = character.Humanoid
|
|
if humanoid == nil then
|
|
print("Humanoid not found")
|
|
return
|
|
end
|
|
|
|
if humanoid.Health <= 0 then
|
|
return
|
|
end
|
|
|
|
local targetPos = humanoid.TargetPoint
|
|
|
|
fire(targetPos)
|
|
|
|
wait(.2)
|
|
|
|
Tool.Enabled = true
|
|
end
|
|
|
|
script.Parent.Activated:connect(onActivated)
|