13 Commits

Author SHA1 Message Date
Andyyy7666
46f4bdbd64 Update fxmanifest.lua 2023-12-29 18:43:17 +01:00
Andyyy7666
4870d639d4 fix(server/player): update client data on job set 2023-12-29 02:12:17 +01:00
Andyyy7666
ed895b4e6d tweak(client/vehicle): minimum cruise control speed 2023-12-29 00:10:40 +01:00
Andyyy7666
5d2925d0c3 fix(server/player): comparing rank 2023-12-28 23:30:18 +01:00
Andyyy7666
0500cef32f tweak: remove job if it's group is removed 2023-12-28 20:38:16 +01:00
Andyyy7666
0e1fb43cd2 feat: boss for groups 2023-12-28 20:37:59 +01:00
Andyyy7666
3260aa01f2 fix(compatibility/esx): errors without inventory 2023-12-26 23:33:33 +01:00
Andyyy7666
71a54be704 Update death.lua 2023-12-26 23:00:32 +01:00
Andyyy7666
d939607d64 fix: pay command issues 2023-12-25 23:15:36 +01:00
Andyyy7666
5cb038819c tweak(compatibility): nd v1 character data 2023-12-25 02:01:39 +01:00
Andyyy7666
9f5bb34bdd fix: groups nil issue if incorrect 2023-12-23 23:47:55 +01:00
Andyyy7666
29006870c3 feat: getConfig function 2023-12-23 23:47:24 +01:00
Andyyy7666
a60e1b9e32 fix: checking for driver in spawned vehicle 2023-12-23 00:00:45 +01:00
11 changed files with 123 additions and 39 deletions

View File

@@ -29,7 +29,7 @@ AddEventHandler("gameEventTriggered", function(name, args)
local victim = args[1]
if not IsPedAPlayer(victim) or NetworkGetPlayerIndexFromPed(victim) ~= cache.playerId then return end
if not IsPedDeadOrDying(victim, true) and GetEntityHealth(victim) > 0 then
if not IsPedDeadOrDying(victim, true) then
local hit, bone = GetPedLastDamageBone(victim)
if hit and usingAmbulance then
local damageWeapon = ambulance:getLastDamagingWeapon(victim)

View File

@@ -26,6 +26,13 @@ function NDCore.getPlayersFromCoords(distance, coords)
return closePlayers
end
function NDCore.getConfig(info)
if not info then
return Config
end
return Config[info]
end
function NDCore.revivePlayer(reset, keepDead)
local usingAmbulance = GetResourceState("ND_Ambulance") == "started"
if not keepDead then

View File

@@ -697,9 +697,14 @@ lib.addKeybind({
})
end
if not playerVehicle then return end
local speed = math.floor(GetEntitySpeed(playerVehicle) * 2.236936)
if speed < 10 then return end
cruiseControlEnabled = true
cruiseSpeedVehicle = math.floor(GetEntitySpeed(playerVehicle) * 2.236936)
cruiseSpeedVehicle = speed
cruiseSpeedSet = cruiseSpeedVehicle
lib.notify({
title = "Cruise control",
description = ("Set to %d mph."):format(math.floor(cruiseSpeedSet)),

View File

@@ -5,13 +5,32 @@ exports("GetCoreObject", function()
end)
NDCore.Functions = {}
NDCore.Functions.GetPlayer = NDCore.getPlayer
NDCore.Functions.GetPlayers = NDCore.getPlayers
NDCore.Functions.GetUserDiscordInfo = NDCore.getDiscordInfo
NDCore.Functions.SetActiveCharacter = NDCore.setActiveCharacter
NDCore.Functions.GetPlayerCharacters = NDCore.fetchAllCharacters
NDCore.Functions.GetPlayerByCharacterId = NDCore.fetchCharacter
function NDCore.Functions.GetPlayer(src)
local player = NDCore.getPlayer(src)
return {
source = player.source,
id = player.id,
firstName = player.firstname,
lastName = player.lastname,
dob = player.dob,
gender = player.gender,
cash = player.cash,
bank = player.bank,
phoneNumber = player.metadata.phone,
lastLocation = player.metadata.lastLocation,
inventory = player.inventory,
discordInfo = player.discordInfo,
data = player.metadata,
job = player.job
}
end
function NDCore.Functions.GetPlayerIdentifierFromType(identifierType, src)
return GetPlayerIdentifierByType(src, identifierType)
end

View File

@@ -60,7 +60,7 @@ function NDCore.GetPlayerData()
player.coords = GetEntityCoords(cache.ped)
player.loadout = {}
player.maxWeight = exports.ox_inventory:GetPlayerMaxWeight()
player.maxWeight = GetResourceState("ox_inventory") == "started" and exports.ox_inventory:GetPlayerMaxWeight() or 0
player.money = player.Accounts.Money
player.sex = player.gender
player.firstName = player.firstname
@@ -112,7 +112,7 @@ function NDCore.Progressbar(message, lenght, options)
end
function NDCore.SearchInventory(item, count)
local itemCount = exports.ox_inventory:Search(item)
local itemCount = GetResourceState("ox_inventory") == "started" and exports.ox_inventory:Search(item) or 0
return itemCount >= count and itemCount
end
@@ -133,7 +133,7 @@ function NDCore.ShowHelpNotification()
end
function NDCore.ShowInventory()
exports.ox_inventory:openInventory("player", cache.serverId)
return GetResourceState("ox_inventory") == "started" and exports.ox_inventory:openInventory("player", cache.serverId)
end
function NDCore.ShowNotification(msg, type, time)

View File

@@ -5,7 +5,8 @@ local registeredItems = {}
local function getAmmoFromWeapon(weapon)
if not weapon then return end
for item, data in pairs(exports.ox_inventory:Items()) do
local items = GetResourceState("ox_inventory") == "started" and exports.ox_inventory:Items() or {}
for item, data in pairs(items) do
if data.weapon and data.model and data.model:lower() == weapon:lower() then
return data.ammoname
end
@@ -60,7 +61,7 @@ local function createPlayerFunctions(self)
end
function self.addInventoryItem(item, count)
exports.ox_inventory:AddItem(self.source, item, count)
return GetResourceState("ox_inventory") == "started" and exports.ox_inventory:AddItem(self.source, item, count)
end
function self.addMoney(amount)
@@ -100,11 +101,11 @@ local function createPlayerFunctions(self)
end
function self.canCarryItem(item, count)
return exports.ox_inventory:CanCarryItem(self.source, item, count)
return GetResourceState("ox_inventory") == "started" and exports.ox_inventory:CanCarryItem(self.source, item, count)
end
function self.canSwapItem(firstItem, firstItemCount, testItem, testItemCount)
exports.ox_inventory:CanSwapItem(self.source, firstItem, firstItemCount, testItem, testItemCount)
return GetResourceState("ox_inventory") == "started" and exports.ox_inventory:CanSwapItem(self.source, firstItem, firstItemCount, testItem, testItemCount)
end
function self.clearMeta(index)
@@ -137,7 +138,7 @@ local function createPlayerFunctions(self)
end
function self.getInventory(minimal)
local playerItems = exports.ox_inventory:GetInventoryItems(self.source)
local playerItems = GetResourceState("ox_inventory") == "started" and exports.ox_inventory:GetInventoryItems(self.source) or {}
if not minimal then
return playerItems
end
@@ -145,7 +146,7 @@ local function createPlayerFunctions(self)
end
function self.getInventoryItem(item)
local playerItems = exports.ox_inventory:GetInventoryItems(self.source)
local playerItems = GetResourceState("ox_inventory") == "started" and exports.ox_inventory:GetInventoryItems(self.source) or {}
for name, data in pairs(playerItems) do
if name == item then
return data
@@ -162,11 +163,11 @@ local function createPlayerFunctions(self)
end
function self.hasItem(item, metadata)
return exports.ox_inventory:GetItem(self.source, item, metadata)
return GetResourceState("ox_inventory") == "started" and exports.ox_inventory:GetItem(self.source, item, metadata)
end
function self.removeInventoryItem(item, count)
exports.ox_inventory:RemoveItem(self.source, item, count)
return GetResourceState("ox_inventory") == "started" and exports.ox_inventory:RemoveItem(self.source, item, count)
end
function self.removeMoney(amount)
@@ -304,7 +305,8 @@ end
function NDCore.GetItemLabel(item)
if not itemNames then
itemNames = {}
for item, data in pairs(exports.ox_inventory:Items()) do
local items = GetResourceState("ox_inventory") == "started" and exports.ox_inventory:Items() or {}
for item, data in pairs(items) do
itemNames[item] = data.label
end
end

View File

@@ -2,7 +2,7 @@
author "Andyyy#7666"
description "ND Framework Core"
version "2.0.1"
version "2.0.2"
fx_version "cerulean"
game "gta5"

View File

@@ -194,27 +194,50 @@ end)
lib.addCommand("pay", {
help = "give money to nearby player.",
params = {
{
name = "target",
type = "playerId",
help = "Target player's server id"
},
{
name = "amount",
type = "number"
type = "number",
help = "Amount of cash to give"
}
}
}, function(source, args, raw)
if not source then return end
local targetPlayer
local pedCoords = GetEntityCoords(GetPlayerPed(source))
for targetId, targetInfo in pairs(NDCore.players) do
local targetCoords = GetEntityCoords(GetPlayerPed(targetId))
if #(pedCoords-targetCoords) < 2.0 and targetId ~= source then
targetPlayer = targetInfo
break
end
end
local player = NDCore.getPlayer(source)
if not player then return end
local success = player.deductMoney("cash", args.amount)
local targetPlayer = NDCore.getPlayer(args.target)
if not player or not targetPlayer then
return player.notify({
title = "Error",
description = "No player found",
type = "error"
})
end
if player.cash < args.amount then
return player.notify({
title = "Error",
description = "You don't have enough cash",
type = "error"
})
end
local playerCoords = GetEntityCoords(GetPlayerPed(player.source))
local targetCoords = GetEntityCoords(GetPlayerPed(targetPlayer.source))
if #(playerCoords-targetCoords) > 2.0 then
return player.notify({
title = "Error",
description = "Player is not nearby",
type = "error"
})
end
local success = player.deductMoney("cash", args.amount) and targetPlayer.addMoney("cash", args.amount)
if not success then
return player.notify({
title = "Couldn't give money",
@@ -223,19 +246,18 @@ lib.addCommand("pay", {
})
end
if not targetPlayer or not targetPlayer.addMoney("cash", args.amount) then return end
targetPlayer.notify({
title = "Money received",
description = ("Received $%d in cash"):format(args.amount),
type = "inform",
duration = 10000
duration = 5000
})
player.notify({
title = "Money given",
description = ("You gave someone $%d in cash"):format(args.amount),
description = ("You gave $%d in cash"):format(args.amount),
type = "inform",
duration = 10000
duration = 5000
})
end)

View File

@@ -34,6 +34,13 @@ function NDCore.getPlayerServerInfo(source)
return PlayersInfo[source]
end
function NDCore.getConfig(info)
if not info then
return Config
end
return Config[info]
end
---@param fileLocation string|tabale
---@return boolean
function NDCore.loadSQL(fileLocation, resource)

View File

@@ -309,20 +309,28 @@ local function createCharacterTable(info)
---@return boolean
function self.addGroup(name, rank, isJob)
local groupRank = tonumber(rank) or 1
local groupInfo = Config.groups[name]
local groupInfo = Config.groups?[name]
local bossRank = groupInfo and groupInfo.minimumBossRank
-- if not groupInfo then return end
if isJob then
for _, group in pairs(self.groups) do
group.isJob = nil
end
end
self.groups[name] = {
name = name,
label = groupInfo and groupInfo.label or name,
rankName = groupInfo and groupInfo.ranks[groupRank] or groupRank,
rank = groupRank,
isJob = isJob
isJob = isJob,
isBoss = bossRank and groupRank >= bossRank
}
if not isJob then
self.triggerEvent("ND:updateCharacter", removeCharacterFunctions(self))
end
lib.addPrincipal(self.source, ("group.%s"):format(name))
return self.groups[name]
end
@@ -337,6 +345,12 @@ local function createCharacterTable(info)
function self.removeGroup(name)
local group = self.groups[name]
if not group then return end
if self.job == name then
self.job = nil
self.jobInfo = nil
end
self.groups[name] = nil
self.triggerEvent("ND:updateCharacter", removeCharacterFunctions(self))
lib.removePrincipal(self.source, ("group.%s"):format(name))
@@ -349,11 +363,11 @@ local function createCharacterTable(info)
function self.setJob(name, rank)
self.removeGroup(self.job)
local job = self.addGroup(name, rank, true)
local jobName, jobInfo = self.getJob()
if jobInfo then
self.job = jobName
self.jobInfo = jobInfo
if job then
self.job = job.name
self.jobInfo = job
end
self.triggerEvent("ND:updateCharacter", removeCharacterFunctions(self))
return job
end

View File

@@ -576,7 +576,15 @@ AddEventHandler("entityCreated", function(entity)
local state = Entity(entity).state
if state.owner or state.locked ~= nil then return end
time = os.time()
local driver = GetPedInVehicleSeat(entity, -1)
while DoesEntityExist(entity) and driver == 0 and os.time()-time < 2 do
driver = GetPedInVehicleSeat(entity, -1)
Wait(100)
end
if not DoesEntityExist(entity) then return end
if DoesEntityExist(driver) and IsPedAPlayer(driver) then
state.locked = false
state.hotwired = true