Client Upload Part 2

RD Core / Commit #5

Commit Client Upload Part 2

Alex Alex committed 19/10/2026 00:06 main Patch
1,244 files +271,215 -0
A RD_Client/modules/game_hotkeys/hotkeys_manager.otmod +9-0 View file
@@ -0,0 +1,9 @@
1+Module
2+ name: game_hotkeys
3+ description: Manage client hotkeys
4+ author: andrefaramir, BeniS
5+ website: https://github.com/edubart/otclient
6+ sandboxed: true
7+ scripts: [ hotkeys_extra, hotkeys_manager ]
8+ @onLoad: init()
9+ @onUnload: terminate()
A RD_Client/modules/game_hotkeys/hotkeys_manager.otui +268-0 View file
@@ -0,0 +1,268 @@
1+HotkeyListLabel < UILabel
2+ font: verdana-11px-monochrome
3+ background-color: alpha
4+ text-offset: 2 0
5+ focusable: true
6+ phantom: false
7+
8+ $focus:
9+ background-color: #ffffff22
10+
11+MainWindow
12+ id: hotkeysWindow
13+ !text: tr('Hotkeys')
14+ size: 370 475
15+
16+ @onEnter: modules.game_hotkeys.ok()
17+ @onEscape: modules.game_hotkeys.cancel()
18+
19+ ComboBox
20+ id: configSelector
21+ anchors.left: parent.left
22+ anchors.right: parent.right
23+ anchors.top: parent.top
24+ menu-scroll: true
25+ menu-height: 125
26+ menu-scroll-step: 25
27+ text-offset: 5 2
28+ @onOptionChange: modules.game_hotkeys.onConfigChange()
29+ @onSetup: |
30+ self:addOption(tr("Hotkeys config #1"))
31+ self:addOption(tr("Hotkeys config #2"))
32+ self:addOption(tr("Hotkeys config #3"))
33+ self:addOption(tr("Hotkeys config #4"))
34+ self:addOption(tr("Hotkeys config #5"))
35+
36+
37+ VerticalScrollBar
38+ id: currentHotkeysScrollBar
39+ height: 150
40+ anchors.top: prev.bottom
41+ anchors.right: parent.right
42+ margin-top: 5
43+ step: 14
44+ pixels-scroll: true
45+
46+ TextList
47+ id: currentHotkeys
48+ vertical-scrollbar: currentHotkeysScrollBar
49+ anchors.left: parent.left
50+ anchors.right: prev.left
51+ anchors.top: prev.top
52+ anchors.bottom: prev.bottom
53+ focusable: false
54+
55+ Button
56+ id: resetButton
57+ width: 96
58+ !text: tr('Reset All')
59+ anchors.left: parent.left
60+ anchors.top: next.top
61+ @onClick: modules.game_hotkeys.reset()
62+ margin-right: 10
63+
64+ Button
65+ id: addHotkeyButton
66+ !text: tr('Add')
67+ width: 64
68+ anchors.right: next.left
69+ anchors.top: next.top
70+ margin-right: 5
71+ @onClick: modules.game_hotkeys.addHotkey()
72+
73+ Button
74+ id: removeHotkeyButton
75+ !text: tr('Remove')
76+ width: 64
77+ enabled: false
78+ anchors.right: parent.right
79+ anchors.top: currentHotkeys.bottom
80+ margin-top: 8
81+ @onClick: modules.game_hotkeys.removeHotkey()
82+
83+ HorizontalSeparator
84+ anchors.left: parent.left
85+ anchors.right: parent.right
86+ anchors.top: prev.bottom
87+ margin-top: 5
88+
89+ Label
90+ anchors.left: parent.left
91+ anchors.top: prev.bottom
92+ margin-top: 10
93+ !text: tr('Extra action:')
94+
95+ ComboBox
96+ id: action
97+ anchors.left: prev.right
98+ anchors.right: parent.right
99+ anchors.top: prev.top
100+ margin-left: 5
101+ margin-top: -4
102+ enabled: false
103+ @onOptionChange: modules.game_hotkeys.updateHotkeyAction()
104+
105+ HorizontalSeparator
106+ anchors.left: parent.left
107+ anchors.right: parent.right
108+ anchors.top: prev.bottom
109+ margin-top: 5
110+
111+ Label
112+ id: hotKeyTextLabel
113+ !text: tr('Edit hotkey text:')
114+ enable: false
115+ anchors.left: parent.left
116+ anchors.right: parent.right
117+ anchors.top: prev.bottom
118+ margin-top: 6
119+
120+ TextEdit
121+ id: hotkeyText
122+ enabled: false
123+ anchors.left: parent.left
124+ anchors.right: parent.right
125+ anchors.top: prev.bottom
126+ margin-top: 2
127+ @onTextChange: modules.game_hotkeys.onHotkeyTextChange(self:getText())
128+
129+ CheckBox
130+ id: sendAutomatically
131+ !text: tr('Send automatically')
132+ anchors.left: parent.left
133+ anchors.right: parent.right
134+ anchors.top: prev.bottom
135+ enabled:false
136+ margin-top: 5
137+ @onCheckChange: modules.game_hotkeys.onSendAutomaticallyChange(self:isChecked())
138+
139+ Item
140+ id: itemPreview
141+ anchors.left: parent.left
142+ anchors.top: prev.bottom
143+ margin-top: 10
144+ virtual: true
145+
146+ Button
147+ id: selectObjectButton
148+ !text: tr('Select object')
149+ width: 128
150+ enabled: false
151+ anchors.left: prev.right
152+ anchors.top: prev.top
153+ margin-left: 10
154+ @onClick: modules.game_hotkeys.startChooseItem()
155+
156+ Button
157+ id: clearObjectButton
158+ !text: tr('Clear object')
159+ width: 128
160+ enabled: false
161+ anchors.left: prev.left
162+ anchors.right: prev.right
163+ anchors.top: prev.bottom
164+ margin-top: 2
165+ @onClick: modules.game_hotkeys.clearObject()
166+
167+ ButtonBox
168+ id: useOnSelf
169+ !text: tr('Use on yourself')
170+ width: 128
171+ enabled: false
172+ anchors.left: selectObjectButton.right
173+ anchors.right: parent.right
174+ anchors.top: selectObjectButton.top
175+ checked: false
176+ margin-left: 10
177+
178+ ButtonBox
179+ id: useOnTarget
180+ !text: tr('Use on target')
181+ width: 128
182+ enabled: false
183+ anchors.left: prev.left
184+ anchors.right: parent.right
185+ anchors.top: prev.bottom
186+ checked: false
187+ margin-top: 2
188+
189+ ButtonBox
190+ id: useWith
191+ !text: tr('With crosshair')
192+ width: 128
193+ enabled: false
194+ anchors.left: prev.left
195+ anchors.right: parent.right
196+ anchors.top: prev.bottom
197+ checked: false
198+ margin-top: 2
199+
200+ HorizontalSeparator
201+ id: separator
202+ anchors.left: parent.left
203+ anchors.right: parent.right
204+ anchors.bottom: next.top
205+ margin-bottom: 5
206+
207+ Button
208+ id: okButton
209+ !text: tr('Ok')
210+ width: 64
211+ anchors.right: next.left
212+ anchors.bottom: parent.bottom
213+ @onClick: modules.game_hotkeys.ok()
214+ margin-right: 10
215+
216+ Button
217+ id: cancelButton
218+ !text: tr('Cancel')
219+ width: 64
220+ anchors.right: parent.right
221+ anchors.bottom: parent.bottom
222+ @onClick: modules.game_hotkeys.cancel()
223+
224+HotkeyAssignWindow < MainWindow
225+ id: assignWindow
226+ !text: tr('Button Assign')
227+ size: 360 150
228+ @onEscape: self:destroy()
229+
230+ Label
231+ !text: tr('Please, press the key you wish to add onto your hotkeys manager')
232+ anchors.left: parent.left
233+ anchors.right: parent.right
234+ anchors.top: parent.top
235+ text-auto-resize: true
236+ text-align: left
237+
238+ Label
239+ id: comboPreview
240+ !text: tr('Current hotkey to add: %s', 'none')
241+ anchors.horizontalCenter: parent.horizontalCenter
242+ anchors.top: prev.bottom
243+ margin-top: 10
244+ text-auto-resize: true
245+
246+ HorizontalSeparator
247+ id: separator
248+ anchors.left: parent.left
249+ anchors.right: parent.right
250+ anchors.bottom: next.top
251+ margin-bottom: 10
252+
253+ Button
254+ id: addButton
255+ !text: tr('Add')
256+ width: 64
257+ anchors.right: next.left
258+ anchors.bottom: parent.bottom
259+ margin-right: 10
260+ @onClick: modules.game_hotkeys.hotkeyCaptureOk(self:getParent(), self:getParent():getChildById('comboPreview').keyCombo)
261+
262+ Button
263+ id: cancelButton
264+ !text: tr('Cancel')
265+ width: 64
266+ anchors.right: parent.right
267+ anchors.bottom: parent.bottom
268+ @onClick: self:getParent():destroy()
A RD_Client/modules/game_imbuing/imbuing.lua +313-0 View file
@@ -0,0 +1,313 @@
1+local imbuingWindow
2+local bankGold = 0
3+local inventoryGold = 0
4+local itemImbuements = {}
5+local emptyImbue
6+local groupsCombo
7+local imbueLevelsCombo
8+local protectionBtn
9+local clearImbue
10+local selectedImbue
11+local imbueItems = {}
12+local protection = false
13+local clearConfirmWindow
14+local imbueConfirmWindow
15+
16+function init()
17+ connect(g_game, {
18+ onGameEnd = hide,
19+ onResourceBalance = onResourceBalance,
20+ onImbuementWindow = onImbuementWindow,
21+ onCloseImbuementWindow = onCloseImbuementWindow
22+ })
23+
24+ imbuingWindow = g_ui.displayUI('imbuing')
25+ emptyImbue = imbuingWindow.emptyImbue
26+ groupsCombo = emptyImbue.groups
27+ imbueLevelsCombo = emptyImbue.imbuement
28+ protectionBtn = emptyImbue.protection
29+ clearImbue = imbuingWindow.clearImbue
30+ imbuingWindow:hide()
31+
32+ groupsCombo.onOptionChange = function(widget)
33+ imbueLevelsCombo:clear()
34+ if itemImbuements ~= nil then
35+ local selectedGroup = groupsCombo:getCurrentOption().text
36+ for _,imbuement in ipairs(itemImbuements) do
37+ if imbuement["group"] == selectedGroup then
38+ emptyImbue.imbuement:addOption(imbuement["name"])
39+ end
40+ end
41+ imbueLevelsCombo.onOptionChange(imbueLevelsCombo) -- update options
42+ end
43+ end
44+
45+ imbueLevelsCombo.onOptionChange = function(widget)
46+ setProtection(false)
47+ local selectedGroup = groupsCombo:getCurrentOption().text
48+ for _,imbuement in ipairs(itemImbuements) do
49+ if imbuement["group"] == selectedGroup then
50+ if #imbuement["sources"] == widget.currentIndex then
51+ selectedImbue = imbuement
52+ for i,source in ipairs(imbuement["sources"]) do
53+ for _,item in ipairs(imbueItems) do
54+ if item:getId() == source["item"]:getId() then
55+ if item:getCount() >= source["item"]:getCount() then
56+ emptyImbue.imbue:setImageSource("/images/game/imbuing/imbue_green")
57+ emptyImbue.imbue:setEnabled(true)
58+ emptyImbue.requiredItems:getChildByIndex(i).count:setColor("white")
59+ end
60+ if item:getCount() < source["item"]:getCount() then
61+ emptyImbue.imbue:setEnabled(false)
62+ emptyImbue.imbue:setImageSource("/images/game/imbuing/imbue_empty")
63+ emptyImbue.requiredItems:getChildByIndex(i).count:setColor("red")
64+ end
65+ emptyImbue.requiredItems:getChildByIndex(i).count:setText(item:getCount() .. "/" .. source["item"]:getCount())
66+ end
67+ end
68+ emptyImbue.requiredItems:getChildByIndex(i).item:setItemId(source["item"]:getId())
69+ emptyImbue.requiredItems:getChildByIndex(i).item:setTooltip("The imbuement requires " .. source["description"] .. ".")
70+ end
71+ for i = 3, widget.currentIndex + 1, -1 do
72+ emptyImbue.requiredItems:getChildByIndex(i).count:setText("")
73+ emptyImbue.requiredItems:getChildByIndex(i).item:setItemId(0)
74+ emptyImbue.requiredItems:getChildByIndex(i).item:setTooltip("")
75+ end
76+ emptyImbue.protectionCost:setText(imbuement["protectionCost"])
77+ emptyImbue.cost:setText(imbuement["cost"])
78+ if not protection and (bankGold + inventoryGold) < imbuement["cost"] then
79+ emptyImbue.imbue:setEnabled(false)
80+ emptyImbue.imbue:setImageSource("/images/game/imbuing/imbue_empty")
81+ emptyImbue.cost:setColor("red")
82+ end
83+ if not protection and (bankGold + inventoryGold) >= imbuement["cost"] then
84+ emptyImbue.cost:setColor("white")
85+ end
86+ if protection and (bankGold + inventoryGold) < (imbuement["cost"] + imbuement["protectionCost"]) then
87+ emptyImbue.imbue:setEnabled(false)
88+ emptyImbue.imbue:setImageSource("/images/game/imbuing/imbue_empty")
89+ emptyImbue.cost:setColor("red")
90+ end
91+ if protection and (bankGold + inventoryGold) >= (imbuement["cost"] + imbuement["protectionCost"]) then
92+ emptyImbue.cost:setColor("white")
93+ end
94+ emptyImbue.successRate:setText(imbuement["successRate"] .. "%")
95+ if selectedImbue["successRate"] > 50 then
96+ emptyImbue.successRate:setColor("white")
97+ else
98+ emptyImbue.successRate:setColor("red")
99+ end
100+ emptyImbue.description:setText(imbuement["description"])
101+ end
102+ end
103+ end
104+ end
105+
106+ protectionBtn.onClick = function()
107+ setProtection(not protection)
108+ end
109+end
110+
111+function setProtection(value)
112+ protection = value
113+ if protection then
114+ emptyImbue.cost:setText(selectedImbue["cost"] + selectedImbue["protectionCost"])
115+ emptyImbue.successRate:setText("100%")
116+ emptyImbue.successRate:setColor("green")
117+ protectionBtn:setImageClip(torect("66 0 66 66"))
118+ else
119+ if selectedImbue then
120+ emptyImbue.cost:setText(selectedImbue["cost"])
121+ emptyImbue.successRate:setText(selectedImbue["successRate"] .. "%")
122+ if selectedImbue["successRate"] > 50 then
123+ emptyImbue.successRate:setColor("white")
124+ else
125+ emptyImbue.successRate:setColor("red")
126+ end
127+ end
128+ protectionBtn:setImageClip(torect("0 0 66 66"))
129+ end
130+end
131+
132+function terminate()
133+ disconnect(g_game, {
134+ onGameEnd = hide,
135+ onResourceBalance = onResourceBalance,
136+ onImbuementWindow = onImbuementWindow,
137+ onCloseImbuementWindow = onCloseImbuementWindow
138+ })
139+
140+ imbuingWindow:destroy()
141+end
142+
143+function resetSlots()
144+ emptyImbue:setVisible(false)
145+ clearImbue:setVisible(false)
146+ for i=1,3 do
147+ imbuingWindow.itemInfo.slots:getChildByIndex(i):setText("Slot " .. i)
148+ imbuingWindow.itemInfo.slots:getChildByIndex(i):setEnabled(false)
149+ imbuingWindow.itemInfo.slots:getChildByIndex(i):setTooltip("Items can have up to three imbuements slots. This slot is not available for this item.")
150+ imbuingWindow.itemInfo.slots:getChildByIndex(i).onClick = nil
151+ end
152+end
153+
154+function selectSlot(widget, slotId, activeSlot)
155+ if activeSlot then
156+ emptyImbue:setVisible(false)
157+ widget:setText(activeSlot[1]["name"])
158+ clearImbue.title:setText('Clear Imbuement "' .. activeSlot[1]["name"] .. '"')
159+ clearImbue.groups:clear()
160+ clearImbue.groups:addOption(activeSlot[1]["group"])
161+ clearImbue.imbuement:clear()
162+ clearImbue.imbuement:addOption(activeSlot[1]["name"])
163+ clearImbue.description:setText(activeSlot[1]["description"])
164+
165+ hours = string.format("%02.f", math.floor(activeSlot[2]/3600))
166+ mins = string.format("%02.f", math.floor(activeSlot[2]/60 - (hours*60)))
167+ clearImbue.time.timeRemaining:setText(hours..":"..mins.."h")
168+
169+ clearImbue.cost:setText(activeSlot[3])
170+ if (bankGold + inventoryGold) < activeSlot[3] then
171+ emptyImbue.clear:setEnabled(false)
172+ emptyImbue.clear:setImageSource("/images/game/imbuing/imbue_empty")
173+ emptyImbue.cost:setColor("red")
174+ end
175+
176+ local yesCallback = function()
177+ g_game.clearImbuement(slotId)
178+ widget:setText("Slot " .. (slotId + 1))
179+ if clearConfirmWindow then
180+ clearConfirmWindow:destroy()
181+ clearConfirmWindow=nil
182+ end
183+ end
184+ local noCallback = function()
185+ imbuingWindow:show()
186+ if clearConfirmWindow then
187+ clearConfirmWindow:destroy()
188+ clearConfirmWindow=nil
189+ end
190+ end
191+
192+ clearImbue.clear.onClick = function()
193+ imbuingWindow:hide()
194+ clearConfirmWindow = displayGeneralBox(tr('Confirm Clearing'), tr('Do you wish to spend ' .. activeSlot[3] .. ' gold coins to clear the imbuement "' .. activeSlot[1]["name"] .. '" from your item?'), {
195+ { text=tr('Yes'), callback=yesCallback },
196+ { text=tr('No'), callback=noCallback },
197+ anchor=AnchorHorizontalCenter}, yesCallback, noCallback)
198+ end
199+
200+ clearImbue:setVisible(true)
201+ else
202+ emptyImbue:setVisible(true)
203+ clearImbue:setVisible(false)
204+
205+ local yesCallback = function()
206+ g_game.applyImbuement(slotId, selectedImbue["id"], protection)
207+ if clearConfirmWindow then
208+ clearConfirmWindow:destroy()
209+ clearConfirmWindow=nil
210+ end
211+ widget:setText(selectedImbue["name"])
212+ imbuingWindow:show()
213+ end
214+ local noCallback = function()
215+ imbuingWindow:show()
216+ if clearConfirmWindow then
217+ clearConfirmWindow:destroy()
218+ clearConfirmWindow=nil
219+ end
220+ end
221+
222+ emptyImbue.imbue.onClick = function()
223+ imbuingWindow:hide()
224+ local cost = selectedImbue["cost"]
225+ local successRate = selectedImbue["successRate"]
226+ if protection then
227+ cost = cost + selectedImbue["protectionCost"]
228+ successRate = "100"
229+ end
230+ clearConfirmWindow = displayGeneralBox(tr('Confirm Imbuing Attempt'), 'You are about to imbue your item with "' .. selectedImbue["name"] .. '".\nYour chance to succeed is ' .. successRate .. '%. It will consume the required astral sources and '.. cost ..' gold coins.\nDo you wish to proceed?', {
231+ { text=tr('Yes'), callback=yesCallback },
232+ { text=tr('No'), callback=noCallback },
233+ anchor=AnchorHorizontalCenter}, yesCallback, noCallback)
234+ end
235+ end
236+end
237+
238+function onImbuementWindow(itemId, slots, activeSlots, imbuements, needItems)
239+ if not itemId then
240+ return
241+ end
242+ resetSlots()
243+ imbueItems = table.copy(needItems)
244+ imbuingWindow.itemInfo.item:setItemId(itemId)
245+
246+ for i=1, slots do
247+ local slot = imbuingWindow.itemInfo.slots:getChildByIndex(i)
248+ slot.onClick = function(widget)
249+ selectSlot(widget, i - 1)
250+ end
251+ slot:setTooltip("Use this slot to imbue your item. Depending on the item you can have up to three different imbuements.")
252+ slot:setEnabled(true)
253+
254+ if slot:getId() == "slot0" then
255+ selectSlot(slot, i - 1)
256+ end
257+ end
258+
259+ for i, slot in pairs(activeSlots) do
260+ local activeSlotBtn = imbuingWindow.itemInfo.slots:getChildById("slot" .. i)
261+ activeSlotBtn.onClick = function(widget)
262+ selectSlot(widget, i, slot)
263+ end
264+ if activeSlotBtn:getId() == "slot0" then
265+ selectSlot(activeSlotBtn, i, slot)
266+ end
267+ end
268+
269+ if imbuements ~= nil then
270+ groupsCombo:clear()
271+ imbueLevelsCombo:clear()
272+ itemImbuements = table.copy(imbuements)
273+ for _,imbuement in ipairs(itemImbuements) do
274+ if not groupsCombo:isOption(imbuement["group"]) then
275+ groupsCombo:addOption(imbuement["group"])
276+ end
277+ end
278+ end
279+ show()
280+end
281+
282+function onResourceBalance(type, balance)
283+ if type == 0 then
284+ bankGold = balance
285+ elseif type == 1 then
286+ inventoryGold = balance
287+ end
288+ if type == 0 or type == 1 then
289+ imbuingWindow.balance:setText(tr("Balance") .. ":\n" .. (bankGold + inventoryGold))
290+ end
291+end
292+
293+function onCloseImbuementWindow()
294+ resetSlots()
295+end
296+
297+function hide()
298+ g_game.closeImbuingWindow()
299+ imbuingWindow:hide()
300+end
301+
302+function show()
303+ imbuingWindow:show()
304+ imbuingWindow:raise()
305+ imbuingWindow:focus()
306+end
307+
308+function toggle()
309+ if imbuingWindow:isVisible() then
310+ return hide()
311+ end
312+ show()
313+end
A RD_Client/modules/game_imbuing/imbuing.otmod +9-0 View file
@@ -0,0 +1,9 @@
1+Module
2+ name: game_imbuing
3+ description: imbuing
4+ author: Vincent#1766 on discord
5+ website: http://otclient.ovh
6+ sandboxed: true
7+ scripts: [ imbuing ]
8+ @onLoad: init()
9+ @onUnload: terminate()
A RD_Client/modules/game_imbuing/imbuing.otui +346-0 View file
@@ -0,0 +1,346 @@
1+Slot < Button
2+ width: 70
3+ height: 66
4+ anchors.verticalCenter: parent.verticalCenter
5+ enabled: false
6+ text-wrap: true
7+ !tooltip: tr('Items can have up to three imbuements slots. This slot is not available for this item.')
8+
9+RequiredItem < Panel
10+ width: 66
11+ height: 90
12+
13+ UIItem
14+ id: item
15+ height: 66
16+ width: 66
17+ anchors.left: parent.left
18+ anchors.top: parent.top
19+
20+ FlatLabel
21+ id: count
22+ margin-top: 5
23+ text-align: center
24+ anchors.left: prev.left
25+ anchors.right: prev.right
26+ anchors.top: prev.bottom
27+
28+ItemInformation < Panel
29+ height: 100
30+ border: 1 black
31+ padding: 5
32+
33+ Label
34+ id: title
35+ anchors.top: parent.top
36+ anchors.left: parent.left
37+ anchors.right: parent.right
38+ text-align: center
39+ !text: tr("Item Information")
40+
41+ UIItem
42+ id: item
43+ anchors.top: parent.top
44+ anchors.left: parent.left
45+ anchors.VerticalCenter: parent.VerticalCenter
46+ margin-left: 10
47+ margin-top: 5
48+ height: 64
49+ width: 64
50+
51+ Panel
52+ id: slots
53+ width: 240
54+ height: 66
55+ margin-top: 5
56+ anchors.VerticalCenter: parent.VerticalCenter
57+ anchors.top: prev.top
58+ anchors.right: parent.right
59+
60+ Slot
61+ id: slot0
62+ !text: tr("Slot 1")
63+ text-align: center
64+ anchors.left: parent.left
65+
66+ Slot
67+ id: slot1
68+ !text: tr("Slot 2")
69+ text-align: center
70+ margin-left: 10
71+ anchors.left: prev.right
72+
73+ Slot
74+ id: slot2
75+ !text: tr("Slot 3")
76+ text-align: center
77+ margin-left: 10
78+ anchors.left: prev.right
79+
80+ Label
81+ id: selectSlot
82+ margin-right: 15
83+ anchors.right: slots.left
84+ anchors.VerticalCenter: parent.VerticalCenter
85+ !text: tr("Select Slot:")
86+
87+EmptyImbue < Panel
88+ height: 240
89+ border: 1 black
90+ padding: 5
91+
92+ Label
93+ id: title
94+ anchors.top: parent.top
95+ anchors.left: parent.left
96+ anchors.right: parent.right
97+ text-align: center
98+ !text: tr("Imbue Empty Slot")
99+
100+ ComboBox
101+ id: groups
102+ anchors.top: title.bottom
103+ anchors.left: parent.left
104+ anchors.right: parent.HorizontalCenter
105+ margin-right: 3
106+ margin-top: 5
107+ isdisabled: true
108+
109+ ComboBox
110+ id: imbuement
111+ anchors.top: prev.top
112+ anchors.left: groups.right
113+ anchors.right: parent.right
114+ margin-left: 3
115+
116+ Label
117+ id: description
118+ anchors.top: prev.bottom
119+ anchors.left: parent.left
120+ anchors.right: parent.right
121+ margin-top: 10
122+ height: 85
123+
124+ Label
125+ id: info
126+ anchors.bottom: prev.bottom
127+ anchors.left: parent.left
128+ !text: tr('Requires the following astral sources:')
129+
130+ Label
131+ id: successRate
132+ anchors.top: info.top
133+ anchors.right: parent.right
134+ width: 35
135+ text-align: right
136+
137+ Label
138+ id: successRateTitle
139+ anchors.top: info.top
140+ anchors.right: successRate.left
141+ margin-right: 15
142+ !text: tr('Success Rate:')
143+
144+ Panel
145+ id: requiredItems
146+ width: 210
147+ height: 90
148+ anchors.left: parent.left
149+ anchors.bottom: parent.bottom
150+
151+ RequiredItem
152+ id: item1
153+ anchors.left: parent.left
154+
155+ RequiredItem
156+ id: item2
157+ margin-left: 10
158+ anchors.left: prev.right
159+
160+ RequiredItem
161+ id: item3
162+ margin-left: 10
163+ anchors.left: prev.right
164+
165+ UIButton
166+ id: protection
167+ width: 66
168+ height: 66
169+ anchors.top: prev.top
170+ anchors.left: prev.right
171+ image-source: /images/game/imbuing/100percent
172+ image-clip: 0 0 66 66
173+ margin-left: 15
174+ !tooltip: ("Bribe the fates! Click here to raise your chance to 100%. For guaranteed success use gold.")
175+
176+ FlatLabel
177+ id: protectionCost
178+ margin-top: 5
179+ text-align: center
180+ anchors.left: prev.left
181+ anchors.right: prev.right
182+ anchors.top: prev.bottom
183+
184+ UIWidget
185+ id: horizontalArrow
186+ anchors.left: prev.right
187+ anchors.verticalCenter: requiredItems.verticalCenter
188+ margin-left: 45
189+ width: 12
190+ height: 21
191+ image-source: /images/ui/arrow_horizontal
192+ image-rect: 0 0 12 21
193+ image-clip: 12 0 12 21
194+ phantom: false
195+
196+ UIButton
197+ id: imbue
198+ width: 128
199+ height: 66
200+ anchors.top: requiredItems.top
201+ anchors.right: parent.right
202+ image-source: /images/game/imbuing/imbue_empty
203+ image-clip: 0 0 128 66
204+ margin-left: 15
205+ !tooltip: tr("Click here to carry out the selected imbuement. This will consume the required astral sources and gold.")
206+
207+ $pressed:
208+ image-clip: 0 66 128 66
209+
210+ FlatLabel
211+ id: cost
212+ margin-top: 5
213+ text-align: center
214+ anchors.left: prev.left
215+ anchors.right: prev.right
216+ anchors.top: prev.bottom
217+
218+ClearImbue < Panel
219+ height: 240
220+ border: 1 black
221+ padding: 5
222+
223+ Label
224+ id: title
225+ anchors.top: parent.top
226+ anchors.left: parent.left
227+ anchors.right: parent.right
228+ text-align: center
229+ !text: tr("Clear Imbuement")
230+
231+ ComboBox
232+ id: groups
233+ anchors.top: title.bottom
234+ anchors.left: parent.left
235+ anchors.right: parent.HorizontalCenter
236+ margin-right: 3
237+ margin-top: 5
238+ enabled: false
239+
240+ ComboBox
241+ id: imbuement
242+ anchors.top: prev.top
243+ anchors.left: groups.right
244+ anchors.right: parent.right
245+ margin-left: 3
246+ enabled: false
247+
248+ Label
249+ id: description
250+ anchors.top: prev.bottom
251+ anchors.left: parent.left
252+ anchors.right: parent.right
253+ margin-top: 10
254+ height: 85
255+
256+ Label
257+ id: info
258+ anchors.bottom: prev.bottom
259+ anchors.left: parent.left
260+ !text: tr('Time remaining:')
261+
262+ Label
263+ id: clearImbuementTitle
264+ anchors.top: info.top
265+ anchors.right: parent.right
266+ !text: tr('Clear imbuement:')
267+
268+ Panel
269+ id: time
270+ width: 210
271+ height: 90
272+ anchors.left: parent.left
273+ anchors.bottom: parent.bottom
274+
275+ FlatLabel
276+ id: timeRemaining
277+ size: 86 25
278+ margin-bottom: 20
279+ text-align: center
280+ anchors.left: parent.left
281+ anchors.right: parent.right
282+ anchors.verticalCenter: parent.verticalCenter
283+
284+ UIButton
285+ id: clear
286+ width: 128
287+ height: 66
288+ anchors.top: time.top
289+ anchors.right: parent.right
290+ image-source: /images/game/imbuing/clear
291+ image-clip: 0 0 128 66
292+ margin-left: 15
293+ !tooltip: tr("Your needs have changed? Click here to clear the imbuement from your item for a fee.")
294+
295+ $pressed:
296+ image-clip: 0 66 128 66
297+
298+ FlatLabel
299+ id: cost
300+ margin-top: 5
301+ text-align: center
302+ anchors.left: prev.left
303+ anchors.right: prev.right
304+ anchors.top: prev.bottom
305+
306+
307+MainWindow
308+ id: imbuingWindow
309+ !text: tr('Imbue Item')
310+ size: 550 430
311+ background-color: #AAAAAA
312+ @onEscape: modules.game_imbuing.hide()
313+
314+ ItemInformation
315+ id: itemInfo
316+ anchors.left: parent.left
317+ anchors.top: parent.top
318+ anchors.right: parent.right
319+
320+ EmptyImbue
321+ id: emptyImbue
322+ anchors.left: parent.left
323+ anchors.top: prev.bottom
324+ anchors.right: parent.right
325+ margin-top: 5
326+
327+ ClearImbue
328+ id: clearImbue
329+ anchors.left: parent.left
330+ anchors.top: emptyImbue.top
331+ anchors.right: parent.right
332+
333+ Button
334+ id: close
335+ !text: tr('Close')
336+ width: 50
337+ anchors.right: parent.right
338+ anchors.bottom: parent.bottom
339+ @onClick: modules.game_imbuing.hide()
340+
341+ Label
342+ id: balance
343+ height: 25
344+ anchors.right: prev.left
345+ anchors.left: parent.left
346+ anchors.bottom: parent.bottom
A RD_Client/modules/game_interface/chat.png +0-0 View file
Binary file not shown.
Top