smodusermc commited on
Commit
d78d0c4
Β·
verified Β·
1 Parent(s): 9eaf603

Update start.sh

Browse files
Files changed (1) hide show
  1. start.sh +141 -53
start.sh CHANGED
@@ -13,19 +13,18 @@ PLUGIN_DIR="$BACKEND_DIR/plugins"
13
 
14
  mkdir -p "$PLUGIN_DIR"
15
 
16
- HF_BUCKET_HANDLE="hf://buckets/smodusermc/mc"
17
- SAVE_DIRS="world world_nether world_the_end players banned-ips.json banned-players.json ops.json whitelist.json"
18
  SYNC_INTERVAL="${SYNC_INTERVAL:-300}"
19
-
20
  IDLE_MODE=false
21
 
22
  # =============================================
23
- # OP ACCOUNT β€” set your username here
24
  # =============================================
25
  OP_USERNAME="CreppyBitch"
26
 
27
  CPU_CORES=$(nproc 2>/dev/null || echo 2)
28
- NETTY_THREADS=$CPU_CORES
29
 
30
  TOTAL_MEM_MB=$(free -m | awk '/^Mem:/{print $2}')
31
  BUNGEE_MAX_MB=1024
@@ -35,7 +34,7 @@ PAPER_MAX_MB=$(( TOTAL_MEM_MB - BUNGEE_MAX_MB - 768 ))
35
  PAPER_MIN_MB=8192
36
 
37
  echo "========================================"
38
- echo " Eaglercraft 1.8.8 Survival"
39
  echo " WindSpigot + HuggingFace Buckets"
40
  echo "========================================"
41
  echo ""
@@ -44,10 +43,11 @@ echo " Server: ${PAPER_MIN_MB}-${PAPER_MAX_MB}MB | Bungee: ${BUNGEE_MAX_MB}MB"
44
  echo " Java: $($JAVA -version 2>&1 | head -1)"
45
  echo " Bucket: $HF_BUCKET_HANDLE"
46
  [ -n "$OP_USERNAME" ] && echo " OP Account: $OP_USERNAME"
 
47
  echo ""
48
 
49
  # =============================================
50
- # JVM FLAGS β€” no GC thread limits
51
  # =============================================
52
  PAPER_JVM_FLAGS=(
53
  -Xmx${PAPER_MAX_MB}M
@@ -111,7 +111,7 @@ BUNGEE_JVM_FLAGS=(
111
  )
112
 
113
  # =============================================================
114
- # RCON
115
  # =============================================================
116
  RCON_PASS="chunkystart"
117
 
@@ -122,7 +122,9 @@ get_player_count() {
122
  }
123
 
124
  mc_command() {
125
- mcrcon -H 127.0.0.1 -P 25575 -p "$RCON_PASS" "$@" 2>/dev/null
 
 
126
  }
127
 
128
  # =============================================================
@@ -161,24 +163,42 @@ setup_op_account() {
161
  OPEOF
162
  echo " ops.json written (level 4, UUID: ${V3_UUID})"
163
 
164
- mc_command "op ${OP_USERNAME}" 2>/dev/null
165
  echo " RCON op command sent"
166
  }
167
 
168
  # =============================================================
169
- # IDLE MODE
170
  # =============================================================
171
  enter_idle_mode() {
172
  [ "$IDLE_MODE" = true ] && return
173
  IDLE_MODE=true
174
- mc_command "gamerule randomTickSpeed 0" "gamerule doMobSpawning false" "kill @e[type=!Player]"
175
- echo "[IDLE] Active"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
176
  }
177
 
178
  exit_idle_mode() {
179
  [ "$IDLE_MODE" = false ] && return
180
  IDLE_MODE=false
181
- mc_command "gamerule randomTickSpeed 3" "gamerule doMobSpawning true"
 
182
  echo "[IDLE] Gameplay restored"
183
  }
184
 
@@ -235,7 +255,10 @@ hf_push_saves() {
235
  local STAGING="/tmp/hf-staging"
236
  rm -rf "$STAGING" && mkdir -p "$STAGING"
237
  for item in $SAVE_DIRS; do
238
- [ -e "$BACKEND_DIR/$item" ] && cp -a "$BACKEND_DIR/$item" "$STAGING/$item"
 
 
 
239
  done
240
  hf buckets sync "$STAGING" "${HF_BUCKET_HANDLE}/game-data" --delete 2>&1 | tail -3
241
  [ $? -eq 0 ] && echo "[SYNC] OK $(date '+%H:%M:%S')" \
@@ -253,7 +276,7 @@ hf_sync_loop() {
253
  # =============================================================
254
  # STEP 0: Bucket
255
  # =============================================================
256
- echo "[0/6] Bucket setup..."
257
  hf_authenticate
258
  hf_ensure_bucket
259
  hf_restore_saves
@@ -262,7 +285,7 @@ echo ""
262
  # =============================================================
263
  # STEP 1: World size
264
  # =============================================================
265
- echo "[1/6] World analysis..."
266
  for WORLD_DIR in world world_nether world_the_end; do
267
  if [ -d "$BACKEND_DIR/$WORLD_DIR" ]; then
268
  SIZE=$(du -sh "$BACKEND_DIR/$WORLD_DIR" 2>/dev/null | awk '{print $1}')
@@ -273,33 +296,35 @@ done
273
  echo ""
274
 
275
  # =============================================================
276
- # STEP 2: Start WindSpigot
277
  # =============================================================
278
  cd "$BACKEND_DIR"
279
  echo "eula=true" > eula.txt
280
 
 
 
281
  cat > server.properties << 'EOF'
282
  server-port=25565
283
  server-ip=127.0.0.1
284
  online-mode=false
285
  spawn-protection=0
286
- max-players=10
287
- view-distance=4
288
  gamemode=0
289
- difficulty=2
290
  level-name=world
291
- level-type=DEFAULT
292
  level-seed=8678942899319966093
293
  generate-structures=true
294
- motd=Eaglercraft Server
295
  pvp=true
296
  allow-flight=false
297
  white-list=false
298
  spawn-npcs=true
299
- spawn-animals=true
300
- spawn-monsters=true
301
- enable-command-block=true
302
- allow-nether=true
303
  use-native-transport=true
304
  network-compression-threshold=-1
305
  entity-broadcast-range-percentage=50
@@ -393,7 +418,8 @@ settings:
393
  reduced-chunk-loads: true
394
  lag-compensated-potions: false
395
  anti-xray:
396
- enabled: false
 
397
  hit-detection:
398
  enabled: true
399
  threshold: 1.0
@@ -415,15 +441,12 @@ settings:
415
  stop-notify-bungee: true
416
  anti-malware: true
417
  use-tcp-nodelay: true
418
- brand-name: "Survival"
419
  EOF
420
 
421
- # Write ops.json before server starts
422
  setup_op_account
423
 
424
- echo "[2/6] Starting WindSpigot (--noconsole to fix CPU bug)..."
425
  > /tmp/paper.log
426
-
427
  start_windspigot
428
  echo " WindSpigot PID: $BACKEND_PID"
429
 
@@ -446,38 +469,49 @@ for i in $(seq 1 30); do
446
  sleep 1
447
  done
448
 
449
- # Send OP command via RCON as backup
450
  if [ -n "$OP_USERNAME" ]; then
451
  mc_command "op ${OP_USERNAME}"
452
  echo " OP granted to ${OP_USERNAME} via RCON"
453
  fi
454
 
455
  echo ""
456
- echo " === PLUGINS ==="
457
  grep -i "Enabling" /tmp/paper.log | grep -oP "Enabling \K[^\s]+" 2>/dev/null | while read p; do
458
  echo " - $p"
459
  done
460
- echo " ==============="
461
  echo ""
462
 
463
  # =============================================================
464
- # STEP 3: Skip CPU check (removed)
465
  # =============================================================
466
- echo "[3/6] Skipping CPU check..."
 
 
 
 
 
 
 
 
 
467
  echo ""
468
 
469
  # =============================================================
470
- # STEP 4: Apply idle mode
471
  # =============================================================
472
- echo "[4/6] Applying idle mode (no players)..."
473
- mc_command "gamerule randomTickSpeed 0" "gamerule doMobSpawning false" "kill @e[type=!Player]"
474
- IDLE_MODE=true
475
  echo ""
476
 
477
  # =============================================================
478
- # STEP 5: BungeeCord
479
  # =============================================================
480
- echo "[5/6] BungeeCord config..."
 
 
 
 
481
  cd "$BUNGEE_DIR"
482
 
483
  cat > config.yml << 'EOF'
@@ -498,12 +532,12 @@ disabled_commands:
498
  - disabledcommandhere
499
  servers:
500
  lobby:
501
- motd: '&aEaglercraft Survival'
502
  address: 127.0.0.1:25565
503
  restricted: false
504
  listeners:
505
  - query_port: 25577
506
- motd: '&6Eaglercraft 1.8.8'
507
  tab_list: GLOBAL_PING
508
  query_enabled: false
509
  proxy_protocol: false
@@ -527,11 +561,22 @@ connection_throttle_limit: 0
527
  stats: none
528
  log_pings: false
529
  EOF
 
 
 
 
 
 
 
 
530
 
 
 
 
531
  LISTENERS_FILE=$(find_listeners_yml)
532
 
533
  if [ -z "$LISTENERS_FILE" ]; then
534
- echo "[6/6] Generating EaglerXBungee config..."
535
  cd "$BUNGEE_DIR"
536
  $JAVA "${BUNGEE_JVM_FLAGS[@]}" \
537
  -cp "sqlite-jdbc.jar:BungeeCord.jar" \
@@ -560,14 +605,30 @@ if [ -z "$LISTENERS_FILE" ]; then
560
  done
561
  sleep 2
562
  else
563
- echo "[6/6] EaglerXBungee config exists"
564
  fi
565
 
566
  echo " Starting BungeeCord..."
567
 
568
  patch_eagler_port
569
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
570
  EAGLER_DIR=$(dirname "$(find_listeners_yml)" 2>/dev/null)
 
571
  if [ -n "$EAGLER_DIR" ]; then
572
  mkdir -p "$EAGLER_DIR/drivers"
573
  cp -f "$BUNGEE_DIR/sqlite-jdbc.jar" "$EAGLER_DIR/drivers/sqlite-jdbc.jar" 2>/dev/null
@@ -595,8 +656,9 @@ done
595
  if [ "$PORT_READY" = true ]; then
596
  echo ""
597
  echo "============================================"
598
- echo " SERVER READY β€” EaglerCraft on :7860"
599
  [ -n "$OP_USERNAME" ] && echo " OP: $OP_USERNAME (level 4)"
 
600
  echo "============================================"
601
  else
602
  echo " Port 7860 NOT open!"
@@ -615,6 +677,17 @@ else
615
  fi
616
  fi
617
 
 
 
 
 
 
 
 
 
 
 
 
618
  # =============================================================
619
  # Sync loop
620
  # =============================================================
@@ -622,14 +695,22 @@ hf_sync_loop &
622
  SYNC_PID=$!
623
 
624
  # =============================================================
625
- # Shutdown
626
  # =============================================================
627
  graceful_shutdown() {
628
  echo " Shutting down..."
629
- mc_command "gamerule doMobSpawning true" "gamerule randomTickSpeed 3" "save-all"
 
 
630
  sleep 5
631
  hf_push_saves
632
- kill $SYNC_PID $BACKEND_PID $BUNGEE_PID 2>/dev/null
 
 
 
 
 
 
633
  exit 0
634
  }
635
 
@@ -653,10 +734,17 @@ while true; do
653
  IDLE_MODE=false
654
  start_windspigot
655
  sleep 45
656
- # Re-OP after restart
 
 
 
 
657
  if [ -n "$OP_USERNAME" ]; then
658
- mc_command "op ${OP_USERNAME}" 2>/dev/null
659
  fi
 
 
 
660
  enter_idle_mode
661
  fi
662
 
 
13
 
14
  mkdir -p "$PLUGIN_DIR"
15
 
16
+ HF_BUCKET_HANDLE="hf://buckets/smodusermc/digpvp"
17
+ SAVE_DIRS="world world_nether world_the_end players banned-ips.json banned-players.json ops.json whitelist.json plugins"
18
  SYNC_INTERVAL="${SYNC_INTERVAL:-300}"
 
19
  IDLE_MODE=false
20
 
21
  # =============================================
22
+ # OP ACCOUNT
23
  # =============================================
24
  OP_USERNAME="CreppyBitch"
25
 
26
  CPU_CORES=$(nproc 2>/dev/null || echo 2)
27
+ NETTY_THREADS=4
28
 
29
  TOTAL_MEM_MB=$(free -m | awk '/^Mem:/{print $2}')
30
  BUNGEE_MAX_MB=1024
 
34
  PAPER_MIN_MB=8192
35
 
36
  echo "========================================"
37
+ echo " Eaglercraft 1.8.8 PVP Server"
38
  echo " WindSpigot + HuggingFace Buckets"
39
  echo "========================================"
40
  echo ""
 
43
  echo " Java: $($JAVA -version 2>&1 | head -1)"
44
  echo " Bucket: $HF_BUCKET_HANDLE"
45
  [ -n "$OP_USERNAME" ] && echo " OP Account: $OP_USERNAME"
46
+ echo " Plugins synced: WorldEdit, WorldGuard, MineResetLite, Shopkeepers, SafeTrade, Skript, PvPManager"
47
  echo ""
48
 
49
  # =============================================
50
+ # JVM FLAGS
51
  # =============================================
52
  PAPER_JVM_FLAGS=(
53
  -Xmx${PAPER_MAX_MB}M
 
111
  )
112
 
113
  # =============================================================
114
+ # RCON β€” each command sent individually to avoid mangling
115
  # =============================================================
116
  RCON_PASS="chunkystart"
117
 
 
122
  }
123
 
124
  mc_command() {
125
+ for cmd in "$@"; do
126
+ mcrcon -H 127.0.0.1 -P 25575 -p "$RCON_PASS" "$cmd" 2>/dev/null
127
+ done
128
  }
129
 
130
  # =============================================================
 
163
  OPEOF
164
  echo " ops.json written (level 4, UUID: ${V3_UUID})"
165
 
166
+ mc_command "op ${OP_USERNAME}"
167
  echo " RCON op command sent"
168
  }
169
 
170
  # =============================================================
171
+ # IDLE MODE β€” safe version that does NOT kill entities
172
  # =============================================================
173
  enter_idle_mode() {
174
  [ "$IDLE_MODE" = true ] && return
175
  IDLE_MODE=true
176
+ mc_command "gamerule randomTickSpeed 0"
177
+ mc_command "gamerule doMobSpawning false"
178
+ mc_command "kill @e[type=Zombie]"
179
+ mc_command "kill @e[type=Skeleton]"
180
+ mc_command "kill @e[type=Spider]"
181
+ mc_command "kill @e[type=Creeper]"
182
+ mc_command "kill @e[type=Enderman]"
183
+ mc_command "kill @e[type=Witch]"
184
+ mc_command "kill @e[type=Slime]"
185
+ mc_command "kill @e[type=CaveSpider]"
186
+ mc_command "kill @e[type=Silverfish]"
187
+ mc_command "kill @e[type=Guardian]"
188
+ mc_command "kill @e[type=Endermite]"
189
+ mc_command "kill @e[type=Blaze]"
190
+ mc_command "kill @e[type=Ghast]"
191
+ mc_command "kill @e[type=MagmaCube]"
192
+ mc_command "kill @e[type=WitherSkeleton]"
193
+ mc_command "kill @e[type=ZombiePigman]"
194
+ echo "[IDLE] Active β€” hostile mobs cleared, ticks paused"
195
  }
196
 
197
  exit_idle_mode() {
198
  [ "$IDLE_MODE" = false ] && return
199
  IDLE_MODE=false
200
+ mc_command "gamerule randomTickSpeed 3"
201
+ mc_command "gamerule doMobSpawning true"
202
  echo "[IDLE] Gameplay restored"
203
  }
204
 
 
255
  local STAGING="/tmp/hf-staging"
256
  rm -rf "$STAGING" && mkdir -p "$STAGING"
257
  for item in $SAVE_DIRS; do
258
+ if [ -e "$BACKEND_DIR/$item" ]; then
259
+ mkdir -p "$STAGING/$(dirname "$item")"
260
+ cp -a "$BACKEND_DIR/$item" "$STAGING/$item"
261
+ fi
262
  done
263
  hf buckets sync "$STAGING" "${HF_BUCKET_HANDLE}/game-data" --delete 2>&1 | tail -3
264
  [ $? -eq 0 ] && echo "[SYNC] OK $(date '+%H:%M:%S')" \
 
276
  # =============================================================
277
  # STEP 0: Bucket
278
  # =============================================================
279
+ echo "[0/7] Bucket setup..."
280
  hf_authenticate
281
  hf_ensure_bucket
282
  hf_restore_saves
 
285
  # =============================================================
286
  # STEP 1: World size
287
  # =============================================================
288
+ echo "[1/7] World analysis..."
289
  for WORLD_DIR in world world_nether world_the_end; do
290
  if [ -d "$BACKEND_DIR/$WORLD_DIR" ]; then
291
  SIZE=$(du -sh "$BACKEND_DIR/$WORLD_DIR" 2>/dev/null | awk '{print $1}')
 
296
  echo ""
297
 
298
  # =============================================================
299
+ # STEP 2: Core server configs + Start WindSpigot
300
  # =============================================================
301
  cd "$BACKEND_DIR"
302
  echo "eula=true" > eula.txt
303
 
304
+ echo "[2/7] Writing core server configs + starting WindSpigot..."
305
+
306
  cat > server.properties << 'EOF'
307
  server-port=25565
308
  server-ip=127.0.0.1
309
  online-mode=false
310
  spawn-protection=0
311
+ max-players=20
312
+ view-distance=6
313
  gamemode=0
314
+ difficulty=1
315
  level-name=world
316
+ level-type=FLAT
317
  level-seed=8678942899319966093
318
  generate-structures=true
319
+ motd=DigPvP Eaglercraft
320
  pvp=true
321
  allow-flight=false
322
  white-list=false
323
  spawn-npcs=true
324
+ spawn-animals=false
325
+ spawn-monsters=false
326
+ enable-command-block=false
327
+ allow-nether=false
328
  use-native-transport=true
329
  network-compression-threshold=-1
330
  entity-broadcast-range-percentage=50
 
418
  reduced-chunk-loads: true
419
  lag-compensated-potions: false
420
  anti-xray:
421
+ enabled: true
422
+ engine-mode: 2
423
  hit-detection:
424
  enabled: true
425
  threshold: 1.0
 
441
  stop-notify-bungee: true
442
  anti-malware: true
443
  use-tcp-nodelay: true
444
+ brand-name: "PVP"
445
  EOF
446
 
 
447
  setup_op_account
448
 
 
449
  > /tmp/paper.log
 
450
  start_windspigot
451
  echo " WindSpigot PID: $BACKEND_PID"
452
 
 
469
  sleep 1
470
  done
471
 
 
472
  if [ -n "$OP_USERNAME" ]; then
473
  mc_command "op ${OP_USERNAME}"
474
  echo " OP granted to ${OP_USERNAME} via RCON"
475
  fi
476
 
477
  echo ""
478
+ echo " === PLUGINS LOADED ==="
479
  grep -i "Enabling" /tmp/paper.log | grep -oP "Enabling \K[^\s]+" 2>/dev/null | while read p; do
480
  echo " - $p"
481
  done
482
+ echo " ======================"
483
  echo ""
484
 
485
  # =============================================================
486
+ # STEP 3: PVP gamerules β€” each command sent separately
487
  # =============================================================
488
+ echo "[3/7] Setting PVP gamerules..."
489
+ mc_command "gamerule pvp true"
490
+ mc_command "gamerule keepInventory false"
491
+ mc_command "gamerule naturalRegeneration true"
492
+ mc_command "gamerule doFireTick true"
493
+ mc_command "gamerule mobGriefing false"
494
+ mc_command "gamerule announceAdvancements false"
495
+ mc_command "difficulty 2"
496
+ mc_command "defaultgamemode survival"
497
+ echo " PVP gamerules set"
498
  echo ""
499
 
500
  # =============================================================
501
+ # STEP 4: Idle mode β€” safe version
502
  # =============================================================
503
+ echo "[4/7] Applying idle mode (no players)..."
504
+ enter_idle_mode
 
505
  echo ""
506
 
507
  # =============================================================
508
+ # STEP 5: Write BungeeCord config
509
  # =============================================================
510
+ echo "[5/7] Writing BungeeCord config..."
511
+
512
+ # ===============================
513
+ # BUNGEE CONFIG
514
+ # ===============================
515
  cd "$BUNGEE_DIR"
516
 
517
  cat > config.yml << 'EOF'
 
532
  - disabledcommandhere
533
  servers:
534
  lobby:
535
+ motd: '&aEaglercraft PVP'
536
  address: 127.0.0.1:25565
537
  restricted: false
538
  listeners:
539
  - query_port: 25577
540
+ motd: '&6Eaglercraft 1.8.8 PVP'
541
  tab_list: GLOBAL_PING
542
  query_enabled: false
543
  proxy_protocol: false
 
561
  stats: none
562
  log_pings: false
563
  EOF
564
+ echo " BungeeCord config.yml written"
565
+
566
+ echo ""
567
+ echo " Reloading server via RCON..."
568
+ sleep 2
569
+ mc_command "reload confirm"
570
+ echo " Full server reload done"
571
+ echo ""
572
 
573
+ # =============================================================
574
+ # STEP 6: EaglerXBungee generation + Start BungeeCord
575
+ # =============================================================
576
  LISTENERS_FILE=$(find_listeners_yml)
577
 
578
  if [ -z "$LISTENERS_FILE" ]; then
579
+ echo "[6/7] Generating EaglerXBungee config..."
580
  cd "$BUNGEE_DIR"
581
  $JAVA "${BUNGEE_JVM_FLAGS[@]}" \
582
  -cp "sqlite-jdbc.jar:BungeeCord.jar" \
 
605
  done
606
  sleep 2
607
  else
608
+ echo "[6/7] EaglerXBungee config exists"
609
  fi
610
 
611
  echo " Starting BungeeCord..."
612
 
613
  patch_eagler_port
614
 
615
+ # === NEW: MOTD AND ICON PATCH ===
616
+ LISTENERS_NOW=$(find_listeners_yml)
617
+ if [ -n "$LISTENERS_NOW" ]; then
618
+ # Title: &k!!&r &6&lβš” DIG PVP βš” &r&6&k!!&r
619
+ # Subtitle: &r&7Mine ores, buy gear, fight!
620
+ sed -i 's/An EaglercraftX server/\&k!!\&r \&6\&lβš” DIG PVP βš” \&r\&6\&k!!\&r/g' "$LISTENERS_NOW"
621
+ sed -i 's/EaglercraftX proxy/\&r\&7Mine ores, buy gear, fight!/g' "$LISTENERS_NOW"
622
+ fi
623
+
624
+ # Copy the server icon from your HuggingFace bucket to BungeeCord
625
+ if [ -f "$BACKEND_DIR/server-icon.png" ]; then
626
+ cp -f /opt/server/bungee/server-icon.png "$BUNGEE_DIR/server-icon.png"
627
+ fi
628
+ # ================================
629
+
630
  EAGLER_DIR=$(dirname "$(find_listeners_yml)" 2>/dev/null)
631
+
632
  if [ -n "$EAGLER_DIR" ]; then
633
  mkdir -p "$EAGLER_DIR/drivers"
634
  cp -f "$BUNGEE_DIR/sqlite-jdbc.jar" "$EAGLER_DIR/drivers/sqlite-jdbc.jar" 2>/dev/null
 
656
  if [ "$PORT_READY" = true ]; then
657
  echo ""
658
  echo "============================================"
659
+ echo " PVP SERVER READY β€” EaglerCraft on :7860"
660
  [ -n "$OP_USERNAME" ] && echo " OP: $OP_USERNAME (level 4)"
661
+ echo " Plugins Synced via HuggingFace!"
662
  echo "============================================"
663
  else
664
  echo " Port 7860 NOT open!"
 
677
  fi
678
  fi
679
 
680
+ # =============================================================
681
+ # STEP 7: Final confirmation
682
+ # =============================================================
683
+ echo ""
684
+ echo "[7/7] Final status check..."
685
+ echo " === ACTIVE PLUGINS ==="
686
+ RELOAD_CHECK=$(mc_command "plugins")
687
+ echo " $RELOAD_CHECK"
688
+ echo " ======================"
689
+ echo ""
690
+
691
  # =============================================================
692
  # Sync loop
693
  # =============================================================
 
695
  SYNC_PID=$!
696
 
697
  # =============================================================
698
+ # Shutdown β€” save world properly, then push, then stop processes
699
  # =============================================================
700
  graceful_shutdown() {
701
  echo " Shutting down..."
702
+ mc_command "gamerule doMobSpawning true"
703
+ mc_command "gamerule randomTickSpeed 3"
704
+ mc_command "save-all"
705
  sleep 5
706
  hf_push_saves
707
+ kill $SYNC_PID 2>/dev/null
708
+ # Stop the MC server gracefully via RCON before killing PIDs
709
+ mc_command "stop"
710
+ sleep 5
711
+ kill $BUNGEE_PID 2>/dev/null
712
+ # Only force-kill if still alive
713
+ kill -0 $BACKEND_PID 2>/dev/null && kill $BACKEND_PID 2>/dev/null
714
  exit 0
715
  }
716
 
 
734
  IDLE_MODE=false
735
  start_windspigot
736
  sleep 45
737
+ # Wait for RCON to be available before sending commands
738
+ for i in $(seq 1 30); do
739
+ nc -z 127.0.0.1 25575 2>/dev/null && break
740
+ sleep 1
741
+ done
742
  if [ -n "$OP_USERNAME" ]; then
743
+ mc_command "op ${OP_USERNAME}"
744
  fi
745
+ mc_command "gamerule pvp true"
746
+ mc_command "gamerule keepInventory false"
747
+ mc_command "gamerule mobGriefing false"
748
  enter_idle_mode
749
  fi
750