<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://pavlovwiki.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Junt</id>
	<title>Pavlov VR Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://pavlovwiki.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Junt"/>
	<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php/Special:Contributions/Junt"/>
	<updated>2026-05-09T13:23:53Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Main_Page&amp;diff=1079</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Main_Page&amp;diff=1079"/>
		<updated>2025-02-04T20:38:26Z</updated>

		<summary type="html">&lt;p&gt;Junt: Fixed vanity URL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Welcome to the Pavlov VR Wiki. &amp;lt;br /&amp;gt;&lt;br /&gt;
Pavlov is a team-based multiplayer VR shooter game with realistic weapon handling and the most popular VR shooter of all time. Play a variety of game modes with over 65 interactable weapons and attachments in various environments. &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Pavlov has an active Discord. You can join the Pavlov VR Discord here: https://discord.com/invite/pavlovvr&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GET PAVLOV ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://store.steampowered.com/app/555160/Pavlov_VR/ PC]&lt;br /&gt;
| Pavlov is available on PCVR through Steam&lt;br /&gt;
|-&lt;br /&gt;
| [https://www.meta.com/en-gb/experiences/2443267419018232/ QUEST]&lt;br /&gt;
| Pavlov is available on The Quest Store&lt;br /&gt;
|-&lt;br /&gt;
| [https://store.playstation.com/en-us/concept/10005322 PS5]&lt;br /&gt;
| Pavlov is available on the Playstation Store &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HELP/TROUBLESHOOTING ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''[[PC Troubleshooting|PC Troubleshooting]]'''&lt;br /&gt;
| Troubleshoot some of the issues related to Pavlov on PC&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Quest Troubleshooting|Quest Troubleshooting]]'''&lt;br /&gt;
| Troubleshoot some of the issues related to Pavlov Shack on Quest&lt;br /&gt;
|-&lt;br /&gt;
| '''[[PS5 Troubleshooting|PS5 Troubleshooting]]'''&lt;br /&gt;
| Troubleshoot some of the issues related to the PSVR2 version of pavlov&lt;br /&gt;
|-&lt;br /&gt;
| [https://discord.com/invite/pavlov-vr Contact Support]&lt;br /&gt;
| The Pavlov VR Discord is the main place to ask questions and get troubleshooting help. If you don't have discord you can also reach support at support@vankrupt.com.&lt;br /&gt;
|-&lt;br /&gt;
| [https://www.vankrupt.com/#contact Jobs]&lt;br /&gt;
| Vankrupt Games is hiring. If you are looking for work please email jobs@vankrupt.com. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GAME INFORMATION ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Weapons|Weapons]]'''&lt;br /&gt;
| List and information on the weapons of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Vehicles|Vehicles]]'''&lt;br /&gt;
| List and information on the vehicles of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Attachments|Attachments]]'''&lt;br /&gt;
| List and information on the Attachments of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Default Maps|Default Maps]]'''&lt;br /&gt;
| List, Pictures and information on the Default maps of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Gamemodes|Game Modes]]'''&lt;br /&gt;
| List and information on the game modes of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Achievements|Achievements]]'''&lt;br /&gt;
| List and information on the achievements of Pavlov VR available on the PS5 version&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Update Changelog|Update Changelog]]'''&lt;br /&gt;
| A history of changes made to the game&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Game Settings|Game Settings]]'''&lt;br /&gt;
| List and information on the game settings&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== WORKSHOP/MAPMAKING/MODDING ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/vankruptgames/PavlovVR-ModKit/tree/5.1.1 Modkit 5.1.1]&lt;br /&gt;
| Current official PCVR Modkit for UE 5.1.1&lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/vankruptgames/PavlovVR-ModKit/tree/Pavlov-Shack Shack Modkit]&lt;br /&gt;
|Current official Shack Modkit for UE 5.1.1&lt;br /&gt;
|-&lt;br /&gt;
|[[PC Mod Managers|'''3rd Party Mod Managers''']]&lt;br /&gt;
|(PC Only) Update, Download, or Remove mods outside of the game&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Getting Started|Getting Started]]'''&lt;br /&gt;
| A basic Tutorial on how to download and set up the Editor, create your first level and upload it&lt;br /&gt;
|-&lt;br /&gt;
| '''[[ItemIDs|ItemIDs]]'''&lt;br /&gt;
| All of the items in the game&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Community Modkit Tools|Community Modkit Tools]]'''&lt;br /&gt;
| Community made tools for map makers&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Community Gamemodes|Community Gamemodes]]'''&lt;br /&gt;
| Community made game modes&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Workshop troubleshooting|Workshop troubleshooting]]'''&lt;br /&gt;
| Troubleshoot common mistakes with workshop projects&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Helpful Videos|Helpful Videos]]'''&lt;br /&gt;
| Video Tutorials&lt;br /&gt;
|-&lt;br /&gt;
|'''[[Making Skins]]'''&lt;br /&gt;
|Creating weapon and player model skins for Pavlov&lt;br /&gt;
|-&lt;br /&gt;
|'''[[Custom Guns]]'''&lt;br /&gt;
|How to use the modkit to add custom weapons to your level&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== WORKSHOP GUIDES ====&lt;br /&gt;
&lt;br /&gt;
| '''[[Changing the character model|Changing the character model]]'''&lt;br /&gt;
| A guide on replacing character models with your own&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Replacing the scoreboard|Replacing the scoreboard]]'''&lt;br /&gt;
| How to replace the scoreboard with your own, or turn it into a custom menu&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Modeling in Blender]]'''&lt;br /&gt;
| A quick tip sheet for using Blender to model in Unreal Engine&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Bot Navigation|Bot Navigation]]'''&lt;br /&gt;
| A more detailed topic about Bot Navigation and tips for your custom maps&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== COMMUNITY SERVERS ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Setting up a dedicated server|Setting up a dedicated server]]'''&lt;br /&gt;
| A guide and information on setting up a community server&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Troubleshooting Servers|Troubleshooting Servers]]'''&lt;br /&gt;
| Troubleshooting steps to help with setting up a community server. &lt;br /&gt;
|-&lt;br /&gt;
|[[Hosting Providers]]&lt;br /&gt;
|If you wish to purchase a Pavlov server instead of setting it up yourself here is a list of hosting providers&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Rcon Overview and Commands|Rcon Overview and Commands]]'''&lt;br /&gt;
| RCON (Remote CONnection) is a tool that allows server owners to manage their server and do things like spawn items. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OTHER TOPICS ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''[[PAV TV|PAV TV]]'''&lt;br /&gt;
| Current official game modes and how to play them&lt;br /&gt;
|-&lt;br /&gt;
|[[Pavlov TV API]]&lt;br /&gt;
|How to use the Pavlov TV API for custom OBS interfaces&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Main_Page&amp;diff=1078</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Main_Page&amp;diff=1078"/>
		<updated>2025-02-04T20:37:31Z</updated>

		<summary type="html">&lt;p&gt;Junt: fixed url&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Welcome to the Pavlov VR Wiki. &amp;lt;br /&amp;gt;&lt;br /&gt;
Pavlov is a team-based multiplayer VR shooter game with realistic weapon handling and the most popular VR shooter of all time. Play a variety of game modes with over 65 interactable weapons and attachments in various environments. &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Pavlov has an active Discord. You can join the Pavlov VR Discord here: [https://discord.com/invite/pavlovvr https://discord.com/invite/pavlov-vr]&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GET PAVLOV ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://store.steampowered.com/app/555160/Pavlov_VR/ PC]&lt;br /&gt;
| Pavlov is available on PCVR through Steam&lt;br /&gt;
|-&lt;br /&gt;
| [https://www.meta.com/en-gb/experiences/2443267419018232/ QUEST]&lt;br /&gt;
| Pavlov is available on The Quest Store&lt;br /&gt;
|-&lt;br /&gt;
| [https://store.playstation.com/en-us/concept/10005322 PS5]&lt;br /&gt;
| Pavlov is available on the Playstation Store &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HELP/TROUBLESHOOTING ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''[[PC Troubleshooting|PC Troubleshooting]]'''&lt;br /&gt;
| Troubleshoot some of the issues related to Pavlov on PC&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Quest Troubleshooting|Quest Troubleshooting]]'''&lt;br /&gt;
| Troubleshoot some of the issues related to Pavlov Shack on Quest&lt;br /&gt;
|-&lt;br /&gt;
| '''[[PS5 Troubleshooting|PS5 Troubleshooting]]'''&lt;br /&gt;
| Troubleshoot some of the issues related to the PSVR2 version of pavlov&lt;br /&gt;
|-&lt;br /&gt;
| [https://discord.com/invite/pavlov-vr Contact Support]&lt;br /&gt;
| The Pavlov VR Discord is the main place to ask questions and get troubleshooting help. If you don't have discord you can also reach support at support@vankrupt.com.&lt;br /&gt;
|-&lt;br /&gt;
| [https://www.vankrupt.com/#contact Jobs]&lt;br /&gt;
| Vankrupt Games is hiring. If you are looking for work please email jobs@vankrupt.com. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GAME INFORMATION ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Weapons|Weapons]]'''&lt;br /&gt;
| List and information on the weapons of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Vehicles|Vehicles]]'''&lt;br /&gt;
| List and information on the vehicles of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Attachments|Attachments]]'''&lt;br /&gt;
| List and information on the Attachments of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Default Maps|Default Maps]]'''&lt;br /&gt;
| List, Pictures and information on the Default maps of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Gamemodes|Game Modes]]'''&lt;br /&gt;
| List and information on the game modes of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Achievements|Achievements]]'''&lt;br /&gt;
| List and information on the achievements of Pavlov VR available on the PS5 version&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Update Changelog|Update Changelog]]'''&lt;br /&gt;
| A history of changes made to the game&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Game Settings|Game Settings]]'''&lt;br /&gt;
| List and information on the game settings&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== WORKSHOP/MAPMAKING/MODDING ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/vankruptgames/PavlovVR-ModKit/tree/5.1.1 Modkit 5.1.1]&lt;br /&gt;
| Current official PCVR Modkit for UE 5.1.1&lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/vankruptgames/PavlovVR-ModKit/tree/Pavlov-Shack Shack Modkit]&lt;br /&gt;
|Current official Shack Modkit for UE 5.1.1&lt;br /&gt;
|-&lt;br /&gt;
|[[PC Mod Managers|'''3rd Party Mod Managers''']]&lt;br /&gt;
|(PC Only) Update, Download, or Remove mods outside of the game&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Getting Started|Getting Started]]'''&lt;br /&gt;
| A basic Tutorial on how to download and set up the Editor, create your first level and upload it&lt;br /&gt;
|-&lt;br /&gt;
| '''[[ItemIDs|ItemIDs]]'''&lt;br /&gt;
| All of the items in the game&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Community Modkit Tools|Community Modkit Tools]]'''&lt;br /&gt;
| Community made tools for map makers&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Community Gamemodes|Community Gamemodes]]'''&lt;br /&gt;
| Community made game modes&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Workshop troubleshooting|Workshop troubleshooting]]'''&lt;br /&gt;
| Troubleshoot common mistakes with workshop projects&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Helpful Videos|Helpful Videos]]'''&lt;br /&gt;
| Video Tutorials&lt;br /&gt;
|-&lt;br /&gt;
|'''[[Making Skins]]'''&lt;br /&gt;
|Creating weapon and player model skins for Pavlov&lt;br /&gt;
|-&lt;br /&gt;
|'''[[Custom Guns]]'''&lt;br /&gt;
|How to use the modkit to add custom weapons to your level&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== WORKSHOP GUIDES ====&lt;br /&gt;
&lt;br /&gt;
| '''[[Changing the character model|Changing the character model]]'''&lt;br /&gt;
| A guide on replacing character models with your own&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Replacing the scoreboard|Replacing the scoreboard]]'''&lt;br /&gt;
| How to replace the scoreboard with your own, or turn it into a custom menu&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Modeling in Blender]]'''&lt;br /&gt;
| A quick tip sheet for using Blender to model in Unreal Engine&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Bot Navigation|Bot Navigation]]'''&lt;br /&gt;
| A more detailed topic about Bot Navigation and tips for your custom maps&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== COMMUNITY SERVERS ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Setting up a dedicated server|Setting up a dedicated server]]'''&lt;br /&gt;
| A guide and information on setting up a community server&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Troubleshooting Servers|Troubleshooting Servers]]'''&lt;br /&gt;
| Troubleshooting steps to help with setting up a community server. &lt;br /&gt;
|-&lt;br /&gt;
|[[Hosting Providers]]&lt;br /&gt;
|If you wish to purchase a Pavlov server instead of setting it up yourself here is a list of hosting providers&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Rcon Overview and Commands|Rcon Overview and Commands]]'''&lt;br /&gt;
| RCON (Remote CONnection) is a tool that allows server owners to manage their server and do things like spawn items. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OTHER TOPICS ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''[[PAV TV|PAV TV]]'''&lt;br /&gt;
| Current official game modes and how to play them&lt;br /&gt;
|-&lt;br /&gt;
|[[Pavlov TV API]]&lt;br /&gt;
|How to use the Pavlov TV API for custom OBS interfaces&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Main_Page&amp;diff=1055</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Main_Page&amp;diff=1055"/>
		<updated>2024-12-04T22:51:24Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Welcome to the Pavlov VR Wiki. &amp;lt;br /&amp;gt;&lt;br /&gt;
Pavlov is a team-based multiplayer VR shooter game with realistic weapon handling and the most popular VR shooter of all time. Play a variety of game modes with over 65 interactable weapons and attachments in various environments. &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Pavlov has an active Discord. You can join the Pavlov VR Discord here: https://discord.com/invite/pavlov-vr&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GET PAVLOV ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://store.steampowered.com/app/555160/Pavlov_VR/ PC]&lt;br /&gt;
| Pavlov is available on PCVR through Steam&lt;br /&gt;
|-&lt;br /&gt;
| [https://www.meta.com/en-gb/experiences/2443267419018232/ QUEST]&lt;br /&gt;
| Pavlov is available on The Quest Store&lt;br /&gt;
|-&lt;br /&gt;
| [https://store.playstation.com/en-us/concept/10005322 PS5]&lt;br /&gt;
| Pavlov is available on the Playstation Store &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HELP/TROUBLESHOOTING ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''[[PC Troubleshooting|PC Troubleshooting]]'''&lt;br /&gt;
| Troubleshoot some of the issues related to Pavlov on PC&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Quest Troubleshooting|Quest Troubleshooting]]'''&lt;br /&gt;
| Troubleshoot some of the issues related to Pavlov Shack on Quest&lt;br /&gt;
|-&lt;br /&gt;
| '''[[PS5 Troubleshooting|PS5 Troubleshooting]]'''&lt;br /&gt;
| Troubleshoot some of the issues related to the PSVR2 version of pavlov&lt;br /&gt;
|-&lt;br /&gt;
| [https://discord.com/invite/pavlov-vr Contact Support]&lt;br /&gt;
| The Pavlov VR Discord is the main place to ask questions and get troubleshooting help. If you don't have discord you can also reach support at support@vankrupt.com.&lt;br /&gt;
|-&lt;br /&gt;
| [https://www.vankrupt.com/#contact Jobs]&lt;br /&gt;
| Vankrupt Games is hiring. If you are looking for work please email jobs@vankrupt.com. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GAME INFORMATION ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Weapons|Weapons]]'''&lt;br /&gt;
| List and information on the weapons of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Vehicles|Vehicles]]'''&lt;br /&gt;
| List and information on the vehicles of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Attachments|Attachments]]'''&lt;br /&gt;
| List and information on the Attachments of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Default Maps|Default Maps]]'''&lt;br /&gt;
| List, Pictures and information on the Default maps of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Gamemodes|Game Modes]]'''&lt;br /&gt;
| List and information on the game modes of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Achievements|Achievements]]'''&lt;br /&gt;
| List and information on the achievements of Pavlov VR available on the PS5 version&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Update Changelog|Update Changelog]]'''&lt;br /&gt;
| A history of changes made to the game&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Game Settings|Game Settings]]'''&lt;br /&gt;
| List and information on the game settings&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== WORKSHOP/MAPMAKING/MODDING ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/vankruptgames/PavlovVR-ModKit/tree/5.1.1 Modkit 5.1.1]&lt;br /&gt;
| Current official PCVR Modkit for UE 5.1.1&lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/vankruptgames/PavlovVR-ModKit/tree/Pavlov-Shack Shack Modkit]&lt;br /&gt;
|Current official Shack Modkit for UE 5.1.1&lt;br /&gt;
|-&lt;br /&gt;
|[[PC Mod Managers|'''3rd Party Mod Managers''']]&lt;br /&gt;
|(PC Only) Update, Download, or Remove mods outside of the game&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Getting Started|Getting Started]]'''&lt;br /&gt;
| A basic Tutorial on how to download and set up the Editor, create your first level and upload it&lt;br /&gt;
|-&lt;br /&gt;
| '''[[ItemIDs|ItemIDs]]'''&lt;br /&gt;
| All of the items in the game&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Community Modkit Tools|Community Modkit Tools]]'''&lt;br /&gt;
| Community made tools for map makers&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Community Gamemodes|Community Gamemodes]]'''&lt;br /&gt;
| Community made game modes&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Workshop troubleshooting|Workshop troubleshooting]]'''&lt;br /&gt;
| Troubleshoot common mistakes with workshop projects&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Helpful Videos|Helpful Videos]]'''&lt;br /&gt;
| Video Tutorials&lt;br /&gt;
|-&lt;br /&gt;
|'''[[Making Skins]]'''&lt;br /&gt;
|Creating weapon and player model skins for Pavlov&lt;br /&gt;
|-&lt;br /&gt;
|'''[[Custom Guns]]'''&lt;br /&gt;
|How to use the modkit to add custom weapons to your level&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== WORKSHOP GUIDES ====&lt;br /&gt;
&lt;br /&gt;
| '''[[Changing the character model|Changing the character model]]'''&lt;br /&gt;
| A guide on replacing character models with your own&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Replacing the scoreboard|Replacing the scoreboard]]'''&lt;br /&gt;
| How to replace the scoreboard with your own, or turn it into a custom menu&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Modeling in Blender]]'''&lt;br /&gt;
| A quick tip sheet for using Blender to model in Unreal Engine&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Bot Navigation|Bot Navigation]]'''&lt;br /&gt;
| A more detailed topic about Bot Navigation and tips for your custom maps&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== COMMUNITY SERVERS ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Setting up a dedicated server|Setting up a dedicated server]]'''&lt;br /&gt;
| A guide and information on setting up a community server&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Troubleshooting Servers|Troubleshooting Servers]]'''&lt;br /&gt;
| Troubleshooting steps to help with setting up a community server. &lt;br /&gt;
|-&lt;br /&gt;
|[[Hosting Providers]]&lt;br /&gt;
|If you wish to purchase a Pavlov server instead of setting it up yourself here is a list of hosting providers&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Rcon Overview and Commands|Rcon Overview and Commands]]'''&lt;br /&gt;
| RCON (Remote CONnection) is a tool that allows server owners to manage their server and do things like spawn items. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OTHER TOPICS ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''[[PAV TV|PAV TV]]'''&lt;br /&gt;
| Current official game modes and how to play them&lt;br /&gt;
|-&lt;br /&gt;
|[[Pavlov TV API]]&lt;br /&gt;
|How to use the Pavlov TV API for custom OBS interfaces&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=File:GenerateKey1.png&amp;diff=1047</id>
		<title>File:GenerateKey1.png</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=File:GenerateKey1.png&amp;diff=1047"/>
		<updated>2024-12-03T20:24:35Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;GenerateKey1&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1043</id>
		<title>Pavlov TV API</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1043"/>
		<updated>2024-12-03T18:35:09Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pavlov TV has exposed endpoints to allow users to create their own UI interface for use in steaming software such as OBS, data-sets, or any other purpose of your choosing from Pavlov replays.&lt;br /&gt;
&lt;br /&gt;
=== Enable the API ===&lt;br /&gt;
1. Ensure you have PavlovVR installed on steam and locate the GameUserSettings.ini file.&lt;br /&gt;
&lt;br /&gt;
This file on windows machines will usually be found at [ %localappdata%\Pavlov\Saved\Config\Windows\GameUserSettings.ini ] You can paste this into your file explorer(without the brackets [] ) to open the file. &lt;br /&gt;
&lt;br /&gt;
2. Go the the bottom portion of the [/Script/Pavlov.PavlovGameUserSettings] part of the file, ABOVE[ScalabilityGroups]. &lt;br /&gt;
&lt;br /&gt;
3. Add PavTVAPIPort=1234 onto the file at that location. 1234 is the port that will be used, if you know this port is in use already, please find another on your device that is not in use and list it here.&lt;br /&gt;
&lt;br /&gt;
4. Run PavTV&lt;br /&gt;
&lt;br /&gt;
=== Using OBS with your generated/written HTML file ===&lt;br /&gt;
1. Copy your HTML file path &lt;br /&gt;
&lt;br /&gt;
2. Go to “Sources” and click the “+” button &lt;br /&gt;
&lt;br /&gt;
3. Add browser source and create new (name it whatever) &lt;br /&gt;
&lt;br /&gt;
4. Adjust Resolution of the source(recording size) &lt;br /&gt;
&lt;br /&gt;
5. Paste in the HTML file path and click OK&lt;br /&gt;
&lt;br /&gt;
=== The GET Endpoints ===&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;If you are new to this, you are able to put any of these endpoint “links” into your browser or run curl requests and check that they are functional&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus''' &lt;br /&gt;
&lt;br /&gt;
Ex.in JS to fetch this endpoint on port 1234 const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;); const matchData = await response.json()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const matchData = await response.json();&amp;lt;/blockquote&amp;gt;'''Elements in MatchStatus'''&lt;br /&gt;
&lt;br /&gt;
MatchActive- Will return whether a match is currently ongoing or not &lt;br /&gt;
&lt;br /&gt;
''Ex. “MatchActive”: true or “MatchActive”: false''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RoundTime- Will return the active time into the round in seconds&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundTime&amp;quot;: 105''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Teams- Will return true/false if the there are teams in this match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Teams&amp;quot;: true''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RoundsLeft- Will return the maximum number of rounds left in the match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundsLeft&amp;quot;: 15''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Team0Score- Will return blue team’s score&lt;br /&gt;
&lt;br /&gt;
Team1Score- Will return red team’s score&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Score&amp;quot;: 1,''&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Team1Score&amp;quot;: 2,''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
AttackingTeamId- Will return the ID of the currently attacking team 0-blue, 1- red&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;AttackingTeamId&amp;quot;: 1''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Team0Cash- Will return blue team’s collective cash &lt;br /&gt;
&lt;br /&gt;
Team1Cash- Will return red team’s collective cash&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Cash&amp;quot;: 2500, &amp;quot;Team1Cash&amp;quot;: 2500''&lt;br /&gt;
MatchStatus.Team0 or MatchStatus.Team1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus.Team0 or MatchStatus.Team1'''&lt;br /&gt;
&lt;br /&gt;
''Ex.in JS to fetch Team0 from MatchStatus''&amp;lt;blockquote&amp;gt;const teamZero = matchData.Team0 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const teamOne = matchData.Team1&amp;lt;/blockquote&amp;gt;These will give you an array of JSON style objects&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|    &amp;quot;Team0&amp;quot;: [&lt;br /&gt;
&lt;br /&gt;
       {&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Name&amp;quot;: &amp;quot;JaredOne&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Cash&amp;quot;: 1500,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Score&amp;quot;: 8,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Kills&amp;quot;: 3,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Deaths&amp;quot;: 2,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Dead&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Health&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Armour&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Helmet&amp;quot;: false,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;PrimaryWeapon&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://test-pav-tv.vankrupt.net/icons/m16.png&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;SecondaryWeapons&amp;quot;: [&lt;br /&gt;
&lt;br /&gt;
               &amp;quot;&amp;lt;nowiki&amp;gt;https://test-pav-tv.vankrupt.net/icons/knife.png&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
           ],&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Avatar&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://prod.cdn.pavlov-vr.com/avatar/ThisTotallyExistsZero.png&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Bot&amp;quot;: false&lt;br /&gt;
&lt;br /&gt;
       },&lt;br /&gt;
&lt;br /&gt;
       {&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Name&amp;quot;: &amp;quot;JaredTwo&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Cash&amp;quot;: 150,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Score&amp;quot;: 6,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Kills&amp;quot;: 3,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Deaths&amp;quot;: 2,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Dead&amp;quot;: false,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Health&amp;quot;: 100,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Armour&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Helmet&amp;quot;: false,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;PrimaryWeapon&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://test-pav-tv.vankrupt.net/icons/m16.png&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;SecondaryWeapons&amp;quot;: [&lt;br /&gt;
&lt;br /&gt;
               &amp;quot;&amp;lt;nowiki&amp;gt;https://test-pav-tv.vankrupt.net/icons/knife.png&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
           ],&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Avatar&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://prod.cdn.pavlov-vr.com/avatar/ThisTotallyExistsOne.png&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Bot&amp;quot;: false&lt;br /&gt;
&lt;br /&gt;
       },&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can then grab subsequent information from the teams like this&amp;lt;blockquote&amp;gt;matchData.Team0[0].Name&amp;lt;/blockquote&amp;gt;This would return the name in string form from the first player of Team0. You can do this with all of the information relating to the player, players are returned in order of score highest to lowest [as how it would show up in scoreboard]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== For the values in each player: ====&lt;br /&gt;
'''Name''' returns a &amp;lt;u&amp;gt;String&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Cash, Score, Kills, Deaths, Health,''' and '''Armor''' are all returning &amp;lt;u&amp;gt;Integer&amp;lt;/u&amp;gt; values&lt;br /&gt;
&lt;br /&gt;
'''Dead, Helmet,''' and '''Bot''' return &amp;lt;u&amp;gt;Bool&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''PrimaryWeapon, SecondaryWeapon,''' and '''Avatar''' all return &amp;lt;u&amp;gt;strings&amp;lt;/u&amp;gt; containing links to image files that can be used in your scoreboard.&lt;br /&gt;
&lt;br /&gt;
=== Killfeed GET Endpoint ===&lt;br /&gt;
Gives you a live killfeed of the match you are watching Ex. in Js of how you would get this endpoint as a Json object&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/Killfeed'&amp;lt;/nowiki&amp;gt;); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const killfeedData = await response.json();&amp;lt;/blockquote&amp;gt;Returns the most recent &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;quot;Killfeed&amp;quot;: [&lt;br /&gt;
&lt;br /&gt;
       {&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Killer&amp;quot;: &amp;quot;jaredOne&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Killed&amp;quot;: &amp;quot;jaredTwo&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Headshot&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;EntryLifespan&amp;quot;: 3.2541036605834961,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;KilledBy&amp;quot;: &amp;quot;Tokarev&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;KillerTeam&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;KilledTeam&amp;quot;: 1&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
   ]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ex of how you would get any of the following for the first object in the killfeed&amp;lt;blockquote&amp;gt;killfeedData.killfeed[0].killer&amp;lt;/blockquote&amp;gt;'''Killer''' and '''Killed''' return &amp;lt;u&amp;gt;''String''&amp;lt;/u&amp;gt; objects of the killer and killed respectively&lt;br /&gt;
&lt;br /&gt;
'''Headshot''' returns whether the death was caused by a headshot, in the form of a &amp;lt;u&amp;gt;bool&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''EntryLifespan''' returns the time left counting down from 4 seconds in a &amp;lt;u&amp;gt;float/number&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''KilledBy''' returns the weaponId of the killing weapon in a ''string'' &lt;br /&gt;
&lt;br /&gt;
'''KillerTeam''' and '''KilledTeam''' returns either 0(blue) or 1(red) team of the Killer as an &amp;lt;u&amp;gt;Integer&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MatchEvents GET Endpoint ===&lt;br /&gt;
Gives you an event log for things like Win and Round, will list ALL events during the round if watching a replay, will list them as they happen if watching live&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchEvents'&amp;lt;/nowiki&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
const eventData = await response.json();&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
   &amp;quot;MatchTime&amp;quot;: 48.085689544677734,&lt;br /&gt;
&lt;br /&gt;
   &amp;quot;TotalTime&amp;quot;: 80.008003234863281,&lt;br /&gt;
&lt;br /&gt;
   &amp;quot;Events&amp;quot;: [&lt;br /&gt;
&lt;br /&gt;
       {&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Name&amp;quot;: &amp;quot;Round&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Time&amp;quot;: 15,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;AdditionalData&amp;quot;: 1&lt;br /&gt;
&lt;br /&gt;
       },&lt;br /&gt;
&lt;br /&gt;
       {&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Name&amp;quot;: &amp;quot;Win&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Time&amp;quot;: 31,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;AdditionalData&amp;quot;: 1&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Name''' gives the event name in a &amp;lt;u&amp;gt;string&amp;lt;/u&amp;gt; being either “Round”, “Win”, “Planted” &lt;br /&gt;
&lt;br /&gt;
'''Time''' gives the time in seconds in &amp;lt;u&amp;gt;integer&amp;lt;/u&amp;gt; form of the event going into the game [will list events from start to end]&lt;br /&gt;
&lt;br /&gt;
'''AdditionalData''' will be dependent for the event type&lt;br /&gt;
&lt;br /&gt;
-For a “Win” event 0 will represent Team0 victory, 1 will represent Team1 victory&lt;br /&gt;
&lt;br /&gt;
-For a “Round” event the number returned will represent what round it is &lt;br /&gt;
&lt;br /&gt;
-For a “Planted” event the number does not matter it will always be 0&lt;br /&gt;
&lt;br /&gt;
=== Camera Paths ===&lt;br /&gt;
Steps to Use: &lt;br /&gt;
&lt;br /&gt;
1. Go into a map and record a camera path for keys [1], [2], [3] , or [4], using LCtrl + [Key]  The path will be saved to the api endpoint located here:&amp;lt;blockquote&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:1234/Camera/Path/#&amp;lt;/nowiki&amp;gt; &amp;lt;/blockquote&amp;gt;'''NOTE''': Path values start at 0, so your [1] key will be Path 0, [2] is Path 1, [3] is Path 2, and [4] is Path 3. &lt;br /&gt;
&lt;br /&gt;
'''NOTE 2''': Camera paths are deleted in between matches so make sure to save them before exiting &lt;br /&gt;
&lt;br /&gt;
3. You can play the path with LShift + [Key]&lt;br /&gt;
&lt;br /&gt;
=== Camera Path GET Endpoint - Retrieve saved camera path ===&lt;br /&gt;
Javascript example of how to use it &lt;br /&gt;
&lt;br /&gt;
'''NOTE''': Replace the “#” with the number path corresponding above 0, 1, 2, 3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/Camera/Path/#'&amp;lt;/nowiki&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const cameraPath = await response.json();&amp;lt;/blockquote&amp;gt;Example of returned path with a single point&amp;lt;blockquote&amp;gt;{&amp;quot;MapName&amp;quot;:&amp;quot;Oilrig&amp;quot;,&amp;quot;PathNumber&amp;quot;:0,&amp;quot;Points&amp;quot;:[{&amp;quot;Time&amp;quot;:0,&amp;quot;X&amp;quot;:7453.70035785 53522,&amp;quot;Y&amp;quot;:4584.0434961287474,&amp;quot;Z&amp;quot;:1223.5857404802396,&amp;quot;Pitch&amp;quot;:-4.375000059 6046359,&amp;quot;Yaw&amp;quot;:-155.3252139880791,&amp;quot;Roll&amp;quot;:0}]}&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MapName''' gives you the name of the map of the current match you are in as a &amp;lt;u&amp;gt;string&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''PathNumber''' is the same as the path you put in to retrieve it as an &amp;lt;u&amp;gt;integer&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Time''' gives you the time in seconds as a &amp;lt;u&amp;gt;float&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''X,Y,Z''' give you the relative x-plane, y-plane, z-plane position each in &amp;lt;u&amp;gt;float&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Pitch, Roll, Yaw''' give you the orientation of the camera relative to the world normal, each in &amp;lt;u&amp;gt;float&amp;lt;/u&amp;gt;&lt;br /&gt;
[[File:Pitchrollyaw.png|right|frameless]]&lt;br /&gt;
&lt;br /&gt;
===== Camera Play GET Endpoint - It will call your game to play the path currently in that slot =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ex. of fetching it in Js, since there is no response, you can just run fetch&amp;lt;blockquote&amp;gt;fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/Camera/Play/0'&amp;lt;/nowiki&amp;gt;)&amp;lt;/blockquote&amp;gt;This is the same principle as getting the path, though there will be no response to check it will just trigger immediately in your client and you will go along the active path bound to that key.&lt;br /&gt;
&lt;br /&gt;
==== Camera Path POST Endpoint - Insert your path into the live slot ====&lt;br /&gt;
Ex. of a javascript POST fetch request to the api&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|const response = await fetch(`localhost:1234/Camera/Path/1`, {&lt;br /&gt;
&lt;br /&gt;
     method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
     headers: {&lt;br /&gt;
&lt;br /&gt;
       &amp;quot;Content-Type&amp;quot;: &amp;quot;application/json&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
     },&lt;br /&gt;
&lt;br /&gt;
     body: JSON.stringify(data),&lt;br /&gt;
&lt;br /&gt;
   });&lt;br /&gt;
|}&lt;br /&gt;
Notes: MapName and PathNumber do '''NOT''' matter in terms of POST-ing a path, so you do not have to modify those at all. The only thing that really matters is the points. It is recommended to store paths in json files for modification and accessibility ease.&lt;br /&gt;
&lt;br /&gt;
'''GET &amp;lt;code&amp;gt;/Pause&amp;lt;/code&amp;gt; returns'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Paused&amp;quot;: true&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
'''POST &amp;lt;code&amp;gt;/Pause&amp;lt;/code&amp;gt;'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Paused&amp;quot;: false&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
returns&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Successful&amp;quot;: true&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if successful returns false it will also include a string field &amp;lt;code&amp;gt;Reason&amp;lt;/code&amp;gt; explaining why it failed &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET &amp;lt;code&amp;gt;/MatchTime&amp;lt;/code&amp;gt;''' &lt;br /&gt;
&lt;br /&gt;
returns&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;MatchTime&amp;quot;: 19.035182&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''POST &amp;lt;code&amp;gt;/MatchTime&amp;lt;/code&amp;gt;'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;MatchTime&amp;quot;: 120.5&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
returns&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Successful&amp;quot;: true&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if successful returns false it will also include a string field &amp;lt;code&amp;gt;Reason&amp;lt;/code&amp;gt; explaining why it failed GET &amp;lt;code&amp;gt;/ReplayList&amp;lt;/code&amp;gt; returns&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
   &amp;quot;Replays&amp;quot;: [&lt;br /&gt;
&lt;br /&gt;
       {&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Id&amp;quot;: &amp;quot;Sand-DM-2024.11.15-01.44.05&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Name&amp;quot;: &amp;quot;Sand&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;GameMode&amp;quot;: &amp;quot;DM&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Timestamp&amp;quot;: &amp;quot;2024-11-15T01:44:05.687Z&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Shack&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;LocalReplay&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Live&amp;quot;: false&lt;br /&gt;
&lt;br /&gt;
       },&lt;br /&gt;
&lt;br /&gt;
       {&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Id&amp;quot;: &amp;quot;ac8d018f56f3f820033d319af942be3e&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Name&amp;quot;: &amp;quot;Sand&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;GameMode&amp;quot;: &amp;quot;DM&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Timestamp&amp;quot;: &amp;quot;2024-11-27T08:28:37.362Z&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Shack&amp;quot;: false,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;LocalReplay&amp;quot;: false,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Live&amp;quot;: false&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
 ]&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''POST &amp;lt;code&amp;gt;/LoadReplay&amp;lt;/code&amp;gt;'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
   &amp;quot;Id&amp;quot;: &amp;quot;ac8d018f56f3f820033d319af942be3e&amp;quot;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
   &amp;quot;Successful&amp;quot;: true&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;/PlayerPos&amp;lt;/code&amp;gt; endpoint to include these fields in SND if the bomb is available. Bomb States (0 = dropped, 1 = carried, 2 = planted)'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;quot;BombX&amp;quot;: -3479.5815804967287,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;BombY&amp;quot;: -144.55990951728171,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;BombZ&amp;quot;: -262.77667585565382,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;BombState&amp;quot;: 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Possible issues you may encounter ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''TypeError: fetch failed - cause: Error: connect ECONNREFUSED:'''&lt;br /&gt;
&lt;br /&gt;
This error happens because you are likely running your javascript function with nodejs or the like and it is trying to force ipv6, ensure it does ipv4 by changing “localhost” to “127.0.0.1”. When pulling from the web source it will not matter since it understands the difference. Newer versions of NodeJS should not have this problem and be able to determine between ipv4 and ipv6. (Version 19.3 or higher)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refused to connect'''&lt;br /&gt;
&lt;br /&gt;
If “http:localhost:1234” does not show anything or “refused to connect” the service is not running on this port and you will need to try to set up the API again. Ensure you have PavTVAPIPort=1234 inside of your gameusersettings.ini&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1042</id>
		<title>Pavlov TV API</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1042"/>
		<updated>2024-12-03T18:34:09Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pavlov TV has exposed endpoints to allow users to create their own UI interface for use in steaming software such as OBS, data-sets, or any other purpose of your choosing from Pavlov replays.&lt;br /&gt;
&lt;br /&gt;
=== Enable the API ===&lt;br /&gt;
1. Ensure you have PavlovVR installed on steam and locate the GameUserSettings.ini file.&lt;br /&gt;
&lt;br /&gt;
This file on windows machines will usually be found at [ %localappdata%\Pavlov\Saved\Config\Windows\GameUserSettings.ini ] You can paste this into your file explorer(without the brackets [] ) to open the file. &lt;br /&gt;
&lt;br /&gt;
2. Go the the bottom portion of the [/Script/Pavlov.PavlovGameUserSettings] part of the file, ABOVE[ScalabilityGroups]. &lt;br /&gt;
&lt;br /&gt;
3. Add PavTVAPIPort=1234 onto the file at that location. 1234 is the port that will be used, if you know this port is in use already, please find another on your device that is not in use and list it here.&lt;br /&gt;
&lt;br /&gt;
4. Run PavTV&lt;br /&gt;
&lt;br /&gt;
=== Using OBS with your generated/written HTML file ===&lt;br /&gt;
1. Copy your HTML file path &lt;br /&gt;
&lt;br /&gt;
2. Go to “Sources” and click the “+” button &lt;br /&gt;
&lt;br /&gt;
3. Add browser source and create new (name it whatever) &lt;br /&gt;
&lt;br /&gt;
4. Adjust Resolution of the source(recording size) &lt;br /&gt;
&lt;br /&gt;
5. Paste in the HTML file path and click OK&lt;br /&gt;
&lt;br /&gt;
=== The GET Endpoints ===&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;If you are new to this, you are able to put any of these endpoint “links” into your browser or run curl requests and check that they are functional&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus''' &lt;br /&gt;
&lt;br /&gt;
Ex.in JS to fetch this endpoint on port 1234 const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;); const matchData = await response.json()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const matchData = await response.json();&amp;lt;/blockquote&amp;gt;'''Elements in MatchStatus'''&lt;br /&gt;
&lt;br /&gt;
MatchActive- Will return whether a match is currently ongoing or not &lt;br /&gt;
&lt;br /&gt;
''Ex. “MatchActive”: true or “MatchActive”: false''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RoundTime- Will return the active time into the round in seconds&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundTime&amp;quot;: 105''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Teams- Will return true/false if the there are teams in this match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Teams&amp;quot;: true''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RoundsLeft- Will return the maximum number of rounds left in the match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundsLeft&amp;quot;: 15''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Team0Score- Will return blue team’s score&lt;br /&gt;
&lt;br /&gt;
Team1Score- Will return red team’s score&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Score&amp;quot;: 1,''&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Team1Score&amp;quot;: 2,''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
AttackingTeamId- Will return the ID of the currently attacking team 0-blue, 1- red&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;AttackingTeamId&amp;quot;: 1''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Team0Cash- Will return blue team’s collective cash &lt;br /&gt;
&lt;br /&gt;
Team1Cash- Will return red team’s collective cash&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Cash&amp;quot;: 2500, &amp;quot;Team1Cash&amp;quot;: 2500''&lt;br /&gt;
MatchStatus.Team0 or MatchStatus.Team1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus.Team0 or MatchStatus.Team1'''&lt;br /&gt;
&lt;br /&gt;
''Ex.in JS to fetch Team0 from MatchStatus''&amp;lt;blockquote&amp;gt;const teamZero = matchData.Team0 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const teamOne = matchData.Team1&amp;lt;/blockquote&amp;gt;These will give you an array of JSON style objects&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|    &amp;quot;Team0&amp;quot;: [&lt;br /&gt;
&lt;br /&gt;
       {&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Name&amp;quot;: &amp;quot;JaredOne&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Cash&amp;quot;: 1500,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Score&amp;quot;: 8,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Kills&amp;quot;: 3,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Deaths&amp;quot;: 2,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Dead&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Health&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Armour&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Helmet&amp;quot;: false,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;PrimaryWeapon&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://test-pav-tv.vankrupt.net/icons/m16.png&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;SecondaryWeapons&amp;quot;: [&lt;br /&gt;
&lt;br /&gt;
               &amp;quot;&amp;lt;nowiki&amp;gt;https://test-pav-tv.vankrupt.net/icons/knife.png&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
           ],&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Avatar&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://prod.cdn.pavlov-vr.com/avatar/ThisTotallyExistsZero.png&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Bot&amp;quot;: false&lt;br /&gt;
&lt;br /&gt;
       },&lt;br /&gt;
&lt;br /&gt;
       {&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Name&amp;quot;: &amp;quot;JaredTwo&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Cash&amp;quot;: 150,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Score&amp;quot;: 6,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Kills&amp;quot;: 3,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Deaths&amp;quot;: 2,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Dead&amp;quot;: false,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Health&amp;quot;: 100,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Armour&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Helmet&amp;quot;: false,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;PrimaryWeapon&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://test-pav-tv.vankrupt.net/icons/m16.png&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;SecondaryWeapons&amp;quot;: [&lt;br /&gt;
&lt;br /&gt;
               &amp;quot;&amp;lt;nowiki&amp;gt;https://test-pav-tv.vankrupt.net/icons/knife.png&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
           ],&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Avatar&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://prod.cdn.pavlov-vr.com/avatar/ThisTotallyExistsOne.png&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Bot&amp;quot;: false&lt;br /&gt;
&lt;br /&gt;
       },&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can then grab subsequent information from the teams like this&amp;lt;blockquote&amp;gt;matchData.Team0[0].Name&amp;lt;/blockquote&amp;gt;This would return the name in string form from the first player of Team0. You can do this with all of the information relating to the player, players are returned in order of score highest to lowest [as how it would show up in scoreboard]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== For the values in each player: ====&lt;br /&gt;
'''Name''' returns a &amp;lt;u&amp;gt;String&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Cash, Score, Kills, Deaths, Health,''' and '''Armor''' are all returning &amp;lt;u&amp;gt;Integer&amp;lt;/u&amp;gt; values&lt;br /&gt;
&lt;br /&gt;
'''Dead, Helmet,''' and '''Bot''' return &amp;lt;u&amp;gt;Bool&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''PrimaryWeapon, SecondaryWeapon,''' and '''Avatar''' all return &amp;lt;u&amp;gt;strings&amp;lt;/u&amp;gt; containing links to image files that can be used in your scoreboard.&lt;br /&gt;
&lt;br /&gt;
=== Killfeed GET Endpoint ===&lt;br /&gt;
Gives you a live killfeed of the match you are watching Ex. in Js of how you would get this endpoint as a Json object&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/Killfeed'&amp;lt;/nowiki&amp;gt;); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const killfeedData = await response.json();&amp;lt;/blockquote&amp;gt;Returns the most recent &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;quot;Killfeed&amp;quot;: [&lt;br /&gt;
&lt;br /&gt;
       {&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Killer&amp;quot;: &amp;quot;jaredOne&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Killed&amp;quot;: &amp;quot;jaredTwo&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Headshot&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;EntryLifespan&amp;quot;: 3.2541036605834961,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;KilledBy&amp;quot;: &amp;quot;Tokarev&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;KillerTeam&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;KilledTeam&amp;quot;: 1&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
   ]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ex of how you would get any of the following for the first object in the killfeed&amp;lt;blockquote&amp;gt;killfeedData.killfeed[0].killer&amp;lt;/blockquote&amp;gt;'''Killer''' and '''Killed''' return &amp;lt;u&amp;gt;''String''&amp;lt;/u&amp;gt; objects of the killer and killed respectively&lt;br /&gt;
&lt;br /&gt;
'''Headshot''' returns whether the death was caused by a headshot, in the form of a &amp;lt;u&amp;gt;bool&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''EntryLifespan''' returns the time left counting down from 4 seconds in a &amp;lt;u&amp;gt;float/number&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''KilledBy''' returns the weaponId of the killing weapon in a ''string'' &lt;br /&gt;
&lt;br /&gt;
'''KillerTeam''' and '''KilledTeam''' returns either 0(blue) or 1(red) team of the Killer as an &amp;lt;u&amp;gt;Integer&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MatchEvents GET Endpoint ===&lt;br /&gt;
Gives you an event log for things like Win and Round, will list ALL events during the round if watching a replay, will list them as they happen if watching live&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchEvents'&amp;lt;/nowiki&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
const eventData = await response.json();&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
   &amp;quot;MatchTime&amp;quot;: 48.085689544677734,&lt;br /&gt;
&lt;br /&gt;
   &amp;quot;TotalTime&amp;quot;: 80.008003234863281,&lt;br /&gt;
&lt;br /&gt;
   &amp;quot;Events&amp;quot;: [&lt;br /&gt;
&lt;br /&gt;
       {&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Name&amp;quot;: &amp;quot;Round&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Time&amp;quot;: 15,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;AdditionalData&amp;quot;: 1&lt;br /&gt;
&lt;br /&gt;
       },&lt;br /&gt;
&lt;br /&gt;
       {&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Name&amp;quot;: &amp;quot;Win&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Time&amp;quot;: 31,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;AdditionalData&amp;quot;: 1&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Name''' gives the event name in a &amp;lt;u&amp;gt;string&amp;lt;/u&amp;gt; being either “Round”, “Win”, “Planted” &lt;br /&gt;
&lt;br /&gt;
'''Time''' gives the time in seconds in &amp;lt;u&amp;gt;integer&amp;lt;/u&amp;gt; form of the event going into the game [will list events from start to end]&lt;br /&gt;
&lt;br /&gt;
'''AdditionalData''' will be dependent for the event type&lt;br /&gt;
&lt;br /&gt;
-For a “Win” event 0 will represent Team0 victory, 1 will represent Team1 victory&lt;br /&gt;
&lt;br /&gt;
-For a “Round” event the number returned will represent what round it is &lt;br /&gt;
&lt;br /&gt;
-For a “Planted” event the number does not matter it will always be 0&lt;br /&gt;
&lt;br /&gt;
=== Camera Paths ===&lt;br /&gt;
Steps to Use: &lt;br /&gt;
&lt;br /&gt;
1. Go into a map and record a camera path for keys [1], [2], [3] , or [4], using LCtrl + [Key]  The path will be saved to the api endpoint located here:&amp;lt;blockquote&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:1234/Camera/Path/#&amp;lt;/nowiki&amp;gt; &amp;lt;/blockquote&amp;gt;'''NOTE''': Path values start at 0, so your [1] key will be Path 0, [2] is Path 1, [3] is Path 2, and [4] is Path 3. &lt;br /&gt;
&lt;br /&gt;
'''NOTE 2''': Camera paths are deleted in between matches so make sure to save them before exiting &lt;br /&gt;
&lt;br /&gt;
3. You can play the path with LShift + [Key]&lt;br /&gt;
&lt;br /&gt;
=== Camera Path GET Endpoint - Retrieve saved camera path ===&lt;br /&gt;
Javascript example of how to use it &lt;br /&gt;
&lt;br /&gt;
'''NOTE''': Replace the “#” with the number path corresponding above 0, 1, 2, 3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/Camera/Path/#'&amp;lt;/nowiki&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const cameraPath = await response.json();&amp;lt;/blockquote&amp;gt;Example of returned path with a single point&amp;lt;blockquote&amp;gt;{&amp;quot;MapName&amp;quot;:&amp;quot;Oilrig&amp;quot;,&amp;quot;PathNumber&amp;quot;:0,&amp;quot;Points&amp;quot;:[{&amp;quot;Time&amp;quot;:0,&amp;quot;X&amp;quot;:7453.70035785 53522,&amp;quot;Y&amp;quot;:4584.0434961287474,&amp;quot;Z&amp;quot;:1223.5857404802396,&amp;quot;Pitch&amp;quot;:-4.375000059 6046359,&amp;quot;Yaw&amp;quot;:-155.3252139880791,&amp;quot;Roll&amp;quot;:0}]}&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MapName''' gives you the name of the map of the current match you are in as a &amp;lt;u&amp;gt;string&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''PathNumber''' is the same as the path you put in to retrieve it as an &amp;lt;u&amp;gt;integer&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Time''' gives you the time in seconds as a &amp;lt;u&amp;gt;float&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''X,Y,Z''' give you the relative x-plane, y-plane, z-plane position each in &amp;lt;u&amp;gt;float&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Pitch, Roll, Yaw''' give you the orientation of the camera relative to the world normal, each in &amp;lt;u&amp;gt;float&amp;lt;/u&amp;gt;&lt;br /&gt;
[[File:Pitchrollyaw.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
===== Camera Play GET Endpoint - It will call your game to play the path currently in that slot =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ex. of fetching it in Js, since there is no response, you can just run fetch&amp;lt;blockquote&amp;gt;fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/Camera/Play/0'&amp;lt;/nowiki&amp;gt;)&amp;lt;/blockquote&amp;gt;This is the same principle as getting the path, though there will be no response to check it will just trigger immediately in your client and you will go along the active path bound to that key.&lt;br /&gt;
&lt;br /&gt;
==== Camera Path POST Endpoint - Insert your path into the live slot ====&lt;br /&gt;
Ex. of a javascript POST fetch request to the api&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|const response = await fetch(`localhost:1234/Camera/Path/1`, {&lt;br /&gt;
&lt;br /&gt;
     method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
     headers: {&lt;br /&gt;
&lt;br /&gt;
       &amp;quot;Content-Type&amp;quot;: &amp;quot;application/json&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
     },&lt;br /&gt;
&lt;br /&gt;
     body: JSON.stringify(data),&lt;br /&gt;
&lt;br /&gt;
   });&lt;br /&gt;
|}&lt;br /&gt;
Notes: MapName and PathNumber do '''NOT''' matter in terms of POST-ing a path, so you do not have to modify those at all. The only thing that really matters is the points. It is recommended to store paths in json files for modification and accessibility ease.&lt;br /&gt;
&lt;br /&gt;
'''GET &amp;lt;code&amp;gt;/Pause&amp;lt;/code&amp;gt; returns'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Paused&amp;quot;: true&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
'''POST &amp;lt;code&amp;gt;/Pause&amp;lt;/code&amp;gt;'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Paused&amp;quot;: false&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
returns&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Successful&amp;quot;: true&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if successful returns false it will also include a string field &amp;lt;code&amp;gt;Reason&amp;lt;/code&amp;gt; explaining why it failed &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET &amp;lt;code&amp;gt;/MatchTime&amp;lt;/code&amp;gt;''' &lt;br /&gt;
&lt;br /&gt;
returns&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;MatchTime&amp;quot;: 19.035182&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''POST &amp;lt;code&amp;gt;/MatchTime&amp;lt;/code&amp;gt;'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;MatchTime&amp;quot;: 120.5&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
returns&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Successful&amp;quot;: true&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if successful returns false it will also include a string field &amp;lt;code&amp;gt;Reason&amp;lt;/code&amp;gt; explaining why it failed GET &amp;lt;code&amp;gt;/ReplayList&amp;lt;/code&amp;gt; returns&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
   &amp;quot;Replays&amp;quot;: [&lt;br /&gt;
&lt;br /&gt;
       {&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Id&amp;quot;: &amp;quot;Sand-DM-2024.11.15-01.44.05&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Name&amp;quot;: &amp;quot;Sand&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;GameMode&amp;quot;: &amp;quot;DM&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Timestamp&amp;quot;: &amp;quot;2024-11-15T01:44:05.687Z&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Shack&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;LocalReplay&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Live&amp;quot;: false&lt;br /&gt;
&lt;br /&gt;
       },&lt;br /&gt;
&lt;br /&gt;
       {&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Id&amp;quot;: &amp;quot;ac8d018f56f3f820033d319af942be3e&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Name&amp;quot;: &amp;quot;Sand&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;GameMode&amp;quot;: &amp;quot;DM&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Timestamp&amp;quot;: &amp;quot;2024-11-27T08:28:37.362Z&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Shack&amp;quot;: false,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;LocalReplay&amp;quot;: false,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Live&amp;quot;: false&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
 ]&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''POST &amp;lt;code&amp;gt;/LoadReplay&amp;lt;/code&amp;gt;'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
   &amp;quot;Id&amp;quot;: &amp;quot;ac8d018f56f3f820033d319af942be3e&amp;quot;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
   &amp;quot;Successful&amp;quot;: true&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;/PlayerPos&amp;lt;/code&amp;gt; endpoint to include these fields in SND if the bomb is available. Bomb States (0 = dropped, 1 = carried, 2 = planted)'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;quot;BombX&amp;quot;: -3479.5815804967287,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;BombY&amp;quot;: -144.55990951728171,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;BombZ&amp;quot;: -262.77667585565382,&lt;br /&gt;
&lt;br /&gt;
&amp;quot;BombState&amp;quot;: 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Possible issues you may encounter ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''TypeError: fetch failed - cause: Error: connect ECONNREFUSED:'''&lt;br /&gt;
&lt;br /&gt;
This error happens because you are likely running your javascript function with nodejs or the like and it is trying to force ipv6, ensure it does ipv4 by changing “localhost” to “127.0.0.1”. When pulling from the web source it will not matter since it understands the difference. Newer versions of NodeJS should not have this problem and be able to determine between ipv4 and ipv6. (Version 19.3 or higher)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refused to connect'''&lt;br /&gt;
&lt;br /&gt;
If “http:localhost:1234” does not show anything or “refused to connect” the service is not running on this port and you will need to try to set up the API again. Ensure you have PavTVAPIPort=1234 inside of your gameusersettings.ini&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1041</id>
		<title>Pavlov TV API</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1041"/>
		<updated>2024-12-03T18:27:17Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pavlov TV has exposed endpoints to allow users to create their own UI interface for use in steaming software such as OBS, data-sets, or any other purpose of your choosing from Pavlov replays.&lt;br /&gt;
&lt;br /&gt;
=== Enable the API ===&lt;br /&gt;
1. Ensure you have PavlovVR installed on steam and locate the GameUserSettings.ini file.&lt;br /&gt;
&lt;br /&gt;
This file on windows machines will usually be found at [ %localappdata%\Pavlov\Saved\Config\Windows\GameUserSettings.ini ] You can paste this into your file explorer(without the brackets [] ) to open the file. &lt;br /&gt;
&lt;br /&gt;
2. Go the the bottom portion of the [/Script/Pavlov.PavlovGameUserSettings] part of the file, ABOVE[ScalabilityGroups]. &lt;br /&gt;
&lt;br /&gt;
3. Add PavTVAPIPort=1234 onto the file at that location. 1234 is the port that will be used, if you know this port is in use already, please find another on your device that is not in use and list it here.&lt;br /&gt;
&lt;br /&gt;
4. Run PavTV&lt;br /&gt;
&lt;br /&gt;
=== Using OBS with your generated/written HTML file ===&lt;br /&gt;
1. Copy your HTML file path &lt;br /&gt;
&lt;br /&gt;
2. Go to “Sources” and click the “+” button &lt;br /&gt;
&lt;br /&gt;
3. Add browser source and create new (name it whatever) &lt;br /&gt;
&lt;br /&gt;
4. Adjust Resolution of the source(recording size) &lt;br /&gt;
&lt;br /&gt;
5. Paste in the HTML file path and click OK&lt;br /&gt;
&lt;br /&gt;
=== The GET Endpoints ===&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;If you are new to this, you are able to put any of these endpoint “links” into your browser or run curl requests and check that they are functional&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus''' &lt;br /&gt;
&lt;br /&gt;
Ex.in JS to fetch this endpoint on port 1234 const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;); const matchData = await response.json()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const matchData = await response.json();&amp;lt;/blockquote&amp;gt;'''Elements in MatchStatus'''&lt;br /&gt;
&lt;br /&gt;
MatchActive- Will return whether a match is currently ongoing or not &lt;br /&gt;
&lt;br /&gt;
''Ex. “MatchActive”: true or “MatchActive”: false''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RoundTime- Will return the active time into the round in seconds&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundTime&amp;quot;: 105''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Teams- Will return true/false if the there are teams in this match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Teams&amp;quot;: true''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RoundsLeft- Will return the maximum number of rounds left in the match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundsLeft&amp;quot;: 15''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Team0Score- Will return blue team’s score&lt;br /&gt;
&lt;br /&gt;
Team1Score- Will return red team’s score&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Score&amp;quot;: 1,''&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Team1Score&amp;quot;: 2,''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
AttackingTeamId- Will return the ID of the currently attacking team 0-blue, 1- red&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;AttackingTeamId&amp;quot;: 1''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Team0Cash- Will return blue team’s collective cash &lt;br /&gt;
&lt;br /&gt;
Team1Cash- Will return red team’s collective cash&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Cash&amp;quot;: 2500, &amp;quot;Team1Cash&amp;quot;: 2500''&lt;br /&gt;
MatchStatus.Team0 or MatchStatus.Team1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus.Team0 or MatchStatus.Team1'''&lt;br /&gt;
&lt;br /&gt;
''Ex.in JS to fetch Team0 from MatchStatus''&amp;lt;blockquote&amp;gt;const teamZero = matchData.Team0 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const teamOne = matchData.Team1&amp;lt;/blockquote&amp;gt;These will give you an array of JSON style objects&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|    &amp;quot;Team0&amp;quot;: [&lt;br /&gt;
&lt;br /&gt;
       {&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Name&amp;quot;: &amp;quot;JaredOne&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Cash&amp;quot;: 1500,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Score&amp;quot;: 8,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Kills&amp;quot;: 3,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Deaths&amp;quot;: 2,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Dead&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Health&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Armour&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Helmet&amp;quot;: false,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;PrimaryWeapon&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://test-pav-tv.vankrupt.net/icons/m16.png&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;SecondaryWeapons&amp;quot;: [&lt;br /&gt;
&lt;br /&gt;
               &amp;quot;&amp;lt;nowiki&amp;gt;https://test-pav-tv.vankrupt.net/icons/knife.png&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
           ],&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Avatar&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://prod.cdn.pavlov-vr.com/avatar/ThisTotallyExistsZero.png&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Bot&amp;quot;: false&lt;br /&gt;
&lt;br /&gt;
       },&lt;br /&gt;
&lt;br /&gt;
       {&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Name&amp;quot;: &amp;quot;JaredTwo&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Cash&amp;quot;: 150,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Score&amp;quot;: 6,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Kills&amp;quot;: 3,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Deaths&amp;quot;: 2,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Dead&amp;quot;: false,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Health&amp;quot;: 100,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Armour&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Helmet&amp;quot;: false,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;PrimaryWeapon&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://test-pav-tv.vankrupt.net/icons/m16.png&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;SecondaryWeapons&amp;quot;: [&lt;br /&gt;
&lt;br /&gt;
               &amp;quot;&amp;lt;nowiki&amp;gt;https://test-pav-tv.vankrupt.net/icons/knife.png&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
           ],&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Avatar&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://prod.cdn.pavlov-vr.com/avatar/ThisTotallyExistsOne.png&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Bot&amp;quot;: false&lt;br /&gt;
&lt;br /&gt;
       },&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can then grab subsequent information from the teams like this&amp;lt;blockquote&amp;gt;matchData.Team0[0].Name&amp;lt;/blockquote&amp;gt;This would return the name in string form from the first player of Team0. You can do this with all of the information relating to the player, players are returned in order of score highest to lowest [as how it would show up in scoreboard]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== For the values in each player: ====&lt;br /&gt;
'''Name''' returns a &amp;lt;u&amp;gt;String&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Cash, Score, Kills, Deaths, Health,''' and '''Armor''' are all returning &amp;lt;u&amp;gt;Integer&amp;lt;/u&amp;gt; values&lt;br /&gt;
&lt;br /&gt;
'''Dead, Helmet,''' and '''Bot''' return &amp;lt;u&amp;gt;Bool&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''PrimaryWeapon, SecondaryWeapon,''' and '''Avatar''' all return &amp;lt;u&amp;gt;strings&amp;lt;/u&amp;gt; containing links to image files that can be used in your scoreboard.&lt;br /&gt;
&lt;br /&gt;
=== Killfeed GET Endpoint ===&lt;br /&gt;
Gives you a live killfeed of the match you are watching Ex. in Js of how you would get this endpoint as a Json object&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/Killfeed'&amp;lt;/nowiki&amp;gt;); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const killfeedData = await response.json();&amp;lt;/blockquote&amp;gt;Returns the most recent &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;quot;Killfeed&amp;quot;: [&lt;br /&gt;
&lt;br /&gt;
       {&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Killer&amp;quot;: &amp;quot;jaredOne&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Killed&amp;quot;: &amp;quot;jaredTwo&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Headshot&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;EntryLifespan&amp;quot;: 3.2541036605834961,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;KilledBy&amp;quot;: &amp;quot;Tokarev&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;KillerTeam&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;KilledTeam&amp;quot;: 1&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
   ]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ex of how you would get any of the following for the first object in the killfeed&amp;lt;blockquote&amp;gt;killfeedData.killfeed[0].killer&amp;lt;/blockquote&amp;gt;'''Killer''' and '''Killed''' return &amp;lt;u&amp;gt;''String''&amp;lt;/u&amp;gt; objects of the killer and killed respectively&lt;br /&gt;
&lt;br /&gt;
'''Headshot''' returns whether the death was caused by a headshot, in the form of a &amp;lt;u&amp;gt;bool&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''EntryLifespan''' returns the time left counting down from 4 seconds in a &amp;lt;u&amp;gt;float/number&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''KilledBy''' returns the weaponId of the killing weapon in a ''string'' &lt;br /&gt;
&lt;br /&gt;
'''KillerTeam''' and '''KilledTeam''' returns either 0(blue) or 1(red) team of the Killer as an &amp;lt;u&amp;gt;Integer&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MatchEvents GET Endpoint ===&lt;br /&gt;
Gives you an event log for things like Win and Round, will list ALL events during the round if watching a replay, will list them as they happen if watching live&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchEvents'&amp;lt;/nowiki&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
const eventData = await response.json();&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|{&lt;br /&gt;
&lt;br /&gt;
   &amp;quot;MatchTime&amp;quot;: 48.085689544677734,&lt;br /&gt;
&lt;br /&gt;
   &amp;quot;TotalTime&amp;quot;: 80.008003234863281,&lt;br /&gt;
&lt;br /&gt;
   &amp;quot;Events&amp;quot;: [&lt;br /&gt;
&lt;br /&gt;
       {&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Name&amp;quot;: &amp;quot;Round&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Time&amp;quot;: 15,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;AdditionalData&amp;quot;: 1&lt;br /&gt;
&lt;br /&gt;
       },&lt;br /&gt;
&lt;br /&gt;
       {&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Name&amp;quot;: &amp;quot;Win&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;Time&amp;quot;: 31,&lt;br /&gt;
&lt;br /&gt;
           &amp;quot;AdditionalData&amp;quot;: 1&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Name''' gives the event name in a &amp;lt;u&amp;gt;string&amp;lt;/u&amp;gt; being either “Round”, “Win”, “Planted” &lt;br /&gt;
&lt;br /&gt;
'''Time''' gives the time in seconds in &amp;lt;u&amp;gt;integer&amp;lt;/u&amp;gt; form of the event going into the game [will list events from start to end]&lt;br /&gt;
&lt;br /&gt;
'''AdditionalData''' will be dependent for the event type&lt;br /&gt;
&lt;br /&gt;
-For a “Win” event 0 will represent Team0 victory, 1 will represent Team1 victory&lt;br /&gt;
&lt;br /&gt;
-For a “Round” event the number returned will represent what round it is &lt;br /&gt;
&lt;br /&gt;
-For a “Planted” event the number does not matter it will always be 0&lt;br /&gt;
&lt;br /&gt;
=== Camera Paths ===&lt;br /&gt;
Steps to Use: &lt;br /&gt;
&lt;br /&gt;
1. Go into a map and record a camera path for keys [1], [2], [3] , or [4], using LCtrl + [Key]  The path will be saved to the api endpoint located here:&amp;lt;blockquote&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:1234/Camera/Path/#&amp;lt;/nowiki&amp;gt; &amp;lt;/blockquote&amp;gt;'''NOTE''': Path values start at 0, so your [1] key will be Path 0, [2] is Path 1, [3] is Path 2, and [4] is Path 3. &lt;br /&gt;
&lt;br /&gt;
'''NOTE 2''': Camera paths are deleted in between matches so make sure to save them before exiting &lt;br /&gt;
&lt;br /&gt;
3. You can play the path with LShift + [Key]&lt;br /&gt;
&lt;br /&gt;
=== Camera Path GET Endpoint - Retrieve saved camera path ===&lt;br /&gt;
Javascript example of how to use it &lt;br /&gt;
&lt;br /&gt;
'''NOTE''': Replace the “#” with the number path corresponding above 0, 1, 2, 3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/Camera/Path/#'&amp;lt;/nowiki&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const cameraPath = await response.json();&amp;lt;/blockquote&amp;gt;Example of returned path with a single point&amp;lt;blockquote&amp;gt;{&amp;quot;MapName&amp;quot;:&amp;quot;Oilrig&amp;quot;,&amp;quot;PathNumber&amp;quot;:0,&amp;quot;Points&amp;quot;:[{&amp;quot;Time&amp;quot;:0,&amp;quot;X&amp;quot;:7453.70035785 53522,&amp;quot;Y&amp;quot;:4584.0434961287474,&amp;quot;Z&amp;quot;:1223.5857404802396,&amp;quot;Pitch&amp;quot;:-4.375000059 6046359,&amp;quot;Yaw&amp;quot;:-155.3252139880791,&amp;quot;Roll&amp;quot;:0}]}&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MapName''' gives you the name of the map of the current match you are in as a &amp;lt;u&amp;gt;string&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''PathNumber''' is the same as the path you put in to retrieve it as an &amp;lt;u&amp;gt;integer&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Time''' gives you the time in seconds as a &amp;lt;u&amp;gt;float&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''X,Y,Z''' give you the relative x-plane, y-plane, z-plane position each in &amp;lt;u&amp;gt;float&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Pitch, Roll, Yaw''' give you the orientation of the camera relative to the world normal, each in &amp;lt;u&amp;gt;float&amp;lt;/u&amp;gt;&lt;br /&gt;
[[File:Pitchrollyaw.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
===== Camera Play GET Endpoint - It will call your game to play the path currently in that slot =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ex. of fetching it in Js, since there is no response, you can just run fetch&amp;lt;blockquote&amp;gt;fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/Camera/Play/0'&amp;lt;/nowiki&amp;gt;)&amp;lt;/blockquote&amp;gt;This is the same principle as getting the path, though there will be no response to check it will just trigger immediately in your client and you will go along the active path bound to that key.&lt;br /&gt;
&lt;br /&gt;
==== Camera Path POST Endpoint - Insert your path into the live slot ====&lt;br /&gt;
Ex. of a javascript POST fetch request to the api&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch(`localhost:1234/Camera/Path/1`, {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
headers: {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Content-Type&amp;quot;: &amp;quot;application/json&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
body: JSON.stringify(data),&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
});&amp;lt;/blockquote&amp;gt;Notes: MapName and PathNumber do '''NOT''' matter in terms of POST-ing a path, so you do not have to modify those at all. The only thing that really matters is the points. It is recommended to store paths in json files for modification and accessibility ease.&lt;br /&gt;
&lt;br /&gt;
'''GET &amp;lt;code&amp;gt;/Pause&amp;lt;/code&amp;gt; returns'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;Paused&amp;quot;: true&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST &amp;lt;code&amp;gt;/Pause&amp;lt;/code&amp;gt;''' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;Paused&amp;quot;: false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
returns&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;Successful&amp;quot;: true&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if successful returns false it will also include a string field &amp;lt;code&amp;gt;Reason&amp;lt;/code&amp;gt; explaining why it failed &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET &amp;lt;code&amp;gt;/MatchTime&amp;lt;/code&amp;gt;''' &lt;br /&gt;
&lt;br /&gt;
returns&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;MatchTime&amp;quot;: 19.035182&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''POST &amp;lt;code&amp;gt;/MatchTime&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
returns&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;MatchTime&amp;quot;: 120.5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if successful returns false it will also include a string field &amp;lt;code&amp;gt;Reason&amp;lt;/code&amp;gt; explaining why it failed GET &amp;lt;code&amp;gt;/ReplayList&amp;lt;/code&amp;gt; returns&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;    &amp;quot;Replays&amp;quot;: [&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;        {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Id&amp;quot;: &amp;quot;Sand-DM-2024.11.15-01.44.05&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Name&amp;quot;: &amp;quot;Sand&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;GameMode&amp;quot;: &amp;quot;DM&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Timestamp&amp;quot;: &amp;quot;2024-11-15T01:44:05.687Z&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Shack&amp;quot;: true,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;LocalReplay&amp;quot;: true,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Live&amp;quot;: false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;        },&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;        {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Id&amp;quot;: &amp;quot;ac8d018f56f3f820033d319af942be3e&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Name&amp;quot;: &amp;quot;Sand&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;GameMode&amp;quot;: &amp;quot;DM&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Timestamp&amp;quot;: &amp;quot;2024-11-27T08:28:37.362Z&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Shack&amp;quot;: false,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;LocalReplay&amp;quot;: false,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Live&amp;quot;: false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;        }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  ]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''POST &amp;lt;code&amp;gt;/LoadReplay&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;    &amp;quot;Id&amp;quot;: &amp;quot;ac8d018f56f3f820033d319af942be3e&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;    &amp;quot;Successful&amp;quot;: true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;/PlayerPos&amp;lt;/code&amp;gt; endpoint to include these fields in SND if the bomb is available. Bomb States (0 = dropped, 1 = carried, 2 = planted)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;BombX&amp;quot;: -3479.5815804967287,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;BombY&amp;quot;: -144.55990951728171,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;BombZ&amp;quot;: -262.77667585565382,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;BombState&amp;quot;: 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Possible issues you may encounter ===&lt;br /&gt;
'''TypeError: fetch failed - cause: Error: connect ECONNREFUSED:'''&lt;br /&gt;
&lt;br /&gt;
This error happens because you are likely running your javascript function with nodejs or the like and it is trying to force ipv6, ensure it does ipv4 by changing “localhost” to “127.0.0.1”. When pulling from the web source it will not matter since it understands the difference. Newer versions of NodeJS should not have this problem and be able to determine between ipv4 and ipv6. (Version 19.3 or higher)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refused to connect'''&lt;br /&gt;
&lt;br /&gt;
If “http:localhost:1234” does not show anything or “refused to connect” the service is not running on this port and you will need to try to set up the API again. Ensure you have PavTVAPIPort=1234 inside of your gameusersettings.ini&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Setting_up_a_dedicated_server&amp;diff=1040</id>
		<title>Setting up a dedicated server</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Setting_up_a_dedicated_server&amp;diff=1040"/>
		<updated>2024-12-03T16:28:21Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Setting up a dedicated server ==&lt;br /&gt;
&lt;br /&gt;
'''There are no Windows binaries''' &lt;br /&gt;
&lt;br /&gt;
This guide is written exclusively for Linux and covers Ubuntu/Debian/Debian-like and Red Hat RPM-based distros. Possible to run with other distros, but some of the commands won't work and you will need to know enough to figure out the software install of dependencies on your own. &lt;br /&gt;
&lt;br /&gt;
If you are considering hosting from home, please read that section of the wiki first. &lt;br /&gt;
&lt;br /&gt;
This guide assumes you know the basics of using a bash terminal: ssh'ing into a server, running bash commands, editing text files, etc.&lt;br /&gt;
&lt;br /&gt;
If you have no experience using bash, maybe start [https://www.howtogeek.com/140679/beginner-geek-how-to-start-using-the-linux-terminal/ here]. Editing text files via commandline is often a challenge. Suggest using nano and reading guide [https://www.howtogeek.com/howto/42980/the-beginners-guide-to-nano-the-linux-command-line-text-editor/ here]&lt;br /&gt;
&lt;br /&gt;
If you are new to linux and accessing your server from Windows, highly suggest using MobaXterm as your SSH client as that can make required editing of text files easier using built in editor instead of the native linux command line editors.&lt;br /&gt;
&lt;br /&gt;
And finally, ask yourself why you want to setup a server? If you look at the list, there are many, many more servers than players. If you don't have a team, discord community, or group of friends ready to play on your server, chances are it will go unused. Got one of these... great, let's go. &lt;br /&gt;
&lt;br /&gt;
If you don't want to go through the hassle yourself and want to pay for a hosting service Arctic VR (PC and Shack) and Horde (Shack) provide a server hosting services and are trusted in the community. See links below.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Server Requirements ===&lt;br /&gt;
&lt;br /&gt;
==== Operating System ====&lt;br /&gt;
'''Pavlovserver can only be hosted under Linux.'''&lt;br /&gt;
&lt;br /&gt;
Known good operating systems are:&lt;br /&gt;
&lt;br /&gt;
* Ubuntu 18.04 x86_64&lt;br /&gt;
* Ubuntu 19/04 amd64&lt;br /&gt;
* Ubuntu 20.04 x86_64&lt;br /&gt;
* Ubuntu 22.04 x86_64&lt;br /&gt;
* Rocky Linux 8&lt;br /&gt;
&lt;br /&gt;
This can be running as a VM under windows, but this will increase the complexity of the setup beyond this guide. &lt;br /&gt;
&lt;br /&gt;
Ubuntu 15.04 x86 is known to fail to install using this guide. Recommend not running on &amp;quot;minimal&amp;quot; images as some tools are missing, and they can be installed, which is not covered in the scope of this guide. &lt;br /&gt;
&lt;br /&gt;
==== Resources and Performance Optimisation ====&lt;br /&gt;
* 2GB RAM + 1GB RAM per each additional server with 10 players. More RAM is recommended for larger maps, higher player counts, or complex gamemodes. Not having enough RAM is a common cause of server crashes.&lt;br /&gt;
* A ~2.5Ghz CPU will comfortably support a 10 player server.&lt;br /&gt;
* A ~4Ghz CPU will comfortably support 24 players. Pavlov on PC can support up to 50 players. Shack is limited by 24.&lt;br /&gt;
Pavlov servers are functionally single threaded - one thread does vast majority of work. More CPUs only help if you are running more servers. More clockspeed = higher performance = more users per server. Hence, no particular performance benefit is gained from multithreading - if you are running multiple instances of a pavlov server, you will require more CPU cores.&lt;br /&gt;
&lt;br /&gt;
Lower player counts are recommended for complex gamemodes (E.g. CodZ) and/or highly detailed maps, so that maximum number will often be lower. Note that these player count numbers are just suggestions to help optimise for the best performance, based on experiences with many server providers on different grades of hardware.&lt;br /&gt;
&lt;br /&gt;
As of 1.0.17 (17/05/2024) 24 is the hard limits for player counts for Shack, but PC is limited to 50.&lt;br /&gt;
&lt;br /&gt;
The maximum number of servers you can run is dependent on how many CPUs you have. For example, if you have an 8 core CPU, the maximum number of servers would be 7. You should always have at least one CPU free as overhead, as Pavlov servers can use slightly more than one thread.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Hosting at home ====&lt;br /&gt;
When hosting at home there are additional requirements regarding networking: Your router has to support port-forwarding, hair-pinning/LoopbackNAT, and respond to ping requests.  These techniques are necessary to allow your server to be found and to talk back to the client. please see https://en.wikipedia.org/wiki/Port_forwarding,  https://en.wikipedia.org/wiki/Hairpinning, and https://www.speedguide.net/faq/how-to-become-pingable-behind-a-routerfirewall-376 for more info and google for these terms in addition to your router model to find guides on how to enable/configure it properly. If you have modern Router, it may have these features already enabled, in this case you just have to configure port-forwarding. If you can see your server but not join it while others can, this is indicative of a failure of LoopbackNAT. &lt;br /&gt;
&lt;br /&gt;
A second challenge to hosting at home is CGNAT (Carrier grade NAT: https://www.a10networks.com/blog/carrier-grade-nat/). Just like NAT on your home network that has to be gotten around w/ port-forwarding, CGNAT breaks the ability of external connections to be made back to your server, but the controls are solely in your ISPs hands. Sometimes if you ask, you can be removed from CGNAT pools and/or assigned a static IP. CGNAT rollouts are becoming very common now, so if your server worked then doesn't allow connections now, your ISP may have made this change. &lt;br /&gt;
&lt;br /&gt;
You can check whether you’re on a CGNAT network by visiting a Web site such as ipaddress.com or whatsmyip.com and comparing the IP address listed to the public/WAN IP address assigned to your Internet gateway. To find your gateway’s public IP address, check the status page in the administrative interface. If the two IP addresses differ, you’re likely on a CGNAT network. If so, this problem must be resolved before you go any further. &lt;br /&gt;
&lt;br /&gt;
'''Not understanding these requirements and configuration is a frequent cause of failed setups and questions in discord. Don't skip this if you are trying to host from home'''&lt;br /&gt;
&lt;br /&gt;
'''There are serious security implications of hosting this software at home.''' None of the devs are security experts and there has been no security review of the code. You are opening up your system to the world and publicity advertising this fact. Expect that any system hosting this software is open to compromise from the Internet and act accordingly. If your router offers a DMZ network, use it. Consider hosting on a cloud based server and think twice before running this software on any system that contains data you care about or has access to networks and computers you care about.&lt;br /&gt;
&lt;br /&gt;
If you're hosting at home using Oracle's VirtualBox, there are steps you can take to prevent double NAT (which can cause issues later on)&lt;br /&gt;
&lt;br /&gt;
1. Select your VM and then click Settings in VirtualBox's main window.&lt;br /&gt;
&lt;br /&gt;
2. Click on Network and change Attached To from NAT to Bridged Adapter. &lt;br /&gt;
&lt;br /&gt;
Once you've done this, your VM should be connected directly to your home router and double NAT should no longer be a issue.&lt;br /&gt;
&lt;br /&gt;
It should go without saying that hosting at home usually invites a myriad of potential problems that will be unique to your setup - such as your ISP, router, or network configuration. There is a lively community of like-minded server hosters on the Pavlov-VR Discord, so if you get stuck, head on over to the discord and see whether you can find the answers you're looking for.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Starting Server Install ===&lt;br /&gt;
&lt;br /&gt;
====Obtaining an ApiKey ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For your server to show up in the server list, there is now a requirement to have an ApiKey issued by Vankrupt. This is to prevent DOS attacks against the master server or abuse. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''You will need to load up the game on your headset''' the navigate to the settings, in the general tab is there a button to Generate Server Code. &lt;br /&gt;
&lt;br /&gt;
* Your &amp;quot;pin&amp;quot; will only be valid for 15 minutes. &lt;br /&gt;
* If your server key is exposed you can create a new key by generating a new 6 digit code. &lt;br /&gt;
* This will invalidate the old key.&lt;br /&gt;
* A server key can be used by multiple servers.&lt;br /&gt;
* A user may only have one server key, requesting a new one will invalidate the old one.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This will give you a 6 character code you need to combine with your player ID to generate a server key.&lt;br /&gt;
&lt;br /&gt;
Get the key by going here: https://api-key.vankrupt.net/ &lt;br /&gt;
&lt;br /&gt;
[[File:Generateserverkey.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once you submit you will get your unique Server API Key that needs to go into your Game.ini&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Warnings:'''&lt;br /&gt;
* '''Abusing a Server key may result in a ban to the attached user.'''&lt;br /&gt;
* '''Do NOT share your server key, it should be used by you alone.'''&lt;br /&gt;
* '''Store your server key in a safe place, such as a password or secret manager.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Save this key for later, so that you can ut this key in your Game.ini as follows:&lt;br /&gt;
    ApiKey=&amp;quot;ABC123FALSEKEYDONTUSEME&amp;quot;&lt;br /&gt;
or if you would like (personally untested..I would use Game.ini) you can call it at server runtime with flag as follows:&lt;br /&gt;
   -KEY=&amp;quot;ABC123FALSEKEYDONTUSEME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This key can be re-used for a reasonable number of servers (a limit of 10 has been mentioned). Contact the Devs if you need more servers per key.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====System setup and software installation====&lt;br /&gt;
In this step we will:&lt;br /&gt;
&lt;br /&gt;
# Check the operating system is compatible&lt;br /&gt;
# Install some dependencies&lt;br /&gt;
# create the user &amp;quot;steam&amp;quot; and set it's password, and switch to that user&lt;br /&gt;
# as &amp;quot;steam&amp;quot; user, install Steamcmd, the binary used to download steam games in linux&lt;br /&gt;
# use Steamcmd to install Pavlov.&lt;br /&gt;
&lt;br /&gt;
These steps only need to be done the first time you set up the server. We'll then look at some post-installation steps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Step 1: Check the operating system is compatible =====&lt;br /&gt;
Confirm Linux version, run the command:&lt;br /&gt;
 lsb_release -a&lt;br /&gt;
  &lt;br /&gt;
Expect the result to say '''Ubuntu 20.04''' (or one of the other known supported operating systems - this guide assumes Ubuntu or a Fedora system)&lt;br /&gt;
&lt;br /&gt;
===== Step 2: Install some dependencies =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''For Ubuntu 22.10 or higher'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
 sudo apt update &amp;amp;&amp;amp; sudo apt install -y gdb curl lib32gcc-s1 libc++-dev unzip&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''For older version of Ubuntu prior to 22.10:'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
 sudo apt update &amp;amp;&amp;amp; sudo apt install -y gdb curl lib32gcc1 libc++-dev unzip&lt;br /&gt;
&amp;lt;blockquote&amp;gt;For Rocky Linux, CentOS 8, and RHEL 8&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/g' /etc/selinux/config&lt;br /&gt;
  sudo setenforce 0&lt;br /&gt;
  sudo yum install gdb curl glibc.i686 libstdc++.i686 libstdc++-devel.i686 libstdc++-devel.x86_64 unzip wget -y&lt;br /&gt;
  wget &amp;lt;nowiki&amp;gt;https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/libcxx-3.8.0-3.el7.x86_64.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  sudo rpm -i libcxx-3.8.0-3.el7.x86_64.rpm&lt;br /&gt;
&lt;br /&gt;
===== Step 3: Create the steam user =====&lt;br /&gt;
  sudo useradd -m steam&lt;br /&gt;
&lt;br /&gt;
[Optional] Set the /bin/bash shell for the steam user this will allow you to use arrow keys in terminal and show what folder you are in at all times&amp;lt;pre&amp;gt;sudo chsh -s /bin/bash steam&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Optional] Set a password for steam.&amp;lt;pre&amp;gt;sudo passwd steam&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Login as the Steam user. ('''You will need to do this each time you connect to your server - editing game files and interacting with the game server should be done as the steam user'''):&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo su -l steam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Step 4: Install Steam, known as SteamCMD =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~/Steam &amp;amp;&amp;amp; cd ~/Steam &amp;amp;&amp;amp; curl -sqL &amp;quot;https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz&amp;quot; | tar zxvf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Step 5: User SteamCMD to install Pavlov =====&lt;br /&gt;
There are different dedicated server versions for Pavlov Server - choose which server version you want to host (PC non-beta, PC Beta, Shack Live, or Shack RC)&lt;br /&gt;
(You will need to run this command each time there is a Pavlov Server update). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;To host '''PC Server (non-beta)''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta default +exit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To host '''PC BETA''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta beta_server +exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To host '''Shack Live''' (Quest):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta shack +exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To host '''Shack RC''' (Quest): &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta shack_beta +exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Post Installation Steps =====&lt;br /&gt;
Now that we've installed the server, Install a fresh copy of steamclient.so. You may also have to do this after each update.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +login anonymous +app_update 1007 +quit&lt;br /&gt;
mkdir -p ~/.steam/sdk64&lt;br /&gt;
cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/.steam/sdk64/steamclient.so&lt;br /&gt;
cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/pavlovserver/Pavlov/Binaries/Linux/steamclient.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All versions are required to run these commands to change the libc++ that steamclient uses:&lt;br /&gt;
 &amp;lt;code&amp;gt;sudo rm /usr/lib/x86_64-linux-gnu/libc++.so&amp;lt;/code&amp;gt; &lt;br /&gt;
 &amp;lt;code&amp;gt;sudo ln -s /usr/lib/x86_64-linux-gnu/libc++.so.1 /usr/lib/x86_64-linux-gnu/libc++.so&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make the PavlovServer script executable. (You only need to do this once):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod +x ~/pavlovserver/PavlovServer.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make a note to review these steps later, if you would like to automate server and steam client updates.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Server Configuration ===&lt;br /&gt;
&lt;br /&gt;
Before being able to properly use the server we need to configure it. You should attempt to start the server, let it start up, and then shut down the server, which should create all the required configuration files and directories. &lt;br /&gt;
&lt;br /&gt;
However, if you are having trouble, it may help to create the directories manually first - make sure you are doing these actions as the &amp;quot;steam&amp;quot; user. &lt;br /&gt;
&lt;br /&gt;
Start by creating some directories: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /home/steam/pavlovserver/Pavlov/Saved/Logs&lt;br /&gt;
mkdir -p /home/steam/pavlovserver/Pavlov/Saved/Config/LinuxServer&lt;br /&gt;
mkdir -p /home/steam/pavlovserver/Pavlov/Saved/maps&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mods/Blacklist/Whitelist (optional)  ====&lt;br /&gt;
&lt;br /&gt;
The following three files allow you to specify mods, banned players, and whitelist players. These are optional, but go ahead and create them. Populating the files is described later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /home/steam/pavlovserver/Pavlov/Saved/Config/mods.txt&lt;br /&gt;
touch /home/steam/pavlovserver/Pavlov/Saved/Config/blacklist.txt&lt;br /&gt;
touch /home/steam/pavlovserver/Pavlov/Saved/Config/whitelist.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Configuring Game.ini====&lt;br /&gt;
If starting the server did not create a default Game.ini, create a new Game.ini file using following command to open an editor and copy/paste the following block into it then save it.  &lt;br /&gt;
&lt;br /&gt;
Note not all of these options are required. For instance remove or comment out the Password=0000 line to make a public server with no pin.  &lt;br /&gt;
&lt;br /&gt;
You will also need to fetch your API Key you set up earlier. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nano /home/steam/pavlovserver/Pavlov/Saved/Config/LinuxServer/Game.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[/Script/Pavlov.DedicatedServer]&lt;br /&gt;
bEnabled=true&lt;br /&gt;
ServerName=&amp;quot;My_private_idaho&amp;quot;&lt;br /&gt;
MaxPlayers=10     #its recommended for the best experience to keep shack servers at or below 10 players pcvr and psvr are both capped at 24 too. &lt;br /&gt;
ApiKey=&amp;quot;ABC123FALSEKEYDONTUSEME&amp;quot;&lt;br /&gt;
bSecured=true&lt;br /&gt;
bCustomServer=true &lt;br /&gt;
bVerboseLogging=false &lt;br /&gt;
bCompetitive=false #This only works for SND&lt;br /&gt;
bWhitelist=false &lt;br /&gt;
RefreshListTime=120 &lt;br /&gt;
LimitedAmmoType=0 &lt;br /&gt;
TickRate=90&lt;br /&gt;
TimeLimit=60&lt;br /&gt;
AFKTimeLimit=300&lt;br /&gt;
#Password=0000 &lt;br /&gt;
#BalanceTableURL=&amp;quot;vankruptgames/BalancingTable/main&amp;quot;&lt;br /&gt;
MapRotation=(MapId=&amp;quot;UGC1758245796&amp;quot;, GameMode=&amp;quot;GUN&amp;quot;)&lt;br /&gt;
MapRotation=(MapId=&amp;quot;datacenter&amp;quot;, GameMode=&amp;quot;SND&amp;quot;)&lt;br /&gt;
MapRotation=(MapId=&amp;quot;sand&amp;quot;, GameMode=&amp;quot;DM&amp;quot;)&lt;br /&gt;
AdditionalMods=UGC3462586&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''bEnabled''' - whether the server appears in the server list (unconfirmed)&lt;br /&gt;
* '''ServerName''' - name it will be listed as. (approx 35 chars max)&lt;br /&gt;
* '''MaxPlayers''' - See suggested specs for limits. 10 standard (10 for shack), 20-24 is max recommended for large maps like Stalingrad or PUSH/RUSH modes, and servers allow a maximum of 24 players.&lt;br /&gt;
* '''ApiKey''' - Unique ApiKey required to register server with master server. Replace with your key&lt;br /&gt;
* '''bSecured''' - enabled Valve Anti-Cheat (VAC)&lt;br /&gt;
* '''bCustomServer''' - activates some new modding tools (save and http functions. Required to write to blacklist.txt for bans)&lt;br /&gt;
* '''bCompetitive''' - sets the server to competitive mode for SND. If removed the server will default to false&lt;br /&gt;
* '''bVerboseLogging''' - enables verbose logging, mostly detailed statistics.  Be prepared for significant increase in logging.&lt;br /&gt;
* '''bWhitelist''' - Only allow users in whitelist.txt to join&lt;br /&gt;
* '''RefreshListTime''' - sets how often the running server checks for updates in ban/whitelist/mod files&lt;br /&gt;
* '''LimitedAmmoType''' - sets limited ammo mode, see Limited Ammo Types table below&lt;br /&gt;
&lt;br /&gt;
* '''TimeLimit''' - sets time limit for each map&lt;br /&gt;
* '''TickRate''' - sets the server tickrate. (so far minimum stable seems around 50 and max around 120. Beware setting this changes weapon despawn time and breaks some game modes. Recommend not touching)&lt;br /&gt;
* '''Password''' - PIN number for server #FYI - this is now also changeable via rcon.&lt;br /&gt;
* '''BalanceTableURL''' - Points to a custom balance table from github. See https://github.com/vankruptgames/BalancingTable for instructions. This line isn't needed if you don't have one. &lt;br /&gt;
* '''MapRotation''' - you can add multiple of these. The map system has switched from the steam workshop to modio which means that the server rotation will need to be redone with modio UGCs. &amp;lt;nowiki&amp;gt;https://mod.io/g/pavlov&amp;lt;/nowiki&amp;gt;. This is done by taking the resource ID from the modio page, adding “UGC” in front of it and then adding that to the rotation. For example the map gravity &amp;lt;nowiki&amp;gt;https://mod.io/g/pavlov/m/gravity1&amp;lt;/nowiki&amp;gt; has a resource ID of 2773760 so the map ID to add to the server would be “UGC2773760”. When a match ends, the server will load the next map in the rotation.  &lt;br /&gt;
* '''AdditionalMods''' - you can add multiple of these. Find the mod(s) you want add on modio and take its resource ID, adding 'UGC' to the front of it. &lt;br /&gt;
* '''AFKTimeLimit''' There is now a feature to kick players who are idle in the game. Integers are measured in seconds and 0 disables AFK kicking completely.&lt;br /&gt;
&lt;br /&gt;
Available game modes as of 09/06/2022: See Game modes table below&lt;br /&gt;
&lt;br /&gt;
For maps running a Custom gamemode (CodZ, BR, Duel, etc.) it doesn't matter which gamemode you choose, as the map will automatically override it with the custom mode.&lt;br /&gt;
&lt;br /&gt;
===== Limited Ammo Types =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!AmmoType&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Unlimited&lt;br /&gt;
|Players have unlimited ammo, carry no ammo boxes and do not display an ammo count on the wrist.&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Limited Generic&lt;br /&gt;
|Players carry ammo boxes with a limited amount of ammo.&lt;br /&gt;
One box for each weapon class (Pistol, Submachine gun, Rifles/MGs, Shotgun, Sniper).&lt;br /&gt;
&lt;br /&gt;
Mags and ammo boxes can be put on the chest of the player to consolidate the ammo.&lt;br /&gt;
&lt;br /&gt;
An ammo count is displayed on the wrist.&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Limited Specific&lt;br /&gt;
|Players carry ammo boxes with a limited amount of ammo.&lt;br /&gt;
One box for each weapon.&lt;br /&gt;
&lt;br /&gt;
Mags and ammo boxes can be put on the chest of the player to consolidate the ammo.&lt;br /&gt;
&lt;br /&gt;
An ammo count is displayed on the wrist.&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Custom&lt;br /&gt;
|Allows for full control over ammo by the map.&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
| Limited Special&lt;br /&gt;
|'''All weapons except &amp;quot;special&amp;quot; weapons are unlimited, more clarification is needed.''' &lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Boxless&lt;br /&gt;
|'''Like limited generic but without boxes? Clarification is needed.'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Game Modes =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!GameMode &lt;br /&gt;
!Name&lt;br /&gt;
|-&lt;br /&gt;
|DM&lt;br /&gt;
|Death match&lt;br /&gt;
|-&lt;br /&gt;
|KOTH&lt;br /&gt;
|King of the hill&lt;br /&gt;
|-&lt;br /&gt;
|GUN&lt;br /&gt;
| Gun game&lt;br /&gt;
|-&lt;br /&gt;
|OITC&lt;br /&gt;
| One in the chamber&lt;br /&gt;
|-&lt;br /&gt;
|SND&lt;br /&gt;
|Search and destroy&lt;br /&gt;
|-&lt;br /&gt;
|TANKTDM&lt;br /&gt;
|WW2 Team Death Match&lt;br /&gt;
|-&lt;br /&gt;
| TDM&lt;br /&gt;
|Team Death Match&lt;br /&gt;
|-&lt;br /&gt;
|TTT&lt;br /&gt;
|Trouble in Terrorist Town&lt;br /&gt;
|-&lt;br /&gt;
|TTTclassic&lt;br /&gt;
|TTT with only innocent/traitor/detective&lt;br /&gt;
|-&lt;br /&gt;
|WW2GUN&lt;br /&gt;
|WW2 gun game&lt;br /&gt;
|-&lt;br /&gt;
|ZWV&lt;br /&gt;
| Zombie wave survival&lt;br /&gt;
|-&lt;br /&gt;
|HIDE&lt;br /&gt;
|The Hidden &lt;br /&gt;
|-&lt;br /&gt;
|INFECTION&lt;br /&gt;
|Hidden infection&lt;br /&gt;
|-&lt;br /&gt;
|PUSH&lt;br /&gt;
|Push&lt;br /&gt;
|-&lt;br /&gt;
|PH&lt;br /&gt;
|Prop hunt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Default Map ID's ====&lt;br /&gt;
datacenter &lt;br /&gt;
&lt;br /&gt;
sand&lt;br /&gt;
&lt;br /&gt;
bridge&lt;br /&gt;
&lt;br /&gt;
containeryard&lt;br /&gt;
&lt;br /&gt;
siberia (Prison Break)&lt;br /&gt;
&lt;br /&gt;
hospital (Zombies map)&lt;br /&gt;
&lt;br /&gt;
killhouse&lt;br /&gt;
&lt;br /&gt;
range&lt;br /&gt;
&lt;br /&gt;
tutorial&lt;br /&gt;
&lt;br /&gt;
santorini&lt;br /&gt;
&lt;br /&gt;
station&lt;br /&gt;
&lt;br /&gt;
industry&lt;br /&gt;
&lt;br /&gt;
ogcontainers (Shack only)&lt;br /&gt;
&lt;br /&gt;
haguenau (Shack only)&lt;br /&gt;
&lt;br /&gt;
foundation (Shack only)&lt;br /&gt;
&lt;br /&gt;
stalingrad (PC only)&lt;br /&gt;
&lt;br /&gt;
stalingrad_night (PC only)&lt;br /&gt;
&lt;br /&gt;
santorini_night (PC only)&lt;br /&gt;
&lt;br /&gt;
sand_night (PC only)&lt;br /&gt;
&lt;br /&gt;
station_night (PC only)&lt;br /&gt;
&lt;br /&gt;
industry_night (PC only)&lt;br /&gt;
&lt;br /&gt;
bunker (PC only)&lt;br /&gt;
&lt;br /&gt;
=== Server Administration ===&lt;br /&gt;
Installing the server is half the battle.&lt;br /&gt;
&lt;br /&gt;
==== Server Visibility ====&lt;br /&gt;
If you've followed this guide successfully to this point, you should have a running instance of pavlovserver. For your server to be visible to the Master List, and so that it can be joined by players, you will need to make sure the server has the ports forwarded.&lt;br /&gt;
&lt;br /&gt;
You can also check the server visibility using the vankrupt API, or on some publicly hosted game server lists, or by launching the game and just looking for your server in the game browser.&lt;br /&gt;
&lt;br /&gt;
===== Firewall/Port forwarding =====&lt;br /&gt;
Using the default settings there are two UDP ports (7777, 8177) that need to be allowed to access the server either by firewall setup or port forwarding. &lt;br /&gt;
&lt;br /&gt;
'''Ubuntu''' firewall commands to check firewall and open ports:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo ufw status&lt;br /&gt;
sudo ufw allow 7777&lt;br /&gt;
sudo ufw allow 8177&lt;br /&gt;
sudo ufw allow 9100&lt;br /&gt;
sudo ufw status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Rocky Linux''' firewall commands to check the firewall and open ports:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=7777/tcp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=7777/udp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=8177/tcp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=8177/udp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=9100/udp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=9100/tcp&lt;br /&gt;
sudo firewall-cmd --list-ports&lt;br /&gt;
firewall-cmd --runtime-to-permanent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may also need to allow Pings (ICMP) for the server's true latency to appear in the master list.&lt;br /&gt;
&lt;br /&gt;
If you are running multiple servers and have set additional ports (see http://pavlovwiki.com/index.php/Setting_up_a_dedicated_server#Running_multiple_servers_on_one_host) then you need to allow access to the defined port plus the port 400 higher. So if you use 7000 as your port, then UDP 7000 and 7400 need to be open&lt;br /&gt;
&lt;br /&gt;
Whilst on the topic of port forwarding, If you have setup '''rcon''' via RconSettings.txt (below) then that port also needs to be allowed access via TCP, if your RCON controller will be external to your server.&lt;br /&gt;
&lt;br /&gt;
If you are running Shack/Quest and want to have maps that are downloadable from your server, your server ports (ex. 7777 &amp;amp; 8177) must also be open via TCP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ipv6 is not planned to be supported. You can disable by doing the following command:&lt;br /&gt;
 sudo nano /etc/default/grub&lt;br /&gt;
And then edit the line below to GRUB_CMDLINE_LINUX_DEFAULT=”ipv6. disable=1″&lt;br /&gt;
&lt;br /&gt;
This makes sure ipv6 is disabled on operating system restart. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Shack Maps (Quest) ====&lt;br /&gt;
&lt;br /&gt;
Adding maps for the Shack version of Pavlov works differently to the steam version of the game, and you'll run into issues very quickly if you do not customise your server to accomodate this.&lt;br /&gt;
&lt;br /&gt;
This is because Shack has no affiliation with Steam, and therefore cannot use Steam Workshop maps like the above. In the future, these steps will apply to PC servers as well, allowing a server to hold the map itself, instead of offloading it to Steam.&lt;br /&gt;
&lt;br /&gt;
To get started, first, create the directory to hold the maps&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir -p /home/steam/pavlovserver/Pavlov/Saved/maps&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can use any number of methods to move the map files onto the server, but I'll go over the two simplest, starting with a GUI approach&lt;br /&gt;
&lt;br /&gt;
* Download and install Cyberduck onto your &amp;quot;home&amp;quot; PC (Whatever PC you use for access to the server, but not the server itself): https://cyberduck.io/&lt;br /&gt;
&lt;br /&gt;
* Next, download and unzip your map of choice&lt;br /&gt;
** You can get them from https://www.pavlovquest.com/ , https://pavlovhorde.com/mapsList, or look in #shack-map-showcase channel in the discord server.&lt;br /&gt;
** I'm going to use Cheeto's WW2 Items test (http://www.mediafire.com/file/emyt9bs1z9u9ykw/SVR_Cheeto_Items.zip/file ) for this example, you do what you like&lt;br /&gt;
&lt;br /&gt;
* In the top left corner, open a connection, set the connection type to SFTP, and fill in the rest of the information&lt;br /&gt;
** This will be the same credentials you've used to connect to the server via SSH this whole time. - the username is typically `root` for Debian or Rocky systems, but you could also use the &amp;quot;steam&amp;quot; user if you set that user up with a password or private key to allow SSH.&lt;br /&gt;
&lt;br /&gt;
* In the directory dropdown (it will say /root) navigate back to /&lt;br /&gt;
* Follow the directories until we arrive back at our &amp;quot;maps&amp;quot; folder&lt;br /&gt;
&amp;lt;pre&amp;gt;/home/steam/pavlovserver/Pavlov/Saved/maps&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Drag and drop the unzipped map folder into the main window, in this case itll be SVR_Cheeto_Items&lt;br /&gt;
* Hit Allow&lt;br /&gt;
** You'll now see a folder named SVR_Cheeto_Items, and within it should be nothing but 3 files. If there is another folder in it, move this folder to the maps directory, otherwise the server won't work. The 3 files (2 .PAK one .JSON) should be in home/steam/pavlovserver/Pavlov/Saved/maps/SVR_Cheeto_Items, no more, no less.&lt;br /&gt;
* Your map should now be ready to use, after you restart the game service (e.g. sudo systemctl restart pavlovserver.service).&lt;br /&gt;
&lt;br /&gt;
Pavlov Shack servers load maps when the pavlovserver starts up.&lt;br /&gt;
&lt;br /&gt;
'''YOU MUST RESTART THE GAME SERVER TO USE THE MAPS.'''&lt;br /&gt;
&lt;br /&gt;
To play the map, you can either use RCON switch map command, or to add the map to your server's automatic map rotation list, add the map's folder name to your Game.ini. This replaces the MapID section, so for our example, you would add the following line to your Game.ini above or below the other MapRotation lines: &lt;br /&gt;
&lt;br /&gt;
If you have any trouble with the map loading (typically, the game will load into datacentre if there are problems) you may need to check the permissions of the map files, to ensure they belong to the user/group &amp;quot;steam:steam&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MapRotation=(MapId=&amp;quot;SVR_Cheeto_Items&amp;quot;, GameMode=&amp;quot;TDM&amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And that's all! Disconnect CyberDuck from your server before playing, otherwise you'll have difficulty joining.&lt;br /&gt;
&lt;br /&gt;
-----------&lt;br /&gt;
&lt;br /&gt;
==== Adding Shack Maps over Command Line Interface ====&lt;br /&gt;
&lt;br /&gt;
A reminder that Pavlov Shack servers load maps when the pavlovserver starts up.&lt;br /&gt;
&lt;br /&gt;
'''YOU MUST RESTART THE GAME SERVER TO USE THE MAPS.'''&lt;br /&gt;
&lt;br /&gt;
This process is more complicated, but adding maps over the command line interface has its benefits&lt;br /&gt;
&lt;br /&gt;
First, log into the server, change to the steam user, and CD to the maps directory you made above&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo su steam&lt;br /&gt;
cd ~/pavlovserver/Pavlov/Saved/maps&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Download the map files from whatever you use to upload them. To do this, you can either use curl or wget&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;curl -O insertURLhere&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''If you download your map from Google Drive''', make sure that your .zip folder is shared with anyone.&lt;br /&gt;
&lt;br /&gt;
Then, get the file's URL from the shared link.&amp;lt;p&amp;gt;Example : ''&amp;lt;nowiki&amp;gt;https://drive.google.com/file/d/19bI8gUHaN5tUrDvnadAacUnchQf6_k/view&amp;lt;/nowiki&amp;gt;''&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;will be ''19bI8gUHaN5tUrDvnadAacUnchQf6_k''&amp;lt;/p&amp;gt;&lt;br /&gt;
Edit &amp;quot;fileId&amp;quot; and &amp;quot;fileName&amp;quot; before you execute the command. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fileId=19bI8gUHaN5tUrDvnadAacUnchQf6_k&lt;br /&gt;
fileName=SVR_USER_MAPNAME&lt;br /&gt;
curl -sc /tmp/cookie &amp;quot;https://drive.google.com/uc?export=download&amp;amp;id=${fileId}&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
code=&amp;quot;$(awk '/_warning_/ {print $NF}' /tmp/cookie)&amp;quot;  &lt;br /&gt;
curl -Lb /tmp/cookie &amp;quot;https://drive.google.com/uc?export=download&amp;amp;confirm=${code}&amp;amp;id=${fileId}&amp;quot; -o ${fileName} &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To keep with the Items example, we're downloading the file from a ZIP uploaded to discord:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;curl -O https://cdn.discordapp.com/attachments/744185280759857234/745027406695366788/SVR_Cheeto_Items.zip&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, unzip the file. If this next step errors out, saying the command is unknown, switch back to the root user (su root), and install unzip (sudo apt install unzip), then return to the steam user, and continue.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;unzip SVR_Cheeto_Items.zip&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now finish like before by adding the map to your Game.ini&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;nano /home/steam/pavlovserver/Pavlov/Saved/Config/LinuxServer/Game.ini&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MapRotation=(MapId=&amp;quot;SVR_Cheeto_Items&amp;quot;, GameMode=&amp;quot;TDM&amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Admin/Moderator list for Arctic-VR hosted servers (optional) ====&lt;br /&gt;
&lt;br /&gt;
The only working in-game admin menu is through Arctic VR server hosting (see below).  &lt;br /&gt;
&lt;br /&gt;
If you add moderators to your server, they will not be subject to vote kicks. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nano ~/pavlovserver/Pavlov/Saved/Config/mods.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example Mod List:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
76541198397498572 #Optional Comment: Player name&lt;br /&gt;
76541198397498573 #Some Other Player&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ArcticVR Admin Menu ====&lt;br /&gt;
&lt;br /&gt;
[[File:Arcticmenu.jpg|500px|link=https://www.arctic-vr.com/server-admin-menu]]&lt;br /&gt;
&lt;br /&gt;
Arctic-VR Offers an advanced In-Game Admin menu that is exclusive to their hosting service. Features include: &lt;br /&gt;
* Switch Maps+Modes&lt;br /&gt;
* Teleport Players to Players&lt;br /&gt;
* Change Player Skins&lt;br /&gt;
* Control Player Buying+Cash&lt;br /&gt;
* Spawn Items&lt;br /&gt;
* Clean up corpses + guns&lt;br /&gt;
* Spawn Bots&lt;br /&gt;
* Spawn Items for other players&lt;br /&gt;
* Control Teams + Balance/Shuffle Teams&lt;br /&gt;
* ResetSND&lt;br /&gt;
* And More&lt;br /&gt;
&lt;br /&gt;
You can read more about the ArcticVR admin menu on their website: https://www.arctic-vr.com/server-admin-menu&lt;br /&gt;
&lt;br /&gt;
==== Handy tools for finding steamIDs ==== &lt;br /&gt;
&lt;br /&gt;
Steam ID finder: https://steamidfinder.com/lookup/ or https://steamid.xyz/&lt;br /&gt;
&lt;br /&gt;
You want to enter in the steamID64 format. &lt;br /&gt;
&lt;br /&gt;
This tool can convert or lookup IDs:  https://steamid.io/&lt;br /&gt;
&lt;br /&gt;
If you are looking for a steamID of a player that has been on your server recently this is technique to find them:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep -i playername ~/pavlovserver/Pavlov/Saved/Logs/* | grep TicketValidation&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configure Rcon ====&lt;br /&gt;
To enable Rcon access create config file:&lt;br /&gt;
&amp;lt;pre&amp;gt; nano /home/steam/pavlovserver/Pavlov/Saved/Config/RconSettings.txt &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copy in the following text - change password, and if desired the port:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Password=ChangeThisPassword&lt;br /&gt;
Port=9100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You must specify a port for the Rcon server to use as well as a Password (use a different port per sever instance if running multiple server instances off the same hardware)&lt;br /&gt;
&lt;br /&gt;
==== Starting the server manually ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/pavlovserver &amp;amp;&amp;amp; ./PavlovServer.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That's it, your server will be automatically broadcast to the master server! :) &lt;br /&gt;
&lt;br /&gt;
Note that when you close your terminal, the server will go down. See the &amp;quot;supervisors&amp;quot; section below for how to prevent this. &lt;br /&gt;
&lt;br /&gt;
If you have followed the supervisor service-setup part of the guide, you can run pavlovserver as a service using systemctl. &lt;br /&gt;
&lt;br /&gt;
==== Seeing your server in a Master List ====&lt;br /&gt;
Two handy tools to determine quickly if your server is broadcasting are the [https://pavlovhorde.com/ Horde] (Shack) and [https://pavlovhorde.com/pcServers Horde] (PC version) public listings. &lt;br /&gt;
&lt;br /&gt;
If you're also handy with cURL, you can query the vankrupt game server listing directly, for Oculus/Shack servers, and PC servers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://prod-shack-pavlov-ms.vankrupt.net/servers/v2/list/1.0.17/oculus_app_id/0/0/0/all&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://prod-shack-pavlov-ms.vankrupt.net/servers/v2/list/1.0.17/oculus/0/0/0/all&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://prod-crossplay-pavlov-ms.vankrupt.net/servers/v2/list/1.0.17/steam/0/0/0/all&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where 1.0.17 is the version of the game. You can check the current version of the game your server is running by checking your log file (/home/steam/pavlovserver/Pavlov/Saved/Logs/Pavlov.log) and checking for the &amp;quot;version&amp;quot; line early in the startup of the log file.&lt;br /&gt;
&lt;br /&gt;
The endpoint also supports filtering - changing the '''/0/0/0''' in the URL will have the following effects:&lt;br /&gt;
&lt;br /&gt;
* /1/0/0/ hide empty servers&lt;br /&gt;
* /0/1/0/ hide full servers&lt;br /&gt;
* /0/0/1/ hide password protected servers&lt;br /&gt;
&lt;br /&gt;
You can also customize which gamemodes are shown by changing /all to /SND,TDM,DM,GUN,CUSTOM,ZWV,TTT,TTTCLASSIC,TANKTDM,WW2GUN,KOTH,OITC,HIDE,PH and removing what you don't want to view.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Supervising the server using systemd ===&lt;br /&gt;
&lt;br /&gt;
Running '''./PavlovServer.sh''' in your interactive shell is easy, but the server will shut down when you close your terminal. If you want to run the server in the background,&lt;br /&gt;
you'll want to run it under a supervisor. There are many options, ranging from the simple (nohup, screen or tmux), to the&lt;br /&gt;
more robust (supervisord, systemd).&lt;br /&gt;
&lt;br /&gt;
Systemd is running by default on Ubuntu Linux, so we'll use that here.&lt;br /&gt;
&lt;br /&gt;
To run the server as a systemd service, create the file '''/etc/systemd/system/pavlovserver.service''' (as root) by typing &lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
sudo nano /etc/systemd/system/pavlovserver.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copy the contents below into the file and save.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Pavlov VR dedicated server&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
WorkingDirectory=/home/steam/pavlovserver&lt;br /&gt;
ExecStart=/home/steam/pavlovserver/PavlovServer.sh&lt;br /&gt;
&lt;br /&gt;
RestartSec=1&lt;br /&gt;
Restart=always&lt;br /&gt;
User=steam&lt;br /&gt;
Group=steam&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy = multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you'd like your server to start as competitive without editing the game.ini, change the line &amp;quot;ExecStart=/home/steam/pavlovserver/PavlovServer.sh&amp;quot; to look like this below. Though it's much easier to just use the game.ini to enable competitive instead. &amp;lt;pre&amp;gt;ExecStart=/home/steam/pavlovserver/PavlovServer.sh -COMPETITIVE=1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Change the user or paths as appropriate. After saving the service file, to start, restart, stop, or monitor the server:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl start pavlovserver&lt;br /&gt;
sudo systemctl restart pavlovserver&lt;br /&gt;
sudo systemctl stop pavlovserver&lt;br /&gt;
sudo systemctl status pavlovserver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To view the logs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo journalctl -u pavlovserver&lt;br /&gt;
# to live-tail the logs&lt;br /&gt;
sudo journalctl -u pavlovserver -f&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want to run the pavlov server as soon as your server boots (e.g. a VPS you turn on and off), add pavlov as a startup service:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl enable pavlovserver&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Advanced Server Administration ==&lt;br /&gt;
&lt;br /&gt;
=== Running multiple servers on one host ===&lt;br /&gt;
&lt;br /&gt;
* Pavlovserver is functionally single-threaded (there are multiple threads, but the vast majority of work occurs in the primary one). Make sure you have # of pavlovservers + 1 CPU available. More CPUs= more servers. Faster CPU = more players.&lt;br /&gt;
* Make multiple server installs by defining a separate install dir for each server.&lt;br /&gt;
* Run each server with a unique port. eg: '''./PavlovServer.sh -PORT=&amp;quot;Desired Port&amp;quot;'''&lt;br /&gt;
* The Server will use the Desired Port and the Port 400 above (Example: You choose 8200 as Port. So Port 8600 will be used as well)&lt;br /&gt;
* If you are using RCON, each server will need a unique port defined in RconSettings.txt&lt;br /&gt;
* Ensure the ports are forwarded and opened in your firewall&lt;br /&gt;
&lt;br /&gt;
To duplicate directories:&lt;br /&gt;
&lt;br /&gt;
be in the steam home folder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp -r pavlovserver pavlovserver1&lt;br /&gt;
/home/steam/pavlovserver1/PavlovServer.sh -PORT=[Desired Port]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Starting server in competitive mode ===&lt;br /&gt;
Competitive mode will prevent dead teammates from being able to see the match, to prevent ghosting.&lt;br /&gt;
You can either enable this via Game.ini (described in Game.ini file), or using the -COMPETITIVE=1 parameter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/steam/pavlovserver1/PavlovServer.sh -COMPETITIVE=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Useful Linux Commands ===&lt;br /&gt;
List files / folders in directory, print current working directory, &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -la                                    #list files/directories along with authorities and ownership&lt;br /&gt;
pwd                                       #print working directory&lt;br /&gt;
sudo chown &amp;lt;owner&amp;gt; &amp;lt;file/directory&amp;gt;       #change owner of file/directory.  If root created something and you need to change it to steam&lt;br /&gt;
sudo chgrp &amp;lt;group&amp;gt; &amp;lt;file/directory&amp;gt;       #change group of file/directory.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Check if pavlov is running by checking process status.  If the only row you see is the grep command, pavlov server is not started.&lt;br /&gt;
&amp;lt;pre&amp;gt; ps -ef | grep pav &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sample output:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
steam      34044       1  0 16:52 ?        00:00:00 /bin/sh /home/steam/pavlovserver/PavlovServer.sh&lt;br /&gt;
steam      34066   34044 80 16:52 ?        00:00:04 /home/steam/pavlovserver/Pavlov/Binaries/Linux/PavlovServer&lt;br /&gt;
zombies+   34101   34013  0 16:52 pts/0    00:00:00 grep --color=auto pav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kill a process.  Note this command uses 34044, which is a process id from the command output above.&lt;br /&gt;
&amp;lt;pre&amp;gt; kill -9 34044           &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dump the log to the console so you can scroll through it:&lt;br /&gt;
&amp;lt;pre&amp;gt; cat /home/steam/pavlovserver/Pavlov/Saved/Logs/Pavlov.log &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Search the log for a string - replace my_string with case-sensitive string&lt;br /&gt;
&amp;lt;pre&amp;gt; cat /home/steam/pavlovserver/Pavlov/Saved/Logs/Pavlov.log | grep my_string &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Advanced Scripts For Server Management ==&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Auto-updating the server (PCVR only)''' ===&lt;br /&gt;
Assuming you have followed this guide and used the default paths, users, and install instructions, you can paste the following into your terminal to auto-update your Pavlov server:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; 'EOF' &amp;gt; $HOME/pavlov_daily_update_and_restart.sh&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
USER=&amp;quot;steam&amp;quot;&lt;br /&gt;
SERVICENAME=&amp;quot;pavlovserver.service&amp;quot;&lt;br /&gt;
INSTALLDIRNAME=&amp;quot;pavlovserver&amp;quot;&lt;br /&gt;
USERHOME=&amp;quot;/home/$USER&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;Beginning Pavlov VR update run on $(date)\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
systemctl stop &amp;quot;$SERVICENAME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
sudo -iu &amp;quot;$USER&amp;quot; &amp;quot;$USERHOME/Steam/steamcmd.sh&amp;quot; +login anonymous +force_install_dir &amp;quot;$USERHOME/$INSTALLDIRNAME&amp;quot; +app_update 622970 +exit&lt;br /&gt;
sudo -iu &amp;quot;$USER&amp;quot; &amp;quot;$USERHOME/Steam/steamcmd.sh&amp;quot; +login anonymous +app_update 1007 +quit&lt;br /&gt;
sudo -iu &amp;quot;$USER&amp;quot; cp &amp;quot;$USERHOME/Steam/steamapps/common/Steamworks SDK Redist/linux64/steamclient.so&amp;quot; &amp;quot;$USERHOME/.steam/sdk64/steamclient.so&amp;quot;&lt;br /&gt;
sudo -iu &amp;quot;$USER&amp;quot; cp &amp;quot;$USERHOME/Steam/steamapps/common/Steamworks SDK Redist/linux64/steamclient.so&amp;quot; &amp;quot;$USERHOME/pavlovserver/Pavlov/Binaries/Linux/steamclient.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
systemctl start &amp;quot;$SERVICENAME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;Ending Pavlov VR update run on $(date)\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
chmod +x $HOME/pavlov_daily_update_and_restart.sh&lt;br /&gt;
mkdir $HOME/pavlov_update_logs &amp;amp;&amp;amp; touch $HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log&lt;br /&gt;
CRONLINE=&amp;quot;00 2 * * * $HOME/pavlov_daily_update_and_restart.sh &amp;gt;&amp;gt;$HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log 2&amp;gt;&amp;amp;1&amp;quot;&lt;br /&gt;
(sudo crontab -u root -l; echo &amp;quot;$CRONLINE&amp;quot; ) | sudo crontab -u root -&lt;br /&gt;
unset CRONLINE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These commands will:&lt;br /&gt;
&lt;br /&gt;
1. Create a shell script in the &amp;quot;steam&amp;quot; user's home directory that automatically stops the Pavlov server, pulls any updates via steam, pull updates to the Steamworks SDK Redist, and copies the latest version of steamclient.so to the Pavlov server directory&lt;br /&gt;
&lt;br /&gt;
2. Make the shell script executable&lt;br /&gt;
&lt;br /&gt;
3. Create a new directory called &amp;quot;pavlov_update_logs&amp;quot; in the &amp;quot;steam&amp;quot; user's directory, and create a logfile inside that directory called &amp;quot;pavlov_daily_update_and_restart.sh.log&amp;quot;. You can check this logfile to see the output of the Pavlov and Steam SDK update commands.&lt;br /&gt;
&lt;br /&gt;
4. Create a crontab entry for the root user that runs this shell script automatically every day at 2:00AM local time&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you want to change the time that this script runs, edit the numbers &amp;quot;00 2&amp;quot; in the line that starts with &amp;quot;CRONLINE=&amp;quot;. In the example provided, 00 is the minutes column, and 2 is the hour column. For example, if you wanted the server to automatically update and restart at 4:17AM every day, change the line starting with &amp;quot;CRONLINE=&amp;quot; to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CRONLINE=&amp;quot;17 4 * * * $HOME/pavlov_daily_update_and_restart.sh &amp;gt;&amp;gt;$HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log 2&amp;gt;&amp;amp;1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the time is PM, use 24-hour time format, e.g. &amp;quot;32 18&amp;quot; for 6:32PM.&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
=== '''Save Logs for records and stats''' ===&lt;br /&gt;
this is an automated script that will on a timer save all the backups made by the server before they are purged by the game for admin records and starts collection&lt;br /&gt;
&lt;br /&gt;
https://github.com/JTWP-org/backUpLogs2&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Make an API request with Mod.io to get map picture and name''' ===&lt;br /&gt;
very basic script pass the script a map ID as an argument then it will give u the name and a thumbnail to use &lt;br /&gt;
&lt;br /&gt;
https://github.com/JTWP-org/mod.io-modcheck/tree/main&lt;br /&gt;
&lt;br /&gt;
=== '''Sharing Bans over gameserver on same machine''' ===&lt;br /&gt;
when you have a lot of servers keeping the bans synced can be a nightmare so using a symbolic link allows all the servers to use one file &lt;br /&gt;
&lt;br /&gt;
for this lets say I have pavlovserver000 and pavlovserver001 and they are located at /home/steam/pavlovserver000 and  /home/steam/pavlovserver001&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''step 1 will be to pick a blacklist to use as the new one and move it to a central location'' &lt;br /&gt;
 mkdir ~/shared ; mv /home/steam/pavlovserver000/Pavlov/Saved/Config/blacklist.txt ~/shared/blacklist.txt ; rm /home/steam/pavlovserver001/Pavlov/Saved/Config/blacklist.txt&lt;br /&gt;
now we have moved the blacklist from pavlovserver000 to a folder in our home called shared and then we removed the blacklist from pavlovserver001 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
step 2 making the links &lt;br /&gt;
 ln -s ~/shared/blacklist.txt /home/steam/pavlovserver000/Pavlov/Saved/Config/blacklist.txt ; ln -s ~/shared/blacklist.txt /home/steam/pavlovserver001/Pavlov/Saved/Config/blacklist.txt&lt;br /&gt;
now editing them in pavlovserver001's files will update the list for all of the servers it's not a sync its uses the same list if you want to check where a link is pointed if u &lt;br /&gt;
 ls -l&lt;br /&gt;
It will show where the file is really located &amp;lt;hr&amp;gt;&lt;br /&gt;
=== Interactive Update ALL ===&lt;br /&gt;
will find all server installs on machine and update them will update Ubuntu check what version and do correct updates for that version also UPDATE 29 PCVR STEP  then it will list each server by server name and ask what type it is and then it will update and move to the next&lt;br /&gt;
&lt;br /&gt;
https://github.com/JTWP-org/Pavlov-updateallservers/tree/main&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== getting map info with just the UGC ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
you will need to get a API key from mod.io for this ... running this bash script and passing a UGC number to it will return the map name  mod.io url and a thumbnail &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
HOW TO USE &amp;lt;pre&amp;gt;nano get-map.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
then enter this script &amp;lt;pre&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
ugc=000000&lt;br /&gt;
&lt;br /&gt;
gameID=3959 #PAVLOV IS 3959&lt;br /&gt;
&lt;br /&gt;
api-path=&amp;quot;https://u-*ID NUMBER*.modapi.io/v1&amp;quot; #get on thhe access tab in mod.io settings&lt;br /&gt;
&lt;br /&gt;
api-key=&amp;quot;&amp;quot; #get on thhe access tab in mod.io settings&lt;br /&gt;
&lt;br /&gt;
curl -X GET &amp;quot;${api-path}/v1/games/${gameID}/mods/$(&amp;quot;${ugc:3})?api_key=${api-key}&amp;quot;   -H 'Accept: application/json' | jq  '.logo.thumb_1280x720, .name , .profile_url&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then give script perms to run &amp;lt;pre&amp;gt;sudo chmod +x get-map.sh&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
and then run it like this &lt;br /&gt;
&amp;lt;pre&amp;gt;bash get-map.sh UGC3409480   &amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Setting_up_a_dedicated_server&amp;diff=1039</id>
		<title>Setting up a dedicated server</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Setting_up_a_dedicated_server&amp;diff=1039"/>
		<updated>2024-12-03T16:26:55Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Setting up a dedicated server ==&lt;br /&gt;
&lt;br /&gt;
'''There are no Windows binaries''' &lt;br /&gt;
&lt;br /&gt;
This guide is written exclusively for Linux and covers Ubuntu/Debian/Debian-like and Red Hat RPM-based distros. Possible to run with other distros, but some of the commands won't work and you will need to know enough to figure out the software install of dependencies on your own. &lt;br /&gt;
&lt;br /&gt;
If you are considering hosting from home, please read that section of the wiki first. &lt;br /&gt;
&lt;br /&gt;
This guide assumes you know the basics of using a bash terminal: ssh'ing into a server, running bash commands, editing text files, etc.&lt;br /&gt;
&lt;br /&gt;
If you have no experience using bash, maybe start [https://www.howtogeek.com/140679/beginner-geek-how-to-start-using-the-linux-terminal/ here]. Editing text files via commandline is often a challenge. Suggest using nano and reading guide [https://www.howtogeek.com/howto/42980/the-beginners-guide-to-nano-the-linux-command-line-text-editor/ here]&lt;br /&gt;
&lt;br /&gt;
If you are new to linux and accessing your server from Windows, highly suggest using MobaXterm as your SSH client as that can make required editing of text files easier using built in editor instead of the native linux command line editors.&lt;br /&gt;
&lt;br /&gt;
And finally, ask yourself why you want to setup a server? If you look at the list, there are many, many more servers than players. If you don't have a team, discord community, or group of friends ready to play on your server, chances are it will go unused. Got one of these... great, let's go. &lt;br /&gt;
&lt;br /&gt;
If you don't want to go through the hassle yourself and want to pay for a hosting service Arctic VR (PC and Shack) and Horde (Shack) provide a server hosting services and are trusted in the community. See links below.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Server Requirements ===&lt;br /&gt;
&lt;br /&gt;
==== Operating System ====&lt;br /&gt;
'''Pavlovserver can only be hosted under Linux.'''&lt;br /&gt;
&lt;br /&gt;
Known good operating systems are:&lt;br /&gt;
&lt;br /&gt;
* Ubuntu 18.04 x86_64&lt;br /&gt;
* Ubuntu 19/04 amd64&lt;br /&gt;
* Ubuntu 20.04 x86_64&lt;br /&gt;
* Ubuntu 22.04 x86_64&lt;br /&gt;
* Rocky Linux 8&lt;br /&gt;
&lt;br /&gt;
This can be running as a VM under windows, but this will increase the complexity of the setup beyond this guide. &lt;br /&gt;
&lt;br /&gt;
Ubuntu 15.04 x86 is known to fail to install using this guide. Recommend not running on &amp;quot;minimal&amp;quot; images as some tools are missing, and they can be installed, which is not covered in the scope of this guide. &lt;br /&gt;
&lt;br /&gt;
==== Resources and Performance Optimisation ====&lt;br /&gt;
* 2GB RAM + 1GB RAM per each additional server with 10 players. More RAM is recommended for larger maps, higher player counts, or complex gamemodes. Not having enough RAM is a common cause of server crashes.&lt;br /&gt;
* A ~2.5Ghz CPU will comfortably support a 10 player server.&lt;br /&gt;
* A ~4Ghz CPU will comfortably support 24 players. Pavlov on PC can support up to 50 players. Shack is limited by 24.&lt;br /&gt;
Pavlov servers are functionally single threaded - one thread does vast majority of work. More CPUs only help if you are running more servers. More clockspeed = higher performance = more users per server. Hence, no particular performance benefit is gained from multithreading - if you are running multiple instances of a pavlov server, you will require more CPU cores.&lt;br /&gt;
&lt;br /&gt;
Lower player counts are recommended for complex gamemodes (E.g. CodZ) and/or highly detailed maps, so that maximum number will often be lower. Note that these player count numbers are just suggestions to help optimise for the best performance, based on experiences with many server providers on different grades of hardware.&lt;br /&gt;
&lt;br /&gt;
As of 1.0.17 (17/05/2024) 24 is the hard limits for player counts for Shack, but PC is limited to 50.&lt;br /&gt;
&lt;br /&gt;
The maximum number of servers you can run is dependent on how many CPUs you have. For example, if you have an 8 core CPU, the maximum number of servers would be 7. You should always have at least one CPU free as overhead, as Pavlov servers can use slightly more than one thread.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Hosting at home ====&lt;br /&gt;
When hosting at home there are additional requirements regarding networking: Your router has to support port-forwarding, hair-pinning/LoopbackNAT, and respond to ping requests.  These techniques are necessary to allow your server to be found and to talk back to the client. please see https://en.wikipedia.org/wiki/Port_forwarding,  https://en.wikipedia.org/wiki/Hairpinning, and https://www.speedguide.net/faq/how-to-become-pingable-behind-a-routerfirewall-376 for more info and google for these terms in addition to your router model to find guides on how to enable/configure it properly. If you have modern Router, it may have these features already enabled, in this case you just have to configure port-forwarding. If you can see your server but not join it while others can, this is indicative of a failure of LoopbackNAT. &lt;br /&gt;
&lt;br /&gt;
A second challenge to hosting at home is CGNAT (Carrier grade NAT: https://www.a10networks.com/blog/carrier-grade-nat/). Just like NAT on your home network that has to be gotten around w/ port-forwarding, CGNAT breaks the ability of external connections to be made back to your server, but the controls are solely in your ISPs hands. Sometimes if you ask, you can be removed from CGNAT pools and/or assigned a static IP. CGNAT rollouts are becoming very common now, so if your server worked then doesn't allow connections now, your ISP may have made this change. &lt;br /&gt;
&lt;br /&gt;
You can check whether you’re on a CGNAT network by visiting a Web site such as ipaddress.com or whatsmyip.com and comparing the IP address listed to the public/WAN IP address assigned to your Internet gateway. To find your gateway’s public IP address, check the status page in the administrative interface. If the two IP addresses differ, you’re likely on a CGNAT network. If so, this problem must be resolved before you go any further. &lt;br /&gt;
&lt;br /&gt;
'''Not understanding these requirements and configuration is a frequent cause of failed setups and questions in discord. Don't skip this if you are trying to host from home'''&lt;br /&gt;
&lt;br /&gt;
'''There are serious security implications of hosting this software at home.''' None of the devs are security experts and there has been no security review of the code. You are opening up your system to the world and publicity advertising this fact. Expect that any system hosting this software is open to compromise from the Internet and act accordingly. If your router offers a DMZ network, use it. Consider hosting on a cloud based server and think twice before running this software on any system that contains data you care about or has access to networks and computers you care about.&lt;br /&gt;
&lt;br /&gt;
If you're hosting at home using Oracle's VirtualBox, there are steps you can take to prevent double NAT (which can cause issues later on)&lt;br /&gt;
&lt;br /&gt;
1. Select your VM and then click Settings in VirtualBox's main window.&lt;br /&gt;
&lt;br /&gt;
2. Click on Network and change Attached To from NAT to Bridged Adapter. &lt;br /&gt;
&lt;br /&gt;
Once you've done this, your VM should be connected directly to your home router and double NAT should no longer be a issue.&lt;br /&gt;
&lt;br /&gt;
It should go without saying that hosting at home usually invites a myriad of potential problems that will be unique to your setup - such as your ISP, router, or network configuration. There is a lively community of like-minded server hosters on the Pavlov-VR Discord, so if you get stuck, head on over to the discord and see whether you can find the answers you're looking for.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Starting Server Install ===&lt;br /&gt;
&lt;br /&gt;
====Obtaining an ApiKey ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For your server to show up in the server list, there is now a requirement to have an ApiKey issued by Vankrupt. This is to prevent DOS attacks against the master server or abuse. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''You will need to load up the game on your headset''' the navigate to the settings, in the general tab is there a button to Generate Server Code. &lt;br /&gt;
&lt;br /&gt;
* Your &amp;quot;pin&amp;quot; will only be valid for 15 minutes. &lt;br /&gt;
* If your server key is exposed you can create a new key by generating a new 6 digit code. &lt;br /&gt;
* This will invalidate the old key.&lt;br /&gt;
* A server key can be used by multiple servers.&lt;br /&gt;
* A user may only have one server key, requesting a new one will invalidate the old one.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This will give you a 6 character code you need to combine with your player ID to generate a server key.&lt;br /&gt;
&lt;br /&gt;
Get the key by going here: https://api-key.vankrupt.net/ &lt;br /&gt;
[[File:Generateserverkey.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once you submit you will get your unique Server API Key that needs to go into your Game.ini&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Warnings:'''&lt;br /&gt;
* '''Abusing a Server key may result in a ban to the attached user.'''&lt;br /&gt;
* '''Do NOT share your server key, it should be used by you alone.'''&lt;br /&gt;
* '''Store your server key in a safe place, such as a password or secret manager.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Save this key for later, so that you can ut this key in your Game.ini as follows:&lt;br /&gt;
    ApiKey=&amp;quot;ABC123FALSEKEYDONTUSEME&amp;quot;&lt;br /&gt;
or if you would like (personally untested..I would use Game.ini) you can call it at server runtime with flag as follows:&lt;br /&gt;
   -KEY=&amp;quot;ABC123FALSEKEYDONTUSEME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This key can be re-used for a reasonable number of servers (a limit of 10 has been mentioned). Contact the Devs if you need more servers per key.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====System setup and software installation====&lt;br /&gt;
In this step we will:&lt;br /&gt;
&lt;br /&gt;
# Check the operating system is compatible&lt;br /&gt;
# Install some dependencies&lt;br /&gt;
# create the user &amp;quot;steam&amp;quot; and set it's password, and switch to that user&lt;br /&gt;
# as &amp;quot;steam&amp;quot; user, install Steamcmd, the binary used to download steam games in linux&lt;br /&gt;
# use Steamcmd to install Pavlov.&lt;br /&gt;
&lt;br /&gt;
These steps only need to be done the first time you set up the server. We'll then look at some post-installation steps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Step 1: Check the operating system is compatible =====&lt;br /&gt;
Confirm Linux version, run the command:&lt;br /&gt;
 lsb_release -a&lt;br /&gt;
  &lt;br /&gt;
Expect the result to say '''Ubuntu 20.04''' (or one of the other known supported operating systems - this guide assumes Ubuntu or a Fedora system)&lt;br /&gt;
&lt;br /&gt;
===== Step 2: Install some dependencies =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''For Ubuntu 22.10 or higher'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
 sudo apt update &amp;amp;&amp;amp; sudo apt install -y gdb curl lib32gcc-s1 libc++-dev unzip&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''For older version of Ubuntu prior to 22.10:'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
 sudo apt update &amp;amp;&amp;amp; sudo apt install -y gdb curl lib32gcc1 libc++-dev unzip&lt;br /&gt;
&amp;lt;blockquote&amp;gt;For Rocky Linux, CentOS 8, and RHEL 8&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/g' /etc/selinux/config&lt;br /&gt;
  sudo setenforce 0&lt;br /&gt;
  sudo yum install gdb curl glibc.i686 libstdc++.i686 libstdc++-devel.i686 libstdc++-devel.x86_64 unzip wget -y&lt;br /&gt;
  wget &amp;lt;nowiki&amp;gt;https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/libcxx-3.8.0-3.el7.x86_64.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  sudo rpm -i libcxx-3.8.0-3.el7.x86_64.rpm&lt;br /&gt;
&lt;br /&gt;
===== Step 3: Create the steam user =====&lt;br /&gt;
  sudo useradd -m steam&lt;br /&gt;
&lt;br /&gt;
[Optional] Set the /bin/bash shell for the steam user this will allow you to use arrow keys in terminal and show what folder you are in at all times&amp;lt;pre&amp;gt;sudo chsh -s /bin/bash steam&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Optional] Set a password for steam.&amp;lt;pre&amp;gt;sudo passwd steam&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Login as the Steam user. ('''You will need to do this each time you connect to your server - editing game files and interacting with the game server should be done as the steam user'''):&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo su -l steam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Step 4: Install Steam, known as SteamCMD =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~/Steam &amp;amp;&amp;amp; cd ~/Steam &amp;amp;&amp;amp; curl -sqL &amp;quot;https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz&amp;quot; | tar zxvf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Step 5: User SteamCMD to install Pavlov =====&lt;br /&gt;
There are different dedicated server versions for Pavlov Server - choose which server version you want to host (PC non-beta, PC Beta, Shack Live, or Shack RC)&lt;br /&gt;
(You will need to run this command each time there is a Pavlov Server update). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;To host '''PC Server (non-beta)''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta default +exit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To host '''PC BETA''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta beta_server +exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To host '''Shack Live''' (Quest):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta shack +exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To host '''Shack RC''' (Quest): &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta shack_beta +exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Post Installation Steps =====&lt;br /&gt;
Now that we've installed the server, Install a fresh copy of steamclient.so. You may also have to do this after each update.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +login anonymous +app_update 1007 +quit&lt;br /&gt;
mkdir -p ~/.steam/sdk64&lt;br /&gt;
cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/.steam/sdk64/steamclient.so&lt;br /&gt;
cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/pavlovserver/Pavlov/Binaries/Linux/steamclient.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All versions are required to run these commands to change the libc++ that steamclient uses:&lt;br /&gt;
 &amp;lt;code&amp;gt;sudo rm /usr/lib/x86_64-linux-gnu/libc++.so&amp;lt;/code&amp;gt; &lt;br /&gt;
 &amp;lt;code&amp;gt;sudo ln -s /usr/lib/x86_64-linux-gnu/libc++.so.1 /usr/lib/x86_64-linux-gnu/libc++.so&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make the PavlovServer script executable. (You only need to do this once):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod +x ~/pavlovserver/PavlovServer.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make a note to review these steps later, if you would like to automate server and steam client updates.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Server Configuration ===&lt;br /&gt;
&lt;br /&gt;
Before being able to properly use the server we need to configure it. You should attempt to start the server, let it start up, and then shut down the server, which should create all the required configuration files and directories. &lt;br /&gt;
&lt;br /&gt;
However, if you are having trouble, it may help to create the directories manually first - make sure you are doing these actions as the &amp;quot;steam&amp;quot; user. &lt;br /&gt;
&lt;br /&gt;
Start by creating some directories: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /home/steam/pavlovserver/Pavlov/Saved/Logs&lt;br /&gt;
mkdir -p /home/steam/pavlovserver/Pavlov/Saved/Config/LinuxServer&lt;br /&gt;
mkdir -p /home/steam/pavlovserver/Pavlov/Saved/maps&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mods/Blacklist/Whitelist (optional)  ====&lt;br /&gt;
&lt;br /&gt;
The following three files allow you to specify mods, banned players, and whitelist players. These are optional, but go ahead and create them. Populating the files is described later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /home/steam/pavlovserver/Pavlov/Saved/Config/mods.txt&lt;br /&gt;
touch /home/steam/pavlovserver/Pavlov/Saved/Config/blacklist.txt&lt;br /&gt;
touch /home/steam/pavlovserver/Pavlov/Saved/Config/whitelist.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Configuring Game.ini====&lt;br /&gt;
If starting the server did not create a default Game.ini, create a new Game.ini file using following command to open an editor and copy/paste the following block into it then save it.  &lt;br /&gt;
&lt;br /&gt;
Note not all of these options are required. For instance remove or comment out the Password=0000 line to make a public server with no pin.  &lt;br /&gt;
&lt;br /&gt;
You will also need to fetch your API Key you set up earlier. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nano /home/steam/pavlovserver/Pavlov/Saved/Config/LinuxServer/Game.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[/Script/Pavlov.DedicatedServer]&lt;br /&gt;
bEnabled=true&lt;br /&gt;
ServerName=&amp;quot;My_private_idaho&amp;quot;&lt;br /&gt;
MaxPlayers=10     #its recommended for the best experience to keep shack servers at or below 10 players pcvr and psvr are both capped at 24 too. &lt;br /&gt;
ApiKey=&amp;quot;ABC123FALSEKEYDONTUSEME&amp;quot;&lt;br /&gt;
bSecured=true&lt;br /&gt;
bCustomServer=true &lt;br /&gt;
bVerboseLogging=false &lt;br /&gt;
bCompetitive=false #This only works for SND&lt;br /&gt;
bWhitelist=false &lt;br /&gt;
RefreshListTime=120 &lt;br /&gt;
LimitedAmmoType=0 &lt;br /&gt;
TickRate=90&lt;br /&gt;
TimeLimit=60&lt;br /&gt;
AFKTimeLimit=300&lt;br /&gt;
#Password=0000 &lt;br /&gt;
#BalanceTableURL=&amp;quot;vankruptgames/BalancingTable/main&amp;quot;&lt;br /&gt;
MapRotation=(MapId=&amp;quot;UGC1758245796&amp;quot;, GameMode=&amp;quot;GUN&amp;quot;)&lt;br /&gt;
MapRotation=(MapId=&amp;quot;datacenter&amp;quot;, GameMode=&amp;quot;SND&amp;quot;)&lt;br /&gt;
MapRotation=(MapId=&amp;quot;sand&amp;quot;, GameMode=&amp;quot;DM&amp;quot;)&lt;br /&gt;
AdditionalMods=UGC3462586&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''bEnabled''' - whether the server appears in the server list (unconfirmed)&lt;br /&gt;
* '''ServerName''' - name it will be listed as. (approx 35 chars max)&lt;br /&gt;
* '''MaxPlayers''' - See suggested specs for limits. 10 standard (10 for shack), 20-24 is max recommended for large maps like Stalingrad or PUSH/RUSH modes, and servers allow a maximum of 24 players.&lt;br /&gt;
* '''ApiKey''' - Unique ApiKey required to register server with master server. Replace with your key&lt;br /&gt;
* '''bSecured''' - enabled Valve Anti-Cheat (VAC)&lt;br /&gt;
* '''bCustomServer''' - activates some new modding tools (save and http functions. Required to write to blacklist.txt for bans)&lt;br /&gt;
* '''bCompetitive''' - sets the server to competitive mode for SND. If removed the server will default to false&lt;br /&gt;
* '''bVerboseLogging''' - enables verbose logging, mostly detailed statistics.  Be prepared for significant increase in logging.&lt;br /&gt;
* '''bWhitelist''' - Only allow users in whitelist.txt to join&lt;br /&gt;
* '''RefreshListTime''' - sets how often the running server checks for updates in ban/whitelist/mod files&lt;br /&gt;
* '''LimitedAmmoType''' - sets limited ammo mode, see Limited Ammo Types table below&lt;br /&gt;
&lt;br /&gt;
* '''TimeLimit''' - sets time limit for each map&lt;br /&gt;
* '''TickRate''' - sets the server tickrate. (so far minimum stable seems around 50 and max around 120. Beware setting this changes weapon despawn time and breaks some game modes. Recommend not touching)&lt;br /&gt;
* '''Password''' - PIN number for server #FYI - this is now also changeable via rcon.&lt;br /&gt;
* '''BalanceTableURL''' - Points to a custom balance table from github. See https://github.com/vankruptgames/BalancingTable for instructions. This line isn't needed if you don't have one. &lt;br /&gt;
* '''MapRotation''' - you can add multiple of these. The map system has switched from the steam workshop to modio which means that the server rotation will need to be redone with modio UGCs. &amp;lt;nowiki&amp;gt;https://mod.io/g/pavlov&amp;lt;/nowiki&amp;gt;. This is done by taking the resource ID from the modio page, adding “UGC” in front of it and then adding that to the rotation. For example the map gravity &amp;lt;nowiki&amp;gt;https://mod.io/g/pavlov/m/gravity1&amp;lt;/nowiki&amp;gt; has a resource ID of 2773760 so the map ID to add to the server would be “UGC2773760”. When a match ends, the server will load the next map in the rotation.  &lt;br /&gt;
* '''AdditionalMods''' - you can add multiple of these. Find the mod(s) you want add on modio and take its resource ID, adding 'UGC' to the front of it. &lt;br /&gt;
* '''AFKTimeLimit''' There is now a feature to kick players who are idle in the game. Integers are measured in seconds and 0 disables AFK kicking completely.&lt;br /&gt;
&lt;br /&gt;
Available game modes as of 09/06/2022: See Game modes table below&lt;br /&gt;
&lt;br /&gt;
For maps running a Custom gamemode (CodZ, BR, Duel, etc.) it doesn't matter which gamemode you choose, as the map will automatically override it with the custom mode.&lt;br /&gt;
&lt;br /&gt;
===== Limited Ammo Types =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!AmmoType&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Unlimited&lt;br /&gt;
|Players have unlimited ammo, carry no ammo boxes and do not display an ammo count on the wrist.&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Limited Generic&lt;br /&gt;
|Players carry ammo boxes with a limited amount of ammo.&lt;br /&gt;
One box for each weapon class (Pistol, Submachine gun, Rifles/MGs, Shotgun, Sniper).&lt;br /&gt;
&lt;br /&gt;
Mags and ammo boxes can be put on the chest of the player to consolidate the ammo.&lt;br /&gt;
&lt;br /&gt;
An ammo count is displayed on the wrist.&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Limited Specific&lt;br /&gt;
|Players carry ammo boxes with a limited amount of ammo.&lt;br /&gt;
One box for each weapon.&lt;br /&gt;
&lt;br /&gt;
Mags and ammo boxes can be put on the chest of the player to consolidate the ammo.&lt;br /&gt;
&lt;br /&gt;
An ammo count is displayed on the wrist.&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Custom&lt;br /&gt;
|Allows for full control over ammo by the map.&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
| Limited Special&lt;br /&gt;
|'''All weapons except &amp;quot;special&amp;quot; weapons are unlimited, more clarification is needed.''' &lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Boxless&lt;br /&gt;
|'''Like limited generic but without boxes? Clarification is needed.'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Game Modes =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!GameMode &lt;br /&gt;
!Name&lt;br /&gt;
|-&lt;br /&gt;
|DM&lt;br /&gt;
|Death match&lt;br /&gt;
|-&lt;br /&gt;
|KOTH&lt;br /&gt;
|King of the hill&lt;br /&gt;
|-&lt;br /&gt;
|GUN&lt;br /&gt;
| Gun game&lt;br /&gt;
|-&lt;br /&gt;
|OITC&lt;br /&gt;
| One in the chamber&lt;br /&gt;
|-&lt;br /&gt;
|SND&lt;br /&gt;
|Search and destroy&lt;br /&gt;
|-&lt;br /&gt;
|TANKTDM&lt;br /&gt;
|WW2 Team Death Match&lt;br /&gt;
|-&lt;br /&gt;
| TDM&lt;br /&gt;
|Team Death Match&lt;br /&gt;
|-&lt;br /&gt;
|TTT&lt;br /&gt;
|Trouble in Terrorist Town&lt;br /&gt;
|-&lt;br /&gt;
|TTTclassic&lt;br /&gt;
|TTT with only innocent/traitor/detective&lt;br /&gt;
|-&lt;br /&gt;
|WW2GUN&lt;br /&gt;
|WW2 gun game&lt;br /&gt;
|-&lt;br /&gt;
|ZWV&lt;br /&gt;
| Zombie wave survival&lt;br /&gt;
|-&lt;br /&gt;
|HIDE&lt;br /&gt;
|The Hidden &lt;br /&gt;
|-&lt;br /&gt;
|INFECTION&lt;br /&gt;
|Hidden infection&lt;br /&gt;
|-&lt;br /&gt;
|PUSH&lt;br /&gt;
|Push&lt;br /&gt;
|-&lt;br /&gt;
|PH&lt;br /&gt;
|Prop hunt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Default Map ID's ====&lt;br /&gt;
datacenter &lt;br /&gt;
&lt;br /&gt;
sand&lt;br /&gt;
&lt;br /&gt;
bridge&lt;br /&gt;
&lt;br /&gt;
containeryard&lt;br /&gt;
&lt;br /&gt;
siberia (Prison Break)&lt;br /&gt;
&lt;br /&gt;
hospital (Zombies map)&lt;br /&gt;
&lt;br /&gt;
killhouse&lt;br /&gt;
&lt;br /&gt;
range&lt;br /&gt;
&lt;br /&gt;
tutorial&lt;br /&gt;
&lt;br /&gt;
santorini&lt;br /&gt;
&lt;br /&gt;
station&lt;br /&gt;
&lt;br /&gt;
industry&lt;br /&gt;
&lt;br /&gt;
ogcontainers (Shack only)&lt;br /&gt;
&lt;br /&gt;
haguenau (Shack only)&lt;br /&gt;
&lt;br /&gt;
foundation (Shack only)&lt;br /&gt;
&lt;br /&gt;
stalingrad (PC only)&lt;br /&gt;
&lt;br /&gt;
stalingrad_night (PC only)&lt;br /&gt;
&lt;br /&gt;
santorini_night (PC only)&lt;br /&gt;
&lt;br /&gt;
sand_night (PC only)&lt;br /&gt;
&lt;br /&gt;
station_night (PC only)&lt;br /&gt;
&lt;br /&gt;
industry_night (PC only)&lt;br /&gt;
&lt;br /&gt;
bunker (PC only)&lt;br /&gt;
&lt;br /&gt;
=== Server Administration ===&lt;br /&gt;
Installing the server is half the battle.&lt;br /&gt;
&lt;br /&gt;
==== Server Visibility ====&lt;br /&gt;
If you've followed this guide successfully to this point, you should have a running instance of pavlovserver. For your server to be visible to the Master List, and so that it can be joined by players, you will need to make sure the server has the ports forwarded.&lt;br /&gt;
&lt;br /&gt;
You can also check the server visibility using the vankrupt API, or on some publicly hosted game server lists, or by launching the game and just looking for your server in the game browser.&lt;br /&gt;
&lt;br /&gt;
===== Firewall/Port forwarding =====&lt;br /&gt;
Using the default settings there are two UDP ports (7777, 8177) that need to be allowed to access the server either by firewall setup or port forwarding. &lt;br /&gt;
&lt;br /&gt;
'''Ubuntu''' firewall commands to check firewall and open ports:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo ufw status&lt;br /&gt;
sudo ufw allow 7777&lt;br /&gt;
sudo ufw allow 8177&lt;br /&gt;
sudo ufw allow 9100&lt;br /&gt;
sudo ufw status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Rocky Linux''' firewall commands to check the firewall and open ports:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=7777/tcp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=7777/udp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=8177/tcp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=8177/udp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=9100/udp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=9100/tcp&lt;br /&gt;
sudo firewall-cmd --list-ports&lt;br /&gt;
firewall-cmd --runtime-to-permanent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may also need to allow Pings (ICMP) for the server's true latency to appear in the master list.&lt;br /&gt;
&lt;br /&gt;
If you are running multiple servers and have set additional ports (see http://pavlovwiki.com/index.php/Setting_up_a_dedicated_server#Running_multiple_servers_on_one_host) then you need to allow access to the defined port plus the port 400 higher. So if you use 7000 as your port, then UDP 7000 and 7400 need to be open&lt;br /&gt;
&lt;br /&gt;
Whilst on the topic of port forwarding, If you have setup '''rcon''' via RconSettings.txt (below) then that port also needs to be allowed access via TCP, if your RCON controller will be external to your server.&lt;br /&gt;
&lt;br /&gt;
If you are running Shack/Quest and want to have maps that are downloadable from your server, your server ports (ex. 7777 &amp;amp; 8177) must also be open via TCP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ipv6 is not planned to be supported. You can disable by doing the following command:&lt;br /&gt;
 sudo nano /etc/default/grub&lt;br /&gt;
And then edit the line below to GRUB_CMDLINE_LINUX_DEFAULT=”ipv6. disable=1″&lt;br /&gt;
&lt;br /&gt;
This makes sure ipv6 is disabled on operating system restart. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Shack Maps (Quest) ====&lt;br /&gt;
&lt;br /&gt;
Adding maps for the Shack version of Pavlov works differently to the steam version of the game, and you'll run into issues very quickly if you do not customise your server to accomodate this.&lt;br /&gt;
&lt;br /&gt;
This is because Shack has no affiliation with Steam, and therefore cannot use Steam Workshop maps like the above. In the future, these steps will apply to PC servers as well, allowing a server to hold the map itself, instead of offloading it to Steam.&lt;br /&gt;
&lt;br /&gt;
To get started, first, create the directory to hold the maps&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir -p /home/steam/pavlovserver/Pavlov/Saved/maps&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can use any number of methods to move the map files onto the server, but I'll go over the two simplest, starting with a GUI approach&lt;br /&gt;
&lt;br /&gt;
* Download and install Cyberduck onto your &amp;quot;home&amp;quot; PC (Whatever PC you use for access to the server, but not the server itself): https://cyberduck.io/&lt;br /&gt;
&lt;br /&gt;
* Next, download and unzip your map of choice&lt;br /&gt;
** You can get them from https://www.pavlovquest.com/ , https://pavlovhorde.com/mapsList, or look in #shack-map-showcase channel in the discord server.&lt;br /&gt;
** I'm going to use Cheeto's WW2 Items test (http://www.mediafire.com/file/emyt9bs1z9u9ykw/SVR_Cheeto_Items.zip/file ) for this example, you do what you like&lt;br /&gt;
&lt;br /&gt;
* In the top left corner, open a connection, set the connection type to SFTP, and fill in the rest of the information&lt;br /&gt;
** This will be the same credentials you've used to connect to the server via SSH this whole time. - the username is typically `root` for Debian or Rocky systems, but you could also use the &amp;quot;steam&amp;quot; user if you set that user up with a password or private key to allow SSH.&lt;br /&gt;
&lt;br /&gt;
* In the directory dropdown (it will say /root) navigate back to /&lt;br /&gt;
* Follow the directories until we arrive back at our &amp;quot;maps&amp;quot; folder&lt;br /&gt;
&amp;lt;pre&amp;gt;/home/steam/pavlovserver/Pavlov/Saved/maps&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Drag and drop the unzipped map folder into the main window, in this case itll be SVR_Cheeto_Items&lt;br /&gt;
* Hit Allow&lt;br /&gt;
** You'll now see a folder named SVR_Cheeto_Items, and within it should be nothing but 3 files. If there is another folder in it, move this folder to the maps directory, otherwise the server won't work. The 3 files (2 .PAK one .JSON) should be in home/steam/pavlovserver/Pavlov/Saved/maps/SVR_Cheeto_Items, no more, no less.&lt;br /&gt;
* Your map should now be ready to use, after you restart the game service (e.g. sudo systemctl restart pavlovserver.service).&lt;br /&gt;
&lt;br /&gt;
Pavlov Shack servers load maps when the pavlovserver starts up.&lt;br /&gt;
&lt;br /&gt;
'''YOU MUST RESTART THE GAME SERVER TO USE THE MAPS.'''&lt;br /&gt;
&lt;br /&gt;
To play the map, you can either use RCON switch map command, or to add the map to your server's automatic map rotation list, add the map's folder name to your Game.ini. This replaces the MapID section, so for our example, you would add the following line to your Game.ini above or below the other MapRotation lines: &lt;br /&gt;
&lt;br /&gt;
If you have any trouble with the map loading (typically, the game will load into datacentre if there are problems) you may need to check the permissions of the map files, to ensure they belong to the user/group &amp;quot;steam:steam&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MapRotation=(MapId=&amp;quot;SVR_Cheeto_Items&amp;quot;, GameMode=&amp;quot;TDM&amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And that's all! Disconnect CyberDuck from your server before playing, otherwise you'll have difficulty joining.&lt;br /&gt;
&lt;br /&gt;
-----------&lt;br /&gt;
&lt;br /&gt;
==== Adding Shack Maps over Command Line Interface ====&lt;br /&gt;
&lt;br /&gt;
A reminder that Pavlov Shack servers load maps when the pavlovserver starts up.&lt;br /&gt;
&lt;br /&gt;
'''YOU MUST RESTART THE GAME SERVER TO USE THE MAPS.'''&lt;br /&gt;
&lt;br /&gt;
This process is more complicated, but adding maps over the command line interface has its benefits&lt;br /&gt;
&lt;br /&gt;
First, log into the server, change to the steam user, and CD to the maps directory you made above&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo su steam&lt;br /&gt;
cd ~/pavlovserver/Pavlov/Saved/maps&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Download the map files from whatever you use to upload them. To do this, you can either use curl or wget&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;curl -O insertURLhere&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''If you download your map from Google Drive''', make sure that your .zip folder is shared with anyone.&lt;br /&gt;
&lt;br /&gt;
Then, get the file's URL from the shared link.&amp;lt;p&amp;gt;Example : ''&amp;lt;nowiki&amp;gt;https://drive.google.com/file/d/19bI8gUHaN5tUrDvnadAacUnchQf6_k/view&amp;lt;/nowiki&amp;gt;''&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;will be ''19bI8gUHaN5tUrDvnadAacUnchQf6_k''&amp;lt;/p&amp;gt;&lt;br /&gt;
Edit &amp;quot;fileId&amp;quot; and &amp;quot;fileName&amp;quot; before you execute the command. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fileId=19bI8gUHaN5tUrDvnadAacUnchQf6_k&lt;br /&gt;
fileName=SVR_USER_MAPNAME&lt;br /&gt;
curl -sc /tmp/cookie &amp;quot;https://drive.google.com/uc?export=download&amp;amp;id=${fileId}&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
code=&amp;quot;$(awk '/_warning_/ {print $NF}' /tmp/cookie)&amp;quot;  &lt;br /&gt;
curl -Lb /tmp/cookie &amp;quot;https://drive.google.com/uc?export=download&amp;amp;confirm=${code}&amp;amp;id=${fileId}&amp;quot; -o ${fileName} &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To keep with the Items example, we're downloading the file from a ZIP uploaded to discord:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;curl -O https://cdn.discordapp.com/attachments/744185280759857234/745027406695366788/SVR_Cheeto_Items.zip&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, unzip the file. If this next step errors out, saying the command is unknown, switch back to the root user (su root), and install unzip (sudo apt install unzip), then return to the steam user, and continue.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;unzip SVR_Cheeto_Items.zip&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now finish like before by adding the map to your Game.ini&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;nano /home/steam/pavlovserver/Pavlov/Saved/Config/LinuxServer/Game.ini&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MapRotation=(MapId=&amp;quot;SVR_Cheeto_Items&amp;quot;, GameMode=&amp;quot;TDM&amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Admin/Moderator list for Arctic-VR hosted servers (optional) ====&lt;br /&gt;
&lt;br /&gt;
The only working in-game admin menu is through Arctic VR server hosting (see below).  &lt;br /&gt;
&lt;br /&gt;
If you add moderators to your server, they will not be subject to vote kicks. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nano ~/pavlovserver/Pavlov/Saved/Config/mods.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example Mod List:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
76541198397498572 #Optional Comment: Player name&lt;br /&gt;
76541198397498573 #Some Other Player&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ArcticVR Admin Menu ====&lt;br /&gt;
&lt;br /&gt;
[[File:Arcticmenu.jpg|500px|link=https://www.arctic-vr.com/server-admin-menu]]&lt;br /&gt;
&lt;br /&gt;
Arctic-VR Offers an advanced In-Game Admin menu that is exclusive to their hosting service. Features include: &lt;br /&gt;
* Switch Maps+Modes&lt;br /&gt;
* Teleport Players to Players&lt;br /&gt;
* Change Player Skins&lt;br /&gt;
* Control Player Buying+Cash&lt;br /&gt;
* Spawn Items&lt;br /&gt;
* Clean up corpses + guns&lt;br /&gt;
* Spawn Bots&lt;br /&gt;
* Spawn Items for other players&lt;br /&gt;
* Control Teams + Balance/Shuffle Teams&lt;br /&gt;
* ResetSND&lt;br /&gt;
* And More&lt;br /&gt;
&lt;br /&gt;
You can read more about the ArcticVR admin menu on their website: https://www.arctic-vr.com/server-admin-menu&lt;br /&gt;
&lt;br /&gt;
==== Handy tools for finding steamIDs ==== &lt;br /&gt;
&lt;br /&gt;
Steam ID finder: https://steamidfinder.com/lookup/ or https://steamid.xyz/&lt;br /&gt;
&lt;br /&gt;
You want to enter in the steamID64 format. &lt;br /&gt;
&lt;br /&gt;
This tool can convert or lookup IDs:  https://steamid.io/&lt;br /&gt;
&lt;br /&gt;
If you are looking for a steamID of a player that has been on your server recently this is technique to find them:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep -i playername ~/pavlovserver/Pavlov/Saved/Logs/* | grep TicketValidation&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configure Rcon ====&lt;br /&gt;
To enable Rcon access create config file:&lt;br /&gt;
&amp;lt;pre&amp;gt; nano /home/steam/pavlovserver/Pavlov/Saved/Config/RconSettings.txt &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copy in the following text - change password, and if desired the port:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Password=ChangeThisPassword&lt;br /&gt;
Port=9100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You must specify a port for the Rcon server to use as well as a Password (use a different port per sever instance if running multiple server instances off the same hardware)&lt;br /&gt;
&lt;br /&gt;
==== Starting the server manually ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/pavlovserver &amp;amp;&amp;amp; ./PavlovServer.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That's it, your server will be automatically broadcast to the master server! :) &lt;br /&gt;
&lt;br /&gt;
Note that when you close your terminal, the server will go down. See the &amp;quot;supervisors&amp;quot; section below for how to prevent this. &lt;br /&gt;
&lt;br /&gt;
If you have followed the supervisor service-setup part of the guide, you can run pavlovserver as a service using systemctl. &lt;br /&gt;
&lt;br /&gt;
==== Seeing your server in a Master List ====&lt;br /&gt;
Two handy tools to determine quickly if your server is broadcasting are the [https://pavlovhorde.com/ Horde] (Shack) and [https://pavlovhorde.com/pcServers Horde] (PC version) public listings. &lt;br /&gt;
&lt;br /&gt;
If you're also handy with cURL, you can query the vankrupt game server listing directly, for Oculus/Shack servers, and PC servers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://prod-shack-pavlov-ms.vankrupt.net/servers/v2/list/1.0.17/oculus_app_id/0/0/0/all&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://prod-shack-pavlov-ms.vankrupt.net/servers/v2/list/1.0.17/oculus/0/0/0/all&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://prod-crossplay-pavlov-ms.vankrupt.net/servers/v2/list/1.0.17/steam/0/0/0/all&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where 1.0.17 is the version of the game. You can check the current version of the game your server is running by checking your log file (/home/steam/pavlovserver/Pavlov/Saved/Logs/Pavlov.log) and checking for the &amp;quot;version&amp;quot; line early in the startup of the log file.&lt;br /&gt;
&lt;br /&gt;
The endpoint also supports filtering - changing the '''/0/0/0''' in the URL will have the following effects:&lt;br /&gt;
&lt;br /&gt;
* /1/0/0/ hide empty servers&lt;br /&gt;
* /0/1/0/ hide full servers&lt;br /&gt;
* /0/0/1/ hide password protected servers&lt;br /&gt;
&lt;br /&gt;
You can also customize which gamemodes are shown by changing /all to /SND,TDM,DM,GUN,CUSTOM,ZWV,TTT,TTTCLASSIC,TANKTDM,WW2GUN,KOTH,OITC,HIDE,PH and removing what you don't want to view.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Supervising the server using systemd ===&lt;br /&gt;
&lt;br /&gt;
Running '''./PavlovServer.sh''' in your interactive shell is easy, but the server will shut down when you close your terminal. If you want to run the server in the background,&lt;br /&gt;
you'll want to run it under a supervisor. There are many options, ranging from the simple (nohup, screen or tmux), to the&lt;br /&gt;
more robust (supervisord, systemd).&lt;br /&gt;
&lt;br /&gt;
Systemd is running by default on Ubuntu Linux, so we'll use that here.&lt;br /&gt;
&lt;br /&gt;
To run the server as a systemd service, create the file '''/etc/systemd/system/pavlovserver.service''' (as root) by typing &lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
sudo nano /etc/systemd/system/pavlovserver.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copy the contents below into the file and save.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Pavlov VR dedicated server&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
WorkingDirectory=/home/steam/pavlovserver&lt;br /&gt;
ExecStart=/home/steam/pavlovserver/PavlovServer.sh&lt;br /&gt;
&lt;br /&gt;
RestartSec=1&lt;br /&gt;
Restart=always&lt;br /&gt;
User=steam&lt;br /&gt;
Group=steam&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy = multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you'd like your server to start as competitive without editing the game.ini, change the line &amp;quot;ExecStart=/home/steam/pavlovserver/PavlovServer.sh&amp;quot; to look like this below. Though it's much easier to just use the game.ini to enable competitive instead. &amp;lt;pre&amp;gt;ExecStart=/home/steam/pavlovserver/PavlovServer.sh -COMPETITIVE=1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Change the user or paths as appropriate. After saving the service file, to start, restart, stop, or monitor the server:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl start pavlovserver&lt;br /&gt;
sudo systemctl restart pavlovserver&lt;br /&gt;
sudo systemctl stop pavlovserver&lt;br /&gt;
sudo systemctl status pavlovserver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To view the logs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo journalctl -u pavlovserver&lt;br /&gt;
# to live-tail the logs&lt;br /&gt;
sudo journalctl -u pavlovserver -f&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want to run the pavlov server as soon as your server boots (e.g. a VPS you turn on and off), add pavlov as a startup service:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl enable pavlovserver&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Advanced Server Administration ==&lt;br /&gt;
&lt;br /&gt;
=== Running multiple servers on one host ===&lt;br /&gt;
&lt;br /&gt;
* Pavlovserver is functionally single-threaded (there are multiple threads, but the vast majority of work occurs in the primary one). Make sure you have # of pavlovservers + 1 CPU available. More CPUs= more servers. Faster CPU = more players.&lt;br /&gt;
* Make multiple server installs by defining a separate install dir for each server.&lt;br /&gt;
* Run each server with a unique port. eg: '''./PavlovServer.sh -PORT=&amp;quot;Desired Port&amp;quot;'''&lt;br /&gt;
* The Server will use the Desired Port and the Port 400 above (Example: You choose 8200 as Port. So Port 8600 will be used as well)&lt;br /&gt;
* If you are using RCON, each server will need a unique port defined in RconSettings.txt&lt;br /&gt;
* Ensure the ports are forwarded and opened in your firewall&lt;br /&gt;
&lt;br /&gt;
To duplicate directories:&lt;br /&gt;
&lt;br /&gt;
be in the steam home folder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp -r pavlovserver pavlovserver1&lt;br /&gt;
/home/steam/pavlovserver1/PavlovServer.sh -PORT=[Desired Port]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Starting server in competitive mode ===&lt;br /&gt;
Competitive mode will prevent dead teammates from being able to see the match, to prevent ghosting.&lt;br /&gt;
You can either enable this via Game.ini (described in Game.ini file), or using the -COMPETITIVE=1 parameter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/steam/pavlovserver1/PavlovServer.sh -COMPETITIVE=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Useful Linux Commands ===&lt;br /&gt;
List files / folders in directory, print current working directory, &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -la                                    #list files/directories along with authorities and ownership&lt;br /&gt;
pwd                                       #print working directory&lt;br /&gt;
sudo chown &amp;lt;owner&amp;gt; &amp;lt;file/directory&amp;gt;       #change owner of file/directory.  If root created something and you need to change it to steam&lt;br /&gt;
sudo chgrp &amp;lt;group&amp;gt; &amp;lt;file/directory&amp;gt;       #change group of file/directory.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Check if pavlov is running by checking process status.  If the only row you see is the grep command, pavlov server is not started.&lt;br /&gt;
&amp;lt;pre&amp;gt; ps -ef | grep pav &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sample output:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
steam      34044       1  0 16:52 ?        00:00:00 /bin/sh /home/steam/pavlovserver/PavlovServer.sh&lt;br /&gt;
steam      34066   34044 80 16:52 ?        00:00:04 /home/steam/pavlovserver/Pavlov/Binaries/Linux/PavlovServer&lt;br /&gt;
zombies+   34101   34013  0 16:52 pts/0    00:00:00 grep --color=auto pav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kill a process.  Note this command uses 34044, which is a process id from the command output above.&lt;br /&gt;
&amp;lt;pre&amp;gt; kill -9 34044           &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dump the log to the console so you can scroll through it:&lt;br /&gt;
&amp;lt;pre&amp;gt; cat /home/steam/pavlovserver/Pavlov/Saved/Logs/Pavlov.log &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Search the log for a string - replace my_string with case-sensitive string&lt;br /&gt;
&amp;lt;pre&amp;gt; cat /home/steam/pavlovserver/Pavlov/Saved/Logs/Pavlov.log | grep my_string &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Advanced Scripts For Server Management ==&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Auto-updating the server (PCVR only)''' ===&lt;br /&gt;
Assuming you have followed this guide and used the default paths, users, and install instructions, you can paste the following into your terminal to auto-update your Pavlov server:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; 'EOF' &amp;gt; $HOME/pavlov_daily_update_and_restart.sh&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
USER=&amp;quot;steam&amp;quot;&lt;br /&gt;
SERVICENAME=&amp;quot;pavlovserver.service&amp;quot;&lt;br /&gt;
INSTALLDIRNAME=&amp;quot;pavlovserver&amp;quot;&lt;br /&gt;
USERHOME=&amp;quot;/home/$USER&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;Beginning Pavlov VR update run on $(date)\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
systemctl stop &amp;quot;$SERVICENAME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
sudo -iu &amp;quot;$USER&amp;quot; &amp;quot;$USERHOME/Steam/steamcmd.sh&amp;quot; +login anonymous +force_install_dir &amp;quot;$USERHOME/$INSTALLDIRNAME&amp;quot; +app_update 622970 +exit&lt;br /&gt;
sudo -iu &amp;quot;$USER&amp;quot; &amp;quot;$USERHOME/Steam/steamcmd.sh&amp;quot; +login anonymous +app_update 1007 +quit&lt;br /&gt;
sudo -iu &amp;quot;$USER&amp;quot; cp &amp;quot;$USERHOME/Steam/steamapps/common/Steamworks SDK Redist/linux64/steamclient.so&amp;quot; &amp;quot;$USERHOME/.steam/sdk64/steamclient.so&amp;quot;&lt;br /&gt;
sudo -iu &amp;quot;$USER&amp;quot; cp &amp;quot;$USERHOME/Steam/steamapps/common/Steamworks SDK Redist/linux64/steamclient.so&amp;quot; &amp;quot;$USERHOME/pavlovserver/Pavlov/Binaries/Linux/steamclient.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
systemctl start &amp;quot;$SERVICENAME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;Ending Pavlov VR update run on $(date)\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
chmod +x $HOME/pavlov_daily_update_and_restart.sh&lt;br /&gt;
mkdir $HOME/pavlov_update_logs &amp;amp;&amp;amp; touch $HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log&lt;br /&gt;
CRONLINE=&amp;quot;00 2 * * * $HOME/pavlov_daily_update_and_restart.sh &amp;gt;&amp;gt;$HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log 2&amp;gt;&amp;amp;1&amp;quot;&lt;br /&gt;
(sudo crontab -u root -l; echo &amp;quot;$CRONLINE&amp;quot; ) | sudo crontab -u root -&lt;br /&gt;
unset CRONLINE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These commands will:&lt;br /&gt;
&lt;br /&gt;
1. Create a shell script in the &amp;quot;steam&amp;quot; user's home directory that automatically stops the Pavlov server, pulls any updates via steam, pull updates to the Steamworks SDK Redist, and copies the latest version of steamclient.so to the Pavlov server directory&lt;br /&gt;
&lt;br /&gt;
2. Make the shell script executable&lt;br /&gt;
&lt;br /&gt;
3. Create a new directory called &amp;quot;pavlov_update_logs&amp;quot; in the &amp;quot;steam&amp;quot; user's directory, and create a logfile inside that directory called &amp;quot;pavlov_daily_update_and_restart.sh.log&amp;quot;. You can check this logfile to see the output of the Pavlov and Steam SDK update commands.&lt;br /&gt;
&lt;br /&gt;
4. Create a crontab entry for the root user that runs this shell script automatically every day at 2:00AM local time&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you want to change the time that this script runs, edit the numbers &amp;quot;00 2&amp;quot; in the line that starts with &amp;quot;CRONLINE=&amp;quot;. In the example provided, 00 is the minutes column, and 2 is the hour column. For example, if you wanted the server to automatically update and restart at 4:17AM every day, change the line starting with &amp;quot;CRONLINE=&amp;quot; to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CRONLINE=&amp;quot;17 4 * * * $HOME/pavlov_daily_update_and_restart.sh &amp;gt;&amp;gt;$HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log 2&amp;gt;&amp;amp;1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the time is PM, use 24-hour time format, e.g. &amp;quot;32 18&amp;quot; for 6:32PM.&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
=== '''Save Logs for records and stats''' ===&lt;br /&gt;
this is an automated script that will on a timer save all the backups made by the server before they are purged by the game for admin records and starts collection&lt;br /&gt;
&lt;br /&gt;
https://github.com/JTWP-org/backUpLogs2&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Make an API request with Mod.io to get map picture and name''' ===&lt;br /&gt;
very basic script pass the script a map ID as an argument then it will give u the name and a thumbnail to use &lt;br /&gt;
&lt;br /&gt;
https://github.com/JTWP-org/mod.io-modcheck/tree/main&lt;br /&gt;
&lt;br /&gt;
=== '''Sharing Bans over gameserver on same machine''' ===&lt;br /&gt;
when you have a lot of servers keeping the bans synced can be a nightmare so using a symbolic link allows all the servers to use one file &lt;br /&gt;
&lt;br /&gt;
for this lets say I have pavlovserver000 and pavlovserver001 and they are located at /home/steam/pavlovserver000 and  /home/steam/pavlovserver001&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''step 1 will be to pick a blacklist to use as the new one and move it to a central location'' &lt;br /&gt;
 mkdir ~/shared ; mv /home/steam/pavlovserver000/Pavlov/Saved/Config/blacklist.txt ~/shared/blacklist.txt ; rm /home/steam/pavlovserver001/Pavlov/Saved/Config/blacklist.txt&lt;br /&gt;
now we have moved the blacklist from pavlovserver000 to a folder in our home called shared and then we removed the blacklist from pavlovserver001 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
step 2 making the links &lt;br /&gt;
 ln -s ~/shared/blacklist.txt /home/steam/pavlovserver000/Pavlov/Saved/Config/blacklist.txt ; ln -s ~/shared/blacklist.txt /home/steam/pavlovserver001/Pavlov/Saved/Config/blacklist.txt&lt;br /&gt;
now editing them in pavlovserver001's files will update the list for all of the servers it's not a sync its uses the same list if you want to check where a link is pointed if u &lt;br /&gt;
 ls -l&lt;br /&gt;
It will show where the file is really located &amp;lt;hr&amp;gt;&lt;br /&gt;
=== Interactive Update ALL ===&lt;br /&gt;
will find all server installs on machine and update them will update Ubuntu check what version and do correct updates for that version also UPDATE 29 PCVR STEP  then it will list each server by server name and ask what type it is and then it will update and move to the next&lt;br /&gt;
&lt;br /&gt;
https://github.com/JTWP-org/Pavlov-updateallservers/tree/main&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== getting map info with just the UGC ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
you will need to get a API key from mod.io for this ... running this bash script and passing a UGC number to it will return the map name  mod.io url and a thumbnail &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
HOW TO USE &amp;lt;pre&amp;gt;nano get-map.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
then enter this script &amp;lt;pre&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
ugc=000000&lt;br /&gt;
&lt;br /&gt;
gameID=3959 #PAVLOV IS 3959&lt;br /&gt;
&lt;br /&gt;
api-path=&amp;quot;https://u-*ID NUMBER*.modapi.io/v1&amp;quot; #get on thhe access tab in mod.io settings&lt;br /&gt;
&lt;br /&gt;
api-key=&amp;quot;&amp;quot; #get on thhe access tab in mod.io settings&lt;br /&gt;
&lt;br /&gt;
curl -X GET &amp;quot;${api-path}/v1/games/${gameID}/mods/$(&amp;quot;${ugc:3})?api_key=${api-key}&amp;quot;   -H 'Accept: application/json' | jq  '.logo.thumb_1280x720, .name , .profile_url&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then give script perms to run &amp;lt;pre&amp;gt;sudo chmod +x get-map.sh&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
and then run it like this &lt;br /&gt;
&amp;lt;pre&amp;gt;bash get-map.sh UGC3409480   &amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=File:Generateserverkey.png&amp;diff=1038</id>
		<title>File:Generateserverkey.png</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=File:Generateserverkey.png&amp;diff=1038"/>
		<updated>2024-12-03T16:23:24Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Generateserverkey&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1037</id>
		<title>Pavlov TV API</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1037"/>
		<updated>2024-12-03T16:19:19Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pavlov TV has exposed endpoints to allow users to create their own UI interface for use in steaming software such as OBS, data-sets, or any other purpose of your choosing from Pavlov replays.&lt;br /&gt;
&lt;br /&gt;
=== Enable the API ===&lt;br /&gt;
1. Ensure you have PavlovVR installed on steam and locate the GameUserSettings.ini file.&lt;br /&gt;
&lt;br /&gt;
This file on windows machines will usually be found at [ %localappdata%\Pavlov\Saved\Config\Windows\GameUserSettings.ini ] You can paste this into your file explorer(without the brackets [] ) to open the file. &lt;br /&gt;
&lt;br /&gt;
2. Go the the bottom portion of the [/Script/Pavlov.PavlovGameUserSettings] part of the file, ABOVE[ScalabilityGroups]. &lt;br /&gt;
&lt;br /&gt;
3. Add PavTVAPIPort=1234 onto the file at that location. 1234 is the port that will be used, if you know this port is in use already, please find another on your device that is not in use and list it here.&lt;br /&gt;
&lt;br /&gt;
4. Run PavTV&lt;br /&gt;
&lt;br /&gt;
=== Using OBS with your generated/written HTML file ===&lt;br /&gt;
1. Copy your HTML file path &lt;br /&gt;
&lt;br /&gt;
2. Go to “Sources” and click the “+” button &lt;br /&gt;
&lt;br /&gt;
3. Add browser source and create new (name it whatever) &lt;br /&gt;
&lt;br /&gt;
4. Adjust Resolution of the source(recording size) &lt;br /&gt;
&lt;br /&gt;
5. Paste in the HTML file path and click OK&lt;br /&gt;
&lt;br /&gt;
=== The GET Endpoints ===&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;If you are new to this, you are able to put any of these endpoint “links” into your browser or run curl requests and check that they are functional&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus''' &lt;br /&gt;
&lt;br /&gt;
Ex.in JS to fetch this endpoint on port 1234 const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;); const matchData = await response.json()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const matchData = await response.json();&amp;lt;/blockquote&amp;gt;'''Elements in MatchStatus'''&lt;br /&gt;
&lt;br /&gt;
MatchActive- Will return whether a match is currently ongoing or not &lt;br /&gt;
&lt;br /&gt;
''Ex. “MatchActive”: true or “MatchActive”: false''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RoundTime- Will return the active time into the round in seconds&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundTime&amp;quot;: 105''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Teams- Will return true/false if the there are teams in this match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Teams&amp;quot;: true''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RoundsLeft- Will return the maximum number of rounds left in the match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundsLeft&amp;quot;: 15''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Team0Score- Will return blue team’s score&lt;br /&gt;
&lt;br /&gt;
Team1Score- Will return red team’s score&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Score&amp;quot;: 1,''&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Team1Score&amp;quot;: 2,''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
AttackingTeamId- Will return the ID of the currently attacking team 0-blue, 1- red&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;AttackingTeamId&amp;quot;: 1''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Team0Cash- Will return blue team’s collective cash &lt;br /&gt;
&lt;br /&gt;
Team1Cash- Will return red team’s collective cash&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Cash&amp;quot;: 2500, &amp;quot;Team1Cash&amp;quot;: 2500''&lt;br /&gt;
MatchStatus.Team0 or MatchStatus.Team1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus.Team0 or MatchStatus.Team1'''&lt;br /&gt;
&lt;br /&gt;
''Ex.in JS to fetch Team0 from MatchStatus''&amp;lt;blockquote&amp;gt;const teamZero = matchData.Team0 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const teamOne = matchData.Team1&amp;lt;/blockquote&amp;gt;These will give you an array of JSON style objects&lt;br /&gt;
&lt;br /&gt;
CODE BLOCK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can then grab subsequent information from the teams like this&amp;lt;blockquote&amp;gt;matchData.Team0[0].Name&amp;lt;/blockquote&amp;gt;This would return the name in string form from the first player of Team0. You can do this with all of the information relating to the player, players are returned in order of score highest to lowest [as how it would show up in scoreboard]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== For the values in each player: ====&lt;br /&gt;
'''Name''' returns a &amp;lt;u&amp;gt;String&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Cash, Score, Kills, Deaths, Health,''' and '''Armor''' are all returning &amp;lt;u&amp;gt;Integer&amp;lt;/u&amp;gt; values&lt;br /&gt;
&lt;br /&gt;
'''Dead, Helmet,''' and '''Bot''' return &amp;lt;u&amp;gt;Bool&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''PrimaryWeapon, SecondaryWeapon,''' and '''Avatar''' all return &amp;lt;u&amp;gt;strings&amp;lt;/u&amp;gt; containing links to image files that can be used in your scoreboard.&lt;br /&gt;
&lt;br /&gt;
=== Killfeed GET Endpoint ===&lt;br /&gt;
Gives you a live killfeed of the match you are watching Ex. in Js of how you would get this endpoint as a Json object&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/Killfeed'&amp;lt;/nowiki&amp;gt;); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const killfeedData = await response.json();&amp;lt;/blockquote&amp;gt;Returns the most recent &lt;br /&gt;
&lt;br /&gt;
CODE BLOCK EXAMPLE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ex of how you would get any of the following for the first object in the killfeed&amp;lt;blockquote&amp;gt;killfeedData.killfeed[0].killer&amp;lt;/blockquote&amp;gt;'''Killer''' and '''Killed''' return &amp;lt;u&amp;gt;''String''&amp;lt;/u&amp;gt; objects of the killer and killed respectively&lt;br /&gt;
&lt;br /&gt;
'''Headshot''' returns whether the death was caused by a headshot, in the form of a &amp;lt;u&amp;gt;bool&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''EntryLifespan''' returns the time left counting down from 4 seconds in a &amp;lt;u&amp;gt;float/number&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''KilledBy''' returns the weaponId of the killing weapon in a ''string'' &lt;br /&gt;
&lt;br /&gt;
'''KillerTeam''' and '''KilledTeam''' returns either 0(blue) or 1(red) team of the Killer as an &amp;lt;u&amp;gt;Integer&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MatchEvents GET Endpoint ===&lt;br /&gt;
Gives you an event log for things like Win and Round, will list ALL events during the round if watching a replay, will list them as they happen if watching live&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchEvents'&amp;lt;/nowiki&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const eventData = await response.json();&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
EXAMPLE CODE BLOCK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Name''' gives the event name in a &amp;lt;u&amp;gt;string&amp;lt;/u&amp;gt; being either “Round”, “Win”, “Planted” &lt;br /&gt;
&lt;br /&gt;
'''Time''' gives the time in seconds in &amp;lt;u&amp;gt;integer&amp;lt;/u&amp;gt; form of the event going into the game [will list events from start to end]&lt;br /&gt;
&lt;br /&gt;
'''AdditionalData''' will be dependent for the event type&lt;br /&gt;
&lt;br /&gt;
-For a “Win” event 0 will represent Team0 victory, 1 will represent Team1 victory&lt;br /&gt;
&lt;br /&gt;
-For a “Round” event the number returned will represent what round it is &lt;br /&gt;
&lt;br /&gt;
-For a “Planted” event the number does not matter it will always be 0&lt;br /&gt;
&lt;br /&gt;
=== Camera Paths ===&lt;br /&gt;
Steps to Use: &lt;br /&gt;
&lt;br /&gt;
1. Go into a map and record a camera path for keys [1], [2], [3] , or [4], using LCtrl + [Key]  The path will be saved to the api endpoint located here:&amp;lt;blockquote&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:1234/Camera/Path/#&amp;lt;/nowiki&amp;gt; &amp;lt;/blockquote&amp;gt;'''NOTE''': Path values start at 0, so your [1] key will be Path 0, [2] is Path 1, [3] is Path 2, and [4] is Path 3. &lt;br /&gt;
&lt;br /&gt;
'''NOTE 2''': Camera paths are deleted in between matches so make sure to save them before exiting &lt;br /&gt;
&lt;br /&gt;
3. You can play the path with LShift + [Key]&lt;br /&gt;
&lt;br /&gt;
=== Camera Path GET Endpoint - Retrieve saved camera path ===&lt;br /&gt;
Javascript example of how to use it &lt;br /&gt;
&lt;br /&gt;
'''NOTE''': Replace the “#” with the number path corresponding above 0, 1, 2, 3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/Camera/Path/#'&amp;lt;/nowiki&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const cameraPath = await response.json();&amp;lt;/blockquote&amp;gt;Example of returned path with a single point&amp;lt;blockquote&amp;gt;{&amp;quot;MapName&amp;quot;:&amp;quot;Oilrig&amp;quot;,&amp;quot;PathNumber&amp;quot;:0,&amp;quot;Points&amp;quot;:[{&amp;quot;Time&amp;quot;:0,&amp;quot;X&amp;quot;:7453.70035785 53522,&amp;quot;Y&amp;quot;:4584.0434961287474,&amp;quot;Z&amp;quot;:1223.5857404802396,&amp;quot;Pitch&amp;quot;:-4.375000059 6046359,&amp;quot;Yaw&amp;quot;:-155.3252139880791,&amp;quot;Roll&amp;quot;:0}]}&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MapName''' gives you the name of the map of the current match you are in as a &amp;lt;u&amp;gt;string&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''PathNumber''' is the same as the path you put in to retrieve it as an &amp;lt;u&amp;gt;integer&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Time''' gives you the time in seconds as a &amp;lt;u&amp;gt;float&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''X,Y,Z''' give you the relative x-plane, y-plane, z-plane position each in &amp;lt;u&amp;gt;float&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Pitch, Roll, Yaw''' give you the orientation of the camera relative to the world normal, each in &amp;lt;u&amp;gt;float&amp;lt;/u&amp;gt;&lt;br /&gt;
[[File:Pitchrollyaw.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
===== Camera Play GET Endpoint - It will call your game to play the path currently in that slot =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ex. of fetching it in Js, since there is no response, you can just run fetch&amp;lt;blockquote&amp;gt;fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/Camera/Play/0'&amp;lt;/nowiki&amp;gt;)&amp;lt;/blockquote&amp;gt;This is the same principle as getting the path, though there will be no response to check it will just trigger immediately in your client and you will go along the active path bound to that key.&lt;br /&gt;
&lt;br /&gt;
==== Camera Path POST Endpoint - Insert your path into the live slot ====&lt;br /&gt;
Ex. of a javascript POST fetch request to the api&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch(`localhost:1234/Camera/Path/1`, {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
headers: {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Content-Type&amp;quot;: &amp;quot;application/json&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
body: JSON.stringify(data),&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
});&amp;lt;/blockquote&amp;gt;Notes: MapName and PathNumber do '''NOT''' matter in terms of POST-ing a path, so you do not have to modify those at all. The only thing that really matters is the points. It is recommended to store paths in json files for modification and accessibility ease.&lt;br /&gt;
&lt;br /&gt;
'''GET &amp;lt;code&amp;gt;/Pause&amp;lt;/code&amp;gt; returns'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;Paused&amp;quot;: true&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST &amp;lt;code&amp;gt;/Pause&amp;lt;/code&amp;gt;''' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;Paused&amp;quot;: false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
returns&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;Successful&amp;quot;: true&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if successful returns false it will also include a string field &amp;lt;code&amp;gt;Reason&amp;lt;/code&amp;gt; explaining why it failed &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET &amp;lt;code&amp;gt;/MatchTime&amp;lt;/code&amp;gt;''' &lt;br /&gt;
&lt;br /&gt;
returns&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;MatchTime&amp;quot;: 19.035182&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''POST &amp;lt;code&amp;gt;/MatchTime&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
returns&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;MatchTime&amp;quot;: 120.5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if successful returns false it will also include a string field &amp;lt;code&amp;gt;Reason&amp;lt;/code&amp;gt; explaining why it failed GET &amp;lt;code&amp;gt;/ReplayList&amp;lt;/code&amp;gt; returns&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;    &amp;quot;Replays&amp;quot;: [&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;        {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Id&amp;quot;: &amp;quot;Sand-DM-2024.11.15-01.44.05&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Name&amp;quot;: &amp;quot;Sand&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;GameMode&amp;quot;: &amp;quot;DM&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Timestamp&amp;quot;: &amp;quot;2024-11-15T01:44:05.687Z&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Shack&amp;quot;: true,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;LocalReplay&amp;quot;: true,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Live&amp;quot;: false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;        },&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;        {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Id&amp;quot;: &amp;quot;ac8d018f56f3f820033d319af942be3e&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Name&amp;quot;: &amp;quot;Sand&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;GameMode&amp;quot;: &amp;quot;DM&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Timestamp&amp;quot;: &amp;quot;2024-11-27T08:28:37.362Z&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Shack&amp;quot;: false,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;LocalReplay&amp;quot;: false,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Live&amp;quot;: false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;        }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  ]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''POST &amp;lt;code&amp;gt;/LoadReplay&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;    &amp;quot;Id&amp;quot;: &amp;quot;ac8d018f56f3f820033d319af942be3e&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;    &amp;quot;Successful&amp;quot;: true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;/PlayerPos&amp;lt;/code&amp;gt; endpoint to include these fields in SND if the bomb is available. Bomb States (0 = dropped, 1 = carried, 2 = planted)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;BombX&amp;quot;: -3479.5815804967287,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;BombY&amp;quot;: -144.55990951728171,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;BombZ&amp;quot;: -262.77667585565382,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;BombState&amp;quot;: 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Possible issues you may encounter ===&lt;br /&gt;
'''TypeError: fetch failed - cause: Error: connect ECONNREFUSED:'''&lt;br /&gt;
&lt;br /&gt;
This error happens because you are likely running your javascript function with nodejs or the like and it is trying to force ipv6, ensure it does ipv4 by changing “localhost” to “127.0.0.1”. When pulling from the web source it will not matter since it understands the difference. Newer versions of NodeJS should not have this problem and be able to determine between ipv4 and ipv6. (Version 19.3 or higher)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refused to connect'''&lt;br /&gt;
&lt;br /&gt;
If “http:localhost:1234” does not show anything or “refused to connect” the service is not running on this port and you will need to try to set up the API again. Ensure you have PavTVAPIPort=1234 inside of your gameusersettings.ini&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1036</id>
		<title>Pavlov TV API</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1036"/>
		<updated>2024-12-03T16:18:18Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pavlov TV has exposed endpoints to allow users to create their own UI interface for use in steaming software such as OBS, data-sets, or any other purpose of your choosing from Pavlov replays.&lt;br /&gt;
&lt;br /&gt;
=== Enable the API ===&lt;br /&gt;
1. Ensure you have PavlovVR installed on steam and locate the GameUserSettings.ini file.&lt;br /&gt;
&lt;br /&gt;
This file on windows machines will usually be found at [ %localappdata%\Pavlov\Saved\Config\Windows\GameUserSettings.ini ] You can paste this into your file explorer(without the brackets [] ) to open the file. &lt;br /&gt;
&lt;br /&gt;
2. Go the the bottom portion of the [/Script/Pavlov.PavlovGameUserSettings] part of the file, ABOVE[ScalabilityGroups]. &lt;br /&gt;
&lt;br /&gt;
3. Add PavTVAPIPort=1234 onto the file at that location. 1234 is the port that will be used, if you know this port is in use already, please find another on your device that is not in use and list it here.&lt;br /&gt;
&lt;br /&gt;
4. Run PavTV&lt;br /&gt;
&lt;br /&gt;
=== Using OBS with your generated/written HTML file ===&lt;br /&gt;
1. Copy your HTML file path &lt;br /&gt;
&lt;br /&gt;
2. Go to “Sources” and click the “+” button &lt;br /&gt;
&lt;br /&gt;
3. Add browser source and create new (name it whatever) &lt;br /&gt;
&lt;br /&gt;
4. Adjust Resolution of the source(recording size) &lt;br /&gt;
&lt;br /&gt;
5. Paste in the HTML file path and click OK&lt;br /&gt;
&lt;br /&gt;
=== The GET Endpoints ===&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;If you are new to this, you are able to put any of these endpoint “links” into your browser or run curl requests and check that they are functional&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus''' &lt;br /&gt;
&lt;br /&gt;
Ex.in JS to fetch this endpoint on port 1234 const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;); const matchData = await response.json()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const matchData = await response.json();&amp;lt;/blockquote&amp;gt;'''Elements in MatchStatus'''&lt;br /&gt;
&lt;br /&gt;
MatchActive- Will return whether a match is currently ongoing or not &lt;br /&gt;
&lt;br /&gt;
''Ex. “MatchActive”: true or “MatchActive”: false''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RoundTime- Will return the active time into the round in seconds&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundTime&amp;quot;: 105''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Teams- Will return true/false if the there are teams in this match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Teams&amp;quot;: true''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RoundsLeft- Will return the maximum number of rounds left in the match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundsLeft&amp;quot;: 15''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Team0Score- Will return blue team’s score&lt;br /&gt;
&lt;br /&gt;
Team1Score- Will return red team’s score&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Score&amp;quot;: 1,''&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Team1Score&amp;quot;: 2,''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
AttackingTeamId- Will return the ID of the currently attacking team 0-blue, 1- red&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;AttackingTeamId&amp;quot;: 1''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Team0Cash- Will return blue team’s collective cash &lt;br /&gt;
&lt;br /&gt;
Team1Cash- Will return red team’s collective cash&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Cash&amp;quot;: 2500, &amp;quot;Team1Cash&amp;quot;: 2500''&lt;br /&gt;
MatchStatus.Team0 or MatchStatus.Team1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus.Team0 or MatchStatus.Team1'''&lt;br /&gt;
&lt;br /&gt;
''Ex.in JS to fetch Team0 from MatchStatus''&amp;lt;blockquote&amp;gt;const teamZero = matchData.Team0 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const teamOne = matchData.Team1&amp;lt;/blockquote&amp;gt;These will give you an array of JSON style objects&lt;br /&gt;
&lt;br /&gt;
CODE BLOCK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can then grab subsequent information from the teams like this&amp;lt;blockquote&amp;gt;matchData.Team0[0].Name&amp;lt;/blockquote&amp;gt;This would return the name in string form from the first player of Team0. You can do this with all of the information relating to the player, players are returned in order of score highest to lowest [as how it would show up in scoreboard]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== For the values in each player: ====&lt;br /&gt;
'''Name''' returns a &amp;lt;u&amp;gt;String&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Cash, Score, Kills, Deaths, Health,''' and '''Armor''' are all returning &amp;lt;u&amp;gt;Integer&amp;lt;/u&amp;gt; values&lt;br /&gt;
&lt;br /&gt;
'''Dead, Helmet,''' and '''Bot''' return &amp;lt;u&amp;gt;Bool&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''PrimaryWeapon, SecondaryWeapon,''' and '''Avatar''' all return &amp;lt;u&amp;gt;strings&amp;lt;/u&amp;gt; containing links to image files that can be used in your scoreboard.&lt;br /&gt;
&lt;br /&gt;
=== Killfeed GET Endpoint ===&lt;br /&gt;
Gives you a live killfeed of the match you are watching Ex. in Js of how you would get this endpoint as a Json object&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/Killfeed'&amp;lt;/nowiki&amp;gt;); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const killfeedData = await response.json();&amp;lt;/blockquote&amp;gt;Returns the most recent &lt;br /&gt;
&lt;br /&gt;
CODE BLOCK EXAMPLE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ex of how you would get any of the following for the first object in the killfeed&amp;lt;blockquote&amp;gt;killfeedData.killfeed[0].killer&amp;lt;/blockquote&amp;gt;'''Killer''' and '''Killed''' return &amp;lt;u&amp;gt;''String''&amp;lt;/u&amp;gt; objects of the killer and killed respectively&lt;br /&gt;
&lt;br /&gt;
'''Headshot''' returns whether the death was caused by a headshot, in the form of a &amp;lt;u&amp;gt;bool&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''EntryLifespan''' returns the time left counting down from 4 seconds in a &amp;lt;u&amp;gt;float/number&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''KilledBy''' returns the weaponId of the killing weapon in a ''string'' &lt;br /&gt;
&lt;br /&gt;
'''KillerTeam''' and '''KilledTeam''' returns either 0(blue) or 1(red) team of the Killer as an &amp;lt;u&amp;gt;Integer&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MatchEvents GET Endpoint ===&lt;br /&gt;
Gives you an event log for things like Win and Round, will list ALL events during the round if watching a replay, will list them as they happen if watching live&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchEvents'&amp;lt;/nowiki&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const eventData = await response.json();&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
EXAMPLE CODE BLOCK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Name''' gives the event name in a &amp;lt;u&amp;gt;string&amp;lt;/u&amp;gt; being either “Round”, “Win”, “Planted” &lt;br /&gt;
&lt;br /&gt;
'''Time''' gives the time in seconds in &amp;lt;u&amp;gt;integer&amp;lt;/u&amp;gt; form of the event going into the game [will list events from start to end]&lt;br /&gt;
&lt;br /&gt;
'''AdditionalData''' will be dependent for the event type&lt;br /&gt;
&lt;br /&gt;
-For a “Win” event 0 will represent Team0 victory, 1 will represent Team1 victory&lt;br /&gt;
&lt;br /&gt;
-For a “Round” event the number returned will represent what round it is &lt;br /&gt;
&lt;br /&gt;
-For a “Planted” event the number does not matter it will always be 0&lt;br /&gt;
&lt;br /&gt;
=== Camera Paths ===&lt;br /&gt;
Steps to Use: &lt;br /&gt;
&lt;br /&gt;
1. Go into a map and record a camera path for keys [1], [2], [3] , or [4], using LCtrl + [Key]  The path will be saved to the api endpoint located here:&amp;lt;blockquote&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:1234/Camera/Path/#&amp;lt;/nowiki&amp;gt; &amp;lt;/blockquote&amp;gt;'''NOTE''': Path values start at 0, so your [1] key will be Path 0, [2] is Path 1, [3] is Path 2, and [4] is Path 3. &lt;br /&gt;
&lt;br /&gt;
'''NOTE 2''': Camera paths are deleted in between matches so make sure to save them before exiting &lt;br /&gt;
&lt;br /&gt;
3. You can play the path with LShift + [Key]&lt;br /&gt;
&lt;br /&gt;
=== Camera Path GET Endpoint - Retrieve saved camera path ===&lt;br /&gt;
Javascript example of how to use it &lt;br /&gt;
&lt;br /&gt;
'''NOTE''': Replace the “#” with the number path corresponding above 0, 1, 2, 3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/Camera/Path/#'&amp;lt;/nowiki&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const cameraPath = await response.json();&amp;lt;/blockquote&amp;gt;Example of returned path with a single point&amp;lt;blockquote&amp;gt;{&amp;quot;MapName&amp;quot;:&amp;quot;Oilrig&amp;quot;,&amp;quot;PathNumber&amp;quot;:0,&amp;quot;Points&amp;quot;:[{&amp;quot;Time&amp;quot;:0,&amp;quot;X&amp;quot;:7453.70035785 53522,&amp;quot;Y&amp;quot;:4584.0434961287474,&amp;quot;Z&amp;quot;:1223.5857404802396,&amp;quot;Pitch&amp;quot;:-4.375000059 6046359,&amp;quot;Yaw&amp;quot;:-155.3252139880791,&amp;quot;Roll&amp;quot;:0}]}&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MapName''' gives you the name of the map of the current match you are in as a &amp;lt;u&amp;gt;string&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''PathNumber''' is the same as the path you put in to retrieve it as an &amp;lt;u&amp;gt;integer&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Time''' gives you the time in seconds as a &amp;lt;u&amp;gt;float&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''X,Y,Z''' give you the relative x-plane, y-plane, z-plane position each in &amp;lt;u&amp;gt;float&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Pitch, Roll, Yaw''' give you the orientation of the camera relative to the world normal, each in &amp;lt;u&amp;gt;float&amp;lt;/u&amp;gt;&lt;br /&gt;
[[File:Pitchrollyaw.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
===== Camera Play GET Endpoint - It will call your game to play the path currently in that slot =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ex. of fetching it in Js, since there is no response, you can just run fetch&amp;lt;blockquote&amp;gt;fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/Camera/Play/0'&amp;lt;/nowiki&amp;gt;)&amp;lt;/blockquote&amp;gt;This is the same principle as getting the path, though there will be no response to check it will just trigger immediately in your client and you will go along the active path bound to that key.&lt;br /&gt;
&lt;br /&gt;
==== Camera Path POST Endpoint - Insert your path into the live slot ====&lt;br /&gt;
Ex. of a javascript POST fetch request to the api&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch(`localhost:1234/Camera/Path/1`, {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
headers: {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Content-Type&amp;quot;: &amp;quot;application/json&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
body: JSON.stringify(data),&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
});&amp;lt;/blockquote&amp;gt;Notes: MapName and PathNumber do '''NOT''' matter in terms of POST-ing a path, so you do not have to modify those at all. The only thing that really matters is the points. It is recommended to store paths in json files for modification and accessibility ease.&lt;br /&gt;
&lt;br /&gt;
'''GET &amp;lt;code&amp;gt;/Pause&amp;lt;/code&amp;gt; returns'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;Paused&amp;quot;: true&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST &amp;lt;code&amp;gt;/Pause&amp;lt;/code&amp;gt;''' &lt;br /&gt;
&lt;br /&gt;
'''Body:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;Paused&amp;quot;: false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
returns&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;Successful&amp;quot;: true&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if successful returns false it will also include a string field &amp;lt;code&amp;gt;Reason&amp;lt;/code&amp;gt; explaining why it failed &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GET &amp;lt;code&amp;gt;/MatchTime&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
returns&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;MatchTime&amp;quot;: 19.035182&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/MatchTime&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
returns&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;MatchTime&amp;quot;: 120.5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if successful returns false it will also include a string field &amp;lt;code&amp;gt;Reason&amp;lt;/code&amp;gt; explaining why it failed GET &amp;lt;code&amp;gt;/ReplayList&amp;lt;/code&amp;gt; returns&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;    &amp;quot;Replays&amp;quot;: [&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;        {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Id&amp;quot;: &amp;quot;Sand-DM-2024.11.15-01.44.05&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Name&amp;quot;: &amp;quot;Sand&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;GameMode&amp;quot;: &amp;quot;DM&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Timestamp&amp;quot;: &amp;quot;2024-11-15T01:44:05.687Z&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Shack&amp;quot;: true,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;LocalReplay&amp;quot;: true,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Live&amp;quot;: false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;        },&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;        {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Id&amp;quot;: &amp;quot;ac8d018f56f3f820033d319af942be3e&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Name&amp;quot;: &amp;quot;Sand&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;GameMode&amp;quot;: &amp;quot;DM&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Timestamp&amp;quot;: &amp;quot;2024-11-27T08:28:37.362Z&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Shack&amp;quot;: false,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;LocalReplay&amp;quot;: false,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;            &amp;quot;Live&amp;quot;: false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;        }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  ]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
POST &amp;lt;code&amp;gt;/LoadReplay&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;    &amp;quot;Id&amp;quot;: &amp;quot;ac8d018f56f3f820033d319af942be3e&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;    &amp;quot;Successful&amp;quot;: true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/PlayerPos&amp;lt;/code&amp;gt; endpoint to include these fields in SND if the bomb is available. Bomb States (0 = dropped, 1 = carried, 2 = planted)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;BombX&amp;quot;: -3479.5815804967287,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;BombY&amp;quot;: -144.55990951728171,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;BombZ&amp;quot;: -262.77667585565382,&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;BombState&amp;quot;: 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Possible issues you may encounter ===&lt;br /&gt;
'''TypeError: fetch failed - cause: Error: connect ECONNREFUSED:'''&lt;br /&gt;
&lt;br /&gt;
This error happens because you are likely running your javascript function with nodejs or the like and it is trying to force ipv6, ensure it does ipv4 by changing “localhost” to “127.0.0.1”. When pulling from the web source it will not matter since it understands the difference. Newer versions of NodeJS should not have this problem and be able to determine between ipv4 and ipv6. (Version 19.3 or higher)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Refused to connect'''&lt;br /&gt;
&lt;br /&gt;
If “http:localhost:1234” does not show anything or “refused to connect” the service is not running on this port and you will need to try to set up the API again. Ensure you have PavTVAPIPort=1234 inside of your gameusersettings.ini&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=File:Pitchrollyaw.png&amp;diff=1035</id>
		<title>File:Pitchrollyaw.png</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=File:Pitchrollyaw.png&amp;diff=1035"/>
		<updated>2024-12-03T16:05:30Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;pitchrollyaw&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1034</id>
		<title>Pavlov TV API</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1034"/>
		<updated>2024-12-03T15:49:07Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pavlov TV has exposed endpoints to allow users to create their own UI interface for use in steaming software such as OBS, data-sets, or any other purpose of your choosing from Pavlov replays.&lt;br /&gt;
&lt;br /&gt;
=== Enable the API ===&lt;br /&gt;
1. Ensure you have PavlovVR installed on steam and locate the GameUserSettings.ini file.&lt;br /&gt;
&lt;br /&gt;
This file on windows machines will usually be found at [ %localappdata%\Pavlov\Saved\Config\Windows\GameUserSettings.ini ] You can paste this into your file explorer(without the brackets [] ) to open the file. &lt;br /&gt;
&lt;br /&gt;
2. Go the the bottom portion of the [/Script/Pavlov.PavlovGameUserSettings] part of the file, ABOVE[ScalabilityGroups]. &lt;br /&gt;
&lt;br /&gt;
3. Add PavTVAPIPort=1234 onto the file at that location. 1234 is the port that will be used, if you know this port is in use already, please find another on your device that is not in use and list it here.&lt;br /&gt;
&lt;br /&gt;
4. Run PavTV&lt;br /&gt;
&lt;br /&gt;
=== Using OBS with your generated/written HTML file ===&lt;br /&gt;
1. Copy your HTML file path &lt;br /&gt;
&lt;br /&gt;
2. Go to “Sources” and click the “+” button &lt;br /&gt;
&lt;br /&gt;
3. Add browser source and create new (name it whatever) &lt;br /&gt;
&lt;br /&gt;
4. Adjust Resolution of the source(recording size) &lt;br /&gt;
&lt;br /&gt;
5. Paste in the HTML file path and click OK&lt;br /&gt;
&lt;br /&gt;
=== The GET Endpoints ===&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;If you are new to this, you are able to put any of these endpoint “links” into your browser or run curl requests and check that they are functional&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus''' &lt;br /&gt;
&lt;br /&gt;
Ex.in JS to fetch this endpoint on port 1234 const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;); const matchData = await response.json()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const matchData = await response.json();&amp;lt;/blockquote&amp;gt;'''Elements in MatchStatus'''&lt;br /&gt;
&lt;br /&gt;
MatchActive- Will return whether a match is currently ongoing or not &lt;br /&gt;
&lt;br /&gt;
''Ex. “MatchActive”: true or “MatchActive”: false''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RoundTime- Will return the active time into the round in seconds&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundTime&amp;quot;: 105''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Teams- Will return true/false if the there are teams in this match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Teams&amp;quot;: true''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RoundsLeft- Will return the maximum number of rounds left in the match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundsLeft&amp;quot;: 15''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Team0Score- Will return blue team’s score&lt;br /&gt;
&lt;br /&gt;
Team1Score- Will return red team’s score&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Score&amp;quot;: 1,''&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Team1Score&amp;quot;: 2,''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
AttackingTeamId- Will return the ID of the currently attacking team 0-blue, 1- red&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;AttackingTeamId&amp;quot;: 1''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Team0Cash- Will return blue team’s collective cash &lt;br /&gt;
&lt;br /&gt;
Team1Cash- Will return red team’s collective cash&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Cash&amp;quot;: 2500, &amp;quot;Team1Cash&amp;quot;: 2500''&lt;br /&gt;
MatchStatus.Team0 or MatchStatus.Team1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus.Team0 or MatchStatus.Team1'''&lt;br /&gt;
&lt;br /&gt;
''Ex.in JS to fetch Team0 from MatchStatus''&amp;lt;blockquote&amp;gt;const teamZero = matchData.Team0 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const teamOne = matchData.Team1&amp;lt;/blockquote&amp;gt;These will give you an array of JSON style objects&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1033</id>
		<title>Pavlov TV API</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1033"/>
		<updated>2024-12-03T15:48:55Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pavlov TV has exposed endpoints to allow users to create their own UI interface for use in steaming software such as OBS, data-sets, or any other purpose of your choosing from Pavlov replays.&lt;br /&gt;
&lt;br /&gt;
=== Enable the API ===&lt;br /&gt;
1. Ensure you have PavlovVR installed on steam and locate the GameUserSettings.ini file.&lt;br /&gt;
&lt;br /&gt;
This file on windows machines will usually be found at [ %localappdata%\Pavlov\Saved\Config\Windows\GameUserSettings.ini ] You can paste this into your file explorer(without the brackets [] ) to open the file. &lt;br /&gt;
&lt;br /&gt;
2. Go the the bottom portion of the [/Script/Pavlov.PavlovGameUserSettings] part of the file, ABOVE[ScalabilityGroups]. &lt;br /&gt;
&lt;br /&gt;
3. Add PavTVAPIPort=1234 onto the file at that location. 1234 is the port that will be used, if you know this port is in use already, please find another on your device that is not in use and list it here.&lt;br /&gt;
&lt;br /&gt;
4. Run PavTV&lt;br /&gt;
&lt;br /&gt;
=== Using OBS with your generated/written HTML file ===&lt;br /&gt;
1. Copy your HTML file path &lt;br /&gt;
&lt;br /&gt;
2. Go to “Sources” and click the “+” button &lt;br /&gt;
&lt;br /&gt;
3. Add browser source and create new (name it whatever) &lt;br /&gt;
&lt;br /&gt;
4. Adjust Resolution of the source(recording size) &lt;br /&gt;
&lt;br /&gt;
5. Paste in the HTML file path and click OK&lt;br /&gt;
&lt;br /&gt;
=== The GET Endpoints ===&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;If you are new to this, you are able to put any of these endpoint “links” into your browser or run curl requests and check that they are functional&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus''' &lt;br /&gt;
&lt;br /&gt;
Ex.in JS to fetch this endpoint on port 1234 const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;); const matchData = await response.json()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;);&lt;br /&gt;
const matchData = await response.json();&amp;lt;/blockquote&amp;gt;'''Elements in MatchStatus'''&lt;br /&gt;
&lt;br /&gt;
MatchActive- Will return whether a match is currently ongoing or not &lt;br /&gt;
&lt;br /&gt;
''Ex. “MatchActive”: true or “MatchActive”: false''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RoundTime- Will return the active time into the round in seconds&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundTime&amp;quot;: 105''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Teams- Will return true/false if the there are teams in this match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Teams&amp;quot;: true''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RoundsLeft- Will return the maximum number of rounds left in the match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundsLeft&amp;quot;: 15''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Team0Score- Will return blue team’s score&lt;br /&gt;
&lt;br /&gt;
Team1Score- Will return red team’s score&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Score&amp;quot;: 1,''&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Team1Score&amp;quot;: 2,''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
AttackingTeamId- Will return the ID of the currently attacking team 0-blue, 1- red&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;AttackingTeamId&amp;quot;: 1''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Team0Cash- Will return blue team’s collective cash &lt;br /&gt;
&lt;br /&gt;
Team1Cash- Will return red team’s collective cash&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Cash&amp;quot;: 2500, &amp;quot;Team1Cash&amp;quot;: 2500''&lt;br /&gt;
MatchStatus.Team0 or MatchStatus.Team1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus.Team0 or MatchStatus.Team1'''&lt;br /&gt;
&lt;br /&gt;
''Ex.in JS to fetch Team0 from MatchStatus''&amp;lt;blockquote&amp;gt;const teamZero = matchData.Team0 &lt;br /&gt;
const teamOne = matchData.Team1&amp;lt;/blockquote&amp;gt;These will give you an array of JSON style objects&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1032</id>
		<title>Pavlov TV API</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1032"/>
		<updated>2024-12-03T15:48:31Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pavlov TV has exposed endpoints to allow users to create their own UI interface for use in steaming software such as OBS, data-sets, or any other purpose of your choosing from Pavlov replays.&lt;br /&gt;
&lt;br /&gt;
=== Enable the API ===&lt;br /&gt;
1. Ensure you have PavlovVR installed on steam and locate the GameUserSettings.ini file.&lt;br /&gt;
&lt;br /&gt;
This file on windows machines will usually be found at [ %localappdata%\Pavlov\Saved\Config\Windows\GameUserSettings.ini ] You can paste this into your file explorer(without the brackets [] ) to open the file. &lt;br /&gt;
&lt;br /&gt;
2. Go the the bottom portion of the [/Script/Pavlov.PavlovGameUserSettings] part of the file, ABOVE[ScalabilityGroups]. &lt;br /&gt;
&lt;br /&gt;
3. Add PavTVAPIPort=1234 onto the file at that location. 1234 is the port that will be used, if you know this port is in use already, please find another on your device that is not in use and list it here.&lt;br /&gt;
&lt;br /&gt;
4. Run PavTV&lt;br /&gt;
&lt;br /&gt;
=== Using OBS with your generated/written HTML file ===&lt;br /&gt;
1. Copy your HTML file path &lt;br /&gt;
&lt;br /&gt;
2. Go to “Sources” and click the “+” button &lt;br /&gt;
&lt;br /&gt;
3. Add browser source and create new (name it whatever) &lt;br /&gt;
&lt;br /&gt;
4. Adjust Resolution of the source(recording size) &lt;br /&gt;
&lt;br /&gt;
5. Paste in the HTML file path and click OK&lt;br /&gt;
&lt;br /&gt;
=== The GET Endpoints ===&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;If you are new to this, you are able to put any of these endpoint “links” into your browser or run curl requests and check that they are functional&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus''' &lt;br /&gt;
&lt;br /&gt;
Ex.in JS to fetch this endpoint on port 1234 const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;); const matchData = await response.json()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const matchData = await response.json();&amp;lt;/blockquote&amp;gt;'''Elements in MatchStatus'''&lt;br /&gt;
&lt;br /&gt;
MatchActive- Will return whether a match is currently ongoing or not &lt;br /&gt;
&lt;br /&gt;
''Ex. “MatchActive”: true or “MatchActive”: false''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RoundTime- Will return the active time into the round in seconds&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundTime&amp;quot;: 105''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Teams- Will return true/false if the there are teams in this match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Teams&amp;quot;: true''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RoundsLeft- Will return the maximum number of rounds left in the match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundsLeft&amp;quot;: 15''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Team0Score- Will return blue team’s score&lt;br /&gt;
&lt;br /&gt;
Team1Score- Will return red team’s score&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Score&amp;quot;: 1,''&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Team1Score&amp;quot;: 2,''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
AttackingTeamId- Will return the ID of the currently attacking team 0-blue, 1- red&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;AttackingTeamId&amp;quot;: 1''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Team0Cash- Will return blue team’s collective cash &lt;br /&gt;
&lt;br /&gt;
Team1Cash- Will return red team’s collective cash&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Cash&amp;quot;: 2500, &amp;quot;Team1Cash&amp;quot;: 2500''&lt;br /&gt;
MatchStatus.Team0 or MatchStatus.Team1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus.Team0 or MatchStatus.Team1'''&lt;br /&gt;
&lt;br /&gt;
''Ex.in JS to fetch Team0 from MatchStatus''&amp;lt;blockquote&amp;gt;const teamZero = matchData.Team0 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const teamOne = matchData.Team1&amp;lt;/blockquote&amp;gt;These will give you an array of JSON style objects&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1031</id>
		<title>Pavlov TV API</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1031"/>
		<updated>2024-12-03T15:47:56Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pavlov TV has exposed endpoints to allow users to create their own UI interface for use in steaming software such as OBS, data-sets, or any other purpose of your choosing from Pavlov replays.&lt;br /&gt;
&lt;br /&gt;
=== Enable the API ===&lt;br /&gt;
1. Ensure you have PavlovVR installed on steam and locate the GameUserSettings.ini file.&lt;br /&gt;
&lt;br /&gt;
This file on windows machines will usually be found at [ %localappdata%\Pavlov\Saved\Config\Windows\GameUserSettings.ini ] You can paste this into your file explorer(without the brackets [] ) to open the file. &lt;br /&gt;
&lt;br /&gt;
2. Go the the bottom portion of the [/Script/Pavlov.PavlovGameUserSettings] part of the file, ABOVE[ScalabilityGroups]. &lt;br /&gt;
&lt;br /&gt;
3. Add PavTVAPIPort=1234 onto the file at that location. 1234 is the port that will be used, if you know this port is in use already, please find another on your device that is not in use and list it here.&lt;br /&gt;
&lt;br /&gt;
4. Run PavTV&lt;br /&gt;
&lt;br /&gt;
=== Using OBS with your generated/written HTML file ===&lt;br /&gt;
1. Copy your HTML file path &lt;br /&gt;
&lt;br /&gt;
2. Go to “Sources” and click the “+” button &lt;br /&gt;
&lt;br /&gt;
3. Add browser source and create new (name it whatever) &lt;br /&gt;
&lt;br /&gt;
4. Adjust Resolution of the source(recording size) &lt;br /&gt;
&lt;br /&gt;
5. Paste in the HTML file path and click OK&lt;br /&gt;
&lt;br /&gt;
=== The GET Endpoints ===&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;If you are new to this, you are able to put any of these endpoint “links” into your browser or run curl requests and check that they are functional&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus''' &lt;br /&gt;
&lt;br /&gt;
Ex.in JS to fetch this endpoint on port 1234 const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;); const matchData = await response.json()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;); &lt;br /&gt;
&lt;br /&gt;
const matchData = await response.json();&amp;lt;/blockquote&amp;gt;'''Elements in MatchStatus'''&lt;br /&gt;
&lt;br /&gt;
MatchActive- Will return whether a match is currently ongoing or not &lt;br /&gt;
&lt;br /&gt;
''Ex. “MatchActive”: true or “MatchActive”: false''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RoundTime- Will return the active time into the round in seconds&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundTime&amp;quot;: 105''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Teams- Will return true/false if the there are teams in this match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Teams&amp;quot;: true''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RoundsLeft- Will return the maximum number of rounds left in the match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundsLeft&amp;quot;: 15''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Team0Score- Will return blue team’s score&lt;br /&gt;
&lt;br /&gt;
Team1Score- Will return red team’s score&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Score&amp;quot;: 1,''&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Team1Score&amp;quot;: 2,''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
AttackingTeamId- Will return the ID of the currently attacking team 0-blue, 1- red&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;AttackingTeamId&amp;quot;: 1''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Team0Cash- Will return blue team’s collective cash &lt;br /&gt;
&lt;br /&gt;
Team1Cash- Will return red team’s collective cash&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Cash&amp;quot;: 2500, &amp;quot;Team1Cash&amp;quot;: 2500''&lt;br /&gt;
MatchStatus.Team0 or MatchStatus.Team1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus.Team0 or MatchStatus.Team1'''&lt;br /&gt;
&lt;br /&gt;
''Ex.in JS to fetch Team0 from MatchStatus''&amp;lt;blockquote&amp;gt;const teamZero = matchData.Team0 &lt;br /&gt;
&lt;br /&gt;
const teamOne = matchData.Team1&amp;lt;/blockquote&amp;gt;These will give you an array of JSON style objects&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1030</id>
		<title>Pavlov TV API</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1030"/>
		<updated>2024-12-03T15:47:43Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pavlov TV has exposed endpoints to allow users to create their own UI interface for use in steaming software such as OBS, data-sets, or any other purpose of your choosing from Pavlov replays.&lt;br /&gt;
&lt;br /&gt;
=== Enable the API ===&lt;br /&gt;
1. Ensure you have PavlovVR installed on steam and locate the GameUserSettings.ini file.&lt;br /&gt;
&lt;br /&gt;
This file on windows machines will usually be found at [ %localappdata%\Pavlov\Saved\Config\Windows\GameUserSettings.ini ] You can paste this into your file explorer(without the brackets [] ) to open the file. &lt;br /&gt;
&lt;br /&gt;
2. Go the the bottom portion of the [/Script/Pavlov.PavlovGameUserSettings] part of the file, ABOVE[ScalabilityGroups]. &lt;br /&gt;
&lt;br /&gt;
3. Add PavTVAPIPort=1234 onto the file at that location. 1234 is the port that will be used, if you know this port is in use already, please find another on your device that is not in use and list it here.&lt;br /&gt;
&lt;br /&gt;
4. Run PavTV&lt;br /&gt;
&lt;br /&gt;
=== Using OBS with your generated/written HTML file ===&lt;br /&gt;
1. Copy your HTML file path &lt;br /&gt;
&lt;br /&gt;
2. Go to “Sources” and click the “+” button &lt;br /&gt;
&lt;br /&gt;
3. Add browser source and create new (name it whatever) &lt;br /&gt;
&lt;br /&gt;
4. Adjust Resolution of the source(recording size) &lt;br /&gt;
&lt;br /&gt;
5. Paste in the HTML file path and click OK&lt;br /&gt;
&lt;br /&gt;
=== The GET Endpoints ===&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;If you are new to this, you are able to put any of these endpoint “links” into your browser or run curl requests and check that they are functional&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus''' &lt;br /&gt;
&lt;br /&gt;
Ex.in JS to fetch this endpoint on port 1234 const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;); const matchData = await response.json()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;); &lt;br /&gt;
&lt;br /&gt;
const matchData = await response.json();&amp;lt;/blockquote&amp;gt;'''Elements in MatchStatus'''&lt;br /&gt;
&lt;br /&gt;
MatchActive- Will return whether a match is currently ongoing or not &lt;br /&gt;
&lt;br /&gt;
''Ex. “MatchActive”: true or “MatchActive”: false''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RoundTime- Will return the active time into the round in seconds&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundTime&amp;quot;: 105''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Teams- Will return true/false if the there are teams in this match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Teams&amp;quot;: true''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RoundsLeft- Will return the maximum number of rounds left in the match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundsLeft&amp;quot;: 15''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Team0Score- Will return blue team’s score&lt;br /&gt;
&lt;br /&gt;
Team1Score- Will return red team’s score&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Score&amp;quot;: 1,''&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Team1Score&amp;quot;: 2,''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
AttackingTeamId- Will return the ID of the currently attacking team 0-blue, 1- red&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;AttackingTeamId&amp;quot;: 1''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Team0Cash- Will return blue team’s collective cash &lt;br /&gt;
&lt;br /&gt;
Team1Cash- Will return red team’s collective cash&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Cash&amp;quot;: 2500, &amp;quot;Team1Cash&amp;quot;: 2500''&lt;br /&gt;
MatchStatus.Team0 or MatchStatus.Team1&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus.Team0 or MatchStatus.Team1'''&lt;br /&gt;
&lt;br /&gt;
''Ex.in JS to fetch Team0 from MatchStatus''&amp;lt;blockquote&amp;gt;const teamZero = matchData.Team0 &lt;br /&gt;
&lt;br /&gt;
const teamOne = matchData.Team1&amp;lt;/blockquote&amp;gt;These will give you an array of JSON style objects&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1029</id>
		<title>Pavlov TV API</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Pavlov_TV_API&amp;diff=1029"/>
		<updated>2024-12-03T15:45:51Z</updated>

		<summary type="html">&lt;p&gt;Junt: Start page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pavlov TV has exposed endpoints to allow users to create their own UI interface for use in steaming software such as OBS, data-sets, or any other purpose of your choosing from Pavlov replays.&lt;br /&gt;
&lt;br /&gt;
=== Enable the API ===&lt;br /&gt;
1. Ensure you have PavlovVR installed on steam and locate the GameUserSettings.ini file.&lt;br /&gt;
&lt;br /&gt;
This file on windows machines will usually be found at [ %localappdata%\Pavlov\Saved\Config\Windows\GameUserSettings.ini ] You can paste this into your file explorer(without the brackets [] ) to open the file. &lt;br /&gt;
&lt;br /&gt;
2. Go the the bottom portion of the [/Script/Pavlov.PavlovGameUserSettings] part of the file, ABOVE[ScalabilityGroups]. &lt;br /&gt;
&lt;br /&gt;
3. Add PavTVAPIPort=1234 onto the file at that location. 1234 is the port that will be used, if you know this port is in use already, please find another on your device that is not in use and list it here.&lt;br /&gt;
&lt;br /&gt;
4. Run PavTV&lt;br /&gt;
&lt;br /&gt;
=== Using OBS with your generated/written HTML file ===&lt;br /&gt;
1. Copy your HTML file path &lt;br /&gt;
&lt;br /&gt;
2. Go to “Sources” and click the “+” button &lt;br /&gt;
&lt;br /&gt;
3. Add browser source and create new (name it whatever) &lt;br /&gt;
&lt;br /&gt;
4. Adjust Resolution of the source(recording size) &lt;br /&gt;
&lt;br /&gt;
5. Paste in the HTML file path and click OK&lt;br /&gt;
&lt;br /&gt;
=== The GET Endpoints ===&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;If you are new to this, you are able to put any of these endpoint “links” into your browser or run curl requests and check that they are functional&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MatchStatus''' &lt;br /&gt;
&lt;br /&gt;
Ex.in JS to fetch this endpoint on port 1234 const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;); const matchData = await response.json()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;const response = await fetch('&amp;lt;nowiki&amp;gt;http://localhost:1234/MatchStatus'&amp;lt;/nowiki&amp;gt;); &lt;br /&gt;
&lt;br /&gt;
const matchData = await response.json();&amp;lt;/blockquote&amp;gt;'''Elements in MatchStatus'''&lt;br /&gt;
&lt;br /&gt;
MatchActive- Will return whether a match is currently ongoing or not &lt;br /&gt;
&lt;br /&gt;
''Ex. “MatchActive”: true or “MatchActive”: false''&lt;br /&gt;
&lt;br /&gt;
RoundTime- Will return the active time into the round in seconds&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundTime&amp;quot;: 105''&lt;br /&gt;
&lt;br /&gt;
Teams- Will return true/false if the there are teams in this match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Teams&amp;quot;: true''&lt;br /&gt;
&lt;br /&gt;
RoundsLeft- Will return the maximum number of rounds left in the match&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;RoundsLeft&amp;quot;: 15''&lt;br /&gt;
&lt;br /&gt;
Team0Score- Will return blue team’s score&lt;br /&gt;
&lt;br /&gt;
Team1Score- Will return red team’s score&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Score&amp;quot;: 1,''&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Team1Score&amp;quot;: 2,''&lt;br /&gt;
&lt;br /&gt;
AttackingTeamId- Will return the ID of the currently attacking team 0-blue, 1- red&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;AttackingTeamId&amp;quot;: 1''&lt;br /&gt;
&lt;br /&gt;
Team0Cash- Will return blue team’s collective cash &lt;br /&gt;
&lt;br /&gt;
Team1Cash- Will return red team’s collective cash&lt;br /&gt;
&lt;br /&gt;
''Ex. &amp;quot;Team0Cash&amp;quot;: 2500, &amp;quot;Team1Cash&amp;quot;: 2500''&lt;br /&gt;
&lt;br /&gt;
MatchStatus.Team0 or MatchStatus.Team1&lt;br /&gt;
&lt;br /&gt;
''Ex.in JS to fetch Team0 from MatchStatus''&amp;lt;blockquote&amp;gt;const teamZero = matchData.Team0 &lt;br /&gt;
&lt;br /&gt;
const teamOne = matchData.Team1&amp;lt;/blockquote&amp;gt;These will give you an array of JSON style objects&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Setting_up_a_dedicated_server&amp;diff=1020</id>
		<title>Setting up a dedicated server</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Setting_up_a_dedicated_server&amp;diff=1020"/>
		<updated>2024-11-15T15:36:01Z</updated>

		<summary type="html">&lt;p&gt;Junt: removed 50 players &amp;quot;coming soon&amp;quot; to be shipped&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Setting up a dedicated server ==&lt;br /&gt;
&lt;br /&gt;
'''There are no Windows binaries''' &lt;br /&gt;
&lt;br /&gt;
This guide is written exclusively for Linux and covers Ubuntu/Debian/Debian-like and Red Hat RPM-based distros. Possible to run with other distros, but some of the commands won't work and you will need to know enough to figure out the software install of dependencies on your own. &lt;br /&gt;
&lt;br /&gt;
If you are considering hosting from home, please read that section of the wiki first. &lt;br /&gt;
&lt;br /&gt;
This guide assumes you know the basics of using a bash terminal: ssh'ing into a server, running bash commands, editing text files, etc.&lt;br /&gt;
&lt;br /&gt;
If you have no experience using bash, maybe start [https://www.howtogeek.com/140679/beginner-geek-how-to-start-using-the-linux-terminal/ here]. Editing text files via commandline is often a challenge. Suggest using nano and reading guide [https://www.howtogeek.com/howto/42980/the-beginners-guide-to-nano-the-linux-command-line-text-editor/ here]&lt;br /&gt;
&lt;br /&gt;
If you are new to linux and accessing your server from Windows, highly suggest using MobaXterm as your SSH client as that can make required editing of text files easier using built in editor instead of the native linux command line editors.&lt;br /&gt;
&lt;br /&gt;
And finally, ask yourself why you want to setup a server? If you look at the list, there are many, many more servers than players. If you don't have a team, discord community, or group of friends ready to play on your server, chances are it will go unused. Got one of these... great, let's go. &lt;br /&gt;
&lt;br /&gt;
If you don't want to go through the hassle yourself and want to pay for a hosting service Arctic VR (PC and Shack) and Horde (Shack) provide a server hosting services and are trusted in the community. See links below.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Server Requirements ===&lt;br /&gt;
&lt;br /&gt;
==== Operating System ====&lt;br /&gt;
'''Pavlovserver can only be hosted under Linux.'''&lt;br /&gt;
&lt;br /&gt;
Known good operating systems are:&lt;br /&gt;
&lt;br /&gt;
* Ubuntu 18.04 x86_64&lt;br /&gt;
* Ubuntu 19/04 amd64&lt;br /&gt;
* Ubuntu 20.04 x86_64&lt;br /&gt;
* Rocky Linux 8&lt;br /&gt;
&lt;br /&gt;
This can be running as a VM under windows, but this will increase the complexity of the setup beyond this guide. &lt;br /&gt;
&lt;br /&gt;
Ubuntu 15.04 x86 is known to fail to install using this guide. Recommend not running on &amp;quot;minimal&amp;quot; images as some tools are missing, and they can be installed, which is not covered in the scope of this guide. &lt;br /&gt;
&lt;br /&gt;
==== Resources and Performance Optimisation ====&lt;br /&gt;
* 2GB RAM + 1GB RAM per each additional server with 10 players. More RAM is recommended for larger maps, higher player counts, or complex gamemodes. Not having enough RAM is a common cause of server crashes.&lt;br /&gt;
* A ~2.5Ghz CPU will comfortably support a 10 player server.&lt;br /&gt;
* A ~4Ghz CPU will comfortably support 24 players. Pavlov on PC can support up to 50 players. Shack is limited by 24.&lt;br /&gt;
Pavlovser is functionally single threaded - one thread does vast majority of work. More CPUs only help if you are running more servers. More clockspeed = higher performance = more users per server. Hence, no particular performance benefit is gained from multithreading - if you are running multiple instances of a pavlov server, you will require more CPU cores.&lt;br /&gt;
&lt;br /&gt;
Lower player counts are recommended for complex gamemodes (E.g. CodZ) and/or highly detailed maps, so that maximum number will often be lower. Note that these player count numbers are just suggestions to help optimise for the best performance, based on experiences with many server providers on different grades of hardware.&lt;br /&gt;
&lt;br /&gt;
As of 1.0.17 (17/05/2024) 24 is the hard limits for player counts for Shack, but PC is limited to 50.&lt;br /&gt;
&lt;br /&gt;
The maximum number of servers you can run is dependent on how many CPUs you have. For example, if you have an 8 core CPU, the maximum number of servers would be 7. You should always have at least one CPU free as overhead, as Pavlov servers can use slightly more than one thread.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Hosting at home ====&lt;br /&gt;
When hosting at home there are additional requirements regarding networking: Your router has to support port-forwarding, hair-pinning/LoopbackNAT, and respond to ping requests.  These techniques are necessary to allow your server to be found and to talk back to the client. please see https://en.wikipedia.org/wiki/Port_forwarding,  https://en.wikipedia.org/wiki/Hairpinning, and https://www.speedguide.net/faq/how-to-become-pingable-behind-a-routerfirewall-376 for more info and google for these terms in addition to your router model to find guides on how to enable/configure it properly. If you have modern Router, it may have these features already enabled, in this case you just have to configure port-forwarding. If you can see your server but not join it while others can, this is indicative of a failure of LoopbackNAT. &lt;br /&gt;
&lt;br /&gt;
A second challenge to hosting at home is CGNAT (Carrier grade NAT: https://www.a10networks.com/blog/carrier-grade-nat/). Just like NAT on your home network that has to be gotten around w/ port-forwarding, CGNAT breaks the ability of external connections to be made back to your server, but the controls are solely in your ISPs hands. Sometimes if you ask, you can be removed from CGNAT pools and/or assigned a static IP. CGNAT rollouts are becoming very common now, so if your server worked then doesn't allow connections now, your ISP may have made this change. &lt;br /&gt;
&lt;br /&gt;
You can check whether you’re on a CGNAT network by visiting a Web site such as ipaddress.com or whatsmyip.com and comparing the IP address listed to the public/WAN IP address assigned to your Internet gateway. To find your gateway’s public IP address, check the status page in the administrative interface. If the two IP addresses differ, you’re likely on a CGNAT network. If so, this problem must be resolved before you go any further. &lt;br /&gt;
&lt;br /&gt;
'''Not understanding these requirements and configuration is a frequent cause of failed setups and questions in discord. Don't skip this if you are trying to host from home'''&lt;br /&gt;
&lt;br /&gt;
'''There are serious security implications of hosting this software at home.''' None of the devs are security experts and there has been no security review of the code. You are opening up your system to the world and publicity advertising this fact. Expect that any system hosting this software is open to compromise from the Internet and act accordingly. If your router offers a DMZ network, use it. Consider hosting on a cloud based server and think twice before running this software on any system that contains data you care about or has access to networks and computers you care about.&lt;br /&gt;
&lt;br /&gt;
If you're hosting at home using Oracle's VirtualBox, there are steps you can take to prevent double NAT (which can cause issues later on)&lt;br /&gt;
&lt;br /&gt;
1. Select your VM and then click Settings in VirtualBox's main window.&lt;br /&gt;
&lt;br /&gt;
2. Click on Network and change Attached To from NAT to Bridged Adapter. &lt;br /&gt;
&lt;br /&gt;
Once you've done this, your VM should be connected directly to your home router and double NAT should no longer be a issue.&lt;br /&gt;
&lt;br /&gt;
It should go without saying that hosting at home usually invites a myriad of potential problems that will be unique to your setup - such as your ISP, router, or network configuration. There is a lively community of like-minded server hosters on the Pavlov-VR Discord, so if you get stuck, head on over to the discord and see whether you can find the answers you're looking for.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Starting Server Install ===&lt;br /&gt;
&lt;br /&gt;
====Obtaining an ApiKey ====&lt;br /&gt;
(Not required unless hosting large amount of servers)&lt;br /&gt;
&lt;br /&gt;
For your server to show up in the server list, there is now a requirement to have an ApiKey issued by vankrupt. This is to prevent DOS attacks against the master server.&lt;br /&gt;
&lt;br /&gt;
Get the key by going here: https://pavlov-ms.vankrupt.com/servers/v1/key and using your mobile number to get a SMS&lt;br /&gt;
&lt;br /&gt;
(Note that there have sometimes been reported failures of this SMS system for non-US mobiles. In this case, DM davevillz your phone number and request a key, if you have tried and have had no success.)&lt;br /&gt;
&lt;br /&gt;
Save this key for later, so that you can ut this key in your Game.ini as follows:&lt;br /&gt;
    ApiKey=&amp;quot;ABC123FALSEKEYDONTUSEME&amp;quot;&lt;br /&gt;
or if you would like (personally untested..I would use Game.ini) you can call it at server runtime with flag as follows:&lt;br /&gt;
   -KEY=&amp;quot;ABC123FALSEKEYDONTUSEME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This key can be re-used for a reasonable number of servers (a limit of 10 has been mentioned). Contact the Devs if you need more servers per key.&lt;br /&gt;
====System setup and software installation====&lt;br /&gt;
In this step we will:&lt;br /&gt;
&lt;br /&gt;
# Check the operating system is compatible&lt;br /&gt;
# Install some dependencies&lt;br /&gt;
# create the user &amp;quot;steam&amp;quot; and set it's password, and switch to that user&lt;br /&gt;
# as &amp;quot;steam&amp;quot; user, install Steamcmd, the binary used to download steam games in linux&lt;br /&gt;
# use Steamcmd to install Pavlov.&lt;br /&gt;
&lt;br /&gt;
These steps only need to be done the first time you set up the server. We'll then look at some post-installation steps.&lt;br /&gt;
&lt;br /&gt;
===== Step 1: Check the operating system is compatible =====&lt;br /&gt;
Confirm Linux version, run the command:&lt;br /&gt;
 lsb_release -a&lt;br /&gt;
  &lt;br /&gt;
Expect the result to say '''Ubuntu 20.04''' (or one of the other known supported operating systems - this guide assumes Ubuntu or a Fedora system)&lt;br /&gt;
&lt;br /&gt;
===== Step 2: Install some dependencies =====&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''For Ubuntu 22.04:'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
 sudo apt update &amp;amp;&amp;amp; sudo apt install -y gdb curl lib32gcc1 libc++-dev unzip&lt;br /&gt;
&amp;lt;blockquote&amp;gt;'''For Ubuntu 20.10 or higher'''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
 sudo apt update &amp;amp;&amp;amp; sudo apt install -y gdb curl lib32gcc-s1 libc++-dev unzip&lt;br /&gt;
&amp;lt;blockquote&amp;gt;For Rocky Linux, CentOS 8, and RHEL 8&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/g' /etc/selinux/config&lt;br /&gt;
  sudo setenforce 0&lt;br /&gt;
  sudo yum install gdb curl glibc.i686 libstdc++.i686 libstdc++-devel.i686 libstdc++-devel.x86_64 unzip wget -y&lt;br /&gt;
  wget &amp;lt;nowiki&amp;gt;https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/libcxx-3.8.0-3.el7.x86_64.rpm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  sudo rpm -i libcxx-3.8.0-3.el7.x86_64.rpm&lt;br /&gt;
&lt;br /&gt;
===== Step 3: Create the steam user =====&lt;br /&gt;
  sudo useradd -m steam&lt;br /&gt;
&lt;br /&gt;
[Optional] Set the /bin/bash shell for the steam user this will allow you to use arrow keys in terminal and show what folder you are in at all times&amp;lt;pre&amp;gt;sudo chsh -s /bin/bash steam&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Optional] Set a password for steam.&amp;lt;pre&amp;gt;sudo passwd steam&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Login as the Steam user. ('''You will need to do this each time you connect to your server - editing game files and interacting with the game server should be done as the steam user'''):&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo su -l steam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Step 4: Install Steam, known as SteamCMD =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~/Steam &amp;amp;&amp;amp; cd ~/Steam &amp;amp;&amp;amp; curl -sqL &amp;quot;https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz&amp;quot; | tar zxvf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Step 5: User SteamCMD to install Pavlov =====&lt;br /&gt;
There are different dedicated server versions for Pavlov Server - choose which server version you want to host (PC non-beta, PC Beta, Shack Live, or Shack RC)&lt;br /&gt;
(You will need to run this command each time there is a Pavlov Server update). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;To host '''PC Server (non-beta)''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta default +exit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To host '''PC BETA''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta beta_server +exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To host '''Shack Live''' (Quest):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta shack +exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To host '''Shack RC''' (Quest): &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta shack_beta +exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Post Installation Steps =====&lt;br /&gt;
Now that we've installed the server, Install a fresh copy of steamclient.so. You may also have to do this after each update.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +login anonymous +app_update 1007 +quit&lt;br /&gt;
mkdir -p ~/.steam/sdk64&lt;br /&gt;
cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/.steam/sdk64/steamclient.so&lt;br /&gt;
cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/pavlovserver/Pavlov/Binaries/Linux/steamclient.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The update 29 of the PCVR version of Pavlov and after added a requirement to run these commands to change the steamclient.so:&lt;br /&gt;
 &amp;lt;code&amp;gt;sudo rm /usr/lib/x86_64-linux-gnu/libc++.so&amp;lt;/code&amp;gt; &lt;br /&gt;
 &amp;lt;code&amp;gt;sudo ln -s /usr/lib/x86_64-linux-gnu/libc++.so.1 /usr/lib/x86_64-linux-gnu/libc++.so&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make the PavlovServer script executable. (You only need to do this once):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod +x ~/pavlovserver/PavlovServer.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make a note to review these steps later, if you would like to automate server and steam client updates.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Server Configuration ===&lt;br /&gt;
&lt;br /&gt;
Before being able to properly use the server we need to configure it. You should attempt to start the server, let it start up, and then shut down the server, which should create all the required configuration files and directories. &lt;br /&gt;
&lt;br /&gt;
However, if you are having trouble, it may help to create the directories manually first - make sure you are doing these actions as the &amp;quot;steam&amp;quot; user. &lt;br /&gt;
&lt;br /&gt;
Start by creating some directories: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /home/steam/pavlovserver/Pavlov/Saved/Logs&lt;br /&gt;
mkdir -p /home/steam/pavlovserver/Pavlov/Saved/Config/LinuxServer&lt;br /&gt;
mkdir -p /home/steam/pavlovserver/Pavlov/Saved/maps&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mods/Blacklist/Whitelist (optional)  ====&lt;br /&gt;
&lt;br /&gt;
The following three files allow you to specify mods, banned players, and whitelist players. These are optional, but go ahead and create them. Populating the files is described later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /home/steam/pavlovserver/Pavlov/Saved/Config/mods.txt&lt;br /&gt;
touch /home/steam/pavlovserver/Pavlov/Saved/Config/blacklist.txt&lt;br /&gt;
touch /home/steam/pavlovserver/Pavlov/Saved/Config/whitelist.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Configuring Game.ini====&lt;br /&gt;
If starting the server did not create a default Game.ini, create a new Game.ini file using following command to open an editor and copy/paste the following block into it then save it.  &lt;br /&gt;
&lt;br /&gt;
Note not all of these options are required. For instance remove or comment out the Password=0000 line to make a public server with no pin.  &lt;br /&gt;
&lt;br /&gt;
You will also need to fetch your API Key you set up earlier. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nano /home/steam/pavlovserver/Pavlov/Saved/Config/LinuxServer/Game.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[/Script/Pavlov.DedicatedServer]&lt;br /&gt;
bEnabled=true&lt;br /&gt;
ServerName=&amp;quot;My_private_idaho&amp;quot;&lt;br /&gt;
MaxPlayers=10     #its recommended for the best experience to keep shack servers at or below 10 players pcvr and psvr are both capped at 24 too. &lt;br /&gt;
ApiKey=&amp;quot;ABC123FALSEKEYDONTUSEME&amp;quot;&lt;br /&gt;
bSecured=true&lt;br /&gt;
bCustomServer=true &lt;br /&gt;
bVerboseLogging=false &lt;br /&gt;
bCompetitive=false #This only works for SND&lt;br /&gt;
bWhitelist=false &lt;br /&gt;
RefreshListTime=120 &lt;br /&gt;
LimitedAmmoType=0 &lt;br /&gt;
TickRate=90&lt;br /&gt;
TimeLimit=60&lt;br /&gt;
AFKTimeLimit=300&lt;br /&gt;
#Password=0000 &lt;br /&gt;
#BalanceTableURL=&amp;quot;vankruptgames/BalancingTable/main&amp;quot;&lt;br /&gt;
MapRotation=(MapId=&amp;quot;UGC1758245796&amp;quot;, GameMode=&amp;quot;GUN&amp;quot;)&lt;br /&gt;
MapRotation=(MapId=&amp;quot;datacenter&amp;quot;, GameMode=&amp;quot;SND&amp;quot;)&lt;br /&gt;
MapRotation=(MapId=&amp;quot;sand&amp;quot;, GameMode=&amp;quot;DM&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''bEnabled''' - whether the server appears in the server list (unconfirmed)&lt;br /&gt;
* '''ServerName''' - name it will be listed as. (approx 35 chars max)&lt;br /&gt;
* '''MaxPlayers''' - See suggested specs for limits. 10 standard (10 for shack), 20-24 is max recommended for large maps like Stalingrad or PUSH/RUSH modes, and servers allow a maximum of 24 players.&lt;br /&gt;
* '''ApiKey''' - Unique ApiKey required to register server with master server. Replace with your key&lt;br /&gt;
* '''bSecured''' - enabled Valve Anti-Cheat (VAC)&lt;br /&gt;
* '''bCustomServer''' - activates some new modding tools (save and http functions. Required to write to blacklist.txt for bans)&lt;br /&gt;
* '''bCompetitive''' - sets the server to competitive mode for SND. If removed the server will default to false&lt;br /&gt;
* '''bVerboseLogging''' - enables verbose logging, mostly detailed statistics.  Be prepared for significant increase in logging.&lt;br /&gt;
* '''bWhitelist''' - Only allow users in whitelist.txt to join&lt;br /&gt;
* '''RefreshListTime''' - sets how often the running server checks for updates in ban/whitelist/mod files&lt;br /&gt;
* '''LimitedAmmoType''' - sets limited ammo mode, see Limited Ammo Types table below&lt;br /&gt;
&lt;br /&gt;
* '''TimeLimit''' - sets time limit for each map&lt;br /&gt;
* '''TickRate''' - sets the server tickrate. (so far minimum stable seems around 50 and max around 120. Beware setting this changes weapon despawn time and breaks some game modes. Recommend not touching)&lt;br /&gt;
* '''Password''' - PIN number for server #FYI - this is now also changeable via rcon.&lt;br /&gt;
* '''BalanceTableURL''' - Points to a custom balance table from github. See https://github.com/vankruptgames/BalancingTable for instructions. This line isn't needed if you don't have one. &lt;br /&gt;
* '''MapRotation''' - you can add multiple of these. The map system has switched from the steam workshop to modio which means that the server rotation will need to be redone with modio UGCs. &amp;lt;nowiki&amp;gt;https://mod.io/g/pavlov&amp;lt;/nowiki&amp;gt;. This is done by taking the resource ID from the modio page, adding “UGC” in front of it and then adding that to the rotation. For example the map gravity &amp;lt;nowiki&amp;gt;https://mod.io/g/pavlov/m/gravity1&amp;lt;/nowiki&amp;gt; has a resource ID of 2773760 so the map ID to add to the server would be “UGC2773760”. When a match ends, the server will load the next map in the rotation.  &lt;br /&gt;
* '''AFKTimeLimit''' There is now a feature to kick players who are idle in the game. Integers are measured in seconds and 0 disables AFK kicking completely.&lt;br /&gt;
&lt;br /&gt;
Available game modes as of 09/06/2022: See Game modes table below&lt;br /&gt;
&lt;br /&gt;
For maps running a Custom gamemode (CodZ, BR, Duel, etc.) it doesn't matter which gamemode you choose, as the map will automatically override it with the custom mode.&lt;br /&gt;
&lt;br /&gt;
===== Limited Ammo Types =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!AmmoType&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Unlimited&lt;br /&gt;
|Players have unlimited ammo, carry no ammo boxes and do not display an ammo count on the wrist.&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Limited Generic&lt;br /&gt;
|Players carry ammo boxes with a limited amount of ammo.&lt;br /&gt;
One box for each weapon class (Pistol, Submachine gun, Rifles/MGs, Shotgun, Sniper).&lt;br /&gt;
&lt;br /&gt;
Mags and ammo boxes can be put on the chest of the player to consolidate the ammo.&lt;br /&gt;
&lt;br /&gt;
An ammo count is displayed on the wrist.&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Limited Specific&lt;br /&gt;
|Players carry ammo boxes with a limited amount of ammo.&lt;br /&gt;
One box for each weapon.&lt;br /&gt;
&lt;br /&gt;
Mags and ammo boxes can be put on the chest of the player to consolidate the ammo.&lt;br /&gt;
&lt;br /&gt;
An ammo count is displayed on the wrist.&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Custom&lt;br /&gt;
|Allows for full control over ammo by the map.&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
| Limited Special&lt;br /&gt;
|'''All weapons except &amp;quot;special&amp;quot; weapons are unlimited, more clarification is needed.''' &lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Boxless&lt;br /&gt;
|'''Like limited generic but without boxes? Clarification is needed.'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Game Modes =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!GameMode &lt;br /&gt;
!Name&lt;br /&gt;
|-&lt;br /&gt;
|DM&lt;br /&gt;
|Death match&lt;br /&gt;
|-&lt;br /&gt;
|KOTH&lt;br /&gt;
|King of the hill&lt;br /&gt;
|-&lt;br /&gt;
|GUN&lt;br /&gt;
| Gun game&lt;br /&gt;
|-&lt;br /&gt;
|OITC&lt;br /&gt;
| One in the chamber&lt;br /&gt;
|-&lt;br /&gt;
|SND&lt;br /&gt;
|Search and destroy&lt;br /&gt;
|-&lt;br /&gt;
|TANKTDM&lt;br /&gt;
|WW2 Team Death Match&lt;br /&gt;
|-&lt;br /&gt;
| TDM&lt;br /&gt;
|Team Death Match&lt;br /&gt;
|-&lt;br /&gt;
|TTT&lt;br /&gt;
|Trouble in Terrorist Town&lt;br /&gt;
|-&lt;br /&gt;
|TTTclassic&lt;br /&gt;
|TTT with only innocent/traitor/detective&lt;br /&gt;
|-&lt;br /&gt;
|WW2GUN&lt;br /&gt;
|WW2 gun game&lt;br /&gt;
|-&lt;br /&gt;
|ZWV&lt;br /&gt;
| Zombie wave survival&lt;br /&gt;
|-&lt;br /&gt;
|HIDE&lt;br /&gt;
|The Hidden &lt;br /&gt;
|-&lt;br /&gt;
|INFECTION&lt;br /&gt;
|Hidden infection&lt;br /&gt;
|-&lt;br /&gt;
|PUSH&lt;br /&gt;
|Push&lt;br /&gt;
|-&lt;br /&gt;
|PH&lt;br /&gt;
|Prop hunt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Default Map ID's ====&lt;br /&gt;
datacenter &lt;br /&gt;
&lt;br /&gt;
sand&lt;br /&gt;
&lt;br /&gt;
bridge&lt;br /&gt;
&lt;br /&gt;
containeryard&lt;br /&gt;
&lt;br /&gt;
siberia (Prison Break)&lt;br /&gt;
&lt;br /&gt;
hospital (Zombies map)&lt;br /&gt;
&lt;br /&gt;
killhouse&lt;br /&gt;
&lt;br /&gt;
range&lt;br /&gt;
&lt;br /&gt;
tutorial&lt;br /&gt;
&lt;br /&gt;
santorini&lt;br /&gt;
&lt;br /&gt;
station&lt;br /&gt;
&lt;br /&gt;
industry&lt;br /&gt;
&lt;br /&gt;
ogcontainers (Shack only)&lt;br /&gt;
&lt;br /&gt;
haguenau (Shack only)&lt;br /&gt;
&lt;br /&gt;
foundation (Shack only)&lt;br /&gt;
&lt;br /&gt;
stalingrad (PC only)&lt;br /&gt;
&lt;br /&gt;
stalingrad_night (PC only)&lt;br /&gt;
&lt;br /&gt;
santorini_night (PC only)&lt;br /&gt;
&lt;br /&gt;
sand_night (PC only)&lt;br /&gt;
&lt;br /&gt;
station_night (PC only)&lt;br /&gt;
&lt;br /&gt;
industry_night (PC only)&lt;br /&gt;
&lt;br /&gt;
bunker (PC only)&lt;br /&gt;
&lt;br /&gt;
=== Server Administration ===&lt;br /&gt;
Installing the server is half the battle.&lt;br /&gt;
&lt;br /&gt;
==== Server Visibility ====&lt;br /&gt;
If you've followed this guide successfully to this point, you should have a running instance of pavlovserver. For your server to be visible to the Master List, and so that it can be joined by players, you will need to make sure the server has the ports forwarded.&lt;br /&gt;
&lt;br /&gt;
You can also check the server visibility using the vankrupt API, or on some publicly hosted game server lists, or by launching the game and just looking for your server in the game browser.&lt;br /&gt;
&lt;br /&gt;
===== Firewall/Port forwarding =====&lt;br /&gt;
Using the default settings there are two UDP ports (7777, 8177) that need to be allowed to access the server either by firewall setup or port forwarding. &lt;br /&gt;
&lt;br /&gt;
'''Ubuntu''' firewall commands to check firewall and open ports:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo ufw status&lt;br /&gt;
sudo ufw allow 7777&lt;br /&gt;
sudo ufw allow 8177&lt;br /&gt;
sudo ufw allow 9100&lt;br /&gt;
sudo ufw status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Rocky Linux''' firewall commands to check the firewall and open ports:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=7777/tcp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=7777/udp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=8177/tcp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=8177/udp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=9100/udp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=9100/tcp&lt;br /&gt;
sudo firewall-cmd --list-ports&lt;br /&gt;
firewall-cmd --runtime-to-permanent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may also need to allow Pings (ICMP) for the server's true latency to appear in the master list.&lt;br /&gt;
&lt;br /&gt;
If you are running multiple servers and have set additional ports (see http://pavlovwiki.com/index.php/Setting_up_a_dedicated_server#Running_multiple_servers_on_one_host) then you need to allow access to the defined port plus the port 400 higher. So if you use 7000 as your port, then UDP 7000 and 7400 need to be open&lt;br /&gt;
&lt;br /&gt;
Whilst on the topic of port forwarding, If you have setup '''rcon''' via RconSettings.txt (below) then that port also needs to be allowed access via TCP, if your RCON controller will be external to your server.&lt;br /&gt;
&lt;br /&gt;
If you are running Shack/Quest and want to have maps that are downloadable from your server, your server ports (ex. 7777 &amp;amp; 8177) must also be open via TCP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ipv6 is not planned to be supported. You can disable by doing the following command:&lt;br /&gt;
 sudo nano /etc/default/grub&lt;br /&gt;
And then edit the line below to GRUB_CMDLINE_LINUX_DEFAULT=”ipv6. disable=1″&lt;br /&gt;
&lt;br /&gt;
This makes sure ipv6 is disabled on operating system restart. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Shack Maps (Quest) ====&lt;br /&gt;
&lt;br /&gt;
Adding maps for the Shack version of Pavlov works differently to the steam version of the game, and you'll run into issues very quickly if you do not customise your server to accomodate this.&lt;br /&gt;
&lt;br /&gt;
This is because Shack has no affiliation with Steam, and therefore cannot use Steam Workshop maps like the above. In the future, these steps will apply to PC servers as well, allowing a server to hold the map itself, instead of offloading it to Steam.&lt;br /&gt;
&lt;br /&gt;
To get started, first, create the directory to hold the maps&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir -p /home/steam/pavlovserver/Pavlov/Saved/maps&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can use any number of methods to move the map files onto the server, but I'll go over the two simplest, starting with a GUI approach&lt;br /&gt;
&lt;br /&gt;
* Download and install Cyberduck onto your &amp;quot;home&amp;quot; PC (Whatever PC you use for access to the server, but not the server itself): https://cyberduck.io/&lt;br /&gt;
&lt;br /&gt;
* Next, download and unzip your map of choice&lt;br /&gt;
** You can get them from https://www.pavlovquest.com/ , https://pavlovhorde.com/mapsList, or look in #shack-map-showcase channel in the discord server.&lt;br /&gt;
** I'm going to use Cheeto's WW2 Items test (http://www.mediafire.com/file/emyt9bs1z9u9ykw/SVR_Cheeto_Items.zip/file ) for this example, you do what you like&lt;br /&gt;
&lt;br /&gt;
* In the top left corner, open a connection, set the connection type to SFTP, and fill in the rest of the information&lt;br /&gt;
** This will be the same credentials you've used to connect to the server via SSH this whole time. - the username is typically `root` for Debian or Rocky systems, but you could also use the &amp;quot;steam&amp;quot; user if you set that user up with a password or private key to allow SSH.&lt;br /&gt;
&lt;br /&gt;
* In the directory dropdown (it will say /root) navigate back to /&lt;br /&gt;
* Follow the directories until we arrive back at our &amp;quot;maps&amp;quot; folder&lt;br /&gt;
&amp;lt;pre&amp;gt;/home/steam/pavlovserver/Pavlov/Saved/maps&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Drag and drop the unzipped map folder into the main window, in this case itll be SVR_Cheeto_Items&lt;br /&gt;
* Hit Allow&lt;br /&gt;
** You'll now see a folder named SVR_Cheeto_Items, and within it should be nothing but 3 files. If there is another folder in it, move this folder to the maps directory, otherwise the server won't work. The 3 files (2 .PAK one .JSON) should be in home/steam/pavlovserver/Pavlov/Saved/maps/SVR_Cheeto_Items, no more, no less.&lt;br /&gt;
* Your map should now be ready to use, after you restart the game service (e.g. sudo systemctl restart pavlovserver.service).&lt;br /&gt;
&lt;br /&gt;
Pavlov Shack servers load maps when the pavlovserver starts up.&lt;br /&gt;
&lt;br /&gt;
'''YOU MUST RESTART THE GAME SERVER TO USE THE MAPS.'''&lt;br /&gt;
&lt;br /&gt;
To play the map, you can either use RCON switch map command, or to add the map to your server's automatic map rotation list, add the map's folder name to your Game.ini. This replaces the MapID section, so for our example, you would add the following line to your Game.ini above or below the other MapRotation lines: &lt;br /&gt;
&lt;br /&gt;
If you have any trouble with the map loading (typically, the game will load into datacentre if there are problems) you may need to check the permissions of the map files, to ensure they belong to the user/group &amp;quot;steam:steam&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MapRotation=(MapId=&amp;quot;SVR_Cheeto_Items&amp;quot;, GameMode=&amp;quot;TDM&amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And that's all! Disconnect CyberDuck from your server before playing, otherwise you'll have difficulty joining.&lt;br /&gt;
&lt;br /&gt;
-----------&lt;br /&gt;
&lt;br /&gt;
==== Adding Shack Maps over Command Line Interface ====&lt;br /&gt;
&lt;br /&gt;
A reminder that Pavlov Shack servers load maps when the pavlovserver starts up.&lt;br /&gt;
&lt;br /&gt;
'''YOU MUST RESTART THE GAME SERVER TO USE THE MAPS.'''&lt;br /&gt;
&lt;br /&gt;
This process is more complicated, but adding maps over the command line interface has its benefits&lt;br /&gt;
&lt;br /&gt;
First, log into the server, change to the steam user, and CD to the maps directory you made above&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo su steam&lt;br /&gt;
cd ~/pavlovserver/Pavlov/Saved/maps&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Download the map files from whatever you use to upload them. To do this, you can either use curl or wget&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;curl -O insertURLhere&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''If you download your map from Google Drive''', make sure that your .zip folder is shared with anyone.&lt;br /&gt;
&lt;br /&gt;
Then, get the file's URL from the shared link.&amp;lt;p&amp;gt;Example : ''&amp;lt;nowiki&amp;gt;https://drive.google.com/file/d/19bI8gUHaN5tUrDvnadAacUnchQf6_k/view&amp;lt;/nowiki&amp;gt;''&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;will be ''19bI8gUHaN5tUrDvnadAacUnchQf6_k''&amp;lt;/p&amp;gt;&lt;br /&gt;
Edit &amp;quot;fileId&amp;quot; and &amp;quot;fileName&amp;quot; before you execute the command. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fileId=19bI8gUHaN5tUrDvnadAacUnchQf6_k&lt;br /&gt;
fileName=SVR_USER_MAPNAME&lt;br /&gt;
curl -sc /tmp/cookie &amp;quot;https://drive.google.com/uc?export=download&amp;amp;id=${fileId}&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
code=&amp;quot;$(awk '/_warning_/ {print $NF}' /tmp/cookie)&amp;quot;  &lt;br /&gt;
curl -Lb /tmp/cookie &amp;quot;https://drive.google.com/uc?export=download&amp;amp;confirm=${code}&amp;amp;id=${fileId}&amp;quot; -o ${fileName} &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To keep with the Items example, we're downloading the file from a ZIP uploaded to discord:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;curl -O https://cdn.discordapp.com/attachments/744185280759857234/745027406695366788/SVR_Cheeto_Items.zip&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, unzip the file. If this next step errors out, saying the command is unknown, switch back to the root user (su root), and install unzip (sudo apt install unzip), then return to the steam user, and continue.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;unzip SVR_Cheeto_Items.zip&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now finish like before by adding the map to your Game.ini&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;nano /home/steam/pavlovserver/Pavlov/Saved/Config/LinuxServer/Game.ini&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MapRotation=(MapId=&amp;quot;SVR_Cheeto_Items&amp;quot;, GameMode=&amp;quot;TDM&amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Admin/Moderator list for Arctic-VR hosted servers (optional) ====&lt;br /&gt;
&lt;br /&gt;
The only working in-game admin menu is through Arctic VR server hosting (see below).  &lt;br /&gt;
&lt;br /&gt;
If you add moderators to your server, they will not be subject to vote kicks. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nano ~/pavlovserver/Pavlov/Saved/Config/mods.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example Mod List:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
76541198397498572 #Optional Comment: Player name&lt;br /&gt;
76541198397498573 #Some Other Player&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ArcticVR Admin Menu ====&lt;br /&gt;
&lt;br /&gt;
[[File:Arcticmenu.jpg|500px|link=https://www.arctic-vr.com/server-admin-menu]]&lt;br /&gt;
&lt;br /&gt;
Arctic-VR Offers an advanced In-Game Admin menu that is exclusive to their hosting service. Features include: &lt;br /&gt;
* Switch Maps+Modes&lt;br /&gt;
* Teleport Players to Players&lt;br /&gt;
* Change Player Skins&lt;br /&gt;
* Control Player Buying+Cash&lt;br /&gt;
* Spawn Items&lt;br /&gt;
* Clean up corpses + guns&lt;br /&gt;
* Spawn Bots&lt;br /&gt;
* Spawn Items for other players&lt;br /&gt;
* Control Teams + Balance/Shuffle Teams&lt;br /&gt;
* ResetSND&lt;br /&gt;
* And More&lt;br /&gt;
&lt;br /&gt;
You can read more about the ArcticVR admin menu on their website: https://www.arctic-vr.com/server-admin-menu&lt;br /&gt;
&lt;br /&gt;
==== Handy tools for finding steamIDs ==== &lt;br /&gt;
&lt;br /&gt;
Steam ID finder: https://steamidfinder.com/lookup/ or https://steamid.xyz/&lt;br /&gt;
&lt;br /&gt;
You want to enter in the steamID64 format. &lt;br /&gt;
&lt;br /&gt;
This tool can convert or lookup IDs:  https://steamid.io/&lt;br /&gt;
&lt;br /&gt;
If you are looking for a steamID of a player that has been on your server recently this is technique to find them:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep -i playername ~/pavlovserver/Pavlov/Saved/Logs/* | grep TicketValidation&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configure Rcon ====&lt;br /&gt;
To enable Rcon access create config file:&lt;br /&gt;
&amp;lt;pre&amp;gt; nano /home/steam/pavlovserver/Pavlov/Saved/Config/RconSettings.txt &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copy in the following text - change password, and if desired the port:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Password=ChangeThisPassword&lt;br /&gt;
Port=9100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You must specify a port for the Rcon server to use as well as a Password (use a different port per sever instance if running multiple server instances off the same hardware)&lt;br /&gt;
&lt;br /&gt;
==== Starting the server manually ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/pavlovserver &amp;amp;&amp;amp; ./PavlovServer.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That's it, your server will be automatically broadcast to the master server! :) &lt;br /&gt;
&lt;br /&gt;
Note that when you close your terminal, the server will go down. See the &amp;quot;supervisors&amp;quot; section below for how to prevent this. &lt;br /&gt;
&lt;br /&gt;
If you have followed the supervisor service-setup part of the guide, you can run pavlovserver as a service using systemctl. &lt;br /&gt;
&lt;br /&gt;
==== Seeing your server in a Master List ====&lt;br /&gt;
Two handy tools to determine quickly if your server is broadcasting are the [https://pavlovhorde.com/ Horde] (Shack) and [https://pavlovhorde.com/pcServers Horde] (PC version) public listings. &lt;br /&gt;
&lt;br /&gt;
If you're also handy with cURL, you can query the vankrupt game server listing directly, for Oculus/Shack servers, and PC servers:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://prod-shack-pavlov-ms.vankrupt.net/servers/v2/list/1.0.17/oculus_app_id/0/0/0/all&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://prod-shack-pavlov-ms.vankrupt.net/servers/v2/list/1.0.17/oculus/0/0/0/all&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://prod-crossplay-pavlov-ms.vankrupt.net/servers/v2/list/1.0.17/steam/0/0/0/all&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where 1.0.17 is the version of the game. You can check the current version of the game your server is running by checking your log file (/home/steam/pavlovserver/Pavlov/Saved/Logs/Pavlov.log) and checking for the &amp;quot;version&amp;quot; line early in the startup of the log file.&lt;br /&gt;
&lt;br /&gt;
The endpoint also supports filtering - changing the '''/0/0/0''' in the URL will have the following effects:&lt;br /&gt;
&lt;br /&gt;
* /1/0/0/ hide empty servers&lt;br /&gt;
* /0/1/0/ hide full servers&lt;br /&gt;
* /0/0/1/ hide password protected servers&lt;br /&gt;
&lt;br /&gt;
You can also customize which gamemodes are shown by changing /all to /SND,TDM,DM,GUN,CUSTOM,ZWV,TTT,TTTCLASSIC,TANKTDM,WW2GUN,KOTH,OITC,HIDE,PH and removing what you don't want to view.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Supervising the server using systemd ===&lt;br /&gt;
&lt;br /&gt;
Running '''./PavlovServer.sh''' in your interactive shell is easy, but the server will shut down when you close your terminal. If you want to run the server in the background,&lt;br /&gt;
you'll want to run it under a supervisor. There are many options, ranging from the simple (nohup, screen or tmux), to the&lt;br /&gt;
more robust (supervisord, systemd).&lt;br /&gt;
&lt;br /&gt;
Systemd is running by default on Ubuntu Linux, so we'll use that here.&lt;br /&gt;
&lt;br /&gt;
To run the server as a systemd service, create the file '''/etc/systemd/system/pavlovserver.service''' (as root) by typing &lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
sudo nano /etc/systemd/system/pavlovserver.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copy the contents below into the file and save.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Pavlov VR dedicated server&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
WorkingDirectory=/home/steam/pavlovserver&lt;br /&gt;
ExecStart=/home/steam/pavlovserver/PavlovServer.sh&lt;br /&gt;
&lt;br /&gt;
RestartSec=1&lt;br /&gt;
Restart=always&lt;br /&gt;
User=steam&lt;br /&gt;
Group=steam&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy = multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you'd like your server to start as competitive without editing the game.ini, change the line &amp;quot;ExecStart=/home/steam/pavlovserver/PavlovServer.sh&amp;quot; to look like this below. Though it's much easier to just use the game.ini to enable competitive instead. &amp;lt;pre&amp;gt;ExecStart=/home/steam/pavlovserver/PavlovServer.sh -COMPETITIVE=1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Change the user or paths as appropriate. After saving the service file, to start, restart, stop, or monitor the server:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl start pavlovserver&lt;br /&gt;
sudo systemctl restart pavlovserver&lt;br /&gt;
sudo systemctl stop pavlovserver&lt;br /&gt;
sudo systemctl status pavlovserver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To view the logs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo journalctl -u pavlovserver&lt;br /&gt;
# to live-tail the logs&lt;br /&gt;
sudo journalctl -u pavlovserver -f&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want to run the pavlov server as soon as your server boots (e.g. a VPS you turn on and off), add pavlov as a startup service:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl enable pavlovserver&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Advanced Server Administration ==&lt;br /&gt;
&lt;br /&gt;
=== Running multiple servers on one host ===&lt;br /&gt;
&lt;br /&gt;
* Pavlovserver is functionally single-threaded (there are multiple threads, but the vast majority of work occurs in the primary one). Make sure you have # of pavlovservers + 1 CPU available. More CPUs= more servers. Faster CPU = more players.&lt;br /&gt;
* Make multiple server installs by defining a separate install dir for each server.&lt;br /&gt;
* Run each server with a unique port. eg: '''./PavlovServer.sh -PORT=&amp;quot;Desired Port&amp;quot;'''&lt;br /&gt;
* The Server will use the Desired Port and the Port 400 above (Example: You choose 8200 as Port. So Port 8600 will be used as well)&lt;br /&gt;
* If you are using RCON, each server will need a unique port defined in RconSettings.txt&lt;br /&gt;
* Ensure the ports are forwarded and opened in your firewall&lt;br /&gt;
&lt;br /&gt;
To duplicate directories:&lt;br /&gt;
&lt;br /&gt;
be in the steam home folder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp -r pavlovserver pavlovserver1&lt;br /&gt;
/home/steam/pavlovserver1/PavlovServer.sh -PORT=[Desired Port]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Starting server in competitive mode ===&lt;br /&gt;
Competitive mode will prevent dead teammates from being able to see the match, to prevent ghosting.&lt;br /&gt;
You can either enable this via Game.ini (described in Game.ini file), or using the -COMPETITIVE=1 parameter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/steam/pavlovserver1/PavlovServer.sh -COMPETITIVE=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Useful Linux Commands ===&lt;br /&gt;
List files / folders in directory, print current working directory, &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -la                                    #list files/directories along with authorities and ownership&lt;br /&gt;
pwd                                       #print working directory&lt;br /&gt;
sudo chown &amp;lt;owner&amp;gt; &amp;lt;file/directory&amp;gt;       #change owner of file/directory.  If root created something and you need to change it to steam&lt;br /&gt;
sudo chgrp &amp;lt;group&amp;gt; &amp;lt;file/directory&amp;gt;       #change group of file/directory.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Check if pavlov is running by checking process status.  If the only row you see is the grep command, pavlov server is not started.&lt;br /&gt;
&amp;lt;pre&amp;gt; ps -ef | grep pav &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sample output:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
steam      34044       1  0 16:52 ?        00:00:00 /bin/sh /home/steam/pavlovserver/PavlovServer.sh&lt;br /&gt;
steam      34066   34044 80 16:52 ?        00:00:04 /home/steam/pavlovserver/Pavlov/Binaries/Linux/PavlovServer&lt;br /&gt;
zombies+   34101   34013  0 16:52 pts/0    00:00:00 grep --color=auto pav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kill a process.  Note this command uses 34044, which is a process id from the command output above.&lt;br /&gt;
&amp;lt;pre&amp;gt; kill -9 34044           &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dump the log to the console so you can scroll through it:&lt;br /&gt;
&amp;lt;pre&amp;gt; cat /home/steam/pavlovserver/Pavlov/Saved/Logs/Pavlov.log &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Search the log for a string - replace my_string with case-sensitive string&lt;br /&gt;
&amp;lt;pre&amp;gt; cat /home/steam/pavlovserver/Pavlov/Saved/Logs/Pavlov.log | grep my_string &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Advanced Scripts For Server Management ==&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Auto-updating the server (PCVR only)''' ===&lt;br /&gt;
Assuming you have followed this guide and used the default paths, users, and install instructions, you can paste the following into your terminal to auto-update your Pavlov server:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; 'EOF' &amp;gt; $HOME/pavlov_daily_update_and_restart.sh&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
USER=&amp;quot;steam&amp;quot;&lt;br /&gt;
SERVICENAME=&amp;quot;pavlovserver.service&amp;quot;&lt;br /&gt;
INSTALLDIRNAME=&amp;quot;pavlovserver&amp;quot;&lt;br /&gt;
USERHOME=&amp;quot;/home/$USER&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;Beginning Pavlov VR update run on $(date)\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
systemctl stop &amp;quot;$SERVICENAME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
sudo -iu &amp;quot;$USER&amp;quot; &amp;quot;$USERHOME/Steam/steamcmd.sh&amp;quot; +login anonymous +force_install_dir &amp;quot;$USERHOME/$INSTALLDIRNAME&amp;quot; +app_update 622970 +exit&lt;br /&gt;
sudo -iu &amp;quot;$USER&amp;quot; &amp;quot;$USERHOME/Steam/steamcmd.sh&amp;quot; +login anonymous +app_update 1007 +quit&lt;br /&gt;
sudo -iu &amp;quot;$USER&amp;quot; cp &amp;quot;$USERHOME/Steam/steamapps/common/Steamworks SDK Redist/linux64/steamclient.so&amp;quot; &amp;quot;$USERHOME/.steam/sdk64/steamclient.so&amp;quot;&lt;br /&gt;
sudo -iu &amp;quot;$USER&amp;quot; cp &amp;quot;$USERHOME/Steam/steamapps/common/Steamworks SDK Redist/linux64/steamclient.so&amp;quot; &amp;quot;$USERHOME/pavlovserver/Pavlov/Binaries/Linux/steamclient.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
systemctl start &amp;quot;$SERVICENAME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;Ending Pavlov VR update run on $(date)\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
chmod +x $HOME/pavlov_daily_update_and_restart.sh&lt;br /&gt;
mkdir $HOME/pavlov_update_logs &amp;amp;&amp;amp; touch $HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log&lt;br /&gt;
CRONLINE=&amp;quot;00 2 * * * $HOME/pavlov_daily_update_and_restart.sh &amp;gt;&amp;gt;$HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log 2&amp;gt;&amp;amp;1&amp;quot;&lt;br /&gt;
(sudo crontab -u root -l; echo &amp;quot;$CRONLINE&amp;quot; ) | sudo crontab -u root -&lt;br /&gt;
unset CRONLINE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These commands will:&lt;br /&gt;
&lt;br /&gt;
1. Create a shell script in the &amp;quot;steam&amp;quot; user's home directory that automatically stops the Pavlov server, pulls any updates via steam, pull updates to the Steamworks SDK Redist, and copies the latest version of steamclient.so to the Pavlov server directory&lt;br /&gt;
&lt;br /&gt;
2. Make the shell script executable&lt;br /&gt;
&lt;br /&gt;
3. Create a new directory called &amp;quot;pavlov_update_logs&amp;quot; in the &amp;quot;steam&amp;quot; user's directory, and create a logfile inside that directory called &amp;quot;pavlov_daily_update_and_restart.sh.log&amp;quot;. You can check this logfile to see the output of the Pavlov and Steam SDK update commands.&lt;br /&gt;
&lt;br /&gt;
4. Create a crontab entry for the root user that runs this shell script automatically every day at 2:00AM local time&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you want to change the time that this script runs, edit the numbers &amp;quot;00 2&amp;quot; in the line that starts with &amp;quot;CRONLINE=&amp;quot;. In the example provided, 00 is the minutes column, and 2 is the hour column. For example, if you wanted the server to automatically update and restart at 4:17AM every day, change the line starting with &amp;quot;CRONLINE=&amp;quot; to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CRONLINE=&amp;quot;17 4 * * * $HOME/pavlov_daily_update_and_restart.sh &amp;gt;&amp;gt;$HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log 2&amp;gt;&amp;amp;1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the time is PM, use 24-hour time format, e.g. &amp;quot;32 18&amp;quot; for 6:32PM.&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
=== '''Save Logs for records and stats''' ===&lt;br /&gt;
this is an automated script that will on a timer save all the backups made by the server before they are purged by the game for admin records and starts collection&lt;br /&gt;
&lt;br /&gt;
https://github.com/JTWP-org/backUpLogs2&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Make an API request with Mod.io to get map picture and name''' ===&lt;br /&gt;
very basic script pass the script a map ID as an argument then it will give u the name and a thumbnail to use &lt;br /&gt;
&lt;br /&gt;
https://github.com/JTWP-org/mod.io-modcheck/tree/main&lt;br /&gt;
&lt;br /&gt;
=== '''Sharing Bans over gameserver on same machine''' ===&lt;br /&gt;
when you have a lot of servers keeping the bans synced can be a nightmare so using a symbolic link allows all the servers to use one file &lt;br /&gt;
&lt;br /&gt;
for this lets say I have pavlovserver000 and pavlovserver001 and they are located at /home/steam/pavlovserver000 and  /home/steam/pavlovserver001&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''step 1 will be to pick a blacklist to use as the new one and move it to a central location'' &lt;br /&gt;
 mkdir ~/shared ; mv /home/steam/pavlovserver000/Pavlov/Saved/Config/blacklist.txt ~/shared/blacklist.txt ; rm /home/steam/pavlovserver001/Pavlov/Saved/Config/blacklist.txt&lt;br /&gt;
now we have moved the blacklist from pavlovserver000 to a folder in our home called shared and then we removed the blacklist from pavlovserver001 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
step 2 making the links &lt;br /&gt;
 ln -s ~/shared/blacklist.txt /home/steam/pavlovserver000/Pavlov/Saved/Config/blacklist.txt ; ln -s ~/shared/blacklist.txt /home/steam/pavlovserver001/Pavlov/Saved/Config/blacklist.txt&lt;br /&gt;
now editing them in pavlovserver001's files will update the list for all of the servers it's not a sync its uses the same list if you want to check where a link is pointed if u &lt;br /&gt;
 ls -l&lt;br /&gt;
It will show where the file is really located &amp;lt;hr&amp;gt;&lt;br /&gt;
=== Interactive Update ALL ===&lt;br /&gt;
will find all server installs on machine and update them will update Ubuntu check what version and do correct updates for that version also UPDATE 29 PCVR STEP  then it will list each server by server name and ask what type it is and then it will update and move to the next&lt;br /&gt;
&lt;br /&gt;
https://github.com/JTWP-org/Pavlov-updateallservers/tree/main&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== getting map info with just the UGC ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
you will need to get a API key from mod.io for this ... running this bash script and passing a UGC number to it will return the map name  mod.io url and a thumbnail &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
HOW TO USE &amp;lt;pre&amp;gt;nano get-map.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
then enter this script &amp;lt;pre&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
ugc=000000&lt;br /&gt;
&lt;br /&gt;
gameID=3959 #PAVLOV IS 3959&lt;br /&gt;
&lt;br /&gt;
api-path=&amp;quot;https://u-*ID NUMBER*.modapi.io/v1&amp;quot; #get on thhe access tab in mod.io settings&lt;br /&gt;
&lt;br /&gt;
api-key=&amp;quot;&amp;quot; #get on thhe access tab in mod.io settings&lt;br /&gt;
&lt;br /&gt;
curl -X GET &amp;quot;${api-path}/v1/games/${gameID}/mods/$(&amp;quot;${ugc:3})?api_key=${api-key}&amp;quot;   -H 'Accept: application/json' | jq  '.logo.thumb_1280x720, .name , .profile_url&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then give script perms to run &amp;lt;pre&amp;gt;sudo chmod +x get-map.sh&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
and then run it like this &lt;br /&gt;
&amp;lt;pre&amp;gt;bash get-map.sh UGC3409480   &amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=996</id>
		<title>PC Mod Managers</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=996"/>
		<updated>2024-04-29T13:56:11Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you want to manage and update your content for Pavlov on PC you can use these external clients to manage, download, and update your content.&lt;br /&gt;
&lt;br /&gt;
=== Generating a Mod.io OAuth Token ===&lt;br /&gt;
To acquire a Mod.io OAuth Token, navigate to https://mod.io/me/access and give the token a name. Ensure the token has Read+Write access if you want to get the most out of the mod downloader's functionality.&lt;br /&gt;
&lt;br /&gt;
[[File:Authtoken1.png|left|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Press the + button to generate the new token string.  As the warning suggests, you will only be able to view this string once so save it if you know the mod downloader installation may change. The token will become inactive after one year so your new token will not last forever. Tokens can be freely generated if you need a new one, delete any token you are not using when possible. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Pasted image 20240423200855.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Each mod downloader has a method for taking the Mod.io auth token. Follow the setup instructions on the README page of the downloader for further instruction.&lt;br /&gt;
&lt;br /&gt;
= Mod Managers =&lt;br /&gt;
&lt;br /&gt;
=== DownloadPavlovMapsFromModIO by RainOrigami ===&lt;br /&gt;
.Net6 based command line download tool. This tool will download and update your subscribed Mod.io Pavlov VR mods and also existing mods you have already downloaded.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/RainOrigami/DownloadPavlovMapsFromModIo &lt;br /&gt;
&lt;br /&gt;
===   '''PyPavlovUpdater''' by TotalJTM ===&lt;br /&gt;
[[File:PyPavlovUpdater.png|left|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:PyPavlovUpdater2.png|left|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Python based GUI tool to update out-of-date mods, install mods not installed, subscribe to mods you have used but have not subscribed to, and view the mods you have installed (with a filter) without needing to open Mod.io in a browser. To use this program, download the executable from the 'Releases' page, put it in a folder somewhere on your computer (not the Pavlov mod directory) and run the executable. If running for the first time, input your API key in the 'Options' menu. Then you can use the 'Download' menu to update your mod directory or subscribe to mods. Use the 'Subscribed Mods' menu to view your subscribed mods. Find new mods in the 'Full Mods' menu.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/TotalJTM/PyPavlovUpdater&lt;br /&gt;
&lt;br /&gt;
===  '''Pavlov map manager''' '''by Rumrobot''' ===&lt;br /&gt;
[[File:PavlovMapManager.png|left|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Javascript based GUI mod/map downloader.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/Rumrobot/pavlov-map-manager/&lt;br /&gt;
&lt;br /&gt;
=== Pavlov mod manager by Aptimex ===&lt;br /&gt;
Python based command line download tool.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/Aptimex/pavlov-mod-manager &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=995</id>
		<title>PC Mod Managers</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=995"/>
		<updated>2024-04-29T13:54:47Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you want to manage and update your content for Pavlov on PC you can use these external clients to manage, download, and update your content.&lt;br /&gt;
&lt;br /&gt;
=== Generating a Mod.io OAuth Token ===&lt;br /&gt;
To acquire a Mod.io OAuth Token, navigate to https://mod.io/me/access and give the token a name. Ensure the token has Read+Write access if you want to get the most out of the mod downloader's functionality.&lt;br /&gt;
&lt;br /&gt;
[[File:Authtoken1.png|left|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Press the + button to generate the new token string.  As the warning suggests, you will only be able to view this string once so save it if you know the mod downloader installation may change. The token will become inactive after one year so your new token will not last forever. Tokens can be freely generated if you need a new one, delete any token you are not using when possible. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Pasted image 20240423200855.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Each mod downloader has a method for taking the Mod.io auth token. Follow the setup instructions on the README page of the downloader for further instruction.&lt;br /&gt;
&lt;br /&gt;
= Mod Managers =&lt;br /&gt;
&lt;br /&gt;
=== DownloadPavlovMapsFromModIO by RainOrigami ===&lt;br /&gt;
.Net6 based command line download tool. This tool will download and update your subscribed Mod.io Pavlov VR mods and also existing mods you have already downloaded.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/RainOrigami/DownloadPavlovMapsFromModIo &lt;br /&gt;
&lt;br /&gt;
===   '''PyPavlovUpdater''' by TotalJTM ===&lt;br /&gt;
[[File:PyPavlovUpdater.png|left|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:PyPavlovUpdater2.png|left|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Python based GUI tool to update out-of-date mods, install mods not installed, subscribe to mods you have used but have not subscribed to, and view the mods you have installed (with a filter) without needing to open Mod.io in a browser. To use this program, download the executable from the 'Releases' page, put it in a folder somewhere on your computer (not the Pavlov mod directory) and run the executable. If running for the first time, input your API key in the 'Options' menu. Then you can use the 'Download' menu to update your mod directory or subscribe to mods. Use the 'Subscribed Mods' menu to view your subscribed mods. Find new mods in the 'Full Mods' menu.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/TotalJTM/PyPavlovUpdater&lt;br /&gt;
&lt;br /&gt;
===  '''Pavlov map manager''' '''by Rumrobot''' ===&lt;br /&gt;
[[File:PavlovMapManager.png|left|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Javascript based GUI mod/map downloader.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/Rumrobot/pavlov-map-manager/&lt;br /&gt;
&lt;br /&gt;
=== Pavlov mod manager by Aptimex ===&lt;br /&gt;
Python based command line download tool.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/Aptimex/pavlov-mod-manager &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=994</id>
		<title>PC Mod Managers</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=994"/>
		<updated>2024-04-29T13:53:51Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you want to manage and update your content for Pavlov on PC you can use these external clients to manage, download, and update your content.&lt;br /&gt;
&lt;br /&gt;
=== Generating a Mod.io OAuth Token ===&lt;br /&gt;
To acquire a Mod.io OAuth Token, navigate to https://mod.io/me/access and give the token a name. Ensure the token has Read+Write access if you want to get the most out of the mod downloader's functionality.&lt;br /&gt;
&lt;br /&gt;
[[File:Authtoken1.png|left|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Press the + button to generate the new token string.  As the warning suggests, you will only be able to view this string once so save it if you know the mod downloader installation may change. The token will become inactive after one year so your new token will not last forever. Tokens can be freely generated if you need a new one, delete any token you are not using when possible. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Pasted image 20240423200855.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Each mod downloader has a method for taking the Mod.io auth token. Follow the setup instructions on the README page of the downloader for further instruction.&lt;br /&gt;
&lt;br /&gt;
= Mod Managers =&lt;br /&gt;
&lt;br /&gt;
=== DownloadPavlovMapsFromModIO by RainOrigami ===&lt;br /&gt;
.Net6 based command line download tool. This tool will download and update your subscribed Mod.io Pavlov VR mods and also existing mods you have already downloaded.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/RainOrigami/DownloadPavlovMapsFromModIo &lt;br /&gt;
&lt;br /&gt;
===   '''PyPavlovUpdater''' by TotalJTM ===&lt;br /&gt;
[[File:PyPavlovUpdater.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:PyPavlovUpdater2.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Python based GUI tool to update out-of-date mods, install mods not installed, subscribe to mods you have used but have not subscribed to, and view the mods you have installed (with a filter) without needing to open Mod.io in a browser. To use this program, download the executable from the 'Releases' page, put it in a folder somewhere on your computer (not the Pavlov mod directory) and run the executable. If running for the first time, input your API key in the 'Options' menu. Then you can use the 'Download' menu to update your mod directory or subscribe to mods. Use the 'Subscribed Mods' menu to view your subscribed mods. Find new mods in the 'Full Mods' menu. &lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/TotalJTM/PyPavlovUpdater&lt;br /&gt;
&lt;br /&gt;
===  '''Pavlov map manager''' '''by Rumrobot''' ===&lt;br /&gt;
[[File:PavlovMapManager.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Javascript based GUI mod/map downloader.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/Rumrobot/pavlov-map-manager/&lt;br /&gt;
&lt;br /&gt;
=== Pavlov mod manager by Aptimex ===&lt;br /&gt;
Python based command line download tool.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/Aptimex/pavlov-mod-manager &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=993</id>
		<title>PC Mod Managers</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=993"/>
		<updated>2024-04-29T13:52:46Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you want to manage and update your content for Pavlov on PC you can use these external clients to manage, download, and update your content.&lt;br /&gt;
&lt;br /&gt;
=== Generating a Mod.io OAuth Token ===&lt;br /&gt;
To acquire a Mod.io OAuth Token, navigate to https://mod.io/me/access and give the token a name. Ensure the token has Read+Write access if you want to get the most out of the mod downloader's functionality.&lt;br /&gt;
&lt;br /&gt;
[[File:Authtoken1.png|left|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Press the + button to generate the new token string.  As the warning suggests, you will only be able to view this string once so save it if you know the mod downloader installation may change. The token will become inactive after one year so your new token will not last forever. Tokens can be freely generated if you need a new one, delete any token you are not using when possible. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Pasted image 20240423200855.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Each mod downloader has a method for taking the Mod.io auth token. Follow the setup instructions on the README page of the downloader for further instruction.&lt;br /&gt;
&lt;br /&gt;
= Mod Managers =&lt;br /&gt;
&lt;br /&gt;
=== DownloadPavlovMapsFromModIO by RainOrigami ===&lt;br /&gt;
.Net6 based command line download tool. This tool will download and update your subscribed Mod.io Pavlov VR mods and also existing mods you have already downloaded.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/RainOrigami/DownloadPavlovMapsFromModIo &lt;br /&gt;
&lt;br /&gt;
===   '''PyPavlovUpdater''' by TotalJTM ===&lt;br /&gt;
[[File:PyPavlovUpdater.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:PyPavlovUpdater2.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Python based GUI tool to update out-of-date mods, install mods not installed, subscribe to mods you have used but have not subscribed to, and view the mods you have installed (with a filter) without needing to open Mod.io in a browser. To use this program, download the executable from the 'Releases' page, put it in a folder somewhere on your computer (not the Pavlov mod directory) and run the executable. If running for the first time, input your API key in the 'Options' menu. Then you can use the 'Download' menu to update your mod directory or subscribe to mods. Use the 'Subscribed Mods' menu to view your subscribed mods. Find new mods in the 'Full Mods' menu. &lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/TotalJTM/PyPavlovUpdater&lt;br /&gt;
&lt;br /&gt;
===  '''Pavlov map manager''' '''by Rumrobot''' ===&lt;br /&gt;
[[File:PavlovMapManager.png|left|thumb]]Javascript based GUI mod/map downloader.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/Rumrobot/pavlov-map-manager/&lt;br /&gt;
&lt;br /&gt;
=== Pavlov mod manager by Aptimex ===&lt;br /&gt;
Python based command line download tool.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/Aptimex/pavlov-mod-manager &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=992</id>
		<title>PC Mod Managers</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=992"/>
		<updated>2024-04-29T13:52:11Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you want to manage and update your content for Pavlov on PC you can use these external clients to manage, download, and update your content.&lt;br /&gt;
&lt;br /&gt;
=== Generating a Mod.io OAuth Token ===&lt;br /&gt;
To acquire a Mod.io OAuth Token, navigate to https://mod.io/me/access and give the token a name. Ensure the token has Read+Write access if you want to get the most out of the mod downloader's functionality.&lt;br /&gt;
&lt;br /&gt;
[[File:Authtoken1.png|left|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Press the + button to generate the new token string.  As the warning suggests, you will only be able to view this string once so save it if you know the mod downloader installation may change. The token will become inactive after one year so your new token will not last forever. Tokens can be freely generated if you need a new one, delete any token you are not using when possible. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Pasted image 20240423200855.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Each mod downloader has a method for taking the Mod.io auth token. Follow the setup instructions on the README page of the downloader for further instruction.&lt;br /&gt;
&lt;br /&gt;
= Mod Managers =&lt;br /&gt;
&lt;br /&gt;
=== DownloadPavlovMapsFromModIO by RainOrigami ===&lt;br /&gt;
.Net6 based command line download tool. This tool will download and update your subscribed Mod.io Pavlov VR mods and also existing mods you have already downloaded.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/RainOrigami/DownloadPavlovMapsFromModIo &lt;br /&gt;
&lt;br /&gt;
===   '''PyPavlovUpdater''' by TotalJTM ===&lt;br /&gt;
[[File:PyPavlovUpdater.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:PyPavlovUpdater2.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Python based GUI tool to update out-of-date mods, install mods not installed, subscribe to mods you have used but have not subscribed to, and view the mods you have installed (with a filter) without needing to open Mod.io in a browser. To use this program, download the executable from the 'Releases' page, put it in a folder somewhere on your computer (not the Pavlov mod directory) and run the executable. If running for the first time, input your API key in the 'Options' menu. Then you can use the 'Download' menu to update your mod directory or subscribe to mods. Use the 'Subscribed Mods' menu to view your subscribed mods. Find new mods in the 'Full Mods' menu. &lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/TotalJTM/PyPavlovUpdater&lt;br /&gt;
&lt;br /&gt;
===  '''Pavlov map manager''' '''by Rumrobot''' ===&lt;br /&gt;
[[File:PavlovMapManager.png|left|thumb]]Javascript based GUI mod/map downloader.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/Rumrobot/pavlov-map-manager/&lt;br /&gt;
&lt;br /&gt;
=== Pavlov mod manager by Aptimex ===&lt;br /&gt;
Python based command line download tool.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/Aptimex/pavlov-mod-manager &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=991</id>
		<title>PC Mod Managers</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=991"/>
		<updated>2024-04-29T13:51:50Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you want to manage and update your content for Pavlov on PC you can use these external clients to manage, download, and update your content.&lt;br /&gt;
&lt;br /&gt;
=== Generating a Mod.io OAuth Token ===&lt;br /&gt;
To acquire a Mod.io OAuth Token, navigate to https://mod.io/me/access and give the token a name. Ensure the token has Read+Write access if you want to get the most out of the mod downloader's functionality.&lt;br /&gt;
&lt;br /&gt;
[[File:Authtoken1.png|left|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Press the + button to generate the new token string.  As the warning suggests, you will only be able to view this string once so save it if you know the mod downloader installation may change. The token will become inactive after one year so your new token will not last forever. Tokens can be freely generated if you need a new one, delete any token you are not using when possible. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Pasted image 20240423200855.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Each mod downloader has a method for taking the Mod.io auth token. Follow the setup instructions on the README page of the downloader for further instruction.&lt;br /&gt;
&lt;br /&gt;
= Mod Managers =&lt;br /&gt;
&lt;br /&gt;
=== DownloadPavlovMapsFromModIO by RainOrigami ===&lt;br /&gt;
.Net6 based command line download tool. This tool will download and update your subscribed Mod.io Pavlov VR mods and also existing mods you have already downloaded.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/RainOrigami/DownloadPavlovMapsFromModIo &lt;br /&gt;
&lt;br /&gt;
===   '''PyPavlovUpdater''' by TotalJTM ===&lt;br /&gt;
[[File:PyPavlovUpdater.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:PyPavlovUpdater2.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Python based GUI tool to update out-of-date mods, install mods not installed, subscribe to mods you have used but have not subscribed to, and view the mods you have installed (with a filter) without needing to open Mod.io in a browser. To use this program, download the executable from the 'Releases' page, put it in a folder somewhere on your computer (not the Pavlov mod directory) and run the executable. If running for the first time, input your API key in the 'Options' menu. Then you can use the 'Download' menu to update your mod directory or subscribe to mods. Use the 'Subscribed Mods' menu to view your subscribed mods. Find new mods in the 'Full Mods' menu. &lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/TotalJTM/PyPavlovUpdater&lt;br /&gt;
&lt;br /&gt;
===  '''Pavlov map manager''' '''by Rumrobot''' ===&lt;br /&gt;
[[File:PavlovMapManager.png|left|thumb]]Javascript based GUI mod/map downloader.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/Rumrobot/pavlov-map-manager/&lt;br /&gt;
&lt;br /&gt;
=== Pavlov mod manager by Aptimex ===&lt;br /&gt;
Python based command line download tool.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/Aptimex/pavlov-mod-manager &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=990</id>
		<title>PC Mod Managers</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=990"/>
		<updated>2024-04-29T13:51:21Z</updated>

		<summary type="html">&lt;p&gt;Junt: more details, generating auth tokens, added more downloaders&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you want to manage and update your content for Pavlov on PC you can use these external clients to manage, download, and update your content.&lt;br /&gt;
&lt;br /&gt;
=== Generating a Mod.io OAuth Token ===&lt;br /&gt;
To acquire a Mod.io OAuth Token, navigate to https://mod.io/me/access and give the token a name. Ensure the token has Read+Write access if you want to get the most out of the mod downloader's functionality.&lt;br /&gt;
&lt;br /&gt;
[[File:Authtoken1.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Press the + button to generate the new token string.  As the warning suggests, you will only be able to view this string once so save it if you know the mod downloader installation may change. The token will become inactive after one year so your new token will not last forever. Tokens can be freely generated if you need a new one, delete any token you are not using when possible. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Pasted image 20240423200855.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Each mod downloader has a method for taking the Mod.io auth token. Follow the setup instructions on the README page of the downloader for further instruction.&lt;br /&gt;
&lt;br /&gt;
= Mod Managers =&lt;br /&gt;
&lt;br /&gt;
=== DownloadPavlovMapsFromModIO by RainOrigami ===&lt;br /&gt;
.Net6 based command line download tool. This tool will download and update your subscribed Mod.io Pavlov VR mods and also existing mods you have already downloaded.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/RainOrigami/DownloadPavlovMapsFromModIo &lt;br /&gt;
&lt;br /&gt;
===   '''PyPavlovUpdater''' by TotalJTM ===&lt;br /&gt;
[[File:PyPavlovUpdater.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:PyPavlovUpdater2.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Python based GUI tool to update out-of-date mods, install mods not installed, subscribe to mods you have used but have not subscribed to, and view the mods you have installed (with a filter) without needing to open Mod.io in a browser. To use this program, download the executable from the 'Releases' page, put it in a folder somewhere on your computer (not the Pavlov mod directory) and run the executable. If running for the first time, input your API key in the 'Options' menu. Then you can use the 'Download' menu to update your mod directory or subscribe to mods. Use the 'Subscribed Mods' menu to view your subscribed mods. Find new mods in the 'Full Mods' menu. &lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/TotalJTM/PyPavlovUpdater&lt;br /&gt;
&lt;br /&gt;
===  '''Pavlov map manager''' '''by Rumrobot''' ===&lt;br /&gt;
[[File:PavlovMapManager.png|left|thumb]]Javascript based GUI mod/map downloader.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/Rumrobot/pavlov-map-manager/&lt;br /&gt;
&lt;br /&gt;
=== Pavlov mod manager by Aptimex ===&lt;br /&gt;
Python based command line download tool.&lt;br /&gt;
&lt;br /&gt;
Link: https://github.com/Aptimex/pavlov-mod-manager &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=File:Pasted_image_20240423200855.png&amp;diff=989</id>
		<title>File:Pasted image 20240423200855.png</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=File:Pasted_image_20240423200855.png&amp;diff=989"/>
		<updated>2024-04-29T13:47:50Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;auth token2&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=File:Authtoken1.png&amp;diff=988</id>
		<title>File:Authtoken1.png</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=File:Authtoken1.png&amp;diff=988"/>
		<updated>2024-04-29T13:47:12Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;mod manager tool auth token&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Main_Page&amp;diff=987</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Main_Page&amp;diff=987"/>
		<updated>2024-04-23T19:41:13Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Welcome to the Pavlov VR Wiki. &amp;lt;br /&amp;gt;&lt;br /&gt;
Pavlov is a team-based multiplayer VR shooter game with realistic weapon handling and the most popular VR shooter of all time. Play a variety of game modes with over 65 interactable weapons and attachments in various environments. &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Pavlov has an active Discord. You can join the Pavlov VR Discord here: https://discord.com/invite/pavlov-vr&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GET PAVLOV ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://store.steampowered.com/app/555160/Pavlov_VR/ PC]&lt;br /&gt;
| Pavlov is available on PCVR through Steam&lt;br /&gt;
|-&lt;br /&gt;
| [https://www.meta.com/en-gb/experiences/2443267419018232/ QUEST]&lt;br /&gt;
| Pavlov is available on Quest through the Oculus AppLab program with a store release planned on Nov 14th 2023&lt;br /&gt;
|-&lt;br /&gt;
| [https://store.playstation.com/en-us/concept/10005322 PS5]&lt;br /&gt;
| Pavlov is available on the Playstation Store &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HELP/TROUBLESHOOTING ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''[[PC Troubleshooting|PC Troubleshooting]]'''&lt;br /&gt;
| Troubleshoot some of the issues related to Pavlov on PC&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Quest Troubleshooting|Quest Troubleshooting]]'''&lt;br /&gt;
| Troubleshoot some of the issues related to Pavlov Shack on Quest&lt;br /&gt;
|-&lt;br /&gt;
| '''[[PS5 Troubleshooting|PS5 Troubleshooting]]'''&lt;br /&gt;
| Troubleshoot some of the issues related to the PSVR2 version of pavlov&lt;br /&gt;
|-&lt;br /&gt;
| [https://discord.com/invite/pavlov-vr Contact Support]&lt;br /&gt;
| The Pavlov VR Discord is the main place to ask questions and get troubleshooting help. If you don't have discord you can also reach support at support@vankrupt.com.&lt;br /&gt;
|-&lt;br /&gt;
| [https://www.vankrupt.com/#contact Jobs]&lt;br /&gt;
| Vankrupt Games is hiring. If you are looking for work please email jobs@vankrupt.com. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GAME INFORMATION ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Weapons|Weapons]]'''&lt;br /&gt;
| List and information on the weapons of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Vehicles|Vehicles]]'''&lt;br /&gt;
| List and information on the vehicles of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Attachments|Attachments]]'''&lt;br /&gt;
| List and information on the Attachments of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Default Maps|Default Maps]]'''&lt;br /&gt;
| List, Pictures and information on the Default maps of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Gamemodes|Game Modes]]'''&lt;br /&gt;
| List and information on the game modes of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Achievements|Achievements]]'''&lt;br /&gt;
| List and information on the achievements of Pavlov VR available on the PS5 version&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Update Changelog|Update Changelog]]'''&lt;br /&gt;
| A history of changes made to the game&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Game Settings|Game Settings]]'''&lt;br /&gt;
| List and information on the game settings&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== WORKSHOP/MAPMAKING/MODDING ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/vankruptgames/PavlovVR-ModKit/tree/5.1.1 Modkit 5.1.1]&lt;br /&gt;
| Current official PCVR Modkit for UE 5.1.1&lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/vankruptgames/PavlovVR-ModKit/tree/Pavlov-Shack Shack Modkit]&lt;br /&gt;
|Current official Shack Modkit for UE 5.1.1&lt;br /&gt;
|-&lt;br /&gt;
|[[PC Mod Managers|'''3rd Party Mod Managers''']]&lt;br /&gt;
|(PC Only) Update, Download, or Remove mods outside of the game&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Getting Started|Getting Started]]'''&lt;br /&gt;
| A basic Tutorial on how to download and set up the Editor, create your first level and upload it&lt;br /&gt;
|-&lt;br /&gt;
| '''[[ItemIDs|ItemIDs]]'''&lt;br /&gt;
| All of the items in the game&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Community Modkit Tools|Community Modkit Tools]]'''&lt;br /&gt;
| Community made tools for map makers&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Community Gamemodes|Community Gamemodes]]'''&lt;br /&gt;
| Community made game modes&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Workshop troubleshooting|Workshop troubleshooting]]'''&lt;br /&gt;
| Troubleshoot common mistakes with workshop projects&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Helpful Videos|Helpful Videos]]'''&lt;br /&gt;
| Video Tutorials&lt;br /&gt;
|-&lt;br /&gt;
|'''[[Making Skins]]'''&lt;br /&gt;
|Creating weapon and player model skins for Pavlov&lt;br /&gt;
|-&lt;br /&gt;
|'''[[Custom Guns]]'''&lt;br /&gt;
|How to use the modkit to add custom weapons to your level&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== WORKSHOP GUIDES ====&lt;br /&gt;
&lt;br /&gt;
| '''[[Changing the character model|Changing the character model]]'''&lt;br /&gt;
| A guide on replacing character models with your own&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Replacing the scoreboard|Replacing the scoreboard]]'''&lt;br /&gt;
| How to replace the scoreboard with your own, or turn it into a custom menu&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Modeling in Blender]]'''&lt;br /&gt;
| A quick tip sheet for using Blender to model in Unreal Engine&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Bot Navigation|Bot Navigation]]'''&lt;br /&gt;
| A more detailed topic about Bot Navigation and tips for your custom maps&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== COMMUNITY SERVERS ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Setting up a dedicated server|Setting up a dedicated server]]'''&lt;br /&gt;
| A guide and information on setting up a community server&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Troubleshooting Servers|Troubleshooting Servers]]'''&lt;br /&gt;
| Troubleshooting steps to help with setting up a community server. &lt;br /&gt;
|-&lt;br /&gt;
|[[Hosting Providers]]&lt;br /&gt;
|If you wish to purchase a Pavlov server instead of setting it up yourself here is a list of hosting providers&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Rcon Overview and Commands|Rcon Overview and Commands]]'''&lt;br /&gt;
| RCON (Remote CONnection) is a tool that allows server owners to manage their server and do things like spawn items. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OTHER TOPICS ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''[[PAV TV|PAV TV]]'''&lt;br /&gt;
| Current official game modes and how to play them&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=986</id>
		<title>PC Mod Managers</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=986"/>
		<updated>2024-04-23T19:39:09Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you want to manage and update your content for Pavlov on PC you can use these external clients to manage, download, and update your content.&lt;br /&gt;
&lt;br /&gt;
===   '''PyPavlovUpdater''' by TotalJTM ===&lt;br /&gt;
https://github.com/TotalJTM/PyPavlovUpdater&lt;br /&gt;
[[File:PyPavlovUpdater.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:PyPavlovUpdater2.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  '''Pavlov map manager''' '''by Rumrobot''' ===&lt;br /&gt;
https://github.com/Rumrobot/pavlov-map-manager/&lt;br /&gt;
[[File:PavlovMapManager.png|left|thumb]]&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=985</id>
		<title>PC Mod Managers</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=985"/>
		<updated>2024-04-23T19:38:19Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you want to manage and update your content for Pavlov on PC you can use these external clients to manage, download, and update your content.&lt;br /&gt;
&lt;br /&gt;
===   '''PyPavlovUpdater''' by TotalJTM ===&lt;br /&gt;
https://github.com/TotalJTM/PyPavlovUpdater&lt;br /&gt;
[[File:PyPavlovUpdater.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:PyPavlovUpdater2.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  '''Pavlov map manager''' '''by Rumrobot''' ===&lt;br /&gt;
https://github.com/Rumrobot/pavlov-map-manager/&lt;br /&gt;
[[File:PavlovMapManager.png|left|thumb]]&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=984</id>
		<title>PC Mod Managers</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=984"/>
		<updated>2024-04-23T19:37:51Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you want to manage and update your content for Pavlov on PC you can use these external clients to manage, download, and update your content.&lt;br /&gt;
&lt;br /&gt;
===   '''PyPavlovUpdater''' by TotalJTM ===&lt;br /&gt;
https://github.com/TotalJTM/PyPavlovUpdater&lt;br /&gt;
[[File:PyPavlovUpdater.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:PyPavlovUpdater2.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===  '''Pavlov map manager''' '''by Rumrobot''' ===&lt;br /&gt;
https://github.com/Rumrobot/pavlov-map-manager/&lt;br /&gt;
[[File:PavlovMapManager.png|left|thumb]]&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=983</id>
		<title>PC Mod Managers</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=983"/>
		<updated>2024-04-23T19:37:03Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you want to manage and update your content for Pavlov on PC you can use these external clients to manage, download, and update your content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''PyPavlovUpdater''' by TotalJTM&lt;br /&gt;
&lt;br /&gt;
https://github.com/TotalJTM/PyPavlovUpdater&lt;br /&gt;
[[File:PyPavlovUpdater.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:PyPavlovUpdater2.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[pb]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pavlov map manager''' by Rumrobot&lt;br /&gt;
&lt;br /&gt;
https://github.com/Rumrobot/pavlov-map-manager/&lt;br /&gt;
[[File:PavlovMapManager.png|left|thumb]]&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=982</id>
		<title>PC Mod Managers</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=982"/>
		<updated>2024-04-23T19:35:55Z</updated>

		<summary type="html">&lt;p&gt;Junt: Page Break&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you want to manage and update your content for Pavlov on PC you can use these external clients to manage, download, and update your content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''PyPavlovUpdater''' by TotalJTM&lt;br /&gt;
&lt;br /&gt;
https://github.com/TotalJTM/PyPavlovUpdater&lt;br /&gt;
[[File:PyPavlovUpdater.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:PyPavlovUpdater2.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pavlov map manager''' by Rumrobot&lt;br /&gt;
&lt;br /&gt;
https://github.com/Rumrobot/pavlov-map-manager/&lt;br /&gt;
[[File:PavlovMapManager.png|left|thumb]]&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=981</id>
		<title>PC Mod Managers</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=PC_Mod_Managers&amp;diff=981"/>
		<updated>2024-04-23T19:35:16Z</updated>

		<summary type="html">&lt;p&gt;Junt: Added Mod Managers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you want to manage and update your content for Pavlov on PC you can use these external clients to manage, download, and update your content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''PyPavlovUpdater''' by TotalJTM&lt;br /&gt;
&lt;br /&gt;
https://github.com/TotalJTM/PyPavlovUpdater&lt;br /&gt;
[[File:PyPavlovUpdater.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:PyPavlovUpdater2.png|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pavlov map manager''' by Rumrobot&lt;br /&gt;
&lt;br /&gt;
https://github.com/Rumrobot/pavlov-map-manager/&lt;br /&gt;
[[File:PavlovMapManager.png|left|thumb]]&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=File:PyPavlovUpdater2.png&amp;diff=980</id>
		<title>File:PyPavlovUpdater2.png</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=File:PyPavlovUpdater2.png&amp;diff=980"/>
		<updated>2024-04-23T19:34:57Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Manage UGC&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=File:PyPavlovUpdater.png&amp;diff=979</id>
		<title>File:PyPavlovUpdater.png</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=File:PyPavlovUpdater.png&amp;diff=979"/>
		<updated>2024-04-23T19:34:24Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update and manage UGC&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=File:PavlovMapManager.png&amp;diff=978</id>
		<title>File:PavlovMapManager.png</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=File:PavlovMapManager.png&amp;diff=978"/>
		<updated>2024-04-23T19:33:36Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;From Rumrobot&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Quest_Troubleshooting&amp;diff=846</id>
		<title>Quest Troubleshooting</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Quest_Troubleshooting&amp;diff=846"/>
		<updated>2023-08-09T17:34:32Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:Capsule-game}}&lt;br /&gt;
&lt;br /&gt;
= What is &amp;quot;RC&amp;quot; and what is a Release Channel? =&lt;br /&gt;
RC is the channel name in the Meta Quest for the newest version of Pavlov Shack. RC stands for &amp;quot;Release Candidate&amp;quot; which is intended for store launch when Pavlov Shack becomes a monetized title. in the future.&lt;br /&gt;
&lt;br /&gt;
You will need to opt-in the &amp;quot;RC&amp;quot; Release Channel to play the newest version, eventually the main &amp;quot;live&amp;quot; channel will be merged with this update, but if you want to play earlier, you will need to Opt-in&lt;br /&gt;
&lt;br /&gt;
= How do I change the release channel for my version of the game? =&lt;br /&gt;
[[File:ReleaseChannelTutorial.png|thumb]]&lt;br /&gt;
Refer to picture on the right side of the page.&lt;br /&gt;
&lt;br /&gt;
= I am having trouble installing the update; it just keeps looping. =&lt;br /&gt;
If your update is looping on install, follow these steps '''in this specific order'''&lt;br /&gt;
&lt;br /&gt;
# If you are using more than once account on the same device make sure the alternative account is not using the other branches.&lt;br /&gt;
# Remove Appdata. Go to your oculus settings, click on Storage, find &amp;quot;Pavlov Shack Beta&amp;quot; and click on &amp;quot;Delete App Data&amp;quot;&lt;br /&gt;
# Uninstall the game completely&lt;br /&gt;
# Restart your HMD (Head-Mounted Display, also known as a Meta Quest)&lt;br /&gt;
# Install again&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the above doesn't work. Try to uninstall the game first, then connect your quest to a PC and explore the file manager to look for any leftover Pavlov content and remove them. Factory reset your quest as a last resort.&lt;br /&gt;
&lt;br /&gt;
= Crossplay with PC/PS5? =&lt;br /&gt;
No.&lt;br /&gt;
&lt;br /&gt;
= Why has [Feature] been removed? =&lt;br /&gt;
Hitting consistent performance quality has been paramount to this release. Moving to Unreal 5 has forced us to change the physics system to Chaos which is pretty fragile at this time. We may reintroduce or refactor removed features in the future to the best of our ability.&lt;br /&gt;
&lt;br /&gt;
= I'm a mod creator, how do I update my content? =&lt;br /&gt;
Download the new modkit here: https://github.com/vankruptgames/PavlovVR-ModKit/tree/5.1.1&lt;br /&gt;
&lt;br /&gt;
Check out our upgrade guide on Mod.io on the easiet way to move your content over and best practices&lt;br /&gt;
&lt;br /&gt;
https://mod.io/g/pavlov/r/421-to-511-upgrade-guide&lt;br /&gt;
&lt;br /&gt;
https://mod.io/g/pavlov/r/modkit-version-upgrade-best-practices-post-511&lt;br /&gt;
&lt;br /&gt;
==I can't start Pavlov, but other apps on my Quest starts fine.==&lt;br /&gt;
&lt;br /&gt;
Try resetting your Pavlov app data, by following the steps described in the following article: [[Quest: Delete Pavlov App data]]&lt;br /&gt;
&lt;br /&gt;
==Pavlov doesnt start, and it looks like the game keeps downloading without ever finishing.==&lt;br /&gt;
&lt;br /&gt;
Follow the instructions in the following Youtube video:&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=42DE74tOhGM&lt;br /&gt;
&lt;br /&gt;
==I can not switch back to live from RC?==&lt;br /&gt;
Sometimes the oculus software refuses to update and requires switching in the mobile app, then uninstalling and reinstalling Pavlov Shack.&lt;br /&gt;
&lt;br /&gt;
==My performance has randomly gotten worse when it was previously fine==&lt;br /&gt;
This sometimes occurs with poor cooling conditions. Shut the quest 2 off for a bit if it and allow it to cool off. Typically this only takes about ten minutes. Try again.&lt;br /&gt;
If cooling is not an option adjust scaling in the Pavlov setting accordingly&lt;br /&gt;
Close background apps, and try again.&lt;br /&gt;
&lt;br /&gt;
== My play area keeps turning each time I do something in Shack ==&lt;br /&gt;
Most of the time sleeping your headset or resetting your play area history can fix this. If it doesn't try restarting your headset completely.&lt;br /&gt;
&lt;br /&gt;
==None of the above helped? Ask for help on the official Pavlov Discord or email our support line.==&lt;br /&gt;
&lt;br /&gt;
https://discord.gg/pavlov-vr - our official discord&lt;br /&gt;
&lt;br /&gt;
Support@vankrupt.com - Our official support line.&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=File:ReleaseChannelTutorial.png&amp;diff=845</id>
		<title>File:ReleaseChannelTutorial.png</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=File:ReleaseChannelTutorial.png&amp;diff=845"/>
		<updated>2023-08-09T17:31:24Z</updated>

		<summary type="html">&lt;p&gt;Junt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ReleaseChannelTutorial&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Setting_up_a_dedicated_server&amp;diff=755</id>
		<title>Setting up a dedicated server</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Setting_up_a_dedicated_server&amp;diff=755"/>
		<updated>2023-06-28T13:47:01Z</updated>

		<summary type="html">&lt;p&gt;Junt: typo fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Setting up a dedicated server ==&lt;br /&gt;
&lt;br /&gt;
'''There are no Windows binaries''' &lt;br /&gt;
&lt;br /&gt;
This guide is written exclusively for Linux and covers Ubuntu/Debian/Debian-like and Red Hat RPM-based distros. Possible to run with other distros, but some of the commands won't work and you will need to know enough to figure out the software install of dependencies on your own. &lt;br /&gt;
&lt;br /&gt;
If you are considering hosting from home, please read that section of the wiki first. &lt;br /&gt;
&lt;br /&gt;
This guide assumes you know the basics of using a bash terminal: ssh'ing into a server, running bash commands, editing text files, etc.&lt;br /&gt;
&lt;br /&gt;
If you have no experience using bash, maybe start [https://www.howtogeek.com/140679/beginner-geek-how-to-start-using-the-linux-terminal/ here]. Editing text files via commandline is often a challenge. Suggest using nano and reading guide [https://www.howtogeek.com/howto/42980/the-beginners-guide-to-nano-the-linux-command-line-text-editor/ here]&lt;br /&gt;
&lt;br /&gt;
If you are new to linux and accessing your server from Windows, highly suggest using MobaXterm as your SSH client as that can make required editing of text files easier using built in editor instead of the native linux command line editors.&lt;br /&gt;
&lt;br /&gt;
And finally, ask yourself why you want to setup a server? If you look at the list, there are many, many more servers than players. If you don't have a team, discord community, or group of friends ready to play on your server, chances are it will go unused. Got one of these... great, let's go. &lt;br /&gt;
&lt;br /&gt;
If you don't want to go through the hassle yourself and want to pay for a hosting service Arctic VR (PC and Shack) and Horde (Shack) provide a server hosting services and are trusted in the community. See links below.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Server Requirements ===&lt;br /&gt;
&lt;br /&gt;
'''Pavlovserver can only be hosted under Linux.''' &lt;br /&gt;
&lt;br /&gt;
This can be running as a VM under windows, but this will increase the complexity of the setup beyond this guide. &lt;br /&gt;
&lt;br /&gt;
Ubuntu 18.04 x86_64, Ubuntu 19/04 amd64, Ubuntu 20.04, and Rocky Linux 8 are confirmed working. Ubuntu 15.04 x86 is known to fail to install using this guide. Recommend not running on &amp;quot;minimal&amp;quot; images as some tools are missing. &lt;br /&gt;
&lt;br /&gt;
* 2GB RAM + 1GB RAM per each additional server with 10 players. More RAM is recommended for larger maps, higher player counts, or complex gamemodes. Not having enough RAM is a common cause of server crashes.&lt;br /&gt;
&lt;br /&gt;
* A ~2.5Ghz CPU will comfortably support a 10 player server.&lt;br /&gt;
 &lt;br /&gt;
* A ~4Ghz CPU will comfortably support 24 players. This is a limit built into Pavlov itself, no server will allow players to join over 24. Lower player counts are recommended for complex gamemodes (E.g. CodZ) and/or highly detailed maps, so that maximum number will often be lower.&lt;br /&gt;
&lt;br /&gt;
(Note that these are '''not''' hard limits for player counts, just suggestions for the best performance, based on experiences with many server providers on different grades of hardware.)&lt;br /&gt;
 &lt;br /&gt;
* Pavlovserver is functionally single threaded (one thread does vast majority of work). More CPUs only help if you are running more servers. More clockspeed = higher performance = more users per server. &lt;br /&gt;
The maximum number of servers you can run is dependent on how many CPUs you have. For example, if you have an 8 core CPU, the maximum number of servers would be 7. You should always have at least one CPU free as overhead, as Pavlov servers can use slightly more than one thread.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Hosting at home ====&lt;br /&gt;
When hosting at home there are additional requirements regarding networking: Your router has to support port-forwarding, hair-pinning/LoopbackNAT, and respond to ping requests.  These techniques are necessary to allow your server to be found and to talk back to the client. please see https://en.wikipedia.org/wiki/Port_forwarding,  https://en.wikipedia.org/wiki/Hairpinning, and https://www.speedguide.net/faq/how-to-become-pingable-behind-a-routerfirewall-376 for more info and google for these terms in addition to your router model to find guides on how to enable/configure it properly. If you have modern Router, it may have these features already enabled, in this case you just have to configure port-forwarding. If you can see your server but not join it while others can, this is indicative of a failure of LoopbackNAT. &lt;br /&gt;
&lt;br /&gt;
A second challenge to hosting at home is CGNAT (Carrier grade NAT: https://www.a10networks.com/blog/carrier-grade-nat/). Just like NAT on your home network that has to be gotten around w/ port-forwarding, CGNAT breaks the ability of external connections to be made back to your server, but the controls are solely in your ISPs hands. Sometimes if you ask, you can be removed from CGNAT pools and/or assigned a static IP. CGNAT rollouts are becoming very common now, so if your server worked then doesn't allow connections now, your ISP may have made this change. &lt;br /&gt;
&lt;br /&gt;
You can check whether you’re on a CGNAT network by visiting a Web site such as ipaddress.com or whatsmyip.com and comparing the IP address listed to the public/WAN IP address assigned to your Internet gateway. To find your gateway’s public IP address, check the status page in the administrative interface. If the two IP addresses differ, you’re likely on a CGNAT network. If so, this problem must be resolved before you go any further. &lt;br /&gt;
&lt;br /&gt;
'''Not understanding these requirements and configuration is a frequent cause of failed setups and questions in discord. Don't skip this if you are trying to host from home'''&lt;br /&gt;
&lt;br /&gt;
'''There are serious security implications of hosting this software at home.''' None of the devs are security experts and there has been no security review of the code. You are opening up your system to the world and publicity advertising this fact. Expect that any system hosting this software is open to compromise from the Internet and act accordingly. If your router offers a DMZ network, use it. Consider hosting on a cloud based server and think twice before running this software on any system that contains data you care about or has access to networks and computers you care about.&lt;br /&gt;
&lt;br /&gt;
If you're hosting at home using Oracle's VirtualBox, there are steps you can take to prevent double NAT (which can cause issues later on)&lt;br /&gt;
&lt;br /&gt;
1. Select your VM and then click Settings in VirtualBox's main window.&lt;br /&gt;
&lt;br /&gt;
2. Click on Network and change Attached To from NAT to Bridged Adapter. &lt;br /&gt;
&lt;br /&gt;
Once you've done this, your VM should be connected directly to your home router and double NAT should no longer be a issue.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Starting Server Install ====&lt;br /&gt;
&lt;br /&gt;
====Obtaining an ApiKey====&lt;br /&gt;
For your server to show up in the server list, there is now a requirement to have an ApiKey issued by vankrupt. This is to prevent DOS attacks against the master server&lt;br /&gt;
&lt;br /&gt;
Get the key by going here: https://pavlov-ms.vankrupt.com/servers/v1/key and using your mobile number to get a SMS &lt;br /&gt;
(note that there have been reported failures of this SMS system for non-US mobiles. In this case DM davevillz your mobile and ask for a key)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Put this key in your Game.ini as follows:&lt;br /&gt;
    ApiKey=&amp;quot;ABC123FALSEKEYDONTUSEME&amp;quot;&lt;br /&gt;
or if you would like (personally untested..I would use game.ini) you can call it at server runtime with flag as follows:&lt;br /&gt;
   -KEY=&amp;quot;ABC123FALSEKEYDONTUSEME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This key can be re-used for a reasonable number of servers (a limit of 10 has been mentioned). Contact the Devs if you need more servers per key.&lt;br /&gt;
&lt;br /&gt;
====System setup and software installation====&lt;br /&gt;
&lt;br /&gt;
Install dependencies and create the `steam` user. (You only need to do this once):&lt;br /&gt;
&lt;br /&gt;
Confirm Linux version&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Ubuntu 20.04'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt install -y gdb curl lib32gcc1 libc++-dev unzip&lt;br /&gt;
sudo useradd -m steam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Ubuntu 20.10 or higher'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt install -y gdb curl lib32gcc-s1 libc++-dev unzip&lt;br /&gt;
sudo useradd -m steam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Rocky Linux, CentOS 8, and RHEL 8'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/g' /etc/selinux/config&lt;br /&gt;
sudo setenforce 0&lt;br /&gt;
sudo yum install gdb curl glibc.i686 libstdc++.i686 libstdc++-devel.i686 libstdc++-devel.x86_64 unzip wget -y&lt;br /&gt;
wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/libcxx-3.8.0-3.el7.x86_64.rpm&lt;br /&gt;
sudo rpm -i libcxx-3.8.0-3.el7.x86_64.rpm&lt;br /&gt;
sudo useradd -m steam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Optional] Set a password for steam.&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo passwd steam&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Login as the steam user. ('''You will need to do this each time you connect to your server'''):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo su -l steam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install Steam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~/Steam &amp;amp;&amp;amp; cd ~/Steam &amp;amp;&amp;amp; curl -sqL &amp;quot;https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz&amp;quot; | tar zxvf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are different dedicated server versions for Pavlov Server - choose which server version you want to host (PC non-beta, PC Beta, Shack Live, or Shack RC)&lt;br /&gt;
(You will need to run this command each time there is a Pavlov Server update). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
To host '''PC Server (non-beta)''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta default +exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To host '''PC BETA''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta beta_server +exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To host '''Shack Live''' (Quest):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta shack +exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To host '''Shack RC''' (Quest): &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta shack_beta +exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that we've installed the server, all pavlov server versions should continue.  &amp;lt;br /&amp;gt;&lt;br /&gt;
Install a fresh copy of steamclient.so (May have to do this after each update):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +login anonymous +app_update 1007 +quit&lt;br /&gt;
mkdir -p ~/.steam/sdk64&lt;br /&gt;
cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/.steam/sdk64/steamclient.so&lt;br /&gt;
cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/pavlovserver/Pavlov/Binaries/Linux/steamclient.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The update 29 of the PCVR version of pavlov and after added a requirement to run these commands to change the steamclient.so:&lt;br /&gt;
 &amp;lt;code&amp;gt;sudo rm /usr/lib/x86_64-linux-gnu/libc++.so&amp;lt;/code&amp;gt; &lt;br /&gt;
 &amp;lt;code&amp;gt;sudo ln -s /usr/lib/x86_64-linux-gnu/libc++.so.1 /usr/lib/x86_64-linux-gnu/libc++.so&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make the PavlovServer script executable. (You only need to do this once):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod +x ~/pavlovserver/PavlovServer.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Server Configuration ===&lt;br /&gt;
&lt;br /&gt;
Before starting the server we need to configure it. Start by creating some directories: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /home/steam/pavlovserver/Pavlov/Saved/Logs&lt;br /&gt;
mkdir -p /home/steam/pavlovserver/Pavlov/Saved/Config/LinuxServer&lt;br /&gt;
mkdir -p /home/steam/pavlovserver/Pavlov/Saved/maps&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mods/Blacklist/Whitelist (optional)  ====&lt;br /&gt;
&lt;br /&gt;
The following three files allow you to specify mods, banned players, and whitelist players.  These are optional, but go ahead and create them.  Populating the files is described later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /home/steam/pavlovserver/Pavlov/Saved/Config/mods.txt&lt;br /&gt;
touch /home/steam/pavlovserver/Pavlov/Saved/Config/blacklist.txt&lt;br /&gt;
touch /home/steam/pavlovserver/Pavlov/Saved/Config/whitelist.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Configuring Game.ini====&lt;br /&gt;
Create a new Game.ini file using following command to open an editor and copy/paste the following block into it then save it. Note not all of these options are required. For instance remove or comment out the Password=0000 line to make a public server with no pin. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nano /home/steam/pavlovserver/Pavlov/Saved/Config/LinuxServer/Game.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[/Script/Pavlov.DedicatedServer]&lt;br /&gt;
bEnabled=true&lt;br /&gt;
ServerName=&amp;quot;My_private_idaho&amp;quot;&lt;br /&gt;
MaxPlayers=10     #Set this to 10 for Shack. 24 is the max for PC, setting it higher will not allow players to join. &lt;br /&gt;
ApiKey=&amp;quot;ABC123FALSEKEYDONTUSEME&amp;quot;&lt;br /&gt;
bSecured=true&lt;br /&gt;
bCustomServer=true &lt;br /&gt;
bVerboseLogging=false &lt;br /&gt;
bCompetitive=false #This only works for SND&lt;br /&gt;
bWhitelist=false &lt;br /&gt;
RefreshListTime=120 &lt;br /&gt;
LimitedAmmoType=0 &lt;br /&gt;
TickRate=90&lt;br /&gt;
TimeLimit=60&lt;br /&gt;
#Password=0000 &lt;br /&gt;
#BalanceTableURL=&amp;quot;vankruptgames/BalancingTable/main&amp;quot;&lt;br /&gt;
MapRotation=(MapId=&amp;quot;UGC1758245796&amp;quot;, GameMode=&amp;quot;GUN&amp;quot;)&lt;br /&gt;
MapRotation=(MapId=&amp;quot;datacenter&amp;quot;, GameMode=&amp;quot;SND&amp;quot;)&lt;br /&gt;
MapRotation=(MapId=&amp;quot;sand&amp;quot;, GameMode=&amp;quot;DM&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''bEnabled''' - whether the server appears in the server list (unconfirmed)&lt;br /&gt;
* '''ServerName''' - name it will be listed as. (approx 35 chars max)&lt;br /&gt;
* '''MaxPlayers''' - See suggested specs for limits. 10 standard (10 for shack), 20-24 is max recommended for large maps like Stalingrad or PUSH/RUSH modes, and servers allow a maximum of 24 players.&lt;br /&gt;
* '''ApiKey''' - Unique ApiKey required to register server with master server. Replace with your key&lt;br /&gt;
* '''bSecured''' - enabled Valve Anti-Cheat (VAC)&lt;br /&gt;
* '''bCustomServer''' - activates some new modding tools (save and http functions. Required to write to blacklist.txt for bans)&lt;br /&gt;
* '''bCompetitive''' - sets the server to competitive mode for SND. If removed the server will default to false&lt;br /&gt;
* '''bVerboseLogging''' - enables verbose logging, mostly detailed statistics.  Be prepared for significant increase in logging.&lt;br /&gt;
* '''bWhitelist''' - Only allow users in whitelist.txt to join&lt;br /&gt;
* '''RefreshListTime''' - sets how often the running server checks for updates in ban/whitelist/mod files&lt;br /&gt;
* '''LimitedAmmoType''' - sets limited ammo mode, see Limited Ammo Types table below&lt;br /&gt;
&lt;br /&gt;
* '''TimeLimit''' - sets time limit for each map&lt;br /&gt;
* '''TickRate''' - sets the server tickrate. (so far minimum stable seems around 50 and max around 120. Beware setting this changes weapon despawn time and breaks some game modes. Recommend not touching)&lt;br /&gt;
* '''Password''' - PIN number for server #FYI - this is now also changeable via rcon.&lt;br /&gt;
* '''BalanceTableURL''' - Points to a custom balance table from github. See https://github.com/vankruptgames/BalancingTable for instructions. This line isn't needed if you don't have one. &lt;br /&gt;
* '''MapRotation''' - you can add multiple of these. The map system has switched from the steam workshop to modio which means that the server rotation will need to be redone with modio UGCs. &amp;lt;nowiki&amp;gt;https://mod.io/g/pavlov&amp;lt;/nowiki&amp;gt;. This is done by taking the resource ID from the modio page, adding “UGC” in front of it and then adding that to the rotation. For example the map gravity &amp;lt;nowiki&amp;gt;https://mod.io/g/pavlov/m/gravity1&amp;lt;/nowiki&amp;gt; has a resource ID of 2773760 so the map ID to add to the server would be “UGC2773760”. When a match ends, the server will load the next map in the rotation.  &lt;br /&gt;
* '''AFKTimeLimit''' There is now a feature to kick players who are idle in the game. Integers are measured in seconds and 0 disables AFK kicking completely.&lt;br /&gt;
&lt;br /&gt;
Available game modes as of 09/06/2022: See Game modes table below&lt;br /&gt;
&lt;br /&gt;
For maps running a Custom gamemode (CodZ, BR, Duel, etc.) it doesn't matter which gamemode you choose, as the map will automatically override it with the custom mode.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Limited Ammo Types&lt;br /&gt;
!AmmoType&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Unlimited&lt;br /&gt;
|Players have unlimited ammo, carry no ammo boxes and do not display an ammo count on the wrist.&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Limited Generic&lt;br /&gt;
|Players carry ammo boxes with a limited amount of ammo.&lt;br /&gt;
One box for each weapon class (Pistol, Submachine gun, Rifles/MGs, Shotgun, Sniper).&lt;br /&gt;
&lt;br /&gt;
Mags and ammo boxes can be put on the chest of the player to consolidate the ammo.&lt;br /&gt;
&lt;br /&gt;
An ammo count is displayed on the wrist.&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Limited Specific&lt;br /&gt;
|Players carry ammo boxes with a limited amount of ammo.&lt;br /&gt;
One box for each weapon.&lt;br /&gt;
&lt;br /&gt;
Mags and ammo boxes can be put on the chest of the player to consolidate the ammo.&lt;br /&gt;
&lt;br /&gt;
An ammo count is displayed on the wrist.&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Custom&lt;br /&gt;
|Allows for full control over ammo by the map.&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
| Limited Special&lt;br /&gt;
|'''All weapons except &amp;quot;special&amp;quot; weapons are unlimited, more clarification is needed.''' &lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Boxless&lt;br /&gt;
|'''Like limited generic but without boxes? Clarification is needed.'''&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Game modes&lt;br /&gt;
!GameMode &lt;br /&gt;
!Name&lt;br /&gt;
|-&lt;br /&gt;
|DM&lt;br /&gt;
|Death match&lt;br /&gt;
|-&lt;br /&gt;
|KOTH&lt;br /&gt;
|King of the hill&lt;br /&gt;
|-&lt;br /&gt;
|GUN&lt;br /&gt;
| Gun game&lt;br /&gt;
|-&lt;br /&gt;
|OITC&lt;br /&gt;
| One in the chamber&lt;br /&gt;
|-&lt;br /&gt;
|SND&lt;br /&gt;
|Search and destroy&lt;br /&gt;
|-&lt;br /&gt;
|TANKTDM&lt;br /&gt;
|WW2 Team Death Match&lt;br /&gt;
|-&lt;br /&gt;
| TDM&lt;br /&gt;
|Team Death Match&lt;br /&gt;
|-&lt;br /&gt;
|TTT&lt;br /&gt;
|Trouble in Terrorist Town&lt;br /&gt;
|-&lt;br /&gt;
|WW2GUN&lt;br /&gt;
|WW2 gun game&lt;br /&gt;
|-&lt;br /&gt;
|ZWV&lt;br /&gt;
| Zombie wave survival&lt;br /&gt;
|-&lt;br /&gt;
|HIDE&lt;br /&gt;
|The Hidden &lt;br /&gt;
|-&lt;br /&gt;
|INFECTION&lt;br /&gt;
|Hidden infection&lt;br /&gt;
|-&lt;br /&gt;
|PUSH&lt;br /&gt;
|Push&lt;br /&gt;
|-&lt;br /&gt;
|PH&lt;br /&gt;
|Prop hunt&lt;br /&gt;
|}&lt;br /&gt;
= Default Map ID's =&lt;br /&gt;
datacenter &lt;br /&gt;
&lt;br /&gt;
sand&lt;br /&gt;
&lt;br /&gt;
bridge&lt;br /&gt;
&lt;br /&gt;
containeryard&lt;br /&gt;
&lt;br /&gt;
siberia (Prison Break)&lt;br /&gt;
&lt;br /&gt;
hospital (Zombies map)&lt;br /&gt;
&lt;br /&gt;
killhouse&lt;br /&gt;
&lt;br /&gt;
range&lt;br /&gt;
&lt;br /&gt;
tutorial&lt;br /&gt;
&lt;br /&gt;
santorini&lt;br /&gt;
&lt;br /&gt;
station&lt;br /&gt;
&lt;br /&gt;
industry&lt;br /&gt;
&lt;br /&gt;
ogcontainers (Shack only)&lt;br /&gt;
&lt;br /&gt;
haguenau (Shack only)&lt;br /&gt;
&lt;br /&gt;
foundation (Shack only)&lt;br /&gt;
&lt;br /&gt;
stalingrad (PC only)&lt;br /&gt;
&lt;br /&gt;
stalingrad_night (PC only)&lt;br /&gt;
&lt;br /&gt;
santorini_night (PC only)&lt;br /&gt;
&lt;br /&gt;
sand_night (PC only)&lt;br /&gt;
&lt;br /&gt;
station_night (PC only)&lt;br /&gt;
&lt;br /&gt;
industry_night (PC only)&lt;br /&gt;
&lt;br /&gt;
bunker (PC only)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Firewall/Port forwarding ====&lt;br /&gt;
Using the default settings there are two UDP ports (7777, 8177) that need to be allowed to access the server either by firewall setup or port forwarding. &lt;br /&gt;
&lt;br /&gt;
'''Ubuntu''' firewall commands to check firewall and open ports:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo ufw status&lt;br /&gt;
sudo ufw allow 7777&lt;br /&gt;
sudo ufw allow 8177&lt;br /&gt;
sudo ufw allow 9100&lt;br /&gt;
sudo ufw status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Rocky Linux''' firewall commands to check firewall and open ports:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=7777/tcp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=7777/udp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=8177/tcp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=8177/udp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=9100/udp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=9100/tcp&lt;br /&gt;
sudo firewall-cmd --list-ports&lt;br /&gt;
firewall-cmd --runtime-to-permanent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may also need to allow Pings (ICMP) for the server's true latency to appear in the master list.&lt;br /&gt;
&lt;br /&gt;
If you are running multiple servers and have set additional ports (see http://wiki.pavlov-vr.com/index.php?title=Dedicated_server#Running_multiple_servers_on_one_host) then you need to allow access to the defined port plus the port 400 higher. So if you use 7000 as your port, then UDP 7000 and 7400 need to be open&lt;br /&gt;
&lt;br /&gt;
If you have setup rcon via RconSettings.txt (below) then that port also need to be allowed access via TCP&lt;br /&gt;
&lt;br /&gt;
If you are running Shack/Quest and want to have maps that are downloadable from your server, your server ports (ex. 7777 &amp;amp; 8177) must also be open via TCP&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Shack Maps (Quest) ====&lt;br /&gt;
&lt;br /&gt;
If you try to use the steps above to add maps for Shack, youll run into issues very quickly. This is because Shack has no affiliation to Steam, and therefore cannot use Steam Workshop maps like above. In the future, these steps will apply to PC servers as well, allowing a server to hold the map itself, instead of offloading to Steam.&lt;br /&gt;
&lt;br /&gt;
To get started, first create the directory to hold the maps&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir -p /home/steam/pavlovserver/Pavlov/Saved/maps&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can use any number of methods to move the map files onto the server, but ill go over the two simplest, starting with a GUI approach&lt;br /&gt;
&lt;br /&gt;
Download and install CyberDuck onto your &amp;quot;home&amp;quot; PC (Whatever PC you use for access to the server, but not the server itsself): https://cyberduck.io/&lt;br /&gt;
&lt;br /&gt;
Next, download and unzip your map of choice from https://www.pavlovquest.com/ , https://pavlovhorde.com/mapsList, or look in #shack-map-showcase channel in the discord server.  I'm going to use Cheeto's WW2 Items test (http://www.mediafire.com/file/emyt9bs1z9u9ykw/SVR_Cheeto_Items.zip/file ) for this example, you do what you like&lt;br /&gt;
&lt;br /&gt;
In the top left corner, open a connection, set the connection type to SFTP, and fill in the rest of the information. User will be root, password is whatever you set the root pw as (toor in Ubuntu by default)&lt;br /&gt;
&lt;br /&gt;
In the directory dropdown (itll say /root) go back to /&lt;br /&gt;
&lt;br /&gt;
Follow the directories until we arrive back at our &amp;quot;maps&amp;quot; folder &amp;lt;pre&amp;gt;/home/steam/pavlovserver/Pavlov/Saved/maps&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Drag and drop the unzipped map folder into the main window, in this case itll be SVR_Cheeto_Items&lt;br /&gt;
&lt;br /&gt;
Hit Allow&lt;br /&gt;
&lt;br /&gt;
Youll now see a folder named SVR_Cheeto_Items, and within it should be nothing but 3 files. If there is another folder in it, move this folder to the maps directory, otherwise the server wont work. The 3 files (2 .PAK one .JSON) should be in home/steam/pavlovserver/Pavlov/Saved/maps/SVR_Cheeto_Items, no more, no less.&lt;br /&gt;
&lt;br /&gt;
Pavlov Shack servers load maps at pavlovserver start.  '''YOU MUST RESTART THE GAME SERVER TO USE THE MAPS.'''&lt;br /&gt;
&lt;br /&gt;
To play the map, you can either use RCON switch map command, or to add the map to your servers automatic map rotation list, add the map's folder name to your Game.ini. This replaces the MapID section, so for our example it would be &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MapRotation=(MapId=&amp;quot;SVR_Cheeto_Items&amp;quot;, GameMode=&amp;quot;TDM&amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And thats all! Disconnect CyberDuck from your server before playing, otherwise youll have difficulty joining.&lt;br /&gt;
&lt;br /&gt;
-----------&lt;br /&gt;
&lt;br /&gt;
==== Adding Shack Maps over Command Line Interface ====&lt;br /&gt;
&lt;br /&gt;
Pavlov Shack servers load maps at pavlovserver start.  '''YOU MUST RESTART THE GAME SERVER TO USE THE MAPS.'''&lt;br /&gt;
&lt;br /&gt;
A bit more complicated, but adding maps over CLI has its benefits&lt;br /&gt;
&lt;br /&gt;
First, CD to the maps directory you made above&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;cd ~/pavlovserver/Pavlov/Saved/maps&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Download the map files from whatever you use to upload them. To do this, you can either use curl or wget&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;curl -O insertURLhere&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;'''If you download your map from Google Drive''', make sure that your .zip folder is shared to anyone.&amp;lt;/p&amp;gt;&lt;br /&gt;
Then, get the file's url from the shared link. &amp;lt;p&amp;gt;Example : ''&amp;lt;nowiki&amp;gt;https://drive.google.com/file/d/19bI8gUHaN5tUrDvnadAacUnchQf6_k/view&amp;lt;/nowiki&amp;gt;''&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;will be ''19bI8gUHaN5tUrDvnadAacUnchQf6_k''&amp;lt;/p&amp;gt;&lt;br /&gt;
Edit &amp;quot;fileId&amp;quot; and &amp;quot;fileName&amp;quot; before you execute the command. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fileId=19bI8gUHaN5tUrDvnadAacUnchQf6_k&lt;br /&gt;
fileName=SVR_USER_MAPNAME&lt;br /&gt;
curl -sc /tmp/cookie &amp;quot;https://drive.google.com/uc?export=download&amp;amp;id=${fileId}&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
code=&amp;quot;$(awk '/_warning_/ {print $NF}' /tmp/cookie)&amp;quot;  &lt;br /&gt;
curl -Lb /tmp/cookie &amp;quot;https://drive.google.com/uc?export=download&amp;amp;confirm=${code}&amp;amp;id=${fileId}&amp;quot; -o ${fileName} &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To keep with the Items example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;curl -O https://cdn.discordapp.com/attachments/744185280759857234/745027406695366788/SVR_Cheeto_Items.zip&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, unzip the file. If this next step errors out, saying the command is unknown, switch back to the root user (su root), and install unzip (sudo apt install unzip), then return to the steam user, and continue.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;unzip SVR_Cheeto_Items.zip&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now finish like before by adding the map to your Game.ini&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;nano /home/steam/pavlovserver/Pavlov/Saved/Config/LinuxServer/Game.ini&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MapRotation=(MapId=&amp;quot;SVR_Cheeto_Items&amp;quot;, GameMode=&amp;quot;TDM&amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Admin/Moderator list (optional) ====&lt;br /&gt;
&lt;br /&gt;
The only working in-game admin menu is through Arctic VR server hosting (see below).  &lt;br /&gt;
&lt;br /&gt;
If you add moderators to your server, they will not be subject to vote kicks. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nano ~/pavlovserver/Pavlov/Saved/Config/mods.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example Mod List:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
76541198397498572 #Optional Comment: Player name&lt;br /&gt;
76541198397498573 #Some Other Player&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ArcticVR Admin Menu ====&lt;br /&gt;
&lt;br /&gt;
[[File:Arcticmenu.jpg|500px|link=https://www.arctic-vr.com/server-admin-menu]]&lt;br /&gt;
&lt;br /&gt;
Arctic-VR Offers an advanced In-Game Admin menu that is exclusive to their hosting service. Features include: &lt;br /&gt;
* Switch Maps+Modes&lt;br /&gt;
* Teleport Players to Players&lt;br /&gt;
* Change Player Skins&lt;br /&gt;
* Control Player Buying+Cash&lt;br /&gt;
* Spawn Items&lt;br /&gt;
* Clean up corpses + guns&lt;br /&gt;
* Spawn Bots&lt;br /&gt;
* Spawn Items for other players&lt;br /&gt;
* Control Teams + Balance/Shuffle Teams&lt;br /&gt;
* ResetSND&lt;br /&gt;
* And More&lt;br /&gt;
&lt;br /&gt;
You can read more about the ArcticVR admin menu on their website: https://www.arctic-vr.com/server-admin-menu&lt;br /&gt;
&lt;br /&gt;
==== Handy tools for finding steamIDs ==== &lt;br /&gt;
&lt;br /&gt;
Steam ID finder: https://steamidfinder.com/lookup/ or https://steamid.xyz/&lt;br /&gt;
&lt;br /&gt;
You want to enter in the steamID64 format. &lt;br /&gt;
&lt;br /&gt;
This tool can convert or lookup IDs:  https://steamid.io/&lt;br /&gt;
&lt;br /&gt;
If you are looking for a steamID of a player that has been on your server recently this is technique to find them:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep -i playername ~/pavlovserver/Pavlov/Saved/Logs/* | grep TicketValidation&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configure Rcon ===&lt;br /&gt;
To enable Rcon access create config file:&lt;br /&gt;
&amp;lt;pre&amp;gt; nano /home/steam/pavlovserver/Pavlov/Saved/Config/RconSettings.txt &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copy in the following text - change password, and if desired the port:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Password=ChangeThisPassword&lt;br /&gt;
Port=9100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You must specify a port for the Rcon server to use as well as a Password (use a different port per sever instance if running multiple server instances off the same hardware)&lt;br /&gt;
&lt;br /&gt;
=== Starting the server ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/pavlovserver &amp;amp;&amp;amp; ./PavlovServer.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That's it, your server will be automatically broadcast to the master server! :) &lt;br /&gt;
&lt;br /&gt;
Two handy tools to determine quickly if your server is broadcasting are [https://pablub.xyz/ Pablub] (PC only) and [https://pavlovhorde.com/ Horde] (Shack) and [https://pavlovhorde.com/pcServers Horde] (PC version)&lt;br /&gt;
&lt;br /&gt;
Note that when you close your terminal, the server will go down. See the &amp;quot;supervisors&amp;quot; section below for how to prevent this.&lt;br /&gt;
&lt;br /&gt;
=== Auto-updating the server ===&lt;br /&gt;
&lt;br /&gt;
Assuming you have followed this guide and used the default paths, users, and install instructions, you can paste the following into your terminal to auto-update your Pavlov server:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; 'EOF' &amp;gt; $HOME/pavlov_daily_update_and_restart.sh&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
USER=&amp;quot;steam&amp;quot;&lt;br /&gt;
SERVICENAME=&amp;quot;pavlovserver.service&amp;quot;&lt;br /&gt;
INSTALLDIRNAME=&amp;quot;pavlovserver&amp;quot;&lt;br /&gt;
USERHOME=&amp;quot;/home/$USER&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;Beginning Pavlov VR update run on $(date)\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
systemctl stop &amp;quot;$SERVICENAME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
sudo -iu &amp;quot;$USER&amp;quot; &amp;quot;$USERHOME/Steam/steamcmd.sh&amp;quot; +login anonymous +force_install_dir &amp;quot;$USERHOME/$INSTALLDIRNAME&amp;quot; +app_update 622970 +exit&lt;br /&gt;
sudo -iu &amp;quot;$USER&amp;quot; &amp;quot;$USERHOME/Steam/steamcmd.sh&amp;quot; +login anonymous +app_update 1007 +quit&lt;br /&gt;
sudo -iu &amp;quot;$USER&amp;quot; cp &amp;quot;$USERHOME/Steam/steamapps/common/Steamworks SDK Redist/linux64/steamclient.so&amp;quot; &amp;quot;$USERHOME/.steam/sdk64/steamclient.so&amp;quot;&lt;br /&gt;
sudo -iu &amp;quot;$USER&amp;quot; cp &amp;quot;$USERHOME/Steam/steamapps/common/Steamworks SDK Redist/linux64/steamclient.so&amp;quot; &amp;quot;$USERHOME/pavlovserver/Pavlov/Binaries/Linux/steamclient.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
systemctl start &amp;quot;$SERVICENAME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;Ending Pavlov VR update run on $(date)\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
chmod +x $HOME/pavlov_daily_update_and_restart.sh&lt;br /&gt;
mkdir $HOME/pavlov_update_logs &amp;amp;&amp;amp; touch $HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log&lt;br /&gt;
CRONLINE=&amp;quot;00 2 * * * $HOME/pavlov_daily_update_and_restart.sh &amp;gt;&amp;gt;$HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log 2&amp;gt;&amp;amp;1&amp;quot;&lt;br /&gt;
(sudo crontab -u root -l; echo &amp;quot;$CRONLINE&amp;quot; ) | sudo crontab -u root -&lt;br /&gt;
unset CRONLINE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These commands will:&lt;br /&gt;
&lt;br /&gt;
1. Create a shell script in the &amp;quot;steam&amp;quot; user's home directory that automatically stops the Pavlov server, pulls any updates via steam, pull updates to the Steamworks SDK Redist, and copies the latest version of steamclient.so to the Pavlov server directory&lt;br /&gt;
&lt;br /&gt;
2. Make the shell script executable&lt;br /&gt;
&lt;br /&gt;
3. Create a new directory called &amp;quot;pavlov_update_logs&amp;quot; in the &amp;quot;steam&amp;quot; user's directory, and create a logfile inside that directory called &amp;quot;pavlov_daily_update_and_restart.sh.log&amp;quot;. You can check this logfile to see the output of the Pavlov and Steam SDK update commands.&lt;br /&gt;
&lt;br /&gt;
4. Create a crontab entry for the root user that runs this shell script automatically every day at 2:00AM local time&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you want to change the time that this script runs, edit the numbers &amp;quot;00 2&amp;quot; in the line that starts with &amp;quot;CRONLINE=&amp;quot;. In the example provided, 00 is the minutes column, and 2 is the hour column. For example, if you wanted the server to automatically update and restart at 4:17AM every day, change the line starting with &amp;quot;CRONLINE=&amp;quot; to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CRONLINE=&amp;quot;17 4 * * * $HOME/pavlov_daily_update_and_restart.sh &amp;gt;&amp;gt;$HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log 2&amp;gt;&amp;amp;1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the time is PM, use 24-hour time format, e.g. &amp;quot;32 18&amp;quot; for 6:32PM.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Supervising the server using systemd ===&lt;br /&gt;
&lt;br /&gt;
Running '''./PavlovServer.sh''' in your interactive shell is easy, but the server will shut down when you close your terminal. If you want to run the server in the background,&lt;br /&gt;
you'll want to run it under a supervisor. There are many options, ranging from the simple (nohup, screen or tmux), to the&lt;br /&gt;
more robust (supervisord, systemd).&lt;br /&gt;
&lt;br /&gt;
Systemd is running by default on Ubuntu Linux, so we'll use that here.&lt;br /&gt;
&lt;br /&gt;
To run the server as a systemd service, create the file '''/etc/systemd/system/pavlovserver.service''' (as root) by typing &lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
sudo nano /etc/systemd/system/pavlovserver.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copy contents below into the file and save.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Pavlov VR dedicated server&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
WorkingDirectory=/home/steam/pavlovserver&lt;br /&gt;
ExecStart=/home/steam/pavlovserver/PavlovServer.sh&lt;br /&gt;
&lt;br /&gt;
RestartSec=1&lt;br /&gt;
Restart=always&lt;br /&gt;
User=steam&lt;br /&gt;
Group=steam&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy = multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you'd like your server to start as competitive without editing the game.ini, change the line &amp;quot;ExecStart=/home/steam/pavlovserver/PavlovServer.sh&amp;quot; to look like this below. Though it's much easier to just use the game.ini to enable competitive instead. &amp;lt;pre&amp;gt;ExecStart=/home/steam/pavlovserver/PavlovServer.sh -COMPETITIVE=1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Change the user or paths as appropriate. After saving the service file, to start, restart, stop, or monitor the server:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl start pavlovserver&lt;br /&gt;
sudo systemctl restart pavlovserver&lt;br /&gt;
sudo systemctl stop pavlovserver&lt;br /&gt;
sudo systemctl status pavlovserver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To view the logs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo journalctl -u pavlovserver&lt;br /&gt;
# to live-tail the logs&lt;br /&gt;
sudo journalctl -u pavlovserver -f&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want to run the pavlov server as soon as your server boots (e.g. a VPS you turn on and off), add pavlov as a startup service:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl enable pavlovserver&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Advanced Server Administration ==&lt;br /&gt;
&lt;br /&gt;
=== Running multiple servers on one host ===&lt;br /&gt;
&lt;br /&gt;
* Pavlovserver is functionally single threaded (there are multiple threads, but vast majority of work occurs in the primary one). Make sure you have # of pavlovservers + 1 CPU available. More CPUs= more servers. Faster CPU = more players. &lt;br /&gt;
* Make multiple server installs by defining a separate install dir for each server.&lt;br /&gt;
* Run each server with a unique port. eg: '''./PavlovServer.sh -PORT=&amp;quot;Desired Port&amp;quot;'''&lt;br /&gt;
* The Server will use the Desired Port and the Port 400 above (Example: You choose 8200 as Port. So Port 8600 will be used as well)&lt;br /&gt;
* If you are using RCON, each server will need a unique port defined in RconSettings.txt &lt;br /&gt;
* Ensure the ports are forwarded and opened in your firewall &lt;br /&gt;
&lt;br /&gt;
To duplicate directories:&lt;br /&gt;
&lt;br /&gt;
be in the steam home folder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp -r pavlovserver pavlovserver1&lt;br /&gt;
/home/steam/pavlovserver1/PavlovServer.sh -PORT=[Desired Port]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Starting server in competitive mode ===&lt;br /&gt;
Competitive mode will prevent dead teammates from being able to see the match, to prevent ghosting.&lt;br /&gt;
You can either enable this via Game.ini (described in Game.ini file), or using the -COMPETITIVE=1 parameter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/steam/pavlovserver1/PavlovServer.sh -COMPETITIVE=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Useful Linux Commands ===&lt;br /&gt;
List files / folders in directory, print current working directory, &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -la                                    #list files/directories along with authorities and ownership&lt;br /&gt;
pwd                                       #print working directory&lt;br /&gt;
sudo chown &amp;lt;owner&amp;gt; &amp;lt;file/directory&amp;gt;       #change owner of file/directory.  If root created something and you need to change it to steam&lt;br /&gt;
sudo chgrp &amp;lt;group&amp;gt; &amp;lt;file/directory&amp;gt;       #change group of file/directory.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Check if pavlov is running by checking process status.  If the only row you see is the grep command, pavlov server is not started.&lt;br /&gt;
&amp;lt;pre&amp;gt; ps -ef | grep pav &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sample output:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
steam      34044       1  0 16:52 ?        00:00:00 /bin/sh /home/steam/pavlovserver/PavlovServer.sh&lt;br /&gt;
steam      34066   34044 80 16:52 ?        00:00:04 /home/steam/pavlovserver/Pavlov/Binaries/Linux/PavlovServer&lt;br /&gt;
zombies+   34101   34013  0 16:52 pts/0    00:00:00 grep --color=auto pav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kill a process.  Note this command uses 34044, which is a process id from the command output above.&lt;br /&gt;
&amp;lt;pre&amp;gt; kill -9 34044           &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dump the log to the console so you can scroll through it:&lt;br /&gt;
&amp;lt;pre&amp;gt; cat /home/steam/pavlovserver/Pavlov/Saved/Logs/Pavlov.log &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Search the log for a string - replace my_string with case-sensitive string&lt;br /&gt;
&amp;lt;pre&amp;gt; cat /home/steam/pavlovserver/Pavlov/Saved/Logs/Pavlov.log | grep my_string &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:RCON automation]]&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Setting_up_a_dedicated_server&amp;diff=754</id>
		<title>Setting up a dedicated server</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Setting_up_a_dedicated_server&amp;diff=754"/>
		<updated>2023-06-28T13:44:24Z</updated>

		<summary type="html">&lt;p&gt;Junt: Added AFK timelimit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Setting up a dedicated server ==&lt;br /&gt;
&lt;br /&gt;
'''There are no Windows binaries''' &lt;br /&gt;
&lt;br /&gt;
This guide is written exclusively for Linux and covers Ubuntu/Debian/Debian-like and Red Hat RPM-based distros. Possible to run with other distros, but some of the commands won't work and you will need to know enough to figure out the software install of dependencies on your own. &lt;br /&gt;
&lt;br /&gt;
If you are considering hosting from home, please read that section of the wiki first. &lt;br /&gt;
&lt;br /&gt;
This guide assumes you know the basics of using a bash terminal: ssh'ing into a server, running bash commands, editing text files, etc.&lt;br /&gt;
&lt;br /&gt;
If you have no experience using bash, maybe start [https://www.howtogeek.com/140679/beginner-geek-how-to-start-using-the-linux-terminal/ here]. Editing text files via commandline is often a challenge. Suggest using nano and reading guide [https://www.howtogeek.com/howto/42980/the-beginners-guide-to-nano-the-linux-command-line-text-editor/ here]&lt;br /&gt;
&lt;br /&gt;
If you are new to linux and accessing your server from Windows, highly suggest using MobaXterm as your SSH client as that can make required editing of text files easier using built in editor instead of the native linux command line editors.&lt;br /&gt;
&lt;br /&gt;
And finally, ask yourself why you want to setup a server? If you look at the list, there are many, many more servers than players. If you don't have a team, discord community, or group of friends ready to play on your server, chances are it will go unused. Got one of these... great, let's go. &lt;br /&gt;
&lt;br /&gt;
If you don't want to go through the hassle yourself and want to pay for a hosting service Arctic VR (PC and Shack) and Horde (Shack) provide a server hosting services and are trusted in the community. See links below.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Server Requirements ===&lt;br /&gt;
&lt;br /&gt;
'''Pavlovserver can only be hosted under Linux.''' &lt;br /&gt;
&lt;br /&gt;
This can be running as a VM under windows, but this will increase the complexity of the setup beyond this guide. &lt;br /&gt;
&lt;br /&gt;
Ubuntu 18.04 x86_64, Ubuntu 19/04 amd64, Ubuntu 20.04, and Rocky Linux 8 are confirmed working. Ubuntu 15.04 x86 is known to fail to install using this guide. Recommend not running on &amp;quot;minimal&amp;quot; images as some tools are missing. &lt;br /&gt;
&lt;br /&gt;
* 2GB RAM + 1GB RAM per each additional server with 10 players. More RAM is recommended for larger maps, higher player counts, or complex gamemodes. Not having enough RAM is a common cause of server crashes.&lt;br /&gt;
&lt;br /&gt;
* A ~2.5Ghz CPU will comfortably support a 10 player server.&lt;br /&gt;
 &lt;br /&gt;
* A ~4Ghz CPU will comfortably support 24 players. This is a limit built into Pavlov itself, no server will allow players to join over 24. Lower player counts are recommended for complex gamemodes (E.g. CodZ) and/or highly detailed maps, so that maximum number will often be lower.&lt;br /&gt;
&lt;br /&gt;
(Note that these are '''not''' hard limits for player counts, just suggestions for the best performance, based on experiences with many server providers on different grades of hardware.)&lt;br /&gt;
 &lt;br /&gt;
* Pavlovserver is functionally single threaded (one thread does vast majority of work). More CPUs only help if you are running more servers. More clockspeed = higher performance = more users per server. &lt;br /&gt;
The maximum number of servers you can run is dependent on how many CPUs you have. For example, if you have an 8 core CPU, the maximum number of servers would be 7. You should always have at least one CPU free as overhead, as Pavlov servers can use slightly more than one thread.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Hosting at home ====&lt;br /&gt;
When hosting at home there are additional requirements regarding networking: Your router has to support port-forwarding, hair-pinning/LoopbackNAT, and respond to ping requests.  These techniques are necessary to allow your server to be found and to talk back to the client. please see https://en.wikipedia.org/wiki/Port_forwarding,  https://en.wikipedia.org/wiki/Hairpinning, and https://www.speedguide.net/faq/how-to-become-pingable-behind-a-routerfirewall-376 for more info and google for these terms in addition to your router model to find guides on how to enable/configure it properly. If you have modern Router, it may have these features already enabled, in this case you just have to configure port-forwarding. If you can see your server but not join it while others can, this is indicative of a failure of LoopbackNAT. &lt;br /&gt;
&lt;br /&gt;
A second challenge to hosting at home is CGNAT (Carrier grade NAT: https://www.a10networks.com/blog/carrier-grade-nat/). Just like NAT on your home network that has to be gotten around w/ port-forwarding, CGNAT breaks the ability of external connections to be made back to your server, but the controls are solely in your ISPs hands. Sometimes if you ask, you can be removed from CGNAT pools and/or assigned a static IP. CGNAT rollouts are becoming very common now, so if your server worked then doesn't allow connections now, your ISP may have made this change. &lt;br /&gt;
&lt;br /&gt;
You can check whether you’re on a CGNAT network by visiting a Web site such as ipaddress.com or whatsmyip.com and comparing the IP address listed to the public/WAN IP address assigned to your Internet gateway. To find your gateway’s public IP address, check the status page in the administrative interface. If the two IP addresses differ, you’re likely on a CGNAT network. If so, this problem must be resolved before you go any further. &lt;br /&gt;
&lt;br /&gt;
'''Not understanding these requirements and configuration is a frequent cause of failed setups and questions in discord. Don't skip this if you are trying to host from home'''&lt;br /&gt;
&lt;br /&gt;
'''There are serious security implications of hosting this software at home.''' None of the devs are security experts and there has been no security review of the code. You are opening up your system to the world and publicity advertising this fact. Expect that any system hosting this software is open to compromise from the Internet and act accordingly. If your router offers a DMZ network, use it. Consider hosting on a cloud based server and think twice before running this software on any system that contains data you care about or has access to networks and computers you care about.&lt;br /&gt;
&lt;br /&gt;
If you're hosting at home using Oracle's VirtualBox, there are steps you can take to prevent double NAT (which can cause issues later on)&lt;br /&gt;
&lt;br /&gt;
1. Select your VM and then click Settings in VirtualBox's main window.&lt;br /&gt;
&lt;br /&gt;
2. Click on Network and change Attached To from NAT to Bridged Adapter. &lt;br /&gt;
&lt;br /&gt;
Once you've done this, your VM should be connected directly to your home router and double NAT should no longer be a issue.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Starting Server Install ====&lt;br /&gt;
&lt;br /&gt;
====Obtaining an ApiKey====&lt;br /&gt;
For your server to show up in the server list, there is now a requirement to have an ApiKey issued by vankrupt. This is to prevent DOS attacks against the master server&lt;br /&gt;
&lt;br /&gt;
Get the key by going here: https://pavlov-ms.vankrupt.com/servers/v1/key and using your mobile number to get a SMS &lt;br /&gt;
(note that there have been reported failures of this SMS system for non-US mobiles. In this case DM davevillz your mobile and ask for a key)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Put this key in your Game.ini as follows:&lt;br /&gt;
    ApiKey=&amp;quot;ABC123FALSEKEYDONTUSEME&amp;quot;&lt;br /&gt;
or if you would like (personally untested..I would use game.ini) you can call it at server runtime with flag as follows:&lt;br /&gt;
   -KEY=&amp;quot;ABC123FALSEKEYDONTUSEME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This key can be re-used for a reasonable number of servers (a limit of 10 has been mentioned). Contact the Devs if you need more servers per key.&lt;br /&gt;
&lt;br /&gt;
====System setup and software installation====&lt;br /&gt;
&lt;br /&gt;
Install dependencies and create the `steam` user. (You only need to do this once):&lt;br /&gt;
&lt;br /&gt;
Confirm Linux version&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Ubuntu 20.04'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt install -y gdb curl lib32gcc1 libc++-dev unzip&lt;br /&gt;
sudo useradd -m steam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Ubuntu 20.10 or higher'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt install -y gdb curl lib32gcc-s1 libc++-dev unzip&lt;br /&gt;
sudo useradd -m steam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Rocky Linux, CentOS 8, and RHEL 8'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/g' /etc/selinux/config&lt;br /&gt;
sudo setenforce 0&lt;br /&gt;
sudo yum install gdb curl glibc.i686 libstdc++.i686 libstdc++-devel.i686 libstdc++-devel.x86_64 unzip wget -y&lt;br /&gt;
wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/libcxx-3.8.0-3.el7.x86_64.rpm&lt;br /&gt;
sudo rpm -i libcxx-3.8.0-3.el7.x86_64.rpm&lt;br /&gt;
sudo useradd -m steam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Optional] Set a password for steam.&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo passwd steam&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Login as the steam user. ('''You will need to do this each time you connect to your server'''):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo su -l steam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Install Steam:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~/Steam &amp;amp;&amp;amp; cd ~/Steam &amp;amp;&amp;amp; curl -sqL &amp;quot;https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz&amp;quot; | tar zxvf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are different dedicated server versions for Pavlov Server - choose which server version you want to host (PC non-beta, PC Beta, Shack Live, or Shack RC)&lt;br /&gt;
(You will need to run this command each time there is a Pavlov Server update). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
To host '''PC Server (non-beta)''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta default +exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To host '''PC BETA''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta beta_server +exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To host '''Shack Live''' (Quest):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta shack +exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To host '''Shack RC''' (Quest): &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta shack_beta +exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that we've installed the server, all pavlov server versions should continue.  &amp;lt;br /&amp;gt;&lt;br /&gt;
Install a fresh copy of steamclient.so (May have to do this after each update):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/Steam/steamcmd.sh +login anonymous +app_update 1007 +quit&lt;br /&gt;
mkdir -p ~/.steam/sdk64&lt;br /&gt;
cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/.steam/sdk64/steamclient.so&lt;br /&gt;
cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/pavlovserver/Pavlov/Binaries/Linux/steamclient.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The update 29 of the PCVR version of pavlov and after added a requirement to run these commands to change the steamclient.so:&lt;br /&gt;
 &amp;lt;code&amp;gt;sudo rm /usr/lib/x86_64-linux-gnu/libc++.so&amp;lt;/code&amp;gt; &lt;br /&gt;
 &amp;lt;code&amp;gt;sudo ln -s /usr/lib/x86_64-linux-gnu/libc++.so.1 /usr/lib/x86_64-linux-gnu/libc++.so&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make the PavlovServer script executable. (You only need to do this once):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod +x ~/pavlovserver/PavlovServer.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Server Configuration ===&lt;br /&gt;
&lt;br /&gt;
Before starting the server we need to configure it. Start by creating some directories: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /home/steam/pavlovserver/Pavlov/Saved/Logs&lt;br /&gt;
mkdir -p /home/steam/pavlovserver/Pavlov/Saved/Config/LinuxServer&lt;br /&gt;
mkdir -p /home/steam/pavlovserver/Pavlov/Saved/maps&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mods/Blacklist/Whitelist (optional)  ====&lt;br /&gt;
&lt;br /&gt;
The following three files allow you to specify mods, banned players, and whitelist players.  These are optional, but go ahead and create them.  Populating the files is described later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /home/steam/pavlovserver/Pavlov/Saved/Config/mods.txt&lt;br /&gt;
touch /home/steam/pavlovserver/Pavlov/Saved/Config/blacklist.txt&lt;br /&gt;
touch /home/steam/pavlovserver/Pavlov/Saved/Config/whitelist.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Configuring Game.ini====&lt;br /&gt;
Create a new Game.ini file using following command to open an editor and copy/paste the following block into it then save it. Note not all of these options are required. For instance remove or comment out the Password=0000 line to make a public server with no pin. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nano /home/steam/pavlovserver/Pavlov/Saved/Config/LinuxServer/Game.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[/Script/Pavlov.DedicatedServer]&lt;br /&gt;
bEnabled=true&lt;br /&gt;
ServerName=&amp;quot;My_private_idaho&amp;quot;&lt;br /&gt;
MaxPlayers=10     #Set this to 10 for Shack. 24 is the max for PC, setting it higher will not allow players to join. &lt;br /&gt;
ApiKey=&amp;quot;ABC123FALSEKEYDONTUSEME&amp;quot;&lt;br /&gt;
bSecured=true&lt;br /&gt;
bCustomServer=true &lt;br /&gt;
bVerboseLogging=false &lt;br /&gt;
bCompetitive=false #This only works for SND&lt;br /&gt;
bWhitelist=false &lt;br /&gt;
RefreshListTime=120 &lt;br /&gt;
LimitedAmmoType=0 &lt;br /&gt;
TickRate=90&lt;br /&gt;
TimeLimit=60&lt;br /&gt;
#Password=0000 &lt;br /&gt;
#BalanceTableURL=&amp;quot;vankruptgames/BalancingTable/main&amp;quot;&lt;br /&gt;
MapRotation=(MapId=&amp;quot;UGC1758245796&amp;quot;, GameMode=&amp;quot;GUN&amp;quot;)&lt;br /&gt;
MapRotation=(MapId=&amp;quot;datacenter&amp;quot;, GameMode=&amp;quot;SND&amp;quot;)&lt;br /&gt;
MapRotation=(MapId=&amp;quot;sand&amp;quot;, GameMode=&amp;quot;DM&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''bEnabled''' - whether the server appears in the server list (unconfirmed)&lt;br /&gt;
* '''ServerName''' - name it will be listed as. (approx 35 chars max)&lt;br /&gt;
* '''MaxPlayers''' - See suggested specs for limits. 10 standard (10 for shack), 20-24 is max recommended for large maps like Stalingrad or PUSH/RUSH modes, and servers allow a maximum of 24 players.&lt;br /&gt;
* '''ApiKey''' - Unique ApiKey required to register server with master server. Replace with your key&lt;br /&gt;
* '''bSecured''' - enabled Valve Anti-Cheat (VAC)&lt;br /&gt;
* '''bCustomServer''' - activates some new modding tools (save and http functions. Required to write to blacklist.txt for bans)&lt;br /&gt;
* '''bCompetitive''' - sets the server to competitive mode for SND. If removed the server will default to false&lt;br /&gt;
* '''bVerboseLogging''' - enables verbose logging, mostly detailed statistics.  Be prepared for significant increase in logging.&lt;br /&gt;
* '''bWhitelist''' - Only allow users in whitelist.txt to join&lt;br /&gt;
* '''RefreshListTime''' - sets how often the running server checks for updates in ban/whitelist/mod files&lt;br /&gt;
* '''LimitedAmmoType''' - sets limited ammo mode, see Limited Ammo Types table below&lt;br /&gt;
&lt;br /&gt;
* '''TimeLimit''' - sets time limit for each map&lt;br /&gt;
* '''TickRate''' - sets the server tickrate. (so far minimum stable seems around 50 and max around 120. Beware setting this changes weapon despawn time and breaks some game modes. Recommend not touching)&lt;br /&gt;
* '''Password''' - PIN number for server #FYI - this is now also changeable via rcon.&lt;br /&gt;
* '''BalanceTableURL''' - Points to a custom balance table from github. See https://github.com/vankruptgames/BalancingTable for instructions. This line isn't needed if you don't have one. &lt;br /&gt;
* '''MapRotation''' - you can add multiple of these. The map system has switched from the steam workshop to modio which means that the server rotation will need to be redone with modio UGCs. &amp;lt;nowiki&amp;gt;https://mod.io/g/pavlov&amp;lt;/nowiki&amp;gt;. This is done by taking the resource ID from the modio page, adding “UGC” in front of it and then adding that to the rotation. For example the map gravity &amp;lt;nowiki&amp;gt;https://mod.io/g/pavlov/m/gravity1&amp;lt;/nowiki&amp;gt; has a resource ID of 2773760 so the map ID to add to the server would be “UGC2773760”. When a match ends, the server will load the next map in the rotation.  &lt;br /&gt;
* '''AFKTimeLimit''' There is now a feature to kick players who are idle in the game. Integers are measured in sections and 0 disables AFK kicking completely. &lt;br /&gt;
&lt;br /&gt;
Available game modes as of 09/06/2022: See Game modes table below&lt;br /&gt;
&lt;br /&gt;
For maps running a Custom gamemode (CodZ, BR, Duel, etc.) it doesn't matter which gamemode you choose, as the map will automatically override it with the custom mode.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Limited Ammo Types&lt;br /&gt;
!AmmoType&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Unlimited&lt;br /&gt;
|Players have unlimited ammo, carry no ammo boxes and do not display an ammo count on the wrist.&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Limited Generic&lt;br /&gt;
|Players carry ammo boxes with a limited amount of ammo.&lt;br /&gt;
One box for each weapon class (Pistol, Submachine gun, Rifles/MGs, Shotgun, Sniper).&lt;br /&gt;
&lt;br /&gt;
Mags and ammo boxes can be put on the chest of the player to consolidate the ammo.&lt;br /&gt;
&lt;br /&gt;
An ammo count is displayed on the wrist.&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Limited Specific&lt;br /&gt;
|Players carry ammo boxes with a limited amount of ammo.&lt;br /&gt;
One box for each weapon.&lt;br /&gt;
&lt;br /&gt;
Mags and ammo boxes can be put on the chest of the player to consolidate the ammo.&lt;br /&gt;
&lt;br /&gt;
An ammo count is displayed on the wrist.&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Custom&lt;br /&gt;
|Allows for full control over ammo by the map.&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
| Limited Special&lt;br /&gt;
|'''All weapons except &amp;quot;special&amp;quot; weapons are unlimited, more clarification is needed.''' &lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Boxless&lt;br /&gt;
|'''Like limited generic but without boxes? Clarification is needed.'''&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Game modes&lt;br /&gt;
!GameMode &lt;br /&gt;
!Name&lt;br /&gt;
|-&lt;br /&gt;
|DM&lt;br /&gt;
|Death match&lt;br /&gt;
|-&lt;br /&gt;
|KOTH&lt;br /&gt;
|King of the hill&lt;br /&gt;
|-&lt;br /&gt;
|GUN&lt;br /&gt;
| Gun game&lt;br /&gt;
|-&lt;br /&gt;
|OITC&lt;br /&gt;
| One in the chamber&lt;br /&gt;
|-&lt;br /&gt;
|SND&lt;br /&gt;
|Search and destroy&lt;br /&gt;
|-&lt;br /&gt;
|TANKTDM&lt;br /&gt;
|WW2 Team Death Match&lt;br /&gt;
|-&lt;br /&gt;
| TDM&lt;br /&gt;
|Team Death Match&lt;br /&gt;
|-&lt;br /&gt;
|TTT&lt;br /&gt;
|Trouble in Terrorist Town&lt;br /&gt;
|-&lt;br /&gt;
|WW2GUN&lt;br /&gt;
|WW2 gun game&lt;br /&gt;
|-&lt;br /&gt;
|ZWV&lt;br /&gt;
| Zombie wave survival&lt;br /&gt;
|-&lt;br /&gt;
|HIDE&lt;br /&gt;
|The Hidden &lt;br /&gt;
|-&lt;br /&gt;
|INFECTION&lt;br /&gt;
|Hidden infection&lt;br /&gt;
|-&lt;br /&gt;
|PUSH&lt;br /&gt;
|Push&lt;br /&gt;
|-&lt;br /&gt;
|PH&lt;br /&gt;
|Prop hunt&lt;br /&gt;
|}&lt;br /&gt;
= Default Map ID's =&lt;br /&gt;
datacenter &lt;br /&gt;
&lt;br /&gt;
sand&lt;br /&gt;
&lt;br /&gt;
bridge&lt;br /&gt;
&lt;br /&gt;
containeryard&lt;br /&gt;
&lt;br /&gt;
siberia (Prison Break)&lt;br /&gt;
&lt;br /&gt;
hospital (Zombies map)&lt;br /&gt;
&lt;br /&gt;
killhouse&lt;br /&gt;
&lt;br /&gt;
range&lt;br /&gt;
&lt;br /&gt;
tutorial&lt;br /&gt;
&lt;br /&gt;
santorini&lt;br /&gt;
&lt;br /&gt;
station&lt;br /&gt;
&lt;br /&gt;
industry&lt;br /&gt;
&lt;br /&gt;
ogcontainers (Shack only)&lt;br /&gt;
&lt;br /&gt;
haguenau (Shack only)&lt;br /&gt;
&lt;br /&gt;
foundation (Shack only)&lt;br /&gt;
&lt;br /&gt;
stalingrad (PC only)&lt;br /&gt;
&lt;br /&gt;
stalingrad_night (PC only)&lt;br /&gt;
&lt;br /&gt;
santorini_night (PC only)&lt;br /&gt;
&lt;br /&gt;
sand_night (PC only)&lt;br /&gt;
&lt;br /&gt;
station_night (PC only)&lt;br /&gt;
&lt;br /&gt;
industry_night (PC only)&lt;br /&gt;
&lt;br /&gt;
bunker (PC only)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Firewall/Port forwarding ====&lt;br /&gt;
Using the default settings there are two UDP ports (7777, 8177) that need to be allowed to access the server either by firewall setup or port forwarding. &lt;br /&gt;
&lt;br /&gt;
'''Ubuntu''' firewall commands to check firewall and open ports:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo ufw status&lt;br /&gt;
sudo ufw allow 7777&lt;br /&gt;
sudo ufw allow 8177&lt;br /&gt;
sudo ufw allow 9100&lt;br /&gt;
sudo ufw status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Rocky Linux''' firewall commands to check firewall and open ports:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=7777/tcp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=7777/udp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=8177/tcp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=8177/udp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=9100/udp&lt;br /&gt;
sudo firewall-cmd --zone=public --add-port=9100/tcp&lt;br /&gt;
sudo firewall-cmd --list-ports&lt;br /&gt;
firewall-cmd --runtime-to-permanent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may also need to allow Pings (ICMP) for the server's true latency to appear in the master list.&lt;br /&gt;
&lt;br /&gt;
If you are running multiple servers and have set additional ports (see http://wiki.pavlov-vr.com/index.php?title=Dedicated_server#Running_multiple_servers_on_one_host) then you need to allow access to the defined port plus the port 400 higher. So if you use 7000 as your port, then UDP 7000 and 7400 need to be open&lt;br /&gt;
&lt;br /&gt;
If you have setup rcon via RconSettings.txt (below) then that port also need to be allowed access via TCP&lt;br /&gt;
&lt;br /&gt;
If you are running Shack/Quest and want to have maps that are downloadable from your server, your server ports (ex. 7777 &amp;amp; 8177) must also be open via TCP&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Shack Maps (Quest) ====&lt;br /&gt;
&lt;br /&gt;
If you try to use the steps above to add maps for Shack, youll run into issues very quickly. This is because Shack has no affiliation to Steam, and therefore cannot use Steam Workshop maps like above. In the future, these steps will apply to PC servers as well, allowing a server to hold the map itself, instead of offloading to Steam.&lt;br /&gt;
&lt;br /&gt;
To get started, first create the directory to hold the maps&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir -p /home/steam/pavlovserver/Pavlov/Saved/maps&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can use any number of methods to move the map files onto the server, but ill go over the two simplest, starting with a GUI approach&lt;br /&gt;
&lt;br /&gt;
Download and install CyberDuck onto your &amp;quot;home&amp;quot; PC (Whatever PC you use for access to the server, but not the server itsself): https://cyberduck.io/&lt;br /&gt;
&lt;br /&gt;
Next, download and unzip your map of choice from https://www.pavlovquest.com/ , https://pavlovhorde.com/mapsList, or look in #shack-map-showcase channel in the discord server.  I'm going to use Cheeto's WW2 Items test (http://www.mediafire.com/file/emyt9bs1z9u9ykw/SVR_Cheeto_Items.zip/file ) for this example, you do what you like&lt;br /&gt;
&lt;br /&gt;
In the top left corner, open a connection, set the connection type to SFTP, and fill in the rest of the information. User will be root, password is whatever you set the root pw as (toor in Ubuntu by default)&lt;br /&gt;
&lt;br /&gt;
In the directory dropdown (itll say /root) go back to /&lt;br /&gt;
&lt;br /&gt;
Follow the directories until we arrive back at our &amp;quot;maps&amp;quot; folder &amp;lt;pre&amp;gt;/home/steam/pavlovserver/Pavlov/Saved/maps&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Drag and drop the unzipped map folder into the main window, in this case itll be SVR_Cheeto_Items&lt;br /&gt;
&lt;br /&gt;
Hit Allow&lt;br /&gt;
&lt;br /&gt;
Youll now see a folder named SVR_Cheeto_Items, and within it should be nothing but 3 files. If there is another folder in it, move this folder to the maps directory, otherwise the server wont work. The 3 files (2 .PAK one .JSON) should be in home/steam/pavlovserver/Pavlov/Saved/maps/SVR_Cheeto_Items, no more, no less.&lt;br /&gt;
&lt;br /&gt;
Pavlov Shack servers load maps at pavlovserver start.  '''YOU MUST RESTART THE GAME SERVER TO USE THE MAPS.'''&lt;br /&gt;
&lt;br /&gt;
To play the map, you can either use RCON switch map command, or to add the map to your servers automatic map rotation list, add the map's folder name to your Game.ini. This replaces the MapID section, so for our example it would be &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MapRotation=(MapId=&amp;quot;SVR_Cheeto_Items&amp;quot;, GameMode=&amp;quot;TDM&amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And thats all! Disconnect CyberDuck from your server before playing, otherwise youll have difficulty joining.&lt;br /&gt;
&lt;br /&gt;
-----------&lt;br /&gt;
&lt;br /&gt;
==== Adding Shack Maps over Command Line Interface ====&lt;br /&gt;
&lt;br /&gt;
Pavlov Shack servers load maps at pavlovserver start.  '''YOU MUST RESTART THE GAME SERVER TO USE THE MAPS.'''&lt;br /&gt;
&lt;br /&gt;
A bit more complicated, but adding maps over CLI has its benefits&lt;br /&gt;
&lt;br /&gt;
First, CD to the maps directory you made above&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;cd ~/pavlovserver/Pavlov/Saved/maps&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Download the map files from whatever you use to upload them. To do this, you can either use curl or wget&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;curl -O insertURLhere&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;'''If you download your map from Google Drive''', make sure that your .zip folder is shared to anyone.&amp;lt;/p&amp;gt;&lt;br /&gt;
Then, get the file's url from the shared link. &amp;lt;p&amp;gt;Example : ''&amp;lt;nowiki&amp;gt;https://drive.google.com/file/d/19bI8gUHaN5tUrDvnadAacUnchQf6_k/view&amp;lt;/nowiki&amp;gt;''&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;will be ''19bI8gUHaN5tUrDvnadAacUnchQf6_k''&amp;lt;/p&amp;gt;&lt;br /&gt;
Edit &amp;quot;fileId&amp;quot; and &amp;quot;fileName&amp;quot; before you execute the command. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fileId=19bI8gUHaN5tUrDvnadAacUnchQf6_k&lt;br /&gt;
fileName=SVR_USER_MAPNAME&lt;br /&gt;
curl -sc /tmp/cookie &amp;quot;https://drive.google.com/uc?export=download&amp;amp;id=${fileId}&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
code=&amp;quot;$(awk '/_warning_/ {print $NF}' /tmp/cookie)&amp;quot;  &lt;br /&gt;
curl -Lb /tmp/cookie &amp;quot;https://drive.google.com/uc?export=download&amp;amp;confirm=${code}&amp;amp;id=${fileId}&amp;quot; -o ${fileName} &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To keep with the Items example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;curl -O https://cdn.discordapp.com/attachments/744185280759857234/745027406695366788/SVR_Cheeto_Items.zip&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, unzip the file. If this next step errors out, saying the command is unknown, switch back to the root user (su root), and install unzip (sudo apt install unzip), then return to the steam user, and continue.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;unzip SVR_Cheeto_Items.zip&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now finish like before by adding the map to your Game.ini&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;nano /home/steam/pavlovserver/Pavlov/Saved/Config/LinuxServer/Game.ini&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MapRotation=(MapId=&amp;quot;SVR_Cheeto_Items&amp;quot;, GameMode=&amp;quot;TDM&amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Admin/Moderator list (optional) ====&lt;br /&gt;
&lt;br /&gt;
The only working in-game admin menu is through Arctic VR server hosting (see below).  &lt;br /&gt;
&lt;br /&gt;
If you add moderators to your server, they will not be subject to vote kicks. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nano ~/pavlovserver/Pavlov/Saved/Config/mods.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example Mod List:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
76541198397498572 #Optional Comment: Player name&lt;br /&gt;
76541198397498573 #Some Other Player&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ArcticVR Admin Menu ====&lt;br /&gt;
&lt;br /&gt;
[[File:Arcticmenu.jpg|500px|link=https://www.arctic-vr.com/server-admin-menu]]&lt;br /&gt;
&lt;br /&gt;
Arctic-VR Offers an advanced In-Game Admin menu that is exclusive to their hosting service. Features include: &lt;br /&gt;
* Switch Maps+Modes&lt;br /&gt;
* Teleport Players to Players&lt;br /&gt;
* Change Player Skins&lt;br /&gt;
* Control Player Buying+Cash&lt;br /&gt;
* Spawn Items&lt;br /&gt;
* Clean up corpses + guns&lt;br /&gt;
* Spawn Bots&lt;br /&gt;
* Spawn Items for other players&lt;br /&gt;
* Control Teams + Balance/Shuffle Teams&lt;br /&gt;
* ResetSND&lt;br /&gt;
* And More&lt;br /&gt;
&lt;br /&gt;
You can read more about the ArcticVR admin menu on their website: https://www.arctic-vr.com/server-admin-menu&lt;br /&gt;
&lt;br /&gt;
==== Handy tools for finding steamIDs ==== &lt;br /&gt;
&lt;br /&gt;
Steam ID finder: https://steamidfinder.com/lookup/ or https://steamid.xyz/&lt;br /&gt;
&lt;br /&gt;
You want to enter in the steamID64 format. &lt;br /&gt;
&lt;br /&gt;
This tool can convert or lookup IDs:  https://steamid.io/&lt;br /&gt;
&lt;br /&gt;
If you are looking for a steamID of a player that has been on your server recently this is technique to find them:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep -i playername ~/pavlovserver/Pavlov/Saved/Logs/* | grep TicketValidation&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configure Rcon ===&lt;br /&gt;
To enable Rcon access create config file:&lt;br /&gt;
&amp;lt;pre&amp;gt; nano /home/steam/pavlovserver/Pavlov/Saved/Config/RconSettings.txt &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copy in the following text - change password, and if desired the port:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Password=ChangeThisPassword&lt;br /&gt;
Port=9100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You must specify a port for the Rcon server to use as well as a Password (use a different port per sever instance if running multiple server instances off the same hardware)&lt;br /&gt;
&lt;br /&gt;
=== Starting the server ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/pavlovserver &amp;amp;&amp;amp; ./PavlovServer.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That's it, your server will be automatically broadcast to the master server! :) &lt;br /&gt;
&lt;br /&gt;
Two handy tools to determine quickly if your server is broadcasting are [https://pablub.xyz/ Pablub] (PC only) and [https://pavlovhorde.com/ Horde] (Shack) and [https://pavlovhorde.com/pcServers Horde] (PC version)&lt;br /&gt;
&lt;br /&gt;
Note that when you close your terminal, the server will go down. See the &amp;quot;supervisors&amp;quot; section below for how to prevent this.&lt;br /&gt;
&lt;br /&gt;
=== Auto-updating the server ===&lt;br /&gt;
&lt;br /&gt;
Assuming you have followed this guide and used the default paths, users, and install instructions, you can paste the following into your terminal to auto-update your Pavlov server:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; 'EOF' &amp;gt; $HOME/pavlov_daily_update_and_restart.sh&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
USER=&amp;quot;steam&amp;quot;&lt;br /&gt;
SERVICENAME=&amp;quot;pavlovserver.service&amp;quot;&lt;br /&gt;
INSTALLDIRNAME=&amp;quot;pavlovserver&amp;quot;&lt;br /&gt;
USERHOME=&amp;quot;/home/$USER&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;Beginning Pavlov VR update run on $(date)\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
systemctl stop &amp;quot;$SERVICENAME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
sudo -iu &amp;quot;$USER&amp;quot; &amp;quot;$USERHOME/Steam/steamcmd.sh&amp;quot; +login anonymous +force_install_dir &amp;quot;$USERHOME/$INSTALLDIRNAME&amp;quot; +app_update 622970 +exit&lt;br /&gt;
sudo -iu &amp;quot;$USER&amp;quot; &amp;quot;$USERHOME/Steam/steamcmd.sh&amp;quot; +login anonymous +app_update 1007 +quit&lt;br /&gt;
sudo -iu &amp;quot;$USER&amp;quot; cp &amp;quot;$USERHOME/Steam/steamapps/common/Steamworks SDK Redist/linux64/steamclient.so&amp;quot; &amp;quot;$USERHOME/.steam/sdk64/steamclient.so&amp;quot;&lt;br /&gt;
sudo -iu &amp;quot;$USER&amp;quot; cp &amp;quot;$USERHOME/Steam/steamapps/common/Steamworks SDK Redist/linux64/steamclient.so&amp;quot; &amp;quot;$USERHOME/pavlovserver/Pavlov/Binaries/Linux/steamclient.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
systemctl start &amp;quot;$SERVICENAME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;Ending Pavlov VR update run on $(date)\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
chmod +x $HOME/pavlov_daily_update_and_restart.sh&lt;br /&gt;
mkdir $HOME/pavlov_update_logs &amp;amp;&amp;amp; touch $HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log&lt;br /&gt;
CRONLINE=&amp;quot;00 2 * * * $HOME/pavlov_daily_update_and_restart.sh &amp;gt;&amp;gt;$HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log 2&amp;gt;&amp;amp;1&amp;quot;&lt;br /&gt;
(sudo crontab -u root -l; echo &amp;quot;$CRONLINE&amp;quot; ) | sudo crontab -u root -&lt;br /&gt;
unset CRONLINE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These commands will:&lt;br /&gt;
&lt;br /&gt;
1. Create a shell script in the &amp;quot;steam&amp;quot; user's home directory that automatically stops the Pavlov server, pulls any updates via steam, pull updates to the Steamworks SDK Redist, and copies the latest version of steamclient.so to the Pavlov server directory&lt;br /&gt;
&lt;br /&gt;
2. Make the shell script executable&lt;br /&gt;
&lt;br /&gt;
3. Create a new directory called &amp;quot;pavlov_update_logs&amp;quot; in the &amp;quot;steam&amp;quot; user's directory, and create a logfile inside that directory called &amp;quot;pavlov_daily_update_and_restart.sh.log&amp;quot;. You can check this logfile to see the output of the Pavlov and Steam SDK update commands.&lt;br /&gt;
&lt;br /&gt;
4. Create a crontab entry for the root user that runs this shell script automatically every day at 2:00AM local time&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you want to change the time that this script runs, edit the numbers &amp;quot;00 2&amp;quot; in the line that starts with &amp;quot;CRONLINE=&amp;quot;. In the example provided, 00 is the minutes column, and 2 is the hour column. For example, if you wanted the server to automatically update and restart at 4:17AM every day, change the line starting with &amp;quot;CRONLINE=&amp;quot; to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CRONLINE=&amp;quot;17 4 * * * $HOME/pavlov_daily_update_and_restart.sh &amp;gt;&amp;gt;$HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log 2&amp;gt;&amp;amp;1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the time is PM, use 24-hour time format, e.g. &amp;quot;32 18&amp;quot; for 6:32PM.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Supervising the server using systemd ===&lt;br /&gt;
&lt;br /&gt;
Running '''./PavlovServer.sh''' in your interactive shell is easy, but the server will shut down when you close your terminal. If you want to run the server in the background,&lt;br /&gt;
you'll want to run it under a supervisor. There are many options, ranging from the simple (nohup, screen or tmux), to the&lt;br /&gt;
more robust (supervisord, systemd).&lt;br /&gt;
&lt;br /&gt;
Systemd is running by default on Ubuntu Linux, so we'll use that here.&lt;br /&gt;
&lt;br /&gt;
To run the server as a systemd service, create the file '''/etc/systemd/system/pavlovserver.service''' (as root) by typing &lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
sudo nano /etc/systemd/system/pavlovserver.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copy contents below into the file and save.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Pavlov VR dedicated server&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
WorkingDirectory=/home/steam/pavlovserver&lt;br /&gt;
ExecStart=/home/steam/pavlovserver/PavlovServer.sh&lt;br /&gt;
&lt;br /&gt;
RestartSec=1&lt;br /&gt;
Restart=always&lt;br /&gt;
User=steam&lt;br /&gt;
Group=steam&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy = multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you'd like your server to start as competitive without editing the game.ini, change the line &amp;quot;ExecStart=/home/steam/pavlovserver/PavlovServer.sh&amp;quot; to look like this below. Though it's much easier to just use the game.ini to enable competitive instead. &amp;lt;pre&amp;gt;ExecStart=/home/steam/pavlovserver/PavlovServer.sh -COMPETITIVE=1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Change the user or paths as appropriate. After saving the service file, to start, restart, stop, or monitor the server:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl start pavlovserver&lt;br /&gt;
sudo systemctl restart pavlovserver&lt;br /&gt;
sudo systemctl stop pavlovserver&lt;br /&gt;
sudo systemctl status pavlovserver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To view the logs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo journalctl -u pavlovserver&lt;br /&gt;
# to live-tail the logs&lt;br /&gt;
sudo journalctl -u pavlovserver -f&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want to run the pavlov server as soon as your server boots (e.g. a VPS you turn on and off), add pavlov as a startup service:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl enable pavlovserver&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Advanced Server Administration ==&lt;br /&gt;
&lt;br /&gt;
=== Running multiple servers on one host ===&lt;br /&gt;
&lt;br /&gt;
* Pavlovserver is functionally single threaded (there are multiple threads, but vast majority of work occurs in the primary one). Make sure you have # of pavlovservers + 1 CPU available. More CPUs= more servers. Faster CPU = more players. &lt;br /&gt;
* Make multiple server installs by defining a separate install dir for each server.&lt;br /&gt;
* Run each server with a unique port. eg: '''./PavlovServer.sh -PORT=&amp;quot;Desired Port&amp;quot;'''&lt;br /&gt;
* The Server will use the Desired Port and the Port 400 above (Example: You choose 8200 as Port. So Port 8600 will be used as well)&lt;br /&gt;
* If you are using RCON, each server will need a unique port defined in RconSettings.txt &lt;br /&gt;
* Ensure the ports are forwarded and opened in your firewall &lt;br /&gt;
&lt;br /&gt;
To duplicate directories:&lt;br /&gt;
&lt;br /&gt;
be in the steam home folder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp -r pavlovserver pavlovserver1&lt;br /&gt;
/home/steam/pavlovserver1/PavlovServer.sh -PORT=[Desired Port]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Starting server in competitive mode ===&lt;br /&gt;
Competitive mode will prevent dead teammates from being able to see the match, to prevent ghosting.&lt;br /&gt;
You can either enable this via Game.ini (described in Game.ini file), or using the -COMPETITIVE=1 parameter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/steam/pavlovserver1/PavlovServer.sh -COMPETITIVE=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Useful Linux Commands ===&lt;br /&gt;
List files / folders in directory, print current working directory, &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -la                                    #list files/directories along with authorities and ownership&lt;br /&gt;
pwd                                       #print working directory&lt;br /&gt;
sudo chown &amp;lt;owner&amp;gt; &amp;lt;file/directory&amp;gt;       #change owner of file/directory.  If root created something and you need to change it to steam&lt;br /&gt;
sudo chgrp &amp;lt;group&amp;gt; &amp;lt;file/directory&amp;gt;       #change group of file/directory.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Check if pavlov is running by checking process status.  If the only row you see is the grep command, pavlov server is not started.&lt;br /&gt;
&amp;lt;pre&amp;gt; ps -ef | grep pav &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sample output:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
steam      34044       1  0 16:52 ?        00:00:00 /bin/sh /home/steam/pavlovserver/PavlovServer.sh&lt;br /&gt;
steam      34066   34044 80 16:52 ?        00:00:04 /home/steam/pavlovserver/Pavlov/Binaries/Linux/PavlovServer&lt;br /&gt;
zombies+   34101   34013  0 16:52 pts/0    00:00:00 grep --color=auto pav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kill a process.  Note this command uses 34044, which is a process id from the command output above.&lt;br /&gt;
&amp;lt;pre&amp;gt; kill -9 34044           &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dump the log to the console so you can scroll through it:&lt;br /&gt;
&amp;lt;pre&amp;gt; cat /home/steam/pavlovserver/Pavlov/Saved/Logs/Pavlov.log &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Search the log for a string - replace my_string with case-sensitive string&lt;br /&gt;
&amp;lt;pre&amp;gt; cat /home/steam/pavlovserver/Pavlov/Saved/Logs/Pavlov.log | grep my_string &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:RCON automation]]&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
	<entry>
		<id>http://pavlovwiki.com/index.php?title=Main_Page&amp;diff=737</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://pavlovwiki.com/index.php?title=Main_Page&amp;diff=737"/>
		<updated>2023-06-23T16:26:53Z</updated>

		<summary type="html">&lt;p&gt;Junt: Updated modkit description to be more clear.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Welcome to the Pavlov VR Wiki. &amp;lt;br /&amp;gt;&lt;br /&gt;
Pavlov is a team-based multiplayer VR shooter game with realistic weapon handling and the most popular VR shooter of all time. Play a variety of game modes with over 65 interactable weapons and attachments in various environments. &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Pavlov has an active Discord. You can join the Pavlov VR Discord here: https://discord.com/invite/pavlov-vr&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GET PAVLOV ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://store.steampowered.com/app/555160/Pavlov_VR/ PC]&lt;br /&gt;
| Pavlov is available on PCVR through Steam&lt;br /&gt;
|-&lt;br /&gt;
| [https://www.oculus.com/experiences/quest/3649611198468269/ QUEST]&lt;br /&gt;
| Pavlov is available on Quest through the Oculus AppLab program with a store release planned at some point&lt;br /&gt;
|-&lt;br /&gt;
| [https://store.playstation.com/en-us/concept/10005322 PS5]&lt;br /&gt;
| Pavlov is available on the Playstation Store &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HELP/TROUBLESHOOTING ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''[[PC Troubleshooting|PC Troubleshooting]]'''&lt;br /&gt;
| Troubleshoot some of the issues related to Pavlov on PC&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Quest Troubleshooting|Quest Troubleshooting]]'''&lt;br /&gt;
| Troubleshoot some of the issues related to Pavlov Shack on Quest&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| '''[[PS5 Troubleshooting|PS5 Troubleshooting]]'''&lt;br /&gt;
| Troubleshoot some of the issues related to the PSVR2 version of pavlov&lt;br /&gt;
|-&lt;br /&gt;
| [https://discord.com/invite/pavlov-vr Contact Support]&lt;br /&gt;
| The Pavlov VR Discord is the main place to ask questions and get troubleshooting help. If you don't have discord you can also reach support at support@vankrupt.com.&lt;br /&gt;
|-&lt;br /&gt;
| [https://www.vankrupt.com/#contact Jobs]&lt;br /&gt;
| Vankrupt Games is hiring. If you are looking for work please email jobs@vankrupt.com. &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GAME INFORMATION ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Weapons|Weapons]]'''&lt;br /&gt;
| List and information on the weapons of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Vehicles|Vehicles]]'''&lt;br /&gt;
| List and information on the vehicles of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Attachments|Attachments]]'''&lt;br /&gt;
| List and information on the Attachments of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Default Maps|Default Maps]]'''&lt;br /&gt;
| List, Pictures and information on the Default maps of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Gamemodes|Game Modes]]'''&lt;br /&gt;
| List and information on the game modes of Pavlov VR&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Achievements|Achievements]]'''&lt;br /&gt;
| List and information on the achievements of Pavlov VR available on the PS5 version&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Update Changelog|Update Changelog]]'''&lt;br /&gt;
| A history of changes made to the game&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Game Settings|Game Settings]]'''&lt;br /&gt;
| List and information on the game settings&lt;br /&gt;
|-&lt;br /&gt;
|[[Shack RC|'''Shack RC''']]&lt;br /&gt;
|Information about the public test version of shack which features content from PCVR/PSVR&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== WORKSHOP/MAPMAKING/MODDING ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/vankruptgames/PavlovVR-ModKit Modkit 4.21]&lt;br /&gt;
| Current official Shack Modkit and Legacy PC Update 28 (Workshop) for UE 4.21&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/vankruptgames/PavlovVR-ModKit/tree/4.27 Modkit 4.27]&lt;br /&gt;
| Current official Shack(RC) Modkit for UE 4.27&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/vankruptgames/PavlovVR-ModKit/tree/5.1.1 Modkit 5.1]&lt;br /&gt;
| Current official PCVR Modkit for UE 5.1 (Mod.io)&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Getting Started|Getting Started]]'''&lt;br /&gt;
| A basic Tutorial on how to download and set up the Editor, create your first level and upload it&lt;br /&gt;
|-&lt;br /&gt;
| '''[[ItemIDs|ItemIDs]]'''&lt;br /&gt;
| All of the items in the game&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Community Modkit Tools|Community Modkit Tools]]'''&lt;br /&gt;
| Community made tools for map makers&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Community Gamemodes|Community Gamemodes]]'''&lt;br /&gt;
| Community made game modes&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Workshop troubleshooting|Workshop troubleshooting]]'''&lt;br /&gt;
| Troubleshoot common mistakes with workshop projects&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Helpful Videos|Helpful Videos]]'''&lt;br /&gt;
| Video Tutorials&lt;br /&gt;
|-&lt;br /&gt;
|'''[[Making Skins]]'''&lt;br /&gt;
|Creating weapon and player model skins for Pavlov&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|'''[[Custom Guns]]'''&lt;br /&gt;
|How to use the modkit to add custom weapons to your level&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== WORKSHOP GUIDES ====&lt;br /&gt;
&lt;br /&gt;
| '''[[Changing the character model|Changing the character model]]'''&lt;br /&gt;
| A guide on replacing character models with your own&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Replacing the scoreboard|Replacing the scoreboard]]'''&lt;br /&gt;
| How to replace the scoreboard with your own, or turn it into a custom menu&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Modeling in Blender]]'''&lt;br /&gt;
| A quick tip sheet for using Blender to model in Unreal Engine&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Bot Navigation|Bot Navigation]]'''&lt;br /&gt;
| A more detailed topic about Bot Navigation and tips for your custom maps&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|+ &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== COMMUNITY SERVERS ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Setting up a dedicated server|Setting up a dedicated server]]'''&lt;br /&gt;
| A guide and information on setting up a community server&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Troubleshooting Servers|Troubleshooting Servers]]'''&lt;br /&gt;
| Troubleshooting steps to help with setting up a community server. &lt;br /&gt;
|-&lt;br /&gt;
|[[Hosting Providers]]&lt;br /&gt;
|If you wish to purchase a Pavlov server instead of setting it up yourself here is a list of hosting providers&lt;br /&gt;
|-&lt;br /&gt;
| '''[[Rcon Overview and Commands|Rcon Overview and Commands]]'''&lt;br /&gt;
| RCON (Remote CONnection) is a tool that allows server owners to manage their server and do things like spawn items. &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}{| style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
 &amp;lt;p style=&amp;quot;margin:1em auto 1; text-align:center; width:800px;&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OTHER TOPICS ==&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| '''[[PAV TV|PAV TV]]'''&lt;br /&gt;
| Current official game modes and how to play them&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Junt</name></author>
	</entry>
</feed>