1
0
Fork 0
mirror of https://github.com/aclist/dztui.git synced 2024-12-29 13:52:03 +01:00
dztui/dzgui.html
2022-11-09 12:11:56 +09:00

1338 lines
No EOL
60 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.17">
<meta name="author" content="DayZ official/community server graphical launcher for Linux | Last updated: 2022-10-11">
<title>DZGUI documentation</title>
<style>
/*! Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment the following line when using as a custom stylesheet */
/* @import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"; */
html{font-family:sans-serif;-webkit-text-size-adjust:100%}
h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 {color: #8a1414 !important}
a{background:none}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
b,strong{font-weight:bold}
abbr{font-size:.9em}
abbr[title]{cursor:help;border-bottom:1px dotted #dddddf;text-decoration:none}
dfn{font-style:italic}
hr{height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
audio,video{display:inline-block}
audio:not([controls]){display:none;height:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type=checkbox],input[type=radio]{padding:0}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,::before,::after{box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;line-height:1;position:relative;cursor:auto;-moz-tab-size:4;-o-tab-size:4;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:0}
p{line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0}
ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
ul.square{list-style-type:square}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:1px solid #dedede;word-wrap:normal}
table thead,table tfoot{background:#f7f8f7}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt{background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
:not(pre).nobreak{word-wrap:normal}
:not(pre).nowrap{white-space:nowrap}
:not(pre).pre-wrap{white-space:pre-wrap}
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
pre>code{display:block}
pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 .1em #fff;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menuref{color:#000}
.menuseq b:not(.caret),.menuref{font-weight:inherit}
.menuseq{word-spacing:-.02em}
.menuseq b.caret{font-size:1.25em;line-height:.8}
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
b.button::before{content:"[";padding:0 3px 0 2px}
b.button::after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin:0 auto;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
#content{margin-top:1.25em}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:flex;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span::before{content:"\00a0\2013\00a0"}
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark::before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber::after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border:1px solid #e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:hsla(0,0%,100%,.8);line-height:1.44}
#content{margin-bottom:.625em}
.sect1{padding-bottom:.625em}
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
.sect1{padding-bottom:1.25em}}
.sect1:last-child{padding-bottom:0}
.sect1+.sect1{border-top:1px solid #e7e7e9}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
details{margin-left:1.25rem}
details>summary{cursor:pointer;display:block;position:relative;line-height:1.6;margin-bottom:.625rem;outline:none;-webkit-tap-highlight-color:transparent}
details>summary::-webkit-details-marker{display:none}
details>summary::before{content:"";border:solid transparent;border-left:solid;border-width:.3em 0 .3em .5em;position:absolute;top:.5em;left:-1.25rem;transform:translateX(15%)}
details[open]>summary::before{border:solid transparent;border-top:solid;border-width:.5em .3em 0;transform:translateY(15%)}
details>summary::after{content:"";width:1.25rem;height:1em;position:absolute;top:.3em;left:-1.25rem}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class=paragraph]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border:1px solid #e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;border-radius:4px}
.exampleblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child{margin-bottom:0}
.sidebarblock{border:1px solid #dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;border-radius:4px}
.sidebarblock>:first-child{margin-top:0}
.sidebarblock>:last-child{margin-bottom:0}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock>.content>pre{border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class=highlight],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
.listingblock>.content{position:relative}
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
.listingblock:hover code[data-lang]::before{display:block}
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.prettyprint{background:#f7f7f8}
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
pre.prettyprint li code[data-lang]::before{opacity:1}
pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
table.linenotable td.code{padding-left:.75em}
table.linenotable td.linenos,pre.pygments .linenos{border-right:1px solid;opacity:.35;padding-right:.5em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
pre.pygments span.linenos{display:inline-block;margin-right:.75em}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
.verseblock{margin:0 1em 1.25em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans-serif;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;font-size:.85rem;text-align:left;margin-right:0}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>*>tr>*{border-width:1px}
table.grid-cols>*>tr>*{border-width:0 1px}
table.grid-rows>*>tr>*{border-width:1px 0}
table.frame-all{border-width:1px}
table.frame-ends{border-width:1px 0}
table.frame-sides{border-width:0 1px}
table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}
table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
table.stripes-all>*>tr,table.stripes-odd>*>tr:nth-of-type(odd),table.stripes-even>*>tr:nth-of-type(even),table.stripes-hover>*>tr:hover{background:#f8f8f7}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
ul.unstyled,ol.unstyled{margin-left:0}
li>p:empty:only-child::before{content:"";display:inline-block}
ul.checklist>li>p:first-child{margin-left:-1em}
ul.checklist>li>p:first-child>.fa-square-o:first-child,ul.checklist>li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
ul.checklist>li>p:first-child>input[type=checkbox]:first-child{margin-right:.25em}
ul.inline{display:flex;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
ul.inline>li{margin-left:1.25em}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
td.hdlist2{word-wrap:anywhere}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
.colist td:not([class]):first-child img{max-width:none}
.colist td:not([class]):last-child{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:4px solid #fff;box-shadow:0 0 0 1px #ddd}
.imageblock.left{margin:.25em .625em 1.25em 0}
.imageblock.right{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background:#00fafa}
.black{color:#000}
.black-background{background:#000}
.blue{color:#0000bf}
.blue-background{background:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background:#fa00fa}
.gray{color:#606060}
.gray-background{background:#7d7d7d}
.green{color:#006000}
.green-background{background:#007d00}
.lime{color:#00bf00}
.lime-background{background:#00fa00}
.maroon{color:#600000}
.maroon-background{background:#7d0000}
.navy{color:#000060}
.navy-background{background:#00007d}
.olive{color:#606000}
.olive-background{background:#7d7d00}
.purple{color:#600060}
.purple-background{background:#7d007d}
.red{color:#bf0000}
.red-background{background:#fa0000}
.silver{color:#909090}
.silver-background{background:#bcbcbc}
.teal{color:#006060}
.teal-background{background:#007d7d}
.white{color:#bfbfbf}
.white-background{background:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background:#fafa00}
span.icon>.fa{cursor:default}
a span.icon>.fa{cursor:inherit}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]::after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt,summary{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,span.alt,summary{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{box-shadow:none!important;text-shadow:none!important}
html{font-size:80%}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]{border-bottom:1px dotted}
abbr[title]::after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#header,#content,#footnotes,#footer{max-width:none}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span::before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]::before{display:block}
#footer{padding:0 .9375em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
@media amzn-kf8,print{#header>h1:first-child{margin-top:1.25rem}
.sect1{padding:0!important}
.sect1+.sect1{border:0}
#footer{background:none}
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
</style>
</head>
<body class="article toc2 toc-left">
<div id="header">
<h1>DZGUI documentation</h1>
<div class="details">
<span id="author" class="author">DayZ official/community server graphical launcher for Linux | Last updated: 2022-10-11</span><br>
<span id="revdate">=======</span>
</div>
<div id="toc" class="toc2">
<div id="toctitle">Table of Contents</div>
<ul class="sectlevel1">
<li><a href="#_what_this_is">What this is</a></li>
<li><a href="#_setup">Setup</a>
<ul class="sectlevel2">
<li><a href="#_dependencies">Dependencies</a></li>
<li><a href="#_preparation">Preparation</a></li>
<li><a href="#_api_key_server_ids">API key &amp; server IDs</a></li>
<li><a href="#_first_time_launch">First-time launch</a></li>
<li><a href="#_steam_integration_artwork">Steam integration &amp; artwork</a></li>
<li><a href="#_updating_the_app">Updating the app</a></li>
</ul>
</li>
<li><a href="#_usage">Usage</a></li>
<li><a href="#_menu_options">Menu options</a>
<ul class="sectlevel3">
<li><a href="#_server_browser">Server browser</a></li>
<li><a href="#_my_servers">My servers</a></li>
<li><a href="#_quick_connect_to_favorite_server">Quick connect to favorite server</a></li>
<li><a href="#_connect_by_ip">Connect by IP</a></li>
<li><a href="#_add_server_by_id">Add server by ID</a></li>
<li><a href="#_add_favorite_server">Add favorite server</a></li>
<li><a href="#_delete_server">Delete server</a></li>
<li><a href="#_list_installed_mods">List installed mods</a></li>
<li><a href="#_toggle_debug_mode">Toggle debug mode</a></li>
<li><a href="#_report_bug">Report bug</a></li>
<li><a href="#_help_file">Help file</a></li>
<li><a href="#_view_changelog">View changelog</a></li>
<li><a href="#_debug_options">Debug options</a></li>
</ul>
</li>
<li><a href="#_config_file_keyvalue_pairs">Config file key/value pairs</a></li>
<li><a href="#_troubleshootingfaq">Troubleshooting/FAQ</a></li>
<li><a href="#_testers_wanted">Testers wanted</a></li>
</ul>
</div>
</div>
<div id="content">
<div class="sect1">
<h2 id="_what_this_is">What this is</h2>
<div class="sectionbody">
<div class="paragraph">
<p>A GUI version of <a href="https://github.com/aclist/dztui">DZTUI</a> for Linux. Used to list official and community server details and quick connect to preferred servers by staging mods and concatenating launch options automatically.</p>
</div>
<div class="paragraph">
<p>DZGUI contains some expanded functionality that will eventually be backported to DZTUI. It is intended to be more of a user-friendly, turnkey solution for graphical desktop environments, and could also be used on the Steam Deck or similar devices.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_setup">Setup</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_dependencies">Dependencies</h3>
<div class="paragraph">
<p>If not already installed, the below can be found in your system&#8217;s package manager.
With the exception of Steam (which presumably you already have), in 99% of cases,
the other utilities should ship out of the box with mainstream distributions. They are provided here merely as a reference.</p>
</div>
<div class="paragraph">
<p>If any dependencies are missing when the application starts, it will warn you, so you need not take any preemptive measures here.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>curl</code></p>
</li>
<li>
<p><code>jq</code></p>
</li>
<li>
<p><code>zenity</code></p>
</li>
<li>
<p><code>steam</code></p>
</li>
<li>
<p><code>wmctrl</code> or <code>xdotool</code></p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_preparation">Preparation</h3>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Download DZGUI and make it executable:</p>
</li>
</ol>
</div>
<div class="paragraph">
<p><strong>Automatic method (skip to 3 below when complete)</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>curl -s "https://raw.githubusercontent.com/aclist/dztui/dzgui/install.sh" | bash</code></pre>
</div>
</div>
<div class="paragraph">
<p><strong>Manual method</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>chmod +x dzgui.sh</code></pre>
</div>
</div>
<div class="olist arabic">
<ol class="arabic" start="2">
<li>
<p>Update the <code>vm.max_map_count</code> value (see <a href="https://www.protondb.com/app/221100" class="bare">https://www.protondb.com/app/221100</a>)
This is handled automatically by DZGUI if you just choose to run the application out of the box.</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>Ephemeral method:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo sysctl -w vm.max_map_count=1048576</code></pre>
</div>
</div>
<div class="paragraph">
<p>Persistent method:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>echo 'vm.max_map_count=1048576' | sudo tee /etc/sysctl.d/dayz.conf</code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
If it detects an incorrect map count value, DZGUI will prompt you to permanently update the map count value when starting up.
</td>
</tr>
</table>
</div>
<div class="olist arabic">
<ol class="arabic" start="3">
<li>
<p>Steam account with DayZ license</p>
</li>
<li>
<p>Enable a Proton version ≥ <code>6.8</code> (or use Experimental) in the <strong>Compatibility</strong> field of the game&#8217;s right-click options.</p>
</li>
</ol>
</div>
</div>
<div class="sect2">
<h3 id="_api_key_server_ids">API key &amp; server IDs</h3>
<div class="sect3">
<h4 id="_battlemetrics_api_key">BattleMetrics API key</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Register for an API key at <a href="https://www.battlemetrics.com/account/register?after=%2Fdevelopers">BattleMetrics</a> (free)</p>
</li>
<li>
<p>From the <strong>Personal Access Tokens</strong> area, Select <strong>New Token</strong></p>
</li>
<li>
<p>Give the token any name in the field at the top</p>
</li>
<li>
<p>Leave all options <strong>unchecked</strong> and scroll to the bottom, select <strong>Create Token</strong></p>
</li>
<li>
<p>Copy the access token for later use (see below). This is the unique token you will use to query servers.</p>
</li>
<li>
<p>Use the <a href="https://www.battlemetrics.com/servers/dayz">DayZ server browser</a> to find servers of interest (proximity, player count, rules, etc.)</p>
</li>
<li>
<p>Each server has a unique ID. This is the string of numbers at the end of the URL. Copy these IDs. For example, in the URL <a href="https://www.battlemetrics.com/servers/dayz/8039514" class="bare">https://www.battlemetrics.com/servers/dayz/8039514</a>, the ID is <code>8039514</code>.</p>
</li>
</ol>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
You will be prompted to enter these IDs when starting the app, so you could refer to them in another window while you complete setup. More IDs can be added later.
</td>
</tr>
</table>
</div>
</div>
<div class="sect3">
<h4 id="_steam_api_key">Steam API key</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Register for a <a href="https://steamcommunity.com/dev/apikey">Steam API key</a> using your Steam account. You will be asked for a unique URL for your app when registering.</p>
</li>
<li>
<p>Since this key is for a personal use application and does not actually call back anywhere, set a generic local identifier here like "127.0.0.1".</p>
</li>
<li>
<p>Once configured, you can insert this key in the app when launching the "Connect by IP" feature for the first time.</p>
</li>
</ol>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_first_time_launch">First-time launch</h3>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>DZGUI can be launched one of two ways.</p>
</li>
</ol>
</div>
<div class="paragraph">
<p><strong>From the terminal:</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>./dzgui.sh</code></pre>
</div>
</div>
<div class="paragraph">
<p>Launching from the terminal gives more verbose information, and can be a good way of troubleshooting problems.</p>
</div>
<div class="paragraph">
<p><strong>From the shortcut shipped with the application:</strong></p>
</div>
<div class="paragraph">
<p>*If using a desktop environment based on the Freedesktop specification</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Located under the "Games" category of your system&#8217;s applications list.</p>
</li>
<li>
<p>Via the DZGUI desktop shortcut (Steam Deck only)</p>
</li>
</ul>
</div>
<div class="olist arabic">
<ol class="arabic" start="2">
<li>
<p>Follow the menu prompts given by the app. You will be asked to provide:</p>
<div class="ulist">
<ul>
<li>
<p>API key (see above)</p>
</li>
<li>
<p>Player name (a generic handle, required by some servers)</p>
</li>
<li>
<p>At least one server ID</p>
</li>
</ul>
</div>
</li>
</ol>
</div>
<div class="paragraph">
<p>DZGUI will then attempt to locate your default Steam installation and DayZ path. If it detects multiple paths, you will be given a list to choose from.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
If the path was not detected correctly, you can manually edit the config file at <code>$HOME/.config/dztui/dztuirc</code>.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_steam_integration_artwork">Steam integration &amp; artwork</h3>
<div class="sect3">
<h4 id="_adding_to_steam">Adding to steam</h4>
<div class="paragraph">
<p>DZGUI can be added to Steam as a "non-Steam game" in order to facilitate integration with Steam Deck or desktop environments.</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Launch Steam in the "Large" view.</p>
</li>
</ol>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
Steam Deck: you must switch to "Desktop Mode" and launch Steam from the desktop.
</td>
</tr>
</table>
</div>
<div class="olist arabic">
<ol class="arabic" start="2">
<li>
<p>Select <strong>Add a Game</strong> &gt; <strong>Add a Non-Steam Game</strong> from the lower left-hand corner.</p>
</li>
</ol>
</div>
<div class="imageblock">
<div class="content">
<img src="https://github.com/aclist/dztui/raw/testing/images/tutorial/01.png" alt="01" width="500">
</div>
</div>
<div class="olist arabic">
<ol class="arabic" start="3">
<li>
<p>Navigate to <code>$HOME/.local/share/applications/</code> and select <code>dzgui.desktop</code></p>
</li>
<li>
<p>Select <strong>Add Selected Programs</strong>.</p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_controller_layout">Controller layout</h4>
<div class="paragraph">
<p>An official controller layout for Steam Deck is available in the Steam community layouts section. Search for "DZGUI Official Config" to download it. Long-press the View button and Select button (☰) to toggle D-pad navigation. This creates an additional layer that lets you navigate through menus using the D-pad and A/B to respectively confirm selections and go back. Remember to toggle this layer off again after launching your game to revert back to the master layer.</p>
</div>
</div>
<div class="sect3">
<h4 id="_artwork">Artwork</h4>
<div class="paragraph">
<p>The application also ships with Steam cover artwork. It is located under:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>$HOME/.local/share/dzgui</code></pre>
</div>
</div>
<div class="paragraph">
<p>The artwork consists of four parts:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Grid: a vertical "box art" grid used on library pages</p>
</li>
<li>
<p>Hero: a large horizontal banner used on the app&#8217;s details page</p>
</li>
<li>
<p>Logo: a transparent icon used to remove Steam&#8217;s default app text</p>
</li>
<li>
<p>dzgui: used by freedesktop shortcut to generate a desktop icon; not intended for the user</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>Updating the artwork:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Navigate to the app&#8217;s details page and right-click the blank image header at the top.</p>
</li>
</ol>
</div>
<div class="imageblock">
<div class="content">
<img src="https://github.com/aclist/dztui/raw/testing/images/tutorial/03.png" alt="03" width="700">
</div>
</div>
<div class="olist arabic">
<ol class="arabic" start="2">
<li>
<p>Select <strong>Set Custom Background</strong></p>
</li>
<li>
<p>Select to display All Files from the File type dropdown</p>
</li>
<li>
<p>Navigate to the artwork path described above and select <code>hero.png</code>.</p>
</li>
<li>
<p>Next, right-click the image background and select <strong>Set Custom Logo</strong>.</p>
</li>
</ol>
</div>
<div class="imageblock">
<div class="content">
<img src="https://github.com/aclist/dztui/raw/testing/images/tutorial/04.png" alt="04" width="700">
</div>
</div>
<div class="olist arabic">
<ol class="arabic" start="5">
<li>
<p>Navigate to the same path and select <code>logo.png</code>. Notice that this removes the redundant app name that occluded the image.</p>
</li>
</ol>
</div>
<div class="imageblock">
<div class="content">
<img src="https://github.com/aclist/dztui/raw/testing/images/tutorial/05.png" alt="05" width="700">
</div>
</div>
<div class="olist arabic">
<ol class="arabic" start="6">
<li>
<p>Next, navigate to your Library index (looks like a bookshelf of cover art) and find the DZGUI app.</p>
</li>
</ol>
</div>
<div class="olist arabic">
<ol class="arabic" start="7">
<li>
<p>Right-click its cover and select <strong>Manage</strong> &gt; <strong>Set custom artwork</strong>.</p>
</li>
</ol>
</div>
<div class="imageblock">
<div class="content">
<img src="https://github.com/aclist/dztui/raw/testing/images/tutorial/06.png" alt="06" width="700">
</div>
</div>
<div class="olist arabic">
<ol class="arabic" start="8">
<li>
<p>Navigate to the same path and select <code>grid.png</code>. The final result:</p>
</li>
</ol>
</div>
<div class="imageblock">
<div class="content">
<img src="https://github.com/aclist/dztui/raw/testing/images/tutorial/07.png" alt="07" width="700">
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_updating_the_app">Updating the app</h3>
<div class="paragraph">
<p>If DZGUI detects a new upstream version, it will prompt you to download it automatically. It backs up the original version before fetching the new one, then updates your config file with your existing values. Once finished, it will ask you to relaunch the app.</p>
</div>
<div class="paragraph">
<p>If you decline to upgrade to the new version, DZGUI will continue to the main menu with the current version.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
New versions may include changes to bugs that could prevent you from playing on certain servers. Upgrading is always advised.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>If you experience a problem or need to restore the prior version of DZGUI and/or your configs, it is enough to simply replace the new version with the old one and relaunch the app. The files can be found at:</p>
</div>
<div class="paragraph">
<p>Script:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>&lt;path to script&gt;&lt;script name&gt;.old</code></pre>
</div>
</div>
<div class="paragraph">
<p>E.g., if DZGUI is named <code>dzgui</code>, in the path <code>$HOME/bin</code>, it will be located at</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>$HOME/bin/dzgui.old</code></pre>
</div>
</div>
<div class="paragraph">
<p>If launching DZGUI via its system shortcut, the backup file (similarly for log files) will be located under:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>$HOME/.local/share/dzgui</code></pre>
</div>
</div>
<div class="paragraph">
<p>Backup config files:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>$HOME/.config/dztui/dztuirc.old</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_usage">Usage</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Select <a href="#_my_servers">My servers</a> to fetch details for the server IDs you provided. Select the server you wish to connect to and click OK.</p>
</div>
<div class="paragraph">
<p>DZGUI will check the server&#8217;s modset against your local mods. If you are missing any, it will prompt you to download them through the Steam Workshop and open a window in the background in the system browser.</p>
</div>
<div class="paragraph">
<p>Open each link and click Subscribe to schedule these for download.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
You must be logged into Steam for mod change to take effect. It can take some time for the subscribed mods to download and update. You can continue clicking Next to regenerate the list, or wait for all of them to complete.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Once all of the mods are downloaded and staged, DZGUI will notify you that it is ready to connect. The app hands the launch parameters to Steam and exits.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_menu_options">Menu options</h2>
<div class="sectionbody">
<div class="sect3">
<h4 id="_server_browser">Server browser</h4>
<div class="paragraph">
<p>The server browser retrieves and lists all publicly broadcasting servers (including official ones) in a table.
These servers can be filtered by various parameters in order to display a more granular result.</p>
</div>
<div class="paragraph">
<p>After a server is selected from the list, the application continues to the mod validation step.</p>
</div>
<div class="paragraph">
<p>In order to use this feature, you must have a <a href="https://steamcommunity.com/dev/apikey">Steam API key</a>. You will be asked for a unique URL for your app when registering.
Since this key is for a personal use application and does not actually call back anywhere, set a generic local identifier here like "127.0.0.1".</p>
</div>
<div class="paragraph">
<p>You will be prompted to insert this key into the app when launching the server browser for the first time.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
It is not currently possible to save servers from the full server browser.
</td>
</tr>
</table>
</div>
<div class="sect4">
<h5 id="_filters">Filters</h5>
<div class="paragraph">
<p>The server browser exposes the following filters. These options can be combined.</p>
</div>
<div class="paragraph">
<p>Untick filters to exclude those matches from the returned results. The "All maps" and "Keyword search" filters have special behavior (see below).
You must have a minimum of one filter active to return any results.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Filter</th>
<th class="tableblock halign-left valign-top">Usage</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">All maps</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Return all available map types being served.
Note: disabling this option will present a list from which you can select one specific map type (e.g., namalsk)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Daytime</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Include servers with gametime between 0600 and 1659</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Nighttime</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Include servers with gametime between 1700 and 0559</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Empty</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Include servers with 0 current players</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Full</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Include servers at maximum capacity</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Low population</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Include servers with fewer than 10 players online</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Non-ASCII titles</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Include servers with special symbols, Unicode, or text in the title.
Note: disabling this filter will also exclude CJK languages, Cyrillic, and other special character sets.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Keyword</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Select this option to filter by server titles matching a specific word or phrase (case insensitive)</p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect4">
<h5 id="_table_details">Table details</h5>
<div class="paragraph">
<p>After retrieval, the browser presents a table of results with the following parameters.
Due to the density of information, the table will try to render at a minimum of 1920x1080 on a desktop or at fullscreen on a Steam Deck.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Total matches/total servers queried</p>
</li>
<li>
<p>Total players online on all servers</p>
</li>
<li>
<p>Map name</p>
</li>
<li>
<p>Server title</p>
</li>
<li>
<p>Gametime: the in-game time</p>
</li>
<li>
<p>Players: this is zero-padded for sorting purposes</p>
</li>
<li>
<p>Max players: this is zero-padded for sorting purposes</p>
</li>
<li>
<p>Distance: the physical distance to the server in kilometers is calculated by geolocation</p>
</li>
<li>
<p>IP: the IP address and port</p>
</li>
<li>
<p>Qport: the query port used to retrieve metadata and rules</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_my_servers">My servers</h4>
<div class="paragraph">
<p>Fetches detailed server information on the list of servers saved in the config file. This is the main place you interact with DZGUI when choosing a server from your list. These details are:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Server</strong>: name of the server, truncated to 50 chars</p>
</li>
<li>
<p><strong>IP/port</strong>: IP address and port in the format <code>ip:port</code></p>
</li>
<li>
<p><strong>Players</strong>: online players, in the format <code>current/max</code></p>
</li>
<li>
<p><strong>Gametime</strong>: in-game time on the 24-hour clock</p>
</li>
<li>
<p><strong>Status</strong>: whether the server is online or not</p>
</li>
<li>
<p><strong>ID</strong>: numerical ID from BattleMetrics, used as a reference when troubleshooting or sharing servers</p>
</li>
<li>
<p><strong>Ping</strong>: round-trip response time from the server</p>
</li>
</ul>
</div>
</div>
<div class="sect3">
<h4 id="_quick_connect_to_favorite_server">Quick connect to favorite server</h4>
<div class="paragraph">
<p>Bypasses the server list and quick-connects to a single favorite server specified in advance using the <a href="#_add_favorite_server">Add favorite server</a> option.</p>
</div>
</div>
<div class="sect3">
<h4 id="_connect_by_ip">Connect by IP</h4>
<div class="paragraph">
<p>Instead of relying on server IDs, returns the list of maps behind a given IP. Provide only the IP; no port is necessary. This returns the server metadata for you to verify before connecting.</p>
</div>
<div class="paragraph">
<p>If there are multiple maps hosted behind an IP (e.g. different maps on varying ports), the application will list all of them.</p>
</div>
<div class="paragraph">
<p>In order to use this feature, you must have a <a href="https://steamcommunity.com/dev/apikey">Steam API key</a>. You will be asked for a unique URL for your app when registering.
Since this key is for a personal use application and does not actually call back anywhere, set a generic local identifier here like "127.0.0.1".</p>
</div>
<div class="paragraph">
<p>You will be prompted to insert this key into the app when launching the "Connect by IP" feature for the first time.</p>
</div>
</div>
<div class="sect3">
<h4 id="_add_server_by_id">Add server by ID</h4>
<div class="paragraph">
<p>Prompts you to add servers to the config file by ID. An indefinite number of servers can be added. These will be listed when using the <a href="#Launch server list">[Launch server list]</a> option.</p>
</div>
</div>
<div class="sect3">
<h4 id="_add_favorite_server">Add favorite server</h4>
<div class="paragraph">
<p>Prompts you to add/change a favorite server to the config file by ID. The name of the server will be updated in the header of the app. This server is used when selecting the <a href="#_quick_connect_to_favorite_server">Quick connect to favorite server</a> option. If a favorite server is already enabled, this option switches to "Change favorite server."</p>
</div>
</div>
<div class="sect3">
<h4 id="_delete_server">Delete server</h4>
<div class="paragraph">
<p>Prints a list of human-readable servers currently saved, and lets you delete them by selecting one from the list.</p>
</div>
</div>
<div class="sect3">
<h4 id="_list_installed_mods">List installed mods</h4>
<div class="paragraph">
<p>Prints a scrollable dialog containing all locally-installed mods and their corresponding symlinks IDs.</p>
</div>
</div>
<div class="sect3">
<h4 id="_toggle_debug_mode">Toggle debug mode</h4>
<div class="paragraph">
<p>Toggles debug mode, which is used to perform dry-runs and output what parameters would have been used to connect to a server. Enabling debug mode also exposes the <a href="#_debug_options">Debug options</a> menu, which contains some settings for advanced use.</p>
</div>
</div>
<div class="sect3">
<h4 id="_report_bug">Report bug</h4>
<div class="paragraph">
<p>Using the system browser, opens the project&#8217;s GitHub issues page to submit a report.</p>
</div>
</div>
<div class="sect3">
<h4 id="_help_file">Help file</h4>
<div class="paragraph">
<p>Using the system browser, opens this document.</p>
</div>
</div>
<div class="sect3">
<h4 id="_view_changelog">View changelog</h4>
<div class="paragraph">
<p>Prints the entire changelog up to the current version (and unreleased changes) in-app.</p>
</div>
</div>
<div class="sect3">
<h4 id="_debug_options">Debug options</h4>
<div class="paragraph">
<p>If enabled, this menu contains a sub-menu with various advanced features, enumerated below.</p>
</div>
<div class="sect4">
<h5 id="_toggle_branch">Toggle branch</h5>
<div class="paragraph">
<p>Used to toggle the branch to fetch DZGUI from between <code>stable</code> and <code>testing</code>. The app ships with the stable branch enabled, with the testing branch being used to elaborate various experimental features.</p>
</div>
</div>
<div class="sect4">
<h5 id="_generate_debug_log">Generate debug log</h5>
<div class="paragraph">
<p>Writes a list of your current settings to a local file that can be pasted into bug reports.</p>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_config_file_keyvalue_pairs">Config file key/value pairs</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Under normal usage, these values are populated and toggled automatically in-app. This config file is partially compatible DZTUI.</p>
</div>
<table class="tableblock frame-all grid-all fit-content">
<colgroup>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Key</th>
<th class="tableblock halign-left valign-top">Value</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>api_key</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">the API key generated at BattleMetrics. See <a href="#_setup">Setup</a></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>whitelist</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">comma-separated list of server IDs from BattleMetrics; integer-values only</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>fav</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">server to display in the <code>Fav</code> field and to quick-connect to (must be one only); integer-values only</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>name</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">an arbitrary "handle" name used to identify the player on a server (required by some servers)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>debug</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">by default, set to 0; set to <code>1</code> to print launch options that would have been run, instead of actually connecting (used for troubleshooting and submitting bug reports)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>branch</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">by default, set to <code>stable</code>; set to <code>testing</code> to fetch the testing branch</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>seen_news</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">stores a hash of the news item last seen by the client. This is used to suppress news messages until a new one is posted.</p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="sect1">
<h2 id="_troubleshootingfaq">Troubleshooting/FAQ</h2>
<div class="sectionbody">
<div class="paragraph">
<div class="title">Mods take a long time to synchronize when subscribing from Workshop</div>
<p>Steam schedules the downloads in the background and processes them as they are subscribed to. This process is not instantaneous and can take some time. Check the <strong>Downloads</strong> pane of Steam to see live progress.</p>
</div>
<div class="paragraph">
<div class="title">Game does not launch through Steam</div>
<p>Check the logs emitted by Steam in the terminal, or in <code>&lt;steam path&gt;/error.log</code>.</p>
</div>
<div class="paragraph">
<div class="title">Game launches, but throws a "mod missing/check PBO file" error when connecting</div>
<p>In rare cases, the server may be using misconfigured, malformed, or obsolete mods. This is out of our control and depends on server operators checking their mods for integrity. If you believe the mods are correct and this is a bug, please report it.</p>
</div>
<div class="paragraph">
<div class="title">Game and server launches, but when joining the game world, an error occurs</div>
<p>A mod is corrupted or the issue lies with the server. Replace the mods in question and reconnect.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_testers_wanted">Testers wanted</h2>
<div class="sectionbody">
<div class="paragraph">
<p>If any of the below apply to you, your <a href="https://github.com/aclist/dztui/issues">reports</a> are encouraged:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Using a high resolution (4K) monitor</p>
</li>
<li>
<p>Own a Steam Deck</p>
</li>
<li>
<p>Seeking DZTUI functionality in DZGUI, or vice versa</p>
</li>
<li>
<p>Playing on a server with an enormous amount of mods</p>
</li>
<li>
<p>Playing on a server with non-English mod names (?)</p>
</li>
</ul>
</div>
</div>
</div>
</div>
</body>
</html>