fix(transfer): use transferPlayer() beta API and enable experiments in level.dat
Switch from runCommand("transfer ...") to the @minecraft/server-admin
transferPlayer() function for reliable server-to-server transfers.
Enable Beta APIs experiment (gametest flag) in all 4 world level.dat files.
Add spawn protection to prevent transfer loops on arrival.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
"name": "Lobby Portal Transfer",
|
||||
"description": "Auto-transfers players when they step into portal areas",
|
||||
"uuid": "a1b2c3d4-1111-2222-3333-abcdef123456",
|
||||
"version": [1, 0, 1],
|
||||
"version": [1, 0, 3],
|
||||
"min_engine_version": [1, 21, 0]
|
||||
},
|
||||
"modules": [
|
||||
@@ -12,14 +12,18 @@
|
||||
"type": "script",
|
||||
"language": "javascript",
|
||||
"uuid": "a1b2c3d4-4444-5555-6666-abcdef789012",
|
||||
"version": [1, 0, 1],
|
||||
"version": [1, 0, 3],
|
||||
"entry": "scripts/main.js"
|
||||
}
|
||||
],
|
||||
"dependencies": [
|
||||
{
|
||||
"module_name": "@minecraft/server",
|
||||
"version": "2.0.0"
|
||||
"version": "1.17.0"
|
||||
},
|
||||
{
|
||||
"module_name": "@minecraft/server-admin",
|
||||
"version": "1.0.0-beta"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { world, system } from "@minecraft/server";
|
||||
import { transferPlayer } from "@minecraft/server-admin";
|
||||
|
||||
// Portal definitions: name, center position, and direct transfer target
|
||||
const portals = [
|
||||
@@ -11,9 +12,16 @@ const PORTAL_RADIUS_X = 2.5;
|
||||
const PORTAL_RADIUS_Z = 2.0;
|
||||
const PORTAL_RADIUS_Y = 2.0;
|
||||
const COOLDOWN_TICKS = 100; // 5 seconds cooldown
|
||||
const SPAWN_PROTECTION_TICKS = 200; // 10 seconds — ignore portal detection after spawn
|
||||
|
||||
// Track cooldowns per player
|
||||
const cooldowns = new Map();
|
||||
// Track when players spawned (to prevent transfer loop on arrival)
|
||||
const spawnTicks = new Map();
|
||||
|
||||
world.afterEvents.playerSpawn.subscribe((event) => {
|
||||
spawnTicks.set(event.player.id, system.currentTick);
|
||||
});
|
||||
|
||||
system.runInterval(() => {
|
||||
for (const player of world.getAllPlayers()) {
|
||||
@@ -24,6 +32,10 @@ system.runInterval(() => {
|
||||
const lastTransfer = cooldowns.get(playerId) || 0;
|
||||
if (system.currentTick - lastTransfer < COOLDOWN_TICKS) continue;
|
||||
|
||||
// Skip if player just spawned (prevents loop when arriving from child world)
|
||||
const spawnedAt = spawnTicks.get(playerId) || 0;
|
||||
if (system.currentTick - spawnedAt < SPAWN_PROTECTION_TICKS) continue;
|
||||
|
||||
for (const portal of portals) {
|
||||
const dx = Math.abs(pos.x - portal.x);
|
||||
const dy = Math.abs(pos.y - portal.y);
|
||||
@@ -33,7 +45,7 @@ system.runInterval(() => {
|
||||
cooldowns.set(playerId, system.currentTick);
|
||||
player.sendMessage(`§6Transferring to ${portal.name}...`);
|
||||
try {
|
||||
player.runCommand(`transfer ${player.name} ${portal.host} ${portal.port}`);
|
||||
transferPlayer(player, { hostname: portal.host, port: portal.port });
|
||||
} catch (e) {
|
||||
player.sendMessage(`§cTransfer failed: ${e.message}`);
|
||||
}
|
||||
@@ -43,9 +55,10 @@ system.runInterval(() => {
|
||||
}
|
||||
}, 10); // Check every half second
|
||||
|
||||
// Clean up cooldowns when players leave
|
||||
// Clean up tracking when players leave
|
||||
world.afterEvents.playerLeave.subscribe((event) => {
|
||||
cooldowns.delete(event.playerId);
|
||||
spawnTicks.delete(event.playerId);
|
||||
});
|
||||
|
||||
system.run(() => {
|
||||
|
||||
Reference in New Issue
Block a user