Repository files navigation

PZ-Simple UI library

Want to make a simple menu for your mod to :

  • Ask the player to choose between two things?
  • Ask the player a nickname, age, height, weight, etc ?
  • Display a map ?
  • Display player-related information from your mod such as amount of money, time on server, etc ?
  • Warn players the start of an event ?
  • Make a job board systeme ?
  • And more ?

This mod is for you !

My mod is only an overlay of what the base game does to simplify placement, initializations and get the most useful functions of UIs.
This means that all elements are vanilla elements. So for example, buttons has access to all functions of ISButton and ISUIElement.
The windows itself is a derivate of ISCollapsableWindow.
It means you can add whatever you want to my UI like for the vanilla game if you want something specific. Here is a guide to understanding the basics of how the game does UIs. You can also copy an ISSimpleElement.lua to make a custom one.
Found all vanilla files in media/lua/client/ISUI of the game folder.
Note, an UI is the whole (window + elements) and the window is just the window object, without the elements.

Make my first window

A window created with my mod is composed of lines. On each line, there are elements. Elements are anything that can be in a UI like text or a button.

Step by step:

  1. Create a new UI with the NewUI() function. Here you have a window without elements.
  2. Add elements to the line. You can add as many elements as you want per line, the mod will take care of sizing them.
  3. Jump to the next line. When you added your elements, you jump to the next line with the function ui:nextLine().
  4. Repet 2.
  5. Once all line create, you just call ui:saveLayout() to finish creating the ui.

All useable function of UI here.
All elements here.
List of usefull vanilla function here.

As in the following diagram: alt text

I highly recommend doing the UIs in event OnCreateUI but you can do it anywhere.

Understand coordinates

  • Menus are in 2d.
  • Dimensions of 2d object are its position in x and y as well as its size in width and height.
  • x and y are coordinates of the left top corner.
  • Positions and sizes are in percentage of screen or in pixel.

Percent is to simplify and allow compatibility between different screen sizes. For example a width of 0.2 will take 20% of the screen.
alt text

You can also try to make your UI from scratch, I made a guide to understand the base.

Examples

Hello world

alt text

localfunctiononCreateUI()
localUI=NewUI();
UI:addText("", "Hello world", "Small", "Center")
UI:saveLayout()
endEvents.OnCreateUI.Add(onCreateUI)

Quest

alt text

See code
localUIlocaltext1="<H1> The longest night <BR> <SIZE:small> In this mission, you gonna need to survivre all night. <BR> <LEFT> Reward: <LINE> - M14 <LINE> - 20 ammo <BR> Failure Conditions: <LINE> -Death"localfunctionchoose(button, args)
getPlayer():Say(args.choice);
UI:close();
endlocalfunctiononCreateUI()
UI=NewUI();
UI:addRichText("rtext", text1); UI:setLineHeightPercent(0.2); UI:nextLine();
UI:addText("t1", "Accept ?", _, "Center");
UI["t1"]:setBorder(true);
UI:addButton("b1", "Yes", choose);
UI:addButton("b2", "No", choose);
UI["b1"]:addArg("choice", "yes");
UI["b2"]:addArg("choice", "no");
UI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Choose your team

alt text

See code
localUIlocaltext1="Players: <LINE> - MrBounty <LINE> - Dane <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx"localtext2="Players: <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx"localfunctionchoose(button, args)
getPlayer():Say("I'm in the " ..args.team.." team now !");
UI:close();
endlocalfunctiononCreateUI()
UI=NewUI();
UI:addText("", "Choose your team", "Large", "Center");
UI:nextLine();
UI:addRichText("", text1);
UI:addRichText("", text2);
UI:setLineHeightPercent(0.2);
UI:nextLine();
UI:addText("t1", "11/12", _, "Center");
UI:addText("t2", "9/12", _, "Center");
UI["t1"]:setColor(1, 0, 0, 1);
UI["t2"]:setColor(1, 1, 0, 0);
UI:nextLine();
UI:addButton("b1", "Blue", choose);
UI:addButton("b2", "Red", choose);
UI["b1"]:addArg("team", "blue");
UI["b2"]:addArg("team", "red");
UI:setBorderToAllElements(true);
UI:setWidthPercent(0.15);
UI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Choose a job

alt text

See code
localUIlocaljobSelect="";
-- Text for the rich text elementlocaltext1="<H1> Your a policeman ! <LINE> <SIZE:small> You are here to protect people ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext2="<H1> Your an engineer ! <LINE> <SIZE:small> You are here to create thing ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext3="<H1> Your a doctor ! <LINE> <SIZE:small> You are here to help people ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext4="<H1> Your nothing ! <LINE> <SIZE:small> You are here to die ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtexts= {text1, text2, text3, text4}
localjobs= {"Policeman", "Engineer", "Doctor", "Nothing"}
-- Functions for buttonslocalfunctionpress(button, args)
UI["rtext"]:setText(texts[args.index])
jobSelect=jobs[args.index]
getPlayer():Say("I selected " ..jobSelect);
endlocalfunctionok()
getPlayer():Say("I'm a " ..jobSelect.." now !");
UI:close();
end-- Create the UIlocalfunctiononCreateUI()
UI=NewUI(0.15);
-- Add window titleUI:addText("title1", "Choose you job !", "Title", "Center");
UI["title1"]:setBorder(true);
UI:nextLine();
-- Add job descriptionUI:addRichText("rtext", text1); UI:nextLine();
-- Add buttonsUI:addButton("button1", jobs[1], press);
UI:addButton("button2", jobs[2], press);
UI:addButton("button3", jobs[3], press);
UI:addButton("button4", jobs[4], press);
UI["button1"]:addArg("index", 1);
UI["button2"]:addArg("index", 2);
UI["button3"]:addArg("index", 3);
UI["button4"]:addArg("index", 4);
UI:addButton("", "Button", ok);
UI:nextLine();
-- Save windowUI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Job list

Example with 2 UI
alt text

See code
locallistUI, descUIlocaltext1="<H1> The longest night <BR> <SIZE:small> In this mission, you gonna need to survivre all night. <BR> <LEFT> Reward: <LINE> - M14 <LINE> - 20 ammo <BR> Failure Conditions: <LINE> -Death"localtext2="<H1> I need medical supply ! <BR> <SIZE:small> Please someone come to xx to help me ! I need a doctor or I'm gonna die. <BR> <LEFT> Reward: <LINE> - Everything I have"localtext3="<H1> Help me clean my neighborhood <BR> <SIZE:small> I need someone to help me fight a group of zombie near xx, there is around xx of them and I don't want to do it alone. <BR> <LEFT> Reward: <LINE> - 100$"localtext4="<H1> Looking for seed <BR> <SIZE:small> I'm looking for seed, every type of seed. I can pay or exchange. Contact me on my public frequencies xx.x."localitems= {};
items["EVENT - The longest night"] =text1;
items["URGENT - Medical delivery"] =text2;
items["Help me clean my neighborhood"] =text3;
items["Looking for seed"] =text4;
items["item5"] ="";
items["item6"] ="";
items["item7"] ="";
items["item8"] ="";
items["item9"] ="";
items["item10"] ="";
items["item11"] ="";
localfunctionchoose(button, args)
getPlayer():Say("I accepted this mission !");
listUI:close();
endlocalfunctionopenJobDesc(_, item)
descUI:open();
descUI:setPositionPixel(listUI:getX() +listUI:getWidth(), listUI:getY());
descUI["rtext"]:setText(item);
endlocalfunctiononCreateUI()
-- List UIlistUI=NewUI(); -- Create UIlistUI:setTitle("Job board");
listUI:setWidthPercent(0.15);
listUI:addScrollList("list", items); -- Create listlistUI["list"]:setOnMouseDownFunction(_, openJobDesc)
listUI:saveLayout(); -- Create window-- Description UIdescUI=NewUI();
descUI:setTitle("Job desc");
descUI:isSubUIOf(listUI);
descUI:setWidthPercent(0.1);
descUI:addEmpty(_, _, _, 10); -- Margin only for rich textdescUI:addRichText("rtext", ""); descUI:setLineHeightPercent(0.2); descUI:addEmpty(_, _, _, 10); -- Margin only for rich textdescUI:nextLine();
descUI:addButton("b1", "Accept ?", choose);
descUI:saveLayout();
descUI:close();
endEvents.OnCreateUI.Add(onCreateUI)

About

UI API for the game project zomboid

Resources

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

PZ-Simple UI library

Want to make a simple menu for your mod to :

  • Ask the player to choose between two things?
  • Ask the player a nickname, age, height, weight, etc ?
  • Display a map ?
  • Display player-related information from your mod such as amount of money, time on server, etc ?
  • Warn players the start of an event ?
  • Make a job board systeme ?
  • And more ?

This mod is for you !

My mod is only an overlay of what the base game does to simplify placement, initializations and get the most useful functions of UIs.
This means that all elements are vanilla elements. So for example, buttons has access to all functions of ISButton and ISUIElement.
The windows itself is a derivate of ISCollapsableWindow.
It means you can add whatever you want to my UI like for the vanilla game if you want something specific. Here is a guide to understanding the basics of how the game does UIs. You can also copy an ISSimpleElement.lua to make a custom one.
Found all vanilla files in media/lua/client/ISUI of the game folder.
Note, an UI is the whole (window + elements) and the window is just the window object, without the elements.

Make my first window

A window created with my mod is composed of lines. On each line, there are elements. Elements are anything that can be in a UI like text or a button.

Step by step:

  1. Create a new UI with the NewUI() function. Here you have a window without elements.
  2. Add elements to the line. You can add as many elements as you want per line, the mod will take care of sizing them.
  3. Jump to the next line. When you added your elements, you jump to the next line with the function ui:nextLine().
  4. Repet 2.
  5. Once all line create, you just call ui:saveLayout() to finish creating the ui.

All useable function of UI here.
All elements here.
List of usefull vanilla function here.

As in the following diagram: alt text

I highly recommend doing the UIs in event OnCreateUI but you can do it anywhere.

Understand coordinates

  • Menus are in 2d.
  • Dimensions of 2d object are its position in x and y as well as its size in width and height.
  • x and y are coordinates of the left top corner.
  • Positions and sizes are in percentage of screen or in pixel.

Percent is to simplify and allow compatibility between different screen sizes. For example a width of 0.2 will take 20% of the screen.
alt text

You can also try to make your UI from scratch, I made a guide to understand the base.

Examples

Hello world

alt text

localfunctiononCreateUI()
localUI=NewUI();
UI:addText("", "Hello world", "Small", "Center")
UI:saveLayout()
endEvents.OnCreateUI.Add(onCreateUI)

Quest

alt text

See code
localUIlocaltext1="<H1> The longest night <BR> <SIZE:small> In this mission, you gonna need to survivre all night. <BR> <LEFT> Reward: <LINE> - M14 <LINE> - 20 ammo <BR> Failure Conditions: <LINE> -Death"localfunctionchoose(button, args)
getPlayer():Say(args.choice);
UI:close();
endlocalfunctiononCreateUI()
UI=NewUI();
UI:addRichText("rtext", text1); UI:setLineHeightPercent(0.2); UI:nextLine();
UI:addText("t1", "Accept ?", _, "Center");
UI["t1"]:setBorder(true);
UI:addButton("b1", "Yes", choose);
UI:addButton("b2", "No", choose);
UI["b1"]:addArg("choice", "yes");
UI["b2"]:addArg("choice", "no");
UI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Choose your team

alt text

See code
localUIlocaltext1="Players: <LINE> - MrBounty <LINE> - Dane <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx"localtext2="Players: <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx"localfunctionchoose(button, args)
getPlayer():Say("I'm in the " ..args.team.." team now !");
UI:close();
endlocalfunctiononCreateUI()
UI=NewUI();
UI:addText("", "Choose your team", "Large", "Center");
UI:nextLine();
UI:addRichText("", text1);
UI:addRichText("", text2);
UI:setLineHeightPercent(0.2);
UI:nextLine();
UI:addText("t1", "11/12", _, "Center");
UI:addText("t2", "9/12", _, "Center");
UI["t1"]:setColor(1, 0, 0, 1);
UI["t2"]:setColor(1, 1, 0, 0);
UI:nextLine();
UI:addButton("b1", "Blue", choose);
UI:addButton("b2", "Red", choose);
UI["b1"]:addArg("team", "blue");
UI["b2"]:addArg("team", "red");
UI:setBorderToAllElements(true);
UI:setWidthPercent(0.15);
UI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Choose a job

alt text

See code
localUIlocaljobSelect="";
-- Text for the rich text elementlocaltext1="<H1> Your a policeman ! <LINE> <SIZE:small> You are here to protect people ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext2="<H1> Your an engineer ! <LINE> <SIZE:small> You are here to create thing ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext3="<H1> Your a doctor ! <LINE> <SIZE:small> You are here to help people ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext4="<H1> Your nothing ! <LINE> <SIZE:small> You are here to die ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtexts= {text1, text2, text3, text4}
localjobs= {"Policeman", "Engineer", "Doctor", "Nothing"}
-- Functions for buttonslocalfunctionpress(button, args)
UI["rtext"]:setText(texts[args.index])
jobSelect=jobs[args.index]
getPlayer():Say("I selected " ..jobSelect);
endlocalfunctionok()
getPlayer():Say("I'm a " ..jobSelect.." now !");
UI:close();
end-- Create the UIlocalfunctiononCreateUI()
UI=NewUI(0.15);
-- Add window titleUI:addText("title1", "Choose you job !", "Title", "Center");
UI["title1"]:setBorder(true);
UI:nextLine();
-- Add job descriptionUI:addRichText("rtext", text1); UI:nextLine();
-- Add buttonsUI:addButton("button1", jobs[1], press);
UI:addButton("button2", jobs[2], press);
UI:addButton("button3", jobs[3], press);
UI:addButton("button4", jobs[4], press);
UI["button1"]:addArg("index", 1);
UI["button2"]:addArg("index", 2);
UI["button3"]:addArg("index", 3);
UI["button4"]:addArg("index", 4);
UI:addButton("", "Button", ok);
UI:nextLine();
-- Save windowUI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Job list

Example with 2 UI
alt text

See code
locallistUI, descUIlocaltext1="<H1> The longest night <BR> <SIZE:small> In this mission, you gonna need to survivre all night. <BR> <LEFT> Reward: <LINE> - M14 <LINE> - 20 ammo <BR> Failure Conditions: <LINE> -Death"localtext2="<H1> I need medical supply ! <BR> <SIZE:small> Please someone come to xx to help me ! I need a doctor or I'm gonna die. <BR> <LEFT> Reward: <LINE> - Everything I have"localtext3="<H1> Help me clean my neighborhood <BR> <SIZE:small> I need someone to help me fight a group of zombie near xx, there is around xx of them and I don't want to do it alone. <BR> <LEFT> Reward: <LINE> - 100$"localtext4="<H1> Looking for seed <BR> <SIZE:small> I'm looking for seed, every type of seed. I can pay or exchange. Contact me on my public frequencies xx.x."localitems= {};
items["EVENT - The longest night"] =text1;
items["URGENT - Medical delivery"] =text2;
items["Help me clean my neighborhood"] =text3;
items["Looking for seed"] =text4;
items["item5"] ="";
items["item6"] ="";
items["item7"] ="";
items["item8"] ="";
items["item9"] ="";
items["item10"] ="";
items["item11"] ="";
localfunctionchoose(button, args)
getPlayer():Say("I accepted this mission !");
listUI:close();
endlocalfunctionopenJobDesc(_, item)
descUI:open();
descUI:setPositionPixel(listUI:getX() +listUI:getWidth(), listUI:getY());
descUI["rtext"]:setText(item);
endlocalfunctiononCreateUI()
-- List UIlistUI=NewUI(); -- Create UIlistUI:setTitle("Job board");
listUI:setWidthPercent(0.15);
listUI:addScrollList("list", items); -- Create listlistUI["list"]:setOnMouseDownFunction(_, openJobDesc)
listUI:saveLayout(); -- Create window-- Description UIdescUI=NewUI();
descUI:setTitle("Job desc");
descUI:isSubUIOf(listUI);
descUI:setWidthPercent(0.1);
descUI:addEmpty(_, _, _, 10); -- Margin only for rich textdescUI:addRichText("rtext", ""); descUI:setLineHeightPercent(0.2); descUI:addEmpty(_, _, _, 10); -- Margin only for rich textdescUI:nextLine();
descUI:addButton("b1", "Accept ?", choose);
descUI:saveLayout();
descUI:close();
endEvents.OnCreateUI.Add(onCreateUI)

About

UI API for the game project zomboid

Resources

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

PZ-Simple UI library

Want to make a simple menu for your mod to :

  • Ask the player to choose between two things?
  • Ask the player a nickname, age, height, weight, etc ?
  • Display a map ?
  • Display player-related information from your mod such as amount of money, time on server, etc ?
  • Warn players the start of an event ?
  • Make a job board systeme ?
  • And more ?

This mod is for you !

My mod is only an overlay of what the base game does to simplify placement, initializations and get the most useful functions of UIs.
This means that all elements are vanilla elements. So for example, buttons has access to all functions of ISButton and ISUIElement.
The windows itself is a derivate of ISCollapsableWindow.
It means you can add whatever you want to my UI like for the vanilla game if you want something specific. Here is a guide to understanding the basics of how the game does UIs. You can also copy an ISSimpleElement.lua to make a custom one.
Found all vanilla files in media/lua/client/ISUI of the game folder.
Note, an UI is the whole (window + elements) and the window is just the window object, without the elements.

Make my first window

A window created with my mod is composed of lines. On each line, there are elements. Elements are anything that can be in a UI like text or a button.

Step by step:

  1. Create a new UI with the NewUI() function. Here you have a window without elements.
  2. Add elements to the line. You can add as many elements as you want per line, the mod will take care of sizing them.
  3. Jump to the next line. When you added your elements, you jump to the next line with the function ui:nextLine().
  4. Repet 2.
  5. Once all line create, you just call ui:saveLayout() to finish creating the ui.

All useable function of UI here.
All elements here.
List of usefull vanilla function here.

As in the following diagram: alt text

I highly recommend doing the UIs in event OnCreateUI but you can do it anywhere.

Understand coordinates

  • Menus are in 2d.
  • Dimensions of 2d object are its position in x and y as well as its size in width and height.
  • x and y are coordinates of the left top corner.
  • Positions and sizes are in percentage of screen or in pixel.

Percent is to simplify and allow compatibility between different screen sizes. For example a width of 0.2 will take 20% of the screen.
alt text

You can also try to make your UI from scratch, I made a guide to understand the base.

Examples

Hello world

alt text

localfunctiononCreateUI()
localUI=NewUI();
UI:addText("", "Hello world", "Small", "Center")
UI:saveLayout()
endEvents.OnCreateUI.Add(onCreateUI)

Quest

alt text

See code
localUIlocaltext1="<H1> The longest night <BR> <SIZE:small> In this mission, you gonna need to survivre all night. <BR> <LEFT> Reward: <LINE> - M14 <LINE> - 20 ammo <BR> Failure Conditions: <LINE> -Death"localfunctionchoose(button, args)
getPlayer():Say(args.choice);
UI:close();
endlocalfunctiononCreateUI()
UI=NewUI();
UI:addRichText("rtext", text1); UI:setLineHeightPercent(0.2); UI:nextLine();
UI:addText("t1", "Accept ?", _, "Center");
UI["t1"]:setBorder(true);
UI:addButton("b1", "Yes", choose);
UI:addButton("b2", "No", choose);
UI["b1"]:addArg("choice", "yes");
UI["b2"]:addArg("choice", "no");
UI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Choose your team

alt text

See code
localUIlocaltext1="Players: <LINE> - MrBounty <LINE> - Dane <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx"localtext2="Players: <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx"localfunctionchoose(button, args)
getPlayer():Say("I'm in the " ..args.team.." team now !");
UI:close();
endlocalfunctiononCreateUI()
UI=NewUI();
UI:addText("", "Choose your team", "Large", "Center");
UI:nextLine();
UI:addRichText("", text1);
UI:addRichText("", text2);
UI:setLineHeightPercent(0.2);
UI:nextLine();
UI:addText("t1", "11/12", _, "Center");
UI:addText("t2", "9/12", _, "Center");
UI["t1"]:setColor(1, 0, 0, 1);
UI["t2"]:setColor(1, 1, 0, 0);
UI:nextLine();
UI:addButton("b1", "Blue", choose);
UI:addButton("b2", "Red", choose);
UI["b1"]:addArg("team", "blue");
UI["b2"]:addArg("team", "red");
UI:setBorderToAllElements(true);
UI:setWidthPercent(0.15);
UI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Choose a job

alt text

See code
localUIlocaljobSelect="";
-- Text for the rich text elementlocaltext1="<H1> Your a policeman ! <LINE> <SIZE:small> You are here to protect people ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext2="<H1> Your an engineer ! <LINE> <SIZE:small> You are here to create thing ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext3="<H1> Your a doctor ! <LINE> <SIZE:small> You are here to help people ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext4="<H1> Your nothing ! <LINE> <SIZE:small> You are here to die ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtexts= {text1, text2, text3, text4}
localjobs= {"Policeman", "Engineer", "Doctor", "Nothing"}
-- Functions for buttonslocalfunctionpress(button, args)
UI["rtext"]:setText(texts[args.index])
jobSelect=jobs[args.index]
getPlayer():Say("I selected " ..jobSelect);
endlocalfunctionok()
getPlayer():Say("I'm a " ..jobSelect.." now !");
UI:close();
end-- Create the UIlocalfunctiononCreateUI()
UI=NewUI(0.15);
-- Add window titleUI:addText("title1", "Choose you job !", "Title", "Center");
UI["title1"]:setBorder(true);
UI:nextLine();
-- Add job descriptionUI:addRichText("rtext", text1); UI:nextLine();
-- Add buttonsUI:addButton("button1", jobs[1], press);
UI:addButton("button2", jobs[2], press);
UI:addButton("button3", jobs[3], press);
UI:addButton("button4", jobs[4], press);
UI["button1"]:addArg("index", 1);
UI["button2"]:addArg("index", 2);
UI["button3"]:addArg("index", 3);
UI["button4"]:addArg("index", 4);
UI:addButton("", "Button", ok);
UI:nextLine();
-- Save windowUI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Job list

Example with 2 UI
alt text

See code
locallistUI, descUIlocaltext1="<H1> The longest night <BR> <SIZE:small> In this mission, you gonna need to survivre all night. <BR> <LEFT> Reward: <LINE> - M14 <LINE> - 20 ammo <BR> Failure Conditions: <LINE> -Death"localtext2="<H1> I need medical supply ! <BR> <SIZE:small> Please someone come to xx to help me ! I need a doctor or I'm gonna die. <BR> <LEFT> Reward: <LINE> - Everything I have"localtext3="<H1> Help me clean my neighborhood <BR> <SIZE:small> I need someone to help me fight a group of zombie near xx, there is around xx of them and I don't want to do it alone. <BR> <LEFT> Reward: <LINE> - 100$"localtext4="<H1> Looking for seed <BR> <SIZE:small> I'm looking for seed, every type of seed. I can pay or exchange. Contact me on my public frequencies xx.x."localitems= {};
items["EVENT - The longest night"] =text1;
items["URGENT - Medical delivery"] =text2;
items["Help me clean my neighborhood"] =text3;
items["Looking for seed"] =text4;
items["item5"] ="";
items["item6"] ="";
items["item7"] ="";
items["item8"] ="";
items["item9"] ="";
items["item10"] ="";
items["item11"] ="";
localfunctionchoose(button, args)
getPlayer():Say("I accepted this mission !");
listUI:close();
endlocalfunctionopenJobDesc(_, item)
descUI:open();
descUI:setPositionPixel(listUI:getX() +listUI:getWidth(), listUI:getY());
descUI["rtext"]:setText(item);
endlocalfunctiononCreateUI()
-- List UIlistUI=NewUI(); -- Create UIlistUI:setTitle("Job board");
listUI:setWidthPercent(0.15);
listUI:addScrollList("list", items); -- Create listlistUI["list"]:setOnMouseDownFunction(_, openJobDesc)
listUI:saveLayout(); -- Create window-- Description UIdescUI=NewUI();
descUI:setTitle("Job desc");
descUI:isSubUIOf(listUI);
descUI:setWidthPercent(0.1);
descUI:addEmpty(_, _, _, 10); -- Margin only for rich textdescUI:addRichText("rtext", ""); descUI:setLineHeightPercent(0.2); descUI:addEmpty(_, _, _, 10); -- Margin only for rich textdescUI:nextLine();
descUI:addButton("b1", "Accept ?", choose);
descUI:saveLayout();
descUI:close();
endEvents.OnCreateUI.Add(onCreateUI)

About

UI API for the game project zomboid

Resources

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

PZ-Simple UI library

Want to make a simple menu for your mod to :

  • Ask the player to choose between two things?
  • Ask the player a nickname, age, height, weight, etc ?
  • Display a map ?
  • Display player-related information from your mod such as amount of money, time on server, etc ?
  • Warn players the start of an event ?
  • Make a job board systeme ?
  • And more ?

This mod is for you !

My mod is only an overlay of what the base game does to simplify placement, initializations and get the most useful functions of UIs.
This means that all elements are vanilla elements. So for example, buttons has access to all functions of ISButton and ISUIElement.
The windows itself is a derivate of ISCollapsableWindow.
It means you can add whatever you want to my UI like for the vanilla game if you want something specific. Here is a guide to understanding the basics of how the game does UIs. You can also copy an ISSimpleElement.lua to make a custom one.
Found all vanilla files in media/lua/client/ISUI of the game folder.
Note, an UI is the whole (window + elements) and the window is just the window object, without the elements.

Make my first window

A window created with my mod is composed of lines. On each line, there are elements. Elements are anything that can be in a UI like text or a button.

Step by step:

  1. Create a new UI with the NewUI() function. Here you have a window without elements.
  2. Add elements to the line. You can add as many elements as you want per line, the mod will take care of sizing them.
  3. Jump to the next line. When you added your elements, you jump to the next line with the function ui:nextLine().
  4. Repet 2.
  5. Once all line create, you just call ui:saveLayout() to finish creating the ui.

All useable function of UI here.
All elements here.
List of usefull vanilla function here.

As in the following diagram: alt text

I highly recommend doing the UIs in event OnCreateUI but you can do it anywhere.

Understand coordinates

  • Menus are in 2d.
  • Dimensions of 2d object are its position in x and y as well as its size in width and height.
  • x and y are coordinates of the left top corner.
  • Positions and sizes are in percentage of screen or in pixel.

Percent is to simplify and allow compatibility between different screen sizes. For example a width of 0.2 will take 20% of the screen.
alt text

You can also try to make your UI from scratch, I made a guide to understand the base.

Examples

Hello world

alt text

localfunctiononCreateUI()
localUI=NewUI();
UI:addText("", "Hello world", "Small", "Center")
UI:saveLayout()
endEvents.OnCreateUI.Add(onCreateUI)

Quest

alt text

See code
localUIlocaltext1="<H1> The longest night <BR> <SIZE:small> In this mission, you gonna need to survivre all night. <BR> <LEFT> Reward: <LINE> - M14 <LINE> - 20 ammo <BR> Failure Conditions: <LINE> -Death"localfunctionchoose(button, args)
getPlayer():Say(args.choice);
UI:close();
endlocalfunctiononCreateUI()
UI=NewUI();
UI:addRichText("rtext", text1); UI:setLineHeightPercent(0.2); UI:nextLine();
UI:addText("t1", "Accept ?", _, "Center");
UI["t1"]:setBorder(true);
UI:addButton("b1", "Yes", choose);
UI:addButton("b2", "No", choose);
UI["b1"]:addArg("choice", "yes");
UI["b2"]:addArg("choice", "no");
UI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Choose your team

alt text

See code
localUIlocaltext1="Players: <LINE> - MrBounty <LINE> - Dane <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx"localtext2="Players: <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx"localfunctionchoose(button, args)
getPlayer():Say("I'm in the " ..args.team.." team now !");
UI:close();
endlocalfunctiononCreateUI()
UI=NewUI();
UI:addText("", "Choose your team", "Large", "Center");
UI:nextLine();
UI:addRichText("", text1);
UI:addRichText("", text2);
UI:setLineHeightPercent(0.2);
UI:nextLine();
UI:addText("t1", "11/12", _, "Center");
UI:addText("t2", "9/12", _, "Center");
UI["t1"]:setColor(1, 0, 0, 1);
UI["t2"]:setColor(1, 1, 0, 0);
UI:nextLine();
UI:addButton("b1", "Blue", choose);
UI:addButton("b2", "Red", choose);
UI["b1"]:addArg("team", "blue");
UI["b2"]:addArg("team", "red");
UI:setBorderToAllElements(true);
UI:setWidthPercent(0.15);
UI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Choose a job

alt text

See code
localUIlocaljobSelect="";
-- Text for the rich text elementlocaltext1="<H1> Your a policeman ! <LINE> <SIZE:small> You are here to protect people ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext2="<H1> Your an engineer ! <LINE> <SIZE:small> You are here to create thing ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext3="<H1> Your a doctor ! <LINE> <SIZE:small> You are here to help people ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext4="<H1> Your nothing ! <LINE> <SIZE:small> You are here to die ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtexts= {text1, text2, text3, text4}
localjobs= {"Policeman", "Engineer", "Doctor", "Nothing"}
-- Functions for buttonslocalfunctionpress(button, args)
UI["rtext"]:setText(texts[args.index])
jobSelect=jobs[args.index]
getPlayer():Say("I selected " ..jobSelect);
endlocalfunctionok()
getPlayer():Say("I'm a " ..jobSelect.." now !");
UI:close();
end-- Create the UIlocalfunctiononCreateUI()
UI=NewUI(0.15);
-- Add window titleUI:addText("title1", "Choose you job !", "Title", "Center");
UI["title1"]:setBorder(true);
UI:nextLine();
-- Add job descriptionUI:addRichText("rtext", text1); UI:nextLine();
-- Add buttonsUI:addButton("button1", jobs[1], press);
UI:addButton("button2", jobs[2], press);
UI:addButton("button3", jobs[3], press);
UI:addButton("button4", jobs[4], press);
UI["button1"]:addArg("index", 1);
UI["button2"]:addArg("index", 2);
UI["button3"]:addArg("index", 3);
UI["button4"]:addArg("index", 4);
UI:addButton("", "Button", ok);
UI:nextLine();
-- Save windowUI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Job list

Example with 2 UI
alt text

See code
locallistUI, descUIlocaltext1="<H1> The longest night <BR> <SIZE:small> In this mission, you gonna need to survivre all night. <BR> <LEFT> Reward: <LINE> - M14 <LINE> - 20 ammo <BR> Failure Conditions: <LINE> -Death"localtext2="<H1> I need medical supply ! <BR> <SIZE:small> Please someone come to xx to help me ! I need a doctor or I'm gonna die. <BR> <LEFT> Reward: <LINE> - Everything I have"localtext3="<H1> Help me clean my neighborhood <BR> <SIZE:small> I need someone to help me fight a group of zombie near xx, there is around xx of them and I don't want to do it alone. <BR> <LEFT> Reward: <LINE> - 100$"localtext4="<H1> Looking for seed <BR> <SIZE:small> I'm looking for seed, every type of seed. I can pay or exchange. Contact me on my public frequencies xx.x."localitems= {};
items["EVENT - The longest night"] =text1;
items["URGENT - Medical delivery"] =text2;
items["Help me clean my neighborhood"] =text3;
items["Looking for seed"] =text4;
items["item5"] ="";
items["item6"] ="";
items["item7"] ="";
items["item8"] ="";
items["item9"] ="";
items["item10"] ="";
items["item11"] ="";
localfunctionchoose(button, args)
getPlayer():Say("I accepted this mission !");
listUI:close();
endlocalfunctionopenJobDesc(_, item)
descUI:open();
descUI:setPositionPixel(listUI:getX() +listUI:getWidth(), listUI:getY());
descUI["rtext"]:setText(item);
endlocalfunctiononCreateUI()
-- List UIlistUI=NewUI(); -- Create UIlistUI:setTitle("Job board");
listUI:setWidthPercent(0.15);
listUI:addScrollList("list", items); -- Create listlistUI["list"]:setOnMouseDownFunction(_, openJobDesc)
listUI:saveLayout(); -- Create window-- Description UIdescUI=NewUI();
descUI:setTitle("Job desc");
descUI:isSubUIOf(listUI);
descUI:setWidthPercent(0.1);
descUI:addEmpty(_, _, _, 10); -- Margin only for rich textdescUI:addRichText("rtext", ""); descUI:setLineHeightPercent(0.2); descUI:addEmpty(_, _, _, 10); -- Margin only for rich textdescUI:nextLine();
descUI:addButton("b1", "Accept ?", choose);
descUI:saveLayout();
descUI:close();
endEvents.OnCreateUI.Add(onCreateUI)

About

UI API for the game project zomboid

Resources

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

PZ-Simple UI library

Want to make a simple menu for your mod to :

  • Ask the player to choose between two things?
  • Ask the player a nickname, age, height, weight, etc ?
  • Display a map ?
  • Display player-related information from your mod such as amount of money, time on server, etc ?
  • Warn players the start of an event ?
  • Make a job board systeme ?
  • And more ?

This mod is for you !

My mod is only an overlay of what the base game does to simplify placement, initializations and get the most useful functions of UIs.
This means that all elements are vanilla elements. So for example, buttons has access to all functions of ISButton and ISUIElement.
The windows itself is a derivate of ISCollapsableWindow.
It means you can add whatever you want to my UI like for the vanilla game if you want something specific. Here is a guide to understanding the basics of how the game does UIs. You can also copy an ISSimpleElement.lua to make a custom one.
Found all vanilla files in media/lua/client/ISUI of the game folder.
Note, an UI is the whole (window + elements) and the window is just the window object, without the elements.

Make my first window

A window created with my mod is composed of lines. On each line, there are elements. Elements are anything that can be in a UI like text or a button.

Step by step:

  1. Create a new UI with the NewUI() function. Here you have a window without elements.
  2. Add elements to the line. You can add as many elements as you want per line, the mod will take care of sizing them.
  3. Jump to the next line. When you added your elements, you jump to the next line with the function ui:nextLine().
  4. Repet 2.
  5. Once all line create, you just call ui:saveLayout() to finish creating the ui.

All useable function of UI here.
All elements here.
List of usefull vanilla function here.

As in the following diagram: alt text

I highly recommend doing the UIs in event OnCreateUI but you can do it anywhere.

Understand coordinates

  • Menus are in 2d.
  • Dimensions of 2d object are its position in x and y as well as its size in width and height.
  • x and y are coordinates of the left top corner.
  • Positions and sizes are in percentage of screen or in pixel.

Percent is to simplify and allow compatibility between different screen sizes. For example a width of 0.2 will take 20% of the screen.
alt text

You can also try to make your UI from scratch, I made a guide to understand the base.

Examples

Hello world

alt text

localfunctiononCreateUI()
localUI=NewUI();
UI:addText("", "Hello world", "Small", "Center")
UI:saveLayout()
endEvents.OnCreateUI.Add(onCreateUI)

Quest

alt text

See code
localUIlocaltext1="<H1> The longest night <BR> <SIZE:small> In this mission, you gonna need to survivre all night. <BR> <LEFT> Reward: <LINE> - M14 <LINE> - 20 ammo <BR> Failure Conditions: <LINE> -Death"localfunctionchoose(button, args)
getPlayer():Say(args.choice);
UI:close();
endlocalfunctiononCreateUI()
UI=NewUI();
UI:addRichText("rtext", text1); UI:setLineHeightPercent(0.2); UI:nextLine();
UI:addText("t1", "Accept ?", _, "Center");
UI["t1"]:setBorder(true);
UI:addButton("b1", "Yes", choose);
UI:addButton("b2", "No", choose);
UI["b1"]:addArg("choice", "yes");
UI["b2"]:addArg("choice", "no");
UI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Choose your team

alt text

See code
localUIlocaltext1="Players: <LINE> - MrBounty <LINE> - Dane <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx"localtext2="Players: <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx"localfunctionchoose(button, args)
getPlayer():Say("I'm in the " ..args.team.." team now !");
UI:close();
endlocalfunctiononCreateUI()
UI=NewUI();
UI:addText("", "Choose your team", "Large", "Center");
UI:nextLine();
UI:addRichText("", text1);
UI:addRichText("", text2);
UI:setLineHeightPercent(0.2);
UI:nextLine();
UI:addText("t1", "11/12", _, "Center");
UI:addText("t2", "9/12", _, "Center");
UI["t1"]:setColor(1, 0, 0, 1);
UI["t2"]:setColor(1, 1, 0, 0);
UI:nextLine();
UI:addButton("b1", "Blue", choose);
UI:addButton("b2", "Red", choose);
UI["b1"]:addArg("team", "blue");
UI["b2"]:addArg("team", "red");
UI:setBorderToAllElements(true);
UI:setWidthPercent(0.15);
UI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Choose a job

alt text

See code
localUIlocaljobSelect="";
-- Text for the rich text elementlocaltext1="<H1> Your a policeman ! <LINE> <SIZE:small> You are here to protect people ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext2="<H1> Your an engineer ! <LINE> <SIZE:small> You are here to create thing ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext3="<H1> Your a doctor ! <LINE> <SIZE:small> You are here to help people ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext4="<H1> Your nothing ! <LINE> <SIZE:small> You are here to die ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtexts= {text1, text2, text3, text4}
localjobs= {"Policeman", "Engineer", "Doctor", "Nothing"}
-- Functions for buttonslocalfunctionpress(button, args)
UI["rtext"]:setText(texts[args.index])
jobSelect=jobs[args.index]
getPlayer():Say("I selected " ..jobSelect);
endlocalfunctionok()
getPlayer():Say("I'm a " ..jobSelect.." now !");
UI:close();
end-- Create the UIlocalfunctiononCreateUI()
UI=NewUI(0.15);
-- Add window titleUI:addText("title1", "Choose you job !", "Title", "Center");
UI["title1"]:setBorder(true);
UI:nextLine();
-- Add job descriptionUI:addRichText("rtext", text1); UI:nextLine();
-- Add buttonsUI:addButton("button1", jobs[1], press);
UI:addButton("button2", jobs[2], press);
UI:addButton("button3", jobs[3], press);
UI:addButton("button4", jobs[4], press);
UI["button1"]:addArg("index", 1);
UI["button2"]:addArg("index", 2);
UI["button3"]:addArg("index", 3);
UI["button4"]:addArg("index", 4);
UI:addButton("", "Button", ok);
UI:nextLine();
-- Save windowUI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Job list

Example with 2 UI
alt text

See code
locallistUI, descUIlocaltext1="<H1> The longest night <BR> <SIZE:small> In this mission, you gonna need to survivre all night. <BR> <LEFT> Reward: <LINE> - M14 <LINE> - 20 ammo <BR> Failure Conditions: <LINE> -Death"localtext2="<H1> I need medical supply ! <BR> <SIZE:small> Please someone come to xx to help me ! I need a doctor or I'm gonna die. <BR> <LEFT> Reward: <LINE> - Everything I have"localtext3="<H1> Help me clean my neighborhood <BR> <SIZE:small> I need someone to help me fight a group of zombie near xx, there is around xx of them and I don't want to do it alone. <BR> <LEFT> Reward: <LINE> - 100$"localtext4="<H1> Looking for seed <BR> <SIZE:small> I'm looking for seed, every type of seed. I can pay or exchange. Contact me on my public frequencies xx.x."localitems= {};
items["EVENT - The longest night"] =text1;
items["URGENT - Medical delivery"] =text2;
items["Help me clean my neighborhood"] =text3;
items["Looking for seed"] =text4;
items["item5"] ="";
items["item6"] ="";
items["item7"] ="";
items["item8"] ="";
items["item9"] ="";
items["item10"] ="";
items["item11"] ="";
localfunctionchoose(button, args)
getPlayer():Say("I accepted this mission !");
listUI:close();
endlocalfunctionopenJobDesc(_, item)
descUI:open();
descUI:setPositionPixel(listUI:getX() +listUI:getWidth(), listUI:getY());
descUI["rtext"]:setText(item);
endlocalfunctiononCreateUI()
-- List UIlistUI=NewUI(); -- Create UIlistUI:setTitle("Job board");
listUI:setWidthPercent(0.15);
listUI:addScrollList("list", items); -- Create listlistUI["list"]:setOnMouseDownFunction(_, openJobDesc)
listUI:saveLayout(); -- Create window-- Description UIdescUI=NewUI();
descUI:setTitle("Job desc");
descUI:isSubUIOf(listUI);
descUI:setWidthPercent(0.1);
descUI:addEmpty(_, _, _, 10); -- Margin only for rich textdescUI:addRichText("rtext", ""); descUI:setLineHeightPercent(0.2); descUI:addEmpty(_, _, _, 10); -- Margin only for rich textdescUI:nextLine();
descUI:addButton("b1", "Accept ?", choose);
descUI:saveLayout();
descUI:close();
endEvents.OnCreateUI.Add(onCreateUI)

About

UI API for the game project zomboid

Resources

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

PZ-Simple UI library

Want to make a simple menu for your mod to :

  • Ask the player to choose between two things?
  • Ask the player a nickname, age, height, weight, etc ?
  • Display a map ?
  • Display player-related information from your mod such as amount of money, time on server, etc ?
  • Warn players the start of an event ?
  • Make a job board systeme ?
  • And more ?

This mod is for you !

My mod is only an overlay of what the base game does to simplify placement, initializations and get the most useful functions of UIs.
This means that all elements are vanilla elements. So for example, buttons has access to all functions of ISButton and ISUIElement.
The windows itself is a derivate of ISCollapsableWindow.
It means you can add whatever you want to my UI like for the vanilla game if you want something specific. Here is a guide to understanding the basics of how the game does UIs. You can also copy an ISSimpleElement.lua to make a custom one.
Found all vanilla files in media/lua/client/ISUI of the game folder.
Note, an UI is the whole (window + elements) and the window is just the window object, without the elements.

Make my first window

A window created with my mod is composed of lines. On each line, there are elements. Elements are anything that can be in a UI like text or a button.

Step by step:

  1. Create a new UI with the NewUI() function. Here you have a window without elements.
  2. Add elements to the line. You can add as many elements as you want per line, the mod will take care of sizing them.
  3. Jump to the next line. When you added your elements, you jump to the next line with the function ui:nextLine().
  4. Repet 2.
  5. Once all line create, you just call ui:saveLayout() to finish creating the ui.

All useable function of UI here.
All elements here.
List of usefull vanilla function here.

As in the following diagram: alt text

I highly recommend doing the UIs in event OnCreateUI but you can do it anywhere.

Understand coordinates

  • Menus are in 2d.
  • Dimensions of 2d object are its position in x and y as well as its size in width and height.
  • x and y are coordinates of the left top corner.
  • Positions and sizes are in percentage of screen or in pixel.

Percent is to simplify and allow compatibility between different screen sizes. For example a width of 0.2 will take 20% of the screen.
alt text

You can also try to make your UI from scratch, I made a guide to understand the base.

Examples

Hello world

alt text

localfunctiononCreateUI()
localUI=NewUI();
UI:addText("", "Hello world", "Small", "Center")
UI:saveLayout()
endEvents.OnCreateUI.Add(onCreateUI)

Quest

alt text

See code
localUIlocaltext1="<H1> The longest night <BR> <SIZE:small> In this mission, you gonna need to survivre all night. <BR> <LEFT> Reward: <LINE> - M14 <LINE> - 20 ammo <BR> Failure Conditions: <LINE> -Death"localfunctionchoose(button, args)
getPlayer():Say(args.choice);
UI:close();
endlocalfunctiononCreateUI()
UI=NewUI();
UI:addRichText("rtext", text1); UI:setLineHeightPercent(0.2); UI:nextLine();
UI:addText("t1", "Accept ?", _, "Center");
UI["t1"]:setBorder(true);
UI:addButton("b1", "Yes", choose);
UI:addButton("b2", "No", choose);
UI["b1"]:addArg("choice", "yes");
UI["b2"]:addArg("choice", "no");
UI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Choose your team

alt text

See code
localUIlocaltext1="Players: <LINE> - MrBounty <LINE> - Dane <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx"localtext2="Players: <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx"localfunctionchoose(button, args)
getPlayer():Say("I'm in the " ..args.team.." team now !");
UI:close();
endlocalfunctiononCreateUI()
UI=NewUI();
UI:addText("", "Choose your team", "Large", "Center");
UI:nextLine();
UI:addRichText("", text1);
UI:addRichText("", text2);
UI:setLineHeightPercent(0.2);
UI:nextLine();
UI:addText("t1", "11/12", _, "Center");
UI:addText("t2", "9/12", _, "Center");
UI["t1"]:setColor(1, 0, 0, 1);
UI["t2"]:setColor(1, 1, 0, 0);
UI:nextLine();
UI:addButton("b1", "Blue", choose);
UI:addButton("b2", "Red", choose);
UI["b1"]:addArg("team", "blue");
UI["b2"]:addArg("team", "red");
UI:setBorderToAllElements(true);
UI:setWidthPercent(0.15);
UI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Choose a job

alt text

See code
localUIlocaljobSelect="";
-- Text for the rich text elementlocaltext1="<H1> Your a policeman ! <LINE> <SIZE:small> You are here to protect people ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext2="<H1> Your an engineer ! <LINE> <SIZE:small> You are here to create thing ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext3="<H1> Your a doctor ! <LINE> <SIZE:small> You are here to help people ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext4="<H1> Your nothing ! <LINE> <SIZE:small> You are here to die ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtexts= {text1, text2, text3, text4}
localjobs= {"Policeman", "Engineer", "Doctor", "Nothing"}
-- Functions for buttonslocalfunctionpress(button, args)
UI["rtext"]:setText(texts[args.index])
jobSelect=jobs[args.index]
getPlayer():Say("I selected " ..jobSelect);
endlocalfunctionok()
getPlayer():Say("I'm a " ..jobSelect.." now !");
UI:close();
end-- Create the UIlocalfunctiononCreateUI()
UI=NewUI(0.15);
-- Add window titleUI:addText("title1", "Choose you job !", "Title", "Center");
UI["title1"]:setBorder(true);
UI:nextLine();
-- Add job descriptionUI:addRichText("rtext", text1); UI:nextLine();
-- Add buttonsUI:addButton("button1", jobs[1], press);
UI:addButton("button2", jobs[2], press);
UI:addButton("button3", jobs[3], press);
UI:addButton("button4", jobs[4], press);
UI["button1"]:addArg("index", 1);
UI["button2"]:addArg("index", 2);
UI["button3"]:addArg("index", 3);
UI["button4"]:addArg("index", 4);
UI:addButton("", "Button", ok);
UI:nextLine();
-- Save windowUI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Job list

Example with 2 UI
alt text

See code
locallistUI, descUIlocaltext1="<H1> The longest night <BR> <SIZE:small> In this mission, you gonna need to survivre all night. <BR> <LEFT> Reward: <LINE> - M14 <LINE> - 20 ammo <BR> Failure Conditions: <LINE> -Death"localtext2="<H1> I need medical supply ! <BR> <SIZE:small> Please someone come to xx to help me ! I need a doctor or I'm gonna die. <BR> <LEFT> Reward: <LINE> - Everything I have"localtext3="<H1> Help me clean my neighborhood <BR> <SIZE:small> I need someone to help me fight a group of zombie near xx, there is around xx of them and I don't want to do it alone. <BR> <LEFT> Reward: <LINE> - 100$"localtext4="<H1> Looking for seed <BR> <SIZE:small> I'm looking for seed, every type of seed. I can pay or exchange. Contact me on my public frequencies xx.x."localitems= {};
items["EVENT - The longest night"] =text1;
items["URGENT - Medical delivery"] =text2;
items["Help me clean my neighborhood"] =text3;
items["Looking for seed"] =text4;
items["item5"] ="";
items["item6"] ="";
items["item7"] ="";
items["item8"] ="";
items["item9"] ="";
items["item10"] ="";
items["item11"] ="";
localfunctionchoose(button, args)
getPlayer():Say("I accepted this mission !");
listUI:close();
endlocalfunctionopenJobDesc(_, item)
descUI:open();
descUI:setPositionPixel(listUI:getX() +listUI:getWidth(), listUI:getY());
descUI["rtext"]:setText(item);
endlocalfunctiononCreateUI()
-- List UIlistUI=NewUI(); -- Create UIlistUI:setTitle("Job board");
listUI:setWidthPercent(0.15);
listUI:addScrollList("list", items); -- Create listlistUI["list"]:setOnMouseDownFunction(_, openJobDesc)
listUI:saveLayout(); -- Create window-- Description UIdescUI=NewUI();
descUI:setTitle("Job desc");
descUI:isSubUIOf(listUI);
descUI:setWidthPercent(0.1);
descUI:addEmpty(_, _, _, 10); -- Margin only for rich textdescUI:addRichText("rtext", ""); descUI:setLineHeightPercent(0.2); descUI:addEmpty(_, _, _, 10); -- Margin only for rich textdescUI:nextLine();
descUI:addButton("b1", "Accept ?", choose);
descUI:saveLayout();
descUI:close();
endEvents.OnCreateUI.Add(onCreateUI)

About

UI API for the game project zomboid

Resources

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

PZ-Simple UI library

Want to make a simple menu for your mod to :

  • Ask the player to choose between two things?
  • Ask the player a nickname, age, height, weight, etc ?
  • Display a map ?
  • Display player-related information from your mod such as amount of money, time on server, etc ?
  • Warn players the start of an event ?
  • Make a job board systeme ?
  • And more ?

This mod is for you !

My mod is only an overlay of what the base game does to simplify placement, initializations and get the most useful functions of UIs.
This means that all elements are vanilla elements. So for example, buttons has access to all functions of ISButton and ISUIElement.
The windows itself is a derivate of ISCollapsableWindow.
It means you can add whatever you want to my UI like for the vanilla game if you want something specific. Here is a guide to understanding the basics of how the game does UIs. You can also copy an ISSimpleElement.lua to make a custom one.
Found all vanilla files in media/lua/client/ISUI of the game folder.
Note, an UI is the whole (window + elements) and the window is just the window object, without the elements.

Make my first window

A window created with my mod is composed of lines. On each line, there are elements. Elements are anything that can be in a UI like text or a button.

Step by step:

  1. Create a new UI with the NewUI() function. Here you have a window without elements.
  2. Add elements to the line. You can add as many elements as you want per line, the mod will take care of sizing them.
  3. Jump to the next line. When you added your elements, you jump to the next line with the function ui:nextLine().
  4. Repet 2.
  5. Once all line create, you just call ui:saveLayout() to finish creating the ui.

All useable function of UI here.
All elements here.
List of usefull vanilla function here.

As in the following diagram: alt text

I highly recommend doing the UIs in event OnCreateUI but you can do it anywhere.

Understand coordinates

  • Menus are in 2d.
  • Dimensions of 2d object are its position in x and y as well as its size in width and height.
  • x and y are coordinates of the left top corner.
  • Positions and sizes are in percentage of screen or in pixel.

Percent is to simplify and allow compatibility between different screen sizes. For example a width of 0.2 will take 20% of the screen.
alt text

You can also try to make your UI from scratch, I made a guide to understand the base.

Examples

Hello world

alt text

localfunctiononCreateUI()
localUI=NewUI();
UI:addText("", "Hello world", "Small", "Center")
UI:saveLayout()
endEvents.OnCreateUI.Add(onCreateUI)

Quest

alt text

See code
localUIlocaltext1="<H1> The longest night <BR> <SIZE:small> In this mission, you gonna need to survivre all night. <BR> <LEFT> Reward: <LINE> - M14 <LINE> - 20 ammo <BR> Failure Conditions: <LINE> -Death"localfunctionchoose(button, args)
getPlayer():Say(args.choice);
UI:close();
endlocalfunctiononCreateUI()
UI=NewUI();
UI:addRichText("rtext", text1); UI:setLineHeightPercent(0.2); UI:nextLine();
UI:addText("t1", "Accept ?", _, "Center");
UI["t1"]:setBorder(true);
UI:addButton("b1", "Yes", choose);
UI:addButton("b2", "No", choose);
UI["b1"]:addArg("choice", "yes");
UI["b2"]:addArg("choice", "no");
UI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Choose your team

alt text

See code
localUIlocaltext1="Players: <LINE> - MrBounty <LINE> - Dane <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx"localtext2="Players: <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx"localfunctionchoose(button, args)
getPlayer():Say("I'm in the " ..args.team.." team now !");
UI:close();
endlocalfunctiononCreateUI()
UI=NewUI();
UI:addText("", "Choose your team", "Large", "Center");
UI:nextLine();
UI:addRichText("", text1);
UI:addRichText("", text2);
UI:setLineHeightPercent(0.2);
UI:nextLine();
UI:addText("t1", "11/12", _, "Center");
UI:addText("t2", "9/12", _, "Center");
UI["t1"]:setColor(1, 0, 0, 1);
UI["t2"]:setColor(1, 1, 0, 0);
UI:nextLine();
UI:addButton("b1", "Blue", choose);
UI:addButton("b2", "Red", choose);
UI["b1"]:addArg("team", "blue");
UI["b2"]:addArg("team", "red");
UI:setBorderToAllElements(true);
UI:setWidthPercent(0.15);
UI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Choose a job

alt text

See code
localUIlocaljobSelect="";
-- Text for the rich text elementlocaltext1="<H1> Your a policeman ! <LINE> <SIZE:small> You are here to protect people ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext2="<H1> Your an engineer ! <LINE> <SIZE:small> You are here to create thing ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext3="<H1> Your a doctor ! <LINE> <SIZE:small> You are here to help people ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext4="<H1> Your nothing ! <LINE> <SIZE:small> You are here to die ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtexts= {text1, text2, text3, text4}
localjobs= {"Policeman", "Engineer", "Doctor", "Nothing"}
-- Functions for buttonslocalfunctionpress(button, args)
UI["rtext"]:setText(texts[args.index])
jobSelect=jobs[args.index]
getPlayer():Say("I selected " ..jobSelect);
endlocalfunctionok()
getPlayer():Say("I'm a " ..jobSelect.." now !");
UI:close();
end-- Create the UIlocalfunctiononCreateUI()
UI=NewUI(0.15);
-- Add window titleUI:addText("title1", "Choose you job !", "Title", "Center");
UI["title1"]:setBorder(true);
UI:nextLine();
-- Add job descriptionUI:addRichText("rtext", text1); UI:nextLine();
-- Add buttonsUI:addButton("button1", jobs[1], press);
UI:addButton("button2", jobs[2], press);
UI:addButton("button3", jobs[3], press);
UI:addButton("button4", jobs[4], press);
UI["button1"]:addArg("index", 1);
UI["button2"]:addArg("index", 2);
UI["button3"]:addArg("index", 3);
UI["button4"]:addArg("index", 4);
UI:addButton("", "Button", ok);
UI:nextLine();
-- Save windowUI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Job list

Example with 2 UI
alt text

See code
locallistUI, descUIlocaltext1="<H1> The longest night <BR> <SIZE:small> In this mission, you gonna need to survivre all night. <BR> <LEFT> Reward: <LINE> - M14 <LINE> - 20 ammo <BR> Failure Conditions: <LINE> -Death"localtext2="<H1> I need medical supply ! <BR> <SIZE:small> Please someone come to xx to help me ! I need a doctor or I'm gonna die. <BR> <LEFT> Reward: <LINE> - Everything I have"localtext3="<H1> Help me clean my neighborhood <BR> <SIZE:small> I need someone to help me fight a group of zombie near xx, there is around xx of them and I don't want to do it alone. <BR> <LEFT> Reward: <LINE> - 100$"localtext4="<H1> Looking for seed <BR> <SIZE:small> I'm looking for seed, every type of seed. I can pay or exchange. Contact me on my public frequencies xx.x."localitems= {};
items["EVENT - The longest night"] =text1;
items["URGENT - Medical delivery"] =text2;
items["Help me clean my neighborhood"] =text3;
items["Looking for seed"] =text4;
items["item5"] ="";
items["item6"] ="";
items["item7"] ="";
items["item8"] ="";
items["item9"] ="";
items["item10"] ="";
items["item11"] ="";
localfunctionchoose(button, args)
getPlayer():Say("I accepted this mission !");
listUI:close();
endlocalfunctionopenJobDesc(_, item)
descUI:open();
descUI:setPositionPixel(listUI:getX() +listUI:getWidth(), listUI:getY());
descUI["rtext"]:setText(item);
endlocalfunctiononCreateUI()
-- List UIlistUI=NewUI(); -- Create UIlistUI:setTitle("Job board");
listUI:setWidthPercent(0.15);
listUI:addScrollList("list", items); -- Create listlistUI["list"]:setOnMouseDownFunction(_, openJobDesc)
listUI:saveLayout(); -- Create window-- Description UIdescUI=NewUI();
descUI:setTitle("Job desc");
descUI:isSubUIOf(listUI);
descUI:setWidthPercent(0.1);
descUI:addEmpty(_, _, _, 10); -- Margin only for rich textdescUI:addRichText("rtext", ""); descUI:setLineHeightPercent(0.2); descUI:addEmpty(_, _, _, 10); -- Margin only for rich textdescUI:nextLine();
descUI:addButton("b1", "Accept ?", choose);
descUI:saveLayout();
descUI:close();
endEvents.OnCreateUI.Add(onCreateUI)

About

UI API for the game project zomboid

Resources

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

PZ-Simple UI library

Want to make a simple menu for your mod to :

  • Ask the player to choose between two things?
  • Ask the player a nickname, age, height, weight, etc ?
  • Display a map ?
  • Display player-related information from your mod such as amount of money, time on server, etc ?
  • Warn players the start of an event ?
  • Make a job board systeme ?
  • And more ?

This mod is for you !

My mod is only an overlay of what the base game does to simplify placement, initializations and get the most useful functions of UIs.
This means that all elements are vanilla elements. So for example, buttons has access to all functions of ISButton and ISUIElement.
The windows itself is a derivate of ISCollapsableWindow.
It means you can add whatever you want to my UI like for the vanilla game if you want something specific. Here is a guide to understanding the basics of how the game does UIs. You can also copy an ISSimpleElement.lua to make a custom one.
Found all vanilla files in media/lua/client/ISUI of the game folder.
Note, an UI is the whole (window + elements) and the window is just the window object, without the elements.

Make my first window

A window created with my mod is composed of lines. On each line, there are elements. Elements are anything that can be in a UI like text or a button.

Step by step:

  1. Create a new UI with the NewUI() function. Here you have a window without elements.
  2. Add elements to the line. You can add as many elements as you want per line, the mod will take care of sizing them.
  3. Jump to the next line. When you added your elements, you jump to the next line with the function ui:nextLine().
  4. Repet 2.
  5. Once all line create, you just call ui:saveLayout() to finish creating the ui.

All useable function of UI here.
All elements here.
List of usefull vanilla function here.

As in the following diagram: alt text

I highly recommend doing the UIs in event OnCreateUI but you can do it anywhere.

Understand coordinates

  • Menus are in 2d.
  • Dimensions of 2d object are its position in x and y as well as its size in width and height.
  • x and y are coordinates of the left top corner.
  • Positions and sizes are in percentage of screen or in pixel.

Percent is to simplify and allow compatibility between different screen sizes. For example a width of 0.2 will take 20% of the screen.
alt text

You can also try to make your UI from scratch, I made a guide to understand the base.

Examples

Hello world

alt text

localfunctiononCreateUI()
localUI=NewUI();
UI:addText("", "Hello world", "Small", "Center")
UI:saveLayout()
endEvents.OnCreateUI.Add(onCreateUI)

Quest

alt text

See code
localUIlocaltext1="<H1> The longest night <BR> <SIZE:small> In this mission, you gonna need to survivre all night. <BR> <LEFT> Reward: <LINE> - M14 <LINE> - 20 ammo <BR> Failure Conditions: <LINE> -Death"localfunctionchoose(button, args)
getPlayer():Say(args.choice);
UI:close();
endlocalfunctiononCreateUI()
UI=NewUI();
UI:addRichText("rtext", text1); UI:setLineHeightPercent(0.2); UI:nextLine();
UI:addText("t1", "Accept ?", _, "Center");
UI["t1"]:setBorder(true);
UI:addButton("b1", "Yes", choose);
UI:addButton("b2", "No", choose);
UI["b1"]:addArg("choice", "yes");
UI["b2"]:addArg("choice", "no");
UI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Choose your team

alt text

See code
localUIlocaltext1="Players: <LINE> - MrBounty <LINE> - Dane <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx"localtext2="Players: <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx <LINE> - xx"localfunctionchoose(button, args)
getPlayer():Say("I'm in the " ..args.team.." team now !");
UI:close();
endlocalfunctiononCreateUI()
UI=NewUI();
UI:addText("", "Choose your team", "Large", "Center");
UI:nextLine();
UI:addRichText("", text1);
UI:addRichText("", text2);
UI:setLineHeightPercent(0.2);
UI:nextLine();
UI:addText("t1", "11/12", _, "Center");
UI:addText("t2", "9/12", _, "Center");
UI["t1"]:setColor(1, 0, 0, 1);
UI["t2"]:setColor(1, 1, 0, 0);
UI:nextLine();
UI:addButton("b1", "Blue", choose);
UI:addButton("b2", "Red", choose);
UI["b1"]:addArg("team", "blue");
UI["b2"]:addArg("team", "red");
UI:setBorderToAllElements(true);
UI:setWidthPercent(0.15);
UI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Choose a job

alt text

See code
localUIlocaljobSelect="";
-- Text for the rich text elementlocaltext1="<H1> Your a policeman ! <LINE> <SIZE:small> You are here to protect people ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext2="<H1> Your an engineer ! <LINE> <SIZE:small> You are here to create thing ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext3="<H1> Your a doctor ! <LINE> <SIZE:small> You are here to help people ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtext4="<H1> Your nothing ! <LINE> <SIZE:small> You are here to die ! <LINE> <SIZE:small> <LEFT> You can: <LINE> - Do that <LINE> - And that <LINE> - And a lot more"localtexts= {text1, text2, text3, text4}
localjobs= {"Policeman", "Engineer", "Doctor", "Nothing"}
-- Functions for buttonslocalfunctionpress(button, args)
UI["rtext"]:setText(texts[args.index])
jobSelect=jobs[args.index]
getPlayer():Say("I selected " ..jobSelect);
endlocalfunctionok()
getPlayer():Say("I'm a " ..jobSelect.." now !");
UI:close();
end-- Create the UIlocalfunctiononCreateUI()
UI=NewUI(0.15);
-- Add window titleUI:addText("title1", "Choose you job !", "Title", "Center");
UI["title1"]:setBorder(true);
UI:nextLine();
-- Add job descriptionUI:addRichText("rtext", text1); UI:nextLine();
-- Add buttonsUI:addButton("button1", jobs[1], press);
UI:addButton("button2", jobs[2], press);
UI:addButton("button3", jobs[3], press);
UI:addButton("button4", jobs[4], press);
UI["button1"]:addArg("index", 1);
UI["button2"]:addArg("index", 2);
UI["button3"]:addArg("index", 3);
UI["button4"]:addArg("index", 4);
UI:addButton("", "Button", ok);
UI:nextLine();
-- Save windowUI:saveLayout();
endEvents.OnCreateUI.Add(onCreateUI)

Job list

Example with 2 UI
alt text

See code
locallistUI, descUIlocaltext1="<H1> The longest night <BR> <SIZE:small> In this mission, you gonna need to survivre all night. <BR> <LEFT> Reward: <LINE> - M14 <LINE> - 20 ammo <BR> Failure Conditions: <LINE> -Death"localtext2="<H1> I need medical supply ! <BR> <SIZE:small> Please someone come to xx to help me ! I need a doctor or I'm gonna die. <BR> <LEFT> Reward: <LINE> - Everything I have"localtext3="<H1> Help me clean my neighborhood <BR> <SIZE:small> I need someone to help me fight a group of zombie near xx, there is around xx of them and I don't want to do it alone. <BR> <LEFT> Reward: <LINE> - 100$"localtext4="<H1> Looking for seed <BR> <SIZE:small> I'm looking for seed, every type of seed. I can pay or exchange. Contact me on my public frequencies xx.x."localitems= {};
items["EVENT - The longest night"] =text1;
items["URGENT - Medical delivery"] =text2;
items["Help me clean my neighborhood"] =text3;
items["Looking for seed"] =text4;
items["item5"] ="";
items["item6"] ="";
items["item7"] ="";
items["item8"] ="";
items["item9"] ="";
items["item10"] ="";
items["item11"] ="";
localfunctionchoose(button, args)
getPlayer():Say("I accepted this mission !");
listUI:close();
endlocalfunctionopenJobDesc(_, item)
descUI:open();
descUI:setPositionPixel(listUI:getX() +listUI:getWidth(), listUI:getY());
descUI["rtext"]:setText(item);
endlocalfunctiononCreateUI()
-- List UIlistUI=NewUI(); -- Create UIlistUI:setTitle("Job board");
listUI:setWidthPercent(0.15);
listUI:addScrollList("list", items); -- Create listlistUI["list"]:setOnMouseDownFunction(_, openJobDesc)
listUI:saveLayout(); -- Create window-- Description UIdescUI=NewUI();
descUI:setTitle("Job desc");
descUI:isSubUIOf(listUI);
descUI:setWidthPercent(0.1);
descUI:addEmpty(_, _, _, 10); -- Margin only for rich textdescUI:addRichText("rtext", ""); descUI:setLineHeightPercent(0.2); descUI:addEmpty(_, _, _, 10); -- Margin only for rich textdescUI:nextLine();
descUI:addButton("b1", "Accept ?", choose);
descUI:saveLayout();
descUI:close();
endEvents.OnCreateUI.Add(onCreateUI)

About

UI API for the game project zomboid

Resources

Stars

22 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages