const protectedZone = { min: { x: 10006, y: ...

Creado el: 22 de febrero de 2025

Respondido usando O1 por Chat01

Pregunta

const protectedZone = {
min: { x: 10006, y: 20, z: 9865 },
max: { x: 10178, y: 1000, z: 10139 }
};
// Координаты PvP зоны
const pvpZone = {
min: { x: 10095, y: 55, z: 9893 },
max: { x: 10170, y: 81, z: 10002 }
};
// Настройки мировой границы
const worldBorder = {
min: { x: -2000, y: -2000, z: -2000 },
max: { x: 2000, y: 2000, z: 2000 }
};
// Функция для проверки, находится ли игрок в пределах мировой границы
function isWithinWorldBorder(x, y, z) {
return (
x >= worldBorder.min.x && x <= worldBorder.max.x &&
y >= worldBorder.min.y && y <= worldBorder.max.y &&
z >= worldBorder.min.z && z <= worldBorder.max.z
);
}
// Функция для проверки, находится ли игрок в защищённой зоне
const protectedZone = {
min: { x: 10006, y: 20, z: 9865 },
max: { x: 10178, y: 1000, z: 10139 }
};

// ИСКЛЮЧАЕМ из protectedZone внутренний кусок pvpZone
// Проверку делаем так: "Игрок в защ.зоне" И НЕ "игрок в PvP-зоне"
function isInProtectedZone(x, y, z) {
return (
x >= protectedZone.min.x && x <= protectedZone.max.x &&
y >= protectedZone.min.y && y <= protectedZone.max.y &&
z >= protectedZone.min.z && z <= protectedZone.max.z &&
// Исключаем PvP-зону
!(x >= pvpZone.min.x && x <= pvpZone.max.x &&
y >= pvpZone.min.y && y <= pvpZone.max.y &&
z >= pvpZone.min.z && z <= pvpZone.max.z)
);
}
// Функция для проверки, находится ли игрок в PvP зоне
function isInPvpZone(x, y, z) {
return (
x >= pvpZone.min.x && x <= pvpZone.max.x &&
y >= pvpZone.min.y && y <= pvpZone.max.y &&
z >= pvpZone.min.z && z <= pvpZone.max.z
);
}
// Проверка позиции игрока и обновление тегов
setInterval(() => {
mc.getOnlinePlayers().forEach(player => {
const pos = player.pos;
// Проверяем, находится ли игрок в защищенной зоне
if (isInProtectedZone(pos.x, pos.y, pos.z)) {
player.removeTag("pvp"); // Убираем тег "pvp", если игрок на спавне
return; // Если на спавне, пропускаем дальнейшие проверки
}
// Проверяем, находится ли игрок в PvP зоне
if (isInPvpZone(pos.x, pos.y, pos.z)) {
player.addTag("pvp"); // Добавляем тег "pvp"
} else {
player.removeTag("pvp"); // Убираем тег "pvp", если игрок не в PvP зоне
}
// Проверяем, находится ли игрок в пределах мировой границы
if (!isWithinWorldBorder(pos.x, pos.y, pos.z)) {
// Если игрок вышел за пределы мира, возвращаем его внутрь
const newX = Math.max(worldBorder.min.x, Math.min(pos.x, worldBorder.max.x));
const newY = Math.max(worldBorder.min.y, Math.min(pos.y, worldBorder.max.y));
const newZ = Math.max(worldBorder.min.z, Math.min(pos.z, worldBorder.max.z));
player.teleport(newX, newY, newZ, pos.dimid);
player.tell("§cВы достигли границы мира!");
player.hurt(2); // Наносим небольшой урон при попытке выйти за границу
}
});
}, 250); // Проверка каждые 250мс
// Слушатель события разрушения блока
mc.listen("onDestroyBlock", (pl, bl) => {
const blockX = bl.pos.x;
const blockY = bl.pos.y;
const blockZ = bl.pos.z;
// Проверяем, находится ли игрок в защищенной зоне
if (isInProtectedZone(pl.pos.x, pl.pos.y, pl.pos.z)) {
pl.tell("§cНельзя ломать блоки на спавне!", 4);
return false; // Запрещаем разрушение блока
}
// Проверяем, находится ли блок в пределах мировой границы
if (!isWithinWorldBorder(blockX, blockY, blockZ)) {
pl.tell("§cНельзя ломать блоки за границей мира!", 4);
return false;
}
return true; // Разрешаем разрушение блока в остальных случаях
});
// Слушатель события размещения блока
mc.listen("onPlaceBlock", (pl, bl) => {
const blockX = bl.pos.x;
const blockY = bl.pos.y;
const blockZ = bl.pos.z;
// Проверяем, находится ли игрок в защищенной зоне
if (isInProtectedZone(pl.pos.x, pl.pos.y, pl.pos.z)) {
pl.tell("§cНельзя ставить блоки на спавне!", 4);
return false; // Запрещаем размещение блока
}
// Проверяем, находится ли блок в пределах мировой границы
if (!isWithinWorldBorder(blockX, blockY, blockZ)) {
pl.tell("§cНельзя ставить блоки за границей мира!", 4);
return false;
}
return true; // Разрешаем размещение блока в остальных случаях
});
// Слушатель события атаки
mc.listen("onAttackEntity", (attacker, victim) => {
const attackerX = attacker.pos.x;
const attackerY = attacker.pos.y;
const attackerZ = attacker.pos.z;
const victimX = victim.pos.x;
const victimY = victim.pos.y;
const victimZ = victim.pos.z;
// Проверяем, находится ли атакующий в защищенной зоне
if (isInProtectedZone(attackerX, attackerY, attackerZ)) {
attacker.tell("§cНельзя драться на спавне!", 4);
return false; // Запрещаем PvP
}
// Проверяем, находится ли жертва в защищенной зоне
if (isInProtectedZone(victimX, victimY, victimZ)) {
attacker.tell("§cНельзя атаковать игроков на спавне!", 4);
return false; // Запрещаем PvP
}
// Если оба игрока находятся в PvP зоне, разрешаем PvP
// Проверяем, не в pvpZone ли мы?
if (isInPvpZone(attackerX, attackerY, attackerZ)) {
// Атакующий в pvpZone
// Проверяем, не в pvpZone ли и жертва?
if (isInPvpZone(victimX, victimY, victimZ)) {
// Оба в PvP
return true; // Разрешаем
} else {
// Жертва вне pvpZone
attacker.tell("§cЖертва вне PvP-зоны!", 4);
return false;
}
}
// Если мы дошли сюда – нападающий точно не в PvP-зоне
if (isInProtectedZone(attackerX, attackerY, attackerZ)) {
attacker.tell("§cНельзя драться на спавне!", 4);
return false;
}
if (isInProtectedZone(victimX, victimY, victimZ)) {
attacker.tell("§cНельзя атаковать игроков на спавне!", 4);
return false;
}

// Остальные случаи: PvP не разрешено
attacker.tell("§cPvP разрешено только в PvP зоне!", 4);
return false;
}); сделай корды const protectedZone = {
min: { x: 10006, y: 20, z: 9865 },
max: { x: 10178, y: 1000, z: 10139 }
}; как спавн , корды пвп арены const pvpZone = {
min: { x: 10095, y: 55, z: 9893 },
max: { x: 10170, y: 81, z: 10002 }
}; , пвп арена будет на територии спавна сделай чтобы на територии спавна нельзя пвп ломать строить а если не просто на спавне а на пвп арене то можно пвп , и сделай чтобы если игрок вышел из за гроницы спавна то его на границу тп и граница сделай -2000 -2000 -2000 2000 2000 2000

Pensamiento

Mapping zones

I’m crafting the 'protectedZone' and 'pvpZone' coordinates to capture the spawn and pvp constraints, ensuring no pvp activities outside specified zones.

Returning to safety

Players outside the world boundary are teleported back with a message. Clarification is needed for boundaries regarding the spawn and pvp zones.

Investigating teleportation mechanics

I’m looking into teleportation mechanics to ensure players cannot leave the spawn region unless they enter the pvp zone, but confirming this is essential to avoid confusion.

Clarifying boundaries

I’m working to pinpoint the boundaries, ensuring the pvp arena is within the spawn while enforcing building and breaking restrictions outside the pvp zone within the broader world limit of -2000 to 2000.

Investigating navigation

I'm clarifying if players should return to the spawn region if they exit the pvp zone boundary. This sounds like ensuring they stay within the pvp area when leaving the spawn.

Confirming restrictions

OK, let me see. Building and block breaking are restricted in the entire spawn region, including the pvp zone, unless explicitly stated otherwise.

Confirming boundaries

I'm noting that building and block breaking are restricted in the entire spawn region, including the pvp zone. Teleportation to the spawn boundary ensures players can't leave the specified area.

Clarifying boundaries

Ensuring players stay within the spawn region by restricting building and PvP, with teleportation back to the boundary if they attempt to leave, aligns with the user's request for confinement.

Mapping out zones

OK, let's start by defining the protected, PvP, and world border zones. Then, I'll figure out if a player is in the world or spawn zone, or if they need clamping.

Navigating teleportation

First, teleporting players to the spawn boundary. Then, ensuring they stay within the world border, balancing exploration opportunities. This approach should clarify the instructions.

Revisiting the borders

Reflecting on the user's coordinates, which seem off. The goal is to extend the border from -2000 to 2000, despite the misplaced spawn region coordinates.

Clarifying boundary logic

I’m piecing together boundary logic: clamping players to the world border if outside it, then further clamping to the protected zone if outside that.

Clamping players

Players will be clamped to the spawn region boundary if they wander beyond it, ensuring they stay within their designated area.

Finalizing the logic

I’m assembling a script to manage player boundaries. Functions will clamp players to the spawn region and world border, considering the user's coordinates and instructions.

Establishing boundaries

I’m mapping out spawn boundaries, excluding the largest world border. Players are restricted to this area, except for designated PVP zones, ensuring strict enforcement of the rules.

Setting capture zones

Mapping protected and PVP regions, ensuring building and breaking are restricted, and players are clamped back if they stray beyond boundaries. Progressing through these steps systematically.

Pinpointing spawn confines

I’m finalizing the code to pinpoint spawn boundaries, ensuring no PVP outside designated zones, and teleporting back if players stray beyond these points.

Ensuring boundary control

I’m finalizing a function to clamp players straying from spawn boundaries, with considerations for the world border and maintaining constraints using event listeners to prevent actions within protected areas.

Reasoned for 34 seconds

Respuesta

Ниже приведён пример кода на основании вашего запроса. В нём:

  1. Спавн-зона (protectedZone) — это прямоугольный регион, где:

    • Нельзя ломать блоки.
    • Нельзя ставить блоки.
    • Нельзя драться (кроме области PvP).
    • Если игрок выходит за границы спавна, его сразу же возвращает на границу спавна.
  2. PvP-зона (pvpZone) находится внутри спавна и разрешает драки (но по-прежнему нельзя ставить/ломать блоки, так как это тоже территория спавна).

  3. Границы всего мира (worldBorder) сделаны от -2000 до 2000 по всем осям. (Однако с учётом того, что ваш спавн находится далеко за x=10000, проверка границы может быть «условной», т.к. координаты спавна не совпадают с этим ограничением. Тем не менее код ниже показывает, как это реализуется.)


Полный код

js
// Координаты спавна (защищённая зона) const protectedZone = { min: { x: 10006, y: 20, z: 9865 }, max: { x: 10178, y: 1000, z: 10139 } }; // Координаты PvP зоны (внутри спавна) const pvpZone = { min: { x: 10095, y: 55, z: 9893 }, max: { x: 10170, y: 81, z: 10002 } }; // Мировая граница const worldBorder = { min: { x: -2000, y: -2000, z: -2000 }, max: { x: 2000, y: 2000, z: 2000 } }; // Проверка: находится ли позиция (x,y,z) в пределах некоего прямоугольного региона function isWithinRegion(x, y, z, region) { return ( x >= region.min.x && x <= region.max.x && y >= region.min.y && y <= region.max.y && z >= region.min.z && z <= region.max.z ); } // Проверка, в зоне ли спавна (protectedZone) function isInSpawn(x, y, z) { return isWithinRegion(x, y, z, protectedZone); } // Проверка, в зоне ли PvP function isInPvpZone(x, y, z) { return isWithinRegion(x, y, z, pvpZone); } // Проверка, в пределах ли мировой границы function isWithinWorldBorder(x, y, z) { return isWithinRegion(x, y, z, worldBorder); } // Функция "зажима" координат в границах региона (чтобы телепортировать на край) function clampToRegion(x, y, z, region) { const newX = Math.max(region.min.x, Math.min(x, region.max.x)); const newY = Math.max(region.min.y, Math.min(y, region.max.y)); const newZ = Math.max(region.min.z, Math.min(z, region.max.z)); return { x: newX, y: newY, z: newZ }; } // Каждые 250мс проверяем положение игроков setInterval(() => { mc.getOnlinePlayers().forEach(player => { const pos = player.pos; // 1) Проверяем, не вышел ли игрок ЗА границы спавна if (!isInSpawn(pos.x, pos.y, pos.z)) { // Если вышел, телепортируем обратно на границу спавна const clampedPos = clampToRegion(pos.x, pos.y, pos.z, protectedZone); player.teleport(clampedPos.x, clampedPos.y, clampedPos.z, pos.dimid); player.tell("§cВы не можете покинуть территорию спавна!"); return; // Дальше не проверяем } // 2) Проверяем мировую границу (если вдруг кому-то нужно именно -2000..2000) // Но, учтите, что координаты спавна ~x=10000, фактически за пределами этой границы. // Ниже пример, как выглядит логика, если бы спавн был в рамках этой границы. if (!isWithinWorldBorder(pos.x, pos.y, pos.z)) { const clampedPos = clampToRegion(pos.x, pos.y, pos.z, worldBorder); player.teleport(clampedPos.x, clampedPos.y, clampedPos.z, pos.dimid); player.tell("§cВы достигли границы мира!"); player.hurt(2); // Наносим небольшой урон return; } // 3) Обновляем теги для PvP // На спавне разрешен PvP ТОЛЬКО если игрок в pvpZone // В самой большой спавн-зоне — PvP запрещён, кроме pvpZone. if (isInPvpZone(pos.x, pos.y, pos.z)) { player.addTag("pvp"); } else { player.removeTag("pvp"); } }); }, 250); // Слушатель события разрушения блока mc.listen("onDestroyBlock", (pl, bl) => { const px = pl.pos.x; const py = pl.pos.y; const pz = pl.pos.z; // Если игрок в спавн-зоне — ломать нельзя if (isInSpawn(px, py, pz)) { pl.tell("§cНельзя ломать блоки на спавне!", 4); return false; // Запрещаем } // (Если бы позволяли выходить за спавн — тогда проверяли бы границы мира) // Проверка границ мира, если нужно: const bx = bl.pos.x, by = bl.pos.y, bz = bl.pos.z; if (!isWithinWorldBorder(bx, by, bz)) { pl.tell("§cНельзя ломать блоки за границей мира!", 4); return false; } return true; // Разрешаем в остальных случаях }); // Слушатель события установки блока mc.listen("onPlaceBlock", (pl, bl) => { const px = pl.pos.x; const py = pl.pos.y; const pz = pl.pos.z; // Если игрок в спавн-зоне — ставить нельзя if (isInSpawn(px, py, pz)) { pl.tell("§cНельзя ставить блоки на спавне!", 4); return false; // Запрещаем } // Проверка границ мира (если актуально) const bx = bl.pos.x, by = bl.pos.y, bz = bl.pos.z; if (!isWithinWorldBorder(bx, by, bz)) { pl.tell("§cНельзя ставить блоки за границей мира!", 4); return false; } return true; // Разрешаем в остальных случаях }); // Слушатель события атаки (PvP) mc.listen("onAttackEntity", (attacker, victim) => { const ax = attacker.pos.x; const ay = attacker.pos.y; const az = attacker.pos.z; const vx = victim.pos.x; const vy = victim.pos.y; const vz = victim.pos.z; // Если атакующий в спавн-зоне, проверяем PvP-зону if (isInSpawn(ax, ay, az)) { // Разрешаем PvP ТОЛЬКО если атакующий и жертва тоже в pvpZone if (isInPvpZone(ax, ay, az)) { // Атакующий в pvpZone — проверим жертву if (isInPvpZone(vx, vy, vz)) { // Жертва тоже в pvpZone — разрешаем драться return true; } else { // Жертва не в pvpZone attacker.tell("§cИгрок вне PvP-зоны!", 4); return false; } } else { // Атакующий в спавне, но НЕ в pvpZone => запрещаем attacker.tell("§cНельзя драться на спавне!", 4); return false; } } // Если каким-то образом жертва в спавне, а атакующий нет (хотя код тп игрока за границу спавна), // то тоже запрещаем if (isInSpawn(vx, vy, vz)) { attacker.tell("§cНельзя атаковать игроков на спавне!", 4); return false; } // До сюда, по идее, не должны доходить, если игроки не могут покинуть спавн. // Но, если бы мир был открыт за пределами спавна, тогда здесь можно поставить // логику, нужна ли вам PvP вне спавна и т.д. attacker.tell("§cPvP разрешено только в PvP-зоне спавна!", 4); return false; });

Пояснения к коду

  1. protectedZone – координаты спавна (от 10006,20,9865 до 10178,1000,10139).
    Вся эта зона недоступна для строительства/ломания блоков и PvP (кроме pvpZone внутри).

  2. pvpZone – координаты PvP-арены, которая полностью лежит внутри спавна.
    Здесь разрешён PvP, но так как это тоже часть спавна, ломать/ставить блоки всё равно запрещено.

  3. worldBorder – мировая граница от -2000,-2000,-2000 до 2000,2000,2000.
    Если бы спавн находился внутри этих координат, тогда при выходе за границы мира игрока бы отбрасывало назад.

  4. В блоке setInterval:

    • Если игрок выходит за границы спавна, код зажимает его координаты в пределах protectedZone и телепортирует обратно на край спавна.
    • Дополнительно проверяется, не вышел ли он за границы всего мира (если актуально).
  5. В событиях onDestroyBlock и onPlaceBlock проверяется, находится ли игрок в спавн-зоне. Если да, то ломать/ставить запрещено.

  6. В событии onAttackEntity проверяется:

    • Если атакующий в спавн-зоне, но не в pvpZone, PvP запрещено.
    • Если атакующий в pvpZone, но жертва не в pvpZone, тоже запрещено.
    • Если обе стороны в pvpZone, PvP разрешено.

Таким образом, игрок не может выйти за пределы спавна, не может ломать/ставить блоки на всей территории спавна, не может драться на спавне, кроме pvpZone, где PvP включено.

Compartir este Q&A