Script v1_7_1_0
- AI
- Animals
- Collections
- Contracts
- Debug
- Economy
- Elements
- EnvironmentalScore
- Errors
- Events
- GUI
- AnimalScreen
- AnimationElement
- BitmapElement
- BoxLayoutElement
- BreadcrumbsElement
- ButtonElement
- ButtonOverlay
- ChatWindow
- CheckedOptionElement
- ClearElement
- ColorPickButtonElement
- ConstructionScreen
- ContextActionDisplay
- ControlBarDisplay
- DialogElement
- DynamicFadedBitmapElement
- FillLevelsDisplay
- FlowLayoutElement
- FocusManager
- FrameElement
- FrameReferenceElement
- GameInfoDisplay
- GameInfoDisplayMobile
- GamePausedDisplay
- Gui
- GuiDataSource
- GuiElement
- GuiMixin
- GuiOverlay
- GuiProfile
- GuiSoundPlayer
- GuiTopDownCamera
- GuiTopDownCursor
- GuiUtils
- HUDDisplayElement
- HUDElement
- HUDFrameElement
- HUDPopupMessage
- HUDSliderElement
- HUDTextDisplay
- IndexChangeSubjectMixin
- IndexStateElement
- InfoDisplay
- InfoHUDBox
- InGameIcon
- IngameMap
- IngameMapElement
- InputGlyphElement
- InputGlyphElementUI
- InputHelpDisplay
- KeyValueInfoHUDBox
- ListElement
- ListItemElement
- MapOverlayGenerator
- MixerWagonHUDExtension
- MultiTextOptionElement
- MultiValueTween
- Overlay
- PagingElement
- PictureElement
- PlatformIconElement
- PlayerControlPadDisplay
- PlaySampleMixin
- RenderElement
- RoundStatusBar
- ScreenElement
- ScrollingLayoutElement
- SettingsModel
- SideNotification
- SideNotificationMobile
- SliderElement
- SpeakerDisplay
- SpeedMeterDisplay
- SpeedSliderDisplay
- StatusBar
- SteeringSliderDisplay
- TabbedMenu
- TabbedMenuFrameElement
- TabbedMenuWithDetails
- TableElement
- TableHeaderElement
- TerrainLayerElement
- TextBackdropElement
- TextElement
- TextInputElement
- ThreePartBitmapElement
- TimerElement
- ToggleButtonElement
- TopNotification
- Tween
- TweenSequence
- VariableWorkWidthHUDExten...
- VehicleHUDExtension
- VehicleSchemaDisplay
- VideoElement
- WardrobeScreen
- Handtools
- Hud
- I3d
- Input
- Jobs
- Maps
- Materials
- Misc
- Objects
- Parameters
- Placeables
- Placement
- Player
- Shop
- Sounds
- Specialization
- Specializations
- StateMachine
- Statistics
- Tasks
- Triggers
- Utils
- Vehicles
Engine v1_7_1_0
- AI
- Animation
- Camera
- Entity
- Fillplanes
- general
- General
- I3D
- Input
- Lighting
- Math
- Network
- Node
- NoteNode
- Overlays
- Particle System
- Physics
- Rendering
- Scenegraph
- Shape
- Sound
- Spline
- String
- Terrain Detail
- Text Rendering
- Tire Track
- VoiceChat
- XML
Foundation Reference
ChatWindow
DescriptionHUD chat window. Displays chat messages.Parent
HUDDisplayElementFunctions
- createBackground
- draw
- getBackgroundPosition
- new
- onMenuVisibilityChange
- scrollChatMessages
- setScale
- setVisible
- storeScaledValues
- update
createBackground
DescriptionCreate the background overlay.Definition
createBackground()Code
240 | function ChatWindow.createBackground(hudAtlasPath) |
241 | local posX, posY = ChatWindow.getBackgroundPosition(1) |
242 | local width, height = getNormalizedScreenValues(unpack(ChatWindow.SIZE.SELF)) |
243 | |
244 | local overlay = Overlay.new(hudAtlasPath, posX, posY, width, height) |
245 | overlay:setUVs(GuiUtils.getUVs(HUD.UV.AREA)) |
246 | |
247 | setOverlayCornerColor(overlay.overlayId, 0, 0, 0, 0, 0.9) |
248 | setOverlayCornerColor(overlay.overlayId, 1, 0, 0, 0, 0.9) |
249 | setOverlayCornerColor(overlay.overlayId, 2, 0, 0, 0, 0.4) |
250 | setOverlayCornerColor(overlay.overlayId, 3, 0, 0, 0, 0.4) |
251 | |
252 | overlay.visible = false -- initialize as invisible, important for first hide call and hide timer |
253 | return overlay |
254 | end |
draw
DescriptionDraw the chat window.Definition
draw()Code
137 | function ChatWindow:draw() |
138 | if self:getVisible() and (not self.isMenuVisible or g_gui.currentGuiName == "ChatDialog") and #self.messages > 0 then |
139 | if g_gui.currentGuiName == "ChatDialog" then |
140 | ChatWindow:superClass().draw(self) |
141 | end |
142 | |
143 | local baseX, baseY = self:getPosition() |
144 | setTextClipArea(baseX, baseY, baseX + self:getWidth(), baseY + self:getHeight()) |
145 | |
146 | local posX, posY = baseX + self.messageOffsetX, baseY + self.messageOffsetY |
147 | |
148 | setTextWrapWidth(self:getWidth() - self.messageOffsetX * 2) |
149 | setTextAlignment(RenderText.ALIGN_LEFT) |
150 | |
151 | local currentY = posY - self.scrollOffset |
152 | |
153 | for i = #self.messages, 1, -1 do |
154 | local sender = self.messages[i].sender .. ":" |
155 | local text = self.messages[i].msg |
156 | |
157 | -- Get text height |
158 | local textHeight, _ = getTextHeight(self.textSize, text) |
159 | |
160 | -- Draw text |
161 | currentY = currentY + textHeight |
162 | |
163 | setTextBold(false) |
164 | setTextColor(unpack(ChatWindow.COLOR.MESSAGE_SHADOW)) |
165 | renderText(posX + self.shadowOffset, currentY - self.shadowOffset, self.textSize, text) |
166 | setTextColor(unpack(ChatWindow.COLOR.MESSAGE)) |
167 | renderText(posX, currentY, self.textSize, text) |
168 | |
169 | -- Draw name above it |
170 | currentY = currentY + self.textSize |
171 | |
172 | setTextBold(true) |
173 | setTextColor(unpack(ChatWindow.COLOR.MESSAGE_SHADOW)) |
174 | renderText(posX + self.shadowOffset, currentY - self.shadowOffset, self.textSize, sender) |
175 | |
176 | local color = ChatWindow.COLOR.MESSAGE |
177 | if self.messages[i].farmId ~= 0 then |
178 | local farm = g_farmManager:getFarmById(self.messages[i].farmId) |
179 | if farm ~= nil then |
180 | color = farm:getColor() |
181 | end |
182 | end |
183 | |
184 | setTextColor(unpack(color)) |
185 | renderText(posX, currentY, self.textSize, sender) |
186 | |
187 | -- Add margin between messages |
188 | currentY = currentY + self.textSize * 0.5 |
189 | |
190 | -- setTextLineBounds(lineShowOffset, numLinesShow) |
191 | -- setTextLineBounds(0, 0) |
192 | |
193 | if currentY > posY + self:getHeight() then |
194 | break |
195 | end |
196 | end |
197 | |
198 | setTextWrapWidth(0) |
199 | setTextClipArea(0, 0, 1, 1) |
200 | setTextBold(false) |
201 | end |
202 | end |
getBackgroundPosition
DescriptionGet this element's base background position.Definition
getBackgroundPosition(float uiScale)Arguments
float | uiScale | Current UI scale factor |
218 | function ChatWindow.getBackgroundPosition(uiScale) |
219 | local offX, offY = getNormalizedScreenValues(unpack(ChatWindow.POSITION.SELF)) |
220 | return g_safeFrameMajorOffsetX + offX, g_safeFrameMajorOffsetY + offY |
221 | end |
new
DescriptionCreate a new ChatWindow.Definition
new(string hudAtlasPath, table speakerDisplay)Arguments
string | hudAtlasPath | Path to the HUD atlas texture. |
table | speakerDisplay | SpeakerDisplay reference which is notified when this window is visible |
table | ChatWindow | instance |
24 | function ChatWindow.new(hudAtlasPath, speakerDisplay) |
25 | local backgroundOverlay = ChatWindow.createBackground(hudAtlasPath) |
26 | local self = ChatWindow:superClass().new(backgroundOverlay, nil, ChatWindow_mt) |
27 | |
28 | self.speakerDisplay = speakerDisplay |
29 | |
30 | self.maxLines = ChatWindow.MAX_NUM_MESSAGES -- overrides parent class value |
31 | self.messages = {} -- reference to chat message history owned by mission object |
32 | self.historyNum = 50 |
33 | |
34 | self.scrollOffset = 0 |
35 | self.hideTime = 0 |
36 | |
37 | self.messageOffsetX, self.messageOffsetY = 0, 0 |
38 | self.textSize = 0 |
39 | self.textOffsetY = 0 |
40 | self.lineOffset = 0 |
41 | self.shadowOffset = 0 |
42 | |
43 | self.isMenuVisible = false |
44 | self.newMessageDuringMenu = false |
45 | |
46 | self:storeScaledValues() |
47 | |
48 | return self |
49 | end |
onMenuVisibilityChange
DescriptionHandle menu visibility state change.Definition
onMenuVisibilityChange()Code
101 | function ChatWindow:onMenuVisibilityChange(isMenuVisible) |
102 | self.isMenuVisible = isMenuVisible |
103 | |
104 | if self:getVisible() then |
105 | self.newMessageDuringMenu = false |
106 | end |
107 | end |
scrollChatMessages
DescriptionScroll chat messages by a given amount.Definition
scrollChatMessages(int delta, int numMessages)Arguments
int | delta | Number of lines (positive or negative) to scroll |
int | numMessages | Number of currently stored chat messages |
80 | function ChatWindow:scrollChatMessages(delta) |
81 | self.scrollOffset = math.max(0, math.min(self.scrollOffset + delta * self.textSize * 1.1, #self.messages * self.textSize * 2.5 - self:getHeight())) |
82 | end |
setScale
DescriptionSet this element's UI scale.Definition
setScale()Code
210 | function ChatWindow:setScale(uiScale) |
211 | ChatWindow:superClass().setScale(self, uiScale) |
212 | self:storeScaledValues() |
213 | end |
setVisible
DescriptionDefinitionsetVisible()Code
53 | function ChatWindow:setVisible(isVisible, animate) |
54 | if isVisible then |
55 | if not self.isMenuVisible then |
56 | self.newMessageDuringMenu = false |
57 | end |
58 | |
59 | -- Already visible |
60 | if self:getVisible() then |
61 | return |
62 | end |
63 | |
64 | ChatWindow:superClass().setVisible(self, true, false) |
65 | |
66 | if animate then |
67 | self.hideTime = ChatWindow.DISPLAY_DURATION |
68 | else |
69 | self.hideTime = -1 |
70 | end |
71 | else |
72 | self.hideTime = self:getVisible() and ChatWindow.DISPLAY_DURATION or 0 |
73 | end |
74 | end |
storeScaledValues
DescriptionStore scaled positioning, size and offset values.Definition
storeScaledValues()Code
225 | function ChatWindow:storeScaledValues() |
226 | self.messageOffsetX, self.messageOffsetY = self:scalePixelToScreenVector(ChatWindow.POSITION.MESSAGE) |
227 | |
228 | self.textSize = self:scalePixelToScreenHeight(ChatWindow.TEXT_SIZE.MESSAGE) |
229 | self.textOffsetY = self.textSize * 0.15 |
230 | self.lineOffset = self.textSize * 0.3 |
231 | self.shadowOffset = ChatWindow.SHADOW_OFFSET_FACTOR * self.textSize |
232 | end |
update
DescriptionUpdate element state.Definition
update()Code
120 | function ChatWindow:update(dt) |
121 | ChatWindow:superClass().update(self, dt) |
122 | |
123 | if self.hideTime >= 0 then -- also update and hide if time has been set to 0, see test below |
124 | self.hideTime = self.hideTime - dt |
125 | if self.hideTime <= 0 then |
126 | ChatWindow:superClass().setVisible(self, false, false) |
127 | end |
128 | end |
129 | end |