@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.
Files changed (35) hide show
  1. package/README.md +658 -765
  2. package/dist/core/JavaChecker.d.ts +8 -2
  3. package/dist/core/JavaChecker.d.ts.map +1 -1
  4. package/dist/core/JavaChecker.js +219 -104
  5. package/dist/core/JavaChecker.js.map +1 -1
  6. package/dist/core/MinecraftServer.d.ts +17 -32
  7. package/dist/core/MinecraftServer.d.ts.map +1 -1
  8. package/dist/core/MinecraftServer.js +449 -186
  9. package/dist/core/MinecraftServer.js.map +1 -1
  10. package/dist/index.d.ts +19 -18
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +40 -18
  13. package/dist/index.js.map +1 -1
  14. package/dist/platforms/GeyserBridge.d.ts +21 -3
  15. package/dist/platforms/GeyserBridge.d.ts.map +1 -1
  16. package/dist/platforms/GeyserBridge.js +160 -60
  17. package/dist/platforms/GeyserBridge.js.map +1 -1
  18. package/dist/platforms/PluginManager.d.ts +16 -0
  19. package/dist/platforms/PluginManager.d.ts.map +1 -0
  20. package/dist/platforms/PluginManager.js +208 -0
  21. package/dist/platforms/PluginManager.js.map +1 -0
  22. package/dist/platforms/ViaVersion.d.ts +1 -7
  23. package/dist/platforms/ViaVersion.d.ts.map +1 -1
  24. package/dist/platforms/ViaVersion.js +23 -87
  25. package/dist/platforms/ViaVersion.js.map +1 -1
  26. package/dist/types/index.d.ts +189 -0
  27. package/dist/types/index.d.ts.map +1 -1
  28. package/package.json +4 -2
  29. package/src/core/JavaChecker.ts +224 -108
  30. package/src/core/MinecraftServer.ts +540 -254
  31. package/src/index.ts +19 -19
  32. package/src/platforms/GeyserBridge.ts +196 -80
  33. package/src/platforms/PluginManager.ts +206 -0
  34. package/src/platforms/ViaVersion.ts +26 -107
  35. 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.1-2563eb?style=for-the-badge&logo=typescript" alt="Version">
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.1](#whats-new-in-221)
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.1
115
-
116
- ### Version 2.2.1 - March 2026
117
-
118
- - **Pterodactyl Optimized** - Full compatibility with Pterodactyl panel
119
- - **No curl/wget required** - Pure Node.js downloader works everywhere
120
- - **Better error handling** - Clear messages for disk space issues
121
- - **Smaller Java downloads** - Uses JRE instead of full JDK (saves 150MB)
122
- - **Automatic disk space check** - Warns before downloading
123
- - **Improved platform detection** - Works on all Linux distros
124
- - **Fallback URLs** - Multiple mirrors for Java downloads
125
- - **Corrupted file detection** - Auto-retry on bad downloads
126
- - **Memory limit awareness** - Respects cgroup limits in containers
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 current directory, no system installation required |
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 downloader (no curl/wget needed) |
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.1)
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
- // Plugins
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(`\n==========================================`);
344
- console.log(`Minecraft Server - v2.2.1`);
345
- console.log(` IP: ${publicIp}:${info.port}`);
346
- console.log(` Version: ${info.version}`);
347
- console.log(` Memory: ${info.memory.used}/${info.memory.max} MB`);
348
- console.log(` CPU: ${info.cpu || 0}%`);
349
- console.log(` Players: ${info.players}/${info.maxPlayers}`);
350
- console.log(`==========================================\n`);
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.on("resource", (info) => {
363
- if (info.memory.used > info.memory.max * 0.8) {
364
- console.log(` High memory: ${info.memory.used}/${info.memory.max} MB`);
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 Reference
878
+ New Configuration Options in 2.2.3
461
879
 
462
- Platform Options
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
- world.difficulty string 'normal' peaceful, easy, normal, hard
496
- world.hardcore boolean false Enable hardcore mode
497
- world.gamemode string 'survival' survival, creative, adventure, spectator
498
- world.seed string undefined World generation seed
499
- world.maxPlayers number 20 Maximum player count
500
- world.viewDistance number 6 Chunk view distance
501
- world.simulationDistance number 4 Simulation distance
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
- Plugin Options
891
+ RAM Disk Options
505
892
 
506
893
  Option Type Default Description
507
- enableViaVersion boolean false Enable ViaVersion plugin
508
- enableViaBackwards boolean false Enable ViaBackwards plugin
509
- enableViaRewind boolean false Enable ViaRewind plugin
510
- enableSkinRestorer boolean false Enable SkinRestorer plugin
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
- Performance Options
901
+ Symlink Master Options
513
902
 
514
903
  Option Type Default Description
515
- silentMode boolean true Direct pipe logs (no Node.js processing)
516
- statsInterval number 30000 Stats update interval in ms
904
+ symlinkMaster string undefined Master directory for symbolic links
517
905
 
518
- Owner Options
906
+ Network Optimization Options
519
907
 
520
908
  Option Type Default Description
521
- owners array [] List of owner usernames
522
- ownerCommands.prefix string '!' Command prefix for owners
523
- ownerCommands.enabled boolean true Enable owner commands
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
- World Configuration
964
+ Plugins & Boosters
840
965
 
841
- Basic World
966
+ Available Plugins in v2.2.3
842
967
 
843
- ```javascript
844
- world: {
845
- difficulty: 'normal',
846
- gamemode: 'survival',
847
- maxPlayers: 20,
848
- viewDistance: 6,
849
- simulationDistance: 4,
850
- levelName: 'world'
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
- Hardcore Mode
981
+ Plugin Auto-Download
855
982
 
856
- ```javascript
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
- Custom Seed
867
-
868
- ```javascript
869
- world: {
870
- seed: 'my-amazing-seed-12345',
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
- Folder Structure
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
- Backup System
995
+ How RAM Disk Works
893
996
 
894
- Enable Automatic Backups
997
+ When enabled, worlds/plugins/addons are stored in RAM (/dev/shm/minecraft) for lightning-fast access:
895
998
 
896
999
  ```javascript
897
- backup: {
1000
+ ramdisk: {
898
1001
  enabled: true,
899
- interval: '24h',
900
- path: './backups'
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
- Manual Backup
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
- Player Count
995
-
996
- ```javascript
997
- const info = await server.getInfo();
998
- console.log(`Players online: ${info.players}/${info.maxPlayers}`);
999
- ```
1000
-
1001
- ---
1002
-
1003
- Cross-Play (Geyser)
1004
-
1005
- Automatic Setup
1006
-
1007
- ```javascript
1008
- const server = new MinecraftServer({
1009
- platform: 'all',
1010
- version: '1.21.11',
1011
- type: 'paper',
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
- ViaVersion Support
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
- Enable All ViaVersion Plugins
1043
+ Symlink Master System
1024
1044
 
1025
1045
  ```javascript
1026
- const server = new MinecraftServer({
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
- What Each Plugin Does
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
- · Auto-downloads latest SkinRestorer
1057
- · Fixes player skins for offline mode
1058
- · Works with Geyser (Bedrock players)
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
- · Downloads JRE (not full JDK) ~50MB
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
- Minecraft Version Java Version
1083
- 1.21.x Java 21
1084
- 1.20.x Java 17
1085
- 1.19.x Java 17
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
- Environment Optimizations
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
- # Connect to your Pterodactyl server via SSH
1131
- ssh user@your-server.com
1132
-
1133
- # Create directory for your server
1134
- mkdir minecraft-server
1135
- cd minecraft-server
1136
-
1137
- # Install Node.js (if not available)
1138
- curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
1139
- apt install -y nodejs
1140
-
1141
- # Install mc-headless
1142
- npm init -y
1143
- npm install @dimzxzzx07/mc-headless
1144
-
1145
- # Create server script
1146
- cat > index.js << 'EOF'
1147
- const { MinecraftServer } = require('@dimzxzzx07/mc-headless');
1148
-
1149
- const server = new MinecraftServer({
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
- Termux Optimizations
1140
+ Pterodactyl Memory Safety
1237
1141
 
1238
1142
  ```javascript
1239
- const server = new MinecraftServer({
1240
- version: '1.21.11',
1241
- type: 'paper',
1242
- usePortableJava: true,
1243
- memory: {
1244
- init: '512M',
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
- Java not found Java not installed Enable usePortableJava: true
1263
- ENOSPC: no space left Disk full Free disk space, reduce memory
1264
- Download failed: 302 URL redirect Using Node.js downloader (fixed in v2.2.1)
1265
- Port already in use Another server running Change port number
1266
- Plugin corrupt Bad download Delete plugin and restart
1267
- High CPU usage Too many chunks Reduce viewDistance to 4
1268
- Out of memory RAM too low Reduce max memory or add RAM
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 Space Issues
1166
+ RAM Disk Issues
1271
1167
 
1272
1168
  ```bash
1273
- # Check disk usage
1274
- df -h
1169
+ # Check if RAM disk is mounted
1170
+ df -h /dev/shm
1275
1171
 
1276
- # Clean up old Java files
1277
- rm -rf .java/jre-*
1172
+ # Check RAM disk usage
1173
+ du -sh /dev/shm/minecraft
1278
1174
 
1279
- # Clean npm cache
1280
- npm cache clean --force
1175
+ # Manual backup
1176
+ cp -r /dev/shm/minecraft/* /home/minecraft-master/
1281
1177
 
1282
- # Remove old backups
1283
- rm -rf backups/*
1178
+ # Restore from master
1179
+ cp -r /home/minecraft-master/* /dev/shm/minecraft/
1284
1180
  ```
1285
1181
 
1286
- Debug Mode
1182
+ Plugin Verification
1287
1183
 
1288
- ```javascript
1289
- const server = new MinecraftServer({
1290
- silentMode: false, // Disable silent mode to see all logs
1291
- statsInterval: 5000 // Update stats every 5 seconds
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 Location
1195
+ Pterodactyl Memory Logs
1296
1196
 
1297
- ```bash
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
- # Java portable logs
1302
- ls -la .java/
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/mc-headless.git
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
- │ │ └── SkinRestorer.ts
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