Skip to content

Commit a3113a8

Browse files
committed
Player textdraws seem to work now, still glitchy however. Handle invalid models in SetPlayerAttachedObject and display a warning if a model is invalid.
1 parent 9ccf54e commit a3113a8

File tree

2 files changed

+66
-40
lines changed

2 files changed

+66
-40
lines changed

amx/client/client.lua

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -979,20 +979,19 @@ function renderTextDraws()
979979
w = textdraw.width
980980
end
981981
elseif textdraw.align == 2 then --centered
982+
x = textdraw.x
982983
if textdraw.boxsize then
983-
x = textdraw.boxsize[1]/2
984984
w = textdraw.boxsize[1]
985985
else
986-
x = textdraw.x
987986
w = textdraw.width
988987
end
989988
elseif textdraw.align == 3 then --right
989+
x = textdraw.x - w
990990
if textdraw.boxsize then
991991
w = textdraw.x - textdraw.boxsize[1]
992992
else
993993
w = textdraw.width
994994
end
995-
x = textdraw.x - w
996995
end
997996
y = textdraw.y
998997

@@ -1182,6 +1181,9 @@ function TextDrawCreate(amxName, id, textdraw)
11821181
local amx = g_AMXs[amxName]
11831182
textdraw.amx = amx
11841183
textdraw.id = id
1184+
textdraw.visible = false
1185+
--outputConsole('Got TextDrawCreate, textdraw.visible is ' .. textdraw.visible)
1186+
11851187
amx.textdraws[id] = textdraw
11861188
if textdraw.x then
11871189
textdraw.x = textdraw.x

amx/server/syscalls.lua

Lines changed: 61 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1551,24 +1551,32 @@ function PlayerTextDrawDestroy(amx, player, textdrawID)
15511551
if not IsPlayerTextDrawValid(player, textdrawID) then
15521552
return false
15531553
end
1554-
clientCall(player, 'TextDrawDestroy', amx.name, textdrawID)
1554+
clientCall(player, 'TextDrawDestroy', amx.name, g_PlayerTextDraws[player][textdrawID].clientTDId)
15551555
g_PlayerTextDraws[player][textdrawID] = nil
15561556
end
15571557
function PlayerTextDrawShow(amx, player, textdrawID)
15581558
if not IsPlayerTextDrawValid(player, textdrawID) then
15591559
outputDebugString('PlayerTextDrawShow: not showing anything, not valid')
15601560
return false
15611561
end
1562+
--if g_PlayerTextDraws[player][textdrawID].visible == 1 then
1563+
-- return false
1564+
--end
15621565
g_PlayerTextDraws[player][textdrawID].visible = true
1563-
clientCall(player, 'TextDrawShowForPlayer', amx.name, textdrawID)
1566+
clientCall(player, 'TextDrawShowForPlayer', amx.name, g_PlayerTextDraws[player][textdrawID].clientTDId)
1567+
--outputDebugString('PlayerTextDrawShow: proccessed for ' .. textdrawID .. ' with ' .. g_PlayerTextDraws[player][textdrawID].text)
15641568
return true
15651569
end
15661570
function PlayerTextDrawHide(amx, player, textdrawID)
15671571
if not IsPlayerTextDrawValid(player, textdrawID) then
15681572
return false
15691573
end
1574+
--if g_PlayerTextDraws[player][textdrawID].visible == 0 then
1575+
-- return false
1576+
--end
15701577
g_PlayerTextDraws[player][textdrawID].visible = false
1571-
clientCall(player, 'TextDrawHideForPlayer', amx.name, textdrawID)
1578+
clientCall(player, 'TextDrawHideForPlayer', amx.name, g_PlayerTextDraws[player][textdrawID].clientTDId)
1579+
--outputDebugString('PlayerTextDrawHide: proccessed for ' .. textdrawID .. ' with ' .. g_PlayerTextDraws[player][textdrawID].text)
15721580
end
15731581
function PlayerTextDrawBoxColor(amx, player, textdrawID, r, g, b, a)
15741582
if not IsPlayerTextDrawValid(player, textdrawID) then
@@ -1599,13 +1607,18 @@ function PlayerTextDrawLetterSize(amx, player, textdrawID, x, y)
15991607
return true
16001608
end
16011609
function IsPlayerTextDrawValid(player, textdrawID)
1610+
local tableType = type(g_PlayerTextDraws[player])
1611+
if tableType ~= "table" then
1612+
outputDebugString("[ERROR_NOT_A_TABLE] IsPlayerTextDrawValid: g_PlayerTextDraws[player] is not a table yet for textdrawID: " .. textdrawID .. " it's actually a " .. tableType)
1613+
return false
1614+
end
16021615
if not g_PlayerTextDraws[player] then
1603-
outputDebugString("[ERROR] IsPlayerTextDrawValid: g_PlayerTextDraws[player] is nil! for textdrawID: " .. textdrawID)
1616+
outputDebugString("[ERROR_NIL_TABLE] IsPlayerTextDrawValid: g_PlayerTextDraws[player] is nil! for textdrawID: " .. textdrawID)
16041617
return false
16051618
end
16061619
local textdraw = g_PlayerTextDraws[player][textdrawID]
16071620
if not textdraw then
1608-
outputDebugString("[ERROR] IsPlayerTextDrawValid: no textdraw properties for player with textdrawID: " .. textdrawID)
1621+
outputDebugString("[ERROR_NOTD_PROPERTIES] IsPlayerTextDrawValid: no textdraw properties for player with textdrawID: " .. textdrawID)
16091622
return false
16101623
end
16111624
return true
@@ -1618,10 +1631,16 @@ function CreatePlayerTextDraw(amx, player, x, y, text)
16181631
g_PlayerTextDraws[player] = {}
16191632
end
16201633

1621-
local textdraw = { x = x, y = y, shadow = {visible=0, align=1, text=text, font=1, lwidth=0.5, lheight = 0.5} }
1622-
local id = #amx.textdraws + table.insert(g_PlayerTextDraws[player], textdraw)
1634+
local serverTDId = #g_PlayerTextDraws[player]+1
1635+
local clientTDId = #amx.textdraws + serverTDId
1636+
1637+
local textdraw = { x = x, y = y, lwidth=0.5, lheight = 0.5, shadow = { visible=0, align=1, text=text, font=1, lwidth=0.5, lheight = 0.5} }
1638+
textdraw.clientTDId = clientTDId
1639+
textdraw.serverTDId = serverTDId
1640+
textdraw.visible = 0
1641+
1642+
g_PlayerTextDraws[player][serverTDId] = textdraw
16231643

1624-
textdraw.id = id
16251644
setmetatable(
16261645
textdraw,
16271646
{
@@ -1638,64 +1657,65 @@ function CreatePlayerTextDraw(amx, player, x, y, text)
16381657
end
16391658
end
16401659
if different then
1641-
outputDebugString('A property changed for ' .. textdraw.id .. ' string: ' .. textdraw.text)
1642-
clientCall(player, 'TextDrawPropertyChanged', amx.name, textdraw.id, k, v)
1660+
--table.dump(v, 1, nil) --Dump the data
1661+
--outputDebugString(string.format('A property changed for %s string: %s visibility is %d', textdraw.serverTDId, textdraw.text, textdraw.visible))
1662+
clientCall(player, 'TextDrawPropertyChanged', amx.name, textdraw.clientTDId, k, v)
16431663
t.shadow[k] = v
16441664
end
16451665
end
16461666
}
16471667
)
1648-
1649-
outputDebugString('assigned id ' .. id .. ' to playertextdraws')
1650-
clientCall(player, 'TextDrawCreate', amx.name, id, table.deshadowize(textdraw, true))
1651-
return id
1668+
1669+
outputDebugString('assigned id s->' .. serverTDId .. ' c->' .. clientTDId .. ' to g_PlayerTextDraws[player]')
1670+
clientCall(player, 'TextDrawCreate', amx.name, clientTDId, table.deshadowize(textdraw, true))
1671+
return serverTDId
16521672
end
1653-
function PlayerTextDrawAlignment(amx, playerid, textdrawID, align)
1673+
function PlayerTextDrawAlignment(amx, player, textdrawID, align)
16541674
if not IsPlayerTextDrawValid(player, textdrawID) then
16551675
return false
16561676
end
16571677
g_PlayerTextDraws[player][textdrawID].align = (align == 0 and 1 or align)
16581678
return true
16591679
end
1660-
function PlayerTextDrawBackgroundColor(amx, playerid, textdrawID, r, g, b, a)
1680+
function PlayerTextDrawBackgroundColor(amx, player, textdrawID, r, g, b, a)
16611681
if not IsPlayerTextDrawValid(player, textdrawID) then
16621682
return false
16631683
end
16641684
g_PlayerTextDraws[player][textdrawID].outlinecolor = { r, g, b, a }
16651685
return true
16661686
end
1667-
function PlayerTextDrawFont(amx, playerid, textdrawID, font)
1687+
function PlayerTextDrawFont(amx, player, textdrawID, font)
16681688
if not IsPlayerTextDrawValid(player, textdrawID) then
16691689
return false
16701690
end
16711691
g_PlayerTextDraws[player][textdrawID].font = font
16721692
return true
16731693
end
1674-
function PlayerTextDrawColor(amx, playerid, textdrawID, r, g, b, a)
1694+
function PlayerTextDrawColor(amx, player, textdrawID, r, g, b, a)
16751695
if not IsPlayerTextDrawValid(player, textdrawID) then
16761696
return false
16771697
end
16781698
g_PlayerTextDraws[player][textdrawID].color = { r, g, b }
16791699
return true
16801700
end
1681-
function PlayerTextDrawSetOutline(amx, playerid, textdrawID, size)
1701+
function PlayerTextDrawSetOutline(amx, player, textdrawID, size)
16821702
if not IsPlayerTextDrawValid(player, textdrawID) then
16831703
return false
16841704
end
16851705
g_PlayerTextDraws[player][textdrawID].outlinesize = size
16861706
return true
16871707
end
1688-
function PlayerTextDrawSetProportional(amx, playerid, textdrawID, proportional)
1708+
function PlayerTextDrawSetProportional(amx, player, textdrawID, proportional)
16891709
--TextDrawSetProportional(amx, textdraw, proportional)
16901710
end
1691-
function PlayerTextDrawSetShadow(amx, playerid, textdrawID, size)
1711+
function PlayerTextDrawSetShadow(amx, player, textdrawID, size)
16921712
if not IsPlayerTextDrawValid(player, textdrawID) then
16931713
return false
16941714
end
16951715
g_PlayerTextDraws[player][textdrawID].shade = size
16961716
return true
16971717
end
1698-
function PlayerTextDrawSetString(amx, playerid, textdrawID, str)
1718+
function PlayerTextDrawSetString(amx, player, textdrawID, str)
16991719
if not IsPlayerTextDrawValid(player, textdrawID) then
17001720
return false
17011721
end
@@ -1723,13 +1743,10 @@ end
17231743

17241744
function TextDrawHideForPlayer(amx, player, textdrawID)
17251745
local textdraw = amx.textdraws[textdrawID]
1726-
local playerdata = g_Players[getElemID(player)]
1727-
playerdata.visibletextdraws = playerdata.visibletextdraws or {}
1728-
if not textdraw or not playerdata.visibletextdraws[textdraw] then
1746+
if not textdraw then
17291747
return
17301748
end
17311749
clientCall(player, 'TextDrawHideForPlayer', amx.name, textdrawID)
1732-
playerdata.visibletextdraws[textdraw] = nil
17331750
end
17341751

17351752
function TextDrawLetterSize(amx, textdraw, width, height)
@@ -1761,13 +1778,10 @@ end
17611778

17621779
function TextDrawShowForPlayer(amx, player, textdrawID)
17631780
local textdraw = amx.textdraws[textdrawID]
1764-
local playerdata = g_Players[getElemID(player)]
1765-
playerdata.visibletextdraws = playerdata.visibletextdraws or {}
1766-
if not textdraw or playerdata.visibletextdraws[textdraw] then
1781+
if not textdraw then
17671782
return
17681783
end
17691784
clientCall(player, 'TextDrawShowForPlayer', amx.name, textdrawID)
1770-
playerdata.visibletextdraws[textdraw] = true
17711785
end
17721786

17731787
function TextDrawTextSize(amx, textdraw, x, y)
@@ -2872,13 +2886,23 @@ function SetPlayerAttachedObject(amx, player, index, modelid, bone, fOffsetX, fO
28722886
local x, y, z = getElementPosition (player)
28732887
local mtaBone = g_BoneMapping[bone]
28742888
local obj = createObject(modelid, x, y, z)
2875-
local playerID = getElemID(player)
2876-
g_Players[playerID].attachedObjects[index] = obj
2877-
setElementCollisionsEnabled (obj, false)
2878-
setObjectScale (obj, fScaleX, fScaleY, fScaleZ)
2879-
attachElementToBone(obj, player, mtaBone, fOffsetX, fOffsetY, fOffsetZ, fRotX, fRotY, fRotZ)
2880-
--Todo: Implement material colors
2881-
2889+
2890+
if obj ~= false then
2891+
local playerID = getElemID(player)
2892+
g_Players[playerID].attachedObjects[index] = obj
2893+
setElementCollisionsEnabled (obj, false)
2894+
setObjectScale (obj, fScaleX, fScaleY, fScaleZ)
2895+
2896+
fRotX = fRotX
2897+
fRotY = fRotY
2898+
fRotZ = fRotZ
2899+
2900+
attachElementToBone(obj, player, mtaBone, fOffsetX, fOffsetY, fOffsetZ, fRotX, fRotY, fRotZ)
2901+
--Todo: Implement material colors
2902+
else
2903+
outputDebugString('SetPlayerAttachedObject: Cannot attach object since the model is invalid. Model id was ' .. modelid)
2904+
return 0
2905+
end
28822906
return 1
28832907
end
28842908

0 commit comments

Comments
 (0)