diff --git a/[gameplay]/deathpickups/deathpickups.lua b/[gameplay]/deathpickups/deathpickups.lua index 0346f0e60..95e04ba12 100644 --- a/[gameplay]/deathpickups/deathpickups.lua +++ b/[gameplay]/deathpickups/deathpickups.lua @@ -1,60 +1,103 @@ -local timers = {} -- timers for existing pickups - -local function onDeathPickupHit ( player, matchingDimension ) - if matchingDimension then - killTimer ( timers[source] ) - timers[source] = nil - removeEventHandler ( "onPickupHit", source, onDeathPickupHit ) - local weapid = getPickupWeapon ( source ) - local weapammo = getPickupAmmo ( source ) - destroyElement ( source ) - giveWeapon ( player, weapid, weapammo, false ) +local pickupTimers = {} +local expireTime = get("timeout") +local onlyCurrentWeapon = get("only_current") +local dropRadius = get("radius") + +local function destroyDeathPickup(pickupElement) + if isElement(pickupElement) then + destroyElement(pickupElement) + end +end + +local function dropAllWeapons(posX, posY, posZ, droppedWeapons) + local weaponsCount = #droppedWeapons + + for wID = 1, weaponsCount do + local weaponData = droppedWeapons[wID] + local weaponID = weaponData[1] + local weaponAmmo = weaponData[2] + local pickupX = posX + dropRadius * math.cos((wID - 1) * 2 * math.pi/weaponsCount) + local pickupY = posY + dropRadius * math.sin((wID - 1) * 2 * math.pi/weaponsCount) + local pickupElement = createPickup(pickupX, pickupY, posZ, 2, weaponID, expireTime, weaponAmmo) + + pickupTimers[pickupElement] = setTimer(destroyDeathPickup, expireTime, 1, pickupElement) end end -local function destroyDeathPickup ( pickup ) - timers[pickup] = nil - removeEventHandler ( "onPickupHit", pickup, onDeathPickupHit ) - destroyElement ( pickup ) +function onDeathPickupHit(playerElement) + cancelEvent() + giveWeapon(playerElement, getPickupWeapon(source), getPickupAmmo(source), false) + destroyDeathPickup(source) end +addEventHandler("onPickupHit", resourceRoot, onDeathPickupHit) + +function onPlayerWasted() + local posX, posY, posZ = getElementPosition(source) + + if onlyCurrentWeapon then + local playerWeapon = getPedWeapon(source) + local validWeapon = playerWeapon and playerWeapon ~= 0 -addEventHandler ( "onPlayerWasted", getRootElement (), - function ( source_ammo, killer, killer_weapon, bodypart ) - local pX, pY, pZ = getElementPosition ( source ) - local timeout = get("timeout") - - if get("only_current") then - local source_weapon = getPedWeapon ( source ) - if ( source_weapon and source_weapon ~= 0 and source_ammo ) then - local pickup = createPickup ( pX, pY, pZ, 2, source_weapon, timeout, source_ammo ) - addEventHandler ( "onPickupHit", pickup, onDeathPickupHit ) - timers[pickup] = setTimer ( destroyDeathPickup, timeout, 1, pickup ) + if validWeapon then + local totalAmmo = getPedTotalAmmo(source) + local pickupElement = createPickup(posX, posY, posZ, 2, playerWeapon, expireTime, totalAmmo) + + pickupTimers[pickupElement] = setTimer(destroyDeathPickup, expireTime, 1, pickupElement) + end + else + local droppedWeapons = {} + + for weaponSlot = 0, 12 do + local playerWeapon = getPedWeapon(source, weaponSlot) + local validWeapon = playerWeapon ~= 0 + + if validWeapon then + local ammoInSlot = getPedTotalAmmo(source, weaponSlot) + + droppedWeapons[#droppedWeapons + 1] = {playerWeapon, ammoInSlot} end - else - local droppedWeapons = {} - for slot=0, 12 do - local ammo = getPedTotalAmmo(source, slot) - if (getPedWeapon(source, slot) ~= 0) then - local weapon = getPedWeapon(source, slot) - local ammo = getPedTotalAmmo(source, slot) - table.insert(droppedWeapons, {weapon, ammo}) - end + end + + dropAllWeapons(posX, posY, posZ, droppedWeapons) + end +end +addEventHandler("onPlayerWasted", root, onPlayerWasted) + +function onElementDestroyPickup() + local validElement = isElement(source) + + if validElement then + local pickupType = getElementType(source) == "pickup" + + if pickupType then + local pickupTimer = pickupTimers[source] + + if pickupTimer then + killTimer(pickupTimer) + pickupTimers[source] = nil end - DropAllWeapons(droppedWeapons) end end -) - -function DropAllWeapons ( droppedWeapons ) - local radius = get("radius") - local numberDropped = #droppedWeapons - for i, t in ipairs(droppedWeapons) do - local pX, pY, pZ = getElementPosition ( source ) - local x = pX + radius * math.cos((i-1) * 2 * math.pi / numberDropped) - local y = pY + radius * math.sin((i-1) * 2 * math.pi / numberDropped) - local timeout = get("timeout") - local pickup = createPickup(x, y, pZ, 2, t[1], timeout, t[2]) - addEventHandler ( "onPickupHit", pickup, onDeathPickupHit ) - timers[pickup] = setTimer ( destroyDeathPickup, timeout, 1, pickup ) +end +addEventHandler("onElementDestroy", resourceRoot, onElementDestroyPickup) + +function onSettingChange(settingName, _, newValue) + local expireSetting = settingName == "*deathpickups.timeout" + + if expireSetting then + expireTime = fromJSON(newValue) + end + + local weaponSetting = settingName == "*deathpickups.only_current" + + if weaponSetting then + onlyCurrentWeapon = fromJSON(newValue) + end + + local radiusSetting = settingName == "*deathpickups.radius" + + if radiusSetting then + dropRadius = fromJSON(newValue) end end +addEventHandler("onSettingChange", resourceRoot, onSettingChange) \ No newline at end of file diff --git a/[gameplay]/deathpickups/meta.xml b/[gameplay]/deathpickups/meta.xml index fd765c499..42297847e 100644 --- a/[gameplay]/deathpickups/meta.xml +++ b/[gameplay]/deathpickups/meta.xml @@ -1,9 +1,9 @@ - -