--[[ -- Author: Tim Plate -- Project: Advanced Roleplay Environment -- Copyright (c) 2022 Tim Plate Solutions --]] QS = nil if ServerConfig.m_customInventory.enabled then if ServerConfig.m_customInventory.inventory_type == "qs-inventory" then TriggerEvent('qs-core:getSharedObject', function(library) QS = library end) end end RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_APPLY_TOURNIQUET, function(authToken, targetPlayer, bodyPart) if not ValidateAuthToken(source, authToken) then return false end if not ValidateDistanceCheck(source, targetPlayer) then return false end if not ValidateBodyPart(bodyPart) then return false end if not HasItem(source, 'tourniquet', 1) then return false end if ServerConfig.m_itemsNeeded and not ShouldIgnoreItems(source) then RemoveItem(source, 'tourniquet', 1) end TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_APPLY_TOURNIQUET, targetPlayer, bodyPart, AuthToken) end) RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_REMOVE_TOURNIQUET, function(authToken, targetPlayer, bodyPart) if not ValidateAuthToken(source, authToken) then return false end if not ValidateDistanceCheck(source, targetPlayer) then return false end if not ValidateBodyPart(bodyPart) then return false end if ServerConfig.m_itemsNeeded and not ShouldIgnoreItems(source) then AddItem(source, 'tourniquet', 1) end TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_REMOVE_TOURNIQUET, targetPlayer, bodyPart, AuthToken) end) RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_INJECT_MEDICATION, function(authToken, targetPlayer, bodyPart, medication) if not ValidateAuthToken(source, authToken) then return false end if not ValidateDistanceCheck(source, targetPlayer) then return false end if not ValidateBodyPart(bodyPart) then return false end if not MEDICATIONS[medication] then return end if not HasItem(source, medication, 1) then return false end if ServerConfig.m_itemsNeeded and not ShouldIgnoreItems(source) then RemoveItem(source, medication, 1) end TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_INJECT_MEDICATION, targetPlayer, bodyPart, medication, AuthToken) end) RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_APPLY_BANDAGE, function(authToken, targetPlayer, bodyPart, bandageType) if not ValidateAuthToken(source, authToken) then return false end if not ValidateDistanceCheck(source, targetPlayer) then return false end if not ValidateBodyPart(bodyPart) then return false end if not BANDAGES[bandageType] then return end if not HasItem(source, bandageType, 1) then return false end if ServerConfig.m_itemsNeeded then RemoveItem(source, bandageType, 1) end TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_APPLY_BANDAGE, targetPlayer, bodyPart, bandageType, AuthToken) end) RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_APPLY_SURGICAL_KIT, function(authToken, targetPlayer, bodyPart) if not ValidateAuthToken(source, authToken) then return false end if not ValidateDistanceCheck(source, targetPlayer) then return false end if not ValidateBodyPart(bodyPart) then return false end if not HasItem(source, 'surgical_kit', 1) then return false end if ServerConfig.m_itemsNeeded and not ShouldIgnoreItems(source) then RemoveItem(source, 'surgical_kit', 1) end TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_APPLY_SURGICAL_KIT, targetPlayer, bodyPart, AuthToken) end) RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_APPLY_INFUSION, function(authToken, targetPlayer, bodyPart, infusion, volume) if not ValidateAuthToken(source, authToken) then return false end if not ValidateDistanceCheck(source, targetPlayer) then return false end if not ValidateBodyPart(bodyPart) then return false end if not HasItem(source, infusion .. '_' .. volume, 1) then return false end if ServerConfig.m_itemsNeeded and not ShouldIgnoreItems(source) then RemoveItem(source, infusion .. '_' .. volume, 1) end TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_APPLY_INFUSION, targetPlayer, bodyPart, infusion, volume, AuthToken) end) RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_APPLY_CPR, function(authToken, targetPlayer, bodyPart) if not ValidateAuthToken(source, authToken) then return false end if not ValidateDistanceCheck(source, targetPlayer) then return false end if not ValidateBodyPart(bodyPart) then return false end TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_APPLY_CPR, targetPlayer, bodyPart, AuthToken) end) RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_APPLY_DEFIBRILLATOR, function(authToken, targetPlayer, bodyPart) if not ValidateAuthToken(source, authToken) then return false end if not ValidateDistanceCheck(source, targetPlayer) then return false end if not ValidateBodyPart(bodyPart) then return false end if not HasItem(source, "defibrillator", 1) then return false end TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_APPLY_DEFIBRILLATOR, targetPlayer, bodyPart, AuthToken) end) RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_APPLY_EMERGENCY_REVIVE_KIT, function(authToken, targetPlayer, bodyPart) if not ValidateAuthToken(source, authToken) then return false end if not ValidateDistanceCheck(source, targetPlayer) then return false end if not ValidateBodyPart(bodyPart) then return false end if not HasItem(source, "emergency_revive_kit", 1) then return false end if ServerConfig.m_itemsNeeded and not ShouldIgnoreItems(source) then RemoveItem(source, 'emergency_revive_kit', 1) end TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_APPLY_EMERGENCY_REVIVE_KIT, targetPlayer, bodyPart, AuthToken) end) RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_PUT_IN_VEHICLE, function(authToken, targetPlayer) if not ValidateAuthToken(source, authToken) then return false end if not ValidateDistanceCheck(source, targetPlayer) then return false end TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_PUT_IN_VEHICLE, targetPlayer, AuthToken) end) RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_PUT_IN_BODYBAG, function(authToken, targetPlayer) if not ValidateAuthToken(source, authToken) then return false end if not ValidateDistanceCheck(source, targetPlayer) then return false end if not HasItem(source, 'bodybag', 1) then return false end if ServerConfig.m_itemsNeeded and not ShouldIgnoreItems(source) then RemoveItem(source, 'bodybag', 1) end TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_PUT_IN_BODYBAG, targetPlayer, AuthToken) end) RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_START_ECG, function(authToken, targetPlayer) if not ValidateAuthToken(source, authToken) then return false end if not ValidateDistanceCheck(source, targetPlayer) then return false end if not HasItem(source, 'ecg_monitor', 1) then return false end TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_START_ECG, targetPlayer, AuthToken) end) RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_STOP_ECG, function(authToken, targetPlayer) if not ValidateAuthToken(source, authToken) then return false end if not ValidateDistanceCheck(source, targetPlayer) then return false end TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_STOP_ECG, targetPlayer, AuthToken) end) RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_PULL_OUT_VEHICLE, function(authToken, targetPlayer) if not ValidateAuthToken(source, authToken) then return false end if not ValidateDistanceCheck(source, targetPlayer) then return false end TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_PULL_OUT_VEHICLE, targetPlayer, AuthToken) end) -- TODO: Try only getting .logs and setting it instead of whole health buffer RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_SAVE_LOG, function(authToken, targetPlayer, logMessage) if not ValidateAuthToken(source, authToken) then return false end local healthBuffer = Player(targetPlayer).state.healthBuffer if not healthBuffer or healthBuffer == nil then return end if not healthBuffer.logs then healthBuffer.logs = {} end table.insert(healthBuffer.logs, { message = logMessage, timestamp = os.time() }) Player(targetPlayer).state:set('healthBuffer', healthBuffer, true) TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_SAVE_LOG, targetPlayer, healthBuffer.logs, AuthToken) end) RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_LOAD_PLAYER, function(authToken) if not ServerConfig.m_stateSaving.enabled then return end if not ValidateSource(source) then return end if not ValidateAuthToken(source, authToken) then return end LoadPlayer(source) end) RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_LOAD_PLAYER_STANDALONE, function(authToken) if not ServerConfig.m_stateSaving.enabled then return end if not ValidateSource(source) then return end if not ValidateAuthToken(source, authToken) then return end if FRAMEWORK ~= ENUM_DEFINED_FRAMEWORKS.STANDALONE then return end LoadPlayer(source) end) RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_START_CARRY, function(authToken, targetPlayer) if not ValidateAuthToken(source, authToken) then return false end if not ValidateDistanceCheck(source, targetPlayer) then return false end local localAnimationData = { lib = "missfinale_c2mcs_1", name = "fin_c2_mcs_1_camman", length = -1, flag = 49 } local targetAnimationData = { lib = "nm", name = "firemans_carry", length = -1, xDistance = 0.15, yDistance = 0.27, zDistance = 0.63, zRotation = 0.0, flag = 33 } TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_SYNC_LOCAL, source, AuthToken, localAnimationData) TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_SYNC_TARGET, targetPlayer, AuthToken, source, targetAnimationData) end) RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_STOP_CARRY, function(authToken, targetPlayer) if not ValidateAuthToken(source, authToken) then return false end TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_STOP_CARRY, source, AuthToken) TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_STOP_CARRY, targetPlayer, AuthToken) end) local lastLogCooldown = {} RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_LOG_PLAYER_KILL, function(authToken, targetPlayer) if not ValidateAuthToken(source, authToken) then return end if lastLogCooldown[source] or 0 > os.time() then return end lastLogCooldown[source] = os.time() + 5 local playerHealthBuffer = Player(source).state.healthBuffer if targetPlayer == 0 then SendDiscordLog(TranslateText("NUI_PLAYER_KILLED_SELF", GetPlayerName(source), source), ServerConfig.m_discordLogging.healthBuffer and json.encode(playerHealthBuffer) or "") return end local targetName = GetPlayerName(targetPlayer) SendDiscordLog(TranslateText("NUI_PLAYER_KILLED_PLAYER", targetName, targetPlayer, GetPlayerName(source), source), ServerConfig.m_discordLogging.healthBuffer and json.encode(playerHealthBuffer) or "") end) RegisterServerCallback { eventName = ENUM_EVENT_TYPES.PROCEDURE_UPDATE_TRIAGE, eventCallback = function(source, authToken, targetPlayer, triageSelection) if not ValidateAuthToken(source, authToken) then return false end if not ValidateDistanceCheck(source, targetPlayer) then return false end if not IsAllowedToUseTriageSystem(source) then return false end TriggerClientEvent(ENUM_EVENT_TYPES.PROCEDURE_UPDATE_TRIAGE, targetPlayer, AuthToken, triageSelection) return true end } RegisterNetEvent(ENUM_EVENT_TYPES.EVENT_RESPAWN_PLAYER, function(coords, authToken) if not ValidateAuthToken(source, authToken) then return false end if FRAMEWORK == ENUM_DEFINED_FRAMEWORKS.ES_EXTENDED then local xPlayer = FRAMEWORK_DATA.GetPlayerFromId(source) if not xPlayer then return false end local respawnConfiguration = ServerConfig.m_respawnConfiguration if ServerConfig.m_customInventory.enabled then if ServerConfig.m_customInventory.inventory_type == "ox_inventory" then if respawnConfiguration.m_removeItemsOnDeath then exports.ox_inventory:ClearInventory(source) end elseif ServerConfig.m_customInventory.inventory_type == "qs-inventory" then if respawnConfiguration.m_removeItemsOnDeath then local saveItems = { 'id_card', -- Add here the items that you do NOT want to be deleted 'phone', } exports['qs-inventory']:ClearInventory(source, saveItems) end if respawnConfiguration.m_removeWeaponsOnDeath then local weapons = exports['qs-inventory']:GetWeaponList() for _,v in pairs(weapons) do xPlayer.removeInventoryItem(v.name, 1) end end elseif ServerConfig.m_customInventory.inventory_type == "mf-inventory" then if respawnConfiguration.m_removeItemsOnDeath then exports["mf-inventory"]:clearInventory(xPlayer.identifier) end if respawnConfiguration.m_removeWeaponsOnDeath then for _, v in ipairs(xPlayer.loadout) do xPlayer.removeWeapon(v.name,v.ammo,true) end exports["mf-inventory"]:clearLoadout(xPlayer.identifier) end elseif ServerConfig.m_customInventory.inventory_type == "core_inventory" then if respawnConfiguration.m_removeItemsOnDeath then exports["core_inventory"]:clearInventory('content-' .. xPlayer.identifier:gsub(":", "")) end end else if respawnConfiguration.m_removeItemsOnDeath then for i = 1, #xPlayer.inventory, 1 do if xPlayer.inventory[i] and xPlayer.inventory[i].count > 0 then xPlayer.setInventoryItem(xPlayer.inventory[i].name, 0) end end end local playerLoadout = {} if respawnConfiguration.m_removeWeaponsOnDeath then for i = 1, #xPlayer.loadout, 1 do if xPlayer.loadout[i] then xPlayer.removeWeapon(xPlayer.loadout[i].name) end end else for i = 1, #xPlayer.loadout, 1 do table.insert(playerLoadout, xPlayer.loadout[i]) end Citizen.CreateThread(function() Citizen.Wait(5000) for i = 1, #playerLoadout, 1 do if playerLoadout[i] and playerLoadout[i].label ~= nil then xPlayer.addWeapon(playerLoadout[i].name, playerLoadout[i].ammo) end end end) end end if respawnConfiguration.m_removeMoneyOnDeath then if xPlayer.getMoney() > 0 then xPlayer.removeMoney(xPlayer.getMoney()) end if xPlayer.getAccount('black_money') and xPlayer.getAccount('black_money').money > 0 then xPlayer.setAccountMoney('black_money', 0) end end TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_RESPAWN_PLAYER, source, AuthToken) elseif FRAMEWORK == ENUM_DEFINED_FRAMEWORKS.QB_CORE then local frameworkPlayer = FRAMEWORK_DATA.Functions.GetPlayer(source) local respawnConfiguration = ServerConfig.m_respawnConfiguration if respawnConfiguration.m_removeItemsOnDeath then frameworkPlayer.Functions.ClearInventory() end end TriggerClientEvent(ENUM_EVENT_TYPES.EVENT_RESPAWN_PLAYER, source, AuthToken) end) RegisterServerCallback { eventName = ENUM_EVENT_TYPES.PROCEDURE_GET_UNCONSCIOUS_TIME, eventCallback = function(source, authToken) if not ValidateAuthToken(source, authToken) then return false end if not ServerConfig.m_dependUnconsciousTimeOnMedicCount.enabled then return ClientConfig.m_respawnConfiguration.m_respawnTime end if not ServerConfig.m_dependUnconsciousTimeOnMedicCount.overwrites then return ClientConfig.m_respawnConfiguration .m_respawnTime end local medicCount = GetMedicsOnDutyCount() local newTime = ServerConfig.m_dependUnconsciousTimeOnMedicCount.overwrites[1] for k, v in pairs(ServerConfig.m_dependUnconsciousTimeOnMedicCount.overwrites) do if medicCount >= k then newTime = v end end return newTime end } AddEventHandler('playerDropped', function(reason) SavePlayer(source) end) if ServerConfig.m_reviveCommand then RegisterCommand('revive', function(source, args, rawCommand) local isAllowedToUse = IsAllowedToUseReviveCommand(source) if not isAllowedToUse then return false end local targetPlayer = source if args[1] then targetPlayer = tonumber(args[1]) end TriggerClientEvent("visn_are:resetHealthBuffer", targetPlayer) end, false) end