FrameworkZ 10.8.3
Provides a framework for Project Zomboid with various systems.
Loading...
Searching...
No Matches
TabSession.lua
Go to the documentation of this file.
3
4local PANEL_WIDTH = getCore():getScreenWidth() * 0.25
5local PANEL_HEIGHT = getCore():getScreenHeight()
6local PANEL_MARGIN_X = 20
7local PANEL_MARGIN_Y = 20
9function FrameworkZ.UI.TabSession:initialise()
10 local TITLE_TEXT = "Session Characters"
11 local FONT_TITLE = UIFont.Title
12 local TITLE_WIDTH = getTextManager():MeasureStringX(FONT_TITLE, TITLE_TEXT)
13 local TITLE_HEIGHT = getTextManager():MeasureStringY(FONT_TITLE, TITLE_TEXT)
14 local TITLE_PADDING_TOP = 50
15 local TITLE_PADDING_BOTTOM = 50
16 local TITLE_X = (PANEL_WIDTH - TITLE_WIDTH) / 2
17 local TITLE_Y = PANEL_MARGIN_Y + TITLE_PADDING_TOP
19 ISPanel.initialise(self)
20 self.charactersByFaction = {}
21
22 self.titleLabel = ISLabel:new(TITLE_X, TITLE_Y, TITLE_HEIGHT, TITLE_TEXT, 1, 1, 1, 1, FONT_TITLE, true)
23 self.titleLabel:initialise()
24 self:addChild(self.titleLabel)
26 self.closeButton = FrameworkZ.UserInterfaces:CreateHugeButton(self, PANEL_WIDTH - PANEL_MARGIN_X, PANEL_MARGIN_Y, "X", self, FrameworkZ.UI.TabPanel.onMenuSelect)
28 self.closeButton.internal = "CLOSE"
30 local yOffset = self.titleLabel:getY() + self.titleLabel:getHeight() + TITLE_PADDING_BOTTOM
31 local REFRESH_TEXT_HEIGHT = getTextManager():MeasureStringY(FrameworkZ.UserInterfaces.ButtonTheme.hugeButtonFontSize, "Refresh")
32 local SESSION_CHARACTERS_WIDTH = PANEL_WIDTH - PANEL_MARGIN_X * 2
33 local SESSION_CHARACTERS_HEIGHT = PANEL_HEIGHT - yOffset - PANEL_MARGIN_Y * 2 - REFRESH_TEXT_HEIGHT
34
35 self.playerListPanel = ISPanel:new(PANEL_MARGIN_X, yOffset, SESSION_CHARACTERS_WIDTH, SESSION_CHARACTERS_HEIGHT)
36 self.playerListPanel.backgroundColor = {r=0, g=0, b=0, a=0}
38 self.playerListPanel.onMouseWheel = function(self2, del)
39 self2:setYScroll(self2:getYScroll() - del * 16)
40 return true
41 end
42
43 self.playerListPanel.prerender = function(self2)
44 self:setStencilRect(self2:getX(), self2:getY(), self2:getWidth(), self2:getHeight())
45 ISPanel.prerender(self2)
46 end
47
48 self.playerListPanel.render = function(self2)
49 ISPanel.render(self2)
50 self2:clearStencilRect()
51 end
52
53 self.playerListPanel:initialise()
54 self.playerListPanel:instantiate()
55 self:updatePlayerList()
56 self.playerListPanel:setScrollHeight(self.bottomDescription:getBottom() + 50) -- Not the best implementation with self.bottomDescription but it works
57 self.playerListPanel:addScrollBars()
58 self.playerListPanel:setScrollChildren(true)
59 self:addChild(self.playerListPanel)
60
61 self.refreshButton = FrameworkZ.UserInterfaces:CreateHugeButton(self, 0, 0, "Refresh", self, FrameworkZ.UI.TabPanel.onMenuSelect)
64 self.refreshButton.internal = "REFRESH"
65end
66
67function FrameworkZ.UI.TabSession:updatePlayerList()
68 self.charactersByFaction = {}
69 local players = getOnlinePlayers()
70
71 for i = 0, players:size() - 1 do
72 local username = players:get(i):getUsername()
73 local character = FrameworkZ.Players:GetLoadedCharacterByID(username)
74
75 if character then
76 local faction = character:GetFaction() or "Unaffiliated"
77 local name, description = self:getCharacterInfo(character)
78
79 if not self.charactersByFaction[faction] then
80 self.charactersByFaction[faction] = {}
81 end
82
83 table.insert(self.charactersByFaction[faction], {name = name, description = description, username = username})
84 end
85 end
86
87 self:populatePlayerList()
88end
89
90function FrameworkZ.UI.TabSession:getCharacterInfo(character)
91 if self.character:RecognizesCharacter(character) or self.character == character then
92 return character:GetName(), character:GetDescription()
93 else
94 return "Unknown", "Description Hidden"
95 end
96end
97
98function FrameworkZ.UI.TabSession:populatePlayerList()
99 local FONT_BUTTON = UIFont.Title
100 local FONT_FACTION = UIFont.Title
101 local FONT_NAME = UIFont.Large
102 local FONT_DESCRIPTION = UIFont.Medium
103
104 local xMargin = 10
105 local yOffset = 10
106
107 self.playerListPanel:clearChildren()
108
109 for faction, players in pairs(self.charactersByFaction) do
110 local factionLabel = ISLabel:new(10, yOffset, 20, faction, 1, 0.84, 0, 1, FONT_FACTION, true)
111 factionLabel:initialise()
112 self.playerListPanel:addChild(factionLabel)
113
114 yOffset = yOffset + 30
115
116 for _, player in ipairs(players) do
117 local nameHeight = getTextManager():MeasureStringY(FONT_NAME, player.name)
118 local descriptionHeight = getTextManager():MeasureStringY(FONT_DESCRIPTION, player.description)
119 local truncatedDescription = #player.description > 52 and string.sub(player.description, 1, 52) .. "..." or player.description
120 local characterButtonWidthHeight = nameHeight + descriptionHeight
121
122 local characterButton = ISButton:new(xMargin, yOffset, characterButtonWidthHeight, characterButtonWidthHeight, "?", self, FrameworkZ.UI.TabSession.onClickButton)
123 characterButton.internal = "INFO" --player.username
124 characterButton.font = FONT_BUTTON
125 characterButton.tooltip = FrameworkZ.Utilities:WordWrapText("Description: " .. player.description, 32, "\n") .. "\nSteam ID: " .. getSteamIDFromUsername(player.username) .. "\nPing: " .. getPlayerFromUsername(player.username):getPing()
126 characterButton:initialise()
127 self.playerListPanel:addChild(characterButton)
128
129 local xPadding = characterButton:getWidth() + xMargin * 2
130
131 local characterLabel = ISLabel:new(xPadding, yOffset, nameHeight, player.name, 1, 1, 1, 1, FONT_NAME, true)
132 characterLabel:initialise()
133 self.playerListPanel:addChild(characterLabel)
134
135 self.bottomDescription = ISLabel:new(xPadding, yOffset + nameHeight, descriptionHeight, truncatedDescription, 0.75, 0.75, 0.75, 1, FONT_DESCRIPTION, true) -- Not the best implementation with self.bottomDescription but it works
136 self.bottomDescription:initialise()
137 self.playerListPanel:addChild(self.bottomDescription)
138
139 yOffset = yOffset + 45
140 end
141
142 yOffset = yOffset + 10
143 end
144end
145
146function FrameworkZ.UI.TabSession:onClickButton(button, x, y)
147 if button.internal == "INFO" then
148 print("Opening Character Info")
149 elseif button.internal == "REFRESH" then
150 FrameworkZ.UI.TabSession.instance:updatePlayerList()
151 end
152end
153
154function FrameworkZ.UI.TabSession:onClose(button, x, y)
155 self:setVisible(false)
156 self:removeFromUIManager()
158end
159
161 ISPanel.render(self)
162end
163
165 ISPanel.prerender(self)
166end
167
168function FrameworkZ.UI.TabSession:new(isoPlayer)
169 if not FrameworkZ.UI.TabPanel.instance then return end
171
172 local o = ISPanel:new(instance:getX() + instance:getWidth(), instance:getY(), PANEL_WIDTH, PANEL_HEIGHT)
173 setmetatable(o, self)
175 o.backgroundColor = {r=0.15, g=0.15, b=0.15, a=0.9}
176 o.borderColor = {r=0, g=0, b=0, a=0}
177 o.isoPlayer = isoPlayer
178 o.character = FrameworkZ.Players:GetLoadedCharacterByID(isoPlayer:getUsername())
179
181
182 return o
183end
184
void local y()
void local descriptionHeight()
void local x()
void local yOffset()
void self faction()
void FrameworkZ DollarFormats __index()
void description()
void local instance()
void self FrameworkZ UI self nil
Definition MainMenu.lua:95
void self self
Definition MainMenu.lua:89
void self closeButton()
void local player()
void processingNotification backgroundColor a()
void self username()
void FrameworkZ UI TabPanel()
void self playerListPanel render()
void self refreshButton internal()
void local PANEL_MARGIN_Y()
void local PANEL_MARGIN_X()
void FrameworkZ UI TabSession()
void local PANEL_HEIGHT()
void self refreshButton()
void self playerListPanel prerender()
void local PANEL_WIDTH()
void local getTextManager()
void button backgroundColor()
void local name()
void isoPlayer()
Characters module for FrameworkZ. Defines and interacts with CHARACTER object.
Players module for FrameworkZ. Defines and interacts with PLAYER object.
Definition Players.lua:13
void getCharacterInfo(character)
void onClickButton(button, x, y)
void onClose(button, x, y)
Contains all of the User Interfaces for FrameworkZ.
void for i()