Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local treeChopRequestRemote = game.ReplicatedStorage:WaitForChild("TreeChopRequest")
- local workspace = game:GetService("Workspace")
- local WoodsFolder = workspace:WaitForChild("Woods")
- local treeZone = workspace:FindFirstChild("TreeZone")
- local treeHitCounts , treeWoodCounts , playerCooldown = {}, {}, {}
- local CHOP_COOLDOWN = 0.5
- local function getTree()
- local trees = {}
- if treeZone then
- for _, object in treeZone:GetChildren() do
- if object:IsA("Model") and object.Name == "TREE" then
- trees[#trees+1] = object
- end
- end
- end
- return trees
- end
- local function tweenFall(treeModel)
- local playedTween = false
- for _ , part in treeModel:GetChildren() do
- if part:IsA("BasePart") and not playedTween then
- local tweenService = game:GetService("TweenService")
- local tweenCFrame = part.CFrame * CFrame.Angles(math.rad(90),0,0) * CFrame.new(0, 0, 10)
- local tween = tweenService:Create(part, TweenInfo.new(1), {CFrame = tweenCFrame})
- tween:Play()
- playedTween = true
- local treeFallSound = treeModel:FindFirstChild("TreeFallSound")
- if treeFallSound then
- treeFallSound:Play()
- end
- break
- end
- end
- end
- local function spawnWoods(treeModel, position)
- if treeWoodCounts[treeModel] == "done" then return end
- treeWoodCounts[treeModel] = treeWoodCounts[treeModel] or 0
- local woodsTospawn = math.min(3 - treeWoodCounts[treeModel], 3)
- if woodsTospawn <= 0 then
- treeWoodCounts[treeModel] = "done"
- return
- end
- for i = 1, woodsTospawn do
- local woodPart = Instance.new("Part")
- woodPart.Name = "Wood"
- woodPart.Size = Vector3.new(3.5,1.5,1.5)
- woodPart.Shape = Enum.PartType.Cylinder
- woodPart.Position = position + Vector3.new(0, i ,0)
- woodPart.Parent = WoodsFolder
- woodPart.Material = Enum.Material.Wood
- woodPart.BrickColor = BrickColor.new("Brown")
- woodPart.Anchored = false
- woodPart.CanCollide = true
- woodPart.Transparency = 0
- treeWoodCounts[treeModel] = treeWoodCounts[treeModel] + 1
- end
- if treeWoodCounts[treeModel] >= 3 then
- treeWoodCounts[treeModel] = "done"
- end
- end
- treeChopRequestRemote.OnServerEvent:Connect(function(player , damagePart)
- local currentTime = os.clock()
- if playerCooldown[player] and currentTime - playerCooldown[player] < CHOP_COOLDOWN then return end
- playerCooldown[player] = currentTime
- local hitTreeModel
- for _ , treeModel in getTree() do
- for _, treePart in treeModel:GetChildren() do
- if treePart:IsA("BasePart") and (damagePart.Position - treePart.Position).Magnitude <(damagePart.Size.Magnitude + treePart.Size.Magnitude) /2 then
- hitTreeModel = treeModel
- break
- end
- end
- if hitTreeModel then break end
- end
- if not hitTreeModel or treeWoodCounts[hitTreeModel] == "done" then return end
- local hitSound = hitTreeModel:FindFirstChild("HitSound")
- if hitSound and hitSound:isA("Sound") then
- hitSound:Play()
- end
- for _, treePart in hitTreeModel:GetChildren() do
- if treePart:IsA("BasePart") then
- local OriginalCFrame = treePart.CFrame
- treePart.CFrame = OriginalCFrame* CFrame.new(0,0.5,0)
- task.wait(0.5)
- treePart.CFrame = OriginalCFrame
- end
- end
- local playerTool = player.Character and player.Character:FindFirstChildOfClass("Tool")
- local slashPerTimeValue = playerTool and playerTool:FindFirstChild("SlashPerTime")
- local maxSlashPerTime = slashPerTimeValue and slashPerTimeValue.Value or 3
- treeHitCounts[hitTreeModel] = (treeHitCounts[hitTreeModel] or 0) + 1
- if treeHitCounts[hitTreeModel] >= maxSlashPerTime then
- tweenFall(hitTreeModel)
- spawnWoods(hitTreeModel ,hitTreeModel:GetPivot().Position)
- task.wait(1)
- hitTreeModel:Destroy()
- treeHitCounts[hitTreeModel] , treeWoodCounts[hitTreeModel] = nil, nil
- end
- end)
Advertisement
Add Comment
Please, Sign In to add comment