monitor/resource/menu/client/cl_trollactions.lua
2025-04-16 22:30:27 +07:00

167 lines
5.2 KiB
Lua

-- Prevent running if menu is disabled
if not TX_MENU_ENABLED then return end
-- =============================================
-- Troll action logic from the player modal is located here (callbacks, events)
-- =============================================
local EFFECT_TIME_MS = GetConvarInt('txAdmin-menuDrunkDuration', 30)*1000
local DRUNK_ANIM_SET = "move_m@drunk@verydrunk"
local DRUNK_DRIVING_EFFECTS = {
1, -- brake
7, --turn left + accelerate
8, -- turn right + accelerate
23, -- accelerate
4, -- turn left 90 + braking
5, -- turn right 90 + braking
}
local function getRandomDrunkCarTask()
math.randomseed(GetGameTimer())
return DRUNK_DRIVING_EFFECTS[math.random(#DRUNK_DRIVING_EFFECTS)]
end
-- NOTE: We might want to check if a player already has an effect
local function drunkThreadFivem()
local playerPed = PlayerPedId()
local isDrunk = true
debugPrint('Starting drunk effect')
RequestAnimSet(DRUNK_ANIM_SET)
while not HasAnimSetLoaded(DRUNK_ANIM_SET) do
Wait(5)
end
SetPedMovementClipset(playerPed, DRUNK_ANIM_SET)
ShakeGameplayCam("DRUNK_SHAKE", 3.0)
SetPedIsDrunk(playerPed, true)
SetTransitionTimecycleModifier("spectator5", 10.00)
CreateThread(function()
while isDrunk do
local vehPedIsIn = GetVehiclePedIsIn(playerPed)
local isPedInVehicleAndDriving = (vehPedIsIn ~= 0) and (GetPedInVehicleSeat(vehPedIsIn, -1) == playerPed)
if isPedInVehicleAndDriving then
local randomTask = getRandomDrunkCarTask()
debugPrint('Dispatching random car tasks: ' .. randomTask)
TaskVehicleTempAction(playerPed, vehPedIsIn, randomTask, 500)
end
Wait(5000)
end
end)
Wait(EFFECT_TIME_MS)
debugPrint('Cleaning up drunk effect')
isDrunk = false
SetTransitionTimecycleModifier("default", 10.00)
StopGameplayCamShaking(true)
ResetPedMovementClipset(playerPed)
RemoveAnimSet(DRUNK_ANIM_SET)
end
local REDM_DRUNK_FX = 'PlayerDrunkAberdeen'
local function drunkThreadRedm()
debugPrint('Starting drunk effect')
AnimpostfxPlay(REDM_DRUNK_FX)
Citizen.InvokeNative(0x406CCF555B04FAD3, PlayerPedId(), 1, 1.0) --SetPedDrunkness
Wait(EFFECT_TIME_MS)
debugPrint('Cleaning up drunk effect')
AnimpostfxStop(REDM_DRUNK_FX)
Citizen.InvokeNative(0x406CCF555B04FAD3, PlayerPedId(), 1, 0.0) --SetPedDrunkness
end
--[[ Wild Attack command ]]
local attackAnimals
if IS_FIVEM then
attackAnimals = {
GetHashKey("a_c_chimp"),
GetHashKey("a_c_rottweiler"),
GetHashKey("a_c_coyote")
}
else
attackAnimals = {
GetHashKey("a_c_wolf_small"),
GetHashKey("a_c_bearblack_01"),
GetHashKey("a_c_dogrufus_01")
}
end
local animalGroupHash = GetHashKey("Animal")
local playerGroupHash = GetHashKey("PLAYER")
local function startWildAttack()
-- Consts
local playerPed = PlayerPedId()
local animalHash = attackAnimals[math.random(#attackAnimals)]
local coordsBehindPlayer = GetOffsetFromEntityInWorldCoords(playerPed, 100, -15.0, 0)
local playerHeading = GetEntityHeading(playerPed)
local belowGround, groundZ, vec3OnFloor = GetGroundZAndNormalFor_3dCoord(coordsBehindPlayer.x, coordsBehindPlayer.y, coordsBehindPlayer.z)
-- Requesting model
RequestModel(animalHash)
while not HasModelLoaded(animalHash) do
Wait(15)
end
-- Creating Animal
local animalPed
if IS_FIVEM then
animalPed = CreatePed(1, animalHash, coordsBehindPlayer.x, coordsBehindPlayer.y, groundZ, playerHeading, true, false)
else
animalPed = CreatePed(animalHash, coordsBehindPlayer.x, coordsBehindPlayer.y, groundZ, playerHeading, true, false)
Citizen.InvokeNative(0x77FF8D35EEC6BBC4, animalPed, 1, 0) --EquipMetaPedOutfitPreset
end
-- setting player as enemy
SetPedFleeAttributes(animalPed, 0, 0)
SetPedRelationshipGroupHash(animalPed, animalGroupHash)
TaskSetBlockingOfNonTemporaryEvents(animalPed, true)
TaskCombatHatedTargetsAroundPed(animalPed, 30.0, 0)
ClearPedTasks(animalPed)
TaskPutPedDirectlyIntoMelee(animalPed, playerPed, 0.0, -1.0, 0.0, 0)
SetRelationshipBetweenGroups(5, animalGroupHash, playerGroupHash)
SetRelationshipBetweenGroups(5, playerGroupHash, animalGroupHash)
SetModelAsNoLongerNeeded(animalHash)
end
-- RegisterCommand('atk', startWildAttack)
--[[ Net Events ]]
RegisterNetEvent('txcl:setDrunk', function()
if IS_FIVEM then
drunkThreadFivem()
else
drunkThreadRedm()
end
end)
RegisterNetEvent('txcl:setOnFire', function()
debugPrint('Setting player on fire')
local playerPed = PlayerPedId()
StartEntityFire(playerPed)
end)
RegisterNetEvent('txcl:wildAttack', function()
startWildAttack()
end)
--[[ NUI Callbacks ]]
RegisterSecureNuiCallback('drunkEffectPlayer', function(data, cb)
TriggerServerEvent('txsv:req:troll:setDrunk', tonumber(data.id))
cb({})
end)
RegisterSecureNuiCallback('setOnFire', function(data, cb)
TriggerServerEvent('txsv:req:troll:setOnFire', tonumber(data.id))
cb({})
end)
RegisterSecureNuiCallback('wildAttack', function(data, cb)
TriggerServerEvent('txsv:req:troll:wildAttack', tonumber(data.id))
cb({})
end)