| |
|
| |
|
| | local Players = game:GetService("Players")
|
| | local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
| |
|
| | local CraftingConfig = require(ReplicatedStorage:WaitForChild("Shared"):WaitForChild("CraftingConfig"))
|
| | local ChoppingConfig = require(ReplicatedStorage:WaitForChild("Shared"):WaitForChild("ChoppingConfig"))
|
| | local CraftEvent = ReplicatedStorage:WaitForChild("Events"):WaitForChild("CraftEvent")
|
| | local NotificationEvent = ReplicatedStorage:WaitForChild("Events"):WaitForChild("NotificationEvent")
|
| | local ShopEvent = ReplicatedStorage:WaitForChild("Events"):WaitForChild("ShopEvent")
|
| | local SoundEvent = ReplicatedStorage:WaitForChild("Events"):WaitForChild("SoundEvent")
|
| |
|
| | local function getPlayerResources(player)
|
| | local data = _G.GetPlayerData(player)
|
| | if not data then return {} end
|
| | if not data.Resources then
|
| | data.Resources = {}
|
| | end
|
| | return data.Resources
|
| | end
|
| |
|
| | local function canCraft(player, recipeId)
|
| | local recipe = CraftingConfig.Recipes[recipeId]
|
| | if not recipe then return false, "Unknown recipe" end
|
| |
|
| | local resources = getPlayerResources(player)
|
| |
|
| | for material, requiredAmount in pairs(recipe.Materials) do
|
| | local have = resources[material] or 0
|
| | if have < requiredAmount then
|
| | return false, "Need " .. tostring(requiredAmount) .. " " .. material .. " (have " .. tostring(have) .. ")"
|
| | end
|
| | end
|
| |
|
| |
|
| | if ChoppingConfig.AxeTypes[recipeId] and _G.HasInInventory and _G.HasInInventory(player, "Tools", recipeId) then
|
| | return false, "You already own " .. (recipe.Name or recipeId)
|
| | end
|
| |
|
| | return true, "OK"
|
| | end
|
| |
|
| | local function craftItem(player, recipeId)
|
| |
|
| | if _G.IsRateLimited and _G.IsRateLimited(player, "Craft") then return end
|
| |
|
| | local canDo, reason = canCraft(player, recipeId)
|
| | if not canDo then
|
| | NotificationEvent:FireClient(player, "Error", reason)
|
| | SoundEvent:FireClient(player, "PurchaseFail", nil)
|
| | return
|
| | end
|
| |
|
| | local recipe = CraftingConfig.Recipes[recipeId]
|
| | local resources = getPlayerResources(player)
|
| |
|
| |
|
| | for material, requiredAmount in pairs(recipe.Materials) do
|
| | resources[material] = resources[material] - requiredAmount
|
| | end
|
| |
|
| |
|
| | if _G.AddToInventory then
|
| | _G.AddToInventory(player, "Tools", recipeId)
|
| | end
|
| |
|
| |
|
| | if ChoppingConfig.AxeTypes[recipeId] then
|
| | local data = _G.GetPlayerData(player)
|
| | if data then
|
| | data.EquippedAxe = recipeId
|
| | player:SetAttribute("EquippedAxe", recipeId)
|
| | if player.Character then
|
| | player.Character:SetAttribute("EquippedAxe", recipeId)
|
| | end
|
| | end
|
| | end
|
| |
|
| | NotificationEvent:FireClient(player, "Crafted", "Crafted " .. (recipe.Name or recipeId) .. "!")
|
| | SoundEvent:FireClient(player, "ConstructComplete", nil)
|
| |
|
| |
|
| | local data = _G.GetPlayerData(player)
|
| | if data then
|
| | ShopEvent:FireClient(player, "InventoryUpdate", data.Inventory)
|
| | CraftEvent:FireClient(player, "ResourceUpdate", data.Resources)
|
| | end
|
| | end
|
| |
|
| |
|
| | local function onCraftEvent(player, action, data)
|
| | if action == "Craft" then
|
| | craftItem(player, data)
|
| | elseif action == "QueryResources" then
|
| | local resources = getPlayerResources(player)
|
| | CraftEvent:FireClient(player, "ResourceUpdate", resources)
|
| | end
|
| | end
|
| |
|
| | CraftEvent.OnServerEvent:Connect(onCraftEvent)
|
| |
|
| | print("Crafting Manager initialized")
|
| |
|