95 lines
3.3 KiB
Lua
95 lines
3.3 KiB
Lua
|
|
local config = require 'config.client'
|
||
|
|
local sharedConfig = require 'config.shared'
|
||
|
|
local WEAPONS = exports.qbx_core:GetWeapons()
|
||
|
|
|
||
|
|
---blocks until ped is no longer moving
|
||
|
|
function WaitForPlayerToStopMoving()
|
||
|
|
local timeOut = 10000
|
||
|
|
while GetEntitySpeed(cache.ped) > 0.1 and IsPedRagdoll(cache.ped) and timeOut > 1 do
|
||
|
|
timeOut -= 10 Wait(10)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
--- low level GTA resurrection
|
||
|
|
function ResurrectPlayer()
|
||
|
|
local pos = GetEntityCoords(cache.ped)
|
||
|
|
local heading = GetEntityHeading(cache.ped)
|
||
|
|
|
||
|
|
NetworkResurrectLocalPlayer(pos.x, pos.y, pos.z + 0.5, heading, true, false)
|
||
|
|
if cache.vehicle then
|
||
|
|
SetPedIntoVehicle(cache.ped, cache.vehicle, cache.seat)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
---remove last stand mode from player.
|
||
|
|
function EndLastStand()
|
||
|
|
TaskPlayAnim(cache.ped, LastStandDict, 'exit', 1.0, 8.0, -1, 1, -1, false, false, false)
|
||
|
|
LaststandTime = 0
|
||
|
|
TriggerServerEvent('qbx_medical:server:onPlayerLaststandEnd')
|
||
|
|
end
|
||
|
|
|
||
|
|
local function logPlayerKiller()
|
||
|
|
local killer_2, killerWeapon = NetworkGetEntityKillerOfPlayer(cache.playerId)
|
||
|
|
local killer = GetPedSourceOfDeath(cache.ped)
|
||
|
|
|
||
|
|
if killer_2 ~= 0 and killer_2 ~= -1 then
|
||
|
|
killer = killer_2
|
||
|
|
end
|
||
|
|
|
||
|
|
local killerId = NetworkGetPlayerIndexFromPed(killer)
|
||
|
|
local killerName = killerId ~= -1 and (' %s (%d)'):format(GetPlayerName(killerId), GetPlayerServerId(killerId)) or locale('info.self_death')
|
||
|
|
local weaponItem = WEAPONS[killerWeapon]
|
||
|
|
local weaponLabel = locale('info.wep_unknown') or (weaponItem and weaponItem.label)
|
||
|
|
local weaponName = locale('info.wep_unknown') or (weaponItem and weaponItem.name)
|
||
|
|
local message = locale('logs.death_log_message', killerName, GetPlayerName(cache.playerId), weaponLabel, weaponName)
|
||
|
|
|
||
|
|
lib.callback.await('qbx_medical:server:log', false, 'playerKiller', message)
|
||
|
|
end
|
||
|
|
|
||
|
|
---count down last stand, if last stand is over, put player in death mode and log the killer.
|
||
|
|
local function countdownLastStand()
|
||
|
|
if LaststandTime - 1 > 0 then
|
||
|
|
LaststandTime -= 1
|
||
|
|
else
|
||
|
|
exports.qbx_core:Notify(locale('error.bled_out'), 'error')
|
||
|
|
EndLastStand()
|
||
|
|
logPlayerKiller()
|
||
|
|
DeathTime = config.deathTime
|
||
|
|
OnDeath()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local startLastStandLock = false
|
||
|
|
|
||
|
|
---put player in last stand mode and notify EMS.
|
||
|
|
function StartLastStand(attacker, weapon)
|
||
|
|
if startLastStandLock then return end
|
||
|
|
startLastStandLock = true
|
||
|
|
TriggerEvent('ox_inventory:disarm', cache.playerId, true)
|
||
|
|
WaitForPlayerToStopMoving()
|
||
|
|
TriggerServerEvent('InteractSound_SV:PlayOnSource', 'demo', 0.1)
|
||
|
|
LaststandTime = config.laststandReviveInterval
|
||
|
|
ResurrectPlayer()
|
||
|
|
SetEntityHealth(cache.ped, 150)
|
||
|
|
SetDeathState(sharedConfig.deathState.LAST_STAND)
|
||
|
|
TriggerEvent('qbx_medical:client:onPlayerLaststand', attacker, weapon)
|
||
|
|
TriggerServerEvent('qbx_medical:server:onPlayerLaststand', attacker, weapon)
|
||
|
|
CreateThread(function()
|
||
|
|
while DeathState == sharedConfig.deathState.LAST_STAND do
|
||
|
|
countdownLastStand()
|
||
|
|
Wait(1000)
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
|
||
|
|
CreateThread(function()
|
||
|
|
while DeathState == sharedConfig.deathState.LAST_STAND do
|
||
|
|
DisableControls()
|
||
|
|
PlayLastStandAnimation()
|
||
|
|
Wait(0)
|
||
|
|
end
|
||
|
|
startLastStandLock = false
|
||
|
|
end)
|
||
|
|
end
|
||
|
|
|
||
|
|
exports('StartLastStand', StartLastStand)
|