/// PIMPMYRUST PLUGIN
VoteCommands
Settings guide for this version of VoteCommands. Check the plugin page before using it on your server.
Prepare your file
- Check the installed version
This guide describes VoteCommands 0.2.0. Use the same version in the configurator.
- Get the settings
Click Import, then From my server. Select the files and confirm loading them. Selecting a server does not replace the open document. You can also import files from this device or a configuration from My projects.
- Edit and send
Adjust settings, fix errors, then use Send to transfer files to the selected server. A conflict blocks sending until you choose how to resolve it. You can still export only the files you need.
Server transfers have private backups. Save keeps your work in My projects; it does not send anything to the server. A download also lets you resume without a server connection.
Settings for this version
General 10
- Enable
- On / off · required
Enable this voting controller. Each configuration file is an independent controller with its own choices and commands.
JSON path
Enabled - Start automatically
- On / off · required
Start this controller's first vote after loading or reloading, using DelayBeforeAutomaticStart. When disabled it needs a manual start; repetition is configured separately.
JSON path
AutomaticStart - Repeat voting sessions
- On / off · required
After the first manual or automatic start, start another vote every TimeBetweenSessions. When disabled, starting opens only one session.
JSON path
AutomaticSessions - Automatic start delay (seconds)
- Number · required
Seconds to wait after the controller loads before the first automatic vote. Used only when automatic start is enabled.
JSON path
DelayBeforeAutomaticStart - Command to start voting
- Text · required
Chat alias for a Rust administrator to start this controller, without a leading /. Choose a unique alias different from the ballot-opening command.
JSON path
CommandForStartSessions - Command to open the ballot
- Text · required
Chat alias opening the ballot during a session, without a leading /. Voting still requires VoteCommands.<filename>.Vote (or administrator status); opening the ballot does not start a session.
JSON path
CommandForUi - Interval between session starts (seconds)
- Number · required
Time between repeated vote starts, not a delay after the result. Only applies when AutomaticSessions is enabled and must exceed VoteDurationSeconds.
JSON path
TimeBetweenSessionsMinimum : 0
- Vote layout
- Choice
Chooses the native layout for this vote. Legacy uses the existing UIConfiguration settings. This version does not require PimpMyCUI.
JSON path
CuiTemplateAllowed values: operations-console, civic-ballot, relay-grid, arctic-council, broadcast-panel, legacy
- Vote title
- JSON value
Optional title shown above the choices. Empty or null uses the language-file title.
JSON path
CuiTitle - Vote question
- JSON value
Optional question shown above the ballot. Empty or null uses the language-file question.
JSON path
CuiQuestion
Voting duration and choices 2
- Voting duration (seconds)
- Whole number · required
Time players have to vote, in seconds. At the end the controller resolves the winner; the repeat interval must exceed this duration.
JSON path
CommandsConfiguration → VoteDurationSecondsMinimum : 10 · Maximum : 3600
- Ballot choices
- Object list · required
Ballot choices in list order. Each entry contains its name, image and winner actions; the image and name are not themselves commands.
JSON path
CommandsConfiguration → VoteCommands
Close button 2
- Size
- Whole number · required
Only applies to the Legacy vote layout. Width and height of the legacy interface’s square close button, in CUI reference pixels.
JSON path
UIConfiguration → CloseButtonConfiguration → Size - Image URL
- Text · required
Only applies to the Legacy vote layout. Legacy ballot close-button image. Closing does not withdraw a recorded vote or end the session.
JSON path
UIConfiguration → CloseButtonConfiguration → ImageUrl
Countdown 4
- Bottom-left corner
- Text · required
Only used by the Legacy interface. Place this corner within the screen. X: left (0) to right (1). Y: bottom (0) to top (1). Both corners define the area's size.
JSON path
UIConfiguration → CountDownConfiguration → AnchorMin - Top-right corner
- Text · required
Only used by the Legacy interface. Place this corner within the screen. X: left (0) to right (1). Y: bottom (0) to top (1). Both corners define the area's size.
JSON path
UIConfiguration → CountDownConfiguration → AnchorMax - Bottom-left offset
- Text · required
Only used by the Legacy interface. Move this corner in pixels. Positive X moves right; positive Y moves up.
JSON path
UIConfiguration → CountDownConfiguration → OffsetMin - Top-right offset
- Text · required
Only used by the Legacy interface. Move this corner in pixels. Positive X moves right; positive Y moves up.
JSON path
UIConfiguration → CountDownConfiguration → OffsetMax
Ballot title 1
- Title height
- Number · required
Only applies to the Legacy vote layout. Fraction of window height reserved for the legacy header. Example: 0.1 = 10%. It reduces the remaining room for choices.
JSON path
UIConfiguration → TitleConfiguration → Height
Choice layout 4
- Vertical margin
- Number · required
Only applies to the Legacy vote layout. Vertical margin around choices as a fraction of window height. Example: 0.01 = 1% on each side.
JSON path
UIConfiguration → VoteCommandsConfiguration → MarginHeight - Horizontal margin
- Number · required
Only applies to the Legacy vote layout. Horizontal margin around choices as a fraction of window width. Example: 0.01 = 1% on each side.
JSON path
UIConfiguration → VoteCommandsConfiguration → MarginWidth - Background color
- Text · required
Only applies to the Legacy vote layout. Legacy panel color behind all ballot-choice cards. Rust RGBA from 0 to 1; final value = opacity.
JSON path
UIConfiguration → VoteCommandsConfiguration → BackgroundColor - Option spacing
- Number · required
Only applies to the Legacy vote layout. Space between choices as a fraction of their container. Example: 0.01 = 1%. More spacing leaves less width for cards.
JSON path
UIConfiguration → VoteCommandsConfiguration → MarginBetweenCommands
Voting window 4
- Width
- Whole number · required
Only applies to the Legacy vote layout. Legacy window width in CUI reference pixels. Excessive width may exceed smaller screens.
JSON path
UIConfiguration → WindowConfiguration → Width - Height
- Whole number · required
Only applies to the Legacy vote layout. Legacy window height in CUI reference pixels. Allow enough room for every ballot choice.
JSON path
UIConfiguration → WindowConfiguration → Height - Background image URL
- JSON value · required
Only applies to the Legacy vote layout. Retained field, but the VoteCommands 0.2.0 renderer does not use it. The window uses BackgroundColor; changing this URL does not add a background image.
JSON path
UIConfiguration → WindowConfiguration → BackgroundImageUrl - Background color
- Text · required
Only applies to the Legacy vote layout. Legacy ballot-window background color. Keep sufficient contrast with choices. Rust RGBA from 0 to 1; final value = opacity.
JSON path
UIConfiguration → WindowConfiguration → BackgroundColor
Countdown · Text style 4
- Text size
- Whole number · required
Only applies to the Legacy vote layout. Legacy text size for the countdown. Increasing it improves visibility but can overflow its area; it does not resize the panel.
JSON path
UIConfiguration → CountDownConfiguration → LabelConfiguration → FontSize - Text color
- Text · required
Only applies to the Legacy vote layout. Legacy text color for the countdown. Check contrast against its panel. Rust RGBA from 0 to 1; final value = opacity.
JSON path
UIConfiguration → CountDownConfiguration → LabelConfiguration → Color - Font
- Text · required
Only applies to the Legacy vote layout. Legacy font for the countdown. Choose a font available in the Rust client: a font installed only on your PC will not display for players.
JSON path
UIConfiguration → CountDownConfiguration → LabelConfiguration → Font - Text alignment
- Whole number · required
Only applies to the Legacy vote layout. Legacy alignment of the countdown inside its panel, without moving the panel. Unity alignment: 0–2 top, 3–5 middle, 6–8 bottom; 4 = centered.
JSON path
UIConfiguration → CountDownConfiguration → LabelConfiguration → TextAnchor
Ballot title · Text style 4
- Text size
- Whole number · required
Only applies to the Legacy vote layout. Legacy text size for the ballot title. Increasing it improves visibility but can overflow its area; it does not resize the panel.
JSON path
UIConfiguration → TitleConfiguration → LabelConfiguration → FontSize - Text color
- Text · required
Only applies to the Legacy vote layout. Legacy text color for the ballot title. Check contrast against its panel. Rust RGBA from 0 to 1; final value = opacity.
JSON path
UIConfiguration → TitleConfiguration → LabelConfiguration → Color - Font
- Text · required
Only applies to the Legacy vote layout. Legacy font for the ballot title. Choose a font available in the Rust client: a font installed only on your PC will not display for players.
JSON path
UIConfiguration → TitleConfiguration → LabelConfiguration → Font - Text alignment
- Whole number · required
Only applies to the Legacy vote layout. Legacy alignment of the ballot title inside its panel, without moving the panel. Unity alignment: 0–2 top, 3–5 middle, 6–8 bottom; 4 = centered.
JSON path
UIConfiguration → TitleConfiguration → LabelConfiguration → TextAnchor
Choice appearance 4
- Inner padding
- Number · required
Only applies to the Legacy vote layout. Legacy field retained in configuration but unused by the VoteCommands 0.2.0 renderer. Do not rely on it to change spacing.
JSON path
UIConfiguration → VoteCommandsConfiguration → VoteCommandConfiguration → Padding - Background color
- Text · required
Only applies to the Legacy vote layout. Legacy background color for each choice card, not the whole window. Rust RGBA from 0 to 1; final value = opacity.
JSON path
UIConfiguration → VoteCommandsConfiguration → VoteCommandConfiguration → BackgroundColor - Vote count area size
- Whole number · required
Only applies to the Legacy vote layout. Space reserved for a card’s vote count, in CUI reference pixels.
JSON path
UIConfiguration → VoteCommandsConfiguration → VoteCommandConfiguration → VotesCountSize - Image height
- Number · required
Only applies to the Legacy vote layout. Fraction of card height reserved for its image. Example: 0.85 = 85%; the remainder is used for the choice name.
JSON path
UIConfiguration → VoteCommandsConfiguration → VoteCommandConfiguration → ImageHeight
Choice name style 4
- Text size
- Whole number · required
Only applies to the Legacy vote layout. Legacy text size for each choice name. Increasing it improves visibility but can overflow its area; it does not resize the panel.
JSON path
UIConfiguration → VoteCommandsConfiguration → VoteCommandConfiguration → NameLabelConfiguration → FontSize - Text color
- Text · required
Only applies to the Legacy vote layout. Legacy text color for each choice name. Check contrast against its panel. Rust RGBA from 0 to 1; final value = opacity.
JSON path
UIConfiguration → VoteCommandsConfiguration → VoteCommandConfiguration → NameLabelConfiguration → Color - Font
- Text · required
Only applies to the Legacy vote layout. Legacy font for each choice name. Choose a font available in the Rust client: a font installed only on your PC will not display for players.
JSON path
UIConfiguration → VoteCommandsConfiguration → VoteCommandConfiguration → NameLabelConfiguration → Font - Text alignment
- Whole number · required
Only applies to the Legacy vote layout. Legacy alignment of each choice name inside its panel, without moving the panel. Unity alignment: 0–2 top, 3–5 middle, 6–8 bottom; 4 = centered.
JSON path
UIConfiguration → VoteCommandsConfiguration → VoteCommandConfiguration → NameLabelConfiguration → TextAnchor
Vote count style 4
- Text size
- Whole number · required
Only applies to the Legacy vote layout. Legacy text size for each choice's vote count. Increasing it improves visibility but can overflow its area; it does not resize the panel.
JSON path
UIConfiguration → VoteCommandsConfiguration → VoteCommandConfiguration → VotesCountLabelConfiguration → FontSize - Text color
- Text · required
Only applies to the Legacy vote layout. Legacy text color for each choice's vote count. Check contrast against its panel. Rust RGBA from 0 to 1; final value = opacity.
JSON path
UIConfiguration → VoteCommandsConfiguration → VoteCommandConfiguration → VotesCountLabelConfiguration → Color - Font
- Text · required
Only applies to the Legacy vote layout. Legacy font for each choice's vote count. Choose a font available in the Rust client: a font installed only on your PC will not display for players.
JSON path
UIConfiguration → VoteCommandsConfiguration → VoteCommandConfiguration → VotesCountLabelConfiguration → Font - Text alignment
- Whole number · required
Only applies to the Legacy vote layout. Legacy alignment of each choice's vote count inside its panel, without moving the panel. Unity alignment: 0–2 top, 3–5 middle, 6–8 bottom; 4 = centered.
JSON path
UIConfiguration → VoteCommandsConfiguration → VoteCommandConfiguration → VotesCountLabelConfiguration → TextAnchor
Plugin instructions
Vote Commands 0.2.0 — installation and configuration
This native update adds five templates copied from the 1.0.0 beta, without requiring PimpMyCUI. Compatible beta fixes are included; vote rules and scheduling remain those of the 0.1.3 LTS. This is a local, unpublished candidate.
Configure ballot choices
Under Vote, the table lists each choice and its active server commands and plugin calls. Click a name to edit its presentation, or Actions to set what runs if it wins. Add choice creates another option. A newly added action stays disabled until you enable it; check its parameters before using it.
Choose a template
In each oxide/config/VoteCommands/<name>.json, add or change:
"CuiTemplate": "operations-console",
"CuiTitle": "Blueprint policy",
"CuiQuestion": "Which blueprint policy should we use next wipe?"Available values: operations-console (default), civic-ballot, relay-grid, arctic-council, broadcast-panel. Use legacy for the old interface configured through UIConfiguration; keep that existing section. Old files without the new fields use the default native template. Unknown template names reject that file with a console message.
Title and question are optional: missing, empty or null values use language messages. Reload with oxide.reload VoteCommands after editing; current votes stop without winner actions. Each controller can use its own template. Templates are embedded in the plugin; there are no extra CUI files or dependencies to install.
The UI shows three options per page with live counts and vote shares. Arrow buttons reach later choices. A player's selected choice remains marked after reopening. Each option uses its configured ImageUrl; an empty URL is valid. Set ImageAspectRatio to width/height (e.g. 1.5 for 900 × 600). The default is 1; images keep their aspect ratio.
Install or update
- Back up your existing VoteCommands plugin, configurations and language file.
- In the server console, run
oxide.unload VoteCommandsif it is already installed. - Copy the JSON files from this ZIP's
oxide/config/VoteCommands/into the server's matching folder. Do not overwrite any files you have customized: compare them or give new copies different names and unique chat commands. - Copy
oxide/lang/en/VoteCommands.jsonif you do not already have a customized English language file. - Copy
oxide/plugins/VoteCommands.cslast. The framework normally loads it automatically; otherwise runoxide.load VoteCommands. - Check the server console for
Add VoteCommand Configuration : Exampleand any errors.
The paths above are relative to the server root for Oxide. On Carbon, use the corresponding carbon/plugins, carbon/config/VoteCommands and carbon/lang/en folders. The plugin uses the framework's configured config directory.
There is no single settings file at `oxide/config/VoteCommands.json`. Each vote has its own JSON file inside oxide/config/VoteCommands/.
If you install only the plugin, version 0.2.0 creates Example.json automatically when that directory contains no JSON files (including subfolders). It also registers default English messages. Existing JSON files are never overwritten. A malformed existing file produces a console error; it is not silently replaced. If all files are disabled, the plugin reports that no enabled votes were loaded.
First test (no winner commands are executed)
The supplied/generated Example.json is enabled, manual, and has all winner actions disabled.
- Join as a server administrator.
- In game chat, enter
/vote_start. - Enter
/voteand choose an option. - Wait 60 seconds for the result.
- To let ordinary players vote, run this in the server console:
oxide.grant group default VoteCommands.Example.VoteThe permission contains the filename without .json, including its spelling. Rename the permission when you rename a configuration. The start command is administrator-only in this version; granting the registered VoteCommands.Example.Start permission alone does not make a non-admin eligible to start it. Ordinary players can view the ballot but need the Vote permission to participate.
Edit a vote
Edit a complete supplied JSON file; keep its UIConfiguration section. After saving, run oxide.reload VoteCommands. Reloading aborts current sessions without executing their winner actions and resets the schedule.
| Setting | Meaning |
|---|---|
Enabled | Loads this vote when true; ignores it when false. |
CommandForStartSessions | Admin chat command, without the leading slash. |
CommandForUi | Chat command that opens this vote's window, without the slash. |
CommandsConfiguration.VoteDurationSeconds | How long each voting session lasts, in seconds. |
AutomaticStart | Starts voting after plugin load/reload when true. |
DelayBeforeAutomaticStart | Delay after load/reload, in seconds, when AutomaticStart is true. |
AutomaticSessions | Repeats sessions once started (manually or automatically). |
TimeBetweenSessions | Seconds between session starts, not an extra delay after the previous result. Must exceed the vote duration when repeating. |
For a 60-second vote every 20 minutes, set VoteDurationSeconds to 60, TimeBetweenSessions to 1200, and AutomaticSessions to true. Also set AutomaticStart to true if this should begin automatically after loading.
Every enabled file must have a unique filename and two unique chat commands. Disabled or invalid files do not register their commands. Automatic schedules use elapsed time: the skip-night example does not detect sunset automatically.
Options and winner actions
Beta validation guards reject unsafe chat identifiers (32 characters maximum), callback identifiers (64 characters maximum), and enabled server commands with CR/LF/NUL or more than 256 characters. Identifiers allow letters, digits, dots, dashes and underscores. Non-empty image URLs must use HTTP or HTTPS without credentials, whitespace or control characters. Native HTTP support is retained. Rejected configuration files remain untouched; correct the reported field and reload.
Each entry under CommandsConfiguration.VoteCommands has a name, an image URL, and optional actions. Use direct image URLs; remotely hosted images must remain accessible.
{
"Name": "Day",
"ImageUrl": "https://i.postimg.cc/FkmPrP6v/4.png",
"PluginCallbacks": null,
"ServerCommands": [
{ "Enabled": true, "Command": "env.time 6" }
]
}This is an option fragment, not a full configuration. A null action list is valid. Each action has its own Enabled flag. Test the exact command in the server console first, then enable it in the configuration.
For a plugin API with a no-argument hook, an option can instead (or also) use:
"PluginCallbacks": [
{ "Enabled": true, "PluginName": "YourPlugin", "PluginCallback": "YourHook" }
]Replace both placeholders with an installed plugin and a real supported hook. The field is PluginCallbacks (plural); a callback does not accept arguments in this version. Enabled callbacks run before enabled server commands.
Included examples
Only Example.json is enabled by default. Set Enabled to true in a specialized example when you are ready to test it.
- Example.json — generic three-option, 60-second vote;
/vote_startthen/vote. All winner commands are disabled. - Example_SkipNight.json —
/vote_day_startthen/vote_day, 60 seconds. Day executesenv.time 6; Night leaves time unchanged. Once you enable this file, the Day action is live. - Example_NextMapWipe.json —
/vote_map_startthen/vote_map, 300 seconds. Records the winning map only. It does not change the map, seed or wipe your server. - Example_EventManager.json —
/vote_event_startthen/vote_event, 60 seconds. Requires a compatible EventManager installation and the optionalEventManagerWrapper.cs. Copy that adapter into the server plugins folder only if you use EventManager. Configure your events in EventManager first, then replace DeathMatch, GunGame and CaptureTheFlag in the example commands with your actual event names. Vote Commands chooses an event; it does not define EventManager's event types or settings.
For another example, replace Example in the permission command with its filename, e.g. VoteCommands.Example_SkipNight.Vote.
Result behavior and limits
Each player can vote once per session. The option with the highest count wins. A tie between options with votes selects the first tied option in configuration order. If nobody votes, the session ends without a winner and runs no plugin callbacks or server commands. Automatic sessions continue at the configured interval; an empty server does not start an event by itself.
The core plugin requires neither EventManager nor PimpMyCUI. External winner commands/hooks require their owning plugins. The optional EventManager adapter and live UI must be tested against your installed server/plugin versions.
Customer test checklist
- Confirm version 0.2.0 loads and the example configuration is found (or generated on an otherwise empty installation).
- Open the generic example as admin, cast a vote, close/reopen the window, and confirm the result.
- Grant the matching Vote permission and test with a non-admin player.
- Verify labels, images and countdown in game.
- In a copy of the generic example with unique chat commands, use a short duration (e.g. 10 seconds), a longer interval (e.g. 20 seconds), and automatic sessions. Confirm at least three successive sessions, then disable it and reload.
- Try your desired winner command manually, then through one enabled vote.
- Let an automatic session end with zero votes and confirm that no winner command or plugin callback runs.
- Report console errors with the configuration filename, VoteCommands version and Oxide/Carbon version. Remove credentials and private server details.
Build contents
oxide/ contains the plugin, four complete example configurations and English/French messages. optional/ contains the EventManager adapter. CHANGELOG.md lists this patch's changes. Do not install the optional adapter if you do not use EventManager.
Install the files
With a connected server, click Send in the configurator. The result shows whether the files were sent and the plugin reloaded. Without RCON, reload the plugin from your server panel after sending.
Without a connected server: Keep a copy of the current files. Place each export in the folder shown before export, or follow the paths in the ZIP. Do not put data or translation files in the config folder.
Follow the plugin instructions above for dependencies and reloading. Exporting does not connect the site to your server.