@dimzxzzx07/mc-headless 2.2.1 → 2.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +658 -765
- package/dist/core/JavaChecker.d.ts +8 -2
- package/dist/core/JavaChecker.d.ts.map +1 -1
- package/dist/core/JavaChecker.js +219 -104
- package/dist/core/JavaChecker.js.map +1 -1
- package/dist/core/MinecraftServer.d.ts +17 -32
- package/dist/core/MinecraftServer.d.ts.map +1 -1
- package/dist/core/MinecraftServer.js +449 -186
- package/dist/core/MinecraftServer.js.map +1 -1
- package/dist/index.d.ts +19 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +40 -18
- package/dist/index.js.map +1 -1
- package/dist/platforms/GeyserBridge.d.ts +21 -3
- package/dist/platforms/GeyserBridge.d.ts.map +1 -1
- package/dist/platforms/GeyserBridge.js +160 -60
- package/dist/platforms/GeyserBridge.js.map +1 -1
- package/dist/platforms/PluginManager.d.ts +16 -0
- package/dist/platforms/PluginManager.d.ts.map +1 -0
- package/dist/platforms/PluginManager.js +208 -0
- package/dist/platforms/PluginManager.js.map +1 -0
- package/dist/platforms/ViaVersion.d.ts +1 -7
- package/dist/platforms/ViaVersion.d.ts.map +1 -1
- package/dist/platforms/ViaVersion.js +23 -87
- package/dist/platforms/ViaVersion.js.map +1 -1
- package/dist/types/index.d.ts +189 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +4 -2
- package/src/core/JavaChecker.ts +224 -108
- package/src/core/MinecraftServer.ts +540 -254
- package/src/index.ts +19 -19
- package/src/platforms/GeyserBridge.ts +196 -80
- package/src/platforms/PluginManager.ts +206 -0
- package/src/platforms/ViaVersion.ts +26 -107
- package/src/types/index.ts +206 -0
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
</div>
|
|
6
6
|
|
|
7
7
|
<div align="center">
|
|
8
|
-
<img src="https://img.shields.io/badge/Version-2.2.
|
|
8
|
+
<img src="https://img.shields.io/badge/Version-2.2.3-2563eb?style=for-the-badge&logo=typescript" alt="Version">
|
|
9
9
|
<img src="https://img.shields.io/badge/License-MIT-green?style=for-the-badge&logo=open-source-initiative" alt="License">
|
|
10
10
|
<img src="https://img.shields.io/badge/Node-18%2B-339933?style=for-the-badge&logo=nodedotjs" alt="Node">
|
|
11
11
|
<img src="https://img.shields.io/badge/Java-Portable-007396?style=for-the-badge&logo=openjdk" alt="Java Portable">
|
|
@@ -55,11 +55,14 @@
|
|
|
55
55
|
## Table of Contents
|
|
56
56
|
|
|
57
57
|
- [What is MC-Headless?](#what-is-mc-headless)
|
|
58
|
-
- [What's New in 2.2.
|
|
58
|
+
- [What's New in 2.2.3](#whats-new-in-223)
|
|
59
59
|
- [Features](#features)
|
|
60
60
|
- [Why MC-Headless?](#why-mc-headless)
|
|
61
61
|
- [Installation](#installation)
|
|
62
62
|
- [Quick Start](#quick-start)
|
|
63
|
+
- [Server Startup Flow Diagram](#server-startup-flow-diagram)
|
|
64
|
+
- [Pterodactyl Setup (No Egg Required)](#pterodactyl-setup-no-egg-required)
|
|
65
|
+
- [How to Connect from Minecraft](#how-to-connect-from-minecraft)
|
|
63
66
|
- [Configuration Guide](#configuration-guide)
|
|
64
67
|
- [API Reference](#api-reference)
|
|
65
68
|
- [Usage Examples](#usage-examples)
|
|
@@ -68,6 +71,8 @@
|
|
|
68
71
|
- [Memory Management](#memory-management)
|
|
69
72
|
- [Network Settings](#network-settings)
|
|
70
73
|
- [World Configuration](#world-configuration)
|
|
74
|
+
- [Plugins & Boosters](#plugins--boosters)
|
|
75
|
+
- [RAM Disk & Symlink System](#ram-disk--symlink-system)
|
|
71
76
|
- [Folder Structure](#folder-structure)
|
|
72
77
|
- [Backup System](#backup-system)
|
|
73
78
|
- [Event System](#event-system)
|
|
@@ -78,7 +83,6 @@
|
|
|
78
83
|
- [SkinRestorer Support](#skinrestorer-support)
|
|
79
84
|
- [Portable Java](#portable-java)
|
|
80
85
|
- [Performance Tuning](#performance-tuning)
|
|
81
|
-
- [Pterodactyl Setup](#pterodactyl-setup)
|
|
82
86
|
- [Termux Setup](#termux-setup)
|
|
83
87
|
- [Troubleshooting](#troubleshooting)
|
|
84
88
|
- [Contributing](#contributing)
|
|
@@ -111,19 +115,42 @@ Built specifically for developers, sysadmins, and Minecraft enthusiasts who want
|
|
|
111
115
|
|
|
112
116
|
---
|
|
113
117
|
|
|
114
|
-
## What's New in 2.2.
|
|
115
|
-
|
|
116
|
-
### Version 2.2.
|
|
117
|
-
|
|
118
|
-
- **
|
|
119
|
-
-
|
|
120
|
-
-
|
|
121
|
-
-
|
|
122
|
-
-
|
|
123
|
-
-
|
|
124
|
-
-
|
|
125
|
-
-
|
|
126
|
-
- **
|
|
118
|
+
## What's New in 2.2.3
|
|
119
|
+
|
|
120
|
+
### Version 2.2.3 - March 2026
|
|
121
|
+
|
|
122
|
+
- **Plugin Manager System** - Auto-download and install popular plugins:
|
|
123
|
+
- ProtocolLib
|
|
124
|
+
- TCPShield
|
|
125
|
+
- Spigot-Optimizers
|
|
126
|
+
- Spark (profiler)
|
|
127
|
+
- ViewDistanceTweaks
|
|
128
|
+
- FarmControl
|
|
129
|
+
- EntityDetection
|
|
130
|
+
- **RAM Disk Technology** - Run worlds, plugins, and addons in RAM for lightning-fast performance
|
|
131
|
+
- **Symlink Master Storage** - Secure master folder with symbolic links for data protection
|
|
132
|
+
- **Auto RAM Backup** - Automatically backup RAM data to disk every 5 minutes
|
|
133
|
+
- **RAM Restore on Crash** - Automatically restore data from master storage after crash
|
|
134
|
+
- **Network Optimization Suite**:
|
|
135
|
+
- TCP_NODELAY enabled by default
|
|
136
|
+
- Adjustable compression threshold (64-512)
|
|
137
|
+
- Velocity proxy support
|
|
138
|
+
- BungeeCord mode
|
|
139
|
+
- **Java Arguments Optimization**:
|
|
140
|
+
- `-XX:+UseG1GC -XX:MaxGCPauseMillis=50`
|
|
141
|
+
- `-XX:+UseStringDeduplication`
|
|
142
|
+
- `-Djava.net.preferIPv4Stack=true`
|
|
143
|
+
- `-Djava.net.tcpFastOpen=true`
|
|
144
|
+
- `-Djava.net.tcp.nodelay=true`
|
|
145
|
+
- `-Dio.netty.recycler.maxCapacity.default=0`
|
|
146
|
+
- `-Dio.netty.leakDetectionLevel=disabled`
|
|
147
|
+
- **Pterodactyl Port Sharing** - Geyser can run on same port as Java when only one port available
|
|
148
|
+
- **Auto UDP Detection** - Warns if Bedrock port needs UDP configuration
|
|
149
|
+
- **Stream Finished Guarantee** - Ensures downloads complete properly with stream.finished
|
|
150
|
+
- **1-Second Download Delay** - Prevents plugin corruption during simultaneous downloads
|
|
151
|
+
- **Auto-cleanup Paper Remapped** - Automatically removes corrupt `.paper-remapped` folders
|
|
152
|
+
- **Memory Safety** - Uses 90% of cgroup limit to prevent OOM killer
|
|
153
|
+
- **Smart Restart** - Only restarts when no players online
|
|
127
154
|
|
|
128
155
|
---
|
|
129
156
|
|
|
@@ -133,17 +160,23 @@ Built specifically for developers, sysadmins, and Minecraft enthusiasts who want
|
|
|
133
160
|
|----------|----------|
|
|
134
161
|
| **Server Types** | Paper, Purpur, Vanilla, Spigot, Forge, Fabric |
|
|
135
162
|
| **Platforms** | Java Edition, Bedrock Edition, Cross-play (Geyser) |
|
|
163
|
+
| **Plugins** | ProtocolLib, TCPShield, Spark, ViewDistanceTweaks, FarmControl, EntityDetection |
|
|
164
|
+
| **RAM Disk** | World/plugins/addons in RAM, auto backup to disk, restore after crash |
|
|
165
|
+
| **Symlink Master** | Secure master storage with symbolic links |
|
|
166
|
+
| **Architecture Support** | x64, ARM64, ARM (Raspberry Pi, Oracle Cloud) |
|
|
167
|
+
| **Pterodactyl Integration** | Auto-detect, port sharing, environment variables, 90% memory safety |
|
|
136
168
|
| **Auto Setup** | Automatic Java detection, EULA acceptance, server.properties generation |
|
|
137
|
-
| **Portable Java** | Download JRE to
|
|
169
|
+
| **Portable Java** | Download JRE to `/home/container/.java` (Pterodactyl) or `/tmp/.mc-headless` |
|
|
170
|
+
| **Smart Storage** | Detects Pterodactyl, warns on low RAM for /tmp usage |
|
|
171
|
+
| **Streaming Download** | Download and extract simultaneously, no temporary files |
|
|
138
172
|
| **Cgroups Stats** | CPU/Memory stats like Pterodactyl (30s interval) |
|
|
139
|
-
| **Downloader** | Pure Node.js
|
|
173
|
+
| **Downloader** | Pure Node.js with rotating user-agents, retry logic, stalled detection |
|
|
140
174
|
| **Memory Management** | Custom memory allocation, Aikar's flags optimization |
|
|
141
175
|
| **Backup System** | Automatic scheduled backups, manual backup triggers |
|
|
142
176
|
| **Monitoring** | Real-time CPU/memory usage, player tracking, server events |
|
|
143
177
|
| **Cross-play** | Built-in Geyser & Floodgate support for Bedrock clients |
|
|
144
178
|
| **ViaVersion** | Built-in ViaVersion, ViaBackwards, ViaRewind support |
|
|
145
179
|
| **SkinRestorer** | Auto-download and install SkinRestorer plugin |
|
|
146
|
-
| **Pterodactyl Ready** | Optimized for panel hosting |
|
|
147
180
|
| **Termux Friendly** | Optimized for Android/Termux environments |
|
|
148
181
|
| **Headless Ready** | No GUI required, perfect for servers and automation |
|
|
149
182
|
| **Silent Mode** | Direct log piping for minimal CPU usage |
|
|
@@ -181,7 +214,7 @@ wget https://github.com/SkinsRestorer/SkinsRestorerX/releases/latest/download/Sk
|
|
|
181
214
|
tail -f logs/latest.log
|
|
182
215
|
```
|
|
183
216
|
|
|
184
|
-
After (MC-Headless v2.2.
|
|
217
|
+
After (MC-Headless v2.2.3)
|
|
185
218
|
|
|
186
219
|
```javascript
|
|
187
220
|
const { MinecraftServer } = require('@dimzxzzx07/mc-headless');
|
|
@@ -192,7 +225,15 @@ const server = new MinecraftServer({
|
|
|
192
225
|
usePortableJava: true,
|
|
193
226
|
memory: { init: '4G', max: '12G' },
|
|
194
227
|
enableViaVersion: true,
|
|
195
|
-
enableSkinRestorer: true
|
|
228
|
+
enableSkinRestorer: true,
|
|
229
|
+
enableProtocolLib: true,
|
|
230
|
+
enableSpark: true,
|
|
231
|
+
ramdisk: {
|
|
232
|
+
enabled: true,
|
|
233
|
+
world: true,
|
|
234
|
+
plugins: true,
|
|
235
|
+
backupInterval: 300000
|
|
236
|
+
}
|
|
196
237
|
});
|
|
197
238
|
|
|
198
239
|
server.on('ready', () => console.log('Server ready!'));
|
|
@@ -223,7 +264,7 @@ RAM 2 GB 4 GB or more
|
|
|
223
264
|
Storage 2 GB 10 GB
|
|
224
265
|
OS Linux, macOS, Windows, Termux Linux (production)
|
|
225
266
|
|
|
226
|
-
Note: Java is auto-downloaded as portable JRE (no system installation needed)
|
|
267
|
+
Note: Java is auto-downloaded as portable JRE (no system installation needed). On Pterodactyl, Java is stored in /home/container/.java to save RAM.
|
|
227
268
|
|
|
228
269
|
---
|
|
229
270
|
|
|
@@ -236,7 +277,6 @@ const { MinecraftServer } = require('@dimzxzzx07/mc-headless');
|
|
|
236
277
|
const os = require('os');
|
|
237
278
|
|
|
238
279
|
async function startServer() {
|
|
239
|
-
// Auto-detect system RAM
|
|
240
280
|
const totalRam = Math.floor(os.totalmem() / 1024 / 1024 / 1024);
|
|
241
281
|
const recommendedMax = Math.min(12, Math.max(2, Math.floor(totalRam * 0.7)));
|
|
242
282
|
|
|
@@ -274,7 +314,6 @@ const axios = require('axios');
|
|
|
274
314
|
const os = require('os');
|
|
275
315
|
|
|
276
316
|
async function startServer() {
|
|
277
|
-
// Get public IP
|
|
278
317
|
let publicIp = "127.0.0.1";
|
|
279
318
|
try {
|
|
280
319
|
const res = await axios.get('https://api.ipify.org?format=json');
|
|
@@ -283,17 +322,12 @@ async function startServer() {
|
|
|
283
322
|
console.log("Using default IP");
|
|
284
323
|
}
|
|
285
324
|
|
|
286
|
-
// Auto-detect RAM
|
|
287
|
-
const totalRam = Math.floor(os.totalmem() / 1024 / 1024 / 1024);
|
|
288
|
-
const recommendedMax = Math.min(12, Math.max(2, Math.floor(totalRam * 0.7)));
|
|
289
|
-
|
|
290
325
|
const server = new MinecraftServer({
|
|
291
326
|
platform: "all",
|
|
292
327
|
version: "1.21.11",
|
|
293
328
|
type: "paper",
|
|
294
329
|
autoAcceptEula: true,
|
|
295
330
|
|
|
296
|
-
// Java options
|
|
297
331
|
usePortableJava: true,
|
|
298
332
|
javaVersion: "auto",
|
|
299
333
|
|
|
@@ -319,13 +353,45 @@ async function startServer() {
|
|
|
319
353
|
simulationDistance: 4
|
|
320
354
|
},
|
|
321
355
|
|
|
322
|
-
//
|
|
356
|
+
// New plugins in 2.2.3
|
|
323
357
|
enableViaVersion: true,
|
|
324
358
|
enableViaBackwards: true,
|
|
325
359
|
enableViaRewind: true,
|
|
326
360
|
enableSkinRestorer: true,
|
|
361
|
+
enableProtocolLib: true,
|
|
362
|
+
enableTCPShield: true,
|
|
363
|
+
enableSpigotOptimizers: true,
|
|
364
|
+
enableSpark: true,
|
|
365
|
+
enableViewDistanceTweaks: true,
|
|
366
|
+
enableFarmControl: true,
|
|
367
|
+
enableEntityDetection: true,
|
|
368
|
+
|
|
369
|
+
// RAM Disk (NEW)
|
|
370
|
+
ramdisk: {
|
|
371
|
+
enabled: true,
|
|
372
|
+
world: true,
|
|
373
|
+
plugins: true,
|
|
374
|
+
addons: true,
|
|
375
|
+
backupInterval: 300000,
|
|
376
|
+
masterStorage: '/home/minecraft-master'
|
|
377
|
+
},
|
|
378
|
+
|
|
379
|
+
// Symlink Master (NEW)
|
|
380
|
+
symlinkMaster: '/home/minecraft-master',
|
|
381
|
+
|
|
382
|
+
// Network Optimization (NEW)
|
|
383
|
+
networkOptimization: {
|
|
384
|
+
tcpFastOpen: true,
|
|
385
|
+
tcpNoDelay: true,
|
|
386
|
+
preferIPv4: true,
|
|
387
|
+
compressionThreshold: 64,
|
|
388
|
+
bungeeMode: false,
|
|
389
|
+
velocity: {
|
|
390
|
+
enabled: false,
|
|
391
|
+
secret: ''
|
|
392
|
+
}
|
|
393
|
+
},
|
|
327
394
|
|
|
328
|
-
// Monitoring
|
|
329
395
|
memoryMonitor: {
|
|
330
396
|
enabled: true,
|
|
331
397
|
threshold: 85,
|
|
@@ -333,21 +399,24 @@ async function startServer() {
|
|
|
333
399
|
action: 'warn'
|
|
334
400
|
},
|
|
335
401
|
|
|
336
|
-
// Performance
|
|
337
402
|
silentMode: true,
|
|
338
403
|
statsInterval: 30000
|
|
339
404
|
});
|
|
340
405
|
|
|
341
406
|
server.on("ready", (info) => {
|
|
342
407
|
console.clear();
|
|
343
|
-
console.log(
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
408
|
+
console.log(`
|
|
409
|
+
==========================================
|
|
410
|
+
Minecraft Server - v2.2.3
|
|
411
|
+
IP: ${publicIp}:${info.port}
|
|
412
|
+
Version: ${info.version}
|
|
413
|
+
Memory: ${info.memory.used}/${info.memory.max} MB
|
|
414
|
+
CPU: ${info.cpu}%
|
|
415
|
+
Players: ${info.players}/${info.maxPlayers}
|
|
416
|
+
RAM Disk: Active
|
|
417
|
+
Plugins: 7 boosters installed
|
|
418
|
+
==========================================
|
|
419
|
+
`);
|
|
351
420
|
});
|
|
352
421
|
|
|
353
422
|
server.on("player-join", (player) => {
|
|
@@ -359,46 +428,367 @@ async function startServer() {
|
|
|
359
428
|
console.log(`${name} left`);
|
|
360
429
|
});
|
|
361
430
|
|
|
362
|
-
server.
|
|
363
|
-
|
|
364
|
-
|
|
431
|
+
await server.start();
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
startServer();
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
Server Startup Flow Diagram
|
|
440
|
+
|
|
441
|
+
```
|
|
442
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
443
|
+
│ SERVER STARTUP FLOW │
|
|
444
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
445
|
+
|
|
446
|
+
┌─────────────────┐
|
|
447
|
+
│ detectEnvironment │
|
|
448
|
+
│ • Pterodactyl? │
|
|
449
|
+
│ • Set ports │
|
|
450
|
+
└────────┬─────────┘
|
|
451
|
+
↓
|
|
452
|
+
┌─────────────────┐
|
|
453
|
+
│ setupSymlinkMaster │
|
|
454
|
+
│ • Create /home/ │
|
|
455
|
+
│ minecraft-master │
|
|
456
|
+
└────────┬─────────┘
|
|
457
|
+
↓
|
|
458
|
+
┌─────────────────┐
|
|
459
|
+
│ restoreFromMaster │
|
|
460
|
+
│ • Check RAM disk │
|
|
461
|
+
│ • Copy from master │
|
|
462
|
+
│ if RAM empty │
|
|
463
|
+
└────────┬─────────┘
|
|
464
|
+
↓
|
|
465
|
+
┌─────────────────┐
|
|
466
|
+
│ setupRamdisk │
|
|
467
|
+
│ • Create symlinks │
|
|
468
|
+
│ • Schedule backups │
|
|
469
|
+
└────────┬─────────┘
|
|
470
|
+
↓
|
|
471
|
+
┌─────────────────┐
|
|
472
|
+
│ ensureJava │
|
|
473
|
+
│ • Check system │
|
|
474
|
+
│ • Download JRE │
|
|
475
|
+
│ if needed │
|
|
476
|
+
└────────┬─────────┘
|
|
477
|
+
↓
|
|
478
|
+
┌─────────────────┐
|
|
479
|
+
│ download server │
|
|
480
|
+
│ • Paper/Vanilla │
|
|
481
|
+
│ etc. │
|
|
482
|
+
└────────┬─────────┘
|
|
483
|
+
↓
|
|
484
|
+
┌─────────────────┐
|
|
485
|
+
│ setup geyser │
|
|
486
|
+
│ • If platform all │
|
|
487
|
+
│ • Configure ports │
|
|
488
|
+
└────────┬─────────┘
|
|
489
|
+
↓
|
|
490
|
+
┌─────────────────┐
|
|
491
|
+
│ install plugins │
|
|
492
|
+
│ • ProtocolLib │
|
|
493
|
+
│ • TCPShield │
|
|
494
|
+
│ • Spark │
|
|
495
|
+
│ • ViewDistance │
|
|
496
|
+
│ • FarmControl │
|
|
497
|
+
│ • EntityDetection │
|
|
498
|
+
└────────┬─────────┘
|
|
499
|
+
↓
|
|
500
|
+
┌─────────────────┐
|
|
501
|
+
│ setup viaversion │
|
|
502
|
+
│ • ViaVersion │
|
|
503
|
+
│ • ViaBackwards │
|
|
504
|
+
│ • ViaRewind │
|
|
505
|
+
└────────┬─────────┘
|
|
506
|
+
↓
|
|
507
|
+
┌─────────────────┐
|
|
508
|
+
│ launch server │
|
|
509
|
+
│ • Build Java args │
|
|
510
|
+
│ • Set environment │
|
|
511
|
+
│ • Spawn process │
|
|
512
|
+
└────────┬─────────┘
|
|
513
|
+
↓
|
|
514
|
+
┌─────────────────┐
|
|
515
|
+
│ monitor logs │
|
|
516
|
+
│ • Wait for "Done" │
|
|
517
|
+
│ • Track players │
|
|
518
|
+
└────────┬─────────┘
|
|
519
|
+
↓
|
|
520
|
+
┌─────────────────┐
|
|
521
|
+
│ server ready │
|
|
522
|
+
│ • Emit 'ready' │
|
|
523
|
+
│ • Start monitoring│
|
|
524
|
+
└─────────────────┘
|
|
525
|
+
|
|
526
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
527
|
+
│ BACKGROUND PROCESSES │
|
|
528
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
529
|
+
|
|
530
|
+
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
531
|
+
│ RAM Disk Backup │ │ Log Cleanup │ │ Memory Monitor │
|
|
532
|
+
│ Every 5 min │ │ Every 3 hours │ │ Every 30 sec │
|
|
533
|
+
│ RAM → Master │ │ Delete old │ │ Check usage │
|
|
534
|
+
│ │ │ logs │ │ Warn if high │
|
|
535
|
+
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
---
|
|
539
|
+
|
|
540
|
+
Pterodactyl Setup (No Egg Required)
|
|
541
|
+
|
|
542
|
+
Step 1: Create Server Files
|
|
543
|
+
|
|
544
|
+
Create the following files in your Pterodactyl server directory (/home/container):
|
|
545
|
+
|
|
546
|
+
index.js
|
|
547
|
+
|
|
548
|
+
```javascript
|
|
549
|
+
const { MinecraftServer } = require('@dimzxzzx07/mc-headless');
|
|
550
|
+
|
|
551
|
+
async function startServer() {
|
|
552
|
+
const server = new MinecraftServer({
|
|
553
|
+
platform: "all",
|
|
554
|
+
version: "1.21.11",
|
|
555
|
+
type: "paper",
|
|
556
|
+
autoAcceptEula: true,
|
|
557
|
+
usePortableJava: false,
|
|
558
|
+
|
|
559
|
+
memory: {
|
|
560
|
+
init: process.env.SERVER_MEMORY_INIT || "2G",
|
|
561
|
+
max: process.env.SERVER_MEMORY_MAX || "4G",
|
|
562
|
+
useAikarsFlags: true
|
|
563
|
+
},
|
|
564
|
+
|
|
565
|
+
network: {
|
|
566
|
+
ip: "0.0.0.0",
|
|
567
|
+
port: parseInt(process.env.SERVER_PORT || "25565"),
|
|
568
|
+
bedrockPort: process.env.BEDROCK_PORT ? parseInt(process.env.BEDROCK_PORT) : undefined,
|
|
569
|
+
motd: process.env.SERVER_MOTD || "Minecraft Server",
|
|
570
|
+
onlineMode: false
|
|
571
|
+
},
|
|
572
|
+
|
|
573
|
+
world: {
|
|
574
|
+
difficulty: "normal",
|
|
575
|
+
maxPlayers: 20,
|
|
576
|
+
levelName: "world",
|
|
577
|
+
viewDistance: 6,
|
|
578
|
+
simulationDistance: 4
|
|
579
|
+
},
|
|
580
|
+
|
|
581
|
+
// Enable all plugins
|
|
582
|
+
enableViaVersion: true,
|
|
583
|
+
enableViaBackwards: true,
|
|
584
|
+
enableViaRewind: true,
|
|
585
|
+
enableSkinRestorer: true,
|
|
586
|
+
enableProtocolLib: true,
|
|
587
|
+
enableTCPShield: true,
|
|
588
|
+
enableSpigotOptimizers: true,
|
|
589
|
+
enableSpark: true,
|
|
590
|
+
enableViewDistanceTweaks: true,
|
|
591
|
+
enableFarmControl: true,
|
|
592
|
+
enableEntityDetection: true,
|
|
593
|
+
|
|
594
|
+
// RAM Disk for Pterodactyl
|
|
595
|
+
ramdisk: {
|
|
596
|
+
enabled: true,
|
|
597
|
+
world: true,
|
|
598
|
+
plugins: true,
|
|
599
|
+
backupInterval: 300000,
|
|
600
|
+
masterStorage: '/home/minecraft-master'
|
|
601
|
+
},
|
|
602
|
+
|
|
603
|
+
networkOptimization: {
|
|
604
|
+
tcpFastOpen: true,
|
|
605
|
+
tcpNoDelay: true,
|
|
606
|
+
compressionThreshold: 64
|
|
365
607
|
}
|
|
366
608
|
});
|
|
367
609
|
|
|
610
|
+
server.on("ready", (info) => {
|
|
611
|
+
console.log(`
|
|
612
|
+
==========================================
|
|
613
|
+
Minecraft Server - Pterodactyl
|
|
614
|
+
IP: ${info.ip}:${info.port}
|
|
615
|
+
Version: ${info.version}
|
|
616
|
+
Memory: ${info.memory.used}/${info.memory.max} MB
|
|
617
|
+
CPU: ${info.cpu}%
|
|
618
|
+
Players: ${info.players}/${info.maxPlayers}
|
|
619
|
+
RAM Disk: Active
|
|
620
|
+
==========================================
|
|
621
|
+
`);
|
|
622
|
+
});
|
|
623
|
+
|
|
368
624
|
await server.start();
|
|
369
625
|
}
|
|
370
626
|
|
|
371
|
-
startServer();
|
|
627
|
+
startServer().catch(console.error);
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
package.json
|
|
631
|
+
|
|
632
|
+
```json
|
|
633
|
+
{
|
|
634
|
+
"name": "minecraft-server",
|
|
635
|
+
"version": "1.0.0",
|
|
636
|
+
"dependencies": {
|
|
637
|
+
"@dimzxzzx07/mc-headless": "^2.2.3"
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
start.sh
|
|
643
|
+
|
|
644
|
+
```bash
|
|
645
|
+
#!/bin/bash
|
|
646
|
+
echo "=========================================="
|
|
647
|
+
echo "MC-Headless Server - Pterodactyl v2.2.3"
|
|
648
|
+
echo "=========================================="
|
|
649
|
+
echo "Java Port: ${SERVER_PORT:-25565}"
|
|
650
|
+
if [ -n "$BEDROCK_PORT" ]; then
|
|
651
|
+
echo "Bedrock Port: $BEDROCK_PORT (UDP)"
|
|
652
|
+
else
|
|
653
|
+
echo "Bedrock Port: Sharing Java port (UDP must be enabled)"
|
|
654
|
+
fi
|
|
655
|
+
echo "Memory: ${SERVER_MEMORY_INIT:-2G} - ${SERVER_MEMORY_MAX:-4G}"
|
|
656
|
+
echo "Plugins: ProtocolLib, TCPShield, Spark, etc."
|
|
657
|
+
echo "RAM Disk: Active"
|
|
658
|
+
echo "=========================================="
|
|
659
|
+
|
|
660
|
+
# Clean up corrupt Paper cache
|
|
661
|
+
if [ -d "plugins" ]; then
|
|
662
|
+
find plugins -type d -name ".paper-remapped*" -exec rm -rf {} + 2>/dev/null || true
|
|
663
|
+
fi
|
|
664
|
+
|
|
665
|
+
node index.js
|
|
666
|
+
```
|
|
667
|
+
|
|
668
|
+
Step 2: Upload Files via SFTP
|
|
669
|
+
|
|
670
|
+
```bash
|
|
671
|
+
# Connect to your server via SFTP and upload:
|
|
672
|
+
/home/container/
|
|
673
|
+
├── index.js
|
|
674
|
+
├── package.json
|
|
675
|
+
├── start.sh
|
|
676
|
+
└── node_modules/ (will be created by npm install)
|
|
677
|
+
```
|
|
678
|
+
|
|
679
|
+
Step 3: Install Dependencies
|
|
680
|
+
|
|
681
|
+
```bash
|
|
682
|
+
cd /home/container
|
|
683
|
+
npm install
|
|
684
|
+
chmod +x start.sh
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
Step 4: Configure Pterodactyl Panel
|
|
688
|
+
|
|
689
|
+
Startup Command:
|
|
690
|
+
|
|
372
691
|
```
|
|
692
|
+
bash start.sh
|
|
693
|
+
```
|
|
694
|
+
|
|
695
|
+
Docker Image:
|
|
696
|
+
|
|
697
|
+
```
|
|
698
|
+
node:20-slim
|
|
699
|
+
```
|
|
700
|
+
|
|
701
|
+
Environment Variables:
|
|
702
|
+
|
|
703
|
+
Variable Description Example
|
|
704
|
+
SERVER_PORT Java edition port (TCP) 25565
|
|
705
|
+
BEDROCK_PORT Bedrock edition port (UDP) 19132
|
|
706
|
+
SERVER_MEMORY_INIT Initial memory 2G
|
|
707
|
+
SERVER_MEMORY_MAX Max memory 4G
|
|
708
|
+
SERVER_MOTD Message of the day My Server
|
|
709
|
+
|
|
710
|
+
Pterodactyl Memory Safety
|
|
711
|
+
|
|
712
|
+
The module automatically:
|
|
713
|
+
|
|
714
|
+
· Detects cgroup memory limits
|
|
715
|
+
· Uses only 90% of available memory to prevent OOM killer
|
|
716
|
+
· Adjusts -Xmx accordingly
|
|
717
|
+
· Logs the adjusted memory value
|
|
718
|
+
|
|
719
|
+
Port Configuration Options
|
|
720
|
+
|
|
721
|
+
Option A: Separate Ports (Recommended)
|
|
722
|
+
|
|
723
|
+
· Add port 25565 (TCP) for Java
|
|
724
|
+
· Add port 19132 (UDP) for Bedrock
|
|
725
|
+
· Set both environment variables
|
|
726
|
+
|
|
727
|
+
Option B: Single Port (Port Sharing)
|
|
728
|
+
|
|
729
|
+
· Set only SERVER_PORT
|
|
730
|
+
· Ensure port is configured for BOTH TCP and UDP in panel
|
|
731
|
+
· Geyser will automatically share the same port
|
|
732
|
+
· Warning appears if UDP not enabled
|
|
733
|
+
|
|
734
|
+
---
|
|
735
|
+
|
|
736
|
+
How to Connect from Minecraft
|
|
737
|
+
|
|
738
|
+
Java Edition Connection
|
|
739
|
+
|
|
740
|
+
1. Open Minecraft Java Edition
|
|
741
|
+
2. Click "Multiplayer" → "Add Server"
|
|
742
|
+
3. Server Address: your-server-ip:25565 (or your configured port)
|
|
743
|
+
4. Click "Done" and join
|
|
744
|
+
|
|
745
|
+
Bedrock Edition Connection
|
|
746
|
+
|
|
747
|
+
If you have separate Bedrock port (19132 UDP):
|
|
748
|
+
|
|
749
|
+
1. Open Minecraft Bedrock Edition
|
|
750
|
+
2. Click "Play" → "Servers" → "Add Server"
|
|
751
|
+
3. Server Address: your-server-ip
|
|
752
|
+
4. Port: 19132
|
|
753
|
+
5. Click "Save" and join
|
|
754
|
+
|
|
755
|
+
If using port sharing (same port as Java):
|
|
756
|
+
|
|
757
|
+
1. Open Minecraft Bedrock Edition
|
|
758
|
+
2. Click "Play" → "Servers" → "Add Server"
|
|
759
|
+
3. Server Address: your-server-ip
|
|
760
|
+
4. Port: 25565 (or your configured port)
|
|
761
|
+
5. IMPORTANT: Port must have UDP enabled in Pterodactyl panel
|
|
762
|
+
6. Click "Save" and join
|
|
763
|
+
|
|
764
|
+
Cross-Play (Java + Bedrock together)
|
|
765
|
+
|
|
766
|
+
With Geyser and Floodgate enabled, both Java and Bedrock players can join the same server simultaneously. Bedrock players will see Java players and vice versa.
|
|
373
767
|
|
|
374
768
|
---
|
|
375
769
|
|
|
376
770
|
Configuration Guide
|
|
377
771
|
|
|
378
|
-
Complete Configuration Example
|
|
772
|
+
Complete Configuration Example with New Features
|
|
379
773
|
|
|
380
774
|
```javascript
|
|
381
775
|
const { MinecraftServer } = require('@dimzxzzx07/mc-headless');
|
|
382
776
|
|
|
383
777
|
const server = new MinecraftServer({
|
|
384
|
-
// Platform Selection
|
|
385
778
|
platform: 'all',
|
|
386
779
|
version: '1.21.11',
|
|
387
780
|
type: 'paper',
|
|
388
781
|
autoAcceptEula: true,
|
|
389
782
|
|
|
390
|
-
// Java Options
|
|
391
783
|
usePortableJava: true,
|
|
392
784
|
javaVersion: 'auto',
|
|
393
785
|
|
|
394
|
-
// Resource Management
|
|
395
786
|
memory: {
|
|
396
787
|
init: '4G',
|
|
397
788
|
max: '12G',
|
|
398
789
|
useAikarsFlags: true
|
|
399
790
|
},
|
|
400
791
|
|
|
401
|
-
// Network Settings
|
|
402
792
|
network: {
|
|
403
793
|
port: 25565,
|
|
404
794
|
bedrockPort: 19132,
|
|
@@ -407,7 +797,6 @@ const server = new MinecraftServer({
|
|
|
407
797
|
motd: 'Minecraft Server'
|
|
408
798
|
},
|
|
409
799
|
|
|
410
|
-
// World & Difficulty Settings
|
|
411
800
|
world: {
|
|
412
801
|
difficulty: 'normal',
|
|
413
802
|
hardcore: false,
|
|
@@ -419,7 +808,6 @@ const server = new MinecraftServer({
|
|
|
419
808
|
levelName: 'world'
|
|
420
809
|
},
|
|
421
810
|
|
|
422
|
-
// Folder Management
|
|
423
811
|
folders: {
|
|
424
812
|
addons: './addons',
|
|
425
813
|
mods: './mods',
|
|
@@ -427,13 +815,45 @@ const server = new MinecraftServer({
|
|
|
427
815
|
world: './world'
|
|
428
816
|
},
|
|
429
817
|
|
|
430
|
-
// Plugins
|
|
818
|
+
// Plugins (NEW in 2.2.3)
|
|
431
819
|
enableViaVersion: true,
|
|
432
820
|
enableViaBackwards: true,
|
|
433
821
|
enableViaRewind: true,
|
|
434
822
|
enableSkinRestorer: true,
|
|
823
|
+
enableProtocolLib: true,
|
|
824
|
+
enableTCPShield: true,
|
|
825
|
+
enableSpigotOptimizers: true,
|
|
826
|
+
enableSpark: true,
|
|
827
|
+
enableViewDistanceTweaks: true,
|
|
828
|
+
enableFarmControl: true,
|
|
829
|
+
enableEntityDetection: true,
|
|
830
|
+
|
|
831
|
+
// RAM Disk (NEW)
|
|
832
|
+
ramdisk: {
|
|
833
|
+
enabled: true,
|
|
834
|
+
world: true,
|
|
835
|
+
plugins: true,
|
|
836
|
+
addons: true,
|
|
837
|
+
backupInterval: 300000,
|
|
838
|
+
masterStorage: '/home/minecraft-master'
|
|
839
|
+
},
|
|
840
|
+
|
|
841
|
+
// Symlink Master (NEW)
|
|
842
|
+
symlinkMaster: '/home/minecraft-master',
|
|
843
|
+
|
|
844
|
+
// Network Optimization (NEW)
|
|
845
|
+
networkOptimization: {
|
|
846
|
+
tcpFastOpen: true,
|
|
847
|
+
tcpNoDelay: true,
|
|
848
|
+
preferIPv4: true,
|
|
849
|
+
compressionThreshold: 64,
|
|
850
|
+
bungeeMode: false,
|
|
851
|
+
velocity: {
|
|
852
|
+
enabled: false,
|
|
853
|
+
secret: ''
|
|
854
|
+
}
|
|
855
|
+
},
|
|
435
856
|
|
|
436
|
-
// Server Behavior
|
|
437
857
|
autoRestart: true,
|
|
438
858
|
backup: {
|
|
439
859
|
enabled: true,
|
|
@@ -441,7 +861,6 @@ const server = new MinecraftServer({
|
|
|
441
861
|
path: './backups'
|
|
442
862
|
},
|
|
443
863
|
|
|
444
|
-
// Monitoring
|
|
445
864
|
memoryMonitor: {
|
|
446
865
|
enabled: true,
|
|
447
866
|
threshold: 85,
|
|
@@ -449,7 +868,6 @@ const server = new MinecraftServer({
|
|
|
449
868
|
action: 'warn'
|
|
450
869
|
},
|
|
451
870
|
|
|
452
|
-
// Performance
|
|
453
871
|
silentMode: true,
|
|
454
872
|
statsInterval: 30000
|
|
455
873
|
});
|
|
@@ -457,70 +875,44 @@ const server = new MinecraftServer({
|
|
|
457
875
|
await server.start();
|
|
458
876
|
```
|
|
459
877
|
|
|
460
|
-
Configuration Options
|
|
878
|
+
New Configuration Options in 2.2.3
|
|
461
879
|
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
Option Type Default Description
|
|
465
|
-
platform string 'java' 'java', 'bedrock', or 'all'
|
|
466
|
-
version string '1.21.11' Minecraft version
|
|
467
|
-
type string 'paper' paper, purpur, vanilla, spigot, forge, fabric
|
|
468
|
-
autoAcceptEula boolean true Automatically accept Minecraft EULA
|
|
469
|
-
|
|
470
|
-
Java Options
|
|
471
|
-
|
|
472
|
-
Option Type Default Description
|
|
473
|
-
usePortableJava boolean true Download portable JRE to current directory
|
|
474
|
-
javaVersion string 'auto' '17', '21', or 'auto'
|
|
475
|
-
|
|
476
|
-
Memory Options
|
|
477
|
-
|
|
478
|
-
Option Type Default Description
|
|
479
|
-
memory.init string '2G' Initial heap size
|
|
480
|
-
memory.max string '4G' Maximum heap size
|
|
481
|
-
memory.useAikarsFlags boolean true Use Aikar's optimized GC flags
|
|
482
|
-
|
|
483
|
-
Network Options
|
|
484
|
-
|
|
485
|
-
Option Type Default Description
|
|
486
|
-
network.port number 25565 Java edition server port
|
|
487
|
-
network.bedrockPort number 19132 Bedrock edition server port
|
|
488
|
-
network.ip string '0.0.0.0' Bind IP address
|
|
489
|
-
network.onlineMode boolean false Enable Mojang authentication
|
|
490
|
-
network.motd string 'Minecraft Server' Message of the day
|
|
491
|
-
|
|
492
|
-
World Options
|
|
880
|
+
Plugin Options
|
|
493
881
|
|
|
494
882
|
Option Type Default Description
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
world.levelName string 'world' World folder name
|
|
883
|
+
enableProtocolLib boolean false ProtocolLib for packet manipulation
|
|
884
|
+
enableTCPShield boolean false TCPShield DDoS protection
|
|
885
|
+
enableSpigotOptimizers boolean false Performance optimization plugin
|
|
886
|
+
enableSpark boolean false Spark profiler for performance monitoring
|
|
887
|
+
enableViewDistanceTweaks boolean false Dynamic view distance adjustment
|
|
888
|
+
enableFarmControl boolean false Farm entity limit control
|
|
889
|
+
enableEntityDetection boolean false Entity tracking optimization
|
|
503
890
|
|
|
504
|
-
|
|
891
|
+
RAM Disk Options
|
|
505
892
|
|
|
506
893
|
Option Type Default Description
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
894
|
+
ramdisk.enabled boolean false Enable RAM disk for worlds/plugins
|
|
895
|
+
ramdisk.world boolean false Store world in RAM
|
|
896
|
+
ramdisk.plugins boolean false Store plugins in RAM
|
|
897
|
+
ramdisk.addons boolean false Store addons in RAM
|
|
898
|
+
ramdisk.backupInterval number 300000 Backup interval in ms (5 minutes default)
|
|
899
|
+
ramdisk.masterStorage string '/home/minecraft-master' Master storage path for backups
|
|
511
900
|
|
|
512
|
-
|
|
901
|
+
Symlink Master Options
|
|
513
902
|
|
|
514
903
|
Option Type Default Description
|
|
515
|
-
|
|
516
|
-
statsInterval number 30000 Stats update interval in ms
|
|
904
|
+
symlinkMaster string undefined Master directory for symbolic links
|
|
517
905
|
|
|
518
|
-
|
|
906
|
+
Network Optimization Options
|
|
519
907
|
|
|
520
908
|
Option Type Default Description
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
909
|
+
networkOptimization.tcpFastOpen boolean true Enable TCP Fast Open
|
|
910
|
+
networkOptimization.tcpNoDelay boolean true Enable TCP_NODELAY
|
|
911
|
+
networkOptimization.preferIPv4 boolean true Prefer IPv4 stack
|
|
912
|
+
networkOptimization.compressionThreshold number 64 Network compression threshold
|
|
913
|
+
networkOptimization.bungeeMode boolean false Enable BungeeCord mode
|
|
914
|
+
networkOptimization.velocity.enabled boolean false Enable Velocity proxy support
|
|
915
|
+
networkOptimization.velocity.secret string '' Velocity forwarding secret
|
|
524
916
|
|
|
525
917
|
---
|
|
526
918
|
|
|
@@ -532,7 +924,6 @@ MinecraftServer Class
|
|
|
532
924
|
class MinecraftServer extends EventEmitter {
|
|
533
925
|
constructor(config: Partial<MinecraftConfig>);
|
|
534
926
|
|
|
535
|
-
// Methods
|
|
536
927
|
async start(): Promise<ServerInfo>;
|
|
537
928
|
async stop(): Promise<void>;
|
|
538
929
|
sendCommand(command: string): void;
|
|
@@ -540,7 +931,6 @@ class MinecraftServer extends EventEmitter {
|
|
|
540
931
|
getPlayers(): Player[];
|
|
541
932
|
async backup(type?: 'full' | 'world' | 'plugins'): Promise<string>;
|
|
542
933
|
|
|
543
|
-
// Events
|
|
544
934
|
on(event: 'ready', listener: (info: ServerInfo) => void): this;
|
|
545
935
|
on(event: 'stop', listener: (data: { code: number }) => void): this;
|
|
546
936
|
on(event: 'player-join', listener: (player: Player) => void): this;
|
|
@@ -563,535 +953,121 @@ interface ServerInfo {
|
|
|
563
953
|
players: number;
|
|
564
954
|
maxPlayers: number;
|
|
565
955
|
uptime: number;
|
|
566
|
-
memory: {
|
|
567
|
-
used: number;
|
|
568
|
-
max: number;
|
|
569
|
-
};
|
|
956
|
+
memory: { used: number; max: number };
|
|
570
957
|
cpu: number;
|
|
571
958
|
status: 'starting' | 'running' | 'stopping' | 'stopped' | 'crashed';
|
|
572
959
|
}
|
|
573
960
|
```
|
|
574
961
|
|
|
575
|
-
Player Interface
|
|
576
|
-
|
|
577
|
-
```javascript
|
|
578
|
-
interface Player {
|
|
579
|
-
name: string;
|
|
580
|
-
uuid: string;
|
|
581
|
-
ip: string;
|
|
582
|
-
ping: number;
|
|
583
|
-
connectedAt: Date;
|
|
584
|
-
}
|
|
585
|
-
```
|
|
586
|
-
|
|
587
|
-
---
|
|
588
|
-
|
|
589
|
-
Usage Examples
|
|
590
|
-
|
|
591
|
-
Server with Auto RAM Detection
|
|
592
|
-
|
|
593
|
-
```javascript
|
|
594
|
-
const { MinecraftServer } = require('@dimzxzzx07/mc-headless');
|
|
595
|
-
const os = require('os');
|
|
596
|
-
|
|
597
|
-
const totalRam = Math.floor(os.totalmem() / 1024 / 1024 / 1024);
|
|
598
|
-
const maxRam = Math.min(12, Math.floor(totalRam * 0.7));
|
|
599
|
-
|
|
600
|
-
const server = new MinecraftServer({
|
|
601
|
-
version: '1.21.11',
|
|
602
|
-
type: 'paper',
|
|
603
|
-
usePortableJava: true,
|
|
604
|
-
memory: {
|
|
605
|
-
init: `${Math.floor(maxRam * 0.3)}G`,
|
|
606
|
-
max: `${maxRam}G`
|
|
607
|
-
}
|
|
608
|
-
});
|
|
609
|
-
|
|
610
|
-
server.on('ready', (info) => {
|
|
611
|
-
console.log(`Server running with ${info.memory.max} MB max`);
|
|
612
|
-
});
|
|
613
|
-
|
|
614
|
-
server.start();
|
|
615
|
-
```
|
|
616
|
-
|
|
617
|
-
Multiple Servers with Different Versions
|
|
618
|
-
|
|
619
|
-
```javascript
|
|
620
|
-
const { ServerManager } = require('@dimzxzzx07/mc-headless');
|
|
621
|
-
|
|
622
|
-
const manager = new ServerManager();
|
|
623
|
-
|
|
624
|
-
// Create servers
|
|
625
|
-
manager.createServer('lobby', {
|
|
626
|
-
version: '1.21.11',
|
|
627
|
-
type: 'paper',
|
|
628
|
-
network: { port: 25565 }
|
|
629
|
-
});
|
|
630
|
-
|
|
631
|
-
manager.createServer('survival', {
|
|
632
|
-
version: '1.21.11',
|
|
633
|
-
type: 'paper',
|
|
634
|
-
network: { port: 25566 },
|
|
635
|
-
world: { levelName: 'survival' }
|
|
636
|
-
});
|
|
637
|
-
|
|
638
|
-
manager.createServer('creative', {
|
|
639
|
-
version: '1.21.11',
|
|
640
|
-
type: 'paper',
|
|
641
|
-
network: { port: 25567 },
|
|
642
|
-
world: { gamemode: 'creative' }
|
|
643
|
-
});
|
|
644
|
-
|
|
645
|
-
// Start all
|
|
646
|
-
await manager.startAll();
|
|
647
|
-
|
|
648
|
-
// Broadcast command
|
|
649
|
-
await manager.broadcastCommand('say Server is running!');
|
|
650
|
-
```
|
|
651
|
-
|
|
652
|
-
Server with Owner Commands
|
|
653
|
-
|
|
654
|
-
```javascript
|
|
655
|
-
const { MinecraftServer } = require('@dimzxzzx07/mc-headless');
|
|
656
|
-
|
|
657
|
-
const server = new MinecraftServer({
|
|
658
|
-
version: '1.21.11',
|
|
659
|
-
type: 'paper',
|
|
660
|
-
owners: ['dimzxind', 'admin1', 'tesuser'],
|
|
661
|
-
ownerCommands: {
|
|
662
|
-
prefix: '!',
|
|
663
|
-
enabled: true
|
|
664
|
-
}
|
|
665
|
-
});
|
|
666
|
-
|
|
667
|
-
server.on('player-join', (player) => {
|
|
668
|
-
if (['dimzxind', 'admin1', 'tesuser'].includes(player.name)) {
|
|
669
|
-
server.sendCommand(`tellraw ${player.name} {"text":"Welcome Owner! Use !help for commands","color":"gold"}`);
|
|
670
|
-
}
|
|
671
|
-
});
|
|
672
|
-
|
|
673
|
-
server.start();
|
|
674
|
-
```
|
|
675
|
-
|
|
676
|
-
Owner Commands Available
|
|
677
|
-
|
|
678
|
-
Command Description Example
|
|
679
|
-
!gamemode <mode> [player] Change gamemode !gamemode creative
|
|
680
|
-
!gm <mode> [player] Shortcut for gamemode !gm survival
|
|
681
|
-
!tp <player> [x y z] Teleport !tp player2
|
|
682
|
-
!give <player> <item> [amount] Give items !give player2 diamond 64
|
|
683
|
-
!time <set\|add> <value> Change time !time set day
|
|
684
|
-
!weather <clear\|rain\|thunder> Change weather !weather clear
|
|
685
|
-
!kill [player] Kill player !kill player2
|
|
686
|
-
!ban <player> [reason] Ban player !ban hacker
|
|
687
|
-
!kick <player> [reason] Kick player !kick spammer
|
|
688
|
-
!op <player> Give operator !op friend
|
|
689
|
-
!deop <player> Remove operator !deop friend
|
|
690
|
-
!reload Reload server !reload
|
|
691
|
-
!save Save world !save
|
|
692
|
-
!list List players !list
|
|
693
|
-
!help Show owner commands !help
|
|
694
|
-
|
|
695
|
-
---
|
|
696
|
-
|
|
697
|
-
Server Types
|
|
698
|
-
|
|
699
|
-
Paper (Recommended for Performance)
|
|
700
|
-
|
|
701
|
-
```javascript
|
|
702
|
-
const server = new MinecraftServer({
|
|
703
|
-
type: 'paper',
|
|
704
|
-
version: '1.21.11',
|
|
705
|
-
memory: { useAikarsFlags: true }
|
|
706
|
-
});
|
|
707
|
-
```
|
|
708
|
-
|
|
709
|
-
Vanilla (Official Mojang)
|
|
710
|
-
|
|
711
|
-
```javascript
|
|
712
|
-
const server = new MinecraftServer({
|
|
713
|
-
type: 'vanilla',
|
|
714
|
-
version: '1.21.11'
|
|
715
|
-
});
|
|
716
|
-
```
|
|
717
|
-
|
|
718
|
-
Forge (Modded)
|
|
719
|
-
|
|
720
|
-
```javascript
|
|
721
|
-
const server = new MinecraftServer({
|
|
722
|
-
type: 'forge',
|
|
723
|
-
version: '1.21.11',
|
|
724
|
-
folders: { mods: './mods' }
|
|
725
|
-
});
|
|
726
|
-
```
|
|
727
|
-
|
|
728
|
-
Fabric (Lightweight Modding)
|
|
729
|
-
|
|
730
|
-
```javascript
|
|
731
|
-
const server = new MinecraftServer({
|
|
732
|
-
type: 'fabric',
|
|
733
|
-
version: '1.21.11',
|
|
734
|
-
folders: { mods: './mods' }
|
|
735
|
-
});
|
|
736
|
-
```
|
|
737
|
-
|
|
738
|
-
---
|
|
739
|
-
|
|
740
|
-
Platform Options
|
|
741
|
-
|
|
742
|
-
Java Edition Only
|
|
743
|
-
|
|
744
|
-
```javascript
|
|
745
|
-
const server = new MinecraftServer({
|
|
746
|
-
platform: 'java',
|
|
747
|
-
version: '1.21.11',
|
|
748
|
-
type: 'paper',
|
|
749
|
-
network: { port: 25565 }
|
|
750
|
-
});
|
|
751
|
-
```
|
|
752
|
-
|
|
753
|
-
Bedrock Edition Only
|
|
754
|
-
|
|
755
|
-
```javascript
|
|
756
|
-
const server = new MinecraftServer({
|
|
757
|
-
platform: 'bedrock',
|
|
758
|
-
version: '1.21.11',
|
|
759
|
-
network: { port: 19132 },
|
|
760
|
-
folders: { addons: './addons' }
|
|
761
|
-
});
|
|
762
|
-
```
|
|
763
|
-
|
|
764
|
-
Cross-Play (Java + Bedrock)
|
|
765
|
-
|
|
766
|
-
```javascript
|
|
767
|
-
const server = new MinecraftServer({
|
|
768
|
-
platform: 'all',
|
|
769
|
-
version: '1.21.11',
|
|
770
|
-
type: 'paper',
|
|
771
|
-
network: {
|
|
772
|
-
port: 25565,
|
|
773
|
-
bedrockPort: 19132
|
|
774
|
-
}
|
|
775
|
-
});
|
|
776
|
-
```
|
|
777
|
-
|
|
778
|
-
---
|
|
779
|
-
|
|
780
|
-
Memory Management
|
|
781
|
-
|
|
782
|
-
Basic Memory Configuration
|
|
783
|
-
|
|
784
|
-
```javascript
|
|
785
|
-
memory: {
|
|
786
|
-
init: '2G',
|
|
787
|
-
max: '4G',
|
|
788
|
-
useAikarsFlags: false
|
|
789
|
-
}
|
|
790
|
-
```
|
|
791
|
-
|
|
792
|
-
Aikar's Flags (Optimized)
|
|
793
|
-
|
|
794
|
-
```javascript
|
|
795
|
-
memory: {
|
|
796
|
-
init: '2G',
|
|
797
|
-
max: '8G',
|
|
798
|
-
useAikarsFlags: true
|
|
799
|
-
}
|
|
800
|
-
```
|
|
801
|
-
|
|
802
|
-
Memory Recommendations
|
|
803
|
-
|
|
804
|
-
Players RAM Init Max
|
|
805
|
-
1-10 2 GB 1G 2G
|
|
806
|
-
10-20 4 GB 2G 4G
|
|
807
|
-
20-50 8 GB 4G 8G
|
|
808
|
-
50-100 16 GB 8G 16G
|
|
809
|
-
|
|
810
|
-
---
|
|
811
|
-
|
|
812
|
-
Network Settings
|
|
813
|
-
|
|
814
|
-
Basic Network
|
|
815
|
-
|
|
816
|
-
```javascript
|
|
817
|
-
network: {
|
|
818
|
-
port: 25565,
|
|
819
|
-
ip: '0.0.0.0',
|
|
820
|
-
onlineMode: false,
|
|
821
|
-
motd: 'My Server'
|
|
822
|
-
}
|
|
823
|
-
```
|
|
824
|
-
|
|
825
|
-
Cross-Play Network
|
|
826
|
-
|
|
827
|
-
```javascript
|
|
828
|
-
network: {
|
|
829
|
-
port: 25565,
|
|
830
|
-
bedrockPort: 19132,
|
|
831
|
-
ip: '0.0.0.0',
|
|
832
|
-
onlineMode: false,
|
|
833
|
-
motd: 'Cross-Play Server'
|
|
834
|
-
}
|
|
835
|
-
```
|
|
836
|
-
|
|
837
962
|
---
|
|
838
963
|
|
|
839
|
-
|
|
964
|
+
Plugins & Boosters
|
|
840
965
|
|
|
841
|
-
|
|
966
|
+
Available Plugins in v2.2.3
|
|
842
967
|
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
968
|
+
Plugin Function Enable Option
|
|
969
|
+
ProtocolLib Packet manipulation library enableProtocolLib: true
|
|
970
|
+
TCPShield DDoS protection and proxy enableTCPShield: true
|
|
971
|
+
Spigot-Optimizers Performance optimizations enableSpigotOptimizers: true
|
|
972
|
+
Spark Performance profiling enableSpark: true
|
|
973
|
+
ViewDistanceTweaks Dynamic view distance enableViewDistanceTweaks: true
|
|
974
|
+
FarmControl Farm entity limits enableFarmControl: true
|
|
975
|
+
EntityDetection Entity tracking optimization enableEntityDetection: true
|
|
976
|
+
ViaVersion Cross-version support enableViaVersion: true
|
|
977
|
+
ViaBackwards Backwards compatibility enableViaBackwards: true
|
|
978
|
+
ViaRewind 1.7-1.8 support enableViaRewind: true
|
|
979
|
+
SkinRestorer Player skin fixing enableSkinRestorer: true
|
|
853
980
|
|
|
854
|
-
|
|
981
|
+
Plugin Auto-Download
|
|
855
982
|
|
|
856
|
-
|
|
857
|
-
world: {
|
|
858
|
-
difficulty: 'hard',
|
|
859
|
-
hardcore: true,
|
|
860
|
-
gamemode: 'survival',
|
|
861
|
-
maxPlayers: 10,
|
|
862
|
-
viewDistance: 6
|
|
863
|
-
}
|
|
864
|
-
```
|
|
983
|
+
All plugins are automatically downloaded from official sources with:
|
|
865
984
|
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
levelName: 'custom_world'
|
|
872
|
-
}
|
|
873
|
-
```
|
|
985
|
+
· Stream finished guarantee
|
|
986
|
+
· 1-second delay between downloads
|
|
987
|
+
· Size verification (>100KB)
|
|
988
|
+
· ZIP header validation
|
|
989
|
+
· Auto-retry on failure
|
|
874
990
|
|
|
875
991
|
---
|
|
876
992
|
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
```
|
|
880
|
-
server/
|
|
881
|
-
├── plugins/ # Paper/Spigot plugins
|
|
882
|
-
├── mods/ # Forge/Fabric mods
|
|
883
|
-
├── addons/ # Bedrock addons
|
|
884
|
-
├── world/ # World data
|
|
885
|
-
├── logs/ # Server logs
|
|
886
|
-
├── backups/ # Backup files
|
|
887
|
-
└── .java/ # Portable Java (if enabled)
|
|
888
|
-
```
|
|
889
|
-
|
|
890
|
-
---
|
|
993
|
+
RAM Disk & Symlink System
|
|
891
994
|
|
|
892
|
-
|
|
995
|
+
How RAM Disk Works
|
|
893
996
|
|
|
894
|
-
|
|
997
|
+
When enabled, worlds/plugins/addons are stored in RAM (/dev/shm/minecraft) for lightning-fast access:
|
|
895
998
|
|
|
896
999
|
```javascript
|
|
897
|
-
|
|
1000
|
+
ramdisk: {
|
|
898
1001
|
enabled: true,
|
|
899
|
-
|
|
900
|
-
|
|
1002
|
+
world: true, // World in RAM
|
|
1003
|
+
plugins: true, // Plugins in RAM
|
|
1004
|
+
addons: true, // Addons in RAM
|
|
1005
|
+
backupInterval: 300000, // Backup every 5 minutes
|
|
1006
|
+
masterStorage: '/home/minecraft-master' // Master storage
|
|
901
1007
|
}
|
|
902
1008
|
```
|
|
903
1009
|
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
```javascript
|
|
907
|
-
// Full backup
|
|
908
|
-
const fullPath = await server.backup('full');
|
|
909
|
-
|
|
910
|
-
// World only backup
|
|
911
|
-
const worldPath = await server.backup('world');
|
|
912
|
-
|
|
913
|
-
// Plugins only backup
|
|
914
|
-
const pluginsPath = await server.backup('plugins');
|
|
915
|
-
```
|
|
916
|
-
|
|
917
|
-
---
|
|
918
|
-
|
|
919
|
-
Event System
|
|
920
|
-
|
|
921
|
-
Server Events
|
|
922
|
-
|
|
923
|
-
```javascript
|
|
924
|
-
server.on('ready', (info) => {
|
|
925
|
-
console.log('Server ready at', info.port);
|
|
926
|
-
});
|
|
927
|
-
|
|
928
|
-
server.on('stop', ({ code }) => {
|
|
929
|
-
console.log('Server stopped with code', code);
|
|
930
|
-
});
|
|
931
|
-
|
|
932
|
-
server.on('resource', (info) => {
|
|
933
|
-
console.log(`Memory: ${info.memory.used}/${info.memory.max} MB`);
|
|
934
|
-
});
|
|
935
|
-
```
|
|
936
|
-
|
|
937
|
-
Player Events
|
|
938
|
-
|
|
939
|
-
```javascript
|
|
940
|
-
server.on('player-join', (player) => {
|
|
941
|
-
console.log(`${player.name} joined from ${player.ip}`);
|
|
942
|
-
server.sendCommand(`say Welcome ${player.name}!`);
|
|
943
|
-
});
|
|
944
|
-
|
|
945
|
-
server.on('player-leave', (name) => {
|
|
946
|
-
console.log(`${name} left the game`);
|
|
947
|
-
});
|
|
948
|
-
```
|
|
949
|
-
|
|
950
|
-
---
|
|
951
|
-
|
|
952
|
-
Commands
|
|
953
|
-
|
|
954
|
-
Built-in Commands
|
|
955
|
-
|
|
956
|
-
```javascript
|
|
957
|
-
// Send any Minecraft command
|
|
958
|
-
server.sendCommand('say Hello world');
|
|
959
|
-
server.sendCommand('time set day');
|
|
960
|
-
server.sendCommand('weather clear');
|
|
961
|
-
server.sendCommand('difficulty hard');
|
|
962
|
-
server.sendCommand('gamemode creative @a');
|
|
963
|
-
```
|
|
964
|
-
|
|
965
|
-
Console Commands
|
|
966
|
-
|
|
967
|
-
```javascript
|
|
968
|
-
// Stop server
|
|
969
|
-
server.sendCommand('stop');
|
|
970
|
-
|
|
971
|
-
// Save world
|
|
972
|
-
server.sendCommand('save-all');
|
|
973
|
-
|
|
974
|
-
// List players
|
|
975
|
-
server.sendCommand('list');
|
|
976
|
-
|
|
977
|
-
// Ban player
|
|
978
|
-
server.sendCommand('ban Notch');
|
|
979
|
-
```
|
|
980
|
-
|
|
981
|
-
---
|
|
982
|
-
|
|
983
|
-
Player Management
|
|
984
|
-
|
|
985
|
-
Get Player List
|
|
1010
|
+
Crash Recovery Flow
|
|
986
1011
|
|
|
987
|
-
```javascript
|
|
988
|
-
const players = server.getPlayers();
|
|
989
|
-
players.forEach(player => {
|
|
990
|
-
console.log(`${player.name} - Ping: ${player.ping}ms`);
|
|
991
|
-
});
|
|
992
1012
|
```
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
network: {
|
|
1013
|
-
port: 25565,
|
|
1014
|
-
bedrockPort: 19132
|
|
1015
|
-
}
|
|
1016
|
-
});
|
|
1013
|
+
┌─────────────────────────────────────────────────────────┐
|
|
1014
|
+
│ CRASH RECOVERY FLOW │
|
|
1015
|
+
└─────────────────────────────────────────────────────────┘
|
|
1016
|
+
|
|
1017
|
+
1. Server crashes or VPS reboots
|
|
1018
|
+
↓
|
|
1019
|
+
2. RAM disk data lost (/dev/shm cleared)
|
|
1020
|
+
↓
|
|
1021
|
+
3. Server restarts
|
|
1022
|
+
↓
|
|
1023
|
+
4. restoreFromMaster() runs
|
|
1024
|
+
↓
|
|
1025
|
+
5. Checks if RAM disk is empty
|
|
1026
|
+
↓
|
|
1027
|
+
6. Copies from master storage to RAM
|
|
1028
|
+
↓
|
|
1029
|
+
7. World/plugins restored exactly as before
|
|
1030
|
+
↓
|
|
1031
|
+
8. Server starts with latest data
|
|
1017
1032
|
```
|
|
1018
1033
|
|
|
1019
|
-
|
|
1034
|
+
Benefits
|
|
1020
1035
|
|
|
1021
|
-
|
|
1036
|
+
· 10-50x faster world loading
|
|
1037
|
+
· Zero lag during chunk generation
|
|
1038
|
+
· Instant plugin loading
|
|
1039
|
+
· Automatic backup to disk every 5 minutes
|
|
1040
|
+
· Crash recovery - Data restored from master storage
|
|
1041
|
+
· Data safety - RAM data regularly saved to disk
|
|
1022
1042
|
|
|
1023
|
-
|
|
1043
|
+
Symlink Master System
|
|
1024
1044
|
|
|
1025
1045
|
```javascript
|
|
1026
|
-
|
|
1027
|
-
version: '1.21.11',
|
|
1028
|
-
type: 'paper',
|
|
1029
|
-
enableViaVersion: true,
|
|
1030
|
-
enableViaBackwards: true,
|
|
1031
|
-
enableViaRewind: true
|
|
1032
|
-
});
|
|
1046
|
+
symlinkMaster: '/home/minecraft-master'
|
|
1033
1047
|
```
|
|
1034
1048
|
|
|
1035
|
-
|
|
1049
|
+
Creates a secure master folder structure:
|
|
1036
1050
|
|
|
1037
|
-
Plugin Function
|
|
1038
|
-
ViaVersion Allows newer clients to connect to older servers
|
|
1039
|
-
ViaBackwards Allows older clients to connect to newer servers
|
|
1040
|
-
ViaRewind Adds support for 1.7.x - 1.8.x clients
|
|
1041
|
-
|
|
1042
|
-
With ViaVersion enabled, your server can accept connections from Minecraft versions 1.7.x through 1.21.x.
|
|
1043
|
-
|
|
1044
|
-
---
|
|
1045
|
-
|
|
1046
|
-
SkinRestorer Support
|
|
1047
|
-
|
|
1048
|
-
Enable SkinRestorer
|
|
1049
|
-
|
|
1050
|
-
```javascript
|
|
1051
|
-
const server = new MinecraftServer({
|
|
1052
|
-
enableSkinRestorer: true
|
|
1053
|
-
});
|
|
1054
1051
|
```
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
---
|
|
1061
|
-
|
|
1062
|
-
Portable Java
|
|
1063
|
-
|
|
1064
|
-
How It Works
|
|
1065
|
-
|
|
1066
|
-
```javascript
|
|
1067
|
-
const server = new MinecraftServer({
|
|
1068
|
-
usePortableJava: true, // Download JRE to .java folder
|
|
1069
|
-
javaVersion: 'auto' // Auto-detect required version
|
|
1070
|
-
});
|
|
1052
|
+
/home/minecraft-master/
|
|
1053
|
+
├── worlds/
|
|
1054
|
+
├── plugins/
|
|
1055
|
+
├── addons/
|
|
1056
|
+
└── mods/
|
|
1071
1057
|
```
|
|
1072
1058
|
|
|
1073
|
-
|
|
1074
|
-
· Extracts to .java/jre-{version}/ in current directory
|
|
1075
|
-
· Auto-cleanup after 24 hours
|
|
1076
|
-
· No system installation required
|
|
1077
|
-
· Sets JAVA_HOME and PATH automatically
|
|
1078
|
-
· Adds MALLOC_ARENA_MAX=2 for memory efficiency
|
|
1079
|
-
|
|
1080
|
-
Java Version Requirements
|
|
1059
|
+
Server folders become symbolic links pointing to master folders, providing:
|
|
1081
1060
|
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
1.18.x Java 17
|
|
1087
|
-
1.17.x Java 16
|
|
1088
|
-
1.16.x Java 8
|
|
1061
|
+
· Data safety - Master data survives server resets
|
|
1062
|
+
· Easy backups - Backup only master folder
|
|
1063
|
+
· Multiple servers - Share plugins across instances
|
|
1064
|
+
· Quick restore - Just recreate symlinks
|
|
1089
1065
|
|
|
1090
1066
|
---
|
|
1091
1067
|
|
|
1092
1068
|
Performance Tuning
|
|
1093
1069
|
|
|
1094
|
-
Optimized Configuration
|
|
1070
|
+
Optimized Configuration with New Features
|
|
1095
1071
|
|
|
1096
1072
|
```javascript
|
|
1097
1073
|
const server = new MinecraftServer({
|
|
@@ -1108,200 +1084,124 @@ const server = new MinecraftServer({
|
|
|
1108
1084
|
simulationDistance: 4,
|
|
1109
1085
|
maxPlayers: 20
|
|
1110
1086
|
},
|
|
1087
|
+
|
|
1088
|
+
// Enable performance plugins
|
|
1089
|
+
enableSpigotOptimizers: true,
|
|
1090
|
+
enableSpark: true,
|
|
1091
|
+
enableViewDistanceTweaks: true,
|
|
1092
|
+
enableFarmControl: true,
|
|
1093
|
+
enableEntityDetection: true,
|
|
1094
|
+
|
|
1095
|
+
// RAM Disk for speed
|
|
1096
|
+
ramdisk: {
|
|
1097
|
+
enabled: true,
|
|
1098
|
+
world: true,
|
|
1099
|
+
plugins: true,
|
|
1100
|
+
backupInterval: 300000
|
|
1101
|
+
},
|
|
1102
|
+
|
|
1103
|
+
// Network optimizations
|
|
1104
|
+
networkOptimization: {
|
|
1105
|
+
tcpFastOpen: true,
|
|
1106
|
+
tcpNoDelay: true,
|
|
1107
|
+
compressionThreshold: 64
|
|
1108
|
+
},
|
|
1109
|
+
|
|
1111
1110
|
silentMode: true,
|
|
1112
1111
|
statsInterval: 30000
|
|
1113
1112
|
});
|
|
1114
1113
|
```
|
|
1115
1114
|
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
Variable Value Effect
|
|
1119
|
-
MALLOC_ARENA_MAX 2 Prevents memory fragmentation
|
|
1120
|
-
_JAVA_OPTIONS -Xmx... Global Java memory limit
|
|
1121
|
-
JAVA_HOME (auto) Points to portable Java
|
|
1122
|
-
|
|
1123
|
-
---
|
|
1124
|
-
|
|
1125
|
-
Pterodactyl Setup
|
|
1126
|
-
|
|
1127
|
-
Installation on Pterodactyl
|
|
1115
|
+
Java Arguments Added in 2.2.3
|
|
1128
1116
|
|
|
1129
1117
|
```bash
|
|
1130
|
-
#
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
#
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
version: '1.21.11',
|
|
1151
|
-
type: 'paper',
|
|
1152
|
-
usePortableJava: true,
|
|
1153
|
-
memory: {
|
|
1154
|
-
init: '2G',
|
|
1155
|
-
max: '4G'
|
|
1156
|
-
},
|
|
1157
|
-
network: {
|
|
1158
|
-
port: 25565
|
|
1159
|
-
}
|
|
1160
|
-
});
|
|
1161
|
-
|
|
1162
|
-
server.on('ready', (info) => {
|
|
1163
|
-
console.log(`Server ready on port ${info.port}`);
|
|
1164
|
-
});
|
|
1165
|
-
|
|
1166
|
-
server.start();
|
|
1167
|
-
EOF
|
|
1168
|
-
|
|
1169
|
-
# Run server
|
|
1170
|
-
node index.js
|
|
1171
|
-
```
|
|
1172
|
-
|
|
1173
|
-
Pterodactyl Egg Configuration
|
|
1174
|
-
|
|
1175
|
-
If you want to create a custom Pterodactyl egg:
|
|
1176
|
-
|
|
1177
|
-
```json
|
|
1178
|
-
{
|
|
1179
|
-
"name": "MC-Headless",
|
|
1180
|
-
"description": "Minecraft Headless Server Manager",
|
|
1181
|
-
"docker_images": {
|
|
1182
|
-
"node:20": "node:20"
|
|
1183
|
-
},
|
|
1184
|
-
"startup": "node /home/container/index.js",
|
|
1185
|
-
"environment": {
|
|
1186
|
-
"SERVER_VERSION": "1.21.11",
|
|
1187
|
-
"SERVER_TYPE": "paper",
|
|
1188
|
-
"MEMORY_INIT": "2G",
|
|
1189
|
-
"MEMORY_MAX": "4G"
|
|
1190
|
-
}
|
|
1191
|
-
}
|
|
1192
|
-
```
|
|
1193
|
-
|
|
1194
|
-
---
|
|
1195
|
-
|
|
1196
|
-
Termux Setup
|
|
1197
|
-
|
|
1198
|
-
Install in Termux
|
|
1199
|
-
|
|
1200
|
-
```bash
|
|
1201
|
-
# Update packages
|
|
1202
|
-
pkg update && pkg upgrade
|
|
1203
|
-
|
|
1204
|
-
# Install Node.js
|
|
1205
|
-
pkg install nodejs
|
|
1206
|
-
|
|
1207
|
-
# Install mc-headless
|
|
1208
|
-
npm install -g @dimzxzzx07/mc-headless
|
|
1209
|
-
|
|
1210
|
-
# Create server directory
|
|
1211
|
-
mkdir minecraft-server
|
|
1212
|
-
cd minecraft-server
|
|
1213
|
-
|
|
1214
|
-
# Create server script
|
|
1215
|
-
cat > server.js << 'EOF'
|
|
1216
|
-
const { MinecraftServer } = require('@dimzxzzx07/mc-headless');
|
|
1217
|
-
|
|
1218
|
-
const server = new MinecraftServer({
|
|
1219
|
-
platform: 'java',
|
|
1220
|
-
version: '1.21.11',
|
|
1221
|
-
type: 'paper',
|
|
1222
|
-
usePortableJava: true,
|
|
1223
|
-
memory: {
|
|
1224
|
-
init: '512M',
|
|
1225
|
-
max: '2G'
|
|
1226
|
-
}
|
|
1227
|
-
});
|
|
1228
|
-
|
|
1229
|
-
server.start();
|
|
1230
|
-
EOF
|
|
1231
|
-
|
|
1232
|
-
# Run server
|
|
1233
|
-
node server.js
|
|
1118
|
+
# Base memory and GC
|
|
1119
|
+
-Xms4G -Xmx12G
|
|
1120
|
+
-XX:+UseG1GC
|
|
1121
|
+
-XX:MaxGCPauseMillis=50
|
|
1122
|
+
-XX:+UseStringDeduplication
|
|
1123
|
+
-XX:G1MixedGCLiveThresholdPercent=90
|
|
1124
|
+
|
|
1125
|
+
# Network optimizations
|
|
1126
|
+
-Djava.net.preferIPv4Stack=true
|
|
1127
|
+
-Djava.net.tcpFastOpen=true
|
|
1128
|
+
-Djava.net.tcp.nodelay=true
|
|
1129
|
+
-Dnetwork-compression-threshold=64
|
|
1130
|
+
|
|
1131
|
+
# Netty optimizations
|
|
1132
|
+
-Dio.netty.recycler.maxCapacity.default=0
|
|
1133
|
+
-Dio.netty.leakDetectionLevel=disabled
|
|
1134
|
+
|
|
1135
|
+
# Terminal settings (Pterodactyl)
|
|
1136
|
+
-Dterminal.jline=false
|
|
1137
|
+
-Dterminal.ansi=true
|
|
1234
1138
|
```
|
|
1235
1139
|
|
|
1236
|
-
|
|
1140
|
+
Pterodactyl Memory Safety
|
|
1237
1141
|
|
|
1238
1142
|
```javascript
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
max: '2G'
|
|
1246
|
-
},
|
|
1247
|
-
world: {
|
|
1248
|
-
viewDistance: 4,
|
|
1249
|
-
simulationDistance: 3,
|
|
1250
|
-
maxPlayers: 10
|
|
1251
|
-
}
|
|
1252
|
-
});
|
|
1143
|
+
// Automatically applied in Pterodactyl
|
|
1144
|
+
if (isPterodactyl && cgroupMemory > 0) {
|
|
1145
|
+
const safeMem = Math.floor(cgroupMemory * 0.9);
|
|
1146
|
+
memMax = Math.min(memMax, safeMem);
|
|
1147
|
+
// Uses 90% of cgroup limit to prevent OOM killer
|
|
1148
|
+
}
|
|
1253
1149
|
```
|
|
1254
1150
|
|
|
1255
1151
|
---
|
|
1256
1152
|
|
|
1257
1153
|
Troubleshooting
|
|
1258
1154
|
|
|
1259
|
-
Common Issues
|
|
1155
|
+
Common Issues in 2.2.3
|
|
1260
1156
|
|
|
1261
1157
|
Issue Cause Solution
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1158
|
+
plugins/.paper-remapped error Corrupt plugin cache Auto-fixed in v2.2.3
|
|
1159
|
+
Bedrock cannot connect UDP not enabled Ensure port has UDP enabled
|
|
1160
|
+
RAM disk not working /dev/shm not available Check system RAM disk support
|
|
1161
|
+
Plugins not downloading Network issues Auto-retry in v2.2.3
|
|
1162
|
+
High memory usage RAM disk + worlds Reduce viewDistance or disable RAM disk
|
|
1163
|
+
Java update available Older Java Auto-downloads latest
|
|
1164
|
+
Server OOM killed Memory too high Module auto-reduces to 90% of limit
|
|
1269
1165
|
|
|
1270
|
-
Disk
|
|
1166
|
+
RAM Disk Issues
|
|
1271
1167
|
|
|
1272
1168
|
```bash
|
|
1273
|
-
# Check disk
|
|
1274
|
-
df -h
|
|
1169
|
+
# Check if RAM disk is mounted
|
|
1170
|
+
df -h /dev/shm
|
|
1275
1171
|
|
|
1276
|
-
#
|
|
1277
|
-
|
|
1172
|
+
# Check RAM disk usage
|
|
1173
|
+
du -sh /dev/shm/minecraft
|
|
1278
1174
|
|
|
1279
|
-
#
|
|
1280
|
-
|
|
1175
|
+
# Manual backup
|
|
1176
|
+
cp -r /dev/shm/minecraft/* /home/minecraft-master/
|
|
1281
1177
|
|
|
1282
|
-
#
|
|
1283
|
-
|
|
1178
|
+
# Restore from master
|
|
1179
|
+
cp -r /home/minecraft-master/* /dev/shm/minecraft/
|
|
1284
1180
|
```
|
|
1285
1181
|
|
|
1286
|
-
|
|
1182
|
+
Plugin Verification
|
|
1287
1183
|
|
|
1288
|
-
```
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1184
|
+
```bash
|
|
1185
|
+
# List installed plugins
|
|
1186
|
+
ls -la plugins/
|
|
1187
|
+
|
|
1188
|
+
# Check plugin sizes (should be >100KB)
|
|
1189
|
+
du -sh plugins/*.jar
|
|
1190
|
+
|
|
1191
|
+
# Check for corrupt plugins
|
|
1192
|
+
find plugins -name "*.jar" -size -100k -delete
|
|
1293
1193
|
```
|
|
1294
1194
|
|
|
1295
|
-
Logs
|
|
1195
|
+
Pterodactyl Memory Logs
|
|
1296
1196
|
|
|
1297
|
-
|
|
1298
|
-
# Server logs are piped directly to console
|
|
1299
|
-
# Check console output for errors
|
|
1197
|
+
Look for this line in startup logs:
|
|
1300
1198
|
|
|
1301
|
-
|
|
1302
|
-
|
|
1199
|
+
```
|
|
1200
|
+
Adjusted memory to 3686MB (90% of cgroup limit)
|
|
1303
1201
|
```
|
|
1304
1202
|
|
|
1203
|
+
This confirms the module is protecting your server from OOM killer.
|
|
1204
|
+
|
|
1305
1205
|
---
|
|
1306
1206
|
|
|
1307
1207
|
Contributing
|
|
@@ -1309,7 +1209,7 @@ Contributing
|
|
|
1309
1209
|
Development Setup
|
|
1310
1210
|
|
|
1311
1211
|
```bash
|
|
1312
|
-
git clone https://github.com/Dimzxzzx07/
|
|
1212
|
+
git clone https://github.com/Dimzxzzx07/Minecraft-Server-Integration-Node.js.git
|
|
1313
1213
|
cd mc-headless
|
|
1314
1214
|
npm install
|
|
1315
1215
|
npm run build
|
|
@@ -1334,7 +1234,8 @@ mc-headless/
|
|
|
1334
1234
|
│ ├── platforms/
|
|
1335
1235
|
│ │ ├── GeyserBridge.ts
|
|
1336
1236
|
│ │ ├── ViaVersion.ts
|
|
1337
|
-
│ │
|
|
1237
|
+
│ │ ├── SkinRestorer.ts
|
|
1238
|
+
│ │ └── PluginManager.ts
|
|
1338
1239
|
│ └── utils/
|
|
1339
1240
|
│ ├── Logger.ts
|
|
1340
1241
|
│ ├── FileUtils.ts
|
|
@@ -1344,14 +1245,6 @@ mc-headless/
|
|
|
1344
1245
|
└── README.md
|
|
1345
1246
|
```
|
|
1346
1247
|
|
|
1347
|
-
Pull Request Process
|
|
1348
|
-
|
|
1349
|
-
1. Fork the repository
|
|
1350
|
-
2. Create feature branch
|
|
1351
|
-
3. Commit changes
|
|
1352
|
-
4. Push to branch
|
|
1353
|
-
5. Open pull request
|
|
1354
|
-
|
|
1355
1248
|
---
|
|
1356
1249
|
|
|
1357
1250
|
License
|