const protectedZone = { min: { x: 10006, y: ...
Creado el: 22 de febrero de 2025
Creado el: 22 de febrero de 2025
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
Ниже приведён пример кода на основании вашего запроса. В нём:
Спавн-зона (protectedZone
) — это прямоугольный регион, где:
PvP-зона (pvpZone
) находится внутри спавна и разрешает драки (но по-прежнему нельзя ставить/ломать блоки, так как это тоже территория спавна).
Границы всего мира (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; });
protectedZone
– координаты спавна (от 10006,20,9865
до 10178,1000,10139
).
Вся эта зона недоступна для строительства/ломания блоков и PvP (кроме pvpZone
внутри).
pvpZone
– координаты PvP-арены, которая полностью лежит внутри спавна.
Здесь разрешён PvP, но так как это тоже часть спавна, ломать/ставить блоки всё равно запрещено.
worldBorder
– мировая граница от -2000,-2000,-2000
до 2000,2000,2000
.
Если бы спавн находился внутри этих координат, тогда при выходе за границы мира игрока бы отбрасывало назад.
В блоке setInterval
:
protectedZone
и телепортирует обратно на край спавна.В событиях onDestroyBlock
и onPlaceBlock
проверяется, находится ли игрок в спавн-зоне. Если да, то ломать/ставить запрещено.
В событии onAttackEntity
проверяется:
pvpZone
, PvP запрещено.pvpZone
, но жертва не в pvpZone
, тоже запрещено.pvpZone
, PvP разрешено.Таким образом, игрок не может выйти за пределы спавна, не может ломать/ставить блоки на всей территории спавна, не может драться на спавне, кроме pvpZone, где PvP включено.