| |
|
| |
|
| | local CollectionService = game:GetService("CollectionService")
|
| | local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
| | local Players = game:GetService("Players")
|
| |
|
| | local EconomyConfig = require(ReplicatedStorage:WaitForChild("Shared"):WaitForChild("EconomyConfig"))
|
| | local NotificationEvent = ReplicatedStorage:WaitForChild("Events"):WaitForChild("NotificationEvent")
|
| | local MarketUpdateEvent = ReplicatedStorage:WaitForChild("Events"):WaitForChild("MarketUpdateEvent")
|
| | local SoundEvent = ReplicatedStorage:WaitForChild("Events"):WaitForChild("SoundEvent")
|
| |
|
| |
|
| | local currentMarketRates = {}
|
| |
|
| |
|
| | for woodType, _ in pairs(EconomyConfig.WoodBaseValues) do
|
| | currentMarketRates[woodType] = 1.0
|
| | end
|
| |
|
| | local function updateMarketRates()
|
| | for woodType, _ in pairs(currentMarketRates) do
|
| | local randShift = (math.random(-10, 10) / 100)
|
| | local newRate = currentMarketRates[woodType] + randShift
|
| |
|
| | currentMarketRates[woodType] = math.clamp(
|
| | newRate,
|
| | EconomyConfig.MarketFluctuations.MaxDecrease,
|
| | EconomyConfig.MarketFluctuations.MaxIncrease
|
| | )
|
| | end
|
| |
|
| |
|
| | for _, player in ipairs(Players:GetPlayers()) do
|
| | MarketUpdateEvent:FireClient(player, currentMarketRates)
|
| | end
|
| | end
|
| |
|
| |
|
| | task.spawn(function()
|
| | if EconomyConfig.MarketFluctuations.Enabled then
|
| | while true do
|
| | task.wait(EconomyConfig.MarketFluctuations.UpdateInterval)
|
| | updateMarketRates()
|
| | end
|
| | end
|
| | end)
|
| |
|
| | local function getPartVolume(part)
|
| | return part.Size.X * part.Size.Y * part.Size.Z
|
| | end
|
| |
|
| | local function calculateWoodValue(logPart)
|
| | local treeType = logPart:GetAttribute("TreeType")
|
| | local state = logPart:GetAttribute("ProcessState") or "Raw"
|
| |
|
| | if not treeType or not EconomyConfig.WoodBaseValues[treeType] then return 0 end
|
| |
|
| | local baseValue = EconomyConfig.WoodBaseValues[treeType]
|
| | local marketMult = currentMarketRates[treeType] or 1.0
|
| | local processMult = EconomyConfig.ProcessingMultipliers[state] or 1.0
|
| | local degradedMult = logPart:GetAttribute("DegradedMult") or 1.0
|
| | local volume = getPartVolume(logPart)
|
| |
|
| |
|
| | return math.floor(volume * baseValue * processMult * marketMult * degradedMult)
|
| | end
|
| |
|
| | local function rewardPlayer(player, amount)
|
| | if not player then return end
|
| | local leaderstats = player:FindFirstChild("leaderstats")
|
| | if leaderstats then
|
| | local cash = leaderstats:FindFirstChild("Cash")
|
| | if cash then
|
| | cash.Value = cash.Value + amount
|
| | end
|
| | end
|
| |
|
| |
|
| | if _G.IncrementStat then
|
| | _G.IncrementStat(player, "TotalEarned", amount)
|
| | end
|
| |
|
| |
|
| | if _G.ProgressQuest then
|
| | _G.ProgressQuest(player, "Sell", 1)
|
| | _G.ProgressQuest(player, "EarnCash", amount)
|
| | end
|
| |
|
| |
|
| | if _G.CheckAchievements then
|
| | task.defer(function() _G.CheckAchievements(player) end)
|
| | end
|
| | end
|
| |
|
| | local function bindDropoffZone(zonePart)
|
| | local debounce = {}
|
| |
|
| | zonePart.Touched:Connect(function(hit)
|
| | if CollectionService:HasTag(hit, "TreeSegment") then
|
| | if not debounce[hit] then
|
| | debounce[hit] = true
|
| |
|
| | local woodValue = calculateWoodValue(hit)
|
| | local ownerId = hit:GetAttribute("OwnerId")
|
| | local playerToReward = nil
|
| |
|
| | if ownerId then
|
| | playerToReward = Players:GetPlayerByUserId(ownerId)
|
| | else
|
| | pcall(function()
|
| | playerToReward = hit:GetNetworkOwner()
|
| | end)
|
| | end
|
| |
|
| | if playerToReward and woodValue > 0 then
|
| | rewardPlayer(playerToReward, woodValue)
|
| |
|
| |
|
| | local treeType = hit:GetAttribute("TreeType") or "Unknown"
|
| | local state = hit:GetAttribute("ProcessState") or "Raw"
|
| | NotificationEvent:FireClient(playerToReward, "Sale", "Sold " .. state .. " " .. treeType .. " for $" .. tostring(woodValue))
|
| | SoundEvent:FireClient(playerToReward, "CashRegister", nil)
|
| | end
|
| |
|
| | hit:Destroy()
|
| | end
|
| | end
|
| | end)
|
| | end
|
| |
|
| | CollectionService:GetInstanceAddedSignal("MarketDropoff"):Connect(bindDropoffZone)
|
| | for _, zone in pairs(CollectionService:GetTagged("MarketDropoff")) do
|
| | bindDropoffZone(zone)
|
| | end
|
| |
|
| |
|
| | _G.GetMarketRates = function()
|
| | return currentMarketRates
|
| | end
|
| |
|
| |
|
| | Players.PlayerAdded:Connect(function(player)
|
| | task.delay(5, function()
|
| | if player.Parent then
|
| | MarketUpdateEvent:FireClient(player, currentMarketRates)
|
| | end
|
| | end)
|
| | end)
|
| |
|