@tomsith/node-red-contrib-minecraft
Version:
Node-RED nodes for Minecraft server RCON commands and status
761 lines (693 loc) • 28 kB
HTML
<!-- minecraft.html -->
<script type="text/html" data-template-name="serverconfig">
<div class="form-row">
<label for="node-config-input-host"><i class="fa fa-globe"></i> Host</label>
<input type="text" id="node-config-input-host" placeholder="localhost">
</div>
<div class="form-row">
<label for="node-config-input-rconPort"><i class="fa fa-random"></i> RCON Port</label>
<input type="text" id="node-config-input-rconPort" placeholder="25575">
</div>
<div class="form-row">
<label for="node-config-input-rconPassword"><i class="fa fa-lock"></i> RCON Password</label>
<input type="password" id="node-config-input-rconPassword">
</div>
</script>
<script type="text/html" data-template-name="rcon">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
<div class="form-row">
<label for="node-input-server"><i class="fa fa-server"></i> Server</label>
<input type="text" id="node-input-server">
</div>
<div class="form-row">
<label for="node-input-command"><i class="fa fa-terminal"></i> Default Command</label>
<input type="text" id="node-input-command" placeholder="list">
</div>
</script>
<script type="text/html" data-template-name="serverinfo">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
<div class="form-row">
<label for="node-input-server"><i class="fa fa-server"></i> Server</label>
<input type="text" id="node-input-server">
</div>
</script>
<script type="text/html" data-template-name="playerinfo">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
<div class="form-row">
<label for="node-input-server"><i class="fa fa-server"></i> Server</label>
<input type="text" id="node-input-server">
</div>
<div class="form-row">
<label for="node-input-infoType"><i class="fa fa-info"></i> Info Type</label>
<select id="node-input-infoType">
<option value="health">Health</option>
<option value="position">Position</option>
<option value="inventory">Inventory</option>
<option value="experience">Experience</option>
<option value="gamemode">Game Mode</option>
<option value="food">Food Level</option>
<option value="effects">Active Effects</option>
<option value="score">Scoreboard</option>
</select>
</div>
<div class="form-row">
<label for="node-input-player"><i class="fa fa-user"></i> Default Player</label>
<input type="text" id="node-input-player" placeholder="@p">
</div>
</script>
<script type="text/html" data-template-name="playermanage">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
<div class="form-row">
<label for="node-input-server"><i class="fa fa-server"></i> Server</label>
<input type="text" id="node-input-server">
</div>
<div class="form-row">
<label for="node-input-action"><i class="fa fa-tasks"></i> Action</label>
<select id="node-input-action">
<option value="kick">Kick</option>
<option value="ban">Ban</option>
<option value="pardon">Pardon</option>
<option value="gamemode">Change Gamemode</option>
<option value="tp">Teleport</option>
<option value="give">Give Item</option>
<option value="clear">Clear Inventory</option>
<option value="kill">Kill</option>
<option value="xp">Give XP</option>
</select>
</div>
<div class="form-row">
<label for="node-input-gamemode"><i class="fa fa-gamepad"></i> Default Gamemode</label>
<select id="node-input-gamemode">
<option value="survival">Survival</option>
<option value="creative">Creative</option>
<option value="adventure">Adventure</option>
<option value="spectator">Spectator</option>
</select>
</div>
</script>
<script type="text/html" data-template-name="world">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
<div class="form-row">
<label for="node-input-server"><i class="fa fa-server"></i> Server</label>
<input type="text" id="node-input-server">
</div>
<div class="form-row">
<label for="node-input-action"><i class="fa fa-globe"></i> Action</label>
<select id="node-input-action">
<option value="time">Set Time</option>
<option value="weather">Set Weather</option>
<option value="difficulty">Set Difficulty</option>
<option value="gamerule">Set Gamerule</option>
<option value="worldborder">Set World Border</option>
<option value="setworldspawn">Set World Spawn</option>
</select>
</div>
</script>
<script type="text/html" data-template-name="block">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
<div class="form-row">
<label for="node-input-server"><i class="fa fa-server"></i> Server</label>
<input type="text" id="node-input-server">
</div>
<div class="form-row">
<label for="node-input-action"><i class="fa fa-cube"></i> Action</label>
<select id="node-input-action">
<option value="set">Set Block</option>
<option value="fill">Fill Area</option>
<option value="clone">Clone Area</option>
<option value="info">Get Block Info</option>
</select>
</div>
</script>
<script type="text/html" data-template-name="entity">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
<div class="form-row">
<label for="node-input-server"><i class="fa fa-server"></i> Server</label>
<input type="text" id="node-input-server">
</div>
<div class="form-row">
<label for="node-input-action"><i class="fa fa-bug"></i> Action</label>
<select id="node-input-action">
<option value="spawn">Spawn Entity</option>
<option value="kill">Kill Entity</option>
<option value="count">Count Entities</option>
<option value="info">Get Entity Info</option>
<option value="modify">Modify Entity</option>
</select>
</div>
</script>
<script type="text/html" data-template-name="servermanage">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
<div class="form-row">
<label for="node-input-server"><i class="fa fa-server"></i> Server</label>
<input type="text" id="node-input-server">
</div>
<div class="form-row">
<label for="node-input-action"><i class="fa fa-cogs"></i> Action</label>
<select id="node-input-action">
<option value="save-all">Save World</option>
<option value="save-off">Disable Saving</option>
<option value="save-on">Enable Saving</option>
<option value="stop">Stop Server</option>
<option value="whitelist">Manage Whitelist</option>
<option value="op">Op Player</option>
<option value="deop">Deop Player</option>
<option value="broadcast">Broadcast Message</option>
</select>
</div>
</script>
<!-- Help Documentation -->
<script type="text/html" data-help-name="serverconfig">
<p>Configuration node for Minecraft server connection settings. Required by all other Minecraft nodes.</p>
<h3>Properties</h3>
<dl class="message-properties">
<dt>Host <span class="property-type">string</span></dt>
<dd>IP address or hostname of your Minecraft server (e.g., "localhost" or "mc.example.com")</dd>
<dt>RCON Port <span class="property-type">number</span></dt>
<dd>Port number for RCON connection (default: 25575)</dd>
<dt>RCON Password <span class="property-type">string</span></dt>
<dd>Password matching your server.properties rcon.password setting</dd>
</dl>
<h3>Configuration</h3>
<p>In your server.properties file, ensure:</p>
<pre>enable-rcon=true
rcon.port=25575
rcon.password=yourpassword</pre>
</script>
<script type="text/html" data-help-name="rcon">
<p>Executes raw RCON commands on your Minecraft server. Use this for direct command execution.</p>
<h3>Inputs</h3>
<dl class="message-properties">
<dt>payload <span class="property-type">string</span></dt>
<dd>
The Minecraft command to execute.
<br/><br/>
Common commands:
<ul>
<li><code>list</code> - Shows online players</li>
<li><code>seed</code> - Shows world seed</li>
<li><code>help</code> - Lists available commands</li>
<li><code>time query daytime</code> - Gets current time</li>
</ul>
</dd>
</dl>
<h3>Outputs</h3>
<dl class="message-properties">
<dt>payload <span class="property-type">string</span></dt>
<dd>Server's response to the command</dd>
</dl>
<h3>Examples</h3>
<pre>msg.payload = "give @p diamond 64";
msg.payload = "weather clear";
msg.payload = "time set day";</pre>
</script>
<script type="text/html" data-help-name="serverinfo">
<p>Retrieves current server status including player count, version, and online players.</p>
<h3>Outputs</h3>
<dl class="message-properties">
<dt>payload <span class="property-type">object</span></dt>
<dd>
Server status object containing:
<ul>
<li><b>online</b>: Number of players online</li>
<li><b>max</b>: Maximum player capacity</li>
<li><b>version</b>: Server version (e.g., "1.19.2")</li>
<li><b>players</b>: Array of online players, each with:
<ul>
<li>name: Player username</li>
<li>id: Player UUID</li>
</ul>
</li>
</ul>
</dd>
</dl>
<h3>Example Output</h3>
<pre>{
"online": 3,
"max": 20,
"version": "1.19.2",
"players": [
{"name": "Steve", "id": "..."},
{"name": "Alex", "id": "..."}
]
}</pre>
</script>
<script type="text/html" data-help-name="playerinfo">
<p>Retrieves detailed information about specific players.</p>
<h3>Inputs</h3>
<dl class="message-properties">
<dt>payload <span class="property-type">string</span></dt>
<dd>Player name or selector (e.g., "Steve" or "@p")</dd>
<dt class="optional">infoType <span class="property-type">string</span></dt>
<dd>
Type of information to retrieve:
<ul>
<li><b>health</b>: Current health points (0-20)</li>
<li><b>position</b>: XYZ coordinates</li>
<li><b>inventory</b>: Complete inventory contents</li>
<li><b>experience</b>: XP level and progress</li>
<li><b>gamemode</b>: Current game mode</li>
<li><b>food</b>: Food level (0-20)</li>
<li><b>effects</b>: Active potion effects</li>
<li><b>score</b>: Scoreboard scores</li>
</ul>
</dd>
</dl>
<h3>Outputs</h3>
<dl class="message-properties">
<dt>payload <span class="property-type">object</span></dt>
<dd>
<ul>
<li><b>raw</b>: Raw server response</li>
<li><b>value</b>: Parsed value (type depends on query)</li>
<li><b>player</b>: Player name/selector used</li>
<li><b>type</b>: Info type queried</li>
</ul>
</dd>
</dl>
<h3>Example Outputs</h3>
<pre>// Health query
{
"raw": "Steve has 20 health",
"value": 20,
"player": "Steve",
"type": "health"
}
// Position query
{
"raw": "Position: [100.5, 64.0, -200.5]",
"value": [100.5, 64.0, -200.5],
"player": "@p",
"type": "position"
}</pre>
</script>
<script type="text/html" data-help-name="playermanage">
<p>Manages player actions and properties. Handles commands for player interaction.</p>
<h3>Inputs</h3>
<dl class="message-properties">
<dt>payload <span class="property-type">string</span></dt>
<dd>
Value format depends on action:
<ul>
<li><b>kick</b>: Player name (optional reason after |)
<br><code>Steve|Breaking rules</code>
</li>
<li><b>ban</b>: Player name (optional reason after |)
<br><code>Steve|Griefing</code>
</li>
<li><b>pardon</b>: Player name
<br><code>Steve</code>
</li>
<li><b>gamemode</b>: Player name and mode
<br><code>Steve|creative</code>
</li>
<li><b>tp</b>: Player name and coordinates/target
<br><code>Steve|100 64 -200</code> or <code>Steve|Alex</code>
</li>
<li><b>give</b>: Player name and item details
<br><code>Steve|diamond 64</code>
<br><code>Steve|diamond_sword{Enchantments:[{id:"sharpness",lvl:5}]} 1</code>
</li>
<li><b>clear</b>: Player name (optional item after |)
<br><code>Steve|diamond</code>
</li>
<li><b>kill</b>: Player name
<br><code>Steve</code>
</li>
<li><b>xp</b>: Player name and amount
<br><code>Steve|100L</code> (levels) or <code>Steve|1000</code> (points)
</li>
</ul>
</dd>
<dt class="optional">target <span class="property-type">string</span></dt>
<dd>Alternative player target (overrides payload player)</dd>
<dt class="optional">reason <span class="property-type">string</span></dt>
<dd>Reason for kick/ban (overrides payload reason)</dd>
</dl>
<h3>Common Items for Give Command</h3>
<ul>
<li><b>Basic Items</b>: diamond, iron_ingot, gold_ingot, emerald</li>
<li><b>Tools</b>: diamond_sword, diamond_pickaxe, diamond_axe</li>
<li><b>Armor</b>: diamond_helmet, diamond_chestplate, diamond_leggings, diamond_boots</li>
<li><b>Special</b>: enchanted_golden_apple, totem_of_undying, elytra</li>
</ul>
<h3>Examples</h3>
<pre>// Give enchanted sword
msg.payload = "Steve|diamond_sword{Enchantments:[{id:\"sharpness\",lvl:5}]} 1";
// Give named item
msg.payload = "Steve|diamond_sword{display:{Name:'{\"text\":\"Excalibur\"}'}} 1";
// Give colored armor
msg.payload = "Steve|leather_chestplate{display:{color:16711680}} 1";
// Teleport to coordinates
msg.payload = "Steve|100 64 -200";</pre>
</script>
<script type="text/html" data-help-name="world">
<p>Controls world settings and environment. Manages time, weather, and world properties.</p>
<h3>Inputs</h3>
<dl class="message-properties">
<dt>payload <span class="property-type">string</span></dt>
<dd>
Value depends on action:
<ul>
<li><b>time</b>: Time setting
<br><code>day</code>, <code>night</code>, <code>noon</code>, or number (0-24000)
</li>
<li><b>weather</b>: Weather type
<br><code>clear</code>, <code>rain</code>, <code>thunder</code>
</li>
<li><b>difficulty</b>: Game difficulty
<br><code>peaceful</code>, <code>easy</code>, <code>normal</code>, <code>hard</code>
</li>
<li><b>gamerule</b>: Rule and value
<br><code>doDaylightCycle true</code>
<br><code>keepInventory true</code>
</li>
<li><b>worldborder</b>: Border size
<br><code>1000</code> (diameter in blocks)
</li>
<li><b>setworldspawn</b>: Coordinates
<br><code>100 64 -200</code>
</li>
</ul>
</dd>
</dl>
<h3>Common Gamerules</h3>
<ul>
<li><code>doDaylightCycle</code>: Sun/moon movement</li>
<li><code>keepInventory</code>: Keep items on death</li>
<li><code>mobGriefing</code>: Mob block destruction</li>
<li><code>doMobSpawning</code>: Natural mob spawns</li>
<li><code>doWeatherCycle</code>: Weather changes</li>
</ul>
<h3>Examples</h3>
<pre>// Set to permanent day
msg.action = "gamerule";
msg.payload = "doDaylightCycle false";
// Then
msg.action = "time";
msg.payload = "day";
// Set up safe spawn area
msg.action = "worldborder";
msg.payload = "1000";
// Then
msg.action = "difficulty";
msg.payload = "peaceful";</pre>
</script>
<script type="text/html" data-help-name="block">
<p>Manages blocks in the world. Place, fill, clone, or get block information.</p>
<h3>Inputs</h3>
<dl class="message-properties">
<dt>payload <span class="property-type">string</span></dt>
<dd>
Value format uses | as separator:
<ul>
<li><b>set</b>: <code>coordinates|block[|data]</code>
<br><code>0 64 0|stone</code>
<br><code>0 64 0|chest{Items:[{id:"diamond",Count:64b,Slot:0b}]}</code>
</li>
<li><b>fill</b>: <code>start_coords|end_coords|block[|mode]</code>
<br><code>0 64 0|10 64 10|stone</code>
<br><code>0 64 0|10 64 10|air|replace diamond_ore</code>
</li>
<li><b>clone</b>: <code>source_start|source_end|destination</code>
<br><code>0 64 0|10 74 10|20 64 20</code>
</li>
<li><b>info</b>: <code>coordinates</code>
<br><code>0 64 0</code>
</li>
</ul>
</dd>
</dl>
<h3>Fill Modes</h3>
<ul>
<li><code>replace</code>: Replace all blocks</li>
<li><code>hollow</code>: Create hollow shape</li>
<li><code>outline</code>: Create outline only</li>
<li><code>destroy</code>: Drop block contents</li>
</ul>
<h3>Examples</h3>
<pre>// Create a platform
msg.action = "fill";
msg.payload = "0 64 0|10 64 10|stone";
// Create hollow cube
msg.action = "fill";
msg.payload = "0 64 0|10 74 10|stone|hollow";
// Place chest with items
msg.action = "set";
msg.payload = "0 64 0|chest{Items:[{id:\"diamond\",Count:64b,Slot:0b}]}";</pre>
</script>
<script type="text/html" data-help-name="entity">
<p>Manages entities in the world. Spawn, modify, or remove entities.</p>
<h3>Inputs</h3>
<dl class="message-properties">
<dt>payload <span class="property-type">string</span></dt>
<dd>
Value format uses | as separator:
<ul>
<li><b>spawn</b>: <code>entity|coordinates|nbt</code>
<br><code>zombie|~ ~2 ~|{CustomName:"\"Boss\"",Glowing:1b}</code>
</li>
<li><b>kill</b>: <code>selector</code>
<br><code>@e[type=zombie,distance=..10]</code>
</li>
<li><b>count</b>: <code>selector</code>
<br><code>@e[type=creeper]</code>
</li>
<li><b>info</b>: <code>selector</code>
<br><code>@e[type=zombie,limit=1]</code>
</li>
<li><b>modify</b>: <code>selector|nbt_data</code>
<br><code>@e[type=zombie,limit=1]|{NoAI:1b}</code>
</li>
</ul>
</dd>
</dl>
<h3>Common Entity Types</h3>
<ul>
<li><b>Hostile</b>: zombie, skeleton, creeper, spider</li>
<li><b>Passive</b>: cow, sheep, pig, chicken</li>
<li><b>Special</b>: armor_stand, item, experience_orb</li>
<li><b>Projectiles</b>: arrow, snowball, fireball</li>
</ul>
<h3>Common NBT Tags</h3>
<ul>
<li><code>CustomName</code>: Entity name</li>
<li><code>NoAI</code>: Disable AI</li>
<li><code>Invulnerable</code>: Can't be damaged</li>
<li><code>Silent</code>: No sounds</li>
<li><code>Glowing</code>: Glowing outline</li>
</ul>
<h3>Examples</h3>
<pre>// Spawn named, glowing zombie
msg.action = "spawn";
msg.payload = "zombie|~ ~2 ~|{CustomName:\"\"Boss\"\",Glowing:1b}";
// Kill all creepers within 10 blocks
msg.action = "kill";
msg.payload = "@e[type=creeper,distance=..10]";
// Make zombie immobile
msg.action = "modify";
msg.payload = "@e[type=zombie,limit=1]|{NoAI:1b,Invulnerable:1b}";</pre>
</script>
<script type="text/html" data-help-name="servermanage">
<p>Manages server operations and administration tasks.</p>
<h3>Inputs</h3>
<dl class="message-properties">
<dt>payload <span class="property-type">string</span></dt>
<dd>
Value depends on action:
<ul>
<li><b>save-all</b>: No payload needed</li>
<li><b>save-off</b>: No payload needed</li>
<li><b>save-on</b>: No payload needed</li>
<li><b>stop</b>: No payload needed</li>
<li><b>whitelist</b>: <code>add|remove|list</code> and player name
<br><code>add Steve</code>
</li>
<li><b>op</b>: Player name
<br><code>Steve</code>
</li>
<li><b>deop</b>: Player name
<br><code>Steve</code>
</li>
<li><b>broadcast</b>: Message text
<br><code>Server restarting in 5 minutes!</code>
</li>
</ul>
</dd>
</dl>
<h3>Examples</h3>
<pre>// Save world
msg.action = "save-all";
// Add to whitelist
msg.action = "whitelist";
msg.payload = "add Steve";
// Broadcast message
msg.action = "broadcast";
msg.payload = "Welcome to the server!";</pre>
<h3>Common Use Cases</h3>
<ul>
<li>Scheduled world saves</li>
<li>Automated backup preparation</li>
<li>Server maintenance notifications</li>
<li>Whitelist management</li>
<li>Operator status management</li>
</ul>
</script>
<script type="text/javascript">
RED.nodes.registerType('serverconfig', {
category: 'config',
defaults: {
host: { value: "localhost", required: true },
rconPort: { value: 25575, required: true, validate: RED.validators.number() },
rconPassword: { value: "", required: true }
},
label: function() {
return this.host + ":" + this.rconPort;
}
});
RED.nodes.registerType('rcon', {
category: 'minecraft',
color: '#a6bbcf',
defaults: {
name: { value: "" },
server: { type: "serverconfig", required: true },
command: { value: "" }
},
inputs: 1,
outputs: 1,
icon: "file.png",
label: function() {
return this.name || "rcon";
}
});
RED.nodes.registerType('serverinfo', {
category: 'minecraft',
color: '#a6bbcf',
defaults: {
name: { value: "" },
server: { type: "serverconfig", required: true }
},
inputs: 1,
outputs: 1,
icon: "status.png",
label: function() {
return this.name || "server info";
}
});
RED.nodes.registerType('servermanage', {
category: 'minecraft',
color: '#a6bbcf',
defaults: {
name: { value: "" },
server: { type: "serverconfig", required: true },
action: { value: "save-all" }
},
inputs: 1,
outputs: 1,
icon: "server.png",
label: function() {
return this.name || "server manage";
}
});
RED.nodes.registerType('playerinfo', {
category: 'minecraft',
color: '#a6bbcf',
defaults: {
name: { value: "" },
server: { type: "serverconfig", required: true },
infoType: { value: "health" },
player: { value: "@p" }
},
inputs: 1,
outputs: 1,
icon: "user.png",
label: function() {
return this.name || "player info";
}
});
RED.nodes.registerType('playermanage', {
category: 'minecraft',
color: '#a6bbcf',
defaults: {
name: { value: "" },
server: { type: "serverconfig", required: true },
action: { value: "kick" },
gamemode: { value: "survival" }
},
inputs: 1,
outputs: 1,
icon: "user-cog.png",
label: function() {
return this.name || "player manage";
}
});
RED.nodes.registerType('world', {
category: 'minecraft',
color: '#a6bbcf',
defaults: {
name: { value: "" },
server: { type: "serverconfig", required: true },
action: { value: "time" }
},
inputs: 1,
outputs: 1,
icon: "globe.png",
label: function() {
return this.name || "world";
}
});
RED.nodes.registerType('block', {
category: 'minecraft',
color: '#a6bbcf',
defaults: {
name: { value: "" },
server: { type: "serverconfig", required: true },
action: { value: "set" }
},
inputs: 1,
outputs: 1,
icon: "cube.png",
label: function() {
return this.name || "block";
}
});
RED.nodes.registerType('entity', {
category: 'minecraft',
color: '#a6bbcf',
defaults: {
name: { value: "" },
server: { type: "serverconfig", required: true },
action: { value: "spawn" }
},
inputs: 1,
outputs: 1,
icon: "bug.png",
label: function() {
return this.name || "entity";
}
});
</script>