Untitled
unknown
plain_text
7 months ago
43 kB
5
Indexable
local Players = game:GetService("Players")
local Teams = game:GetService("Teams")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Modülleri içe aktar
local TeamButtonModule = require(script.Parent.TeamButtonModule)
local GuiAnimationService = require(script.Parent.GuiAnimationService)
-- Oyuncu verileri
local playerTeamData = {}
local teamSwitchCooldowns = {}
local teamChangeConnections = {}
local playerPermanentTeam = {}
local lastHandledCharacters = {}
-- Hata ayıklama modu
local DEBUG_MODE = true
local function debugPrint(...)
if DEBUG_MODE then
print("[TeamSwitcher]", ...)
end
end
-- Configuration
local CONFIG = {
OPEN_KEY = Enum.KeyCode.T,
MAIN_COLOR = Color3.fromRGB(211, 47, 47),
SECONDARY_COLOR = Color3.fromRGB(30, 30, 30),
ACCENT_COLOR = Color3.fromRGB(240, 240, 240),
CORNER_RADIUS = UDim.new(0, 10),
BUTTON_HOVER_SCALE = 1.05,
BACKGROUND_IMAGE_ID = "rbxassetid://5843010904",
MAIN_GROUP_ID = 35804679,
STRICT_GROUP_CHECK = true,
FORCE_SPAWN_LOCATION = true,
RESPAWN_DELAY = 0.5,
RESPAWN_HEIGHT = 4,
SAVE_TEAMS_TO_ATTRIBUTES = true
}
-- Özel grup ID'leri
local SPECIFIC_GROUP_IDS = {
JANDARMA_GROUP_ID = 35821336,
ORDU_SUBAYLARI_GROUP_ID = 35824582,
ORDU_GENERALLERI_GROUP_ID = 35824586,
ISYANCILAR_GROUP_ID = CONFIG.MAIN_GROUP_ID + 3,
ASKERI_INZIBAT_GROUP_ID = 35824215,
OZEL_KUVVETLER_GROUP_ID = 35824297,
HAVA_KUVVETLERI_GROUP_ID = 35824206,
DONANMA_KUVVETLERI_GROUP_ID = 35824208,
KARA_KUVVETLERI_GROUP_ID = 35824213,
SINIR_MUFETTISLERI_GROUP_ID = 35824299
}
-- Alt grup ID'leri
local SUB_GROUP_IDS = {
SPECIFIC_GROUP_IDS.ORDU_SUBAYLARI_GROUP_ID,
SPECIFIC_GROUP_IDS.ORDU_GENERALLERI_GROUP_ID,
SPECIFIC_GROUP_IDS.ISYANCILAR_GROUP_ID,
SPECIFIC_GROUP_IDS.ASKERI_INZIBAT_GROUP_ID,
SPECIFIC_GROUP_IDS.OZEL_KUVVETLER_GROUP_ID,
SPECIFIC_GROUP_IDS.HAVA_KUVVETLERI_GROUP_ID,
SPECIFIC_GROUP_IDS.JANDARMA_GROUP_ID,
SPECIFIC_GROUP_IDS.DONANMA_KUVVETLERI_GROUP_ID,
SPECIFIC_GROUP_IDS.KARA_KUVVETLERI_GROUP_ID,
SPECIFIC_GROUP_IDS.SINIR_MUFETTISLERI_GROUP_ID
}
-- Team Configurations with Group Integration
local TEAMS = {
{
name = "Türk Silahlı Kuvvetleri",
color = Color3.fromRGB(211, 47, 47),
description = "Türk Silahlı Kuvvetleri (TSK)",
spawnName = "Türk Silahlı KuvvetleriSpawn",
icon = "rbxassetid://140528649686916",
groupId = CONFIG.MAIN_GROUP_ID,
isMainTeam = true
},
{
name = "Ordu Subayları",
color = Color3.fromRGB(45, 65, 40),
description = "TSK Ordu Subayları",
spawnName = "Ordu SubaylarıSpawn",
icon = "rbxassetid://138263973754691",
groupId = SPECIFIC_GROUP_IDS.ORDU_SUBAYLARI_GROUP_ID
},
{
name = "Ordu Generalleri",
color = Color3.fromRGB(112, 25, 25),
description = "TSK Ordu Generalleri",
spawnName = "Ordu GeneralleriSpawn",
icon = "rbxassetid://138757980815031",
groupId = SPECIFIC_GROUP_IDS.ORDU_GENERALLERI_GROUP_ID
},
{
name = "Siviller",
color = Color3.fromRGB(155, 155, 155),
description = "Sivil Halk",
spawnName = "SivillerSpawn",
icon = "rbxassetid://110636224788748",
groupId = 0,
isPublicTeam = true
},
{
name = "İsyancılar",
color = Color3.fromRGB(82, 0, 0),
description = "İsyancı Gruplar",
spawnName = "İsyancılarSpawn",
icon = "rbxassetid://78830197031582",
groupId = SPECIFIC_GROUP_IDS.ISYANCILAR_GROUP_ID
},
{
name = "Askeri İnzibat",
color = Color3.fromRGB(34, 34, 34),
description = "Askeri İnzibat (Askeri Polis)",
spawnName = "Askeri İnzibatSpawn",
icon = "rbxassetid://102987656736272",
groupId = SPECIFIC_GROUP_IDS.ASKERI_INZIBAT_GROUP_ID
},
{
name = "Özel Kuvvetler Komutanlığı",
color = Color3.fromRGB(78, 42, 132),
description = "Özel Kuvvetler Komutanlığı (ÖKK)",
spawnName = "Özel Kuvvetler KomutanlığıSpawn",
icon = "rbxassetid://86678101362245",
groupId = SPECIFIC_GROUP_IDS.OZEL_KUVVETLER_GROUP_ID
},
{
name = "Hava Kuvvetleri Komutanlığı",
color = Color3.fromRGB(58, 83, 155),
description = "Türk Hava Kuvvetleri Komutanlığı",
spawnName = "Hava Kuvvetleri KomutanlığıSpawn",
icon = "rbxassetid://86801105203862",
groupId = SPECIFIC_GROUP_IDS.HAVA_KUVVETLERI_GROUP_ID
},
{
name = "Jandarma Genel Komutanlığı",
color = Color3.fromRGB(26, 83, 92),
description = "Jandarma Genel Komutanlığı (JGK)",
spawnName = "Jandarma Genel KomutanlığıSpawn",
icon = "rbxassetid://81501472740069",
groupId = SPECIFIC_GROUP_IDS.JANDARMA_GROUP_ID
},
{
name = "Donanma Kuvvetleri Komutanlığı",
color = Color3.fromRGB(24, 61, 93),
description = "Türk Donanma Kuvvetleri Komutanlığı",
spawnName = "Donanma Kuvvetleri KomutanlığıSpawn",
icon = "rbxassetid://87731845578519",
groupId = SPECIFIC_GROUP_IDS.DONANMA_KUVVETLERI_GROUP_ID
},
{
name = "Kara Kuvvetleri Komutanlığı",
color = Color3.fromRGB(39, 55, 77),
description = "Türk Kara Kuvvetleri Komutanlığı",
spawnName = "Kara Kuvvetleri KomutanlığıSpawn",
icon = "rbxassetid://140025613264917",
groupId = SPECIFIC_GROUP_IDS.KARA_KUVVETLERI_GROUP_ID
},
{
name = "Sınır Müfettişleri",
color = Color3.fromRGB(0, 100, 0),
description = "Sınır Güvenliği Müfettişleri",
spawnName = "Sınır MüfettişleriSpawn",
icon = "rbxassetid://85035782865397",
groupId = SPECIFIC_GROUP_IDS.SINIR_MUFETTISLERI_GROUP_ID
}
}
-- Takım adı ile grup ID'sini eşleştiren tablo - hızlı arama için
local TEAM_NAME_TO_GROUP_ID = {}
for _, teamData in ipairs(TEAMS) do
if teamData.groupId > 0 and not teamData.isMainTeam then
TEAM_NAME_TO_GROUP_ID[teamData.name] = teamData.groupId
end
end
-- Grup ID'si ile takım adını eşleştiren tablo - hızlı arama için
local GROUP_ID_TO_TEAM_NAME = {}
for teamName, groupId in pairs(TEAM_NAME_TO_GROUP_ID) do
GROUP_ID_TO_TEAM_NAME[groupId] = teamName
end
-- Takım önbelleği
local teamCache = {}
-- Spawn Lokasyonları
local spawnLocationsCache = {}
-- Oyuncunun takım bilgisini attribute'larda sakla
local function savePlayerTeamToAttributes(player, teamName, spawnName)
if CONFIG.SAVE_TEAMS_TO_ATTRIBUTES and player then
player:SetAttribute("CurrentTeam", teamName)
player:SetAttribute("CurrentSpawn", spawnName)
debugPrint("Oyuncu takım bilgisi attribute'a kaydedildi: " .. player.Name .. " -> " .. teamName)
end
end
-- Oyuncunun takım bilgisini attribute'lardan yükle
local function loadPlayerTeamFromAttributes(player)
if CONFIG.SAVE_TEAMS_TO_ATTRIBUTES and player then
local savedTeam = player:GetAttribute("CurrentTeam")
local savedSpawn = player:GetAttribute("CurrentSpawn")
if savedTeam and savedSpawn then
debugPrint("Oyuncu takım bilgisi attribute'tan yüklendi: " .. player.Name .. " -> " .. savedTeam)
return {
teamName = savedTeam,
spawnName = savedSpawn
}
end
end
return nil
end
-- Oyuncunun kalıcı takımını ayarla
local function setPermanentTeam(player, teamName, spawnName)
if not player then return end
playerPermanentTeam[player.UserId] = {
teamName = teamName,
spawnName = spawnName
}
savePlayerTeamToAttributes(player, teamName, spawnName)
debugPrint("Oyuncunun kalıcı takımı ayarlandı: " .. player.Name .. " -> " .. teamName)
end
-- Oyuncunun kalıcı takımını al
local function getPermanentTeam(player)
if not player then return nil end
if playerPermanentTeam[player.UserId] then
return playerPermanentTeam[player.UserId]
end
local attributeData = loadPlayerTeamFromAttributes(player)
if attributeData then
playerPermanentTeam[player.UserId] = attributeData
return attributeData
end
return nil
end
-- Bul ve önbelleğe alma
local function findRespawnLocation(spawnName)
if spawnLocationsCache[spawnName] then
return spawnLocationsCache[spawnName]
end
local spawn = nil
local spawnFolder = workspace:FindFirstChild("SpawnLocations")
if spawnFolder then
spawn = spawnFolder:FindFirstChild(spawnName)
end
if not spawn then
spawn = workspace:FindFirstChild(spawnName)
end
if not spawn then
debugPrint("Spawn noktası bulunamadı, oluşturuluyor: " .. spawnName)
local color = Color3.fromRGB(200, 200, 200)
for _, team in ipairs(TEAMS) do
if team.spawnName == spawnName then
color = team.color
break
end
end
spawn = Instance.new("SpawnLocation")
spawn.Name = spawnName
spawn.Size = Vector3.new(8, 1, 8)
spawn.Position = Vector3.new(0, 10, 0)
spawn.Anchored = true
spawn.CanCollide = true
spawn.Material = Enum.Material.SmoothPlastic
spawn.BrickColor = BrickColor.new(color)
spawn.Neutral = true
if spawnFolder then
spawn.Parent = spawnFolder
else
spawn.Parent = workspace
end
end
spawn.Neutral = true
spawnLocationsCache[spawnName] = spawn
return spawn
end
-- Takımı önbellekten al veya oluştur
local function getTeam(teamName, teamColor)
if teamCache[teamName] then
return teamCache[teamName]
end
local team = Teams:FindFirstChild(teamName)
if not team then
team = Instance.new("Team")
team.Name = teamName
team.TeamColor = BrickColor.new(teamColor)
team.AutoAssignable = false
team.Parent = Teams
else
team.AutoAssignable = false
end
teamCache[teamName] = team
return team
end
-- İsme göre takım veri nesnesini bul
local function getTeamDataByName(teamName)
for _, teamData in ipairs(TEAMS) do
if teamData.name == teamName then
return teamData
end
end
return nil
end
-- Güvenli teleport fonksiyonu
local function teleportToSpawn(player, spawnName)
if not player or not player.Character then
debugPrint("Teleport başarısız: Karakter bulunamadı - " .. player.Name)
return false
end
local spawn = findRespawnLocation(spawnName)
if not spawn then
debugPrint("Teleport başarısız: Spawn bulunamadı - " .. spawnName)
return false
end
local hrp = player.Character:FindFirstChild("HumanoidRootPart")
if not hrp then
debugPrint("Teleport başarısız: HumanoidRootPart bulunamadı - " .. player.Name)
return false
end
local success, err = pcall(function()
hrp.CFrame = spawn.CFrame * CFrame.new(0, CONFIG.RESPAWN_HEIGHT, 0)
end)
if not success then
debugPrint("Teleport hatası: " .. tostring(err))
return false
end
debugPrint("Teleport başarılı: " .. player.Name .. " -> " .. spawnName)
return true
end
-- Asset ID doğrulama
local function validateAssetId(assetId)
if not assetId or assetId == "" then
return "rbxassetid://0"
end
if not string.match(assetId, "^rbxassetid://[0-9]+$") then
debugPrint("Geçersiz asset ID formatı: " .. assetId)
return "rbxassetid://0"
end
return assetId
end
-- Oyuncunun herhangi bir grupta olup olmadığını kontrol eden fonksiyon
local function isInAnyGroup(player)
if not player then return false, nil end
local success, isInMainGroup = pcall(function()
return player:IsInGroup(CONFIG.MAIN_GROUP_ID)
end)
if success and isInMainGroup then
return true, CONFIG.MAIN_GROUP_ID
end
for _, groupId in ipairs(SUB_GROUP_IDS) do
local success, inGroup = pcall(function()
return player:IsInGroup(groupId)
end)
if success and inGroup then
return true, groupId
end
end
return false, nil
end
-- Oyuncunun herhangi bir alt grupta olup olmadığını kontrol eden fonksiyon
local function isInAnySubGroup(player)
if not player then return false, nil end
for _, groupId in ipairs(SUB_GROUP_IDS) do
local success, inGroup = pcall(function()
return player:IsInGroup(groupId)
end)
if success and inGroup then
return true, groupId
end
end
return false, nil
end
-- Oyuncunun ana grupta olup olmadığını kontrol eden fonksiyon
local function isInMainGroup(player)
if not player then return false end
local success, isInGroup = pcall(function()
return player:IsInGroup(CONFIG.MAIN_GROUP_ID)
end)
return success and isInGroup
end
-- Oyuncunun belirli bir grupta olup olmadığını kontrol eden fonksiyon
local function isInSpecificGroup(player, groupId)
if not player then return false end
local success, isInGroup = pcall(function()
return player:IsInGroup(groupId)
end)
return success and isInGroup
end
-- Oyuncunun belirli bir takıma geçiş yapıp yapamayacağını kontrol eden fonksiyon
local function canJoinTeam(player, teamData)
if not player or not teamData then return false end
if teamData.isPublicTeam or teamData.name == "Siviller" then
local inAnyGroup, _ = isInAnyGroup(player)
return not inAnyGroup
end
if teamData.isMainTeam then
local inAnyGroup, _ = isInAnyGroup(player)
return inAnyGroup
end
if CONFIG.STRICT_GROUP_CHECK and teamData.groupId > 0 then
return isInSpecificGroup(player, teamData.groupId)
end
return false
end
-- Takım değiştirme sınırlaması
local function canSwitchTeam(player)
if not player then return false, "Oyuncu bulunamadı" end
local lastSwitch = teamSwitchCooldowns[player.UserId]
local cooldownTime = 60
if lastSwitch and (tick() - lastSwitch) < cooldownTime then
return false, "Takım değiştirmek için " .. math.ceil(cooldownTime - (tick() - lastSwitch)) .. " saniye beklemelisiniz."
end
return true, ""
end
-- Cooldown'ı kaydet
local function recordTeamSwitch(player)
if not player then return end
teamSwitchCooldowns[player.UserId] = tick()
end
-- Oyuncunun takımını değiştir
local function switchTeam(player, teamName)
if not player or not teamName then
debugPrint("Takım değiştirme başarısız: Geçersiz parametre")
return false
end
debugPrint("Takım değiştirme işlemi: " .. player.Name .. " -> " .. teamName)
local teamData = getTeamDataByName(teamName)
if not teamData then
debugPrint("Takım bulunamadı: " .. teamName)
return false
end
local team = getTeam(teamName, teamData.color)
player.Team = team
playerTeamData[player.UserId] = {
teamName = teamName,
spawnName = teamData.spawnName
}
setPermanentTeam(player, teamName, teamData.spawnName)
debugPrint("Oyuncu takıma atandı: " .. player.Name .. " -> " .. teamName)
return true
end
-- Teleport işlemini yapan fonksiyon
local function teleportPlayerToTeamSpawn(player)
if not player or not player.Character then return end
local teamData = nil
if player.Team then
teamData = getTeamDataByName(player.Team.Name)
end
if not teamData then
local savedTeamInfo = getPermanentTeam(player)
if savedTeamInfo then
teamData = getTeamDataByName(savedTeamInfo.teamName)
end
end
if not teamData then
local inAnyGroup = isInAnyGroup(player)
if inAnyGroup then
teamData = getTeamDataByName("Türk Silahlı Kuvvetleri")
else
teamData = getTeamDataByName("Siviller")
end
end
if teamData and teamData.spawnName then
teleportToSpawn(player, teamData.spawnName)
end
end
-- Takım belirleme
local function determineInitialTeam(player)
if not player then return "Siviller" end
local inAnyGroup, _ = isInAnyGroup(player)
if inAnyGroup then
return "Türk Silahlı Kuvvetleri"
end
return "Siviller"
end
-- Function to create the main GUI structure
local function createTeamSwitcherGui(player)
if not player then return nil end
local existingGui = player.PlayerGui:FindFirstChild("TeamSwitcherGui")
if existingGui then
existingGui:Destroy()
end
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "TeamSwitcherGui"
screenGui.ResetOnSpawn = false
screenGui.DisplayOrder = 100
screenGui.Enabled = false
local backgroundFrame = Instance.new("Frame")
backgroundFrame.Name = "BackgroundFrame"
backgroundFrame.Size = UDim2.new(1, 0, 1, 0)
backgroundFrame.Position = UDim2.new(0, 0, 0, 0)
backgroundFrame.BackgroundColor3 = Color3.new(0, 0, 0)
backgroundFrame.BackgroundTransparency = 1
backgroundFrame.BorderSizePixel = 0
backgroundFrame.Parent = screenGui
local mainFrame = Instance.new("Frame")
mainFrame.Name = "MainFrame"
mainFrame.Size = UDim2.new(0.5, 0, 0.55, 0)
mainFrame.Position = UDim2.new(0.5, 0, 0.5, 0)
mainFrame.AnchorPoint = Vector2.new(0.5, 0.5)
mainFrame.BackgroundColor3 = CONFIG.SECONDARY_COLOR
mainFrame.BorderSizePixel = 0
local mainBackground = Instance.new("ImageLabel")
mainBackground.Name = "MainBackground"
mainBackground.Size = UDim2.new(1, 0, 1, 0)
mainBackground.Position = UDim2.new(0, 0, 0, 0)
mainBackground.BackgroundTransparency = 1
mainBackground.Image = validateAssetId(CONFIG.BACKGROUND_IMAGE_ID)
mainBackground.ImageColor3 = Color3.fromRGB(20, 20, 20)
mainBackground.ImageTransparency = 0.2
mainBackground.ScaleType = Enum.ScaleType.Stretch
mainBackground.ZIndex = 0
debugPrint("Arka plan resmi yükleniyor: " .. CONFIG.BACKGROUND_IMAGE_ID)
mainBackground.Parent = mainFrame
local mainFrameGradient = Instance.new("UIGradient")
mainFrameGradient.Rotation = 45
mainFrameGradient.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromRGB(35, 35, 35)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(25, 25, 25))
})
mainFrameGradient.Transparency = NumberSequence.new({
NumberSequenceKeypoint.new(0, 0.4),
NumberSequenceKeypoint.new(1, 0.7)
})
mainFrameGradient.Parent = mainFrame
mainFrame.Parent = screenGui
local uiCorner = Instance.new("UICorner")
uiCorner.CornerRadius = CONFIG.CORNER_RADIUS
uiCorner.Parent = mainFrame
local border = Instance.new("UIStroke")
border.Color = Color3.fromRGB(80, 80, 80)
border.Thickness = 1.5
border.Transparency = 0.3
border.Parent = mainFrame
local shadowFrame = Instance.new("Frame")
shadowFrame.Name = "Shadow"
shadowFrame.Size = UDim2.new(1, 10, 1, 10)
shadowFrame.Position = UDim2.new(0.5, 0, 0.5, 0)
shadowFrame.AnchorPoint = Vector2.new(0.5, 0.5)
shadowFrame.BackgroundColor3 = Color3.new(0, 0, 0)
shadowFrame.BackgroundTransparency = 0.6
shadowFrame.BorderSizePixel = 0
shadowFrame.ZIndex = -1
local shadowCorner = Instance.new("UICorner")
shadowCorner.CornerRadius = UDim.new(0, 14)
shadowCorner.Parent = shadowFrame
local shadowBlur = Instance.new("UIGradient")
shadowBlur.Rotation = 90
shadowBlur.Transparency = NumberSequence.new({
NumberSequenceKeypoint.new(0, 0.7),
NumberSequenceKeypoint.new(0.5, 0.8),
NumberSequenceKeypoint.new(1, 0.9)
})
shadowBlur.Parent = shadowFrame
shadowFrame.Parent = mainFrame
local titleBar = Instance.new("Frame")
titleBar.Name = "TitleBar"
titleBar.Size = UDim2.new(1, 0, 0.08, 0)
titleBar.Position = UDim2.new(0, 0, 0, 0)
titleBar.BackgroundColor3 = Color3.fromRGB(20, 20, 20)
titleBar.BackgroundTransparency = 0.2
titleBar.BorderSizePixel = 0
titleBar.ZIndex = 2
titleBar.Parent = mainFrame
local titleGradient = Instance.new("UIGradient")
titleGradient.Rotation = 90
titleGradient.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromRGB(40, 40, 40)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(20, 20, 20))
})
titleGradient.Parent = titleBar
local titleCorner = Instance.new("UICorner")
titleCorner.CornerRadius = CONFIG.CORNER_RADIUS
titleCorner.Parent = titleBar
local bottomFrame = Instance.new("Frame")
bottomFrame.Name = "BottomFrame"
bottomFrame.Size = UDim2.new(1, 0, 0.5, 0)
bottomFrame.Position = UDim2.new(0, 0, 0.5, 0)
bottomFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 20)
bottomFrame.BackgroundTransparency = 0.2
bottomFrame.BorderSizePixel = 0
bottomFrame.ZIndex = 2
bottomFrame.Parent = titleBar
local bottomGradient = titleGradient:Clone()
bottomGradient.Parent = bottomFrame
local titleBackground = Instance.new("Frame")
titleBackground.Name = "TitleBackground"
titleBackground.Size = UDim2.new(0.35, 0, 1.2, 0)
titleBackground.Position = UDim2.new(0.05, 0, -0.1, 0)
titleBackground.BackgroundColor3 = CONFIG.MAIN_COLOR
titleBackground.BorderSizePixel = 0
titleBackground.ZIndex = 3
titleBackground.Parent = titleBar
local titleBgGradient = Instance.new("UIGradient")
titleBgGradient.Rotation = 45
titleBgGradient.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromRGB(230, 60, 60)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(170, 30, 30))
})
titleBgGradient.Parent = titleBackground
local titleBgCorner = Instance.new("UICorner")
titleBgCorner.CornerRadius = UDim.new(0, 8)
titleBgCorner.Parent = titleBackground
local titleText = Instance.new("TextLabel")
titleText.Name = "TitleText"
titleText.Size = UDim2.new(0.9, 0, 0.9, 0)
titleText.Position = UDim2.new(0.05, 0, 0.05, 0)
titleText.BackgroundTransparency = 1
titleText.Text = "TAKIMLAR"
titleText.Font = Enum.Font.GothamBlack
titleText.TextColor3 = Color3.new(1, 1, 1)
titleText.TextSize = 22
titleText.ZIndex = 4
local textStroke = Instance.new("UIStroke")
textStroke.Color = Color3.fromRGB(0, 0, 0)
textStroke.Thickness = 1
textStroke.Transparency = 0.5
textStroke.Parent = titleText
titleText.Parent = titleBackground
local iconContainer = Instance.new("Frame")
iconContainer.Name = "IconContainer"
iconContainer.Size = UDim2.new(0.08, 0, 0.8, 0)
iconContainer.Position = UDim2.new(0.24, 0, 0.1, 0)
iconContainer.BackgroundTransparency = 1
iconContainer.ZIndex = 4
iconContainer.Parent = titleBackground
local teamIcon = Instance.new("ImageLabel")
teamIcon.Name = "TeamIcon"
teamIcon.Size = UDim2.new(1, 0, 1, 0)
teamIcon.BackgroundTransparency = 1
teamIcon.Image = validateAssetId("rbxassetid://7743845014")
teamIcon.ScaleType = Enum.ScaleType.Fit
teamIcon.ZIndex = 4
teamIcon.Parent = iconContainer
local tsoTitle = Instance.new("TextLabel")
tsoTitle.Name = "TSOTitle"
tsoTitle.Size = UDim2.new(0.35, 0, 0.8, 0)
tsoTitle.Position = UDim2.new(0.50, 0, 0.1, 0)
tsoTitle.BackgroundTransparency = 1
tsoTitle.Text = "|TSO| Türk Silahlı Ordusu"
tsoTitle.Font = Enum.Font.GothamBold
tsoTitle.TextColor3 = Color3.fromRGB(200, 200, 200)
tsoTitle.TextSize = 16
tsoTitle.TextXAlignment = Enum.TextXAlignment.Right
tsoTitle.ZIndex = 4
tsoTitle.Parent = titleBar
local tsoTextStroke = Instance.new("UIStroke")
tsoTextStroke.Color = Color3.fromRGB(0, 0, 0)
tsoTextStroke.Thickness = 1
tsoTextStroke.Transparency = 0.7
tsoTextStroke.Parent = tsoTitle
local closeButton = Instance.new("TextButton")
closeButton.Name = "CloseButton"
closeButton.Size = UDim2.new(0.06, 0, 0.8, 0)
closeButton.Position = UDim2.new(0.94, 0, 0.1, 0)
closeButton.AnchorPoint = Vector2.new(0.5, 0)
closeButton.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
closeButton.BorderSizePixel = 0
closeButton.Text = "X"
closeButton.Font = Enum.Font.GothamBold
closeButton.TextColor3 = Color3.fromRGB(255, 255, 255)
closeButton.TextSize = 20
closeButton.ZIndex = 4
closeButton.Parent = titleBar
local closeTextStroke = Instance.new("UIStroke")
closeTextStroke.Color = Color3.fromRGB(0, 0, 0)
closeTextStroke.Thickness = 1
closeTextStroke.Transparency = 0.7
closeTextStroke.Parent = closeButton
local closeGradient = Instance.new("UIGradient")
closeGradient.Rotation = 90
closeGradient.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromRGB(220, 70, 70)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(180, 40, 40))
})
closeGradient.Parent = closeButton
local closeCorner = Instance.new("UICorner")
closeCorner.CornerRadius = UDim.new(0, 6)
closeCorner.Parent = closeButton
closeButton.MouseEnter:Connect(function()
closeGradient.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 80, 80)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(200, 50, 50))
})
closeButton.TextColor3 = Color3.fromRGB(255, 255, 255)
closeTextStroke.Transparency = 0.5
end)
closeButton.MouseLeave:Connect(function()
closeGradient.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromRGB(220, 70, 70)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(180, 40, 40))
})
closeButton.TextColor3 = Color3.fromRGB(255, 255, 255)
closeTextStroke.Transparency = 0.7
end)
local contentFrame = Instance.new("Frame")
contentFrame.Name = "ContentFrame"
contentFrame.Size = UDim2.new(1, 0, 0.92, 0)
contentFrame.Position = UDim2.new(0, 0, 0.08, 0)
contentFrame.BackgroundColor3 = Color3.fromRGB(35, 35, 35)
contentFrame.BackgroundTransparency = 0.4
contentFrame.BorderSizePixel = 0
contentFrame.ZIndex = 1
contentFrame.Parent = mainFrame
local contentGradient = Instance.new("UIGradient")
contentGradient.Rotation = 135
contentGradient.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromRGB(40, 40, 40)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(30, 30, 30))
})
contentGradient.Transparency = NumberSequence.new({
NumberSequenceKeypoint.new(0, 0.4),
NumberSequenceKeypoint.new(1, 0.6)
})
contentGradient.Parent = contentFrame
local teamButtonsContainer = Instance.new("Frame")
teamButtonsContainer.Name = "TeamButtonsContainer"
teamButtonsContainer.Size = UDim2.new(0.95, 0, 0.9, 0)
teamButtonsContainer.Position = UDim2.new(0.5, 0, 0.5, 0)
teamButtonsContainer.AnchorPoint = Vector2.new(0.5, 0.5)
teamButtonsContainer.BackgroundTransparency = 1
teamButtonsContainer.ZIndex = 2
teamButtonsContainer.Parent = contentFrame
local gridLayout = Instance.new("UIGridLayout")
gridLayout.CellSize = UDim2.new(0.235, 0, 0.235, 0)
gridLayout.CellPadding = UDim2.new(0.018, 0, 0.018, 0)
gridLayout.SortOrder = Enum.SortOrder.LayoutOrder
gridLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center
gridLayout.VerticalAlignment = Enum.VerticalAlignment.Center
gridLayout.Parent = teamButtonsContainer
local scrollingFrame = Instance.new("ScrollingFrame")
scrollingFrame.Name = "ScrollingFrame"
scrollingFrame.Size = UDim2.new(1, 0, 1, 0)
scrollingFrame.Position = UDim2.new(0, 0, 0, 0)
scrollingFrame.BackgroundTransparency = 1
scrollingFrame.ScrollBarThickness = 4
scrollingFrame.ScrollBarImageColor3 = Color3.fromRGB(180, 180, 180)
scrollingFrame.ScrollingDirection = Enum.ScrollingDirection.Y
scrollingFrame.AutomaticCanvasSize = Enum.AutomaticSize.Y
scrollingFrame.CanvasSize = UDim2.new(0, 0, 0, 0)
scrollingFrame.ZIndex = 3
scrollingFrame.Parent = teamButtonsContainer
gridLayout.Parent = scrollingFrame
local inMainGroup = isInMainGroup(player)
local inAnySubGroup, subGroupId = isInAnySubGroup(player)
local playerSpecificGroups = {}
for groupId, teamName in pairs(GROUP_ID_TO_TEAM_NAME) do
if isInSpecificGroup(player, groupId) then
table.insert(playerSpecificGroups, {
groupId = groupId,
teamName = teamName
})
end
end
for i, teamData in ipairs(TEAMS) do
local canJoin = canJoinTeam(player, teamData)
local teamButton = TeamButtonModule.createTeamButton(teamData, i, canJoin)
teamButton:SetAttribute("CanJoin", canJoin)
teamButton:SetAttribute("TeamName", teamData.name)
teamButton:SetAttribute("TeamColor", teamData.color)
teamButton:SetAttribute("SpawnName", teamData.spawnName)
teamButton.Parent = scrollingFrame
end
local infoFrame = Instance.new("Frame")
infoFrame.Name = "InfoFrame"
infoFrame.Size = UDim2.new(1, 0, 0.06, 0)
infoFrame.Position = UDim2.new(0, 0, 0.94, 0)
infoFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 20)
infoFrame.BackgroundTransparency = 0.3
infoFrame.BorderSizePixel = 0
infoFrame.ZIndex = 3
infoFrame.Parent = contentFrame
local infoGradient = Instance.new("UIGradient")
infoGradient.Rotation = 90
infoGradient.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromRGB(40, 40, 40)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(25, 25, 25))
})
infoGradient.Parent = infoFrame
local infoText = Instance.new("TextLabel")
infoText.Name = "InfoText"
infoText.Size = UDim2.new(1, -20, 1, 0)
infoText.Position = UDim2.new(0.5, 0, 0, 0)
infoText.AnchorPoint = Vector2.new(0.5, 0)
infoText.BackgroundTransparency = 1
infoText.Font = Enum.Font.Gotham
infoText.TextColor3 = Color3.fromRGB(200, 200, 200)
infoText.TextSize = 14
infoText.TextWrapped = true
infoText.TextXAlignment = Enum.TextXAlignment.Center
infoText.TextYAlignment = Enum.TextYAlignment.Center
infoText.ZIndex = 4
if inMainGroup then
infoText.Text = "TSO ana grup üyesisiniz. TSK takımına katılabilirsiniz."
elseif #playerSpecificGroups > 0 then
local groupInfo = playerSpecificGroups[1]
infoText.Text = groupInfo.teamName .. " grup üyesisiniz. Bu takıma katılabilirsiniz."
elseif inAnySubGroup then
local subGroupName = "bilinmeyen birim"
for _, teamData in ipairs(TEAMS) do
if teamData.groupId == subGroupId then
subGroupName = teamData.name
break
end
end
infoText.Text = subGroupName .. " grup üyesisiniz. Kendi takımınıza katılabilirsiniz."
else
infoText.Text = "TSO grubuna üye değilsiniz. Sadece Siviller takımına katılabilirsiniz."
end
infoText.Parent = infoFrame
screenGui.Parent = player:WaitForChild("PlayerGui")
return screenGui
end
-- Toggle GUI için ayrı bir ScreenGui oluştur
local function createToggleGui(player)
if not player then return nil, nil end
local existingToggleGui = player.PlayerGui:FindFirstChild("TeamSwitcherToggleGui")
if existingToggleGui then
existingToggleGui:Destroy()
end
local toggleGui = Instance.new("ScreenGui")
toggleGui.Name = "TeamSwitcherToggleGui"
toggleGui.ResetOnSpawn = false
toggleGui.DisplayOrder = 100
toggleGui.Parent = player.PlayerGui
local toggleButton = Instance.new("ImageButton")
toggleButton.Name = "TeamSwitcherToggle"
toggleButton.Size = UDim2.new(0, 60, 0, 60)
toggleButton.Position = UDim2.new(0.013, 0, 0.463, 0)
toggleButton.AnchorPoint = Vector2.new(0, 0)
toggleButton.BackgroundColor3 = Color3.fromRGB(200, 40, 40)
toggleButton.BorderSizePixel = 0
toggleButton.AutoLocalize = false
toggleButton.ZIndex = 3
local bagIcon = Instance.new("ImageLabel")
bagIcon.Name = "BagIcon"
bagIcon.Size = UDim2.new(0.7, 0, 0.7, 0)
bagIcon.Position = UDim2.new(0.5, 0, 0.5, 0)
bagIcon.AnchorPoint = Vector2.new(0.5, 0.5)
bagIcon.BackgroundTransparency = 1
bagIcon.Image = validateAssetId("rbxassetid://126899905535187")
bagIcon.ImageColor3 = Color3.fromRGB(255, 255, 255)
bagIcon.ScaleType = Enum.ScaleType.Fit
bagIcon.ZIndex = 4
bagIcon.Parent = toggleButton
local toggleGradient = Instance.new("UIGradient")
toggleGradient.Rotation = 45
toggleGradient.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromRGB(220, 50, 50)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(180, 30, 30))
})
toggleGradient.Parent = toggleButton
local toggleCorner = Instance.new("UICorner")
toggleCorner.CornerRadius = UDim.new(0, 8)
toggleCorner.Parent = toggleButton
local toggleShadow = Instance.new("Frame")
toggleShadow.Name = "Shadow"
toggleShadow.Size = UDim2.new(1, 6, 1, 6)
toggleShadow.Position = UDim2.new(0.5, 0, 0.5, 0)
toggleShadow.AnchorPoint = Vector2.new(0.5, 0.5)
toggleShadow.BackgroundColor3 = Color3.new(0, 0, 0)
toggleShadow.BackgroundTransparency = 0.7
toggleShadow.BorderSizePixel = 0
toggleShadow.ZIndex = 2
toggleShadow.Parent = toggleButton
local toggleShadowCorner = Instance.new("UICorner")
toggleShadowCorner.CornerRadius = UDim.new(0, 10)
toggleShadowCorner.Parent = toggleShadow
toggleButton.MouseEnter:Connect(function()
toggleGradient.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromRGB(240, 60, 60)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(200, 40, 40))
})
bagIcon.ImageColor3 = Color3.fromRGB(255, 255, 255)
end)
toggleButton.MouseLeave:Connect(function()
toggleGradient.Color = ColorSequence.new({
ColorSequenceKeypoint.new(0, Color3.fromRGB(220, 50, 50)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(180, 30, 30))
})
bagIcon.ImageColor3 = Color3.fromRGB(255, 255, 255)
end)
toggleButton.Parent = toggleGui
return toggleGui, toggleButton
end
-- GUI'nin hazırlanması için ana fonksiyon
local function setupPlayerGui(player)
if not player then return nil, nil end
debugPrint("GUI kurulumu başlatılıyor: " .. player.Name)
local gui = createTeamSwitcherGui(player)
local toggleGui, toggleButton = createToggleGui(player)
if not gui or not toggleGui or not toggleButton then
debugPrint("GUI oluşturulamadı")
return nil, nil
end
toggleButton.MouseButton1Click:Connect(function()
if gui.Enabled then
GuiAnimationService.closeGui(gui)
else
GuiAnimationService.openGui(gui)
end
end)
local closeButton = gui.MainFrame.TitleBar.CloseButton
closeButton.MouseButton1Click:Connect(function()
GuiAnimationService.closeGui(gui)
end)
local backgroundFrame = gui.BackgroundFrame
backgroundFrame.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 then
GuiAnimationService.closeGui(gui)
end
end)
local scrollingFrame = gui.MainFrame.ContentFrame.TeamButtonsContainer.ScrollingFrame
for _, teamButton in pairs(scrollingFrame:GetChildren()) do
if teamButton:IsA("Frame") and teamButton.Name:find("TeamButton_") then
local button = teamButton:FindFirstChild("SelectButton")
if not button then continue end
button.MouseEnter:Connect(function()
if teamButton:GetAttribute("CanJoin") then
GuiAnimationService.buttonHover(teamButton, true, teamButton:GetAttribute("TeamColor"))
end
end)
button.MouseLeave:Connect(function()
if teamButton:GetAttribute("CanJoin") then
GuiAnimationService.buttonHover(teamButton, false)
end
end)
button.MouseButton1Click:Connect(function()
if teamButton:GetAttribute("CanJoin") then
local teamName = teamButton:GetAttribute("TeamName")
if teamName then
local canSwitch, cooldownMessage = canSwitchTeam(player)
if not canSwitch then
local notification = Instance.new("TextLabel")
notification.Name = "Notification"
notification.Size = UDim2.new(0.4, 0, 0.1, 0)
notification.Position = UDim2.new(0.5, 0, 0.9, 0)
notification.AnchorPoint = Vector2.new(0.5, 1)
notification.BackgroundColor3 = Color3.fromRGB(200, 100, 0)
notification.BackgroundTransparency = 0.3
notification.BorderSizePixel = 0
notification.Text = cooldownMessage
notification.Font = Enum.Font.GothamBold
notification.TextColor3 = Color3.fromRGB(255, 255, 255)
notification.TextSize = 16
notification.ZIndex = 10
local notiCorner = Instance.new("UICorner")
notiCorner.CornerRadius = UDim.new(0, 6)
notiCorner.Parent = notification
notification.Parent = gui
task.delay(3, function()
if notification and notification.Parent then
notification:Destroy()
end
end)
return
end
recordTeamSwitch(player)
if switchTeam(player, teamName) then
local teamData = getTeamDataByName(teamName)
if teamData and teamData.spawnName and player.Character then
teleportToSpawn(player, teamData.spawnName)
end
debugPrint("Manuel takım geçişi: " .. player.Name .. " -> " .. teamName)
else
debugPrint("Takım değiştirmede sorun oluştu: " .. teamName)
end
GuiAnimationService.closeGui(gui)
end
else
local teamName = teamButton:GetAttribute("TeamName")
local teamData = nil
for _, data in ipairs(TEAMS) do
if data.name == teamName then
teamData = data
break
end
end
if teamData then
local message = ""
if teamData.name == "Siviller" then
message = "Siviller takımına sadece hiçbir grupta üye olmayanlar katılabilir."
elseif teamData.isMainTeam then
message = teamName .. " takımına katılmak için TSO ana grubuna veya bir alt gruba üye olmalısınız."
elseif teamData.groupId > 0 then
if TEAM_NAME_TO_GROUP_ID[teamData.name] then
message = teamName .. " takımına katılmak için " .. teamData.name .. " grubuna üye olmalısınız."
else
message = "Bu takıma katılmak için ilgili gruba üye olmalısınız."
end
else
message = "Bu takıma katılamazsınız."
end
local notification = Instance.new("TextLabel")
notification.Name = "Notification"
notification.Size = UDim2.new(0.4, 0, 0.1, 0)
notification.Position = UDim2.new(0.5, 0, 0.9, 0)
notification.AnchorPoint = Vector2.new(0.5, 1)
notification.BackgroundColor3 = Color3.fromRGB(200, 0, 0)
notification.BackgroundTransparency = 0.3
notification.BorderSizePixel = 0
notification.Text = message
notification.Font = Enum.Font.GothamBold
notification.TextColor3 = Color3.fromRGB(255, 255, 255)
notification.TextSize = 16
notification.ZIndex = 10
local notiCorner = Instance.new("UICorner")
notiCorner.CornerRadius = UDim.new(0, 6)
notiCorner.Parent = notification
notification.Parent = gui
task.delay(3, function()
if notification and notification.Parent then
notification:Destroy()
end
end)
end
end
end)
end
end
local userInputService = game:GetService("UserInputService")
local debounce = false
local inputConnection = userInputService.InputBegan:Connect(function(input, gameProcessed)
if not gameProcessed and input.KeyCode == CONFIG.OPEN_KEY and not debounce then
debounce = true
if gui.Enabled then
GuiAnimationService.closeGui(gui)
else
GuiAnimationService.openGui(gui)
end
task.delay(0.5, function()
debounce = false
end)
end
end)
player.AncestryChanged:Connect(function(_, parent)
if parent == nil and inputConnection then
inputConnection:Disconnect()
inputConnection = nil
end
end)
return gui, toggleGui
end
-- Takımları oluştur
local function initializeTeams()
for _, teamData in ipairs(TEAMS) do
getTeam(teamData.name, teamData.color)
end
debugPrint("Takımlar başarıyla oluşturuldu")
for _, team in ipairs(Teams:GetTeams()) do
team.AutoAssignable = false
end
Teams.ChildAdded:Connect(function(child)
if child:IsA("Team") then
child.AutoAssignable = false
end
end)
debugPrint("Takım otomatik ataması devre dışı bırakıldı")
end
-- Admin komutu ile takım değişikliğini takip etmek için Team değişikliklerini izle
local function monitorTeamChanges()
local function setupTeamChangeMonitor(player)
if teamChangeConnections[player.UserId] then
local connection = teamChangeConnections[player.UserId]
if typeof(connection) == "RBXScriptConnection" then
connection:Disconnect()
teamChangeConnections[player.UserId] = nil
end
end
local connection = player:GetPropertyChangedSignal("Team"):Connect(function()
if player.Team then
local teamName = player.Team.Name
local teamData = getTeamDataByName(teamName)
if teamData and teamData.spawnName then
playerTeamData[player.UserId] = {
teamName = teamName,
spawnName = teamData.spawnName
}
setPermanentTeam(player, teamName, teamData.spawnName)
debugPrint("Takım değişikliği algılandı: " .. player.Name .. " -> " .. teamName)
if player.Character then
teleportToSpawn(player, teamData.spawnName)
end
end
end
end)
teamChangeConnections[player.UserId] = connection
end
for _, player in pairs(Players:GetPlayers()) do
setupTeamChangeMonitor(player)
end
Players.PlayerAdded:Connect(setupTeamChangeMonitor)
Players.PlayerRemoving:Connect(function(player)
if teamChangeConnections[player.UserId] then
teamChangeConnections[player.UserId]:Disconnect()
teamChangeConnections[player.UserId] = nil
end
end)
debugPrint("Takım değişikliği izleme başlatıldı")
end
-- Sadece belirli bir oyuncunun spawn noktasını değiştir
local function setupPlayerSpawn(player)
if not player then return end
local teamName = determineInitialTeam(player)
local teamData = getTeamDataByName(teamName)
if teamData then
switchTeam(player, teamName)
if player.Character then
teleportToSpawn(player, teamData.spawnName)
end
end
end
-- Karakter ekleme olayının işlenmesi
local function handleCharacterAdded(player, character)
local lastCharacterId = character:GetAttribute("CharacterHandled")
if lastCharacterId then
debugPrint("Bu karakter zaten işlendi, atlanıyor")
return
end
character:SetAttribute("CharacterHandled", true)
lastHandledCharacters[player.UserId] = character
local humanoid = character:WaitForChild("Humanoid")
humanoid.Died:Connect(function()
debugPrint(player.Name .. " öldü, yeniden doğma işlemi yapılacak")
local gui = player.PlayerGui:FindFirstChild("TeamSwitcherGui")
if gui and gui.Enabled then
GuiAnimationService.closeGui(gui)
end
end)
task.delay(0.5, function()
if player and player.Character == character then
teleportPlayerToTeamSpawn(player)
end
end)
end
-- Yeni oyuncu girdiğinde
local function onPlayerAdded(player)
debugPrint("Yeni oyuncu girdi: " .. player.Name)
setupPlayerGui(player)
player.CharacterAdded:Connect(function(character)
handleCharacterAdded(player, character)
end)
if player.Character then
handleCharacterAdded(player, player.Character)
end
local savedTeamInfo = getPermanentTeam(player)
if savedTeamInfo then
switchTeam(player, savedTeamInfo.teamName)
else
setupPlayerSpawn(player)
end
end
-- Oyuncu çıktığında
local function onPlayerRemoving(player)
if not player then return end
debugPrint("Oyuncu çıkıyor: " .. player.Name)
playerTeamData[player.UserId] = nil
teamSwitchCooldowns[player.UserId] = nil
lastHandledCharacters[player.UserId] = nil
playerPermanentTeam[player.UserId] = nil
if teamChangeConnections[player.UserId] then
teamChangeConnections[player.UserId]:Disconnect()
teamChangeConnections[player.UserId] = nil
end
end
-- Spawn Location oluşturma
local function ensureSpawnLocations()
for _, teamData in ipairs(TEAMS) do
if teamData.spawnName then
findRespawnLocation(teamData.spawnName)
end
end
debugPrint("Spawn konumları kontrol edildi")
end
-- Script başlangıcı
initializeTeams()
ensureSpawnLocations()
monitorTeamChanges()
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoving)
for _, player in pairs(Players:GetPlayers()) do
task.spawn(function()
onPlayerAdded(player)
end)
end
debugPrint("TeamSwitcher Script başarıyla başlatıldı!")Editor is loading...
Leave a Comment