ItsCliffGaming
July 6th, 2024, 23:30
I am trying to create a (what I thought would be) relatively simple Extension, that would create a new UI element to display the number of Golden d20s the party has, which is a house rule we use. I was able to get it all created in its most basic form, but the numbers do not sync between the client and the host, and I am lost on how to make that connection.
golden_d20_tracker.lua
-- Create a global variable to store the window instance
local goldenD20Window = nil
function onInit()
-- Announce the extension loading
ChatManager.SystemMessage("Golden d20s Extension Loaded")
-- Create the UI
createUI()
-- Getting initial count
goldenD20Count = DB.getValue("campaign.golden_d20_count", 0)
-- Register a callback to update the UI when the golden d20 count changes
DB.addHandler("campaign.golden_d20_count", "onUpdate", updateGoldenD20Count)
end
function createUI()
-- Create a window to hold the Golden d20s UI
goldenD20Window = Interface.openWindow("goldend20_window", "")
if goldenD20Window then
goldenD20Window.updateGoldenD20Count = updateGoldenD20Count
goldenD20Window.increaseGoldenD20 = increaseGoldenD20
goldenD20Window.decreaseGoldenD20 = decreaseGoldenD20
updateGoldenD20Count()
else
ChatManager.SystemMessage("Failed to create Golden d20s UI")
end
end
function increaseGoldenD20()
local count = DB.getValue("campaign.golden_d20_count", 0)
DB.setValue("campaign.golden_d20_count", "number", count + 1)
end
function decreaseGoldenD20()
local count = DB.getValue("campaign.golden_d20_count", 0)
if count > 0 then
DB.setValue("campaign.golden_d20_count", "number", count - 1)
end
end
function updateGoldenD20Count()
if goldenD20Window then
local count = DB.getValue("campaign.golden_d20_count", 0)
goldenD20Window.golden_d20_count.setValue(count)
end
end
windowclass.xml
<root>
<windowclass name="goldend20_window">
<frame>goldend20_window</frame>
<placement>
<size>
<width>70</width>
<height>80</height>
</size>
</placement>
<sizelimits>
<width>70</width>
<height>80</height>
</sizelimits>
<playercontrol />
<sharable />
<noclose />
<tooltip>
<text>Golden d20</text>
</tooltip>
<sheetdata>
<!--<windowreferencecontrol>
<bounds>15,11,20,20</bounds>
<class>note</class>
<description>
<field>golden_d20_title</field>
</description>
</windowreferencecontrol>-->
<genericcontrol name="panel_bg">
<bounds>0,0,70,80</bounds>
<icon>panel_bg</icon>
<anchor>
<vertical>center</vertical>
</anchor>
</genericcontrol>
<basicnumber name="golden_d20_count">
<bounds>25,30,20,20</bounds>
<readonly>true</readonly>
<align>center</align>
</basicnumber>
<buttoncontrol name="decrease_golden_d20">
<bounds>25,53,20,20</bounds>
<icon>
<normal>g20_decrease</normal>
</icon>
<align>center</align>
<script>
function onButtonPress()
Interface.openWindow("goldend20_window", "").decreaseGoldenD20()
end
</script>
</buttoncontrol>
<buttoncontrol name="increase_golden_d20">
<bounds>25,7,20,20</bounds>
<icon>
<normal>g20_increase</normal>
</icon>
<script>
function onButtonPress()
Interface.openWindow("goldend20_window", "").increaseGoldenD20()
end
</script>
</buttoncontrol>
</sheetdata>
</windowclass>
</root>
---
Also, the other big piece that I was hoping to solve for was saving the "golden_d20_count" to an external text file, so I can call it in OBS to update/display the number to my Twitch chat.
Any and all help would be appreciated!
golden_d20_tracker.lua
-- Create a global variable to store the window instance
local goldenD20Window = nil
function onInit()
-- Announce the extension loading
ChatManager.SystemMessage("Golden d20s Extension Loaded")
-- Create the UI
createUI()
-- Getting initial count
goldenD20Count = DB.getValue("campaign.golden_d20_count", 0)
-- Register a callback to update the UI when the golden d20 count changes
DB.addHandler("campaign.golden_d20_count", "onUpdate", updateGoldenD20Count)
end
function createUI()
-- Create a window to hold the Golden d20s UI
goldenD20Window = Interface.openWindow("goldend20_window", "")
if goldenD20Window then
goldenD20Window.updateGoldenD20Count = updateGoldenD20Count
goldenD20Window.increaseGoldenD20 = increaseGoldenD20
goldenD20Window.decreaseGoldenD20 = decreaseGoldenD20
updateGoldenD20Count()
else
ChatManager.SystemMessage("Failed to create Golden d20s UI")
end
end
function increaseGoldenD20()
local count = DB.getValue("campaign.golden_d20_count", 0)
DB.setValue("campaign.golden_d20_count", "number", count + 1)
end
function decreaseGoldenD20()
local count = DB.getValue("campaign.golden_d20_count", 0)
if count > 0 then
DB.setValue("campaign.golden_d20_count", "number", count - 1)
end
end
function updateGoldenD20Count()
if goldenD20Window then
local count = DB.getValue("campaign.golden_d20_count", 0)
goldenD20Window.golden_d20_count.setValue(count)
end
end
windowclass.xml
<root>
<windowclass name="goldend20_window">
<frame>goldend20_window</frame>
<placement>
<size>
<width>70</width>
<height>80</height>
</size>
</placement>
<sizelimits>
<width>70</width>
<height>80</height>
</sizelimits>
<playercontrol />
<sharable />
<noclose />
<tooltip>
<text>Golden d20</text>
</tooltip>
<sheetdata>
<!--<windowreferencecontrol>
<bounds>15,11,20,20</bounds>
<class>note</class>
<description>
<field>golden_d20_title</field>
</description>
</windowreferencecontrol>-->
<genericcontrol name="panel_bg">
<bounds>0,0,70,80</bounds>
<icon>panel_bg</icon>
<anchor>
<vertical>center</vertical>
</anchor>
</genericcontrol>
<basicnumber name="golden_d20_count">
<bounds>25,30,20,20</bounds>
<readonly>true</readonly>
<align>center</align>
</basicnumber>
<buttoncontrol name="decrease_golden_d20">
<bounds>25,53,20,20</bounds>
<icon>
<normal>g20_decrease</normal>
</icon>
<align>center</align>
<script>
function onButtonPress()
Interface.openWindow("goldend20_window", "").decreaseGoldenD20()
end
</script>
</buttoncontrol>
<buttoncontrol name="increase_golden_d20">
<bounds>25,7,20,20</bounds>
<icon>
<normal>g20_increase</normal>
</icon>
<script>
function onButtonPress()
Interface.openWindow("goldend20_window", "").increaseGoldenD20()
end
</script>
</buttoncontrol>
</sheetdata>
</windowclass>
</root>
---
Also, the other big piece that I was hoping to solve for was saving the "golden_d20_count" to an external text file, so I can call it in OBS to update/display the number to my Twitch chat.
Any and all help would be appreciated!