z
This commit is contained in:
commit
5410b49c44
556
client/main.lua
Normal file
556
client/main.lua
Normal file
|
@ -0,0 +1,556 @@
|
|||
LR = {}
|
||||
LR.__index = LR
|
||||
|
||||
local coroutine_yield = coroutine.yield
|
||||
ostime = GlobalState.ostime
|
||||
function LR:Init()
|
||||
local o = {}
|
||||
setmetatable(o, LR)
|
||||
o.PlayerData = {}
|
||||
if ESX.IsPlayerLoaded() then
|
||||
o.PlayerData = ESX.GetPlayerData()
|
||||
end
|
||||
o.CurrentZone = nil
|
||||
o.ZoneDistance = nil
|
||||
o.NUIOpen = false
|
||||
o.Blips = {}
|
||||
o.RadiusBlips = {}
|
||||
o.SelfRadius = {}
|
||||
o.YellowRadius = {}
|
||||
o.PulseBlip = nil
|
||||
o.Capturing = false
|
||||
o.CurCapture = nil
|
||||
o.canC = false
|
||||
o:EventHandler()
|
||||
o:ZoneThread()
|
||||
o:MainThread()
|
||||
o:BlipsThread()
|
||||
return o
|
||||
end
|
||||
|
||||
function LR:EventHandler()
|
||||
RegisterNetEvent("esx:playerLoaded", function(xPlayer)
|
||||
self.PlayerData = xPlayer
|
||||
end)
|
||||
RegisterNetEvent("esx:setJob", function(org)
|
||||
self.PlayerData.org = org
|
||||
end)
|
||||
RegisterNetEvent("lr_occ2:client:startCapture", function(index, name)
|
||||
local zone = Config.Occ[index]
|
||||
self.CurCapture = index
|
||||
self:ShowNotification("warning", ("%s đang bị chiếm bởi %s"):format(zone.Label, name), true)
|
||||
TriggerEvent("lr_captcha:close")
|
||||
self:PulseBlipF(index)
|
||||
end)
|
||||
RegisterNetEvent("lr_occ:client:cancelCapture", function(index, name)
|
||||
local zone = Config.Occ[index]
|
||||
self:ShowNotification("warning",
|
||||
("%s đã hủy chiếm khu vực %s, mọi người có thể tiến hành chiếm khu vực lại sau 120 giây nữa"):format(name,
|
||||
zone.Label))
|
||||
TriggerEvent("lr_captcha:close")
|
||||
self:UnPulse()
|
||||
self.Capturing = false
|
||||
self.CurCapture = nil
|
||||
end)
|
||||
RegisterNetEvent("lr_occ:client:captured", function(index, name, gang)
|
||||
local zone = Config.Occ[index]
|
||||
if self.CurrentZone == index then
|
||||
--SetCurrentPedWeapon(PlayerPedId(), "WEAPON_UNARMED", true) --cam ban
|
||||
end
|
||||
--TriggerServerEvent("lr_occ:server:addPoint", gang, zone.point)
|
||||
self:ShowNotification("success",
|
||||
("%s đã chiếm thành công %s mang về %s điểm cho %s"):format(name, zone.Label, zone.point, gang))
|
||||
TriggerEvent("lr_captcha:close")
|
||||
self:UnPulse()
|
||||
self.Capturing = false
|
||||
self.CurCapture = nil
|
||||
Wait(5000)
|
||||
self:BlipsThread()
|
||||
end)
|
||||
RegisterNetEvent("lr_occ2:client:openOcc", function(isOpen)
|
||||
if isOpen then
|
||||
self:ShowNotification("warning", "Đã bắt đầu thời gian chiếm đóng")
|
||||
else
|
||||
self:ShowNotification("warning", "Đã kết thúc thời gian chiếm đóng")
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function LR:BlipsThread()
|
||||
for k, v in pairs(self.Blips) do
|
||||
RemoveBlip(v)
|
||||
end
|
||||
for k, v in pairs(self.RadiusBlips) do
|
||||
RemoveBlip(v)
|
||||
end
|
||||
for k, v in pairs(self.SelfRadius) do
|
||||
RemoveBlip(v)
|
||||
end
|
||||
for k, v in pairs(GlobalState.Occ) do
|
||||
local p = v.Pos
|
||||
local Cblip = AddBlipForRadius(p.x, p.y, p.z, v.oRadius)
|
||||
SetBlipColour(Cblip, 5)
|
||||
SetBlipAlpha(Cblip, 150)
|
||||
SetBlipHighDetail(Cblip, true)
|
||||
SetBlipRotation(Cblip, 0.0)
|
||||
SetBlipDisplay(Cblip, 4)
|
||||
SetBlipAsShortRange(Cblip, false)
|
||||
SetBlipHiddenOnLegend(Cblip, true)
|
||||
self.YellowRadius[k] = Cblip
|
||||
local blip = AddBlipForCoord(p.x, p.y, p.z)
|
||||
SetBlipSprite(blip, v.owner and GlobalState.GangBlips[v.owner].sprite or 78)
|
||||
SetBlipDisplay(blip, 2)
|
||||
SetBlipScale(blip, v.owner and 1.2 or 0.9)
|
||||
SetBlipColour(blip, 0)
|
||||
SetBlipAsShortRange(blip, true)
|
||||
SetBlipHighDetail(blip, true)
|
||||
BeginTextCommandSetBlipName("STRING")
|
||||
AddTextComponentString(("Khu Vực Chiếm Đóng [%s]"):format(v.Label))
|
||||
EndTextCommandSetBlipName(blip)
|
||||
self.Blips[k] = blip
|
||||
local Ablip = AddBlipForRadius(p.x, p.y, p.z, v.Radius)
|
||||
SetBlipColour(Ablip, 1)
|
||||
SetBlipAlpha(Ablip, 150)
|
||||
SetBlipHighDetail(Ablip, true)
|
||||
SetBlipRotation(Ablip, 0.0)
|
||||
SetBlipDisplay(Ablip, 4)
|
||||
SetBlipAsShortRange(Ablip, false)
|
||||
SetBlipHiddenOnLegend(Ablip, true)
|
||||
self.RadiusBlips[k] = Ablip
|
||||
local Bblip = AddBlipForRadius(p.x, p.y, p.z, v.cRadius)
|
||||
SetBlipColour(Bblip, 7)
|
||||
SetBlipAlpha(Bblip, 200)
|
||||
SetBlipHighDetail(Bblip, true)
|
||||
SetBlipRotation(Bblip, 0.0)
|
||||
SetBlipDisplay(Bblip, 4)
|
||||
SetBlipAsShortRange(Bblip, false)
|
||||
SetBlipHiddenOnLegend(Bblip, true)
|
||||
self.SelfRadius[k] = Bblip
|
||||
end
|
||||
end
|
||||
|
||||
function LR:ZoneThread()
|
||||
self.CurCapture = lib.callback.await("lr_occ2:callback:getCurCapture", false)
|
||||
Citizen.CreateThread(function()
|
||||
while true do
|
||||
coroutine_yield(0)
|
||||
local ped = PlayerPedId()
|
||||
local pedCoords = GetEntityCoords(ped)
|
||||
local z
|
||||
for k, v in pairs(Config.Occ) do
|
||||
local distance = #(pedCoords - v.Pos)
|
||||
if distance <= v.Radius then
|
||||
-- TriggerEvent("LRPT:SetWhiteList", false)
|
||||
SetEntityCanBeDamaged(ped, true)
|
||||
if self.CurrentZone == nil then
|
||||
TriggerServerEvent("lr_occ2:server:join", k)
|
||||
LocalPlayer.state:set('inOcc', true, false)
|
||||
end
|
||||
self.CurrentZone = k
|
||||
self.ZoneDistance = distance
|
||||
self.lastJoin = k
|
||||
self.lastZone = k
|
||||
z = k
|
||||
self:NUI()
|
||||
--[[if self.CurCapture == k then
|
||||
local joinTime = GlobalState.ostime - self.PlayerData.org.join_date
|
||||
if joinTime < 172800 then
|
||||
ESX.ShowNotification("Thời gian gia nhập băng đảng của bạn")
|
||||
ESX.ShowNotification("không đủ để tham gia chiếm đóng")
|
||||
ESX.ShowNotification("Bạn sẽ được teleport về garage")
|
||||
SetEntityCoords(PlayerPedId(), 215.67095947266, -809.82708740234, 30.739696502686, 0.0, 0.0, 0.0, false)
|
||||
TriggerServerEvent("lr_occ2:server:leave", k)
|
||||
LocalPlayer.state:set('inOcc', false, false)
|
||||
self.lastZone = nil
|
||||
end
|
||||
end--]]
|
||||
goto continue
|
||||
break
|
||||
elseif distance > v.Radius and distance < v.oRadius then
|
||||
if self.CurrentZone == nil then
|
||||
local veh = GetVehiclePedIsIn(ped, false)
|
||||
local vehHash = GetEntityModel(veh)
|
||||
if Config.BlockVehicle[vehHash] then
|
||||
SetEntityAsMissionEntity(veh, true, true)
|
||||
DeleteVehicle(veh)
|
||||
end
|
||||
self.CurrentZone = k
|
||||
self.ZoneDistance = distance
|
||||
TriggerServerEvent("lr_occ2:server:join", k)
|
||||
LocalPlayer.state:set('inOcc', true, false)
|
||||
end
|
||||
DisablePlayerFiring(PlayerId(), true)
|
||||
self.lastZone = k
|
||||
if self.lastJoin == nil then
|
||||
-- TriggerEvent("LRPT:SetWhiteList", true)
|
||||
SetEntityCanBeDamaged(ped, false)
|
||||
end
|
||||
z = k
|
||||
goto continue2
|
||||
break
|
||||
end
|
||||
end
|
||||
if z == nil then
|
||||
TriggerEvent("LRPT:SetWhiteList", false)
|
||||
SetEntityCanBeDamaged(ped, true)
|
||||
if self.lastZone then
|
||||
TriggerServerEvent("lr_occ2:server:leave", self.lastZone)
|
||||
LocalPlayer.state:set('inOcc', false, false)
|
||||
self.lastZone = nil
|
||||
end
|
||||
end
|
||||
self.CurrentZone = nil
|
||||
self.ZoneDistance = nil
|
||||
::continue::
|
||||
Wait(1000)
|
||||
::continue2::
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
|
||||
|
||||
local KEYS = {
|
||||
['E'] = 38,
|
||||
['B'] = 29,
|
||||
['Q'] = 44,
|
||||
['Z'] = 20,
|
||||
['G'] = 47,
|
||||
['Z'] = 48
|
||||
}
|
||||
local CONTROL = { 'E', 'B', 'Q', 'Z', 'G', 'Z' }
|
||||
function GetRandomControl()
|
||||
local rd = math.random(1, #CONTROL)
|
||||
return CONTROL[rd]
|
||||
end
|
||||
|
||||
local cA, cB, cC = GetRandomControl(), GetRandomControl(), GetRandomControl()
|
||||
local pA, pB, pC = false, false
|
||||
local HELP = ("Nhấn ~%s~[%s]~w~ ~%s~[%s]~w~ ~%s~[%s]~w~ ~%s~[%s]~w~ ~%s~[%s]~w~ ~%s~[%s]~w~ ~%s~[%s]~w~ ~%s~[%s]~w~ ~%s~[%s]~w~ ~%s~[%s]~w~ để chiếm")
|
||||
|
||||
--[[ function LR:GetRandomKeyPress(cb)
|
||||
Citizen.CreateThread(function()
|
||||
local keys = {}
|
||||
for i = 1, 10, 1 do
|
||||
local k = GetRandomControl()
|
||||
table.insert(keys, k)
|
||||
end
|
||||
local crKey = 1
|
||||
while self.ZoneDistance <= 1.0 and not self.Capturing and not self.CurCapture and self.canC do
|
||||
coroutine_yield(0)
|
||||
ShowHelpNotification(HELP:format(crKey > 1 and 'g' or 'r', keys[1], crKey > 2 and 'g' or 'r', keys[2], crKey > 3 and 'g' or 'r', keys[3], crKey > 4 and 'g' or 'r', keys[4], crKey > 5 and 'g' or 'r', keys[5], crKey > 6 and 'g' or 'r', keys[6], crKey > 7 and 'g' or 'r', keys[7], crKey > 8 and 'g' or 'r', keys[8], crKey > 9 and 'g' or 'r', keys[9], crKey > 10 and 'g' or 'r', keys[10]))
|
||||
for k, v in pairs(KEYS) do
|
||||
DisableControlAction(0, v, true)
|
||||
if IsDisabledControlJustReleased(0, v) then
|
||||
if keys[crKey] == k then
|
||||
crKey = crKey + 1
|
||||
if crKey > 10 then
|
||||
cb(true)
|
||||
return
|
||||
end
|
||||
else
|
||||
cb(false)
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
cb()
|
||||
return
|
||||
end)
|
||||
end ]]
|
||||
|
||||
function LR:MainThread()
|
||||
local t = 0
|
||||
Citizen.CreateThread(function()
|
||||
Wait(2000)
|
||||
local OutzoneAttemp = nil
|
||||
local timeout = 0
|
||||
local lastPress = 0
|
||||
while true do
|
||||
coroutine_yield(0)
|
||||
if self.CurrentZone ~= nil then
|
||||
LocalPlayer.state:set('occ', true, false)
|
||||
local zone = Config.Occ[tostring(self.CurrentZone)]
|
||||
local pos = zone.Pos
|
||||
DrawMarker(1, pos.x, pos.y, pos.z - 100.100, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, zone.Radius * 2, zone.Radius *
|
||||
2, 200.0, 255, 0, 0, 100, false, true, 2, nil, nil, false)
|
||||
DrawMarker(1, pos.x, pos.y, pos.z - 1.100, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 2.0, 2.0, 255, 0, 0, 100,
|
||||
false, true, 2, nil, nil, false)
|
||||
--if self.ZoneDistance <= 1.0 and not self.Capturing and not self.CurCapture and GlobalState.OccOpen then
|
||||
if self.ZoneDistance <= 1.0 and not self.Capturing and not self.CurCapture and self.canC and GlobalState.OccOpen then
|
||||
--ShowHelpNotification("Nhấn [E] để chiếm")
|
||||
TriggerEvent("hm_hud:toggleNotifyHelp", {
|
||||
press = cooldown, -- neu true thi sang false thi toi
|
||||
key = "E", -- text phim tat
|
||||
msg = "để chiếm",
|
||||
percent = 0 -- thoi gian nut e sang len
|
||||
})
|
||||
if IsControlJustReleased(0, 38) then
|
||||
if GetGameTimer() - lastPress > 5000 then
|
||||
lastPress = GetGameTimer()
|
||||
ESX.TriggerServerCallback("lr_occ2:callback:CanCapture", function(canCapture)
|
||||
if canCapture then
|
||||
self.Capturing = true
|
||||
end
|
||||
self.IsBusy = false
|
||||
end, self.CurrentZone)
|
||||
else
|
||||
lastPress = GetGameTimer()
|
||||
ESX.ShowNotification('Vui lòng không SPAM')
|
||||
end
|
||||
end
|
||||
end
|
||||
if self.Capturing then
|
||||
if self.ZoneDistance > zone.cRadius then
|
||||
if OutzoneAttemp == 0 then
|
||||
OutzoneAttemp = ostime
|
||||
self:ShowNotification("warning",
|
||||
"Chiếm đóng sẽ bị hủy sau 10 giây nếu không quay lại khu vực chiếm đóng")
|
||||
else
|
||||
if ostime - OutzoneAttemp > 10 then
|
||||
OutzoneAttemp = 0
|
||||
TriggerServerEvent("lr_occ2:server:cancelCapture")
|
||||
self.Capturing = false
|
||||
end
|
||||
end
|
||||
else
|
||||
if OutzoneAttemp ~= 0 then
|
||||
OutzoneAttemp = 0
|
||||
end
|
||||
end
|
||||
if GetEntityHealth(PlayerPedId()) <= 0 then
|
||||
OutzoneAttemp = 0
|
||||
TriggerServerEvent("lr_occ2:server:cancelCapture")
|
||||
self.Capturing = false
|
||||
end
|
||||
end
|
||||
local i = 0
|
||||
local zoneData = GlobalState.ZoneData[self.CurrentZone]
|
||||
if zoneData then
|
||||
for k, v in pairs(zoneData) do
|
||||
SetTextFont(0)
|
||||
SetTextProportional(0)
|
||||
SetTextScale(0.3, 0.3)
|
||||
SetTextColour(255, 255, 255, 255)
|
||||
SetTextDropshadow(0, 0, 0, 0, 255)
|
||||
SetTextEdge(1, 0, 0, 0, 255)
|
||||
SetTextDropShadow()
|
||||
SetTextOutline()
|
||||
BeginTextCommandDisplayText("STRING")
|
||||
AddTextComponentSubstringPlayerName(("[%s]: %s"):format(k, v))
|
||||
EndTextCommandDisplayText(0.01, 0.5 + i)
|
||||
i = i + 0.02
|
||||
end
|
||||
end
|
||||
else
|
||||
if self.Capturing then
|
||||
TriggerServerEvent("lr_occ2:server:cancelCapture")
|
||||
end
|
||||
LocalPlayer.state:set('occ', false, false)
|
||||
if self.NUIOpen then
|
||||
self.NUIOpen = false
|
||||
self:TogglePanel2(false)
|
||||
end
|
||||
Wait(1000)
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function LR:NUI()
|
||||
if (IsPedInAnyVehicle(PlayerPedId(), false) or IsPlayerFreeAiming(PlayerId()) or IsPlayerDead(PlayerId())) and self.NUIOpen then
|
||||
self.NUIOpen = false
|
||||
self:TogglePanel2(false)
|
||||
elseif not self.NUIOpen and not IsPedInAnyVehicle(PlayerPedId(), false) and not IsPlayerFreeAiming(PlayerId()) and not IsPlayerDead(PlayerId()) then
|
||||
self.NUIOpen = true
|
||||
self:TogglePanel2(true)
|
||||
end
|
||||
local globalCurCapture = GlobalState.CurrentCapture
|
||||
if globalCurCapture[self.CurrentZone] ~= nil then
|
||||
local zone = Config.Occ[self.CurrentZone]
|
||||
self.canC = false
|
||||
self:SetDataPanel2({
|
||||
type = "capturing",
|
||||
data = {
|
||||
name = zone.Label,
|
||||
point = zone.point,
|
||||
time = zone.time - (ostime - globalCurCapture[self.CurrentZone].startAt),
|
||||
player = globalCurCapture[self.CurrentZone].name
|
||||
}
|
||||
})
|
||||
else
|
||||
local zone = GlobalState.Occ[self.CurrentZone]
|
||||
local d = ostime - GlobalState.LastCapture
|
||||
if d < Config.Delay then
|
||||
self.canC = false
|
||||
self:SetDataPanel2({
|
||||
type = "blocked",
|
||||
data = {
|
||||
name = zone.Label,
|
||||
point = zone.point,
|
||||
time = Config.Delay - d
|
||||
|
||||
}
|
||||
})
|
||||
else
|
||||
if zone.lastCapture ~= nil then
|
||||
local d = ostime - zone.lastCapture
|
||||
if d < Config.DelayPoint then
|
||||
self.canC = false
|
||||
self:SetDataPanel2({
|
||||
type = "blocked",
|
||||
data = {
|
||||
name = zone.Label,
|
||||
point = zone.point,
|
||||
owner = zone.owner,
|
||||
time = Config.DelayPoint - d
|
||||
}
|
||||
})
|
||||
else
|
||||
if zone.owner ~= nil then
|
||||
self.canC = true
|
||||
self:SetDataPanel2({
|
||||
type = "owned",
|
||||
data = {
|
||||
name = zone.Label,
|
||||
point = zone.point,
|
||||
owner = zone.owner
|
||||
}
|
||||
})
|
||||
else
|
||||
self.canC = true
|
||||
self:SetDataPanel2({
|
||||
type = "allow",
|
||||
data = {
|
||||
name = zone.Label,
|
||||
point = zone.point,
|
||||
time = zone.time
|
||||
}
|
||||
})
|
||||
end
|
||||
end
|
||||
else
|
||||
if zone.owner ~= nil then
|
||||
self.canC = true
|
||||
self:SetDataPanel2({
|
||||
type = "owned",
|
||||
data = {
|
||||
name = zone.Label,
|
||||
point = zone.point,
|
||||
owner = zone.owner
|
||||
}
|
||||
})
|
||||
else
|
||||
self.canC = true
|
||||
self:SetDataPanel2({
|
||||
type = "allow",
|
||||
data = {
|
||||
name = zone.Label,
|
||||
point = zone.point,
|
||||
time = zone.time
|
||||
}
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function LR:TogglePanel2(t)
|
||||
SendNUIMessage({
|
||||
event = "toggle-panel2",
|
||||
data = t
|
||||
})
|
||||
end
|
||||
|
||||
function LR:SetDataPanel2(data)
|
||||
SendNUIMessage({
|
||||
event = "data-panel2",
|
||||
data = data
|
||||
})
|
||||
end
|
||||
|
||||
function LR:ShowNotification(type, msg, playSound)
|
||||
SendNUIMessage({
|
||||
event = "notification",
|
||||
data = {
|
||||
type = type,
|
||||
msg = msg,
|
||||
playSound = playSound
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
function LR:PulseBlipF(index)
|
||||
local zoneCoords = Config.Occ[index].Pos
|
||||
local Pblip = AddBlipForCoord(zoneCoords.x, zoneCoords.y, zoneCoords.z)
|
||||
SetBlipSprite(Pblip, 161)
|
||||
SetBlipScale(Pblip, 2.0)
|
||||
SetBlipColour(Pblip, 1)
|
||||
PulseBlip(Pblip)
|
||||
self.PulseBlip = Pblip
|
||||
end
|
||||
|
||||
function LR:UnPulse()
|
||||
RemoveBlip(self.PulseBlip)
|
||||
self.PulseBlip = nil
|
||||
end
|
||||
|
||||
ESX = nil
|
||||
Citizen.CreateThread(function()
|
||||
while ESX == nil do
|
||||
Wait(0)
|
||||
ESX = exports["es_extended"]:getSharedObject()
|
||||
end
|
||||
Wait(5000)
|
||||
while GlobalState.GangBlips == nil do
|
||||
Wait(100)
|
||||
end
|
||||
LR:Init()
|
||||
while true do
|
||||
Wait(1000)
|
||||
ostime = ostime + 1
|
||||
if GlobalState.ostime > ostime then ostime = GlobalState.ostime end
|
||||
end
|
||||
end)
|
||||
|
||||
RegisterCommand("thaneo", function()
|
||||
if IsPedInAnyBoat(PlayerPedId()) then
|
||||
local veh = GetVehiclePedIsIn(PlayerPedId(), false)
|
||||
local driver = GetPedInVehicleSeat(veh, -1)
|
||||
if driver == PlayerPedId() then
|
||||
FreezeEntityPosition(veh, true)
|
||||
else
|
||||
ESX.ShowNotification("Bạn phải lái phương tiện này")
|
||||
end
|
||||
else
|
||||
ESX.ShowNotification("Bạn phải ở trên tàu hoặc thuyền để sử dụng lệnh này")
|
||||
end
|
||||
end, false)
|
||||
|
||||
RegisterCommand("huythaneo", function()
|
||||
if IsPedInAnyBoat(PlayerPedId()) then
|
||||
local veh = GetVehiclePedIsIn(PlayerPedId(), false)
|
||||
local driver = GetPedInVehicleSeat(veh, -1)
|
||||
if driver == PlayerPedId() then
|
||||
FreezeEntityPosition(veh, false)
|
||||
else
|
||||
ESX.ShowNotification("Bạn phải lái phương tiện này")
|
||||
end
|
||||
else
|
||||
ESX.ShowNotification("Bạn phải ở trên tàu hoặc thuyền để sử dụng lệnh này")
|
||||
end
|
||||
end, false)
|
||||
|
||||
ShowHelpNotification = function(msg, thisFrame, beep, duration)
|
||||
AddTextEntry('esxHelpNotification', "<FONT FACE='arial font'>" .. msg .. "</FONT>")
|
||||
|
||||
if thisFrame then
|
||||
DisplayHelpTextThisFrame('esxHelpNotification', false)
|
||||
else
|
||||
if beep == nil then beep = true end
|
||||
BeginTextCommandDisplayHelp('esxHelpNotification')
|
||||
EndTextCommandDisplayHelp(0, false, beep, duration or -1)
|
||||
end
|
||||
end
|
299
client/main_bk.lua
Normal file
299
client/main_bk.lua
Normal file
|
@ -0,0 +1,299 @@
|
|||
ESX = nil
|
||||
LR = {}
|
||||
LR.__index = LR
|
||||
|
||||
function LR:Init()
|
||||
local o = {}
|
||||
setmetatable(o, LR)
|
||||
o.PlayerData = {}
|
||||
if ESX.IsPlayerLoaded() then
|
||||
o.PlayerData = ESX.GetPlayerData()
|
||||
end
|
||||
o.InZone = false
|
||||
o.CurZone = nil
|
||||
o.Blips = {}
|
||||
o.PulseBlip = nil
|
||||
o.Busy = false
|
||||
o.Capturing = false
|
||||
o.Panel2Open = false
|
||||
o.RemainCapture = 0
|
||||
o.CanCapture = true
|
||||
o.Cache = {}
|
||||
ESX.TriggerServerCallback("lr_occ2:callback:getData", function(data)
|
||||
o.Cache = data[1]
|
||||
o.RemainCapture = data[2]
|
||||
for k, v in pairs(o.Cache) do
|
||||
Citizen.CreateThread(function()
|
||||
local index = k
|
||||
while o.Cache[index] ~= nil and o.Cache[index].remain > 0 do
|
||||
Wait(1000)
|
||||
o.Cache[index].remain = o.Cache[index].remain - 1
|
||||
if o.Cache[index].remain <= 0 then
|
||||
o.Cache[index] = nil
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
end)
|
||||
o:EventHandler()
|
||||
o:PosThread()
|
||||
o:Blip()
|
||||
o:TimeThread()
|
||||
print("LOADED LROCC")
|
||||
return o
|
||||
end
|
||||
|
||||
function LR:TimeThread()
|
||||
Citizen.CreateThread(function()
|
||||
while true do
|
||||
Wait(1000)
|
||||
if self.RemainCapture > 0 then
|
||||
self.RemainCapture = self.RemainCapture - 1
|
||||
self.CanCapture = false
|
||||
else
|
||||
self.CanCapture = true
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function LR:EventHandler()
|
||||
RegisterNetEvent("esx:playerLoaded", function(xPlayer)
|
||||
self.PlayerData = xPlayer
|
||||
end)
|
||||
RegisterNetEvent("lr_occ2:client:capture", function(index, playerName)
|
||||
self:PulseBlip(index)
|
||||
self:ShowNotification(("Khu vực %s đang bị chiếm bởi %s"):format(Config.Occ[index].Label, playerName))
|
||||
self.Cache[index] = {
|
||||
remain = Config.Occ[index].time,
|
||||
name = playerName
|
||||
}
|
||||
Citizen.CreateThread(function()
|
||||
local _index = index
|
||||
while self.Cache[_index] ~= nil and self.Cache[_index].remain > 0 do
|
||||
print(_index)
|
||||
Wait(1000)
|
||||
if self.Cache[_index] ~= nil then
|
||||
self.Cache[_index].remain = self.Cache[_index].remain - 1
|
||||
if self.Cache[index].remain <= 0 then
|
||||
self.Cache[index] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
end)
|
||||
RegisterNetEvent("lr_occ2:client:captured", function(index, playerName)
|
||||
self:UnPulse()
|
||||
self.Cache[index] = nil
|
||||
self.RemainCapture = Config.Delay
|
||||
self:ShowNotification(("%s đã chiếm thành công khu vực %s"):format(playerName, Config.Occ[index].Label))
|
||||
end)
|
||||
RegisterNetEvent("lr_occ2:client:cancel", function(index, playerName)
|
||||
self:UnPulse()
|
||||
self.Cache[index] = nil
|
||||
self:ShowNotification(("%s đã hủy chiếm %s"):format(playerName, Config.Occ[index].Label))
|
||||
end)
|
||||
RegisterNetEvent("lr_occ2:client:showNotification", function(msg)
|
||||
self:ShowNotification(msg)
|
||||
end)
|
||||
end
|
||||
|
||||
function LR:Blip()
|
||||
for k, v in pairs(Config.Occ) do
|
||||
local blip = AddBlipForCoord(v.Pos.x, v.Pos.y, v.Pos.z)
|
||||
SetBlipSprite(blip, 420)
|
||||
SetBlipDisplay(blip, 2)
|
||||
SetBlipScale(blip, 1.2)
|
||||
SetBlipColour(blip, 1)
|
||||
SetBlipAsShortRange(blip, true)
|
||||
SetBlipHighDetail(blip, true)
|
||||
BeginTextCommandSetBlipName("STRING")
|
||||
AddTextComponentString(("Khu Vực Chiếm Đóng [%s]"):format(k))
|
||||
EndTextCommandSetBlipName(blip)
|
||||
self.Blips[k] = blip
|
||||
end
|
||||
--self:PulseBlip("main")
|
||||
print("LOADED BLIPS")
|
||||
end
|
||||
|
||||
function LR:PulseBlip(index)
|
||||
local zoneCoords = Config.Occ[index].Pos
|
||||
local Pblip = AddBlipForCoord(zoneCoords.x, zoneCoords.y, zoneCoords.z)
|
||||
SetBlipSprite(Pblip, 161)
|
||||
SetBlipScale(Pblip, 2.0)
|
||||
SetBlipColour(Pblip, 1)
|
||||
PulseBlip(Pblip)
|
||||
self.PulseBlip = Pblip
|
||||
end
|
||||
|
||||
function LR:UnPulse()
|
||||
RemoveBlip(self.PulseBlip)
|
||||
self.PulseBlip = nil
|
||||
end
|
||||
|
||||
function LR:PosThread()
|
||||
Citizen.CreateThread(function()
|
||||
while true do
|
||||
coroutine.yield(0)
|
||||
self.ped = PlayerPedId()
|
||||
self.pedCoords = GetEntityCoords(self.ped, true)
|
||||
self.CurZone = self:CheckPos()
|
||||
if self.CurZone ~= nil then
|
||||
local zoneCoords = Config.Occ[self.CurZone].Pos
|
||||
local distance = #(self.pedCoords - zoneCoords)
|
||||
DrawMarker(1, zoneCoords.x, zoneCoords.y, zoneCoords.z - 100.100, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
||||
Config.Occ[self.CurZone].Radius * 2, Config.Occ[self.CurZone].Radius * 2, 200.0, 255, 0, 0, 100,
|
||||
false, true, 2, nil, nil, false)
|
||||
DrawMarker(1, zoneCoords.x, zoneCoords.y, zoneCoords.z - 1.100, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 2.0,
|
||||
2.0, 255, 0, 0, 100, false, true, 2, nil, nil, false)
|
||||
if distance <= 1.5 and not self.Busy and not self.Capturing then
|
||||
DisplayText("Nhấn [E] để chiếm khu vực này")
|
||||
if IsControlJustPressed(0, 38) then
|
||||
self.Busy = true
|
||||
ESX.TriggerServerCallback("lr_occ2:callback:canCapture", function(result)
|
||||
self.Busy = false
|
||||
if result == true then
|
||||
self.Capturing = true
|
||||
self:StartCapture(self.CurZone)
|
||||
end
|
||||
end, self.CurZone)
|
||||
end
|
||||
end
|
||||
if (IsPedInAnyVehicle(self.ped, false) or IsPlayerFreeAiming(PlayerId())) and self.Panel2Open then
|
||||
self:TogglePanel2(false)
|
||||
elseif not self.Panel2Open and not IsPedInAnyVehicle(self.ped, false) and not IsPlayerFreeAiming(PlayerId()) then
|
||||
self:TogglePanel2(true)
|
||||
end
|
||||
else
|
||||
Wait(2000)
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function LR:StartCapture(index)
|
||||
Citizen.CreateThread(function()
|
||||
local time = Config.Occ[self.CurZone].time
|
||||
while self.Capturing do
|
||||
coroutine.yield(0)
|
||||
print(time)
|
||||
if self.CurZone ~= nil then
|
||||
Wait(1000)
|
||||
time = time - 1
|
||||
if time <= 0 then
|
||||
self.Capturing = false
|
||||
end
|
||||
if IsPlayerDead(PlayerId()) then
|
||||
self.Capturing = false
|
||||
TriggerServerEvent("lr_occ2:server:cancelCapture")
|
||||
end
|
||||
else
|
||||
self.Capturing = false
|
||||
TriggerServerEvent("lr_occ2:server:cancelCapture")
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function LR:StopCapture()
|
||||
self.Capturing = false
|
||||
end
|
||||
|
||||
function LR:ShowNotification(msg)
|
||||
SendNUIMessage({
|
||||
event = "notification",
|
||||
data = msg
|
||||
})
|
||||
end
|
||||
|
||||
function LR:CheckPos()
|
||||
for k, v in pairs(Config.Occ) do
|
||||
local distance = #(self.pedCoords - v.Pos)
|
||||
if distance <= v.Radius then
|
||||
if not self.InZone then
|
||||
self.InZone = true
|
||||
self:TogglePanel2(true)
|
||||
--self:TogglePanel3(true)
|
||||
end
|
||||
self:SetDataPanel2({
|
||||
canCapture = self.CanCapture,
|
||||
lastCapture = self.RemainCapture,
|
||||
name = k,
|
||||
point = v.point,
|
||||
time = self.Cache[k] and self.Cache[k].remain or v.time,
|
||||
capture = self.Cache[k] and self.Cache[k].name or nil
|
||||
})
|
||||
return k
|
||||
end
|
||||
end
|
||||
if self.InZone then
|
||||
self.InZone = false
|
||||
self:TogglePanel2(false)
|
||||
--self:TogglePanel3(false)
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
function LR:TogglePanel1(t)
|
||||
SendNUIMessage({
|
||||
event = "toggle-panel1",
|
||||
data = t
|
||||
})
|
||||
end
|
||||
|
||||
function LR:SetDataPanel1(data)
|
||||
SendNUIMessage({
|
||||
event = "data-panel1",
|
||||
data = data
|
||||
})
|
||||
end
|
||||
|
||||
function LR:TogglePanel2(t)
|
||||
self.Panel2Open = t
|
||||
SendNUIMessage({
|
||||
event = "toggle-panel2",
|
||||
data = t
|
||||
})
|
||||
end
|
||||
|
||||
function LR:SetDataPanel2(data)
|
||||
SendNUIMessage({
|
||||
event = "data-panel2",
|
||||
data = data
|
||||
})
|
||||
end
|
||||
|
||||
function LR:TogglePanel3(t)
|
||||
SendNUIMessage({
|
||||
event = "toggle-panel3",
|
||||
data = t
|
||||
})
|
||||
end
|
||||
|
||||
function LR:SetDataPanel3(data)
|
||||
SendNUIMessage({
|
||||
event = "data-panel3",
|
||||
data = data
|
||||
})
|
||||
end
|
||||
|
||||
Citizen.CreateThread(function()
|
||||
while ESX == nil do
|
||||
Wait(0)
|
||||
TriggerEvent("esx:getSharedObject", function(obj) ESX = obj end)
|
||||
end
|
||||
LR:Init()
|
||||
end)
|
||||
|
||||
function DisplayText(text)
|
||||
local width = string.len(text) + 0.0
|
||||
DrawRect(1.0 - width / 200 / 2, 0.98, width / 200, 0.06, 245, 71, 72, 200)
|
||||
SetTextScale(0.4, 0.4)
|
||||
SetTextFont(ESX.FontId)
|
||||
SetTextProportional(1)
|
||||
SetTextColour(255, 255, 255, 255)
|
||||
SetTextEntry("STRING")
|
||||
SetTextCentre(1)
|
||||
AddTextComponentString(text)
|
||||
DrawText(1.0 - width / 200 / 2, 0.96)
|
||||
end
|
324
client/main_bk2.lua
Normal file
324
client/main_bk2.lua
Normal file
|
@ -0,0 +1,324 @@
|
|||
ESX = nil
|
||||
LR = {}
|
||||
LR.__index = LR
|
||||
|
||||
function LR:Init()
|
||||
local o = {}
|
||||
setmetatable(o, LR)
|
||||
o.Capturing = false
|
||||
o.CurZone = nil
|
||||
o.InZone = false
|
||||
o.Blips = {}
|
||||
o.RadiusBlips = {}
|
||||
ESX.TriggerServerCallback("lr_occ:callback:getData", function(data)
|
||||
print(ESX.DumpTable(data))
|
||||
o.Zones = data[1]
|
||||
o.DelayTime = data[2]
|
||||
o:EventHandler()
|
||||
o:PosThread()
|
||||
o:Blip()
|
||||
o:TimeThread()
|
||||
end)
|
||||
|
||||
return o
|
||||
end
|
||||
|
||||
function LR:PosThread()
|
||||
Citizen.CreateThread(function()
|
||||
while true do
|
||||
coroutine.yield(0)
|
||||
self.ped = PlayerPedId()
|
||||
self.pedCoords = GetEntityCoords(self.ped, true)
|
||||
self.CurZone = self:CheckPos()
|
||||
if self.CurZone ~= nil then
|
||||
local zoneCoords = Config.Occ[self.CurZone].Pos
|
||||
local distance = #(self.pedCoords - zoneCoords)
|
||||
DrawMarker(1, zoneCoords.x, zoneCoords.y, zoneCoords.z - 100.100, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
||||
Config.Occ[self.CurZone].Radius * 2, Config.Occ[self.CurZone].Radius * 2, 200.0, 255, 0, 0, 100,
|
||||
false, true, 2, nil, nil, false)
|
||||
DrawMarker(1, zoneCoords.x, zoneCoords.y, zoneCoords.z - 1.100, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 2.0,
|
||||
2.0, 255, 0, 0, 100, false, true, 2, nil, nil, false)
|
||||
if distance <= 5.5 and not self.Busy and not self.Capturing then
|
||||
DisplayText("Nhấn [E] để chiếm khu vực này")
|
||||
if IsControlJustPressed(0, 38) then
|
||||
self.Busy = true
|
||||
ESX.TriggerServerCallback("lr_occ:callback:canCapture", function(result)
|
||||
self.Busy = false
|
||||
if result == true then
|
||||
self.Capturing = true
|
||||
self:StartCapture(self.CurZone)
|
||||
end
|
||||
end, self.CurZone)
|
||||
end
|
||||
end
|
||||
if (IsPedInAnyVehicle(self.ped, false) or IsPlayerFreeAiming(PlayerId()) or IsPlayerDead(PlayerId())) and self.Panel2Open then
|
||||
self:TogglePanel2(false)
|
||||
elseif not self.Panel2Open and not IsPedInAnyVehicle(self.ped, false) and not IsPlayerFreeAiming(PlayerId()) and not IsPlayerDead(PlayerId()) then
|
||||
self:TogglePanel2(true)
|
||||
end
|
||||
else
|
||||
Wait(2000)
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function LR:StartCapture(index)
|
||||
Citizen.CreateThread(function()
|
||||
local time = Config.Occ[self.CurZone].time
|
||||
while self.Capturing do
|
||||
coroutine.yield(0)
|
||||
print(time)
|
||||
if self.CurZone ~= nil then
|
||||
Wait(1000)
|
||||
time = time - 1
|
||||
if time <= 0 then
|
||||
self.Capturing = false
|
||||
end
|
||||
if IsPlayerDead(PlayerId()) then
|
||||
self.Capturing = false
|
||||
TriggerServerEvent("lr_occ:server:cancelCapture")
|
||||
end
|
||||
else
|
||||
self.Capturing = false
|
||||
TriggerServerEvent("lr_occ:server:cancelCapture")
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function LR:CheckPos()
|
||||
for k, v in pairs(self.Zones) do
|
||||
local distance = #(self.pedCoords - v.Pos)
|
||||
if distance <= v.Radius then
|
||||
if not self.InZone then
|
||||
self.InZone = true
|
||||
self:TogglePanel2(true)
|
||||
--self:TogglePanel3(true)
|
||||
end
|
||||
|
||||
return k
|
||||
end
|
||||
end
|
||||
if self.InZone then
|
||||
self.InZone = false
|
||||
self:TogglePanel2(false)
|
||||
--self:TogglePanel3(false)
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
function LR:TogglePanel2(t)
|
||||
self.Panel2Open = t
|
||||
SendNUIMessage({
|
||||
event = "toggle-panel2",
|
||||
data = t
|
||||
})
|
||||
end
|
||||
|
||||
function LR:SetDataPanel2(data)
|
||||
SendNUIMessage({
|
||||
event = "data-panel2",
|
||||
data = data
|
||||
})
|
||||
end
|
||||
|
||||
function LR:TimeThread()
|
||||
Citizen.CreateThread(function()
|
||||
while true do
|
||||
Wait(1000)
|
||||
for k, v in pairs(self.Zones) do
|
||||
if v.open then
|
||||
if v.playerCaptureName ~= nil then
|
||||
if v.CaptureTime > 0 then
|
||||
v.CaptureTime = v.CaptureTime - 1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if self.DelayTime > 0 then
|
||||
self.DelayTime = self.DelayTime - 1
|
||||
end
|
||||
if self.CurZone ~= nil then
|
||||
local v = self.Zones[self.CurZone]
|
||||
if v.open then
|
||||
if self.DelayTime > 0 then
|
||||
self:SetDataPanel2({
|
||||
type = "blocked",
|
||||
data = {
|
||||
name = v.Label,
|
||||
time = self.DelayTime
|
||||
}
|
||||
})
|
||||
else
|
||||
if v.playerCaptureName ~= nil then
|
||||
self:SetDataPanel2({
|
||||
type = "capturing",
|
||||
data = {
|
||||
name = v.Label,
|
||||
point = v.point,
|
||||
time = v.CaptureTime,
|
||||
player = v.playerCaptureName
|
||||
}
|
||||
})
|
||||
else
|
||||
self:SetDataPanel2({
|
||||
type = "allow",
|
||||
data = {
|
||||
name = v.Label,
|
||||
point = v.point,
|
||||
time = v.time
|
||||
}
|
||||
})
|
||||
end
|
||||
end
|
||||
else
|
||||
self:SetDataPanel2({
|
||||
type = "closed",
|
||||
data = {
|
||||
name = v.Label
|
||||
}
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function LR:EventHandler()
|
||||
RegisterNetEvent("lr_occ:client:startCapture", function(index, data)
|
||||
self.Zones[index] = data
|
||||
self:ShowNotification("warning",
|
||||
("%s đang bị chiếm bởi %s"):format(self.Zones[index].Label, self.Zones[index].playerCaptureName), true)
|
||||
self:PulseBlip(index)
|
||||
end)
|
||||
RegisterNetEvent("lr_occ:client:cancelCapture", function(index, data)
|
||||
local zone = self.Zones[index]
|
||||
self:ShowNotification("warning",
|
||||
("%s đã hủy chiếm khu vực %s, mọi người có thể tiến hành chiếm khu vực này ngay bây giờ"):format(
|
||||
zone.playerCaptureName, zone.Label))
|
||||
self.Zones[index].playerCaptureName = nil
|
||||
self.Zones[index].playerCaptureSource = nil
|
||||
self.Zones[index].playerCaptureTime = nil
|
||||
self.Zones[index].CaptureTime = self.Zones[index].time
|
||||
self:UnPulse()
|
||||
end)
|
||||
RegisterNetEvent("lr_occ:client:showNotification", function(...)
|
||||
self:ShowNotification(...)
|
||||
end)
|
||||
RegisterNetEvent("lr_occ:client:captured", function(index, data)
|
||||
if self.CurZone == index then
|
||||
SetCurrentPedWeapon(PlayerPedId(), "WEAPON_UNARMED", true)
|
||||
end
|
||||
self:ShowNotification("success",
|
||||
("%s đã chiếm thành công %s mang về %s điểm cho %s"):format(data.playerCaptureName, data.Label, data.point,
|
||||
data.owner))
|
||||
self.Zones[index] = data
|
||||
self:UnPulse()
|
||||
self.DelayTime = Config.Delay
|
||||
self:Blip()
|
||||
end)
|
||||
RegisterNetEvent("lr_occ:client:openMain", function(index, data)
|
||||
self:ShowNotification("success",
|
||||
"Khu vực chính đã được mở, các băng đảng có thể tiến hành chiếm đóng ngay bây giờ !!")
|
||||
self.Zones[index] = data
|
||||
self.DelayTime = 600
|
||||
self:Blip()
|
||||
end)
|
||||
end
|
||||
|
||||
function LR:ShowNotification(type, msg, playSound)
|
||||
SendNUIMessage({
|
||||
event = "notification",
|
||||
data = {
|
||||
type = type,
|
||||
msg = msg,
|
||||
playSound = playSound
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
function LR:PulseBlip(index)
|
||||
local zoneCoords = Config.Occ[index].Pos
|
||||
local Pblip = AddBlipForCoord(zoneCoords.x, zoneCoords.y, zoneCoords.z)
|
||||
SetBlipSprite(Pblip, 161)
|
||||
SetBlipScale(Pblip, 2.0)
|
||||
SetBlipColour(Pblip, 1)
|
||||
PulseBlip(Pblip)
|
||||
self.PulseBlip = Pblip
|
||||
end
|
||||
|
||||
function LR:UnPulse()
|
||||
RemoveBlip(self.PulseBlip)
|
||||
self.PulseBlip = nil
|
||||
end
|
||||
|
||||
function LR:Blip()
|
||||
for k, v in pairs(self.Blips) do
|
||||
RemoveBlip(v)
|
||||
end
|
||||
self.Blips = {}
|
||||
for k, v in pairs(self.RadiusBlips) do
|
||||
RemoveBlip(v)
|
||||
end
|
||||
self.RadiusBlips = {}
|
||||
for k, v in pairs(self.Zones) do
|
||||
if v.open and v.owner == nil then
|
||||
local blip = AddBlipForCoord(v.Pos.x, v.Pos.y, v.Pos.z)
|
||||
SetBlipSprite(blip, 420)
|
||||
SetBlipDisplay(blip, 2)
|
||||
SetBlipScale(blip, 0.9)
|
||||
SetBlipColour(blip, 1)
|
||||
SetBlipAsShortRange(blip, true)
|
||||
SetBlipHighDetail(blip, true)
|
||||
BeginTextCommandSetBlipName("STRING")
|
||||
AddTextComponentString(("Khu Vực Chiếm Đóng [%s]"):format(k))
|
||||
EndTextCommandSetBlipName(blip)
|
||||
self.Blips[k] = blip
|
||||
else
|
||||
local blip = AddBlipForCoord(v.Pos.x, v.Pos.y, v.Pos.z)
|
||||
SetBlipSprite(blip, 420)
|
||||
SetBlipDisplay(blip, 2)
|
||||
SetBlipScale(blip, 0.9)
|
||||
SetBlipColour(blip, 5)
|
||||
SetBlipAsShortRange(blip, true)
|
||||
SetBlipHighDetail(blip, true)
|
||||
BeginTextCommandSetBlipName("STRING")
|
||||
AddTextComponentString(("Khu Vực Chiếm Đóng [%s]"):format(string.upper(v.owner or k)))
|
||||
EndTextCommandSetBlipName(blip)
|
||||
self.Blips[k] = blip
|
||||
end
|
||||
local Ablip = AddBlipForRadius(v.Pos.x, v.Pos.y, v.Pos.z, v.Radius)
|
||||
SetBlipColour(Ablip, 1)
|
||||
SetBlipAlpha(Ablip, 100)
|
||||
SetBlipHighDetail(Ablip, true)
|
||||
SetBlipRotation(Ablip, 0.0)
|
||||
SetBlipDisplay(Ablip, 4)
|
||||
SetBlipAsShortRange(Ablip, false)
|
||||
self.RadiusBlips[k] = Ablip
|
||||
end
|
||||
--self:PulseBlip("main")
|
||||
print("LOADED BLIPS")
|
||||
end
|
||||
|
||||
Citizen.CreateThread(function()
|
||||
while ESX == nil do
|
||||
Wait(0)
|
||||
TriggerEvent("esx:getSharedObject", function(obj) ESX = obj end)
|
||||
end
|
||||
LR:Init()
|
||||
end)
|
||||
|
||||
|
||||
function DisplayText(text)
|
||||
local width = string.len(text) + 0.0
|
||||
DrawRect(1.0 - width / 200 / 2, 0.98, width / 200, 0.06, 245, 71, 72, 200)
|
||||
SetTextScale(0.4, 0.4)
|
||||
SetTextFont(ESX.FontId)
|
||||
SetTextProportional(1)
|
||||
SetTextColour(255, 255, 255, 255)
|
||||
SetTextEntry("STRING")
|
||||
SetTextCentre(1)
|
||||
AddTextComponentString(text)
|
||||
DrawText(1.0 - width / 200 / 2, 0.96)
|
||||
end
|
140
config.lua
Normal file
140
config.lua
Normal file
|
@ -0,0 +1,140 @@
|
|||
Config = {}
|
||||
Config.Occ = {
|
||||
['1'] = {
|
||||
Pos = vector3(1003.8855, 2367.1669, 51.728935),
|
||||
Label = "Công trường",
|
||||
Radius = 200.0,
|
||||
oRadius = 300.0,
|
||||
cRadius = 50.0,
|
||||
time = 600,
|
||||
point = 500,
|
||||
open = true
|
||||
},
|
||||
['2'] = {
|
||||
Pos = vector3(-1336.3525, -3043.8943, 13.9444),
|
||||
Label = "Sân bay",
|
||||
Radius = 200.0,
|
||||
oRadius = 300.0,
|
||||
cRadius = 50.0,
|
||||
time = 600,
|
||||
point = 500,
|
||||
open = true
|
||||
},
|
||||
['3'] = {
|
||||
Pos = vector3(-425.4942, 1123.6724, 325.8549),
|
||||
Label = "Đài Thiên Văn",
|
||||
Radius = 200.0,
|
||||
oRadius = 300.0,
|
||||
cRadius = 50.0,
|
||||
time = 600,
|
||||
point = 500,
|
||||
open = true
|
||||
},
|
||||
['4'] = {
|
||||
Pos = vector3(-2329.2976, 3043.7192, 32.8146),
|
||||
Label = "Doanh Trại Quân Đội",
|
||||
Radius = 200.0,
|
||||
oRadius = 300.0,
|
||||
cRadius = 50.0,
|
||||
time = 600,
|
||||
point = 500,
|
||||
open = true
|
||||
},
|
||||
['5'] = {
|
||||
Pos = vector3(2834.1601, 1528.3621, 24.56747),
|
||||
Label = "Nhà máy điện",
|
||||
Radius = 200.0,
|
||||
oRadius = 300.0,
|
||||
cRadius = 50.0,
|
||||
time = 600,
|
||||
point = 500,
|
||||
open = true
|
||||
},
|
||||
--[[ ['5'] = {
|
||||
Pos = vector3(5136.1894, -5144.942, 2.1036267),
|
||||
Label = "Đảo kho báu",
|
||||
oRadius = 100.0,,
|
||||
oRadius = 150.0,
|
||||
cRadius = 50.0,
|
||||
time = 600,
|
||||
point = 500,
|
||||
open = false
|
||||
}, ]]
|
||||
['6'] = {
|
||||
Pos = vector3(56.695755, 3709.9353, 39.75494),
|
||||
Label = "Khu ổ chuột",
|
||||
Radius = 200.0,
|
||||
oRadius = 300.0,
|
||||
cRadius = 50.0,
|
||||
time = 600,
|
||||
point = 500,
|
||||
open = false
|
||||
},
|
||||
--[[ ['7'] = {
|
||||
Pos = vector3(979.18133, -3006.66, 5.9007616),
|
||||
Label = "Tàu chở hàng",
|
||||
oRadius = 100.0,,
|
||||
oRadius = 150.0,
|
||||
cRadius = 50.0,
|
||||
time = 600,
|
||||
point = 500,
|
||||
open = false
|
||||
}, ]]
|
||||
}
|
||||
|
||||
Config.Delay = 600
|
||||
Config.DelayPoint = 600
|
||||
Config.ExceptJobs = {
|
||||
["unemployed"] = false,
|
||||
["police"] = false,
|
||||
["ambulance"] = false,
|
||||
["mechanic"] = false,
|
||||
["ALS"] = true,
|
||||
["LORD"] = true,
|
||||
["DALTONII"] = true,
|
||||
["CHAMPION"] = true,
|
||||
["AOE"] = true,
|
||||
["GC"] = true,
|
||||
["DN"] = true
|
||||
}
|
||||
Config.BlockVehicle = {
|
||||
[`trash`] = true,
|
||||
[`boxville`] = true,
|
||||
[`Pounder`] = true,
|
||||
[`moonbeam`] = true,
|
||||
[`burrito3`] = true,
|
||||
[`surfer`] = true,
|
||||
[`boxville4`] = true,
|
||||
[`minivan`] = true,
|
||||
[`minivan2`] = true,
|
||||
[`youga`] = true,
|
||||
[`youga2`] = true,
|
||||
[`youga3`] = true,
|
||||
[`surfer2`] = true,
|
||||
[`dubsta3`] = true,
|
||||
[`bison2`] = true,
|
||||
[`bison3`] = true,
|
||||
[`rumpo2`] = true,
|
||||
[`rumpo3`] = true,
|
||||
[`bobcatxl`] = true,
|
||||
[`bison`] = true,
|
||||
[`gburrito2`] = true,
|
||||
[`burrito2`] = true,
|
||||
[`journey`] = true,
|
||||
[`rumpo`] = true,
|
||||
[`packer`] = true,
|
||||
[`tr3`] = true,
|
||||
[`phantom`] = true,
|
||||
[`trailers2`] = true,
|
||||
[`trailers3`] = true,
|
||||
[`tr4`] = true,
|
||||
[`tr2`] = true,
|
||||
[`barracks2`] = true,
|
||||
[`armytrailer`] = true,
|
||||
[`armytrailer2`] = true,
|
||||
[`trailerlogs`] = true,
|
||||
[`trflat`] = true,
|
||||
[`topolm`] = true,
|
||||
|
||||
|
||||
}
|
24
fxmanifest.lua
Normal file
24
fxmanifest.lua
Normal file
|
@ -0,0 +1,24 @@
|
|||
fx_version 'cerulean'
|
||||
games { 'gta5' }
|
||||
author 'Lorax'
|
||||
description 'Training System'
|
||||
version '1.0.0'
|
||||
-- What to run
|
||||
client_scripts {
|
||||
'config.lua',
|
||||
'client/main.lua'
|
||||
}
|
||||
server_scripts {
|
||||
'@oxmysql/lib/MySQL.lua',
|
||||
'config.lua',
|
||||
'server/main.lua'
|
||||
}
|
||||
ui_page "html/index.html"
|
||||
files {
|
||||
"html/index.html",
|
||||
"html/app.js",
|
||||
"html/style.css",
|
||||
'html/sound/attention.mp3'
|
||||
}
|
||||
shared_script { '@ox_lib/init.lua' }
|
||||
lua54 'yes'
|
155
html/app.js
Normal file
155
html/app.js
Normal file
|
@ -0,0 +1,155 @@
|
|||
$(document).ready(function(){
|
||||
var x = document.getElementById("myAudio");
|
||||
var canvas = document.getElementById("canvas");
|
||||
var ctx = canvas.getContext("2d");
|
||||
ctx.canvas.width = window.innerWidth / 100 * 20;
|
||||
ctx.canvas.height = window.innerHeight / 100 * 30;
|
||||
ctx.beginPath();
|
||||
ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);
|
||||
/* ctx.fillStyle = "red";
|
||||
ctx.fill(); */
|
||||
function drawStar(cx,cy,spikes,outerRadius,innerRadius){
|
||||
var rot=Math.PI/2*3;
|
||||
var x=cx;
|
||||
var y=cy;
|
||||
var step=Math.PI/spikes;
|
||||
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(cx,cy-outerRadius)
|
||||
for(i=0;i<spikes;i++){
|
||||
x=cx+Math.cos(rot)*outerRadius;
|
||||
y=cy+Math.sin(rot)*outerRadius;
|
||||
ctx.lineTo(x,y)
|
||||
rot+=step
|
||||
|
||||
x=cx+Math.cos(rot)*innerRadius;
|
||||
y=cy+Math.sin(rot)*innerRadius;
|
||||
ctx.lineTo(x,y)
|
||||
rot+=step
|
||||
}
|
||||
ctx.lineTo(cx,cy-outerRadius);
|
||||
ctx.closePath();
|
||||
ctx.lineWidth=5;
|
||||
ctx.strokeStyle='#39a9cb';
|
||||
ctx.stroke();
|
||||
ctx.fillStyle='skyblue';
|
||||
ctx.fill();
|
||||
}
|
||||
|
||||
drawStar(ctx.canvas.width/2,ctx.canvas.height/2,5,ctx.canvas.width/3.8,0);
|
||||
|
||||
function SetColor(element, className){
|
||||
element.removeClass("success");
|
||||
element.removeClass("warning");
|
||||
element.removeClass("error");
|
||||
element.addClass(className)
|
||||
}
|
||||
|
||||
window.addEventListener("message", function(e){
|
||||
let event = e.data.event;
|
||||
let data = e.data.data;
|
||||
switch(event){
|
||||
case "data-panel2":
|
||||
/* if (data.canCapture == true){
|
||||
$("#panel-2 h1").text("Khu vực chiếm đóng");
|
||||
$("#panel-2 #name").text(`Tên: ${data.name}`);
|
||||
$("#panel-2 #point").text(`Điểm: ${data.point}`);
|
||||
$("#panel-2 #time").text(`Thời gian chiếm: ${data.time} giây`);
|
||||
if (data.capture != undefined){
|
||||
$("#panel-2 #capture").text(`Đang chiếm bởi: ${data.capture}`);
|
||||
}else{
|
||||
$("#panel-2 #capture").text("Chưa có ai chiếm")
|
||||
}
|
||||
}else{
|
||||
$("#panel-2 h1").text("Khu vực chiếm đóng");
|
||||
$("#panel-2 #name").text(`cần ${data.lastCapture} giây nữa để có thể chiếm`);
|
||||
$("#panel-2 #point").text(``);
|
||||
$("#panel-2 #time").text(``);
|
||||
$("#panel-2 #capture").text(``);
|
||||
} */
|
||||
let type = data.type;
|
||||
let info = data.data;
|
||||
$("#panel-2").empty();
|
||||
switch(type){
|
||||
case "blocked":
|
||||
SetColor($("#panel-2"), "error");
|
||||
$("#panel-2").append(`
|
||||
<h1>Khu vực chiếm đóng</h1>
|
||||
<h4 class="info">${info.name}</h4>
|
||||
<h4 class="info">Điểm: ${info.point}</h4>
|
||||
<h3 class="info">${info.time}</h3>
|
||||
`)
|
||||
if (info.owner){
|
||||
$("#panel-2").append(`
|
||||
<h4 class="info">Khu vực của: ${info.owner}</h4>
|
||||
`)
|
||||
}
|
||||
break;
|
||||
case "capturing":
|
||||
SetColor($("#panel-2"), "warning");
|
||||
$("#panel-2").append(`
|
||||
<h1>Khu vực chiếm đóng</h1>
|
||||
<h1 class="info">${info.time}</h1>
|
||||
<h4 class="info">${info.name}</h4>
|
||||
<h4 class="info">Điểm: ${info.point}</h4>
|
||||
<h4 class="info">Đang Chiếm Bởi: ${info.player}</h4>
|
||||
`)
|
||||
break;
|
||||
case "allow":
|
||||
SetColor($("#panel-2"), "success");
|
||||
$("#panel-2").append(`
|
||||
<h1>Khu vực chiếm đóng</h1>
|
||||
<h4 class="info">${info.name}</h4>
|
||||
<h4 class="info">Điểm: ${info.point}</h4>
|
||||
<h4 class="info">Thời gian chiếm: ${info.time} giây</h4>
|
||||
<h4 class="info">Có thể chiếm</h4>
|
||||
`)
|
||||
break;
|
||||
case "owned":
|
||||
SetColor($("#panel-2"), "warning");
|
||||
$("#panel-2").append(`
|
||||
<h1>Khu vực chiếm đóng</h1>
|
||||
<h4 class="info">${info.name}</h4>
|
||||
<h4 class="info">Điểm: ${info.point}</h4>
|
||||
<h4 class="info">Khu vực của: ${info.owner}</h4>
|
||||
`)
|
||||
break;
|
||||
case "closed":
|
||||
SetColor($("#panel-2"), "error");
|
||||
$("#panel-2").append(`
|
||||
<h1>Khu vực chiếm đóng</h1>
|
||||
<h1 class="info">Chưa mở</h1>
|
||||
<h4 class="info">${info.name}</h4>
|
||||
`)
|
||||
break;
|
||||
default:
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
case "toggle-panel2":
|
||||
if (data == true){
|
||||
$("#panel-2").fadeIn();
|
||||
}else{
|
||||
$("#panel-2").fadeOut();
|
||||
}
|
||||
break;
|
||||
case "data-panel3":
|
||||
$("#panel-3 h3").text(data)
|
||||
break;
|
||||
case "notification":
|
||||
SetColor($("#panel-3"), data.type);
|
||||
$("#panel-3 h3").text(data.msg);
|
||||
$("#panel-3").fadeIn();
|
||||
if(data.playSound){
|
||||
x.play();
|
||||
x.volume = 0.1;
|
||||
}
|
||||
setTimeout(function(){
|
||||
$("#panel-3").fadeOut();
|
||||
}, 10000)
|
||||
break;
|
||||
default:
|
||||
}
|
||||
})
|
||||
})
|
33
html/index.html
Normal file
33
html/index.html
Normal file
|
@ -0,0 +1,33 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="style.css">
|
||||
<link rel="stylesheet" type="text/css" href="https://unpkg.com/augmented-ui@2/augmented-ui.min.css">
|
||||
|
||||
<title>Document</title>
|
||||
</head>
|
||||
<body>
|
||||
<audio id="myAudio">
|
||||
<source src="sound/attention.mp3" type="audio/mpeg">
|
||||
</audio>
|
||||
<div id="panel-1" style="display: none;">
|
||||
<h1>Thông tin chiếm đóng</h1>
|
||||
<canvas id="canvas"></canvas>
|
||||
</div>
|
||||
<div id="panel-2" style="display: none;" data-augmented-ui="exe tl-clip tr-clip bl-clip br-clip inlay">
|
||||
<!-- <h1>title2</h1>
|
||||
<h4 class="info" id="name">asd</h4>
|
||||
<h4 class="info" id="point">asd</h4>
|
||||
<h4 class="info" id="time">asd</h4>
|
||||
<h4 class="info" id="capture">asd</h4> -->
|
||||
</div>
|
||||
<div id="panel-3" style="display: none;" data-augmented-ui="exe tl-clip tr-clip bl-clip br-clip inlay">
|
||||
<h3>title3</h3>
|
||||
</div>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js" integrity="sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP+u1T9qYdvdihz0PPSiiqn/+/3e7Jo4EaG7TubfWGUrMQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||
<script src="app.js"></script>
|
||||
</body>
|
||||
</html>
|
BIN
html/sound/1.mp3
Normal file
BIN
html/sound/1.mp3
Normal file
Binary file not shown.
BIN
html/sound/attention.mp3
Normal file
BIN
html/sound/attention.mp3
Normal file
Binary file not shown.
77
html/style.css
Normal file
77
html/style.css
Normal file
|
@ -0,0 +1,77 @@
|
|||
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@200&display=swap');
|
||||
@import url('https://fonts.googleapis.com/css2?family=Anton&display=swap');
|
||||
body{
|
||||
font-family: 'Montserrat', sans-serif;
|
||||
color: #bb371a;
|
||||
text-transform: uppercase;
|
||||
-webkit-text-stroke-width: 1px;
|
||||
-webkit-text-stroke-color: rgba(0, 0, 0, 0.152);
|
||||
}
|
||||
h1 {
|
||||
font-family: 'Anton', sans-serif;
|
||||
text-align: center;
|
||||
}
|
||||
h3{
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#panel-1{
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
transform: translateY(-20vh);
|
||||
width: 20vw;
|
||||
height: 40vh;
|
||||
clip-path: polygon(95% 0, 100% 5%, 100% 100%, 0 100%, 0 0);
|
||||
padding: .3rem;
|
||||
--grad:transparent 49.5%,#f7fd04 50%;
|
||||
background: linear-gradient(to top right,var(--grad)) top right,white;
|
||||
background-size:calc(5% + 4px) calc(5% + 4px); /* 10px of the clip-path + 4px of border */
|
||||
background-repeat:no-repeat;
|
||||
background-origin:border-box;
|
||||
background-color: #f7fd0469;
|
||||
}
|
||||
#panel-2{
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
bottom: 0;
|
||||
width: 17vw;
|
||||
height: auto;
|
||||
transform: translateX(calc(-17vw / 2));
|
||||
padding: .3rem;
|
||||
}
|
||||
#panel-3{
|
||||
position: absolute;
|
||||
right: 0;
|
||||
bottom: 76%;
|
||||
width: 20vw;
|
||||
height: auto;
|
||||
background-color: #f7fd04;
|
||||
clip-path: polygon(5% 0, 100% 0, 100% 100%, 0 100%, 0 15%);
|
||||
padding: .3rem;
|
||||
--grad:transparent 49.5%,#f7fd04 50%;
|
||||
background: linear-gradient(to top left,var(--grad)) top left,white;
|
||||
background-size:calc(5% + 4px) calc(15% + 4px); /* 10px of the clip-path + 4px of border */
|
||||
background-repeat:no-repeat;
|
||||
background-origin:border-box;
|
||||
background-color: #f7fd0469;
|
||||
}
|
||||
h1{
|
||||
/* padding-bottom: 2rem; */
|
||||
}
|
||||
.info{
|
||||
text-align: center;
|
||||
margin: .4rem;
|
||||
}
|
||||
|
||||
.success{
|
||||
border: 3px solid #9ede73;
|
||||
background-color: #9ede7369;
|
||||
}
|
||||
.warning{
|
||||
background-color: #f7fd0469;
|
||||
}
|
||||
.error{
|
||||
border: 3px solid #f54748;
|
||||
background-color: #f5474869;
|
||||
color:#252525;
|
||||
}
|
452
server/main.lua
Normal file
452
server/main.lua
Normal file
|
@ -0,0 +1,452 @@
|
|||
ESX = exports["es_extended"]:getSharedObject()
|
||||
playerCache = {}
|
||||
|
||||
function GetPlayerFromCache(source)
|
||||
if playerCache[tonumber(source)] == nil then
|
||||
playerCache[tonumber(source)] = ESX.GetPlayerFromId(source)
|
||||
end
|
||||
return playerCache[tonumber(source)]
|
||||
end
|
||||
|
||||
LR = {}
|
||||
LR.__index = LR
|
||||
local playerInZone = {}
|
||||
local os_time = os.time
|
||||
local coroutine_yield = coroutine.yield
|
||||
function LR:Init()
|
||||
local o = {}
|
||||
setmetatable(o, LR)
|
||||
o.LastCapture = 0
|
||||
o.Zones = Config.Occ
|
||||
o.ZoneData = {}
|
||||
o.CurrentCapture = {}
|
||||
o.IsOpen = false
|
||||
GlobalState.LastCapture = 0
|
||||
GlobalState.CurrentCapture = {}
|
||||
GlobalState.Occ = o.Zones
|
||||
o.OnDev = false
|
||||
o.PressedPLayer = {}
|
||||
o:EventHandler()
|
||||
o:DelayThread()
|
||||
o:SQL()
|
||||
GlobalState.ostime = 0
|
||||
GlobalState.GangBlips = {
|
||||
['HM'] = {
|
||||
sprite = 16,
|
||||
color = 1
|
||||
},
|
||||
['LORD'] = {
|
||||
sprite = 77,
|
||||
color = 1
|
||||
},
|
||||
['HLG'] = {
|
||||
sprite = 355,
|
||||
color = 1
|
||||
},
|
||||
['ALS'] = {
|
||||
sprite = 76,
|
||||
color = 1
|
||||
},
|
||||
['AOE'] = {
|
||||
sprite = 78,
|
||||
color = 1
|
||||
},
|
||||
['GC'] = {
|
||||
sprite = 80,
|
||||
color = 1
|
||||
},
|
||||
|
||||
|
||||
|
||||
}
|
||||
GlobalState.OccOpen = o.IsOpen
|
||||
return o
|
||||
end
|
||||
|
||||
function LR:SQL()
|
||||
MySQL.ready(function()
|
||||
for k, v in pairs(self.Zones) do
|
||||
local data = MySQL.Sync.fetchAll("SELECT * FROM occ_data WHERE `index` = @index", { ['@index'] = k })
|
||||
if data[1] then
|
||||
v.owner = data[1].owner
|
||||
else
|
||||
MySQL.Sync.execute("INSERT INTO occ_data (`index`, owner) VALUE (@index, @owner)",
|
||||
{ ['@index'] = k, ['@owner'] = v.owner })
|
||||
end
|
||||
self.ZoneData[k] = {}
|
||||
end
|
||||
GlobalState.Occ = self.Zones
|
||||
GlobalState.ZoneData = self.ZoneData
|
||||
end)
|
||||
end
|
||||
|
||||
function LR:DelayThread()
|
||||
--GlobalState.OccDelay = 0
|
||||
-- Citizen.CreateThread(function()
|
||||
-- while true do
|
||||
-- Wait(1000)
|
||||
-- local d = os_time() - self.LastCapture
|
||||
-- GlobalState.ostime = os_time()
|
||||
-- end
|
||||
-- end)
|
||||
|
||||
Citizen.CreateThread(function()
|
||||
while true do
|
||||
Wait(10 * 60 * 1000)
|
||||
for k, v in pairs(self.Zones) do
|
||||
if v.owner then
|
||||
-- MySQL.Async.execute('UPDATE dh_rank SET scores = scores + @point WHERE name = @name', {
|
||||
-- ['@name'] = v.owner,
|
||||
-- ['@point'] = 5
|
||||
-- })
|
||||
|
||||
MySQL.Async.execute('UPDATE jobs SET point = point + @point WHERE name = @name', {
|
||||
['@name'] = v.owner,
|
||||
['@point'] = 5
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function LR:EventHandler()
|
||||
AddEventHandler("playerDropped", function(reason)
|
||||
if playerCache[tonumber(source)] then
|
||||
if playerInZone[source] then
|
||||
local org = playerCache[tonumber(source)].job.name
|
||||
for k, v in pairs(self.ZoneData) do
|
||||
if v[org] then
|
||||
v[org] = v[org] - 1
|
||||
if v[org] == 0 then
|
||||
v[org] = nil
|
||||
end
|
||||
GlobalState.ZoneData = self.ZoneData
|
||||
break
|
||||
end
|
||||
end
|
||||
playerInZone[source] = nil
|
||||
end
|
||||
playerCache[tonumber(source)] = nil
|
||||
end
|
||||
end)
|
||||
AddEventHandler("esx:setJob", function(playerId, _org, lastorg)
|
||||
if playerInZone[playerId] then
|
||||
local org = lastorg.name
|
||||
local neworg = _org.name
|
||||
for k, v in pairs(self.ZoneData) do
|
||||
if v[org] then
|
||||
v[org] = v[org] - 1
|
||||
if v[org] == 0 then
|
||||
v[org] = nil
|
||||
end
|
||||
if v[neworg] then
|
||||
v[neworg] = v[neworg] + 1
|
||||
else
|
||||
v[neworg] = 1
|
||||
end
|
||||
GlobalState.ZoneData = self.ZoneData
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
RegisterNetEvent("lr_occ2:server:join", function(index)
|
||||
local src = source
|
||||
print(src)
|
||||
print(src)
|
||||
local xPlayer = GetPlayerFromCache(source)
|
||||
local org = xPlayer.job.name
|
||||
if self.ZoneData[index][org] then
|
||||
if self.ZoneData[index][org] == 30 then --so nguoi chiem dong
|
||||
SetEntityCoords(GetPlayerPed(source), 236.00483703613, -876.13092041016, 30.031923294067, false, false,
|
||||
false, false)
|
||||
TriggerClientEvent("esx:showNotification", source, "Vượt quá số người cho phép")
|
||||
else
|
||||
playerInZone[source] = true
|
||||
-- SetPlayerRoutingBucket(src, 10)
|
||||
self.ZoneData[index][org] = self.ZoneData[index][org] + 1
|
||||
end
|
||||
else
|
||||
playerInZone[source] = true
|
||||
self.ZoneData[index][org] = 1
|
||||
end
|
||||
GlobalState.ZoneData = self.ZoneData
|
||||
end)
|
||||
RegisterNetEvent("lr_occ2:server:leave", function(index)
|
||||
local src = source
|
||||
-- print(src)
|
||||
-- print(src)
|
||||
local xPlayer = GetPlayerFromCache(source)
|
||||
local org = xPlayer.job.name
|
||||
if self.ZoneData[index][org] and playerInZone[source] then
|
||||
self.ZoneData[index][org] = self.ZoneData[index][org] - 1
|
||||
if self.ZoneData[index][org] == 0 then
|
||||
self.ZoneData[index][org] = nil
|
||||
end
|
||||
GlobalState.ZoneData = self.ZoneData
|
||||
playerInZone[source] = nil
|
||||
-- SetPlayerRoutingBucket(src, 0)
|
||||
end
|
||||
end)
|
||||
ESX.RegisterServerCallback('lr_occ2:callback:cC', function(source, cb, index)
|
||||
if self.IsOpen then
|
||||
if os_time() - self.LastCapture >= Config.Delay then
|
||||
local crZone = self.Zones[index]
|
||||
if crZone.lastCapture == nil or os_time() - crZone.lastCapture >= Config.DelayPoint then
|
||||
if self.CurrentCapture[index] == nil then
|
||||
if getLenght(self.CurrentCapture) < 1 then
|
||||
local xPlayer = ESX.GetPlayerFromId(source)
|
||||
if not self.PressedPLayer[xPlayer.identifier] then
|
||||
if crZone.owner and crZone.owner == xPlayer.job.name then
|
||||
self:TriggerClientEvent(source, ("Khu vực này đã thuộc về bạn"))
|
||||
cb(false)
|
||||
return
|
||||
end
|
||||
cb(true)
|
||||
else
|
||||
cb(false)
|
||||
self:TriggerClientEvent(source,
|
||||
("Hiện có khu vực đang bị chiếm nên không thể chiếm khu vực này"))
|
||||
end
|
||||
else
|
||||
cb(false)
|
||||
self:TriggerClientEvent(source,
|
||||
("Hiện có khu vực đang bị chiếm nên không thể chiếm khu vực này"))
|
||||
end
|
||||
else
|
||||
cb(false)
|
||||
self:TriggerClientEvent(source,
|
||||
("Khu vực %s đang bị chiếm bởi %s"):format(crZone.Label, self.CurrentCapture[index].name))
|
||||
end
|
||||
else
|
||||
cb(false)
|
||||
self:TriggerClientEvent(source,
|
||||
("Cần %s giây để có thể chiếm khu vực %s"):format(
|
||||
Config.Delay - (os_time() - crZone.lastCapture), crZone.Label))
|
||||
end
|
||||
else
|
||||
cb(false)
|
||||
self:TriggerClientEvent(source,
|
||||
("Cần %s giây để có thể chiếm"):format(Config.Delay - (os_time() - self.LastCapture)))
|
||||
end
|
||||
else
|
||||
cb(false)
|
||||
self:TriggerClientEvent(source, "Chưa đến thời gian chiếm đóng")
|
||||
end
|
||||
end)
|
||||
ESX.RegisterServerCallback("lr_occ2:callback:CanCapture", function(source, cb, index, moves)
|
||||
local xPlayer = ESX.GetPlayerFromId(source)
|
||||
if self.OnDev then
|
||||
if xPlayer.group ~= 'superadmin' then
|
||||
cb(false)
|
||||
return
|
||||
end
|
||||
end
|
||||
if self.IsOpen then
|
||||
print(os_time() - self.LastCapture)
|
||||
if os_time() - self.LastCapture >= Config.Delay then
|
||||
local crZone = self.Zones[index]
|
||||
if crZone.lastCapture == nil or os_time() - crZone.lastCapture >= Config.DelayPoint then
|
||||
if self.CurrentCapture[index] == nil then
|
||||
if getLenght(self.CurrentCapture) < 1 then
|
||||
local xPlayer = ESX.GetPlayerFromId(source)
|
||||
if not self.PressedPLayer[xPlayer.identifier] then
|
||||
if crZone.owner and crZone.owner == xPlayer.job.name then
|
||||
self:TriggerClientEvent(source, ("Khu vực này đã thuộc về bạn"))
|
||||
cb(false)
|
||||
return
|
||||
end
|
||||
if not Config.ExceptJobs[xPlayer.job.name] then
|
||||
self:TriggerClientEvent(source, ("Tổ chức của bạn không có quyền chiếm đóng"))
|
||||
return
|
||||
end
|
||||
--self.PressedPLayer[xPlayer.identifier] = true
|
||||
self.CurrentCapture[index] = {
|
||||
name = xPlayer.name,
|
||||
playerId = source,
|
||||
startAt = os_time()
|
||||
}
|
||||
--self.LastCapture = os_time()
|
||||
crZone.lastCapture = os_time()
|
||||
GlobalState.Occ = self.Zones
|
||||
GlobalState.CurrentCapture = self.CurrentCapture
|
||||
GlobalState.LastCapture = os_time() - 480
|
||||
TriggerClientEvent("lr_occ2:client:startCapture", -1, index, "[" .. xPlayer.job.name .. "] " .. xPlayer
|
||||
.name)
|
||||
self.crC = index
|
||||
cb(true)
|
||||
Citizen.CreateThread(function()
|
||||
local time = crZone.time + os_time()
|
||||
while true do
|
||||
coroutine_yield(0)
|
||||
if self.CurrentCapture[index] ~= nil then
|
||||
Wait(1000)
|
||||
if time <= os_time() then
|
||||
if crZone.owner == nil then
|
||||
|
||||
else
|
||||
self:RemovePoint(crZone.owner, crZone.point)
|
||||
end
|
||||
crZone.owner = xPlayer.job.name
|
||||
crZone.lastCapture = os_time()
|
||||
self.LastCapture = os_time()
|
||||
self.CurrentCapture[index] = nil
|
||||
GlobalState.Occ = self.Zones
|
||||
GlobalState.CurrentCapture = self.CurrentCapture
|
||||
GlobalState.LastCapture = os_time()
|
||||
TriggerClientEvent("lr_occ:client:captured", -1, index, xPlayer.name,
|
||||
xPlayer.job.name)
|
||||
self:AddPoint(xPlayer.job.name, crZone.point, index)
|
||||
break
|
||||
end
|
||||
else
|
||||
self.CurrentCapture[index] = nil
|
||||
GlobalState.CurrentCapture = self.CurrentCapture
|
||||
print("Canceled")
|
||||
break
|
||||
end
|
||||
end
|
||||
end)
|
||||
else
|
||||
cb(false)
|
||||
self:TriggerClientEvent(source,
|
||||
("Hiện có khu vực đang bị chiếm nên không thể chiếm khu vực này"))
|
||||
end
|
||||
else
|
||||
cb(false)
|
||||
self:TriggerClientEvent(source,
|
||||
("Hiện có khu vực đang bị chiếm nên không thể chiếm khu vực này"))
|
||||
end
|
||||
else
|
||||
cb(false)
|
||||
self:TriggerClientEvent(source,
|
||||
("Khu vực %s đang bị chiếm bởi %s"):format(crZone.Label, self.CurrentCapture[index].name))
|
||||
end
|
||||
else
|
||||
cb(false)
|
||||
self:TriggerClientEvent(source,
|
||||
("Cần %s giây để có thể chiếm khu vực %s"):format(
|
||||
Config.Delay - (os_time() - crZone.lastCapture), crZone.Label))
|
||||
end
|
||||
else
|
||||
cb(false)
|
||||
self:TriggerClientEvent(source,
|
||||
("Cần %s giây để có thể chiếm"):format(Config.Delay - (os_time() - self.LastCapture)))
|
||||
end
|
||||
else
|
||||
cb(false)
|
||||
self:TriggerClientEvent(source, "Chưa đến thời gian chiếm đóng")
|
||||
end
|
||||
end)
|
||||
|
||||
RegisterCommand("chiemdong", function(source, args, rawCommand)
|
||||
if self.IsOpen then
|
||||
TriggerClientEvent("hm_hud:client:addCD", -1, 5 * 10, 'chiếm đóng', 'Kết thúc sau', 'warning',
|
||||
'fas fa-skull-crossbones')
|
||||
else
|
||||
TriggerClientEvent("hm_hud:client:addCD", -1, 5 * 10, 'chiếm đóng', 'Bắt đầu sau', 'warning',
|
||||
'fas fa-skull-crossbones')
|
||||
end
|
||||
Wait(10 * 1000)
|
||||
self.IsOpen = not self.IsOpen
|
||||
GlobalState.OccOpen = self.IsOpen
|
||||
TriggerClientEvent("lr_occ2:client:openOcc", -1, self.IsOpen)
|
||||
end, true)
|
||||
|
||||
-- RegisterCommand("vaochiemdong", function(source, args, rawCommand)
|
||||
-- if self.IsOpen then
|
||||
-- SetPlayerRoutingBucket(source, 10)
|
||||
-- end
|
||||
-- end, false)
|
||||
|
||||
RegisterCommand("thoatchiemdong", function(source, args, rawCommand)
|
||||
SetPlayerRoutingBucket(source, 0)
|
||||
end, false)
|
||||
|
||||
AddEventHandler("esx:playerDropped", function(playerId)
|
||||
for k, v in pairs(self.CurrentCapture) do
|
||||
if v.playerId == playerId then
|
||||
self.CurrentCapture[k] = nil
|
||||
self.LastCapture = os_time() - 480
|
||||
--self.Zones[k].lastCapture = os_time()
|
||||
TriggerClientEvent("lr_occ:client:cancelCapture", -1, k, "")
|
||||
GlobalState.LastCapture = os_time() - 480
|
||||
return
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
RegisterNetEvent("lr_occ2:server:cancelCapture", function()
|
||||
for k, v in pairs(self.CurrentCapture) do
|
||||
if v.playerId == source then
|
||||
local xPlayer = ESX.GetPlayerFromId(source)
|
||||
self.LastCapture = os_time() - 480
|
||||
GlobalState.LastCapture = os_time() - 480
|
||||
self.CurrentCapture[k] = nil
|
||||
--self.LastCapture = os_time()
|
||||
self.Zones[k].lastCapture = os_time() - 1200
|
||||
GlobalState.Occ = self.Zones
|
||||
TriggerClientEvent("lr_occ:client:cancelCapture", -1, k, "[" .. xPlayer.job.name .. "] " .. xPlayer.name)
|
||||
return
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
--[[RegisterNetEvent("lr_occ:server:addPoint", function(gang, point)
|
||||
local data = MySQL.Sync.fetchAll("SELECT * FROM dh_rank WHERE `name` = @name", {['@name'] = gang})
|
||||
if data[1] then
|
||||
MySQL.Async.execute('UPDATE dh_rank SET scores = scores + @scores WHERE name = @name', {
|
||||
['@name'] = gang,
|
||||
['@scores'] = tonumber(point)
|
||||
})
|
||||
end
|
||||
end)--]]
|
||||
|
||||
RegisterCommand("occdev", function(source, args, rawCommand)
|
||||
self.OnDev = not self.OnDev
|
||||
end)
|
||||
lib.callback.register("lr_occ2:callback:getCurCapture", function(source)
|
||||
return self.crC
|
||||
end)
|
||||
end
|
||||
|
||||
function LR:TriggerClientEvent(playerId, msg)
|
||||
TriggerClientEvent("esx:showNotification", playerId, msg)
|
||||
end
|
||||
|
||||
function LR:AddPoint(orgName, point, index)
|
||||
MySQL.Async.execute('UPDATE jobs SET point = point + @point WHERE name = @name', {
|
||||
['@name'] = orgName,
|
||||
['@point'] = point
|
||||
})
|
||||
--[[MySQL.Async.execute('UPDATE dh_rank SET scores = scores + @point WHERE name = @name', {
|
||||
['@name'] = orgName,
|
||||
['@point'] = point
|
||||
})--]]
|
||||
MySQL.Async.execute("UPDATE occ_data SET owner = @owner WHERE `index` = @index", {
|
||||
['@owner'] = orgName,
|
||||
['@index'] = index
|
||||
})
|
||||
end
|
||||
|
||||
function LR:RemovePoint(orgName, point)
|
||||
MySQL.Async.execute('UPDATE jobs SET point = point - @point WHERE name = @name', {
|
||||
['@name'] = orgName,
|
||||
['@point'] = point
|
||||
})
|
||||
--[[MySQL.Async.execute('UPDATE dh_rank SET scores = scores - @point WHERE name = @name', {
|
||||
['@name'] = orgName,
|
||||
['@point'] = point
|
||||
})--]]
|
||||
end
|
||||
|
||||
function getLenght(tb)
|
||||
local c = 0
|
||||
for k, v in pairs(tb) do
|
||||
c = c + 1
|
||||
end
|
||||
return c
|
||||
end
|
||||
|
||||
LR:Init()
|
Loading…
Reference in New Issue
Block a user