diff --git a/server/gang_sync.lua b/server/gang_sync.lua new file mode 100644 index 0000000..680e7e2 --- /dev/null +++ b/server/gang_sync.lua @@ -0,0 +1,24 @@ +-- server/gang_sync.lua +print("^2[turfwar]^7 gang_sync.lua loaded") + +-- IMPORTANT: set this to match wherever you store gang membership. +-- Most turfwar scripts have something like PlayerGang[src] = gangId +-- If yours is named differently, change it here. +local function getGangFor(src) + if PlayerGang and PlayerGang[src] ~= nil then + return tonumber(PlayerGang[src]) or 0 + end + + -- Common alternates people use: + if GangOf and GangOf[src] ~= nil then + return tonumber(GangOf[src]) or 0 + end + + return 0 +end + +RegisterNetEvent("turfwar:gang:requestMyGang", function() + local src = source + local gangId = getGangFor(src) + TriggerClientEvent("turfwar:setMyGang", src, gangId) +end) diff --git a/server/gangbank.lua b/server/gangbank.lua new file mode 100644 index 0000000..4269b58 --- /dev/null +++ b/server/gangbank.lua @@ -0,0 +1,58 @@ +print("^2[turfwar]^7 gangbank.lua loaded (server)") + +local GangBank = {} -- [gangId] = amount + +local function clamp(n) + n = tonumber(n) or 0 + if n < 0 then n = 0 end + return math.floor(n) +end + +local function getGangId(src) + if PlayerGang and PlayerGang[src] ~= nil then return tonumber(PlayerGang[src]) or 0 end + return 0 +end + +local function broadcastToGang(gangId) + local amount = GangBank[gangId] or 0 + for _, s in ipairs(GetPlayers()) do + s = tonumber(s) + if getGangId(s) == gangId then + TriggerClientEvent("turfwar:gangbank:update", s, gangId, amount) + end + end +end + +GangBankAPI = GangBankAPI or {} + +function GangBankAPI.Get(gangId) + gangId = tonumber(gangId) or 0 + return GangBank[gangId] or 0 +end + +function GangBankAPI.Set(gangId, amount) + gangId = tonumber(gangId) or 0 + GangBank[gangId] = clamp(amount) + broadcastToGang(gangId) +end + +function GangBankAPI.Add(gangId, delta) + gangId = tonumber(gangId) or 0 + GangBank[gangId] = clamp((GangBank[gangId] or 0) + (tonumber(delta) or 0)) + broadcastToGang(gangId) +end + +RegisterNetEvent("turfwar:gangbank:requestMyGang", function() + local src = source + local gangId = getGangId(src) + TriggerClientEvent("turfwar:gangbank:update", src, gangId, GangBank[gangId] or 0) +end) + +-- console test +RegisterCommand("gangbank_set", function(src, args) + if src ~= 0 then return end + local g = tonumber(args[1] or "0") or 0 + local a = tonumber(args[2] or "0") or 0 + GangBankAPI.Set(g, a) + print(("Set gangbank %d = %d"):format(g, a)) +end, true) diff --git a/server/killfeed_chat.lua b/server/killfeed_chat.lua new file mode 100644 index 0000000..733aac0 --- /dev/null +++ b/server/killfeed_chat.lua @@ -0,0 +1,43 @@ +print("^2[turfwar]^7 killfeed.lua loaded (server)") + +RegisterNetEvent('turfwar:killfeed:report', function(data) + local src = source + if type(data) ~= "table" then return end + + local killerId = tonumber(data.killer or 0) or 0 + local victimId = tonumber(data.victim or 0) or 0 + if victimId <= 0 then victimId = src end + + local victimName = GetPlayerName(victimId) or ("ID " .. tostring(victimId)) + local victimGang = tonumber(data.victimGang or 0) or 0 + + -- ✅ Death-only (no player killer) + if killerId <= 0 then + TriggerClientEvent('turfwar:killfeed:chat', -1, { + isDeathOnly = true, + killer = 0, + victim = victimId, + victimName = victimName, + victimGang = victimGang, + weapon = tonumber(data.weapon or 0) or 0, + }) + return + end + + local killerName = GetPlayerName(killerId) or ("ID " .. tostring(killerId)) + local killerGang = tonumber(data.killerGang or 0) or 0 + + TriggerClientEvent('turfwar:killfeed:chat', -1, { + killer = killerId, + victim = victimId, + killerName = killerName, + victimName = victimName, + + weapon = tonumber(data.weapon or 0) or 0, + headshot = (data.headshot == true), + distance = tonumber(data.distance or 0) or 0, + + killerGang = killerGang, + victimGang = victimGang, + }) +end) diff --git a/server/leaderboard.lua b/server/leaderboard.lua new file mode 100644 index 0000000..ac6846b --- /dev/null +++ b/server/leaderboard.lua @@ -0,0 +1,88 @@ +-- server/leaderboard.lua +print("^2[turfwar]^7 server/leaderboard.lua LOADED") + +-- We assume Turfs runtime table exists in server/main.lua as `local Turfs = {}` +-- and Config.GANGS exists. +-- We will be defensive: if Turfs isn't visible here, we’ll use an exported getter you can add (optional). + +local function getTurfsRuntime() + -- If Turfs is global somewhere, use it. + if Turfs then return Turfs end + + -- If Turfs is local in main.lua (as in your paste), this file cannot see it. + -- In that case, you must either: + -- A) Move leaderboard code into server/main.lua, OR + -- B) Make Turfs global in main.lua: change `local Turfs = {}` to `Turfs = {}` + return nil +end + +local function buildLeaderboard() + local t = getTurfsRuntime() + if not t then + return { + title = "Most influence", + rows = {}, + error = "Turfs runtime not visible. In server/main.lua change `local Turfs = {}` to `Turfs = {}`." + } + end + + -- count owned turfs per gang + local counts = {} -- [gangId] = n + for _, turf in pairs(t) do + local owner = tonumber(turf.owner) or 0 + if owner ~= 0 then + counts[owner] = (counts[owner] or 0) + 1 + end + end + + -- build sortable rows + local rows = {} + for gangId, info in pairs(Config.GANGS or {}) do + gangId = tonumber(gangId) or 0 + if gangId ~= 0 then + local c = counts[gangId] or 0 + rows[#rows + 1] = { + gangId = gangId, + name = info.name or ("Gang " .. tostring(gangId)), + value = c + } + end + end + + table.sort(rows, function(a, b) + if a.value == b.value then + return a.name < b.name + end + return a.value > b.value + end) + + -- Keep only gangs that exist in config; you can also filter out zeroes if you want: + -- (comment in if you only want gangs with >0) + -- local filtered = {} + -- for _, r in ipairs(rows) do if r.value > 0 then filtered[#filtered+1]=r end end + -- rows = filtered + + return { + title = "Most influence", + rows = rows + } +end + +local function broadcastLeaderboard() + local payload = buildLeaderboard() + TriggerClientEvent("turfwar:leaderboard:update", -1, payload) +end + +-- Clients can request snapshot +RegisterNetEvent("turfwar:leaderboard:request", function() + local src = source + TriggerClientEvent("turfwar:leaderboard:update", src, buildLeaderboard()) +end) + +-- Let other server code trigger refresh +RegisterNetEvent("turfwar:leaderboard:refresh", function() + broadcastLeaderboard() +end) + +-- Export for other resources if needed +exports("BroadcastLeaderboard", broadcastLeaderboard) diff --git a/server/loadouts.lua b/server/loadouts.lua new file mode 100644 index 0000000..ac4c1df --- /dev/null +++ b/server/loadouts.lua @@ -0,0 +1,16 @@ +print("^2[turfwar]^7 server/loadouts.lua LOADED (DISABLED - shop handles weapons)") + +Loadouts = Loadouts or {} + +function Loadouts.StripPlayer(src) + -- Optional: keep this if you want neutrals to have no weapons: + -- TriggerClientEvent("turfwar:stripWeapons", src) +end + +function Loadouts.GiveGangLoadout(src, gangId) + -- Disabled: shop/armory handles weapons now +end + +function Loadouts.ApplyForGang(src, gangId) + -- Disabled: do nothing +end