423 lines
13 KiB
Lua
423 lines
13 KiB
Lua
RegisterCommand("tw_coords_ground", function()
|
|
local ped = PlayerPedId()
|
|
local c = GetEntityCoords(ped)
|
|
local h = GetEntityHeading(ped)
|
|
|
|
local found, groundZ = GetGroundZFor_3dCoord(c.x, c.y, c.z + 200.0, 0)
|
|
local z = found and groundZ or c.z
|
|
|
|
local msg = ("Ground Coords: vector4(%.3f, %.3f, %.3f, %.1f)"):format(c.x, c.y, z, h)
|
|
print("^3[turfwar]^7 " .. msg)
|
|
|
|
BeginTextCommandThefeedPost("STRING")
|
|
AddTextComponentSubstringPlayerName(msg)
|
|
EndTextCommandThefeedPostTicker(false, false)
|
|
end, false)
|
|
RegisterCommand("tw_hudtest", function()
|
|
SendNUIMessage({ type="capture:start", turfName="HUD TEST", fill="rgba(255,0,0,0.9)", bg="rgba(255,255,255,0.14)" })
|
|
Wait(250)
|
|
SendNUIMessage({ type="capture:set", t=0.5 })
|
|
end)
|
|
|
|
RegisterCommand("tw_coords_turf", function()
|
|
local ped = PlayerPedId()
|
|
local c = GetEntityCoords(ped)
|
|
|
|
local found, groundZ = GetGroundZFor_3dCoord(c.x, c.y, c.z + 200.0, 0)
|
|
local z = found and groundZ or c.z
|
|
|
|
local msg = ("center = vector3(%.3f, %.3f, %.3f),"):format(c.x, c.y, z)
|
|
|
|
print("^3[turfwar]^7 " .. msg)
|
|
|
|
BeginTextCommandThefeedPost("STRING")
|
|
AddTextComponentSubstringPlayerName(msg)
|
|
EndTextCommandThefeedPostTicker(false, false)
|
|
end, false)
|
|
|
|
-- client/dev.lua (or bottom of client/main.lua)
|
|
|
|
RegisterCommand("tw_uniform_dump", function()
|
|
local ped = PlayerPedId()
|
|
if not ped or ped == 0 then return end
|
|
|
|
print("^3[turfwar]^7 ===== UNIFORM DUMP START =====")
|
|
|
|
-- Components 0..11
|
|
for compId = 0, 11 do
|
|
local drawable = GetPedDrawableVariation(ped, compId)
|
|
local texture = GetPedTextureVariation(ped, compId)
|
|
print(("[turfwar] component: { id=%d, drawable=%d, texture=%d }"):format(compId, drawable, texture))
|
|
end
|
|
|
|
-- Props commonly used: 0..2, 6..7
|
|
local propIds = {0,1,2,6,7}
|
|
for _, propId in ipairs(propIds) do
|
|
local drawable = GetPedPropIndex(ped, propId) -- -1 = none
|
|
local texture = GetPedPropTextureIndex(ped, propId)
|
|
print(("[turfwar] prop: { id=%d, drawable=%d, texture=%d }"):format(propId, drawable, texture))
|
|
end
|
|
|
|
print("^3[turfwar]^7 ===== UNIFORM DUMP END =====")
|
|
end, false)
|
|
RegisterCommand("tw_uniform_test", function(_, args)
|
|
local gangId = tonumber(args[1] or "0") or 0
|
|
print(("^3[turfwar]^7 Testing uniform gangId=%d"):format(gangId))
|
|
ApplyGangUniform(gangId)
|
|
ReapplyUniformForSeconds(gangId, 3)
|
|
end, false)
|
|
|
|
|
|
local twCycleRunning = false
|
|
|
|
RegisterCommand("tw_cycle", function(_, args)
|
|
local ped = PlayerPedId()
|
|
if not ped or ped == 0 then return end
|
|
|
|
-- Toggle OFF if already running
|
|
if twCycleRunning then
|
|
twCycleRunning = false
|
|
print("^2[turfwar]^7 Cycling stopped.")
|
|
return
|
|
end
|
|
|
|
if not args[1] then
|
|
print("^3[turfwar]^7 Usage:")
|
|
print("^3[turfwar]^7 /tw_cycle <propId>")
|
|
print("^3[turfwar]^7 /tw_cycle c <compId>")
|
|
return
|
|
end
|
|
|
|
local mode = "prop"
|
|
local id
|
|
|
|
if args[1] == "c" then
|
|
mode = "comp"
|
|
id = tonumber(args[2])
|
|
else
|
|
id = tonumber(args[1])
|
|
end
|
|
|
|
if id == nil then
|
|
print("^1[turfwar]^7 Invalid ID.")
|
|
return
|
|
end
|
|
|
|
twCycleRunning = true
|
|
print("^3[turfwar]^7 Cycling started. Run /tw_cycle again to stop.")
|
|
|
|
CreateThread(function()
|
|
if mode == "prop" then
|
|
local count = GetNumberOfPedPropDrawableVariations(ped, id)
|
|
print(("[turfwar] PROP id=%d count=%d"):format(id, count))
|
|
|
|
for d = 0, count - 1 do
|
|
if not twCycleRunning then break end
|
|
ClearPedProp(ped, id)
|
|
SetPedPropIndex(ped, id, d, 0, true)
|
|
print(("[turfwar] prop id=%d drawable=%d"):format(id, d))
|
|
Wait(700)
|
|
end
|
|
else
|
|
local count = GetNumberOfPedDrawableVariations(ped, id)
|
|
print(("[turfwar] COMPONENT id=%d count=%d"):format(id, count))
|
|
|
|
for d = 0, count - 1 do
|
|
if not twCycleRunning then break end
|
|
SetPedComponentVariation(ped, id, d, 0, 0)
|
|
print(("[turfwar] comp id=%d drawable=%d"):format(id, d))
|
|
Wait(700)
|
|
end
|
|
end
|
|
|
|
twCycleRunning = false
|
|
print("^2[turfwar]^7 Cycling finished.")
|
|
end)
|
|
end, false)
|
|
|
|
|
|
RegisterCommand("tw_showitem", function(_, args)
|
|
local ped = PlayerPedId()
|
|
if not ped or ped == 0 then return end
|
|
|
|
local mode = args[1] -- "c" or "p"
|
|
local id = tonumber(args[2])
|
|
local drawable = tonumber(args[3])
|
|
local texture = tonumber(args[4] or "0") or 0
|
|
|
|
if (mode ~= "c" and mode ~= "p" and mode ~= "comp" and mode ~= "prop") or id == nil or drawable == nil then
|
|
print("^3[turfwar]^7 Usage:")
|
|
print("^3[turfwar]^7 /tw_showitem c <compId> <drawable> [texture]")
|
|
print("^3[turfwar]^7 /tw_showitem p <propId> <drawable|-1> [texture]")
|
|
return
|
|
end
|
|
|
|
if mode == "comp" then mode = "c" end
|
|
if mode == "prop" then mode = "p" end
|
|
|
|
if mode == "c" then
|
|
local count = GetNumberOfPedDrawableVariations(ped, id)
|
|
if count <= 0 then
|
|
print("^1[turfwar]^7 This model has no drawables for that component id.")
|
|
return
|
|
end
|
|
if drawable < 0 or drawable >= count then
|
|
print(("^1[turfwar]^7 Invalid component drawable. Range 0..%d"):format(count - 1))
|
|
return
|
|
end
|
|
|
|
local texCount = GetNumberOfPedTextureVariations(ped, id, drawable)
|
|
if texCount > 0 and (texture < 0 or texture >= texCount) then
|
|
texture = 0
|
|
end
|
|
|
|
SetPedComponentVariation(ped, id, drawable, texture, 0)
|
|
print(("[turfwar] SET component id=%d drawable=%d texture=%d (textures=%d)"):format(id, drawable, texture, texCount))
|
|
return
|
|
end
|
|
|
|
-- mode == "p"
|
|
local count = GetNumberOfPedPropDrawableVariations(ped, id)
|
|
if drawable < 0 then
|
|
ClearPedProp(ped, id)
|
|
print(("[turfwar] CLEARED prop id=%d"):format(id))
|
|
return
|
|
end
|
|
|
|
if count <= 0 then
|
|
print("^1[turfwar]^7 This model has no drawables for that prop id.")
|
|
return
|
|
end
|
|
if drawable >= count then
|
|
print(("^1[turfwar]^7 Invalid prop drawable. Range 0..%d"):format(count - 1))
|
|
return
|
|
end
|
|
|
|
local texCount = GetNumberOfPedPropTextureVariations(ped, id, drawable)
|
|
if texCount > 0 and (texture < 0 or texture >= texCount) then
|
|
texture = 0
|
|
end
|
|
|
|
ClearPedProp(ped, id)
|
|
SetPedPropIndex(ped, id, drawable, texture, true)
|
|
print(("[turfwar] SET prop id=%d drawable=%d texture=%d (textures=%d)"):format(id, drawable, texture, texCount))
|
|
end, false)
|
|
|
|
RegisterCommand("tw_hairtest", function()
|
|
local ped = PlayerPedId()
|
|
if not ped or ped == 0 then return end
|
|
|
|
local model = GetEntityModel(ped)
|
|
local isFree = (model == joaat("mp_m_freemode_01") or model == joaat("mp_f_freemode_01"))
|
|
|
|
print(("[turfwar] hairtest model=%s freemode=%s"):format(tostring(model), isFree and "YES" or "NO"))
|
|
|
|
-- Make sure hair is visible (no helmet/hat)
|
|
ClearPedProp(ped, 0)
|
|
|
|
-- Force a visible haircut refresh
|
|
local hairDrawable = GetPedDrawableVariation(ped, 2)
|
|
local hairTexture = GetPedTextureVariation(ped, 2)
|
|
SetPedComponentVariation(ped, 2, hairDrawable, hairTexture, 0)
|
|
|
|
-- Set a VERY obvious color (bright red)
|
|
SetPedHairColor(ped, 8, 8)
|
|
|
|
-- Read back safely
|
|
local c1, c2 = GetPedHairColor(ped)
|
|
print(("[turfwar] hairtest after set -> primary=%s highlight=%s (hair drawable=%s tex=%s)")
|
|
:format(tostring(c1), tostring(c2), tostring(hairDrawable), tostring(hairTexture)))
|
|
end, false)
|
|
|
|
RegisterCommand("tw_haircycle", function()
|
|
local ped = PlayerPedId()
|
|
if not ped or ped == 0 then return end
|
|
|
|
ClearPedProp(ped, 0) -- remove hat
|
|
|
|
local count = GetNumberOfPedDrawableVariations(ped, 2)
|
|
print(("[turfwar] hair drawables available: %d"):format(count))
|
|
|
|
for d = 0, count - 1 do
|
|
SetPedComponentVariation(ped, 2, d, 0, 0)
|
|
SetPedHairColor(ped, 8, 8) -- bright red
|
|
print(("[turfwar] hair drawable=%d color=8"):format(d))
|
|
Wait(700)
|
|
end
|
|
end, false)
|
|
|
|
|
|
RegisterCommand("tw_model", function()
|
|
local ped = PlayerPedId()
|
|
local m = GetEntityModel(ped)
|
|
print(("[turfwar] current ped model hash=%s"):format(tostring(m)))
|
|
end, false)
|
|
|
|
|
|
print("^2[turfwar]^7 dev_clothing.lua loaded (clothing stepper)")
|
|
|
|
local function notify(msg)
|
|
BeginTextCommandThefeedPost("STRING")
|
|
AddTextComponentSubstringPlayerName(msg)
|
|
EndTextCommandThefeedPostTicker(false, false)
|
|
end
|
|
|
|
-- Step a CLOTHING COMPONENT by +/-1
|
|
-- Usage: /tw_comp <id> <next|prev>
|
|
RegisterCommand("tw_comp", function(_, args)
|
|
local compId = tonumber(args[1])
|
|
local dir = args[2]
|
|
|
|
if compId == nil or (dir ~= "next" and dir ~= "prev") then
|
|
notify("Usage: /tw_comp <componentId> <next|prev>")
|
|
return
|
|
end
|
|
|
|
local ped = PlayerPedId()
|
|
if ped == 0 then return end
|
|
|
|
local cur = GetPedDrawableVariation(ped, compId)
|
|
local max = GetNumberOfPedDrawableVariations(ped, compId)
|
|
|
|
if max <= 0 then
|
|
notify(("Component %d has no drawables"):format(compId))
|
|
return
|
|
end
|
|
|
|
local new = cur
|
|
if dir == "next" then
|
|
new = (cur + 1) % max
|
|
else
|
|
new = cur - 1
|
|
if new < 0 then new = max - 1 end
|
|
end
|
|
|
|
SetPedComponentVariation(ped, compId, new, 0, 0)
|
|
notify(("Component %d → drawable %d / %d"):format(compId, new, max - 1))
|
|
end, false)
|
|
|
|
-- Step a PROP by +/-1
|
|
-- Usage: /tw_prop <id> <next|prev>
|
|
RegisterCommand("tw_prop", function(_, args)
|
|
local propId = tonumber(args[1])
|
|
local dir = args[2]
|
|
|
|
if propId == nil or (dir ~= "next" and dir ~= "prev") then
|
|
notify("Usage: /tw_prop <propId> <next|prev>")
|
|
return
|
|
end
|
|
|
|
local ped = PlayerPedId()
|
|
if ped == 0 then return end
|
|
|
|
local cur = GetPedPropIndex(ped, propId)
|
|
local max = GetNumberOfPedPropDrawableVariations(ped, propId)
|
|
|
|
if max <= 0 then
|
|
notify(("Prop %d has no drawables"):format(propId))
|
|
return
|
|
end
|
|
|
|
local new = cur
|
|
if dir == "next" then
|
|
new = cur + 1
|
|
if new >= max then new = -1 end
|
|
else
|
|
new = cur - 1
|
|
if new < -1 then new = max - 1 end
|
|
end
|
|
|
|
ClearPedProp(ped, propId)
|
|
if new >= 0 then
|
|
SetPedPropIndex(ped, propId, new, 0, true)
|
|
end
|
|
|
|
notify(("Prop %d → drawable %d"):format(propId, new))
|
|
end, false)
|
|
|
|
-- Dump current outfit (components + props)
|
|
RegisterCommand("tw_dumpfit", function()
|
|
local ped = PlayerPedId()
|
|
if ped == 0 then return end
|
|
|
|
print("^3[turfwar]^7 ===== OUTFIT DUMP =====")
|
|
|
|
for i = 0, 11 do
|
|
local d = GetPedDrawableVariation(ped, i)
|
|
local t = GetPedTextureVariation(ped, i)
|
|
print(("component %d: drawable=%d texture=%d"):format(i, d, t))
|
|
end
|
|
|
|
for p = 0, 7 do
|
|
local d = GetPedPropIndex(ped, p)
|
|
local t = GetPedPropTextureIndex(ped, p)
|
|
print(("prop %d: drawable=%d texture=%d"):format(p, d, t))
|
|
end
|
|
|
|
print("^3[turfwar]^7 =======================")
|
|
end, false)
|
|
|
|
-- Step TEXTURE for a COMPONENT
|
|
RegisterCommand("tw_tex", function(_, args)
|
|
local mode = args[1] -- 'c' or 'p'
|
|
local id = tonumber(args[2])
|
|
local dir = args[3]
|
|
|
|
if (mode ~= "c" and mode ~= "p") or not id or (dir ~= "next" and dir ~= "prev") then
|
|
print("^3[turfwar]^7 Usage:")
|
|
print("^3[turfwar]^7 /tw_tex c <componentId> <next|prev>")
|
|
print("^3[turfwar]^7 /tw_tex p <propId> <next|prev>")
|
|
return
|
|
end
|
|
|
|
local ped = PlayerPedId()
|
|
if ped == 0 then return end
|
|
|
|
if mode == "c" then
|
|
local drawable = GetPedDrawableVariation(ped, id)
|
|
local curTex = GetPedTextureVariation(ped, id)
|
|
local maxTex = GetNumberOfPedTextureVariations(ped, id, drawable)
|
|
|
|
if maxTex <= 0 then
|
|
print(("^1[turfwar]^7 Component %d has no textures"):format(id))
|
|
return
|
|
end
|
|
|
|
local newTex = curTex
|
|
if dir == "next" then
|
|
newTex = (curTex + 1) % maxTex
|
|
else
|
|
newTex = curTex - 1
|
|
if newTex < 0 then newTex = maxTex - 1 end
|
|
end
|
|
|
|
SetPedComponentVariation(ped, id, drawable, newTex, 0)
|
|
print(("[turfwar] comp %d texture → %d / %d"):format(id, newTex, maxTex - 1))
|
|
|
|
else -- prop
|
|
local drawable = GetPedPropIndex(ped, id)
|
|
if drawable < 0 then
|
|
print(("^1[turfwar]^7 Prop %d not currently worn"):format(id))
|
|
return
|
|
end
|
|
|
|
local curTex = GetPedPropTextureIndex(ped, id)
|
|
local maxTex = GetNumberOfPedPropTextureVariations(ped, id, drawable)
|
|
|
|
if maxTex <= 0 then
|
|
print(("^1[turfwar]^7 Prop %d has no textures"):format(id))
|
|
return
|
|
end
|
|
|
|
local newTex = curTex
|
|
if dir == "next" then
|
|
newTex = (curTex + 1) % maxTex
|
|
else
|
|
newTex = curTex - 1
|
|
if newTex < 0 then newTex = maxTex - 1 end
|
|
end
|
|
|
|
SetPedPropIndex(ped, id, drawable, newTex, true)
|
|
print(("[turfwar] prop %d texture → %d / %d"):format(id, newTex, maxTex - 1))
|
|
end
|
|
end, false) |