PavlovArtists Weapon Skin Pack is the first ever server and client mod that works across all maps released for Pavlov Shack. It gives the players a menu in which they can manage skins for their weapons. The skins are visible to other players and are applied to the weapon permanently until it despawns, so players can trade weapons and mags along with their skins, or steal them from their foes.
The mod gets installed on players' headset when the map rotates, so first time joiners won't see the menu or the skins just yet.
The skin pack should download automatically when the map rotates, but map downloads through the game aren't always the most reliable. If you're struggling with it, you can download the mod separately and copy it to your headset manually. These sideloaded archives also may contain higher-resolution textures than the server version.
SVR_PavlovArtists_Mod_WeaponSkinPack.zip (Shack Live)
SVR_PavlovArtists_Mod_WeaponSkinPack.zip (Shack RC)
This guide assumes the dedicated server was set up on a Linux machine according to instructions at PavlovVR Wiki.
/home/steam/pavlovserver/
/home/steam/pavlovserver/Pavlov/Saved/Config/ModSave/WeaponSkinPack/serverconfig.json
is presentMapRotation=(MapId="SVR_PavlovArtists_Mod_WeaponSkinPack", GameMode="CUSTOM")
between every map in your rotation in /home/steam/pavlovserver/Pavlov/Saved/Config/LinuxServer/Game.ini
MapRotation=(MapId="santorini", GameMode="SND") MapRotation=(MapId="SVR_PavlovArtists_Mod_WeaponSkinPack", GameMode="CUSTOM") MapRotation=(MapId="datacenter", GameMode="TDM") MapRotation=(MapId="SVR_PavlovArtists_Mod_WeaponSkinPack", GameMode="CUSTOM") MapRotation=(MapId="sand", GameMode="SND") MapRotation=(MapId="SVR_PavlovArtists_Mod_WeaponSkinPack", GameMode="CUSTOM") MapRotation=(MapId="industry", GameMode="DM") MapRotation=(MapId="SVR_PavlovArtists_Mod_WeaponSkinPack", GameMode="CUSTOM")
By default the mod stores server configuration and player data in JSON format in your server's ModSave directory. This should be good enough for smaller private servers with up to hundreds of total visitors. If you own a large server network, look into the HTTP storage section.
The server can be configured by editing /home/steam/pavlovserver/Pavlov/Saved/Config/ModSave/WeaponSkinPack/serverconfig.json
These are the configuration options in the file
Mode
"Free"
- all skins are available to everyone and you don't have to purchase them. Consider using this mode on your server if you have only occasional visitors and you'd like your players to have fun with custom skins."Restricted"
- no skins are available to anyone by default. You have to explicitly enable specific skins either for all players or for specific players. Consider using this mode in heavily moderated communities like PCL, or on servers where you want only your admins/VIPs to own skins."Paid"
- all skins are available to everyone, but players have to purchase them for in-game points. Consider using this mode when you want to reward players that play a lot on your server, so that they can buy the skins wich will give them prestige among others. Don't forget to set TrackScore to true if you enable this mode.TrackScore
PriceMultiplier
SkinConfig
Mode
- overrides the server-wide Mode for this skin. So if you're using server-wide Restricted mode, here you can enable individual skins for all players by setting them as Free."Free"
- The skin will be available for free to everyone"Restricted"
- the skin won't be available to anyone (unless explicitly allowed for individual players in PlayerConfig section)"Paid"
- the skin will be available to everyone, but players have to purchase it for in-game points"Mode": "Paid", "SkinConfig": { "m4_mark": { "Price": 100 }, "ak47_goldtrim": { "Mode": "Restricted" } }
PlayerConfig
Mode
- overrides the server-wide or skin-specific availability setting for this player. As usual the valid values are Free, Restricted and Paid. You can also skip this setting and it will use the default configuration for the skinAllowedSkins
- list of skin IDs which are normally Restricted, but are available for this player anyway. Consider restricting some skin and make it available only to certain players with this setting as an event or season reward or someting.RestrictedSkins
- list of skin IDs which are normally Free or Paid, but are restricted for this player anyway. Honestly I don't know what I'd use this for, but since there's the AllowedSkins list, we might as well have the opposite."Mode": "Paid", "SkinConfig": { "ak47_goldtrim": { "Mode": "Restricted", "Price": 0 } }, "PlayerConfig": { "markyxl": { "Mode": "Free" }, "CHALK": { "AllowedSkins": ["ak47_goldtrim"] } }
If you own a server with larger playerbase, then you might want to consider saving the player data and server config in a database. The mod can communicate with the storage over HTTP. You can either use a storage server by someone else (although none exist at the time of writing this), or implement your own based on the HTTP spec below. Note that this method is intended only for a handful of very experienced people owning large server networks.
To use http storage, replace the entire contents of /home/steam/pavlovserver/Pavlov/Saved/Config/ModSave/WeaponSkinPack/serverconfig.json
with following config attributes instead:
RemoteUrl
- the url of the endpoint, including protocol and port.ServerKey
- a key that serves two purposes{ "RemoteUrl": "http://192.168.144.1:5000/pavlovWeaponSkinPack", "ServerKey": "mysupersecretpassword:server1" }
Warning: If you're a regular server owner you really shouldn't read this. This section is intended for 2 or 3 people in the whole Pavlov community.
All requests are done with the GET verb.
All parameters are passed to the mod in headers.
Headers present in every request:
serverkey
- the same string that the server has in ServerKey
in serverconfig.json
. Use this to recognize from which server the request came in.cmd
- the operation the request is supposed to perform, see the list below. Normally this would be part of the URL, but since everything is in headers, then what the hellcmd: sconfig
curl http://localhost:5265/pavlovWeaponSkinPack --header "serverkey: abc123" --header "cmd: sconfig"
{"Mode":"Paid","TrackScore":true,"PriceMultiplier":0.5}
cmd: pconfig
player
- Oculus name of the playerOwnedSkins
, which lists skin IDs wich the player bought in Paid modecurl http://localhost:5265/pavlovWeaponSkinPack --header "serverkey: abc123" --header "cmd: pconfig" --header "player: markyxl"
{"Mode":"Paid","AllowedSkins":["ak47_goldtrim"],"RestrictedSkins":[],"OwnedSkins":["m4_mark", "ak47_goldtrim"]}
cmd: pstate
player
- Oculus name of the playerCash
and integer value of the player's cashcurl http://localhost:5265/pavlovWeaponSkinPack --header "serverkey: abc123" --header "cmd: pstate" --header "player: markyxl"
{"Cash":798}
cmd: changecash
player
- Oculus name of the playercashdelta
- Either positive or negative integer how much the player's Cash should change relative to current amountcurl http://localhost:5265/pavlovWeaponSkinPack --header "serverkey: abc123" --header "cmd: changecash" --header "player: markyxl" --header "cashdelta: 2000"
cmd: buyskin
player
- Oculus name of the playerskin
- Skin ID to add to the OwnedSkins list replied in future pconfig requestsprice
- The cost of the skin. A positive integer that should be subtracted from the player's available currency. If you're wondering if it isn't weird that the price is sent like this instead of being internal, then it's because I don't want you to have to replicate all the logic with price multiplier, modes, and per-player prices in the backend.curl http://localhost:5265/pavlovWeaponSkinPack --header "serverkey: abc123" --header "cmd: buyskin" --header "player: markyxl" --header "skin: m4_klair" --header "price: 200"