Chests are Chests
Активный0.0
Установок
Последнее обновление
Версии
Chests are Chests
Вы когда-нибудь задумывались, почему предметы не падают в открытый сундук? Признайтесь, большинство из нас не задавалось этим вопросом, пока не появился этот мод. Но если вдуматься — это же так логично!
Теперь сундуки действительно ведут себя как настоящие контейнеры! Вместо того чтобы вручную складывать предметы, вы можете просто бросать их в открытые хранилища — они сами упадут внутрь.
А если предметы могут падать в контейнер, то почему бы им не выпадать из него? С этим модом бочки, открытые снизу, будут высыпать всё своё содержимое на землю!
И это ещё не всё! Когда вы открываете сундук, его крышка может отбрасывать предметы, лежащие сверху. Конечно, для безопасности это работает только с предметами, а не с живыми существами.
Для автоматизации этих процессов мод позволяет открывать контейнеры с помощью раздатчиков. Просто направьте пустой раздатчик на сундук или бочку и активируйте его!
Основные возможности
Падение предметов в открытые контейнеры
- По умолчанию: включено
- Игровое правило:
chests.insertOpen
Выпадение предметов из контейнеров, открытых снизу
- По умолчанию: выключено
- Игровое правило:
chests.barrelFall - Особое поведение для некоторых предметов (например, снежки падают как брошенные)
- Игровое правило:
chests.barrelFall.throwableSpecial - Тег предметов:
#chests_are_chests:special_fall
Отбрасывание предметов крышкой сундука
- По умолчанию: выключено
- Игровое правило:
chests.lidFling - Тег типов существ:
#chests_are_chests:flingable - Горизонтальная скорость отбрасывания:
chests.lidFling.horizontalPower - Вертикальная скорость отбрасывания:
chests.lidFling.verticalPower
Открытие контейнеров раздатчиками
- По умолчанию: включено
- Игровое правило:
chests.dispenserOpen - Длительность автоматического открытия (в тиках):
chests.dispenserOpen.duration
Совместимость с другими модами
Мод уже поддерживает интеграцию со следующими аддонами:
- Anner's Iron Chests
- Mythic Metals Decorations
- Reinforced Chests
- Expanded Storage
- Spectrum
Естественная совместимость присутствует с модами вроде Variant Chests, Variant Barrels, Chest Colorizer и другими, изменяющими внешний вид сундуков.
Для разработчиков
Если вы создаёте собственные моды с контейнерами, вы можете легко добавить поддержку Chests are Chests. Достаточно реализовать несколько интерфейсов в вашем коде.
Пример реализации контейнера:
public class MyCustomBlockEntity extends BlockEntity implements FallInContainer {
private boolean isOpen;
private final int size;
private final DefaultedList<ItemStack> content;
private final Map<Integer, Integer> fallUpdateMap = new HashMap<>();
@Override
public boolean chests$tryInsertion(ItemEntity entity) {
return FallInContainer.chests$inventoryInsertion(this.content, entity, this::setStack);
}
@Override
public boolean chests$isOpen() {
return isOpen;
}
@Override
public VoxelShape chests$InputAreaShape() {
return FallInContainer.ABOVE;
}
@Override
public void chests$forceOpen(ServerWorld world, BlockPos at, BlockState from) {
this.isOpen = true;
this.onOpen();
}
@Override
public boolean chests$tryForceOpen(BlockState from) {
ServerWorld serverWorld = (ServerWorld) this.getWorld();
BlockPos blockPos = this.getPos();
this.chests$forceOpen(serverWorld, blockPos, from);
ChestsAreChests.scheduleTick(serverWorld, blockPos, duration);
}
@Override
public boolean chests$forceClose() {
this.isOpen = false;
this.onClose();
}
@Override
public Map<Integer, Integer> getFallUpdateMap() {
return this.fallUpdateMap;
}
void onOpen() {
// ...
// потенциальные вещи для рендеринга
ChestsAreChests.ejectAbove(Direction.UP, this);
}
}
Пример реализации предмета:
public class MyCustomItem extends Item implements ContainerItemHelper {
public Direction[] chests$getFallDirection(ItemStack stack) {
return new Direction[]{Directions.UP};
}
public boolean defaultOnOpenTick(ItemStack stack, FallInContainer container, Direction direction, World world, Vec3d pos, Vec3d velocity) {
if (!ChestsAreChests.isInArray(direction, chests$getFallDirection(stack))) return false;
MyGravitatedEntity entity = new MyGravitatedEntity(world, pos.x, pos.y, pos.z, stack.copy());
entity.setVelocity(velocity);
world.spawnEntity(entity);
return true;
}
}