I have a bow script that works when i test play it in studio, but when i publish the game and play it online the GUI doesn't show up and the bow doesn't work. Why is that? Thanks for any help and suggestions!
local TOOL = script.Parent
local DAMAGE = 30
local RANGE = 50
local REST_TIME = 0.5
local CRIT_MULT = 2
local DEBOUNCE = true
local AMMO_TYPE = "ARROW"
local AMMO_BOX = TOOL.Ammo
local AMMO_GUI = TOOL.ScreenGui
local AMMO_NUM_LABEL = AMMO_GUI.Frame.TotalAmmoLabel
local AMMO_TYPE_LABEL = AMMO_GUI.Frame.AmmoTypeLabel
local CURRENT_SHOT = nil
function getPC()
local char = TOOL.Parent
local player = game.Players:GetPlayerFromCharacter(char)
return player, char
end
function humanCheck(part)
local parent = part.Parent
if parent == nil then
return false
end
local humanoid = parent:findFirstChild("ANIMAL")
if humanoid ~= nil then
return true
end
return false
end
function distanceCheck(part)
local player, char = getPC()
local head = char.Head
local dist = (head.Position - part.Position).magnitude
return (dist < RANGE)
end
function ammoCheck(part)
local typeValue = part:findFirstChild("AmmoType")
if typeValue ~= nil then
return (typeValue.Value == AMMO_TYPE)
end
end
function hasAmmo()
local ammo = AMMO_BOX:GetChildren()
local ammoNum = #ammo
return (ammoNum > 0)
end
function canHit(part)
local bool = false
bool = (bool or humanCheck(part))
bool = (bool and distanceCheck(part))
bool = (bool and hasAmmo())
return bool
end
function canPickup(part)
local bool = false
bool = (bool or ammoCheck(part))
return bool
end
function attack(body_part, human)
body_part = body_part.Name
local health = human.HEALTH
local final_damage = DAMAGE + CURRENT_SHOT.Damage.Value
if body_part == "Head" or body_part == "Torso" then
health.Value = health.Value - (final_damage * CRIT_MULT)
end
if body_part == "Right Arm" or body_part == "Left Arm" then
health.Value = health.Value - (final_damage / CRIT_MULT)
end
if body_part == "Right Leg" or body_part == "Left Leg" then
health.Value = health.Value - (final_damage)
end
end
function updateAmmo()
local ammo = AMMO_BOX:GetChildren()
local ammo_num = #ammo
CURRENT_SHOT = ammo[1]
if CURRENT_SHOT ~= nil then
AMMO_NUM_LABEL.Text = "Ammo: "..ammo_num
AMMO_TYPE_LABEL.Text = "Current: "..CURRENT_SHOT.Name
else
AMMO_NUM_LABEL.Text = "No ammo!"
AMMO_TYPE_LABEL.Text = ""
end
end
function slash()
local s = Instance.new("StringValue")
s.Name = "toolanim"
s.Value = "Slash"
s.Parent = TOOL
end
function fire(v)
local vCharacter = TOOL.Parent
local vPlayer = game.Players:playerFromCharacter(vCharacter)
local missile = TOOL.Bolt:Clone()
-- find firing direction
local v1 = -TOOL.Bolt.CFrame.lookVector.unit
local v2 = v.unit
local dot = (v1.x * v2.x) + (v1.y * v2.y) + (v1.z * v2.z)
local ang = math.acos(dot)
-- test if in cone
if (ang < 3.14 / 8) then
else
-- not in cone, find projection
--n = v1 x v2
--local n = Vector3.new(v1.y * v2.z - v1.z * v2.y, v1.z * v2.x - v1.x * v2.z, v1.z * v2.y - v1.y * v2.x)
--return
end
--missile.CFrame = Tool.Bolt.CFrame + (Tool.Bolt.CFrame.lookVector * -8)
missile.CFrame = TOOL.Bolt.CFrame + (v * 8)
missile.Transparency = 0
missile.Velocity = v * 150
missile.Name = "CrossbowBolt"
missile.Elasticity = 0
local force = Instance.new("BodyForce")
force.force = Vector3.new(0,150,0)
force.Parent = missile
missile.BodyGyro.cframe = CFrame.new(Vector3.new(0,0,0), -TOOL.Bolt.CFrame.lookVector.unit)
missile.BodyGyro.maxTorque = Vector3.new(5e5,5e5,5e5)
local new_script = script.Parent.CrossbowBoltScript:clone()
new_script.Disabled = false
new_script.Parent = missile
local creator_tag = Instance.new("ObjectValue")
creator_tag.Value = vPlayer
creator_tag.Name = "creator"
creator_tag.Parent = missile
missile.Parent = game.Workspace
end
TOOL.Enabled = true
function onActivated()
if not TOOL.Enabled then
return
end
TOOL.Enabled = false
end
function onButton1Down(mouse)
if not DEBOUNCE then return end
DEBOUNCE = false
local character = TOOL.Parent;
local humanoid = character.Humanoid
local targ = mouse.Target
local targetPos = humanoid.TargetPoint
local lookAt = (targetPos - character.Head.Position).unit
if canHit(targ) then
local enemy = targ.Parent
local human = enemy.ANIMAL
attack(targ, human)
CURRENT_SHOT:remove()
fire(lookAt)
wait(2)
TOOL.Enabled = true
updateAmmo()
end
if canPickup(targ) then
targ.Parent = AMMO_BOX
updateAmmo()
else
wait(REST_TIME)
end
DEBOUNCE = true
end
function onEquipped(mouse)
local player, char = getPC()
AMMO_GUI.Parent = player.PlayerGui
updateAmmo()
AMMO_BOX.Parent = player.Backpack
mouse.Button1Down:connect(function()
onButton1Down(mouse)
end)
end
function onUnequipped()
local player, char = getPC()
AMMO_GUI.Parent = TOOL
AMMO_BOX.Parent = TOOL
end
script.Parent.Activated:connect(onActivated)
TOOL.Equipped:connect(onEquipped)
TOOL.Unequipped:connect(onUnequipped)

3 comments
Read this: https://scriptinghelpers.org/blog/it-works-in-studio-but-not-online
i bet taslem didnt even read all 278 lines
haha ^ but thanks taslem, so far its looking like that was the problem, most of my scripts were scripts not localscripts, and that also fixed the testing mode in studio so it isn't slow anymore.