- 8
- 1
Ты подожди, тут комбо: 1.20 (на которой пишут на этом форуме человека 2-3), MCreator и божественный скрин))как же вы затрахали
Здравствуйте, попытался сделать так чтобы от дождя факелы ломались. Перепробовал все варианты которые приходили в голову, но ничего так и не сработало.
На данном фото вы видите последний мой вариант
@SubscribeEvent
public static void onWorldTick(TickEvent.LevelTickEvent event) {
if (event.phase == TickEvent.Phase.END) {
execute(event, event.level);
}
}
public static void execute(LevelAccessor world) {
execute(null, world);
}
private static void execute(@Nullable Event event, LevelAccessor world) {
if ((Blocks.TORCH == (world.getBlockState(new BlockPos(0, 0, 0))).getBlock()) == (world.canSeeSkyFromBelowWater(new BlockPos(0, 0, 0)) == world.getLevelData().isRaining())) {
{
BlockPos _pos = new BlockPos(0, 0, 0);
Block.dropResources(world.getBlockState(_pos), world, new BlockPos(0, 0, 0), null);
world.destroyBlock(_pos, false);
}
}
}
}
В виде кода сойдёт?как же вы затрахали со своим днищенским мквысером
где BlockPos(0, 0, 0) это координаты на которых должен находится блок, у тебя они везде 0Java:@SubscribeEvent public static void onWorldTick(TickEvent.LevelTickEvent event) { if (event.phase == TickEvent.Phase.END) { execute(event, event.level); } } public static void execute(LevelAccessor world) { execute(null, world); } private static void execute(@Nullable Event event, LevelAccessor world) { if ((Blocks.TORCH == (world.getBlockState(new BlockPos(0, 0, 0))).getBlock()) == (world.canSeeSkyFromBelowWater(new BlockPos(0, 0, 0)) == world.getLevelData().isRaining())) { { BlockPos _pos = new BlockPos(0, 0, 0); Block.dropResources(world.getBlockState(_pos), world, new BlockPos(0, 0, 0), null); world.destroyBlock(_pos, false); } } } }
Да знаю, но никак не смог сделать чтобы каждый факел по отдельности ломался, может быть даже не так с самого начала и до конца не правильно писал.где BlockPos(0, 0, 0) это координаты на которых должен находится блок, у тебя они везде 0
Да знаю, но никак не смог сделать чтобы каждый факел по отдельности ломался, может быть даже не так с самого начала и до конца не правильно писал.
В одном из вариантов вместо нулей стояли x y z.
У вас есть идеи какую структуру кода мне стоит сделать?
int radius = 10;
for (int x = -radius; x < radius; x++) {
for (int y = -radius; y < radius; y++) {
for (int z = -radius; z < radius; z++) {
int tx = x - (int) player.posX;
int ty = y - (int) player.posY;
int tz = z - (int) player.posZ;
double len = Math.sqrt(tx * tx + ty * ty + tz * tz);
if (len <= radius) {
BlockPos pos = new BlockPos(tx, ty, tz);
IBlockState state = player.world.getBlockState(pos);
if (state.getBlock() == Blocks.TORCH) {
if (isAirBlock(player.world, pos)) { //проверка есть ли выше факела воздух
Block.dropResources(world.getBlockState(_pos), world, pos, null);
world.destroyBlock(_pos, false);
}
}
}
}
}
}
public boolean isAirBlock(World world, BlockPos pos) {
for (int y = pos.getY() + 1; y < world.getHeight(); y++) {
BlockPos blockPos = new BlockPos(pos.getX(), y, pos.getZ());
if (!world.isAirBlock(blockPos)) {
return true;
}
}
return false;
}
спасибо что уделил мне время, даже если это не сработает на моей версии или что-то неправильно сделаю, то буду понимать в каком направлении мне стоит двигаться. Большое спасибо вам и желаю удачи вам в создании модовэто проверка в радиусе 10 блоков, лучше конечно не делать каждый тик (если что это на 1.12 выше не могу ).Проверяй через цикл каждый блок вообщем
Выглядит как очень плохой код.это проверка в радиусе 10 блоков, лучше конечно не делать каждый тик (если что это на 1.12 выше не могу ).Проверяй через цикл каждый блок вообщемчто то вроде такого если я ничего не напутал:int radius = 10; for (int x = -radius; x < radius; x++) { for (int y = -radius; y < radius; y++) { for (int z = -radius; z < radius; z++) { int tx = x - (int) player.posX; int ty = y - (int) player.posY; int tz = z - (int) player.posZ; double len = Math.sqrt(tx * tx + ty * ty + tz * tz); if (len <= radius) { BlockPos pos = new BlockPos(tx, ty, tz); IBlockState state = player.world.getBlockState(pos); if (state.getBlock() == Blocks.TORCH) { if (isAirBlock(player.world, pos)) { //проверка есть ли выше факела воздух Block.dropResources(world.getBlockState(_pos), world, pos, null); world.destroyBlock(_pos, false); } } } } } } public boolean isAirBlock(World world, BlockPos pos) { for (int y = pos.getY() + 1; y < world.getHeight(); y++) { BlockPos blockPos = new BlockPos(pos.getX(), y, pos.getZ()); if (!world.isAirBlock(blockPos)) { return true; } } return false; }
Код как пример куда ему двигатся, проверку на дождь конечно надо, имею ввиду что циклы не надо в каждом тике делать (несколько раз чтоб исполнялись). С чанками хз, в 1.20 наверное сильно отличается от 1.12Выглядит как очень плохой код.
По хорошему, следовало бы проверять в тике мира на дождь в позиции (hasRain вроде бы, нет под рукой IDE).
Брать из мира загруженные чанки и в них уже искать необходимый блок (в чанках встроенная для этого функция есть, по-моему), заносить результат поиска в коллекцию/массив. Ну и в конце проходиться по коллекции/массиву и ломать блоки в этих позициях.
Ну и сразу становится ясно, что с клиентом мы тут никак не взаимодействуем, поэтому всё ограничивается серверным миром.
А разве он не для клиента только?RandomTick
И как раз серверный требует реализации ITickable вроде бы. Так что для факелов он не заходит.а есть updateTick серверный,
Прекрасно заходит, updateTick это собственный метод блока, такой же собственный как tickRate, с которым в идеале такое комбинироватьИ как раз серверный требует реализации ITickable вроде бы. Так что для факелов он не заходит.
И в чем проблема? Простейший миксин сделай и реализуй что нужно.И как раз серверный требует реализации ITickable вроде бы. Так что для факелов он не заходит.