| |
|
| |
|
| |
|
| | local Players = game:GetService("Players")
|
| | local UserInputService = game:GetService("UserInputService")
|
| | local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
| | local CollectionService = game:GetService("CollectionService")
|
| |
|
| | local player = Players.LocalPlayer
|
| | local mouse = player:GetMouse()
|
| | local character = player.Character or player.CharacterAdded:Wait()
|
| |
|
| | local ChoppingConfig = require(ReplicatedStorage:WaitForChild("Shared"):WaitForChild("ChoppingConfig"))
|
| | local CraftingConfig = require(ReplicatedStorage:WaitForChild("Shared"):WaitForChild("CraftingConfig"))
|
| | local ChopEvent = ReplicatedStorage:WaitForChild("Events"):WaitForChild("ChopEvent")
|
| |
|
| | local canSwing = true
|
| |
|
| | local function getCurrentWeapon()
|
| | local axeType = nil
|
| | if character then
|
| | axeType = character:GetAttribute("EquippedAxe")
|
| | end
|
| | if not axeType or axeType == "" then
|
| | axeType = player:GetAttribute("EquippedAxe")
|
| | end
|
| |
|
| |
|
| | if not axeType or axeType == "" or axeType == "None" then
|
| | return CraftingConfig.Fist, "Fist"
|
| | end
|
| |
|
| | local stats = ChoppingConfig.AxeTypes[axeType]
|
| | if stats then
|
| | return stats, axeType
|
| | end
|
| |
|
| | return CraftingConfig.Fist, "Fist"
|
| | end
|
| |
|
| | local function playSwingAnimation(weaponType)
|
| | local humanoid = character:FindFirstChildOfClass("Humanoid")
|
| | if not humanoid then return end
|
| |
|
| | local camera = workspace.CurrentCamera
|
| | if camera then
|
| | task.spawn(function()
|
| | local shake = weaponType == "Fist" and 1 or 2
|
| | for i = 1, 3 do
|
| | camera.CFrame = camera.CFrame * CFrame.Angles(0, 0, math.rad(-shake + i * (shake * 0.6)))
|
| | task.wait(0.03)
|
| | end
|
| | end)
|
| | end
|
| | end
|
| |
|
| | local function createHitEffect(position, weaponType)
|
| | local part = Instance.new("Part")
|
| | part.Size = Vector3.new(0.4, 0.4, 0.4)
|
| | part.Position = position
|
| | part.Anchored = true
|
| | part.CanCollide = false
|
| | part.Material = Enum.Material.Neon
|
| | part.Shape = Enum.PartType.Ball
|
| | part.Parent = workspace.Terrain
|
| |
|
| | if weaponType == "Fist" then
|
| | part.BrickColor = BrickColor.new("Bright orange")
|
| | else
|
| | part.BrickColor = BrickColor.new("Bright yellow")
|
| | end
|
| |
|
| | task.spawn(function()
|
| | for i = 1, 5 do
|
| | part.Size = part.Size * 1.3
|
| | part.Transparency = i / 5
|
| | task.wait(0.03)
|
| | end
|
| | part:Destroy()
|
| | end)
|
| | end
|
| |
|
| | local function onInputBegan(input, gameProcessed)
|
| | if gameProcessed then return end
|
| |
|
| | if input.UserInputType == Enum.UserInputType.MouseButton1 then
|
| | if not canSwing then return end
|
| | if not character or not character:FindFirstChild("Head") then return end
|
| |
|
| | local weaponStats, weaponType = getCurrentWeapon()
|
| |
|
| | local rayOrigin = character.Head.Position
|
| | local rayDirection = (mouse.Hit.Position - rayOrigin).Unit * weaponStats.Range
|
| |
|
| | local raycastParams = RaycastParams.new()
|
| | raycastParams.FilterDescendantsInstances = {character}
|
| | raycastParams.FilterType = Enum.RaycastFilterType.Exclude
|
| |
|
| | local raycastResult = workspace:Raycast(rayOrigin, rayDirection, raycastParams)
|
| |
|
| | if raycastResult and raycastResult.Instance then
|
| | local hitPart = raycastResult.Instance
|
| |
|
| |
|
| | if CollectionService:HasTag(hitPart, "TreeSegment") then
|
| | playSwingAnimation(weaponType)
|
| | createHitEffect(raycastResult.Position, weaponType)
|
| | ChopEvent:FireServer(hitPart, raycastResult.Position)
|
| | end
|
| | end
|
| |
|
| |
|
| | canSwing = false
|
| | task.wait(weaponStats.SwingCooldown)
|
| | canSwing = true
|
| | end
|
| | end
|
| |
|
| | player.CharacterAdded:Connect(function(char)
|
| | character = char
|
| | end)
|
| |
|
| | UserInputService.InputBegan:Connect(onInputBegan)
|
| |
|