1177 lines
39 KiB
Lua
1177 lines
39 KiB
Lua
-- Complete Farm System - ระบบฟาร์มแบบเต็มรูปแบบ
|
|
-- รวมการเดิน เก็บ ปลูก ขาย และเลี้ยงสัตว์
|
|
|
|
print("🌱 Loading Complete Farm System...")
|
|
|
|
-- Services
|
|
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
|
local Players = game:GetService("Players")
|
|
local RunService = game:GetService("RunService")
|
|
local TweenService = game:GetService("TweenService")
|
|
|
|
local LocalPlayer = Players.LocalPlayer
|
|
local PlayerGui = LocalPlayer:WaitForChild("PlayerGui")
|
|
local Leaderstats = LocalPlayer:WaitForChild("leaderstats")
|
|
local Backpack = LocalPlayer:WaitForChild("Backpack")
|
|
|
|
print("✅ Services loaded")
|
|
|
|
-- ป้องกันการรันซ้ำ
|
|
if _G.CompleteFarmSystemLoaded then
|
|
print("⚠️ Complete Farm System already loaded, removing old one...")
|
|
if _G.CompleteFarmSystemUI then
|
|
_G.CompleteFarmSystemUI:Destroy()
|
|
end
|
|
end
|
|
_G.CompleteFarmSystemLoaded = true
|
|
|
|
-- Game Objects
|
|
local GameEvents = ReplicatedStorage:WaitForChild("GameEvents")
|
|
local Farms = workspace:WaitForChild("Farm")
|
|
|
|
print("✅ Game objects found")
|
|
|
|
-- Complete Farm Settings
|
|
local FarmSettings = {
|
|
-- Auto Farm Settings
|
|
AutoWalk = true,
|
|
AutoHarvest = true,
|
|
AutoPlant = true,
|
|
AutoSell = true,
|
|
AutoBuySeeds = true,
|
|
AutoHatchEgg = true,
|
|
AutoFeedPets = true,
|
|
AutoBuyEggs = true,
|
|
|
|
-- Walk Settings
|
|
WalkSpeed = "ปกติ",
|
|
WalkRandomness = true,
|
|
WalkRadius = 20,
|
|
WalkInterval = 5, -- เดินทุก 5 วินาที
|
|
|
|
-- Harvest Settings
|
|
HarvestDelay = 1, -- เก็บ 1 วินาที
|
|
HarvestUntilFull = true, -- เก็บจนเต็มกระเป๋า
|
|
MaxInventorySlots = 200,
|
|
HarvestAll = true,
|
|
|
|
-- Plant Settings
|
|
SelectedSeed = "Carrot", -- เมล็ดปกติ
|
|
PlantRandom = true,
|
|
PlantInterval = 10, -- ปลูกทุก 10 วินาที
|
|
MaxPlantsPerLoop = 20,
|
|
|
|
-- Sell Settings
|
|
SellWhenFull = true, -- ขายเมื่อเต็มกระเป๋า
|
|
SellThreshold = 80, -- ขายเมื่อเหลือ 80%
|
|
SellDelay = 0.5,
|
|
|
|
-- Buy Seeds Settings
|
|
BuyRareSeeds = true, -- ซื้อเมล็ดหายาก
|
|
RareSeeds = {"Tomato", "Corn", "Wheat", "Potato"},
|
|
BuyInterval = 60, -- ซื้อทุก 1 นาที
|
|
|
|
-- Pet Settings
|
|
SelectedEggType = "Common Egg",
|
|
MaxPetsToHatch = 5,
|
|
HatchInterval = 30, -- ฟักไข่ทุก 30 วินาที
|
|
FeedInterval = 60, -- ให้อาหารทุก 60 วินาที
|
|
BuyEggInterval = 120, -- ซื้อไข่ทุก 2 นาที
|
|
PetGrowthTime = 300, -- เวลาให้สัตว์โต 5 นาที
|
|
|
|
-- Performance Settings
|
|
UseSmoothAnimations = true,
|
|
AnimationDuration = 0.5,
|
|
UseThreading = true,
|
|
MaxThreads = 4
|
|
}
|
|
|
|
-- Performance Variables
|
|
local IsWalking = false
|
|
local IsHarvesting = false
|
|
local IsPlanting = false
|
|
local IsSelling = false
|
|
local IsBuying = false
|
|
local IsProcessingPets = false
|
|
local LastWalkTime = 0
|
|
local LastHarvestTime = 0
|
|
local LastPlantTime = 0
|
|
local LastSellTime = 0
|
|
local LastBuyTime = 0
|
|
local LastHatchTime = 0
|
|
local LastFeedTime = 0
|
|
local LastBuyEggTime = 0
|
|
|
|
-- Pet Data
|
|
local PetEggTypes = {
|
|
["Common Egg"] = { HatchTime = 600, Price = 100, GrowthTime = 300 },
|
|
["Uncommon Egg"] = { HatchTime = 1200, Price = 500, GrowthTime = 600 },
|
|
["Rare Egg"] = { HatchTime = 7200, Price = 2500, GrowthTime = 1800 },
|
|
["Legendary Egg"] = { HatchTime = 14400, Price = 10000, GrowthTime = 3600 },
|
|
["Mythical Egg"] = { HatchTime = 18400, Price = 50000, GrowthTime = 7200 }
|
|
}
|
|
|
|
local PetEvents = {}
|
|
|
|
-- Find Player's Farm
|
|
local function GetFarm(PlayerName)
|
|
local AllFarms = Farms:GetChildren()
|
|
for _, Farm in pairs(AllFarms) do
|
|
local Important = Farm:FindFirstChild("Important")
|
|
if Important then
|
|
local Data = Important:FindFirstChild("Data")
|
|
if Data then
|
|
local Owner = Data:FindFirstChild("Owner")
|
|
if Owner and Owner.Value == PlayerName then
|
|
return Farm
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
local MyFarm = GetFarm(LocalPlayer.Name)
|
|
if not MyFarm then
|
|
warn("❌ Cannot find player's farm!")
|
|
game:GetService("StarterGui"):SetCore("SendNotification", {
|
|
Title = "Complete Farm System",
|
|
Text = "ไม่พบฟาร์มของคุณ!",
|
|
Duration = 5
|
|
})
|
|
return
|
|
end
|
|
|
|
print("✅ Found player farm: " .. MyFarm.Name)
|
|
|
|
local MyImportant = MyFarm:FindFirstChild("Important")
|
|
local PlantLocations = MyImportant:FindFirstChild("Plant_Locations")
|
|
local PlantsPhysical = MyImportant:FindFirstChild("Plants_Physical")
|
|
|
|
-- Helper Functions
|
|
local function GetArea(Base)
|
|
local Center = Base:GetPivot()
|
|
local Size = Base.Size
|
|
|
|
local X1 = math.ceil(Center.X - (Size.X/2))
|
|
local Z1 = math.ceil(Center.Z - (Size.Z/2))
|
|
local X2 = math.floor(Center.X + (Size.X/2))
|
|
local Z2 = math.floor(Center.Z + (Size.Z/2))
|
|
|
|
return X1, Z1, X2, Z2
|
|
end
|
|
|
|
local Dirt = PlantLocations:FindFirstChildOfClass("Part")
|
|
local X1, Z1, X2, Z2 = GetArea(Dirt)
|
|
local FarmCenter = Vector3.new((X1 + X2) / 2, 4, (Z1 + Z2) / 2)
|
|
|
|
-- Find Pet Events
|
|
local function FindPetEvents()
|
|
print("🔍 ค้นหา Pet RemoteEvents...")
|
|
|
|
for _, obj in pairs(ReplicatedStorage:GetDescendants()) do
|
|
if obj:IsA("RemoteEvent") or obj:IsA("RemoteFunction") then
|
|
local name = obj.Name:lower()
|
|
if name:find("pet") or name:find("egg") or name:find("hatch") or
|
|
name:find("feed") or name:find("animal") or name:find("equip") or
|
|
name:find("buy") or name:find("sell") or name:find("spawn") then
|
|
PetEvents[obj.Name] = obj
|
|
print("🐾 พบ Pet Event: " .. obj.Name)
|
|
end
|
|
end
|
|
end
|
|
|
|
if next(PetEvents) == nil then
|
|
print("⚠️ ไม่พบ Pet Events เฉพาะ จะใช้ GameEvents แทน")
|
|
local possibleEvents = {
|
|
"HatchEgg", "FeedPet", "BuyEgg", "EquipPet", "UnequipPet", "SellPet",
|
|
"Hatch", "Feed", "Buy", "Equip", "Unequip", "Sell"
|
|
}
|
|
|
|
for _, eventName in pairs(possibleEvents) do
|
|
local event = GameEvents:FindFirstChild(eventName)
|
|
if event then
|
|
PetEvents[eventName] = event
|
|
print("🐾 พบ GameEvent: " .. eventName)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
FindPetEvents()
|
|
|
|
-- Walk Functions
|
|
local function GetRandomWalkPoint()
|
|
local Character = LocalPlayer.Character
|
|
if not Character then return nil end
|
|
|
|
local HumanoidRootPart = Character:FindFirstChild("HumanoidRootPart")
|
|
if not HumanoidRootPart then return nil end
|
|
|
|
local currentPos = HumanoidRootPart.Position
|
|
|
|
local angle = math.random() * math.pi * 2
|
|
local distance = math.random(5, FarmSettings.WalkRadius)
|
|
|
|
local newX = FarmCenter.X + math.cos(angle) * distance
|
|
local newZ = FarmCenter.Z + math.sin(angle) * distance
|
|
|
|
newX = math.max(X1, math.min(X2, newX))
|
|
newZ = math.max(Z1, math.min(Z2, newZ))
|
|
|
|
return Vector3.new(newX, 4, newZ)
|
|
end
|
|
|
|
local function AutoWalkLoop()
|
|
if not FarmSettings.AutoWalk or IsWalking then return end
|
|
|
|
local currentTime = tick()
|
|
if (currentTime - LastWalkTime) < FarmSettings.WalkInterval then return end
|
|
|
|
local Character = LocalPlayer.Character
|
|
if not Character then return end
|
|
|
|
local Humanoid = Character:FindFirstChild("Humanoid")
|
|
local HumanoidRootPart = Character:FindFirstChild("HumanoidRootPart")
|
|
if not Humanoid or not HumanoidRootPart then return end
|
|
|
|
IsWalking = true
|
|
local targetPos = GetRandomWalkPoint()
|
|
|
|
if targetPos then
|
|
print("🚶 เดินไปที่: " .. string.format("%.1f, %.1f, %.1f", targetPos.X, targetPos.Y, targetPos.Z))
|
|
|
|
pcall(function()
|
|
Humanoid:MoveTo(targetPos)
|
|
end)
|
|
|
|
spawn(function()
|
|
local timeout = 0
|
|
while timeout < 30 and _G.CompleteFarmSystemLoaded and FarmSettings.AutoWalk do
|
|
if not HumanoidRootPart.Parent then break end
|
|
local currentPos = HumanoidRootPart.Position
|
|
local distance = (currentPos - targetPos).Magnitude
|
|
|
|
if distance < 8 then
|
|
print("✅ เดินถึงจุดหมาย")
|
|
break
|
|
end
|
|
|
|
timeout = timeout + 1
|
|
wait(0.3)
|
|
end
|
|
end)
|
|
end
|
|
|
|
LastWalkTime = currentTime
|
|
IsWalking = false
|
|
end
|
|
|
|
-- Harvest Functions
|
|
local function GetHarvestablePlants()
|
|
local Plants = {}
|
|
|
|
local function CollectHarvestable(Parent)
|
|
for _, Plant in pairs(Parent:GetChildren()) do
|
|
local Fruits = Plant:FindFirstChild("Fruits")
|
|
if Fruits then
|
|
CollectHarvestable(Fruits)
|
|
end
|
|
|
|
local Prompt = Plant:FindFirstChild("ProximityPrompt", true)
|
|
if Prompt and Prompt.Enabled then
|
|
table.insert(Plants, Plant)
|
|
end
|
|
end
|
|
end
|
|
|
|
CollectHarvestable(PlantsPhysical)
|
|
|
|
if FarmSettings.HarvestAll then
|
|
for _, Farm in pairs(Farms:GetChildren()) do
|
|
if Farm ~= MyFarm then
|
|
local OtherPlantsPhysical = Farm:FindFirstChild("Important")
|
|
if OtherPlantsPhysical then
|
|
OtherPlantsPhysical = OtherPlantsPhysical:FindFirstChild("Plants_Physical")
|
|
if OtherPlantsPhysical then
|
|
CollectHarvestable(OtherPlantsPhysical)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
return Plants
|
|
end
|
|
|
|
local function HarvestPlant(Plant)
|
|
local Prompt = Plant:FindFirstChild("ProximityPrompt", true)
|
|
if Prompt and Prompt.Enabled then
|
|
fireproximityprompt(Prompt)
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
local function GetTotalInventoryCount()
|
|
local totalCount = 0
|
|
local Character = LocalPlayer.Character
|
|
|
|
local function CountFromParent(Parent)
|
|
for _, Tool in pairs(Parent:GetChildren()) do
|
|
if Tool:IsA("Tool") then
|
|
totalCount = totalCount + 1
|
|
end
|
|
end
|
|
end
|
|
|
|
CountFromParent(Backpack)
|
|
if Character then
|
|
CountFromParent(Character)
|
|
end
|
|
|
|
return totalCount
|
|
end
|
|
|
|
local function AutoHarvestLoop()
|
|
if not FarmSettings.AutoHarvest or IsHarvesting then return end
|
|
|
|
local currentTime = tick()
|
|
if (currentTime - LastHarvestTime) < FarmSettings.HarvestDelay then return end
|
|
|
|
local currentCount = GetTotalInventoryCount()
|
|
if currentCount >= FarmSettings.MaxInventorySlots then
|
|
print("🎒 กระเป๋าเต็มแล้ว! (" .. currentCount .. "/" .. FarmSettings.MaxInventorySlots .. ")")
|
|
return
|
|
end
|
|
|
|
local Plants = GetHarvestablePlants()
|
|
if #Plants == 0 then return end
|
|
|
|
print("🚜 เริ่มเก็บ " .. #Plants .. " ต้น")
|
|
|
|
IsHarvesting = true
|
|
local harvested = 0
|
|
|
|
for _, Plant in pairs(Plants) do
|
|
if not FarmSettings.AutoHarvest then break end
|
|
|
|
local newCount = GetTotalInventoryCount()
|
|
if newCount >= FarmSettings.MaxInventorySlots then
|
|
print("🎒 กระเป๋าเต็มแล้ว! หยุดเก็บ")
|
|
break
|
|
end
|
|
|
|
if HarvestPlant(Plant) then
|
|
harvested = harvested + 1
|
|
end
|
|
|
|
wait(0.1) -- ดีเลย์เล็กน้อย
|
|
end
|
|
|
|
if harvested > 0 then
|
|
print("✅ เก็บสำเร็จ " .. harvested .. " ต้น")
|
|
end
|
|
|
|
LastHarvestTime = currentTime
|
|
IsHarvesting = false
|
|
end
|
|
|
|
-- Plant Functions
|
|
local function GetOwnedSeeds()
|
|
local Seeds = {}
|
|
local Character = LocalPlayer.Character
|
|
|
|
local function CollectFromParent(Parent)
|
|
for _, Tool in pairs(Parent:GetChildren()) do
|
|
if Tool:IsA("Tool") then
|
|
local PlantName = Tool:FindFirstChild("Plant_Name")
|
|
local Count = Tool:FindFirstChild("Numbers")
|
|
if PlantName and Count then
|
|
Seeds[PlantName.Value] = {
|
|
Count = Count.Value,
|
|
Tool = Tool
|
|
}
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
CollectFromParent(Backpack)
|
|
if Character then
|
|
CollectFromParent(Character)
|
|
end
|
|
|
|
return Seeds
|
|
end
|
|
|
|
local function Plant(Position, Seed)
|
|
local PlantEvent = GameEvents:FindFirstChild("Plant_RE")
|
|
if PlantEvent then
|
|
PlantEvent:FireServer(Position, Seed)
|
|
wait(0.3)
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
local function AutoPlantLoop()
|
|
if not FarmSettings.AutoPlant or IsPlanting then return end
|
|
|
|
local currentTime = tick()
|
|
if (currentTime - LastPlantTime) < FarmSettings.PlantInterval then return end
|
|
|
|
local OwnedSeeds = GetOwnedSeeds()
|
|
local SeedData = OwnedSeeds[FarmSettings.SelectedSeed]
|
|
|
|
if not SeedData or SeedData.Count <= 0 then
|
|
print("⚠️ ไม่มีเมล็ด " .. FarmSettings.SelectedSeed .. " ให้ปลูก")
|
|
return
|
|
end
|
|
|
|
local Count = SeedData.Count
|
|
local Tool = SeedData.Tool
|
|
|
|
local Character = LocalPlayer.Character
|
|
if Character and Tool.Parent == Backpack then
|
|
local Humanoid = Character:FindFirstChild("Humanoid")
|
|
if Humanoid then
|
|
Humanoid:EquipTool(Tool)
|
|
wait(0.5)
|
|
end
|
|
end
|
|
|
|
IsPlanting = true
|
|
local Planted = 0
|
|
|
|
if FarmSettings.PlantRandom then
|
|
local FarmLands = PlantLocations:GetChildren()
|
|
for i = 1, math.min(Count, FarmSettings.MaxPlantsPerLoop) do
|
|
if not FarmSettings.AutoPlant then break end
|
|
local FarmLand = FarmLands[math.random(1, #FarmLands)]
|
|
local LX1, LZ1, LX2, LZ2 = GetArea(FarmLand)
|
|
local X = math.random(LX1, LX2)
|
|
local Z = math.random(LZ1, LZ2)
|
|
local Point = Vector3.new(X, 4, Z)
|
|
if Plant(Point, FarmSettings.SelectedSeed) then
|
|
Planted = Planted + 1
|
|
end
|
|
end
|
|
else
|
|
for X = X1, X2, 2 do
|
|
for Z = Z1, Z2, 2 do
|
|
if Planted >= math.min(Count, FarmSettings.MaxPlantsPerLoop) or not FarmSettings.AutoPlant then break end
|
|
local Point = Vector3.new(X, 0.13, Z)
|
|
if Plant(Point, FarmSettings.SelectedSeed) then
|
|
Planted = Planted + 1
|
|
wait(0.1)
|
|
end
|
|
end
|
|
if Planted >= math.min(Count, FarmSettings.MaxPlantsPerLoop) or not FarmSettings.AutoPlant then break end
|
|
end
|
|
end
|
|
|
|
if Planted > 0 then
|
|
print("🌱 ปลูก " .. Planted .. " เมล็ด " .. FarmSettings.SelectedSeed)
|
|
end
|
|
|
|
LastPlantTime = currentTime
|
|
IsPlanting = false
|
|
end
|
|
|
|
-- Sell Functions
|
|
local function SellInventory()
|
|
if IsSelling then return false end
|
|
IsSelling = true
|
|
|
|
local Character = LocalPlayer.Character
|
|
if not Character then
|
|
IsSelling = false
|
|
return false
|
|
end
|
|
|
|
local HumanoidRootPart = Character:FindFirstChild("HumanoidRootPart")
|
|
if not HumanoidRootPart then
|
|
IsSelling = false
|
|
return false
|
|
end
|
|
|
|
local Previous = HumanoidRootPart.CFrame
|
|
local ShecklesCount = Leaderstats:FindFirstChild("Sheckles")
|
|
|
|
print("💰 เริ่มขายของ...")
|
|
|
|
HumanoidRootPart.CFrame = CFrame.new(62, 4, -26)
|
|
wait(FarmSettings.SellDelay)
|
|
|
|
local soldAmount = 0
|
|
local previousSheckles = ShecklesCount and ShecklesCount.Value or 0
|
|
|
|
if ShecklesCount then
|
|
local SellEvent = GameEvents:FindFirstChild("Sell_Inventory")
|
|
if SellEvent then
|
|
SellEvent:FireServer()
|
|
wait(FarmSettings.SellDelay)
|
|
|
|
if ShecklesCount.Value ~= previousSheckles then
|
|
soldAmount = ShecklesCount.Value - previousSheckles
|
|
print("💰 ขายสำเร็จ! ได้เงิน " .. soldAmount .. " sheckles")
|
|
else
|
|
print("⚠️ ขายไม่สำเร็จ")
|
|
end
|
|
else
|
|
print("❌ ไม่พบ Sell Event")
|
|
end
|
|
end
|
|
|
|
HumanoidRootPart.CFrame = Previous
|
|
wait(0.2)
|
|
|
|
IsSelling = false
|
|
return soldAmount > 0
|
|
end
|
|
|
|
local function AutoSellLoop()
|
|
if not FarmSettings.AutoSell or IsSelling then return end
|
|
|
|
local currentTime = tick()
|
|
if (currentTime - LastSellTime) < 5 then return end
|
|
|
|
local totalItems = GetTotalInventoryCount()
|
|
|
|
if FarmSettings.SellWhenFull and totalItems >= FarmSettings.MaxInventorySlots then
|
|
print("💰 กระเป๋าเต็ม! เริ่มขาย (" .. totalItems .. "/" .. FarmSettings.MaxInventorySlots .. ")")
|
|
SellInventory()
|
|
LastSellTime = currentTime
|
|
elseif totalItems >= (FarmSettings.MaxInventorySlots * FarmSettings.SellThreshold / 100) then
|
|
print("💰 ถึงเกณฑ์ขาย! เริ่มขาย (" .. totalItems .. "/" .. FarmSettings.MaxInventorySlots .. ")")
|
|
SellInventory()
|
|
LastSellTime = currentTime
|
|
end
|
|
end
|
|
|
|
-- Buy Seeds Functions
|
|
local function BuySeed(SeedName)
|
|
local BuyEvent = GameEvents:FindFirstChild("BuySeedStock")
|
|
if BuyEvent then
|
|
BuyEvent:FireServer(SeedName)
|
|
wait(0.5)
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
local function AutoBuySeedsLoop()
|
|
if not FarmSettings.AutoBuySeeds or IsBuying then return end
|
|
|
|
local currentTime = tick()
|
|
if (currentTime - LastBuyTime) < FarmSettings.BuyInterval then return end
|
|
|
|
if FarmSettings.BuyRareSeeds then
|
|
for _, seedName in pairs(FarmSettings.RareSeeds) do
|
|
print("🛒 กำลังซื้อเมล็ดหายาก: " .. seedName)
|
|
if BuySeed(seedName) then
|
|
print("✅ ซื้อเมล็ดสำเร็จ: " .. seedName)
|
|
else
|
|
print("❌ ซื้อเมล็ดไม่สำเร็จ: " .. seedName)
|
|
end
|
|
wait(1)
|
|
end
|
|
end
|
|
|
|
LastBuyTime = currentTime
|
|
IsBuying = false
|
|
end
|
|
|
|
-- Pet Functions
|
|
local function GetAllPets()
|
|
local pets = {}
|
|
local Character = LocalPlayer.Character
|
|
|
|
local function isPetTool(tool)
|
|
if not tool:IsA("Tool") then return false end
|
|
|
|
local indicators = {
|
|
"PetData", "Pet_Data", "PetInfo", "Pet_Info",
|
|
"AnimalData", "Animal_Data", "CreatureData",
|
|
"IsPet", "Pet", "Animal", "Creature"
|
|
}
|
|
|
|
for _, indicator in pairs(indicators) do
|
|
if tool:FindFirstChild(indicator) then
|
|
return true, indicator
|
|
end
|
|
end
|
|
|
|
local name = tool.Name:lower()
|
|
local petNames = {
|
|
"dog", "cat", "bunny", "rabbit", "chicken", "cow", "pig", "sheep",
|
|
"bee", "ant", "butterfly", "dragonfly", "mouse", "rat", "hamster"
|
|
}
|
|
|
|
for _, petName in pairs(petNames) do
|
|
if name:find(petName) then
|
|
return true, "NameMatch"
|
|
end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
for _, tool in pairs(Backpack:GetChildren()) do
|
|
local isPet, indicator = isPetTool(tool)
|
|
if isPet then
|
|
table.insert(pets, {
|
|
Tool = tool,
|
|
Name = tool.Name,
|
|
Location = "Backpack",
|
|
Indicator = indicator
|
|
})
|
|
end
|
|
end
|
|
|
|
if Character then
|
|
for _, tool in pairs(Character:GetChildren()) do
|
|
local isPet, indicator = isPetTool(tool)
|
|
if isPet then
|
|
table.insert(pets, {
|
|
Tool = tool,
|
|
Name = tool.Name,
|
|
Location = "Equipped",
|
|
Indicator = indicator
|
|
})
|
|
end
|
|
end
|
|
end
|
|
|
|
return pets
|
|
end
|
|
|
|
local function GetAvailableEggs()
|
|
local eggs = {}
|
|
local Character = LocalPlayer.Character
|
|
|
|
local function isEggTool(tool)
|
|
if not tool:IsA("Tool") then return false end
|
|
|
|
local indicators = {
|
|
"EggData", "Egg_Data", "EggInfo", "Egg_Info",
|
|
"HatchData", "Hatch_Data", "IsEgg", "Egg"
|
|
}
|
|
|
|
for _, indicator in pairs(indicators) do
|
|
if tool:FindFirstChild(indicator) then
|
|
return true, indicator
|
|
end
|
|
end
|
|
|
|
local name = tool.Name:lower()
|
|
if name:find("egg") then
|
|
return true, "NameMatch"
|
|
end
|
|
|
|
for eggType, _ in pairs(PetEggTypes) do
|
|
if tool.Name == eggType then
|
|
return true, "EggTypeMatch"
|
|
end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
local function CollectFromParent(Parent)
|
|
for _, tool in pairs(Parent:GetChildren()) do
|
|
local isEgg, indicator = isEggTool(tool)
|
|
if isEgg then
|
|
table.insert(eggs, {
|
|
Tool = tool,
|
|
Name = tool.Name,
|
|
Indicator = indicator
|
|
})
|
|
end
|
|
end
|
|
end
|
|
|
|
CollectFromParent(Backpack)
|
|
if Character then
|
|
CollectFromParent(Character)
|
|
end
|
|
|
|
return eggs
|
|
end
|
|
|
|
local function HatchEgg(eggData)
|
|
if not eggData or not eggData.Tool then return false end
|
|
|
|
local eggTool = eggData.Tool
|
|
print("🥚 กำลังฟักไข่: " .. eggTool.Name)
|
|
|
|
local methods = {
|
|
function()
|
|
if PetEvents.HatchEgg then
|
|
PetEvents.HatchEgg:FireServer(eggTool)
|
|
return "HatchEgg Event"
|
|
end
|
|
end,
|
|
function()
|
|
for eventName, event in pairs(PetEvents) do
|
|
if eventName:lower():find("hatch") then
|
|
event:FireServer(eggTool)
|
|
return eventName .. " Event"
|
|
end
|
|
end
|
|
end,
|
|
function()
|
|
local events = {"HatchEgg", "Hatch", "Pet_Hatch", "Egg_Hatch"}
|
|
for _, eventName in pairs(events) do
|
|
local event = GameEvents:FindFirstChild(eventName)
|
|
if event then
|
|
event:FireServer(eggTool)
|
|
return eventName .. " GameEvent"
|
|
end
|
|
end
|
|
end
|
|
}
|
|
|
|
for _, method in pairs(methods) do
|
|
local success, result = pcall(method)
|
|
if success and result then
|
|
print("✅ ฟักไข่สำเร็จ: " .. eggTool.Name .. " ด้วยวิธี " .. result)
|
|
return true
|
|
end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
local function FeedPet(petData)
|
|
if not petData or not petData.Tool then return false end
|
|
|
|
local petTool = petData.Tool
|
|
print("🍼 กำลังให้อาหาร: " .. petTool.Name)
|
|
|
|
local methods = {
|
|
function()
|
|
if PetEvents.FeedPet then
|
|
PetEvents.FeedPet:FireServer(petTool)
|
|
return "FeedPet Event"
|
|
end
|
|
end,
|
|
function()
|
|
for eventName, event in pairs(PetEvents) do
|
|
if eventName:lower():find("feed") then
|
|
event:FireServer(petTool)
|
|
return eventName .. " Event"
|
|
end
|
|
end
|
|
end,
|
|
function()
|
|
local events = {"FeedPet", "Feed", "Pet_Feed", "Animal_Feed"}
|
|
for _, eventName in pairs(events) do
|
|
local event = GameEvents:FindFirstChild(eventName)
|
|
if event then
|
|
event:FireServer(petTool)
|
|
return eventName .. " GameEvent"
|
|
end
|
|
end
|
|
end
|
|
}
|
|
|
|
for _, method in pairs(methods) do
|
|
local success, result = pcall(method)
|
|
if success and result then
|
|
print("✅ ให้อาหารสำเร็จ: " .. petTool.Name .. " ด้วยวิธี " .. result)
|
|
return true
|
|
end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
local function BuyEgg(eggType)
|
|
if not PetEggTypes[eggType] then return false end
|
|
|
|
print("🛒 กำลังซื้อไข่: " .. eggType)
|
|
|
|
local methods = {
|
|
function()
|
|
if PetEvents.BuyEgg then
|
|
PetEvents.BuyEgg:FireServer(eggType)
|
|
return "BuyEgg Event"
|
|
end
|
|
end,
|
|
function()
|
|
for eventName, event in pairs(PetEvents) do
|
|
if eventName:lower():find("buy") then
|
|
event:FireServer(eggType)
|
|
return eventName .. " Event"
|
|
end
|
|
end
|
|
end,
|
|
function()
|
|
local events = {"BuyEgg", "Buy", "Pet_Buy", "Egg_Buy"}
|
|
for _, eventName in pairs(events) do
|
|
local event = GameEvents:FindFirstChild(eventName)
|
|
if event then
|
|
event:FireServer(eggType)
|
|
return eventName .. " GameEvent"
|
|
end
|
|
end
|
|
end
|
|
}
|
|
|
|
for _, method in pairs(methods) do
|
|
local success, result = pcall(method)
|
|
if success and result then
|
|
print("✅ ซื้อไข่สำเร็จ: " .. eggType .. " ด้วยวิธี " .. result)
|
|
return true
|
|
end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
-- Pet Loops
|
|
local function AutoHatchEggLoop()
|
|
if not FarmSettings.AutoHatchEgg or IsProcessingPets then return end
|
|
|
|
local currentTime = tick()
|
|
if (currentTime - LastHatchTime) < FarmSettings.HatchInterval then return end
|
|
|
|
local eggs = GetAvailableEggs()
|
|
if #eggs == 0 then return end
|
|
|
|
print("🥚 พบไข่ทั้งหมด " .. #eggs .. " ฟอง")
|
|
|
|
IsProcessingPets = true
|
|
local hatchedCount = 0
|
|
|
|
for _, eggData in pairs(eggs) do
|
|
if hatchedCount >= FarmSettings.MaxPetsToHatch then break end
|
|
if not FarmSettings.AutoHatchEgg then break end
|
|
|
|
if HatchEgg(eggData) then
|
|
hatchedCount = hatchedCount + 1
|
|
wait(2)
|
|
end
|
|
wait(0.5)
|
|
end
|
|
|
|
if hatchedCount > 0 then
|
|
print("✅ ฟักไข่สำเร็จทั้งหมด " .. hatchedCount .. " ฟอง")
|
|
end
|
|
|
|
LastHatchTime = currentTime
|
|
IsProcessingPets = false
|
|
end
|
|
|
|
local function AutoFeedPetsLoop()
|
|
if not FarmSettings.AutoFeedPets or IsProcessingPets then return end
|
|
|
|
local currentTime = tick()
|
|
if (currentTime - LastFeedTime) < FarmSettings.FeedInterval then return end
|
|
|
|
local pets = GetAllPets()
|
|
if #pets == 0 then return end
|
|
|
|
print("🐾 พบสัตว์เลี้ยงทั้งหมด " .. #pets .. " ตัว")
|
|
|
|
IsProcessingPets = true
|
|
local fedCount = 0
|
|
|
|
for _, petData in pairs(pets) do
|
|
if not FarmSettings.AutoFeedPets then break end
|
|
|
|
if FeedPet(petData) then
|
|
fedCount = fedCount + 1
|
|
wait(1)
|
|
end
|
|
wait(0.3)
|
|
end
|
|
|
|
if fedCount > 0 then
|
|
print("✅ ให้อาหารสำเร็จทั้งหมด " .. fedCount .. " ตัว")
|
|
end
|
|
|
|
LastFeedTime = currentTime
|
|
IsProcessingPets = false
|
|
end
|
|
|
|
local function AutoBuyEggsLoop()
|
|
if not FarmSettings.AutoBuyEggs or IsProcessingPets then return end
|
|
|
|
local currentTime = tick()
|
|
if (currentTime - LastBuyEggTime) < FarmSettings.BuyEggInterval then return end
|
|
|
|
local eggs = GetAvailableEggs()
|
|
if #eggs >= FarmSettings.MaxPetsToHatch then return end
|
|
|
|
local eggType = FarmSettings.SelectedEggType
|
|
local eggInfo = PetEggTypes[eggType]
|
|
|
|
if eggInfo then
|
|
print("🔄 กำลังซื้อไข่: " .. eggType .. " (ราคา: " .. eggInfo.Price .. ")")
|
|
if BuyEgg(eggType) then
|
|
print("✅ ซื้อไข่สำเร็จ: " .. eggType)
|
|
else
|
|
print("❌ ซื้อไข่ไม่สำเร็จ: " .. eggType)
|
|
end
|
|
else
|
|
print("⚠️ ไม่พบข้อมูลไข่: " .. eggType)
|
|
end
|
|
|
|
LastBuyEggTime = currentTime
|
|
end
|
|
|
|
-- Main Loops
|
|
local function StartCompleteFarmLoops()
|
|
print("🌱 เริ่มระบบฟาร์มแบบเต็มรูปแบบ...")
|
|
|
|
-- Auto Walk Loop
|
|
spawn(function()
|
|
while _G.CompleteFarmSystemLoaded do
|
|
local success, err = pcall(AutoWalkLoop)
|
|
if not success then
|
|
print("⚠️ ข้อผิดพลาดการเดิน: " .. tostring(err))
|
|
end
|
|
wait(1)
|
|
end
|
|
end)
|
|
|
|
-- Auto Harvest Loop
|
|
spawn(function()
|
|
while _G.CompleteFarmSystemLoaded do
|
|
local success, err = pcall(AutoHarvestLoop)
|
|
if not success then
|
|
print("⚠️ ข้อผิดพลาดการเก็บ: " .. tostring(err))
|
|
end
|
|
wait(FarmSettings.HarvestDelay)
|
|
end
|
|
end)
|
|
|
|
-- Auto Plant Loop
|
|
spawn(function()
|
|
while _G.CompleteFarmSystemLoaded do
|
|
local success, err = pcall(AutoPlantLoop)
|
|
if not success then
|
|
print("⚠️ ข้อผิดพลาดการปลูก: " .. tostring(err))
|
|
end
|
|
wait(FarmSettings.PlantInterval)
|
|
end
|
|
end)
|
|
|
|
-- Auto Sell Loop
|
|
spawn(function()
|
|
while _G.CompleteFarmSystemLoaded do
|
|
local success, err = pcall(AutoSellLoop)
|
|
if not success then
|
|
print("⚠️ ข้อผิดพลาดการขาย: " .. tostring(err))
|
|
end
|
|
wait(1)
|
|
end
|
|
end)
|
|
|
|
-- Auto Buy Seeds Loop
|
|
spawn(function()
|
|
while _G.CompleteFarmSystemLoaded do
|
|
local success, err = pcall(AutoBuySeedsLoop)
|
|
if not success then
|
|
print("⚠️ ข้อผิดพลาดการซื้อเมล็ด: " .. tostring(err))
|
|
end
|
|
wait(FarmSettings.BuyInterval)
|
|
end
|
|
end)
|
|
|
|
-- Auto Hatch Egg Loop
|
|
spawn(function()
|
|
while _G.CompleteFarmSystemLoaded do
|
|
local success, err = pcall(AutoHatchEggLoop)
|
|
if not success then
|
|
print("⚠️ ข้อผิดพลาดการฟักไข่: " .. tostring(err))
|
|
end
|
|
wait(FarmSettings.HatchInterval)
|
|
end
|
|
end)
|
|
|
|
-- Auto Feed Pets Loop
|
|
spawn(function()
|
|
while _G.CompleteFarmSystemLoaded do
|
|
local success, err = pcall(AutoFeedPetsLoop)
|
|
if not success then
|
|
print("⚠️ ข้อผิดพลาดการให้อาหาร: " .. tostring(err))
|
|
end
|
|
wait(FarmSettings.FeedInterval)
|
|
end
|
|
end)
|
|
|
|
-- Auto Buy Eggs Loop
|
|
spawn(function()
|
|
while _G.CompleteFarmSystemLoaded do
|
|
local success, err = pcall(AutoBuyEggsLoop)
|
|
if not success then
|
|
print("⚠️ ข้อผิดพลาดการซื้อไข่: " .. tostring(err))
|
|
end
|
|
wait(FarmSettings.BuyEggInterval)
|
|
end
|
|
end)
|
|
|
|
print("✅ ระบบฟาร์มทั้งหมดเริ่มทำงานแล้ว")
|
|
end
|
|
|
|
-- Simple UI
|
|
local function CreateCompleteFarmUI()
|
|
print("🎨 สร้าง UI ระบบฟาร์มแบบเต็มรูปแบบ...")
|
|
|
|
local oldUI = PlayerGui:FindFirstChild("CompleteFarmSystemUI")
|
|
if oldUI then oldUI:Destroy() end
|
|
|
|
local ScreenGui = Instance.new("ScreenGui")
|
|
ScreenGui.Name = "CompleteFarmSystemUI"
|
|
ScreenGui.Parent = PlayerGui
|
|
ScreenGui.ResetOnSpawn = false
|
|
|
|
_G.CompleteFarmSystemUI = ScreenGui
|
|
|
|
local MainFrame = Instance.new("Frame")
|
|
MainFrame.Name = "MainFrame"
|
|
MainFrame.Parent = ScreenGui
|
|
MainFrame.BackgroundColor3 = Color3.fromRGB(25, 25, 30)
|
|
MainFrame.BorderSizePixel = 0
|
|
MainFrame.Position = UDim2.new(0, 50, 0, 50)
|
|
MainFrame.Size = UDim2.new(0, 350, 0, 450)
|
|
MainFrame.Active = true
|
|
MainFrame.Draggable = true
|
|
|
|
local Corner = Instance.new("UICorner")
|
|
Corner.CornerRadius = UDim.new(0, 12)
|
|
Corner.Parent = MainFrame
|
|
|
|
local Stroke = Instance.new("UIStroke")
|
|
Stroke.Parent = MainFrame
|
|
Stroke.Color = Color3.fromRGB(100, 255, 100)
|
|
Stroke.Thickness = 2
|
|
|
|
-- Title
|
|
local Title = Instance.new("TextLabel")
|
|
Title.Parent = MainFrame
|
|
Title.BackgroundColor3 = Color3.fromRGB(100, 255, 100)
|
|
Title.BorderSizePixel = 0
|
|
Title.Size = UDim2.new(1, 0, 0, 40)
|
|
Title.Font = Enum.Font.SourceSansBold
|
|
Title.Text = "🌱 ระบบฟาร์มแบบเต็มรูปแบบ"
|
|
Title.TextColor3 = Color3.fromRGB(255, 255, 255)
|
|
Title.TextSize = 16
|
|
|
|
local TitleCorner = Instance.new("UICorner")
|
|
TitleCorner.CornerRadius = UDim.new(0, 12)
|
|
TitleCorner.Parent = Title
|
|
|
|
-- Content
|
|
local ContentFrame = Instance.new("ScrollingFrame")
|
|
ContentFrame.Parent = MainFrame
|
|
ContentFrame.BackgroundTransparency = 1
|
|
ContentFrame.Position = UDim2.new(0, 10, 0, 50)
|
|
ContentFrame.Size = UDim2.new(1, -20, 1, -60)
|
|
ContentFrame.CanvasSize = UDim2.new(0, 0, 0, 600)
|
|
ContentFrame.ScrollBarThickness = 8
|
|
|
|
-- Toggle Functions
|
|
local function CreateToggle(text, yPos, callback, defaultState)
|
|
local ToggleFrame = Instance.new("Frame")
|
|
ToggleFrame.Parent = ContentFrame
|
|
ToggleFrame.BackgroundColor3 = Color3.fromRGB(35, 35, 40)
|
|
ToggleFrame.BorderSizePixel = 0
|
|
ToggleFrame.Position = UDim2.new(0, 0, 0, yPos)
|
|
ToggleFrame.Size = UDim2.new(1, 0, 0, 30)
|
|
|
|
local FrameCorner = Instance.new("UICorner")
|
|
FrameCorner.CornerRadius = UDim.new(0, 6)
|
|
FrameCorner.Parent = ToggleFrame
|
|
|
|
local Label = Instance.new("TextLabel")
|
|
Label.Parent = ToggleFrame
|
|
Label.BackgroundTransparency = 1
|
|
Label.Position = UDim2.new(0, 10, 0, 0)
|
|
Label.Size = UDim2.new(1, -70, 1, 0)
|
|
Label.Font = Enum.Font.SourceSans
|
|
Label.Text = text
|
|
Label.TextColor3 = Color3.fromRGB(255, 255, 255)
|
|
Label.TextSize = 12
|
|
Label.TextXAlignment = Enum.TextXAlignment.Left
|
|
|
|
local Toggle = Instance.new("TextButton")
|
|
Toggle.Parent = ToggleFrame
|
|
Toggle.BackgroundColor3 = defaultState and Color3.fromRGB(50, 200, 100) or Color3.fromRGB(200, 100, 100)
|
|
Toggle.BorderSizePixel = 0
|
|
Toggle.Position = UDim2.new(1, -60, 0, 5)
|
|
Toggle.Size = UDim2.new(0, 55, 0, 20)
|
|
Toggle.Font = Enum.Font.SourceSansBold
|
|
Toggle.Text = defaultState and "เปิด" or "ปิด"
|
|
Toggle.TextColor3 = Color3.fromRGB(255, 255, 255)
|
|
Toggle.TextSize = 10
|
|
|
|
local ToggleCorner = Instance.new("UICorner")
|
|
ToggleCorner.CornerRadius = UDim.new(0, 4)
|
|
ToggleCorner.Parent = Toggle
|
|
|
|
local isOn = defaultState or false
|
|
Toggle.MouseButton1Click:Connect(function()
|
|
isOn = not isOn
|
|
Toggle.Text = isOn and "เปิด" or "ปิด"
|
|
local targetColor = isOn and Color3.fromRGB(50, 200, 100) or Color3.fromRGB(200, 100, 100)
|
|
|
|
TweenService:Create(Toggle, TweenInfo.new(0.3), {
|
|
BackgroundColor3 = targetColor
|
|
}):Play()
|
|
|
|
if callback then callback(isOn) end
|
|
end)
|
|
|
|
return Toggle
|
|
end
|
|
|
|
-- Create Toggles
|
|
CreateToggle("🚶 เดินอัตโนมัติ", 10, function(state) FarmSettings.AutoWalk = state end, FarmSettings.AutoWalk)
|
|
CreateToggle("🚜 เก็บอัตโนมัติ", 50, function(state) FarmSettings.AutoHarvest = state end, FarmSettings.AutoHarvest)
|
|
CreateToggle("🌱 ปลูกอัตโนมัติ", 90, function(state) FarmSettings.AutoPlant = state end, FarmSettings.AutoPlant)
|
|
CreateToggle("💰 ขายอัตโนมัติ", 130, function(state) FarmSettings.AutoSell = state end, FarmSettings.AutoSell)
|
|
CreateToggle("🛒 ซื้อเมล็ดอัตโนมัติ", 170, function(state) FarmSettings.AutoBuySeeds = state end, FarmSettings.AutoBuySeeds)
|
|
CreateToggle("🥚 ฟักไข่อัตโนมัติ", 210, function(state) FarmSettings.AutoHatchEgg = state end, FarmSettings.AutoHatchEgg)
|
|
CreateToggle("🍼 ให้อาหารอัตโนมัติ", 250, function(state) FarmSettings.AutoFeedPets = state end, FarmSettings.AutoFeedPets)
|
|
CreateToggle("🛒 ซื้อไข่อัตโนมัติ", 290, function(state) FarmSettings.AutoBuyEggs = state end, FarmSettings.AutoBuyEggs)
|
|
CreateToggle("🎭 แอนิเมชั่นเรียบ", 330, function(state) FarmSettings.UseSmoothAnimations = state end, FarmSettings.UseSmoothAnimations)
|
|
|
|
print("✅ สร้าง UI ระบบฟาร์มสำเร็จ")
|
|
end
|
|
|
|
-- Initialize
|
|
print("🌱 เริ่มต้นระบบฟาร์มแบบเต็มรูปแบบ...")
|
|
|
|
wait(1)
|
|
|
|
CreateCompleteFarmUI()
|
|
StartCompleteFarmLoops()
|
|
|
|
game:GetService("StarterGui"):SetCore("SendNotification", {
|
|
Title = "🌱 ระบบฟาร์มแบบเต็มรูปแบบ",
|
|
Text = "ระบบฟาร์มแบบเต็มรูปแบบพร้อมใช้งาน!",
|
|
Duration = 3
|
|
})
|
|
|
|
print("🌱 " .. string.rep("=", 50))
|
|
print("✅ ระบบฟาร์มแบบเต็มรูปแบบพร้อมใช้งาน!")
|
|
print("🚶 เดิน: ทุก " .. FarmSettings.WalkInterval .. " วินาที")
|
|
print("🚜 เก็บ: ทุก " .. FarmSettings.HarvestDelay .. " วินาที")
|
|
print("🌱 ปลูก: ทุก " .. FarmSettings.PlantInterval .. " วินาที")
|
|
print("💰 ขาย: เมื่อเต็มกระเป๋า")
|
|
print("🛒 ซื้อเมล็ด: ทุก " .. FarmSettings.BuyInterval .. " วินาที")
|
|
print("🥚 ฟักไข่: ทุก " .. FarmSettings.HatchInterval .. " วินาที")
|
|
print("🍼 ให้อาหาร: ทุก " .. FarmSettings.FeedInterval .. " วินาที")
|
|
print("🛒 ซื้อไข่: ทุก " .. FarmSettings.BuyEggInterval .. " วินาที")
|
|
print("🌱 " .. string.rep("=", 50))
|
|
|
|
return {
|
|
Settings = FarmSettings,
|
|
UI = _G.CompleteFarmSystemUI,
|
|
MyFarm = MyFarm
|
|
} |