Merge branch '1.20.1' into 1.20.2

This commit is contained in:
Sollace 2024-04-17 11:57:23 +01:00
commit 22eaf9997c
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB
75 changed files with 7696 additions and 2872 deletions

View file

@ -31,7 +31,7 @@ public interface EquineContext {
static EquineContext of(ShapeContext context) {
if (context == ShapeContext.absent()) {
return Unicopia.SIDE.getPony().map(EquineContext.class::cast).orElse(ABSENT);
return InteractionManager.getInstance().getClientPony().map(EquineContext.class::cast).orElse(ABSENT);
}
EquineContext result = context instanceof Container c ? c.get() : ABSENT;
return result == null ? ABSENT : result;

View file

@ -1,11 +1,13 @@
package com.minelittlepony.unicopia;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.entity.player.dummy.DummyPlayerEntity;
import com.minelittlepony.unicopia.particle.ParticleSpawner;
import com.mojang.authlib.GameProfile;
@ -30,12 +32,16 @@ public class InteractionManager {
public static final int SCREEN_DISPELL_ABILITY = 0;
public static InteractionManager INSTANCE = new InteractionManager();
private static InteractionManager INSTANCE = new InteractionManager();
public static InteractionManager instance() {
public static InteractionManager getInstance() {
return INSTANCE;
}
public InteractionManager() {
INSTANCE = this;
}
public ParticleSpawner createBoundParticle(UUID id) {
return ParticleSpawner.EMPTY;
}
@ -96,4 +102,12 @@ public class InteractionManager {
public void addBlockBreakingParticles(BlockPos pos, Direction direction) {
}
public Optional<Pony> getClientPony() {
return Optional.empty();
}
public final Race getClientSpecies() {
return getClientPony().map(Pony::getSpecies).orElse(Race.HUMAN);
}
}

View file

@ -6,8 +6,6 @@ import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
import net.minecraft.resource.ResourceType;
import net.minecraft.util.Identifier;
import java.util.Optional;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@ -27,7 +25,6 @@ import com.minelittlepony.unicopia.diet.affliction.AfflictionType;
import com.minelittlepony.unicopia.entity.damage.UDamageTypes;
import com.minelittlepony.unicopia.entity.effect.UPotions;
import com.minelittlepony.unicopia.entity.mob.UEntities;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.item.UItems;
import com.minelittlepony.unicopia.item.enchantment.UEnchantments;
import com.minelittlepony.unicopia.network.Channel;
@ -43,8 +40,6 @@ public class Unicopia implements ModInitializer {
public static final String DEFAULT_NAMESPACE = "unicopia";
public static final Logger LOGGER = LogManager.getLogger();
public static SidedAccess SIDE = Optional::empty;
private static Config CONFIG;
public static Config getConfig() {
@ -111,12 +106,4 @@ public class Unicopia implements ModInitializer {
registry.registerReloadListener(SpellbookChapterLoader.INSTANCE);
registry.registerReloadListener(new DietsLoader());
}
public interface SidedAccess {
Optional<Pony> getPony();
default Race.Composite getPlayerSpecies() {
return getPony().map(Pony::getCompositeRace).orElse(Race.HUMAN.composite());
}
}
}

View file

@ -83,6 +83,15 @@ public interface Ability<T extends Hit> {
return false;
}
/**
* Checks whether this ability has any special actions for the given activation type.
* <p>
* The default is to only respond to press-and-hold actions.
*/
default boolean acceptsQuickAction(Pony player, ActivationType type) {
return type == ActivationType.NONE;
}
/**
* Called on the client to get any data required for the quick action.
*

View file

@ -209,7 +209,7 @@ public class AbilityDispatcher implements Tickable, NbtSerialisable {
warmup = 0;
if (data.isPresent()) {
InteractionManager.instance().sendPlayerLookAngles(player.asEntity());
InteractionManager.getInstance().sendPlayerLookAngles(player.asEntity());
Channel.CLIENT_PLAYER_ABILITY.sendToServer(new MsgPlayerAbility<>(ability, data, ActivationType.NONE));
} else {
player.asEntity().playSound(USounds.GUI_ABILITY_FAIL, 1, 1);

View file

@ -18,6 +18,10 @@ public enum ActivationType {
return ordinal();
}
public boolean isResult() {
return this != NONE;
}
public static ActivationType of(int id) {
return VALUES[MathHelper.clamp(id, 0, VALUES.length)];
}

View file

@ -63,6 +63,11 @@ public class CarryAbility implements Ability<Hit> {
return false;
}
@Override
public boolean acceptsQuickAction(Pony player, ActivationType type) {
return type == ActivationType.NONE || type == ActivationType.TAP;
}
@Override
public boolean apply(Pony iplayer, Hit data) {
PlayerEntity player = iplayer.asEntity();

View file

@ -116,6 +116,11 @@ public class EarthPonyKickAbility implements Ability<Pos> {
return false;
}
@Override
public boolean acceptsQuickAction(Pony player, ActivationType type) {
return type == ActivationType.NONE || type == ActivationType.TAP || type == ActivationType.DOUBLE_TAP;
}
@Nullable
@Override
public Optional<Pos> prepare(Pony player) {

View file

@ -49,6 +49,11 @@ public class FlyingDashAbility implements Ability<Hit> {
return false;
}
@Override
public boolean acceptsQuickAction(Pony player, ActivationType type) {
return type == ActivationType.NONE || type == ActivationType.TAP;
}
@Override
public boolean apply(Pony player, Hit data) {
player.getPhysics().dashForward((float)player.asWorld().random.nextTriangular(2.5F, 0.3F));

View file

@ -54,6 +54,11 @@ public class PegasusRainboomAbility implements Ability<Hit> {
return false;
}
@Override
public boolean acceptsQuickAction(Pony player, ActivationType type) {
return type == ActivationType.NONE || type == ActivationType.TAP;
}
@Override
public boolean apply(Pony player, Hit data) {

View file

@ -64,7 +64,7 @@ public class UnicornDispellAbility implements Ability<Pos> {
}
if (type == ActivationType.TAP && player.isClient()) {
InteractionManager.instance().openScreen(InteractionManager.SCREEN_DISPELL_ABILITY);
InteractionManager.getInstance().openScreen(InteractionManager.SCREEN_DISPELL_ABILITY);
return true;
}
}
@ -72,6 +72,11 @@ public class UnicornDispellAbility implements Ability<Pos> {
return false;
}
@Override
public boolean acceptsQuickAction(Pony player, ActivationType type) {
return type == ActivationType.NONE || (player.getSpecies() != Race.CHANGELING && type == ActivationType.TAP);
}
@Override
public double getCostEstimate(Pony player) {
return getTarget(player)

View file

@ -56,6 +56,11 @@ public class UnicornProjectileAbility extends AbstractSpellCastingAbility {
return false;
}
@Override
public boolean acceptsQuickAction(Pony player, ActivationType type) {
return type == ActivationType.NONE || type == ActivationType.DOUBLE_TAP;
}
@Override
public boolean apply(Pony player, Hit data) {
TypedActionResult<CustomisedSpellType<?>> thrown = player.getCharms().getSpellInHand(true);

View file

@ -209,7 +209,7 @@ public class PlaceableSpell extends AbstractDelegatingSpell implements OrientedS
castEntity.set(null);
});
if (source.asEntity() instanceof CastSpellEntity spellcast) {
if (source.asEntity() instanceof CastSpellEntity) {
Ether.get(source.asWorld()).remove(this, source);
}
}

View file

@ -108,7 +108,7 @@ public class RageAbilitySpell extends AbstractSpell {
if (source instanceof Pony pony) {
if (pony.isClientPlayer() && pony.asEntity().getAttackCooldownProgress(0) == 0) {
InteractionManager.instance().playLoopingSound(source.asEntity(), InteractionManager.SOUND_KIRIN_RAGE, source.asWorld().random.nextLong());
InteractionManager.getInstance().playLoopingSound(source.asEntity(), InteractionManager.SOUND_KIRIN_RAGE, source.asWorld().random.nextLong());
}
Bar energyBar = pony.getMagicalReserves().getEnergy();
var energy = Math.min(1.01F, 0.5F + (age / 1000F));

View file

@ -50,7 +50,7 @@ public class RainboomAbilitySpell extends AbstractSpell {
if (source.isClient()) {
if (boundParticle == null) {
boundParticle = InteractionManager.INSTANCE.createBoundParticle(getUuid());
boundParticle = InteractionManager.getInstance().createBoundParticle(getUuid());
}
boundParticle.addParticle(new TargetBoundParticleEffect(UParticles.RAINBOOM_TRAIL, source.asEntity()), source.getOriginVector(), Vec3d.ZERO);

View file

@ -1,36 +1,72 @@
package com.minelittlepony.unicopia.block;
import java.util.UUID;
import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.EquineContext;
import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.USounds;
import com.minelittlepony.unicopia.item.FriendshipBraceletItem;
import com.minelittlepony.unicopia.item.UItems;
import net.minecraft.block.Block;
import net.minecraft.block.BlockEntityProvider;
import net.minecraft.block.BlockSetType;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.DoorBlock;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.enums.DoubleBlockHalf;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.sound.SoundCategory;
import net.minecraft.state.StateManager;
import net.minecraft.state.property.BooleanProperty;
import net.minecraft.state.property.Properties;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.random.Random;
import net.minecraft.world.World;
import net.minecraft.world.event.GameEvent;
public class CrystalDoorBlock extends DoorBlock {
public class CrystalDoorBlock extends DoorBlock implements BlockEntityProvider {
public static final BooleanProperty LOCKED = Properties.LOCKED;
public CrystalDoorBlock(Settings settings, BlockSetType blockSet) {
super(settings, blockSet);
setDefaultState(getDefaultState().with(LOCKED, false));
}
@Override
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
super.appendProperties(builder);
builder.add(LOCKED);
}
@Override
public boolean hasRandomTicks(BlockState state) {
return state.get(LOCKED);
}
@Deprecated
@Override
public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) {
super.randomTick(state, world, pos, random);
if (!isLocked(world, pos)) {
setOnGuard(state, world, pos, false);
}
}
@Override
public void neighborUpdate(BlockState state, World world, BlockPos pos, Block sourceBlock, BlockPos sourcePos, boolean notify) {
if (!state.get(LOCKED)) {
boolean powered = world.isReceivingRedstonePower(pos) || world.isReceivingRedstonePower(pos.offset(state.get(HALF) == DoubleBlockHalf.LOWER ? Direction.UP : Direction.DOWN));
if (!getDefaultState().isOf(sourceBlock) && powered != state.get(POWERED)) {
if (powered) {
@ -43,22 +79,104 @@ public class CrystalDoorBlock extends DoorBlock {
}
}
if (state.get(HALF) == DoubleBlockHalf.LOWER && sourcePos.getY() == pos.getY() - 1) {
if (!canPlaceAt(state, world, pos) && world.isAir(sourcePos)) {
world.setBlockState(sourcePos, Blocks.DIRT.getDefaultState());
}
}
}
@Override
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
if (!EquineContext.of(player).getCompositeRace().any(Race::canCast)) {
if (!player.getStackInHand(hand).isOf(UItems.MEADOWBROOKS_STAFF)) {
if (!shouldProvideAccess(world, pos, player)) {
if (isLocked(world, pos) || !player.getStackInHand(hand).isOf(UItems.MEADOWBROOKS_STAFF)) {
playOpenCloseSound(player, world, pos, false);
return ActionResult.FAIL;
setOnGuard(state, world, pos, true);
return ActionResult.CONSUME;
} else {
world.playSound(player, pos, USounds.ENTITY_CRYSTAL_SHARDS_AMBIENT, SoundCategory.BLOCKS, 1, world.getRandom().nextFloat() * 0.1F + 0.9F);
}
} else if (!isLocked(world, pos)) {
ItemStack heldStack = player.getStackInHand(hand);
if (heldStack.isOf(UItems.FRIENDSHIP_BRACELET)) {
@Nullable
UUID signator = FriendshipBraceletItem.getSignatorId(heldStack);
if (signator != null) {
BlockEntityUtil.getOrCreateBlockEntity(world, state.get(HALF) == DoubleBlockHalf.LOWER ? pos.up() : pos, UBlockEntities.CRYSTAL_DOOR).ifPresent(data -> {
data.setSignator(signator);
setOnGuard(state, world, pos, true);
world.playSound(player, pos, USounds.ENTITY_CRYSTAL_SHARDS_AMBIENT, SoundCategory.BLOCKS, 1, world.getRandom().nextFloat() * 0.1F + 0.9F);
});
return ActionResult.SUCCESS;
}
} else {
setOnGuard(state, world, pos, false);
}
}
return super.onUse(state, world, pos, player, hand, hit);
}
private void setOnGuard(BlockState state, World world, BlockPos pos, boolean locked) {
world.setBlockState(pos, state.with(LOCKED, locked));
pos = pos.offset(state.get(HALF) == DoubleBlockHalf.LOWER ? Direction.UP : Direction.DOWN);
state = world.getBlockState(pos);
if (state.isOf(this)) {
world.setBlockState(pos, state.with(LOCKED, locked));
}
}
private boolean shouldProvideAccess(World world, BlockPos pos, PlayerEntity player) {
UUID signator = getSignator(world, pos);
if (signator != null) {
return signator.equals(player.getUuid()) || FriendshipBraceletItem.isComrade(signator, player);
}
return EquineContext.of(player).getCompositeRace().any(Race::canCast);
}
private boolean isLocked(World world, BlockPos pos) {
return getSignator(world, pos) != null;
}
@Nullable
private UUID getSignator(World world, BlockPos pos) {
pos = world.getBlockState(pos).get(HALF) == DoubleBlockHalf.LOWER ? pos.up() : pos;
var d = world.getBlockEntity(pos, UBlockEntities.CRYSTAL_DOOR);
return d.map(data -> data.signator).orElse(null);
}
private void playOpenCloseSound(@Nullable Entity entity, World world, BlockPos pos, boolean open) {
world.playSound(entity, pos, open ? getBlockSetType().doorOpen() : getBlockSetType().doorClose(), SoundCategory.BLOCKS, 1, world.getRandom().nextFloat() * 0.1f + 0.9f);
}
@Override
public BlockEntity createBlockEntity(BlockPos pos, BlockState state) {
return new TileData(pos, state);
}
public static class TileData extends BlockEntity {
@Nullable
private UUID signator;
public TileData(BlockPos pos, BlockState state) {
super(UBlockEntities.CRYSTAL_DOOR, pos, state);
}
public void setSignator(UUID signator) {
this.signator = signator;
markDirty();
}
@Override
public void readNbt(NbtCompound nbt) {
signator = nbt.containsUuid("signator") ? nbt.getUuid("signator") : null;
}
@Override
protected void writeNbt(NbtCompound nbt) {
if (signator != null) {
nbt.putUuid("signator", signator);
}
}
}
}

View file

@ -16,6 +16,7 @@ public interface UBlockEntities {
BlockEntityType<ChestBlockEntity> CLOUD_CHEST = create("cloud_chest", BlockEntityType.Builder.create(CloudChestBlock.TileData::new, UBlocks.CLOUD_CHEST));
BlockEntityType<HiveBlock.TileData> HIVE_STORAGE = create("hive_storage", BlockEntityType.Builder.create(HiveBlock.TileData::new, UBlocks.HIVE));
BlockEntityType<ItemJarBlock.TileData> ITEM_JAR = create("item_jar", BlockEntityType.Builder.create(ItemJarBlock.TileData::new, UBlocks.JAR));
BlockEntityType<CrystalDoorBlock.TileData> CRYSTAL_DOOR = create("crystal_door", BlockEntityType.Builder.create(CrystalDoorBlock.TileData::new, UBlocks.CRYSTAL_DOOR));
static <T extends BlockEntity> BlockEntityType<T> create(String id, Builder<T> builder) {
return Registry.register(Registries.BLOCK_ENTITY_TYPE, id, builder.build(null));

View file

@ -2,6 +2,7 @@ package com.minelittlepony.unicopia.client;
import java.lang.ref.WeakReference;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import java.util.function.Predicate;
import java.util.function.Supplier;
@ -168,4 +169,9 @@ public class ClientInteractionManager extends InteractionManager {
public void addBlockBreakingParticles(BlockPos pos, Direction direction) {
client.particleManager.addBlockBreakingParticles(pos, direction);
}
@Override
public Optional<Pony> getClientPony() {
return Optional.ofNullable(client.player).map(Pony::of);
}
}

View file

@ -2,8 +2,10 @@ package com.minelittlepony.unicopia.client;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicReference;
import org.lwjgl.glfw.GLFW;
@ -34,12 +36,12 @@ public class KeyBindingsHandler {
private final Map<Binding, AbilitySlot> keys = new HashMap<>();
private final Map<AbilitySlot, Binding> reverse = new HashMap<>();
private final Binding pageDown = register(GLFW.GLFW_KEY_PAGE_DOWN, "hud_page_dn");
private final Binding pageUp = register(GLFW.GLFW_KEY_PAGE_UP, "hud_page_up");
private final Binding pageDown = new Binding(create(GLFW.GLFW_KEY_PAGE_DOWN, "hud_page_dn"));
private final Binding pageUp = new Binding(create(GLFW.GLFW_KEY_PAGE_UP, "hud_page_up"));
private final Binding singleTapModifier = register(InputUtil.UNKNOWN_KEY.getCode(), "ability_modifier_tap");
private final Binding doubleTapModifier = register(InputUtil.UNKNOWN_KEY.getCode(), "ability_modifier_double_tap");
private final Binding tripleTapModifier = register(InputUtil.UNKNOWN_KEY.getCode(), "ability_modifier_triple_tap");
private final KeyBinding singleTapModifier = createSticky(InputUtil.UNKNOWN_KEY.getCode(), "ability_modifier_tap");
private final KeyBinding doubleTapModifier = createSticky(InputUtil.UNKNOWN_KEY.getCode(), "ability_modifier_double_tap");
private final KeyBinding tripleTapModifier = createSticky(InputUtil.UNKNOWN_KEY.getCode(), "ability_modifier_triple_tap");
private final Set<KeyBinding> pressed = new HashSet<>();
@ -57,14 +59,34 @@ public class KeyBindingsHandler {
return Unicopia.getConfig().toggleAbilityKeys.get();
}
public ActivationType getForcedActivationType() {
if (singleTapModifier.isPressed()) {
return ActivationType.TAP;
}
if (doubleTapModifier.isPressed()) {
return ActivationType.DOUBLE_TAP;
}
if (tripleTapModifier.isPressed()) {
return ActivationType.TRIPLE_TAP;
}
return ActivationType.NONE;
}
public void addKeybind(int code, AbilitySlot slot) {
Binding binding = new Binding(KeyBindingHelper.registerKeyBinding(new StickyKeyBinding("key.unicopia." + slot.name().toLowerCase(), code, KEY_CATEGORY, this::isToggleMode)));
Binding binding = new Binding(createSticky(code, slot.name().toLowerCase(Locale.ROOT)));
reverse.put(slot, binding);
keys.put(binding, slot);
}
Binding register(int code, String name) {
return new Binding(KeyBindingHelper.registerKeyBinding(new KeyBinding("key.unicopia." + name, code, KEY_CATEGORY)));
KeyBinding create(int code, String name) {
return KeyBindingHelper.registerKeyBinding(new KeyBinding("key.unicopia." + name, code, KEY_CATEGORY));
}
KeyBinding createSticky(int code, String name) {
return KeyBindingHelper.registerKeyBinding(new StickyKeyBinding("key.unicopia." + name, code, KEY_CATEGORY, this::isToggleMode));
}
public void tick(MinecraftClient client) {
@ -102,7 +124,7 @@ public class KeyBindingsHandler {
}
} else {
ActivationType type = i.getType();
if (type != ActivationType.NONE) {
if (type.isResult()) {
abilities.clear(slot, type, page);
}
}
@ -124,7 +146,7 @@ public class KeyBindingsHandler {
private long nextPhaseTime;
private ActivationType type = ActivationType.NONE;
private final AtomicReference<ActivationType> type = new AtomicReference<>(ActivationType.NONE);
Binding(KeyBinding binding) {
this.binding = binding;
@ -145,40 +167,25 @@ public class KeyBindingsHandler {
if (state == PressedState.RELEASED && now < nextPhaseTime + 10) {
nextPhaseTime = now + 200;
type = type.getNext();
type.set(type.get().getNext());
}
return state;
}
public ActivationType getType() {
if (binding.isPressed() && binding instanceof StickyKeyBinding) {
if (singleTapModifier.binding.isPressed()) {
if (binding.isPressed()) {
ActivationType t = getForcedActivationType();
if (t.isResult()) {
KeyBinding.untoggleStickyKeys();
return ActivationType.TAP;
}
if (doubleTapModifier.binding.isPressed()) {
KeyBinding.untoggleStickyKeys();
return ActivationType.DOUBLE_TAP;
}
if (tripleTapModifier.binding.isPressed()) {
KeyBinding.untoggleStickyKeys();
return ActivationType.TRIPLE_TAP;
}
if (isToggleMode()) {
return ActivationType.NONE;
}
}
long now = System.currentTimeMillis();
if (type != ActivationType.NONE && now > nextPhaseTime - 70) {
ActivationType t = type;
type = ActivationType.NONE;
return t;
}
}
if (!isToggleMode() && System.currentTimeMillis() > nextPhaseTime - 70) {
return type.getAndSet(ActivationType.NONE);
}
return ActivationType.NONE;
}

View file

@ -8,7 +8,6 @@ import org.joml.Vector3f;
import com.minelittlepony.common.client.gui.element.Button;
import com.minelittlepony.common.event.ScreenInitCallback;
import com.minelittlepony.common.event.ScreenInitCallback.ButtonList;
import com.minelittlepony.unicopia.InteractionManager;
import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.client.gui.LanSettingsScreen;
@ -51,6 +50,11 @@ public class UnicopiaClient implements ClientModInitializer {
return instance;
}
@Nullable
public static Pony getClientPony() {
return Pony.of(MinecraftClient.getInstance().player);
}
@Nullable
private Float originalRainGradient;
private final Lerp rainGradient = new Lerp(0);
@ -61,18 +65,23 @@ public class UnicopiaClient implements ClientModInitializer {
private ZapAppleStageStore.Stage zapAppleStage = ZapAppleStageStore.Stage.HIBERNATING;
public static Optional<PlayerCamera> getCamera() {
return Optional.of(getNullableCamera());
}
@Nullable
private static PlayerCamera getNullableCamera() {
PlayerEntity player = MinecraftClient.getInstance().player;
if (player != null && MinecraftClient.getInstance().cameraEntity == player) {
return Optional.of(Pony.of(player).getCamera());
return Pony.of(player).getCamera();
}
return Optional.empty();
return null;
}
public static Vec3d getAdjustedSoundPosition(Vec3d pos) {
PlayerCamera cam = getCamera().orElse(null);
PlayerCamera cam = getNullableCamera();
if (cam == null) {
return pos;
}
@ -124,7 +133,7 @@ public class UnicopiaClient implements ClientModInitializer {
@Override
public void onInitializeClient() {
InteractionManager.INSTANCE = new ClientInteractionManager();
new ClientInteractionManager();
new ClientNetworkHandlerImpl();
KeyBindingsHandler.bootstrap();
@ -140,8 +149,6 @@ public class UnicopiaClient implements ClientModInitializer {
ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(ViewportShader.INSTANCE);
ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(SpellEffectsRenderDispatcher.INSTANCE);
Unicopia.SIDE = () -> Optional.ofNullable(MinecraftClient.getInstance().player).map(Pony::of);
}
private void onTick(MinecraftClient client) {

View file

@ -1,14 +1,20 @@
package com.minelittlepony.unicopia.client.gui;
import java.util.Optional;
import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.ability.Ability;
import com.minelittlepony.unicopia.ability.AbilityDispatcher;
import com.minelittlepony.unicopia.ability.AbilitySlot;
import com.minelittlepony.unicopia.ability.ActivationType;
import com.minelittlepony.unicopia.client.KeyBindingsHandler;
import com.minelittlepony.unicopia.client.UnicopiaClient;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.Text;
import net.minecraft.text.MutableText;
import net.minecraft.util.Formatting;
import net.minecraft.util.math.MathHelper;
class Slot {
@ -130,11 +136,13 @@ class Slot {
void renderLabel(DrawContext context, AbilityDispatcher abilities, float tickDelta) {
if (abilities.getStat(aSlot).getAbility(Unicopia.getConfig().hudPage.get()).isEmpty()) {
Optional<Ability<?>> ability = abilities.getStat(aSlot).getAbility(Unicopia.getConfig().hudPage.get());
if (ability.isEmpty()) {
return;
}
Text label = KeyBindingsHandler.INSTANCE.getBinding(aSlot).getLabel();
MutableText label = KeyBindingsHandler.INSTANCE.getBinding(aSlot).getLabel().copy().formatted(Formatting.BOLD);
MatrixStack matrices = context.getMatrices();
matrices.push();
@ -150,6 +158,14 @@ class Slot {
matrices.translate(x, getY() + labelY, 0);
matrices.scale(0.5F, 0.5F, 0.5F);
ActivationType activation = KeyBindingsHandler.INSTANCE.getForcedActivationType();
if (activation.isResult()) {
label = label.append("+T" + activation.getTapCount());
if (!ability.get().acceptsQuickAction(UnicopiaClient.getClientPony(), activation)) {
label = label.formatted(Formatting.RED);
}
}
context.drawText(uHud.font, label, 0, 0, 0xFFFFFF, true);
matrices.pop();

View file

@ -218,7 +218,7 @@ public class WorldRenderDelegate {
}
private void flipAngles(Entity entity) {
if (entity instanceof PlayerEntity player) {
if (entity instanceof PlayerEntity) {
entity.prevYaw *= -1;
entity.setYaw(entity.getYaw() * -1);
@ -226,9 +226,7 @@ public class WorldRenderDelegate {
entity.setPitch(entity.getPitch() * -1);
}
if (entity instanceof LivingEntity) {
LivingEntity living = (LivingEntity)entity;
if (entity instanceof LivingEntity living) {
living.bodyYaw = -living.bodyYaw;
living.prevBodyYaw = -living.prevBodyYaw;
living.headYaw = -living.headYaw;

View file

@ -104,7 +104,7 @@ public class DisguiseCommand {
}
static Entity loadPlayer(ServerCommandSource source, String username) {
return InteractionManager.instance().createPlayer(source.getWorld(), new GameProfile(null, username));
return InteractionManager.getInstance().createPlayer(source.getWorld(), new GameProfile(null, username));
}
static int reveal(ServerCommandSource source, PlayerEntity player) {

View file

@ -38,7 +38,7 @@ public class MagicalShapedEmiRecipe extends EmiCraftingRecipe {
ItemStack[] stacks = ingredient.getMatchingStacks();
for (int i = 0; i < stacks.length; i++) {
if (stacks[i].getItem() instanceof EnchantableItem e) {
if (stacks[i].getItem() instanceof EnchantableItem) {
stacks = Arrays.copyOf(stacks, stacks.length);
stacks[i] = EnchantableItem.enchant(stacks[i].copy(), spellEffect.type());
return EmiIngredient.of(Arrays.stream(stacks).map(EmiStack::of).toList());

View file

@ -12,6 +12,7 @@ import com.minelittlepony.unicopia.datagen.providers.loot.UBlockAdditionsLootTab
import com.minelittlepony.unicopia.datagen.providers.loot.UBlockLootTableProvider;
import com.minelittlepony.unicopia.datagen.providers.loot.UChestAdditionsLootTableProvider;
import com.minelittlepony.unicopia.datagen.providers.loot.UChestLootTableProvider;
import com.minelittlepony.unicopia.datagen.providers.loot.UEntityAdditionsLootTableProvider;
import com.minelittlepony.unicopia.datagen.providers.loot.UEntityLootTableProvider;
import com.minelittlepony.unicopia.datagen.providers.recipe.URecipeProvider;
import com.minelittlepony.unicopia.datagen.providers.tag.UBlockTagProvider;
@ -58,6 +59,7 @@ public class Datagen implements DataGeneratorEntrypoint {
pack.addProvider(URecipeProvider::new);
pack.addProvider(UBlockLootTableProvider::new);
pack.addProvider(UEntityLootTableProvider::new);
pack.addProvider(UEntityAdditionsLootTableProvider::new);
pack.addProvider(UChestLootTableProvider::new);
pack.addProvider(UBlockAdditionsLootTableProvider::new);
pack.addProvider(UChestAdditionsLootTableProvider::new);

View file

@ -27,6 +27,10 @@ public interface UBlockFamilies {
.slab(UBlocks.CLOUD_SLAB).stairs(UBlocks.CLOUD_STAIRS)
.group("cloud").unlockCriterionName("has_cloud_lump")
.build();
BlockFamily ETCHED_CLOUD = new BlockFamily.Builder(UBlocks.ETCHED_CLOUD)
.slab(UBlocks.ETCHED_CLOUD_SLAB).stairs(UBlocks.ETCHED_CLOUD_STAIRS)
.group("etched_cloud").unlockCriterionName("has_cloud_lump")
.build();
BlockFamily CLOUD_PLANKS = new BlockFamily.Builder(UBlocks.CLOUD_PLANKS)
.slab(UBlocks.CLOUD_PLANK_SLAB).stairs(UBlocks.CLOUD_PLANK_STAIRS)
.group("cloud").unlockCriterionName("has_cloud")

View file

@ -34,6 +34,7 @@ import net.minecraft.data.client.Model;
import net.minecraft.data.client.ModelIds;
import net.minecraft.data.client.Models;
import net.minecraft.data.client.MultipartBlockStateSupplier;
import net.minecraft.data.client.TextureKey;
import net.minecraft.data.client.TextureMap;
import net.minecraft.data.client.TexturedModel;
import net.minecraft.data.client.VariantSettings;
@ -89,7 +90,8 @@ public class UBlockStateModelGenerator extends BlockStateModelGenerator {
registerAll((g, block) -> g.registerParentedItemModel(block, ModelIds.getBlockModelId(block)), UBlocks.SHAPING_BENCH, UBlocks.SURFACE_CHITIN);
registerAll(UBlockStateModelGenerator::registerSimpleState, UBlocks.SHAPING_BENCH, UBlocks.BANANAS);
// doors
registerAll(UBlockStateModelGenerator::registerStableDoor, UBlocks.STABLE_DOOR, UBlocks.DARK_OAK_DOOR, UBlocks.CRYSTAL_DOOR, UBlocks.CLOUD_DOOR);
registerAll(UBlockStateModelGenerator::registerStableDoor, UBlocks.STABLE_DOOR, UBlocks.DARK_OAK_DOOR, UBlocks.CLOUD_DOOR);
registerLockingDoor(UBlocks.CRYSTAL_DOOR);
// cloud blocks
createCustomTexturePool(UBlocks.CLOUD, TexturedModel.CUBE_ALL).same(UBlocks.UNSTABLE_CLOUD).slab(UBlocks.CLOUD_SLAB).stairs(UBlocks.CLOUD_STAIRS);
@ -347,23 +349,37 @@ public class UBlockStateModelGenerator extends BlockStateModelGenerator {
}
public void registerStableDoor(Block door) {
TextureMap topTextures = TextureMap.topBottom(door);
TextureMap bottomTextures = topTextures.copyAndAdd(TOP, topTextures.getTexture(BOTTOM));
registerItemModel(door.asItem());
var variants = BlockStateVariantMap.create(Properties.HORIZONTAL_FACING, Properties.DOUBLE_BLOCK_HALF, Properties.DOOR_HINGE, Properties.OPEN);
fillStableDoorVariantMap(variants, DoubleBlockHalf.LOWER,
BlockModels.DOOR_LEFT.upload(door, "_bottom_left", bottomTextures, modelCollector),
BlockModels.DOOR_RIGHT.upload(door, "_bottom_right", bottomTextures, modelCollector)
);
fillStableDoorVariantMap(variants, DoubleBlockHalf.UPPER,
BlockModels.DOOR_LEFT.upload(door, "_top_left", topTextures, modelCollector),
BlockModels.DOOR_RIGHT.upload(door, "_top_right", topTextures, modelCollector)
);
registerItemModel(door.asItem());
buildDoorStateModels(door, "", variants::register);
blockStateCollector.accept(VariantsBlockStateSupplier.create(door).coordinate(variants));
}
public static void fillStableDoorVariantMap(
BlockStateVariantMap.QuadrupleProperty<Direction, DoubleBlockHalf, DoorHinge, Boolean> variantMap,
public void registerLockingDoor(Block door) {
var variants = BlockStateVariantMap.create(Properties.HORIZONTAL_FACING, Properties.DOUBLE_BLOCK_HALF, Properties.DOOR_HINGE, Properties.OPEN, Properties.LOCKED);
registerItemModel(door.asItem());
buildDoorStateModels(door, "", (facing, half, hinge, open, map) -> variants.register(facing, half, hinge, open, false, map));
buildDoorStateModels(door, "_locked", (facing, half, hinge, open, map) -> variants.register(facing, half, hinge, open, true, map));
blockStateCollector.accept(VariantsBlockStateSupplier.create(door).coordinate(variants));
}
private void buildDoorStateModels(Block door, String suffex, DoorStateConsumer variants) {
TextureMap topTextures = new TextureMap()
.put(TextureKey.TOP, TextureMap.getSubId(door, "_top" + suffex))
.put(TextureKey.BOTTOM, TextureMap.getSubId(door, "_bottom" + suffex));
TextureMap bottomTextures = topTextures.copyAndAdd(TOP, topTextures.getTexture(BOTTOM));
fillStableDoorVariantMap(variants, DoubleBlockHalf.LOWER,
BlockModels.DOOR_LEFT.upload(door, "_bottom_left" + suffex, bottomTextures, modelCollector),
BlockModels.DOOR_RIGHT.upload(door, "_bottom_right" + suffex, bottomTextures, modelCollector)
);
fillStableDoorVariantMap(variants, DoubleBlockHalf.UPPER,
BlockModels.DOOR_LEFT.upload(door, "_top_left" + suffex, topTextures, modelCollector),
BlockModels.DOOR_RIGHT.upload(door, "_top_right" + suffex, topTextures, modelCollector)
);
}
private static void fillStableDoorVariantMap(
DoorStateConsumer variantMap,
DoubleBlockHalf targetHalf, Identifier leftModelId, Identifier rightModelId) {
fillStableDoorVariantMap(variantMap, targetHalf, DoorHinge.LEFT, false, R0, leftModelId);
fillStableDoorVariantMap(variantMap, targetHalf, DoorHinge.RIGHT, false, R0, rightModelId);
@ -373,7 +389,7 @@ public class UBlockStateModelGenerator extends BlockStateModelGenerator {
}
public static void fillStableDoorVariantMap(
BlockStateVariantMap.QuadrupleProperty<Direction, DoubleBlockHalf, DoorHinge, Boolean> variantMap,
DoorStateConsumer variantMap,
DoubleBlockHalf targetHalf,
DoorHinge hinge, boolean open, Rotation rotation,
Identifier modelId) {
@ -386,6 +402,10 @@ public class UBlockStateModelGenerator extends BlockStateModelGenerator {
}
}
interface DoorStateConsumer {
void register(Direction direction, DoubleBlockHalf half, DoorHinge hinge, boolean open, BlockStateVariant variant);
}
public void registerPillar(Block pillar) {
TextureMap textures = new TextureMap()
.put(SIDE, ModelIds.getBlockSubModelId(pillar, "_side"))

View file

@ -63,10 +63,10 @@ public class UModelProvider extends FabricModelProvider {
UItems.BANANA, UItems.BOTCHED_GEM, UItems.BOWL_OF_NUTS, UItems.BROKEN_SUNGLASSES, UItems.BURNED_JUICE, UItems.BURNED_TOAST,
UItems.CARAPACE, UItems.CLAM_SHELL, UItems.COOKED_ZAP_APPLE, UItems.CHOCOLATE_OATMEAL_COOKIE,
UItems.CLOUD_LUMP, UItems.CRISPY_HAY_FRIES, UItems.CRYSTAL_HEART, UItems.CRYSTAL_SHARD,
UItems.COOKED_TROPICAL_FISH, UItems.COOKED_PUFFERFISH, UItems.FRIED_AXOLOTL,
UItems.COOKED_TROPICAL_FISH, UItems.COOKED_PUFFERFISH, UItems.COOKED_FROG_LEGS,
UItems.DAFFODIL_DAISY_SANDWICH, UItems.DRAGON_BREATH_SCROLL,
UItems.EMPTY_JAR,
UItems.FRIENDSHIP_BRACELET,
UItems.FRIENDSHIP_BRACELET, UItems.FRIED_AXOLOTL, UItems.FROG_LEGS,
UItems.GIANT_BALLOON, UItems.GOLDEN_FEATHER, UItems.GOLDEN_OAK_SEEDS, UItems.GOLDEN_WING, UItems.GREEN_APPLE_SEEDS, UItems.GREEN_APPLE, UItems.GROGARS_BELL,
UItems.GRYPHON_FEATHER, UItems.GREEN_FRIED_EGG,
UItems.HAY_BURGER, UItems.HAY_FRIES, UItems.HORSE_SHOE_FRIES,

View file

@ -0,0 +1,41 @@
package com.minelittlepony.unicopia.datagen.providers.loot;
import java.util.function.BiConsumer;
import com.minelittlepony.unicopia.item.UItems;
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
import net.fabricmc.fabric.api.datagen.v1.provider.SimpleFabricLootTableProvider;
import net.minecraft.entity.EntityType;
import net.minecraft.loot.LootPool;
import net.minecraft.loot.LootTable;
import net.minecraft.loot.LootTable.Builder;
import net.minecraft.loot.context.LootContextTypes;
import net.minecraft.loot.entry.ItemEntry;
import net.minecraft.loot.function.LootingEnchantLootFunction;
import net.minecraft.loot.provider.number.ConstantLootNumberProvider;
import net.minecraft.util.Identifier;
public class UEntityAdditionsLootTableProvider extends SimpleFabricLootTableProvider {
public UEntityAdditionsLootTableProvider(FabricDataOutput output) {
super(output, LootContextTypes.ENTITY);
}
@Override
public String getName() {
return super.getName() + " Additions";
}
@Override
public void accept(BiConsumer<Identifier, Builder> exporter) {
generate((type, builder) -> exporter.accept(new Identifier("unicopiamc", EntityType.getId(type).withPrefixedPath("entities/").getPath()), builder));
}
protected void generate(BiConsumer<EntityType<?>, Builder> exporter) {
exporter.accept(EntityType.FROG, LootTable.builder()
.pool(LootPool.builder()
.rolls(ConstantLootNumberProvider.create(1))
.with(ItemEntry.builder(UItems.FROG_LEGS)
.apply(LootingEnchantLootFunction.builder(ConstantLootNumberProvider.create(2))))));
}
}

View file

@ -415,6 +415,7 @@ public class URecipeProvider extends FabricRecipeProvider {
offerSmelting(exporter, List.of(Items.TROPICAL_FISH), RecipeCategory.FOOD, UItems.COOKED_TROPICAL_FISH, 1.2F, 230, "fish");
offerSmelting(exporter, List.of(Items.PUFFERFISH), RecipeCategory.FOOD, UItems.COOKED_PUFFERFISH, 1.2F, 230, "fish");
offerSmelting(exporter, List.of(Items.AXOLOTL_BUCKET), RecipeCategory.FOOD, UItems.FRIED_AXOLOTL, 2.2F, 230, "fried_axolotl");
offerSmelting(exporter, List.of(UItems.FROG_LEGS), RecipeCategory.FOOD, UItems.COOKED_FROG_LEGS, 2.2F, 10, "frog_legs");
offerSmelting(exporter, List.of(UBlocks.MYSTERIOUS_EGG.asItem()), RecipeCategory.FOOD, UItems.GREEN_FRIED_EGG, 3.8F, 630, "fried_egg");
ShapelessRecipeJsonBuilder.create(RecipeCategory.FOOD, UItems.ZAP_APPLE_JAM_JAR)

View file

@ -1,5 +1,8 @@
package com.minelittlepony.unicopia.datagen.providers.tag;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
@ -9,14 +12,18 @@ import com.minelittlepony.unicopia.UTags;
import com.minelittlepony.unicopia.block.UBlocks;
import com.minelittlepony.unicopia.datagen.Datagen;
import com.minelittlepony.unicopia.datagen.ItemFamilies;
import com.minelittlepony.unicopia.datagen.UBlockFamilies;
import com.minelittlepony.unicopia.item.BedsheetsItem;
import com.minelittlepony.unicopia.item.UItems;
import com.minelittlepony.unicopia.server.world.UTreeGen;
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider;
import net.fabricmc.fabric.api.tag.convention.v1.ConventionalItemTags;
import net.minecraft.block.Block;
import net.minecraft.data.family.BlockFamily;
import net.minecraft.item.Item;
import net.minecraft.item.ItemConvertible;
import net.minecraft.item.Items;
import net.minecraft.registry.Registries;
import net.minecraft.registry.RegistryKeys;
@ -138,6 +145,7 @@ public class UItemTagProvider extends FabricTagProvider.ItemTagProvider {
.forceAddTag(UConventionalTags.Items.CORALS).forceAddTag(UConventionalTags.Items.CORAL_FANS);
exportForagingTags();
exportCreativeTabs();
exportFarmersDelightItems();
}
@ -184,6 +192,112 @@ public class UItemTagProvider extends FabricTagProvider.ItemTagProvider {
getOrCreateTagBuilder(UTags.Items.FORAGE_STRENGHENING).add(Items.FERN);
getOrCreateTagBuilder(UTags.Items.FORAGE_SEVERE_NAUSEATING).add(Items.PITCHER_PLANT);
getOrCreateTagBuilder(UTags.Items.FORAGE_SEVERE_PRICKLY).add(Items.LARGE_FERN);
getOrCreateTagBuilder(UTags.Items.GROUP_FORAGING)
.forceAddTag(UTags.Items.FORAGE_BLINDING)
.forceAddTag(UTags.Items.FORAGE_DANGEROUS)
.forceAddTag(UTags.Items.FORAGE_FILLING)
.forceAddTag(UTags.Items.FORAGE_SAFE)
.forceAddTag(UTags.Items.FORAGE_NAUSEATING)
.forceAddTag(UTags.Items.FORAGE_PRICKLY)
.forceAddTag(UTags.Items.FORAGE_GLOWING)
.forceAddTag(UTags.Items.FORAGE_RISKY)
.forceAddTag(UTags.Items.FORAGE_STRENGHENING)
.forceAddTag(UTags.Items.FORAGE_SEVERE_NAUSEATING)
.forceAddTag(UTags.Items.FORAGE_SEVERE_PRICKLY);
}
private void exportCreativeTabs() {
getOrCreateTagBuilder(UTags.Items.GROUP_UNICORN).add(
UItems.SPELLBOOK, UItems.GEMSTONE, UItems.BOTCHED_GEM, UItems.FRIENDSHIP_BRACELET,
UItems.CRYSTAL_HEART, UItems.CRYSTAL_SHARD, UBlocks.CRYSTAL_DOOR.asItem(),
UItems.MEADOWBROOKS_STAFF, UItems.MAGIC_STAFF, UItems.GROGARS_BELL,
UItems.DRAGON_BREATH_SCROLL, UItems.PEGASUS_AMULET, UItems.ALICORN_AMULET,
UItems.BROKEN_ALICORN_AMULET, UItems.UNICORN_AMULET, UItems.SPECTRAL_CLOCK
);
getOrCreateTagBuilder(UTags.Items.GROUP_PEGASUS)
.add(UBlocks.SHAPING_BENCH.asItem(), UBlocks.CLOUD_CHEST.asItem(), UItems.CLOUD_LUMP)
.add(List.of(UBlockFamilies.CLOUD, UBlockFamilies.CLOUD_PLANKS, UBlockFamilies.CLOUD_BRICKS, UBlockFamilies.DENSE_CLOUD, UBlockFamilies.ETCHED_CLOUD)
.stream()
.map(BlockFamily::getVariants)
.map(Map::values)
.flatMap(Collection::stream)
.map(ItemConvertible::asItem)
.filter(Objects::nonNull)
.toArray(Item[]::new))
.add(UBlocks.UNSTABLE_CLOUD.asItem(), UBlocks.CLOUD_PILLAR.asItem(), UBlocks.CLOUD_DOOR.asItem(), UBlocks.CLOUD_BED.asItem())
.forceAddTag(UTags.Items.BED_SHEETS)
.forceAddTag(UConventionalTags.Items.RAW_FISH)
.forceAddTag(UConventionalTags.Items.COOKED_FISH)
.forceAddTag(UConventionalTags.Items.ROTTEN_FISH)
.forceAddTag(UTags.Items.CLOUD_JARS)
.add(UItems.LIGHTNING_JAR)
.forceAddTag(UTags.Items.POLEARMS)
.add(UItems.PEGASUS_FEATHER, UItems.GRYPHON_FEATHER, UItems.GOLDEN_FEATHER, UItems.GOLDEN_WING);
getOrCreateTagBuilder(UTags.Items.GROUP_EARTH_PONY)
.add(
UBlocks.GREEN_APPLE_LEAVES.asItem(), UBlocks.SWEET_APPLE_LEAVES.asItem(), UBlocks.SOUR_APPLE_LEAVES.asItem(), UBlocks.ZAP_LEAVES.asItem(), UBlocks.FLOWERING_ZAP_LEAVES.asItem(),
UBlocks.ZAP_LOG.asItem(), UBlocks.ZAP_WOOD.asItem(),
UBlocks.STRIPPED_ZAP_LOG.asItem(), UBlocks.STRIPPED_ZAP_WOOD.asItem(),
UBlocks.ZAP_PLANKS.asItem(), UBlocks.ZAP_STAIRS.asItem(), UBlocks.ZAP_SLAB.asItem(), UBlocks.ZAP_FENCE.asItem(), UBlocks.ZAP_FENCE_GATE.asItem(),
UBlocks.WAXED_ZAP_LOG.asItem(), UBlocks.WAXED_ZAP_WOOD.asItem(),
UBlocks.WAXED_STRIPPED_ZAP_LOG.asItem(), UBlocks.WAXED_STRIPPED_ZAP_WOOD.asItem(),
UBlocks.WAXED_ZAP_PLANKS.asItem(), UBlocks.WAXED_ZAP_STAIRS.asItem(), UBlocks.WAXED_ZAP_SLAB.asItem(), UBlocks.WAXED_ZAP_FENCE.asItem(), UBlocks.WAXED_ZAP_FENCE_GATE.asItem(),
UItems.CANDIED_APPLE, UBlocks.STABLE_DOOR.asItem(), UBlocks.DARK_OAK_DOOR.asItem())
.forceAddTag(UTags.Items.FRESH_APPLES)
.add(
UItems.ZAP_APPLE, UItems.ZAP_BULB, UItems.ROTTEN_APPLE,
UItems.GREEN_APPLE_SEEDS, UItems.SWEET_APPLE_SEEDS, UItems.SOUR_APPLE_SEEDS,
UTreeGen.ZAP_APPLE_TREE.sapling().get().asItem(),
UTreeGen.BANANA_TREE.sapling().get().asItem(),
UItems.CURING_JOKE, UItems.MANGO, UItems.EMPTY_JAR, UItems.COOKED_ZAP_APPLE,
UItems.ZAP_APPLE_JAM_JAR,
UItems.OAT_SEEDS, UItems.OATS, UItems.IMPORTED_OATS,
UItems.OATMEAL, UItems.OATMEAL_COOKIE, UItems.CHOCOLATE_OATMEAL_COOKIE,
UItems.DAFFODIL_DAISY_SANDWICH, UItems.HAY_BURGER, UItems.HAY_BURGER, UItems.HAY_FRIES,
UItems.CRISPY_HAY_FRIES, UItems.HORSE_SHOE_FRIES, UItems.WHEAT_WORMS,
UItems.BAITED_FISHING_ROD, UBlocks.WORM_BLOCK.asItem(),
UItems.MUFFIN, UItems.SCONE, UItems.ACORN, UItems.PINECONE, UItems.PINECONE_COOKIE,
UItems.BOWL_OF_NUTS, UItems.CRYSTAL_SHARD, UItems.PEBBLES, UItems.ROCK, UItems.WEIRD_ROCK,
UItems.ROCK_STEW, UItems.ROCK_CANDY, UItems.SALT_CUBE, UItems.MUG, UItems.CIDER, UItems.JUICE,
UItems.BURNED_JUICE, UItems.TOAST, UItems.JAM_TOAST, UItems.BURNED_TOAST, UItems.APPLE_PIE,
UItems.APPLE_PIE_HOOF, UItems.APPLE_PIE_SLICE, UBlocks.WEATHER_VANE.asItem()
)
.forceAddTag(UTags.Items.BASKETS)
.add(UItems.GIANT_BALLOON, UBlocks.CLOTH_BED.asItem())
.forceAddTag(UTags.Items.BED_SHEETS);
getOrCreateTagBuilder(UTags.Items.GROUP_BAT_PONY)
.forceAddTag(UConventionalTags.Items.RAW_INSECT)
.forceAddTag(UConventionalTags.Items.COOKED_INSECT)
.forceAddTag(UTags.Items.POLEARMS)
.add(
UBlocks.MANGO_LEAVES.asItem(), UTreeGen.MANGO_TREE.sapling().get().asItem(), UItems.MANGO,
UItems.PINEAPPLE, UItems.PINEAPPLE_CROWN, UItems.BANANA, UItems.SUNGLASSES, UItems.BROKEN_SUNGLASSES
);
getOrCreateTagBuilder(UTags.Items.GROUP_CHANGELING)
.add(
UItems.CARAPACE, UBlocks.SURFACE_CHITIN.asItem(), UBlocks.CHITIN.asItem()
).add(UBlockFamilies.CHISELED_CHITIN.getVariants().values().stream().map(ItemConvertible::asItem).toArray(Item[]::new))
.add(
UBlocks.CHISELLED_CHITIN_HULL.asItem(), UBlocks.CHITIN_SPIKES.asItem(),
UBlocks.SLIME_PUSTULE.asItem(),
UBlocks.MYSTERIOUS_EGG.asItem(), UItems.GREEN_FRIED_EGG,
UBlocks.HIVE.asItem()
)
.forceAddTag(UConventionalTags.Items.RAW_MEAT)
.forceAddTag(UConventionalTags.Items.COOKED_MEAT)
.forceAddTag(UConventionalTags.Items.ROTTEN_MEAT)
.forceAddTag(UConventionalTags.Items.RAW_INSECT)
.forceAddTag(UConventionalTags.Items.COOKED_INSECT)
.forceAddTag(UConventionalTags.Items.ROTTEN_INSECT)
.forceAddTag(UTags.Items.CONTAINER_WITH_LOVE);
getOrCreateTagBuilder(UTags.Items.GROUP_SEA_PONY)
.add(UItems.PEARL_NECKLACE)
.forceAddTag(UTags.Items.SHELLS)
.forceAddTag(UTags.Items.SPECIAL_SHELLS)
.forceAddTag(UTags.Items.LOW_QUALITY_SEA_VEGETABLES)
.forceAddTag(UTags.Items.HIGH_QUALITY_SEA_VEGETABLES);
}
private void exportConventionalTags() {
@ -229,8 +343,8 @@ public class UItemTagProvider extends FabricTagProvider.ItemTagProvider {
.addOptionalTag(new Identifier("c", "lemon_chickens"));
getOrCreateTagBuilder(UConventionalTags.Items.ROTTEN_MEAT).add(Items.ROTTEN_FLESH);
getOrCreateTagBuilder(UConventionalTags.Items.ROTTEN_INSECT).add(Items.FERMENTED_SPIDER_EYE);
getOrCreateTagBuilder(UConventionalTags.Items.COOKED_INSECT);//.add(Items.FERMENTED_SPIDER_EYE); TODO
getOrCreateTagBuilder(UConventionalTags.Items.RAW_INSECT).add(Items.SPIDER_EYE, UItems.BUTTERFLY, UItems.WHEAT_WORMS, UBlocks.WORM_BLOCK.asItem());
getOrCreateTagBuilder(UConventionalTags.Items.COOKED_INSECT).add(UItems.COOKED_FROG_LEGS);
getOrCreateTagBuilder(UConventionalTags.Items.RAW_INSECT).add(Items.SPIDER_EYE, UItems.BUTTERFLY, UItems.FROG_LEGS, UItems.WHEAT_WORMS, UBlocks.WORM_BLOCK.asItem());
getOrCreateTagBuilder(UConventionalTags.Items.WORMS).add(UItems.WHEAT_WORMS);
getOrCreateTagBuilder(UConventionalTags.Items.STICKS).add(Items.STICK);
getOrCreateTagBuilder(UConventionalTags.Items.ROCKS).add(UItems.ROCK);

View file

@ -76,7 +76,7 @@ public class DietsLoader implements IdentifiableResourceReloadListener {
if (!issueList.isEmpty()) {
LOGGER.error("Could not load diet profile {}. Caused by {}", entry.getKey(), issueList.toString());
}
return issueList.isEmpty();
return !issueList.isEmpty();
});
PonyDiets.load(new PonyDiets(profiles, foodGroups));
}, applyExecutor);

View file

@ -90,7 +90,7 @@ public class FleeExplosionGoal extends Goal {
public static void notifySurroundings(Entity explosionSource, float radius) {
explosionSource.getWorld().getOtherEntities(explosionSource, explosionSource.getBoundingBox().expand(radius), e -> {
return Living.getOrEmpty(e).filter(l -> l instanceof Creature c).isPresent();
return Living.getOrEmpty(e).filter(l -> l instanceof Creature).isPresent();
}).forEach(e -> {
getGoals((Creature)Living.living(e)).forEach(goal -> goal.setFleeTarget(explosionSource));
});

View file

@ -10,7 +10,7 @@ public class BeeBehaviour extends EntityBehaviour<BeeEntity> {
public BeeEntity onCreate(BeeEntity entity, EntityAppearance context, boolean replaceOld) {
super.onCreate(entity, context, replaceOld);
if (replaceOld && entity.getWorld().isClient) {
InteractionManager.instance().playLoopingSound(entity, InteractionManager.SOUND_BEE, entity.getId());
InteractionManager.getInstance().playLoopingSound(entity, InteractionManager.SOUND_BEE, entity.getId());
}
return entity;
}

View file

@ -141,7 +141,7 @@ public class EntityAppearance implements NbtSerialisable, PlayerDimensions.Provi
private synchronized void createPlayer(NbtCompound nbt, GameProfile profile, Caster<?> source) {
remove();
entity = InteractionManager.instance().createPlayer(source.asEntity(), profile);
entity = InteractionManager.getInstance().createPlayer(source.asEntity(), profile);
entity.setCustomName(source.asEntity().getName());
((PlayerEntity)entity).readNbt(nbt.getCompound("playerNbt"));
if (nbt.contains("playerVisibleParts", NbtElement.BYTE_TYPE)) {

View file

@ -12,7 +12,7 @@ public class MinecartBehaviour extends EntityBehaviour<AbstractMinecartEntity> {
public AbstractMinecartEntity onCreate(AbstractMinecartEntity entity, EntityAppearance context, boolean replaceOld) {
super.onCreate(entity, context, replaceOld);
if (replaceOld && entity.getWorld().isClient) {
InteractionManager.instance().playLoopingSound(entity, InteractionManager.SOUND_MINECART, entity.getId());
InteractionManager.getInstance().playLoopingSound(entity, InteractionManager.SOUND_MINECART, entity.getId());
}
return entity;
}

View file

@ -366,7 +366,7 @@ public class AirBalloonEntity extends MobEntity implements EntityCollisions.Comp
protected ActionResult interactMob(PlayerEntity player, Hand hand) {
ItemStack stack = player.getStackInHand(hand);
if (stack.getItem() instanceof HotAirBalloonItem balloon && !hasBalloon()) {
if (stack.getItem() instanceof HotAirBalloonItem && !hasBalloon()) {
if (!player.getAbilities().creativeMode) {
stack.decrement(1);
}

View file

@ -75,7 +75,7 @@ public class CorruptionHandler implements Tickable {
private void recover(float percentage) {
pony.getCorruption().set((int)(pony.getCorruption().get() * (1 - percentage)));
InteractionManager.INSTANCE.playLoopingSound(pony.asEntity(), InteractionManager.SOUND_HEART_BEAT, 0);
InteractionManager.getInstance().playLoopingSound(pony.asEntity(), InteractionManager.SOUND_HEART_BEAT, 0);
MagicReserves reserves = pony.getMagicalReserves();
reserves.getExertion().addPercent(10);
reserves.getEnergy().add(10);

View file

@ -459,13 +459,13 @@ public class PlayerPhysics extends EntityPhysics<PlayerEntity> implements Tickab
if (type.isAvian()) {
if (!SpellPredicate.IS_DISGUISE.isOn(pony) && pony.isClient()) {
if (ticksInAir % GLIDING_SOUND_INTERVAL == 5) {
InteractionManager.instance().playLoopingSound(entity, InteractionManager.SOUND_GLIDING, entity.getId());
InteractionManager.getInstance().playLoopingSound(entity, InteractionManager.SOUND_GLIDING, entity.getId());
}
}
} else if (type == FlightType.INSECTOID && !SpellPredicate.IS_DISGUISE.isOn(pony)) {
if (entity.getWorld().isClient && !soundPlaying) {
soundPlaying = true;
InteractionManager.instance().playLoopingSound(entity, InteractionManager.SOUND_CHANGELING_BUZZ, entity.getId());
InteractionManager.getInstance().playLoopingSound(entity, InteractionManager.SOUND_CHANGELING_BUZZ, entity.getId());
}
}

View file

@ -564,7 +564,7 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
entity.addStatusEffect(new StatusEffectInstance(UEffects.SUN_BLINDNESS, SunBlindnessStatusEffect.MAX_DURATION, 2, true, false));
UCriteria.LOOK_INTO_SUN.trigger(entity);
} else if (isClientPlayer()) {
InteractionManager.instance().playLoopingSound(entity, InteractionManager.SOUND_EARS_RINGING, entity.getId());
InteractionManager.getInstance().playLoopingSound(entity, InteractionManager.SOUND_EARS_RINGING, entity.getId());
}
}
@ -577,7 +577,7 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
if (!isClient()) {
entity.addStatusEffect(new StatusEffectInstance(UEffects.SUN_BLINDNESS, SunBlindnessStatusEffect.MAX_DURATION, 1, true, false));
} else if (isClientPlayer()) {
InteractionManager.instance().playLoopingSound(entity, InteractionManager.SOUND_EARS_RINGING, entity.getId());
InteractionManager.getInstance().playLoopingSound(entity, InteractionManager.SOUND_EARS_RINGING, entity.getId());
}
}
} else if (ticksInSun > 0) {
@ -966,7 +966,7 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
}
public boolean isClientPlayer() {
return InteractionManager.instance().isClientPlayer(asEntity());
return InteractionManager.getInstance().isClientPlayer(asEntity());
}
@SuppressWarnings("unchecked")

View file

@ -65,7 +65,7 @@ public class DummyClientPlayerEntity extends AbstractClientPlayerEntity implemen
@Override
public boolean shouldRenderName() {
return !InteractionManager.instance().isClientPlayer(getMaster());
return !InteractionManager.getInstance().isClientPlayer(getMaster());
}
@Override

View file

@ -53,7 +53,7 @@ public class DummyPlayerEntity extends PlayerEntity implements Owned<PlayerEntit
@Override
public boolean shouldRenderName() {
return !InteractionManager.instance().isClientPlayer(getMaster());
return !InteractionManager.getInstance().isClientPlayer(getMaster());
}
@Override

View file

@ -271,7 +271,7 @@ public class AlicornAmuletItem extends AmuletItem implements ItemTracker.Trackab
pony.playSound(USounds.ITEM_ALICORN_AMULET_HALLUCINATION, 3, 1);
} else if (attachedTicks < 2 || (attachedTicks % (10 * ItemTracker.SECONDS) < 9 && world.random.nextInt(90) == 0)) {
if (attachedTicks % 5 == 0) {
InteractionManager.INSTANCE.playLoopingSound(player, InteractionManager.SOUND_HEART_BEAT, 0);
InteractionManager.getInstance().playLoopingSound(player, InteractionManager.SOUND_HEART_BEAT, 0);
}
reserves.getExertion().addPercent(10);

View file

@ -49,7 +49,7 @@ public class ForageableItem extends Item {
if (state.isIn(BlockTags.LEAVES)) {
player.swingHand(hand);
world.playSound(player, pos, state.getSoundGroup().getHitSound(), SoundCategory.BLOCKS);
InteractionManager.instance().addBlockBreakingParticles(pos, hitResult.getSide());
InteractionManager.getInstance().addBlockBreakingParticles(pos, hitResult.getSide());
int miningLevel = (stack.getItem() instanceof HoeItem hoe ? hoe.getMaterial().getMiningLevel() : 59);

View file

@ -124,6 +124,10 @@ public class FriendshipBraceletItem extends WearableItem implements DyeableItem,
.isPresent();
}
public static boolean isComrade(UUID signator, Entity entity) {
return entity instanceof LivingEntity l && getWornBangles(l).anyMatch(stack -> isSignedBy(stack, signator));
}
public static Stream<Pony> getPartyMembers(Caster<?> caster, double radius) {
return Pony.stream(caster.findAllEntitiesInRange(radius, entity -> isComrade(caster, entity)));
}

View file

@ -5,7 +5,7 @@ import java.util.List;
import java.util.function.Predicate;
import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.InteractionManager;
import com.minelittlepony.unicopia.ability.magic.spell.effect.CustomisedSpellType;
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
import com.minelittlepony.unicopia.client.TextHelper;
@ -84,7 +84,7 @@ public class GemstoneItem extends Item implements MultiItem, EnchantableItem {
MutableText line = Text.translatable(key.getTranslationKey() + ".lore").formatted(key.getAffinity().getColor());
if (!Unicopia.SIDE.getPlayerSpecies().canCast()) {
if (!InteractionManager.getInstance().getClientSpecies().canCast()) {
line = line.formatted(Formatting.OBFUSCATED);
}
@ -105,13 +105,13 @@ public class GemstoneItem extends Item implements MultiItem, EnchantableItem {
@Override
public boolean hasGlint(ItemStack stack) {
return super.hasGlint(stack) || (Unicopia.SIDE.getPlayerSpecies().canCast() && EnchantableItem.isEnchanted(stack));
return super.hasGlint(stack) || (InteractionManager.getInstance().getClientSpecies().canCast() && EnchantableItem.isEnchanted(stack));
}
@Override
public Text getName(ItemStack stack) {
if (EnchantableItem.isEnchanted(stack)) {
if (!Unicopia.SIDE.getPlayerSpecies().canCast()) {
if (!InteractionManager.getInstance().getClientSpecies().canCast()) {
return Text.translatable(getTranslationKey(stack) + ".obfuscated");
}

View file

@ -6,9 +6,9 @@ import org.jetbrains.annotations.Nullable;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Multimap;
import com.minelittlepony.unicopia.InteractionManager;
import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.USounds;
import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.entity.damage.UDamageTypes;
import com.minelittlepony.unicopia.entity.mob.UEntityAttributes;
import com.minelittlepony.unicopia.entity.player.Pony;
@ -53,18 +53,15 @@ public class HorseShoeItem extends HeavyProjectileItem {
float inaccuracy = projectileInnacuracy + degradation * 30;
tooltip.add(Text.empty());
Pony pony = Unicopia.SIDE.getPony().orElse(null);
var race = InteractionManager.getInstance().getClientPony().map(Pony::getCompositeRace).orElse(null);
float speed = baseProjectileSpeed;
if (pony != null) {
var race = pony.getCompositeRace();
if (race != null) {
if (race.any(Race::canUseEarth)) {
speed += 0.5F;
}
if (!race.includes(Race.ALICORN) && race.physical().canFly()) {
speed /= 1.5F;
}
}
speed /= 1.5F;
speed *= 1 - (0.6F * degradation);

View file

@ -31,6 +31,20 @@ public interface UFoodComponents {
FoodComponent SCONE = builder(2, 0.2F).build();
FoodComponent FRIED_EGG = builder(4, 0.4F).build();
FoodComponent ROTTEN_PUFFERFISH = new FoodComponent.Builder()
.hunger(4)
.saturationModifier(0.1F)
.statusEffect(new StatusEffectInstance(StatusEffects.POISON, 1200, 1), 1)
.statusEffect(new StatusEffectInstance(StatusEffects.HUNGER, 300, 2), 1)
.statusEffect(new StatusEffectInstance(StatusEffects.NAUSEA, 300, 0), 1)
.meat()
.build();
FoodComponent COOKED_PUFFERFISH = builder(5, 0.6F)
.statusEffect(new StatusEffectInstance(StatusEffects.POISON, 1200, 1), 0.2F)
.statusEffect(new StatusEffectInstance(StatusEffects.HUNGER, 300, 2), 0.3F)
.statusEffect(new StatusEffectInstance(StatusEffects.NAUSEA, 300, 0), 0.4F)
.build();
FoodComponent WORMS = builder(1, 1.5F).alwaysEdible().meat().build();
FoodComponent INSECTS = builder(1, 0).alwaysEdible().build();

View file

@ -231,13 +231,16 @@ public interface UItems {
Item ROTTEN_COD = register("rotten_cod", new Item(new Item.Settings().food(FoodComponents.ROTTEN_FLESH)), ItemGroups.FOOD_AND_DRINK);
Item ROTTEN_SALMON = register("rotten_salmon", new Item(new Item.Settings().food(FoodComponents.ROTTEN_FLESH)), ItemGroups.FOOD_AND_DRINK);
Item ROTTEN_TROPICAL_FISH = register("rotten_tropical_fish", new Item(new Item.Settings().food(FoodComponents.ROTTEN_FLESH)), ItemGroups.FOOD_AND_DRINK);
Item ROTTEN_PUFFERFISH = register("rotten_pufferfish", new Item(new Item.Settings().food(FoodComponents.ROTTEN_FLESH)), ItemGroups.FOOD_AND_DRINK);
Item ROTTEN_PUFFERFISH = register("rotten_pufferfish", new Item(new Item.Settings().food(UFoodComponents.ROTTEN_PUFFERFISH)), ItemGroups.FOOD_AND_DRINK);
Item COOKED_TROPICAL_FISH = register("cooked_tropical_fish", new Item(new Item.Settings().food(FoodComponents.COOKED_COD)), ItemGroups.FOOD_AND_DRINK);
Item COOKED_PUFFERFISH = register("cooked_pufferfish", new Item(new Item.Settings().food(FoodComponents.COOKED_COD)), ItemGroups.FOOD_AND_DRINK);
Item COOKED_PUFFERFISH = register("cooked_pufferfish", new Item(new Item.Settings().food(UFoodComponents.COOKED_PUFFERFISH)), ItemGroups.FOOD_AND_DRINK);
Item FRIED_AXOLOTL = register("fried_axolotl", new ConsumableItem(new Item.Settings().food(FoodComponents.COOKED_CHICKEN).maxCount(1).recipeRemainder(Items.BUCKET), UseAction.EAT), ItemGroups.FOOD_AND_DRINK);
Item GREEN_FRIED_EGG = register("green_fried_egg", new Item(new Item.Settings().food(UFoodComponents.FRIED_EGG)), ItemGroups.FOOD_AND_DRINK);
Item FROG_LEGS = register("frog_legs", new Item(new Item.Settings().food(FoodComponents.CHICKEN)), ItemGroups.FOOD_AND_DRINK);
Item COOKED_FROG_LEGS = register("cooked_frog_legs", new Item(new Item.Settings().food(FoodComponents.COOKED_CHICKEN)), ItemGroups.FOOD_AND_DRINK);
Item CARAPACE = register("carapace", new Item(new Item.Settings()), ItemGroups.INGREDIENTS);
Item CLOTH_BED = register("cloth_bed", new FancyBedItem(UBlocks.CLOTH_BED, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL);
Item CLOUD_BED = register("cloud_bed", new CloudBedItem(UBlocks.CLOUD_BED, new Item.Settings().maxCount(1)), ItemGroups.FUNCTIONAL);

View file

@ -2,8 +2,8 @@ package com.minelittlepony.unicopia.item;
import java.util.List;
import com.minelittlepony.unicopia.InteractionManager;
import com.minelittlepony.unicopia.UConventionalTags;
import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.advancement.UCriteria;
import com.minelittlepony.unicopia.entity.Living;
import com.minelittlepony.unicopia.entity.damage.UDamageTypes;
@ -101,7 +101,7 @@ public class ZapAppleItem extends Item implements ChameleonItem, MultiItem {
@Override
public List<ItemStack> getDefaultStacks() {
return Unicopia.SIDE.getPony().map(Pony::asWorld)
return InteractionManager.getInstance().getClientPony().map(Pony::asWorld)
.stream()
.flatMap(world -> RegistryUtils.valuesForTag(world, UConventionalTags.Items.APPLES))
.filter(a -> a != this).map(item -> {

View file

@ -31,7 +31,7 @@ public class CloudBlockItem extends BlockItem {
@Override
public TypedActionResult<ItemStack> use(World world, PlayerEntity user, Hand hand) {
InteractionManager.instance().sendPlayerLookAngles(user);
InteractionManager.getInstance().sendPlayerLookAngles(user);
Vec3d targetPos = user.getEyePos().add(user.getRotationVec(1).multiply(1, 1.5, 1).normalize().multiply(2));
ItemPlacementContext context = new ItemPlacementContext(user, hand, user.getStackInHand(hand), new BlockHitResult(
targetPos,

View file

@ -30,7 +30,7 @@ public record MsgServerResources (
public MsgServerResources(PacketByteBuf buffer) {
this(
buffer.readMap(PacketByteBuf::readIdentifier, SpellTraits::fromPacket),
InteractionManager.instance().readChapters(buffer),
InteractionManager.getInstance().readChapters(buffer),
buffer.readMap(PacketByteBuf::readIdentifier, TreeTypeLoader.TreeTypeDef::new),
new PonyDiets(buffer)
);

View file

@ -131,7 +131,7 @@ public class MagicBeamEntity extends MagicProjectileEntity implements Caster<Mag
@Override
public void onSpawnPacket(EntitySpawnS2CPacket packet) {
super.onSpawnPacket(packet);
InteractionManager.instance().playLoopingSound(this, InteractionManager.SOUND_MAGIC_BEAM, getId());
InteractionManager.getInstance().playLoopingSound(this, InteractionManager.SOUND_MAGIC_BEAM, getId());
}
@Override

View file

@ -181,7 +181,7 @@ public class PhysicsBodyProjectileEntity extends PersistentProjectileEntity impl
BlockPos belowPos = buttonPos.down();
BlockState below = getWorld().getBlockState(belowPos);
ItemStack stack = getStack();
if (below.getBlock() instanceof HopperBlock hopper) {
if (below.getBlock() instanceof HopperBlock) {
BlockEntity e = getWorld().getBlockEntity(belowPos);
if (e instanceof Inventory inventory) {
for (int i = 0; i < inventory.size(); i++) {

View file

@ -54,7 +54,7 @@ public interface URecipes {
LootTable table = manager.getLootTable(modId);
if (table != LootTable.EMPTY) {
if (id.getPath().startsWith("blocks/")) {
if (id.getPath().startsWith("blocks/") || supplier.build().pools.length == 0) {
for (var pool : table.pools) {
supplier.pool(pool);
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -82,6 +82,8 @@
"item.unicopia.cooked_pufferfish": "Cooked Pufferfish",
"item.unicopia.fried_axolotl": "Fried Axolotl",
"item.unicopia.green_fried_egg": "Green Fried Egg",
"item.unicopia.frog_legs": "Frog's Legs",
"item.unicopia.cooked_frog_legs": "Cooked Frog's Legs",
"item.unicopia.love_bottle": "Bottle o' Love",
"item.unicopia.love_bucket": "Love Bucket",

File diff suppressed because it is too large Load diff

View file

@ -1,11 +1,9 @@
{
"block.unicopia.bed.not_safe": "Вы не можете уснуть, пока рядом есть монстры",
"block.unicopia.bed.not_tired": "Сейчас вы не чувствуете усталости",
"block.unicopia.bed.no_sleep.nocturnal": "Вы можете спать только днём или во время грозы",
"sleep.not_possible.nocturnal": "Никакой отдых не может пройти в этот день",
"sleep.skipping_day": "Проспал этот день",
"ability.unicopia.empty_hooves": "Мне нужно найти банку",
"ability.unicopia.indoors": "Я не вижу отсюда неба",
"ability.unicopia.too_low": "Мне нужно подняться повыше",
@ -14,7 +12,6 @@
"ability.unicopia.too_calm.2": "Я не чувствую злости...",
"ability.unicopia.too_calm.3": "У Брюса это выглядело проще...",
"ability.unicopia.too_calm.4": "Селестия, дай мне силы...",
"itemGroup.unicopia.items": "Unicopia",
"itemGroup.unicopia.foraging": "Unicopia - Корм",
"itemGroup.unicopia.earth_pony": "Unicopia - Понивилль",
@ -23,11 +20,9 @@
"itemGroup.unicopia.bat_pony": "Unicopia - Лощина Теней",
"itemGroup.unicopia.sea_pony": "Unicopia - Из глубин",
"itemGroup.unicopia.changeling": "Unicopia - Сырные Холмы",
"item.unicopia.friendship_bracelet": "Браслет товарищества",
"item.unicopia.friendship_bracelet.issuer": "Подписано %s",
"item.unicopia.friendship_bracelet.glowing": "Светящийся",
"item.unicopia.oak_basket": "Дубовая корзина",
"item.unicopia.spruce_basket": "Еловая корзина",
"item.unicopia.birch_basket": "Берёзовая корзина",
@ -39,20 +34,16 @@
"item.unicopia.bamboo_basket": "Бамбуковая корзина",
"item.unicopia.palm_basket": "Пальмовая корзина",
"item.unicopia.giant_balloon": "Гигантский воздушный шар",
"item.unicopia.palm_boat": "Пальмовая лодка",
"item.unicopia.palm_chest_boat": "Пальмовая лодка с сундуком",
"item.unicopia.spellbook": "Книга заклинаний",
"item.unicopia.spectral_clock": "Спектральные часы",
"emi.category.unicopia.spellbook": "Книга заклинаний",
"emi.category.unicopia.cloud_shaping": "Формоизменение",
"emi.category.unicopia.growing": "Выращивание",
"emi.category.unicopia.altar": "Тёмный ритуал",
"recipe.unicopia.altar.instruction": "Бросить предмет в огонь",
"recipe.unicopia.growing.instruction": "Сфокусировать магию земного пони",
"item.unicopia.alicorn_badge": "Эмблема аликорна",
"item.unicopia.unicorn_badge": "Эмблема единорога",
"item.unicopia.pegasus_badge": "Эмблема пегаса",
@ -61,12 +52,10 @@
"item.unicopia.bat_badge": "Эмблема бэтпони",
"item.unicopia.kirin_badge": "Эмблема кирина",
"item.unicopia.hippogriff_badge": "Эмблема гиппогрифа",
"item.unicopia.butterfly_spawn_egg": "Яйцо призыва бабочки",
"item.unicopia.butterfly": "Бабочка",
"item.unicopia.loot_bug_spawn_egg": "Яйцо призыва жука-сборщика",
"item.unicopia.loot_bug": "Жук-сборщик",
"item.unicopia.green_apple": "Яблоко Гренни Смит",
"item.unicopia.sweet_apple": "Яблоко Яблочной Аллеи",
"item.unicopia.sour_apple": "Кислое яблоко",
@ -82,11 +71,11 @@
"item.unicopia.cooked_pufferfish": "Приготовленный иглобрюх",
"item.unicopia.fried_axolotl": "Жареный аксолотль",
"item.unicopia.green_fried_egg": "Жареное зелёное яйцо",
"item.unicopia.frog_legs": "Лягушачьи лапки",
"item.unicopia.cooked_frog_legs": "Приготовленные лягушачьи лапки",
"item.unicopia.love_bottle": "Бутылочка любви",
"item.unicopia.love_bucket": "Ведро любви",
"item.unicopia.love_mug": "Кружка любви",
"item.unicopia.plunder_vine": "Чёрная лоза",
"item.unicopia.empty_jar": "Стеклянная банка",
"block.unicopia.jar": "Стеклянная банка",
@ -99,11 +88,9 @@
"block.unicopia.lightning_jar": "Молния в банке",
"item.unicopia.zap_apple_jam_jar": "Джем из зап-яблока",
"block.unicopia.zap_jar": "Банка зап-яблочного джема",
"item.unicopia.toast": "Тост",
"item.unicopia.burned_toast": "Подгоревший тост",
"item.unicopia.jam_toast": "Тост с зап-яблочным джемом",
"item.unicopia.crystal_heart": "Кристальное сердце",
"item.unicopia.crystal_shard": "Осколок кристалла",
"item.unicopia.dragon_breath_scroll": "Свиток дыхания дракона",
@ -111,26 +98,21 @@
"item.unicopia.gemstone.enchanted": "Самоцвет \"%s\"",
"item.unicopia.gemstone.obfuscated": "Загадочный самоцвет",
"item.unicopia.botched_gem": "Неудачный самоцвет",
"item.unicopia.pegasus_feather": "Перо пегаса",
"item.unicopia.gryphon_feather": "Перо грифона",
"item.unicopia.golden_feather": "Золотое перо",
"item.unicopia.golden_wing": "Золотое крыло",
"item.unicopia.mug": "Кружка",
"item.unicopia.cider": "Сидр",
"item.unicopia.juice": "Сок",
"item.unicopia.burned_juice": "Жжёный сок",
"item.unicopia.mango": "Манго",
"item.unicopia.banana": "Банан",
"item.unicopia.pineapple": "Ананас",
"item.unicopia.pineapple_crown": "Ботва ананаса",
"item.unicopia.sunglasses": "Солнцезащитные очки",
"item.unicopia.broken_sunglasses": "Сломанные солнцезащитные очки",
"item.unicopia.carapace": "Панцырь",
"item.unicopia.pebbles": "Галька",
"item.unicopia.rock": "Камень",
"item.unicopia.weird_rock": "Странный камень",
@ -147,7 +129,6 @@
"item.unicopia.apple_pie_hoof": "Яблочный пирог с отпечатком копыта",
"item.unicopia.apple_pie_slice": "Кусочек яблочного пирога",
"item.unicopia.candied_apple": "Засахаренное яблоко",
"item.unicopia.oats": "Овёс",
"item.unicopia.imported_oats": "Шикарный импортный овёс",
"item.unicopia.oatmeal": "Овсянка",
@ -165,32 +146,26 @@
"item.unicopia.chocolate_oatmeal_cookie": "Шоколадное овсяное печенье",
"item.unicopia.pinecone_cookie": "Печенье из шишек",
"item.unicopia.bowl_of_nuts": "Миска с орехами",
"item.unicopia.pegasus_amulet": "Крылья Икара",
"item.unicopia.pegasus_amulet.lore": "Дарует временный полёт тому, кто носит его",
"item.unicopia.amulet.energy": "Энергия: %d / %d",
"item.unicopia.alicorn_amulet": "Амулет аликорна",
"item.unicopia.alicorn_amulet.lore": "Время ношения: %d",
"item.unicopia.pearl_necklace": "Жемчужное ожерелье",
"item.unicopia.pearl_necklace.lore": "Наделяет владельца подводными способностями",
"item.unicopia.clam_shell": "Раковина моллюска",
"item.unicopia.scallop_shell": "Раковина гребешка",
"item.unicopia.turret_shell": "Раковина туррителлы",
"item.unicopia.shelly": "Шелли",
"item.unicopia.horse_shoe.accuracy": "Точность: %d%%",
"item.unicopia.horse_shoe.speed": "Скорость: %d",
"item.unicopia.iron_horse_shoe": "Железная подкова",
"item.unicopia.golden_horse_shoe": "Золотая подкова",
"item.unicopia.copper_horse_shoe": "Медная подкова",
"item.unicopia.netherite_horse_shoe": "Незеритовая подкова",
"item.unicopia.broken_alicorn_amulet": "Сломанный амулет аликорна",
"item.unicopia.unicorn_amulet": "Амулет единорога",
"item.unicopia.unicorn_amulet.lore": "Наделяет носящего магическими способностями",
"item.unicopia.grogars_bell": "Колокольчик Грогара",
"item.unicopia.grogars_bell.charges": "Заряды: %d / %d",
"item.unicopia.magic_staff": "Волшебный посох",
@ -198,23 +173,20 @@
"item.unicopia.magic_staff.charges": "Заряды: %d / %d",
"item.unicopia.meadowbrooks_staff": "Посох Медоубрук",
"item.unicopia.meadowbrooks_staff.lore": "Тяжёлая палка",
"item.unicopia.wooden_polearm": "Деревянное копьё",
"item.unicopia.stone_polearm": "Каменное копьё",
"item.unicopia.iron_polearm": "Железное копьё",
"item.unicopia.golden_polearm": "Золотое копьё",
"item.unicopia.diamond_polearm": "Алмазное копьё",
"item.unicopia.netherite_polearm": "Незеритовое копьё",
"item.unicopia.music_disc_pet": "Пластинка",
"item.unicopia.music_disc_pet.desc": "Дэниел Инграм - pet",
"item.unicopia.music_disc_pet.desc": "Daniel Ingram - pet",
"item.unicopia.music_disc_popular": "Пластинка",
"item.unicopia.music_disc_popular.desc": "Дэниел Инграм - popular",
"item.unicopia.music_disc_crusade": "Пластинка",
"item.unicopia.music_disc_crusade.desc": "Дэниел Инграм - crusade",
"item.unicopia.music_disc_crusade.desc": "Daniel Ingram - crusade",
"item.unicopia.music_disc_funk": "Пластинка",
"item.unicopia.music_disc_funk.desc": "Фанк, просто фанк",
"item.unicopia.cloud_lump": "Облачный ком",
"item.unicopia.white_bed_sheets": "Белая простынь",
"item.unicopia.light_gray_bed_sheets": "Светло-серая простынь",
@ -241,7 +213,6 @@
"item.unicopia.rainbow_bpy_bed_sheets": "Простынь с радужным СРЖ узором",
"item.unicopia.rainbow_pbg_bed_sheets": "Простынь с радужным ФСЧ узором",
"item.unicopia.rainbow_pwr_bed_sheets": "Простынь с радужным РБК узором",
"block.unicopia.rocks": "Камни",
"block.unicopia.plunder_vine": "Чёрная лоза",
"block.unicopia.plunder_vine_bud": "Бутон чёрной лозы",
@ -304,11 +275,9 @@
"block.unicopia.mango_sapling": "Саженец мангового дерева",
"block.unicopia.potted_mango_sapling": "Саженец манго в горшке",
"block.unicopia.pineapple": "Ананас",
"block.unicopia.clam_shell": "Раковина моллюска",
"block.unicopia.scallop_shell": "Раковина гребешка",
"block.unicopia.turret_shell": "Раковина туррителлы",
"block.unicopia.green_apple_leaves": "Листья яблони Гренни Смит",
"block.unicopia.green_apple_sapling": "Саженец яблони Гренни Смит",
"block.unicopia.potted_green_apple_sapling": "Саженец яблони Гренни Смит в горшке",
@ -321,7 +290,6 @@
"block.unicopia.sour_apple_sapling": "Саженец кислой яблони",
"block.unicopia.potted_sour_apple_sapling": "Саженец кислой яблони в горшке",
"block.unicopia.sour_apple_sprout": "Росток кислой яблони",
"block.unicopia.surface_chitin": "Поверхностный хитин",
"block.unicopia.mysterious_egg": "Загадочное яйцо",
"block.unicopia.hive": "Улей",
@ -332,7 +300,6 @@
"block.unicopia.chiselled_chitin_hull": "Резной хитиновый остов",
"block.unicopia.chiselled_chitin_slab": "Резная хитиновая плита",
"block.unicopia.chiselled_chitin_stairs": "Резные хитиновые ступеньки",
"block.unicopia.shaping_bench": "Стенд формоизменения",
"block.unicopia.cloud": "Облако",
"block.unicopia.cloud_slab": "Плита из облака",
@ -368,11 +335,9 @@
"block.unicopia.crystal_door": "Кристальная дверь",
"block.unicopia.stable_door": "Дверь конюшни",
"block.unicopia.dark_oak_stable_door": "Деревянная дверь конюшни",
"block.unicopia.oats": "Овёс",
"block.unicopia.oats_stem": "Овёс",
"block.unicopia.oats_crown": "Овёс",
"entity.unicopia.butterfly": "Бабочка",
"entity.unicopia.twittermite": "Твиттермит",
"entity.unicopia.specter": "Призрак",
@ -386,22 +351,18 @@
"entity.unicopia.crystal_shards": "Кристальные осколки",
"entity.unicopia.ignominious_vine": "Позорная лоза",
"entity.unicopia.ignominious_bulb": "Позорная лампочка",
"player.reachDistance": "Расстояние до цели",
"player.miningSpeed": "Скорость добычи",
"player.gravityModifier": "Гравитация",
"unicopia.effect.tribe.stage.initial": "Похоже, что эффекта нет",
"unicopia.effect.tribe.stage.crawling": "Вы чувствуете, как кожа ползёт по спине",
"unicopia.effect.tribe.stage.determination": "По мере того, как ваши кости выравниваются, вы наполняетесь решимостью",
"unicopia.effect.tribe.stage.resurection": "Зная то, что вы вернетесь в этот мир как %s",
"effect.unicopia.food_poisoning": "Пищевое отравление",
"effect.unicopia.sun_blindness": "Солнечная слепота",
"effect.unicopia.corrupt_influence": "Испорченное влияние",
"effect.unicopia.paralysis": "Паралич",
"effect.unicopia.butter_fingers": "Растяпа",
"effect.unicopia.change_race_earth": "Метаморфозы земного пони",
"effect.unicopia.change_race_unicorn": "Метаморфозы единорога",
"effect.unicopia.change_race_pegasus": "Метаморфозы пегаса",
@ -409,7 +370,6 @@
"effect.unicopia.change_race_bat": "Метаморфозы бэтпони",
"effect.unicopia.change_race_kirin": "Метаморфозы кирина",
"effect.unicopia.change_race_hippogriff": "Метаморфозы гиппогрифа",
"effect.unicopia.morph_race_earth": "Превращение в земного пони",
"effect.unicopia.morph_race_unicorn": "Превращение в единорога",
"effect.unicopia.morph_race_pegasus": "Превращение в пегаса",
@ -417,115 +377,92 @@
"effect.unicopia.morph_race_bat": "Превращение в бэтпони",
"effect.unicopia.morph_race_kirin": "Превращение в кирина",
"effect.unicopia.morph_race_hippogriff": "Превращение в гиппогрифа",
"item.minecraft.potion.effect.unicopia.tribe_swap_earth": "Зелье метаморфоз земного пони",
"item.minecraft.splash_potion.effect.unicopia.tribe_swap_earth": "Взрывное зелье метаморфоз земного пони",
"item.minecraft.lingering_potion.effect.unicopia.tribe_swap_earth": "Туманное зелье метаморфоз земного пони",
"item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_earth": "Стрела метаморфоз земного пони",
"item.minecraft.potion.effect.unicopia.tribe_swap_unicorn": "Зелье метаморфоз единорога",
"item.minecraft.splash_potion.effect.unicopia.tribe_swap_unicorn": "Взрывное зелье метаморфоз единорога",
"item.minecraft.lingering_potion.effect.unicopia.tribe_swap_unicorn": "Туманное зелье метаморфоз единорога",
"item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_unicorn": "Стрела метаморфоз единорога",
"item.minecraft.potion.effect.unicopia.tribe_swap_pegasus": "Зелье метаморфоз пегаса",
"item.minecraft.splash_potion.effect.unicopia.tribe_swap_pegasus": "Взрывное зелье метаморфоз пегаса",
"item.minecraft.lingering_potion.effect.unicopia.tribe_swap_pegasus": "Туманное зелье метаморфоз пегаса",
"item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_pegasus": "Стрела метаморфоз пегаса",
"item.minecraft.potion.effect.unicopia.tribe_swap_changeling": "Зелье метаморфоз чейнджлинга",
"item.minecraft.splash_potion.effect.unicopia.tribe_swap_changeling": "Взрывное зелье метаморфоз чейнджлинга",
"item.minecraft.lingering_potion.effect.unicopia.tribe_swap_changeling": "Туманное зелье метаморфоз чейнджлинга",
"item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_changeling": "Стрела метаморфоз чейнджлинга",
"item.minecraft.potion.effect.unicopia.tribe_swap_bat": "Зелье метаморфоз бэтпони",
"item.minecraft.splash_potion.effect.unicopia.tribe_swap_bat": "Взрывное зелье метаморфоз бэтпони",
"item.minecraft.lingering_potion.effect.unicopia.tribe_swap_bat": "Туманное зелье метаморфоз бэтпони",
"item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_bat": "Стрела метаморфоз бэтпони",
"item.minecraft.potion.effect.unicopia.tribe_swap_kirin": "Зелье метаморфоз кирина",
"item.minecraft.splash_potion.effect.unicopia.tribe_swap_kirin": "Взрывное зелье метаморфоз кирина",
"item.minecraft.lingering_potion.effect.unicopia.tribe_swap_kirin": "Туманное зелье метаморфоз кирина",
"item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_kirin": "Стрела метаморфоз кирина",
"item.minecraft.potion.effect.unicopia.tribe_swap_hippogriff": "Зелье метаморфоз гиппогрифа",
"item.minecraft.splash_potion.effect.unicopia.tribe_swap_hippogriff": "Взрывное зелье метаморфоз гиппогрифа",
"item.minecraft.lingering_potion.effect.unicopia.tribe_swap_hippogriff": "Туманное зелье метаморфоз гиппогрифа",
"item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_hippogriff": "Стрела метаморфоз гиппогрифа",
"item.minecraft.potion.effect.unicopia.short_morph_earth": "Зелье быстрого превращения в земного пони",
"item.minecraft.splash_potion.effect.unicopia.short_morph_earth": "Взрывное зелье быстрого превращения в земного пони",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_earth": "Туманное зелье быстрого превращения в земного пони",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_earth": "Стрела быстрого превращения в земного пони",
"item.minecraft.potion.effect.unicopia.short_morph_unicorn": "Зелье быстрого превращения в единорога",
"item.minecraft.splash_potion.effect.unicopia.short_morph_unicorn": "Взрывное зелье быстрого превращения в единорога",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_unicorn": "Туманное зелье быстрого превращения в единорога",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_unicorn": "Стрела быстрого превращения в единорога",
"item.minecraft.potion.effect.unicopia.short_morph_pegasus": "Зелье быстрого превращения в пегаса",
"item.minecraft.splash_potion.effect.unicopia.short_morph_pegasus": "Взрывное зелье быстрого превращения в пегаса",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_pegasus": "Туманное зелье быстрого превращения в пегаса",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_pegasus": "Стрела быстрого превращения в пегаса",
"item.minecraft.potion.effect.unicopia.short_morph_changeling": "Зелье быстрого превращения в чейнджлинга",
"item.minecraft.splash_potion.effect.unicopia.short_morph_changeling": "Взрывное зелье быстрого превращения в чейнджлинга",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_changeling": "Туманное зелье быстрого превращения в чейнджлинга",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_changeling": "Стрела быстрого превращения в чейнджлинга",
"item.minecraft.potion.effect.unicopia.short_morph_bat": "Зелье быстрого превращения в бэтпони",
"item.minecraft.splash_potion.effect.unicopia.short_morph_bat": "Взрывное зелье быстрого превращения в бэтпони",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_bat": "Туманное зелье быстрого превращения в бэтпони",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_bat": "Стрела быстрого превращения в бэтпони",
"item.minecraft.potion.effect.unicopia.short_morph_kirin": "Зелье быстрого превращения в кирина",
"item.minecraft.splash_potion.effect.unicopia.short_morph_kirin": "Взрывное зелье быстрого превращения в кирина",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_kirin": "Туманное зелье быстрого превращения в кирина",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_kirin": "Стрела быстрого превращения в кирина",
"item.minecraft.potion.effect.unicopia.short_morph_hippogriff": "Зелье быстрого превращения в гиппогрифа",
"item.minecraft.splash_potion.effect.unicopia.short_morph_hippogriff": "Взрывное зелье быстрого превращения в гиппогрифа",
"item.minecraft.lingering_potion.effect.unicopia.short_morph_hippogriff": "Туманное зелье быстрого превращения в гиппогрифа",
"item.minecraft.tipped_arrow.effect.unicopia.short_morph_hippogriff": "Стрела быстрого превращения в гиппогрифа",
"item.minecraft.potion.effect.unicopia.long_morph_earth": "Зелье долгого превращения в земного пони",
"item.minecraft.splash_potion.effect.unicopia.long_morph_earth": "Взрывное зелье долгого превращения в земного пони",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_earth": "Туманное зелье долгого превращения в земного пони",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_earth": "Стрела долгого превращения в земного пони",
"item.minecraft.potion.effect.unicopia.long_morph_unicorn": "Зелье долгого превращения в единорога",
"item.minecraft.splash_potion.effect.unicopia.long_morph_unicorn": "Взрывное зелье долгого превращения в единорога",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_unicorn": "Туманное зелье долгого превращения в единорога",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_unicorn": "Стрела долгого превращения в единорога",
"item.minecraft.potion.effect.unicopia.long_morph_pegasus": "Зелье долгого превращения в пегаса",
"item.minecraft.splash_potion.effect.unicopia.long_morph_pegasus": "Взрывное зелье долгого превращения в пегаса",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_pegasus": "Туманное зелье долгого превращения в пегаса",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_pegasus": "Стрела долгого превращения в пегаса",
"item.minecraft.potion.effect.unicopia.long_morph_changeling": "Зелье долгого превращения в чейнджлинга",
"item.minecraft.splash_potion.effect.unicopia.long_morph_changeling": "Взрывное зелье долгого превращения в чейнджлинга",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_changeling": "Туманное зелье долгого превращения в чейнджлинга",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_changeling": "Стрела долгого превращения в чейнджлинга",
"item.minecraft.potion.effect.unicopia.long_morph_bat": "Зелье долгого превращения в бэтпони",
"item.minecraft.splash_potion.effect.unicopia.long_morph_bat": "Взрывное зелье долгого превращения в бэтпони",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_bat": "Туманное зелье долгого превращения в бэтпони",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_bat": "Стрела долгого превращения в бэтпони",
"item.minecraft.potion.effect.unicopia.long_morph_kirin": "Зелье долгого превращения в кирина",
"item.minecraft.splash_potion.effect.unicopia.long_morph_kirin": "Взрывное зелье долгого превращения в кирина",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_kirin": "Туманное зелье долгого превращения в кирина",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_kirin": "Стрела долгого превращения в кирина",
"item.minecraft.potion.effect.unicopia.long_morph_hippogriff": "Зелье долгого превращения в гиппогрифа",
"item.minecraft.splash_potion.effect.unicopia.long_morph_hippogriff": "Взрывное зелье долгого превращения в гиппогрифа",
"item.minecraft.lingering_potion.effect.unicopia.long_morph_hippogriff": "Туманное зелье долгого превращения в гиппогрифа",
"item.minecraft.tipped_arrow.effect.unicopia.long_morph_hippogriff": "Стрела долгого превращения в гиппогрифа",
"potion.withChance": "Шанс 1 к %s получить %s",
"potion.potency.6": "VII",
"spell.unicopia.frost": "Заморозка",
"spell.unicopia.frost.lore": "Холодный на ощупь, этот самоцвет заморозит всё, на что он будет использован",
"spell.unicopia.hydrophobic": "Отталкивание воды",
@ -576,7 +513,6 @@
"spell.unicopia.catapult.lore": "Хватает ближайший блок или объект и подбрасывает его в воздух",
"spell.unicopia.dispel_evil": "Изгнание зла",
"spell.unicopia.dispel_evil.lore": "Изгоняет все находящиеся поблизости неземные силы",
"trait.unicopia.strength.name": "Силы",
"trait.unicopia.strength.description": "Наделяет физической силой или повышает выносливость.\nЗаклинания с большим количеством силы бьют сильнее и действуют дольше.",
"trait.unicopia.focus.name": "Фокусировки",
@ -617,7 +553,6 @@
"trait.unicopia.life.description": "Воплощает энергию, которая живёт внутри всех живых существ.",
"trait.unicopia.poison.name": "Яда",
"trait.unicopia.poison.description": "Смертоносный дротик убивает зверя",
"unicopia.diet.information": "Информация о диете:",
"unicopia.diet.side_effects": "Побочные эффекты:",
"unicopia.diet.not_edible": "Предмет не съедобен",
@ -626,7 +561,6 @@
"unicopia.diet.saturation.detailed": "Насыщения получено: %s из %s (%s%%)",
"unicopia.diet.hunger": "Коэффициент голода: %s%%",
"unicopia.diet.saturation": "Коэффициент насыщения: %s%%",
"food_group.unicopia.meat.rotten": "Гниющее мясо",
"food_group.unicopia.meat.raw": "Свежее мясо",
"food_group.unicopia.meat.cooked": "Готовое мясо",
@ -664,18 +598,15 @@
"food_group.unicopia.foraging.dangerous": "Опасное",
"food_group.unicopia.foraging.blinding": "Токсичное",
"food_group.unicopia.foraging.leafy_greens": "Листовая зелень",
"toxicity.safe.name": "Безопасное",
"toxicity.mild.name": "Слаботоксичное",
"toxicity.fair.name": "Достаточно токсичное",
"toxicity.severe.name": "Токсичное",
"toxicity.lethal.name": "Смертельное",
"affliction.unicopia.empty": "Нет эффекта",
"affliction.unicopia.healing": "Восполняет %s%% здоровья",
"affliction.unicopia.cure_love_sickness": "Лечит от любовной болезни",
"affliction.unicopia.lose_hunger": "Теряет %s%% сытости",
"ability.unicopia.shoot": "Стрелять магией",
"ability.unicopia.shoot.with_spell": "Стрелять \"%s\"",
"ability.unicopia.shoot.with_spell.active": "Стрельба \"%s\"",
@ -719,23 +650,18 @@
"ability.unicopia.dash": "Рывок",
"ability.unicopia.change_form": "Изменить форму",
"ability.unicopia.sonar_pulse": "Сонарный импульс",
"gui.unicopia.trait.label": "Элемент %s",
"gui.unicopia.trait.group": "\n %s",
"gui.unicopia.trait.corruption": "\n %s порчи",
"gui.unicopia.dispell_screen.cancel": "Нажмите ESC для выхода",
"gui.unicopia.dispell_screen.spell_type": "Тип заклинания: %s",
"gui.unicopia.dispell_screen.affinity": "Сродство: %s",
"gui.unicopia.dispell_screen.time_left": "Времени осталось: %s",
"gui.unicopia.dispell_screen.discard": "[Нажмите для отмены]",
"gui.unicopia": "Unicopia...",
"gui.unicopia.page_num": "%d из %d",
"respawn.reason.joined_new_tribe": "%1$s был перерождён как %2$s",
"respawn.reason.illegal_race": "Раса %s не разрешена конфигурацией вашего сервера.",
"gui.unicopia.tribe_selection.respawn": "Вы умерли.",
"gui.unicopia.tribe_selection.respawn.journey": "Но конец - это еще не всё, потому что в конце каждого конца есть другое начало.",
"gui.unicopia.tribe_selection.respawn.choice": "Выбирайте мудро, потому что выбор, который вы сделаете сейчас, изменит мир вокруг вас и пути, по которым вы можете пойти.",
@ -745,7 +671,6 @@
"gui.unicopia.tribe_selection.preference": "Ваше текущее предпочитаемое племя установлено на %s.",
"gui.unicopia.tribe_selection.options": "Доступные племена:",
"gui.unicopia.tribe_selection.options.disabled": "Опция недоступна",
"gui.unicopia.tribe_selection.describe.unicopia.earth": "Присоединяйтесь к племени земных пони",
"gui.unicopia.tribe_selection.describe.unicopia.unicorn": "Присоединитесь к племени единорогов, овладейте магическими искусствами",
"gui.unicopia.tribe_selection.describe.unicopia.pegasus": "Присоединяйтесь к племени пегасов, парите вместе с Вондерболтами",
@ -753,14 +678,11 @@
"gui.unicopia.tribe_selection.describe.unicopia.kirin": "Присоединяйтесь к Деревне Киринов, дайте обет молчания",
"gui.unicopia.tribe_selection.describe.unicopia.hippogriff": "Присоединяйтесь к племени гиппогрифов, кричите на своих соседей",
"gui.unicopia.tribe_selection.describe.unicopia.changeling": "Присоединяйтесь к Улью Чейнджлингов, ваша королева требует этого",
"gui.unicopia.tribe_selection.confirm": "Вы выбрали племя \"%s\"",
"gui.unicopia.tribe_selection.confirm.goods": "%s имеют следующие преимущества:",
"gui.unicopia.tribe_selection.confirm.goods.1.unicopia.human": " - Всеядны и могут есть все виды пищи, кроме любви",
"gui.unicopia.tribe_selection.confirm.goods.2.unicopia.human": " - Противоположные большие пальцы",
"gui.unicopia.tribe_selection.confirm.goods.3.unicopia.human": " - Ходят прямо",
"gui.unicopia.tribe_selection.confirm.goods.1.unicopia.earth": " - Более сильная отдача и сопротивление магии",
"gui.unicopia.tribe_selection.confirm.goods.2.unicopia.earth": " - Дополнительный вес делает их эффективными против магии и грубой силы",
"gui.unicopia.tribe_selection.confirm.goods.3.unicopia.earth": " - Особая связь с землёй, которая делает земледелие на 10,000% эффективнее!",
@ -768,82 +690,65 @@
"gui.unicopia.tribe_selection.confirm.goods.5.unicopia.earth": " - Единственные, кто может обняться с крипером и выжить",
"gui.unicopia.tribe_selection.confirm.goods.6.unicopia.earth": " - Могут есть камни",
"gui.unicopia.tribe_selection.confirm.goods.7.unicopia.earth": " - Милые висячие пони-ушки",
"gui.unicopia.tribe_selection.confirm.goods.1.unicopia.unicorn": " - Телепортация и магические заклинания",
"gui.unicopia.tribe_selection.confirm.goods.2.unicopia.unicorn": " - Исследуют и создают магические артефакты, усиливающие их способности",
"gui.unicopia.tribe_selection.confirm.goods.3.unicopia.unicorn": " - Могут использовать магию для обнаружения или раскрытия находящихся поблизости чейнджлингов",
"gui.unicopia.tribe_selection.confirm.goods.4.unicopia.unicorn": " - Имеют заостренные палки на голове",
"gui.unicopia.tribe_selection.confirm.goods.1.unicopia.pegasus": " - Полёт и способность к тренировкам для повышения выносливости",
"gui.unicopia.tribe_selection.confirm.goods.2.unicopia.pegasus": " - Используют накопленную ману для выполнения мощной звуковой радуги",
"gui.unicopia.tribe_selection.confirm.goods.3.unicopia.pegasus": " - Двигаются быстрее и получают меньше урона от падения",
"gui.unicopia.tribe_selection.confirm.goods.4.unicopia.pegasus": " - Можно напрямую взаимодействовать с облачными предметами и блоками",
"gui.unicopia.tribe_selection.confirm.goods.5.unicopia.pegasus": " - Могут есть овощи и некоторые виды рыбы",
"gui.unicopia.tribe_selection.confirm.goods.1.unicopia.bat": " - Полёт и способность к тренировкам для повышения выносливости",
"gui.unicopia.tribe_selection.confirm.goods.2.unicopia.bat": " - Лучше видят ночью",
"gui.unicopia.tribe_selection.confirm.goods.3.unicopia.bat": " - Способность цепляться за нижнюю часть блоков",
"gui.unicopia.tribe_selection.confirm.goods.4.unicopia.bat": " - Имеют ужасающий, но очаровательный (и слегка раздражающий) визг",
"gui.unicopia.tribe_selection.confirm.goods.1.unicopia.changeling": " - Могут летать и зависать на месте",
"gui.unicopia.tribe_selection.confirm.goods.2.unicopia.changeling": " - Перевоплощаются практически в кого и что угодно",
"gui.unicopia.tribe_selection.confirm.goods.3.unicopia.changeling": " - Прилипают к стенам и могут перелезть практически через всё",
"gui.unicopia.tribe_selection.confirm.goods.4.unicopia.changeling": " - Плотоядны. Могут есть всё, от чего не тошнит",
"gui.unicopia.tribe_selection.confirm.goods.1.unicopia.kirin": " - Невосприимчивы ко всем видам огненного урона",
"gui.unicopia.tribe_selection.confirm.goods.2.unicopia.kirin": " - Могут открыть способность ярости, получая урон",
"gui.unicopia.tribe_selection.confirm.goods.3.unicopia.kirin": " - В обычном состоянии бесшумны и могут спокойно ходить рядом с Хранителем",
"gui.unicopia.tribe_selection.confirm.goods.4.unicopia.kirin": " - Могут есть фрукты и овощи, мясо и некоторые виды кормов, обычно ядовитые для других рас",
"gui.unicopia.tribe_selection.confirm.goods.1.unicopia.hippogriff": " - Полёт и способность к тренировкам для повышения выносливости",
"gui.unicopia.tribe_selection.confirm.goods.2.unicopia.hippogriff": " - Могут совершать рывки в полёте",
"gui.unicopia.tribe_selection.confirm.goods.3.unicopia.hippogriff": " - Имеют острый и шумный клюв для кричания и клевания",
"gui.unicopia.tribe_selection.confirm.goods.4.unicopia.hippogriff": " - Могут употреблять сырую и варёную рыбу, варёное мясо",
"gui.unicopia.tribe_selection.confirm.goods.5.unicopia.hippogriff": " - При поедании шишек восстанавливают здоровье",
"gui.unicopia.tribe_selection.confirm.goods.6.unicopia.hippogriff": " - Любят лестницы",
"gui.unicopia.tribe_selection.confirm.bads": "но они...",
"gui.unicopia.tribe_selection.confirm.bads.1.unicopia.human": " - Не имеют никаких магических способностей",
"gui.unicopia.tribe_selection.confirm.bads.2.unicopia.human": " - Требуют элитры для полёта",
"gui.unicopia.tribe_selection.confirm.bads.3.unicopia.human": " - Должны выращивают пищу по старинке, с помощью тяжёлой работы и ручного труда",
"gui.unicopia.tribe_selection.confirm.bads.4.unicopia.human": " - Не имеют висячих ушей",
"gui.unicopia.tribe_selection.confirm.bads.1.unicopia.earth": " - Не могут летать",
"gui.unicopia.tribe_selection.confirm.bads.2.unicopia.earth": " - Слабы к некоторым видам магии",
"gui.unicopia.tribe_selection.confirm.bads.3.unicopia.earth": " - Могут есть только растения и овощи",
"gui.unicopia.tribe_selection.confirm.bads.4.unicopia.earth": " - Тяжелее и передвигаются медленнее, чем другие пони",
"gui.unicopia.tribe_selection.confirm.bads.1.unicopia.unicorn": " - Не могут летать",
"gui.unicopia.tribe_selection.confirm.bads.2.unicopia.unicorn": " - Слабы к грубым атакам",
"gui.unicopia.tribe_selection.confirm.bads.3.unicopia.unicorn": " - Могут есть только растения и овощи",
"gui.unicopia.tribe_selection.confirm.bads.1.unicopia.pegasus": " - Слабы к грубым атакам",
"gui.unicopia.tribe_selection.confirm.bads.2.unicopia.pegasus": " - Должны отдыхать между полётами",
"gui.unicopia.tribe_selection.confirm.bads.3.unicopia.pegasus": " - Не могут использовать магию без помощи",
"gui.unicopia.tribe_selection.confirm.bads.1.unicopia.bat": " - Слабы к грубым атакам",
"gui.unicopia.tribe_selection.confirm.bads.2.unicopia.bat": " - Должны отдыхать между полётами",
"gui.unicopia.tribe_selection.confirm.bads.3.unicopia.bat": " - Иногда боятся даже самих себя",
"gui.unicopia.tribe_selection.confirm.bads.4.unicopia.bat": " - Плотоядны. Могут есть сырое и варёное мясо или питаться исключительно ворованной любовью",
"gui.unicopia.tribe_selection.confirm.bads.1.unicopia.changeling": " - Постоянно голодают",
"gui.unicopia.tribe_selection.confirm.bads.2.unicopia.changeling": " - Требуют любви, которую собирают с пони или других мобов для поддержания своего рациона",
"gui.unicopia.tribe_selection.confirm.bads.3.unicopia.changeling": " - Становятся больными от употребления самой обычной пищи и должны собирать любовь, чтобы ускорить излечение",
"gui.unicopia.tribe_selection.confirm.bads.1.unicopia.kirin": " - Теряют свою бесшумность в состоянии ярости",
"gui.unicopia.tribe_selection.confirm.bads.2.unicopia.kirin": " - Поджигают вещи, особенно когда близки к ярости",
"gui.unicopia.tribe_selection.confirm.bads.3.unicopia.kirin": " - Легче, чем другие пони, и сильнее оттакливаются",
"gui.unicopia.tribe_selection.confirm.bads.4.unicopia.kirin": " - Не любят воду",
"gui.unicopia.tribe_selection.confirm.bads.1.unicopia.hippogriff": " - Слабы к грубым атакам",
"gui.unicopia.tribe_selection.confirm.bads.2.unicopia.hippogriff": " - Не могут взаимодействовать с облаками",
"gui.unicopia.tribe_selection.confirm.bads.3.unicopia.hippogriff": " - Должны отдыхать между полётами, чтобы восстановить силы",
"gui.unicopia.tribe_selection.confirm.bads.4.unicopia.hippogriff": " - Имеют куриный мозг",
"gui.unicopia.tribe_selection.join": "Присоединиться",
"gui.unicopia.tribe_selection.cancel": "Назад",
"gui.unicopia.spellbook.empty_spell_slot": "Пустой слот для заклинаний",
"gui.unicopia.spellbook.page.inventory": "Инвентарь",
"gui.unicopia.spellbook.page.recipes": "Рецепты",
@ -853,7 +758,6 @@
"gui.unicopia.spellbook.page.requirements.entry.item": "- %1$sx %2$s",
"gui.unicopia.spellbook.page.requirements.entry.trait": "- Не менее %1$sx черт %2$s",
"gui.unicopia.spellbook.page.requirements.entry.spell": "- %1$sx самоцвет \"%2$s\"",
"gui.unicopia.spellbook.recipe.requires": "Требования:",
"gui.unicopia.spellbook.author1.sign_off": "По приказу принцессы",
"gui.unicopia.spellbook.author1.sign_off.b": "По приказу принцессы, так ужасно сожалея",
@ -891,7 +795,6 @@
"gui.unicopia.spellbook.chapter.introduction.p9.title": "13-ое Мэйра 12-го",
"gui.unicopia.spellbook.chapter.introduction.p9.1.body": "Извините за долгую задержку с обновлениями. Я много работал, изучая различные заклинания и определяя свой подход.",
"gui.unicopia.spellbook.chapter.introduction.p9.2.body": "Огонь становится очень интересным аспектом, учитывая, что черты для него легко доступны.",
"gui.unicopia.spellbook.chapter.fire.p1.title": "Гл.2 - Магия огня",
"gui.unicopia.spellbook.chapter.fire.p2.title": "9-ое Пониюня 12-го",
"gui.unicopia.spellbook.chapter.fire.p2.1.body": "Это заняло больше времени, чем я ожидал, - почти месяц! Ха! Но я представляю тебе, дорогой читатель, свои находки для первой элементарной формы магии: ОГОНЬ.",
@ -945,7 +848,6 @@
"gui.unicopia.spellbook.chapter.fire.p18.title": "Черновик: 9-ое Пониюня 12-го",
"gui.unicopia.spellbook.chapter.fire.p18.1.body": "Магия огня оказалась немного более... непредсказуемой. Каждый раз, когда я делаю успехи, она находит способ отбросить меня назад.",
"gui.unicopia.spellbook.chapter.fire.p18.2.body": "Но я не могу остановиться... Мне сказали, что ситуация на западе становится всё более ужасной. Они попросили меня ускорить темп и создать что-то, что мы сможем использовать, чтобы одержать верх над §kШтормом Чейнджлингов§r.",
"gui.unicopia.spellbook.chapter.ice.p1.title": "Гл.1 - Магия льда",
"gui.unicopia.spellbook.chapter.ice.p2.title": "4-ое Пониюля 12-го",
"gui.unicopia.spellbook.chapter.ice.p2.1.body": "А вот это интересная штучка. Довольно простая, признаюсь, но Луна настояла, чтобы я сделал что-нибудь холодное, чтобы помочь нам справиться с этой проклятой жарой.",
@ -1013,7 +915,6 @@
"gui.unicopia.spellbook.chapter.ice.hydrophobic.2.body": "Я называю это отталкиванием воды, потому что оно именно так и действует: Отталкивает воду от заклинателя.",
"gui.unicopia.spellbook.chapter.ice.hydrophobic.modifier.1": "* Добавив больше фокусировки, вы можете увеличить продолжительность заклинания.",
"gui.unicopia.spellbook.chapter.ice.hydrophobic.modifier.2": "* Добавьте черту щедрости, чтобы привязать это заклинание к месту, а не к себе.",
"gui.unicopia.spellbook.chapter.air.p1.title": "Гл.4 - Магия воздуха",
"gui.unicopia.spellbook.chapter.air.p2.title": "1-ое Хуфгуста 12-го",
"gui.unicopia.spellbook.chapter.air.p1.1.body": "Новый месяц, новая глава. Малышке Луне надоело сидеть в башне целый день (да и кто её винит? Мы выполняем это задание уже больше двух месяцев.)",
@ -1058,7 +959,6 @@
"gui.unicopia.spellbook.chapter.air.p15.2.body": "Мне пришлось всё время следить за тем, чтобы Луна не выпала, и, конечно, отвечать на вопросы о разных видах облаков. К счастью, оператор воздушного шара был рядом, чтобы помочь разобраться в тонкостях.",
"gui.unicopia.spellbook.chapter.air.p15.3.body": "Находясь здесь, над всеми нашими проблемами, я на мгновение забываю об остальном мире. Это возвращает меня в более простые времена, до...",
"gui.unicopia.spellbook.chapter.air.p15.4.body": "Конечно, вспышки взрывов на западе должны были всё испортить. Кажется, на горизонте надвигается буря. Я очень надеюсь, что это не будет плохим предзнаменованием...",
"gui.unicopia.spellbook.chapter.dark_magic.p1.title": "Гл.5 - Арканная магия",
"gui.unicopia.spellbook.chapter.dark_magic.p2.title": "30-ое Хуфгуста 12-го",
"gui.unicopia.spellbook.chapter.dark_magic.p2.1.body": "Сегодня пришло новое письмо от короны. Похоже, ситуация на западе ухудшается, и хотя до сих пор они были довольны моей работой, теперь они давят на меня, чтобы я создал что-то более разрушительное.",
@ -1141,7 +1041,6 @@
"gui.unicopia.spellbook.chapter.dark_magic.p27.4.body": "Нет, не может быть.",
"gui.unicopia.spellbook.chapter.dark_magic.p28.1.body": "Я нашёл это заклинание под старыми записями во время уборки лаборатории. Оно... простое и сложное в обращении, но оно справляется со своей задачей.",
"gui.unicopia.spellbook.chapter.dark_magic.dispel_evil.modifier.1": "* Добавьте черту силы для увеличения дальности действия.",
"gui.unicopia.spellbook.chapter.otherworldly.p1.title": "Гл.6 - Потустороннее",
"gui.unicopia.spellbook.chapter.otherworldly.p2.title": "1-ое Круптября 12-го",
"gui.unicopia.spellbook.chapter.otherworldly.p2.1.body": "Эта глава служит исследованием миров за пределами нашего собственного и погружением в то, чего большинство единорогов обычно сторонятся.",
@ -1156,7 +1055,6 @@
"gui.unicopia.spellbook.chapter.otherworldly.mind_swap.1.body": "Продолжая исследования способностей чейнджлингов, я усовершенствовал его мимическое заклинание, добавив немного хаоса.",
"gui.unicopia.spellbook.chapter.otherworldly.mind_swap.2.body": "Обмен разумом распространяет действие мимики на двух личностей, фактически меняя их тела местами на ограниченное время.",
"gui.unicopia.spellbook.chapter.otherworldly.mind_swap.3.body": "* Добавив больше фокусировки, вы можете увеличить продолжительность заклинания.",
"gui.unicopia.spellbook.chapter.artefacts.p1.title": "Гл.7 - Артефакты",
"gui.unicopia.spellbook.chapter.artefacts.p2.title": "2-ое Мэйра 12-го",
"gui.unicopia.spellbook.chapter.artefacts.p2.1.body": "Далее следует сборник исследований некоторых объектов, представляющих интерес, выявленных в ходе моих исследований.",
@ -1210,10 +1108,8 @@
"gui.unicopia.spellbook.chapter.artefacts.alicorn_amulet.title": "23-е Пониюля 12-го",
"gui.unicopia.spellbook.chapter.artefacts.alicorn_amulet.2.body": "Амулет аликорна - это мощный источник тёмной магии, созданный неизвестным магом в попытке создать совершенное существо.",
"gui.unicopia.spellbook.chapter.artefacts.alicorn_amulet.3.body": "Он сочетает в себе черты всех рас в одной мощной форме, но его трудно контролировать, и он вызывает привыкание. Любой, кто использует его, быстро становится зависимым от него, и лишь немногие, кто пытался избавиться от него, выдерживают это испытание.",
"gui.unicopia.action.spells_cleared": "Удалены все заклинания",
"gui.unicopia.action.no_spells_cleared": "У вас нет активных заклинаний",
"chapter.unicopia.crafting": "Создание заклинаний",
"chapter.unicopia.profile": "Профиль",
"chapter.unicopia.traits": "Исследования",
@ -1224,107 +1120,91 @@
"chapter.unicopia.dark_magic": "Тёмная магия",
"chapter.unicopia.the_otherworldly": "Запретная магия",
"chapter.unicopia.crystal_heart": "Артефакты",
"experience.unicopia.pure.magical_kindergartner": "Свежая кровь",
"experience.unicopia.impure.magical_kindergartner": "Испорченный",
"experience.unicopia.tainted.magical_kindergartner": "Заблудший",
"experience.unicopia.twisted.magical_kindergartner": "Потерянный",
"experience.unicopia.corrupt.magical_kindergartner": "Пони-изверг",
"experience.unicopia.monstrous.magical_kindergartner": "Злой жеребёнок",
"experience.unicopia.pure.friendship_student": "Ученик дружбы",
"experience.unicopia.impure.friendship_student": "Испорченная душа",
"experience.unicopia.tainted.friendship_student": "Заблудшая душа",
"experience.unicopia.twisted.friendship_student": "Потерянная душа",
"experience.unicopia.corrupt.friendship_student": "Зловещий ученик дружбы",
"experience.unicopia.monstrous.friendship_student": "Чудовищная душа",
"experience.unicopia.pure.senior_friendship_student": "Многообещающий ученик дружбы",
"experience.unicopia.impure.senior_friendship_student": "Испорченный студент дружбы",
"experience.unicopia.tainted.senior_friendship_student": "Заблудший студент дружбы",
"experience.unicopia.twisted.senior_friendship_student": "Влияние группы",
"experience.unicopia.corrupt.senior_friendship_student": "Зловещий друг",
"experience.unicopia.monstrous.senior_friendship_student": "Культист обучения",
"experience.unicopia.pure.junior_mage": "Младший маг",
"experience.unicopia.impure.junior_mage": "Испорченный младший маг",
"experience.unicopia.tainted.junior_mage": "Заблудший младший маг",
"experience.unicopia.twisted.junior_mage": "Зловещий младший маг",
"experience.unicopia.corrupt.junior_mage": "Младший антимаг",
"experience.unicopia.monstrous.junior_mage": "Младший культист",
"experience.unicopia.pure.mage": "Маг",
"experience.unicopia.impure.mage": "Испорченный маг",
"experience.unicopia.tainted.mage": "Заблудший маг",
"experience.unicopia.twisted.mage": "Зловещий маг",
"experience.unicopia.corrupt.mage": "Анти-маг",
"experience.unicopia.monstrous.mage": "Культист",
"experience.unicopia.pure.archmage": "Архимаг",
"experience.unicopia.impure.archmage": "Испорченный архимаг",
"experience.unicopia.tainted.archmage": "Заблудший архимаг",
"experience.unicopia.twisted.archmage": "Зловещий архимаг",
"experience.unicopia.corrupt.archmage": "Анти-архимаг",
"experience.unicopia.monstrous.archmage": "Опытный культист",
"experience.unicopia.pure.archmagus": "Архмагус",
"experience.unicopia.impure.archmagus": "Испорченный архимагус",
"experience.unicopia.tainted.archmagus": "Заблудший архимагус",
"experience.unicopia.twisted.archmagus": "Зловещий архимагус",
"experience.unicopia.corrupt.archmagus": "Анти-архимагус",
"experience.unicopia.monstrous.archmagus": "Старший культист",
"experience.unicopia.pure.senior_archmagus": "Старший архимагус",
"experience.unicopia.impure.senior_archmagus": "Испорченный старший архимагус",
"experience.unicopia.tainted.senior_archmagus": "Заблудший старший архимагус",
"experience.unicopia.twisted.senior_archmagus": "Зловещий старший архимагус",
"experience.unicopia.corrupt.senior_archmagus": "Старший анти-архимагус",
"experience.unicopia.monstrous.senior_archmagus": "Лидер секты",
"experience.unicopia.pure.ascended_senior_archmagus": "Вознесённый старший архимагус",
"experience.unicopia.impure.ascended_senior_archmagus": "Испорченный старший архимагус",
"experience.unicopia.tainted.ascended_senior_archmagus": "Заблудший старший архимагус",
"experience.unicopia.twisted.ascended_senior_archmagus": "Падший старший архимагус",
"experience.unicopia.corrupt.ascended_senior_archmagus": "Теневой старший анти-архимагус",
"experience.unicopia.monstrous.ascended_senior_archmagus": "Лидер тёмного культа",
"experience.unicopia.pure.demi_god": "Стремящаяся принцесса",
"experience.unicopia.impure.demi_god": "Испорченная стремящаяся принцесса",
"experience.unicopia.tainted.demi_god": "Заблудшая стремящаяся принцесса",
"experience.unicopia.twisted.demi_god": "Падшая принцесса",
"experience.unicopia.corrupt.demi_god": "Восходящий Тёмный Лорд",
"experience.unicopia.monstrous.demi_god": "Восходящий Тёмный Властелин",
"experience.unicopia.pure.arch_demi_god": "Многообещающая принцесса",
"experience.unicopia.impure.arch_demi_god": "Испорченная принцесса",
"experience.unicopia.tainted.arch_demi_god": "Заблудшая принцесса",
"experience.unicopia.twisted.arch_demi_god": "Падший полубог",
"experience.unicopia.corrupt.arch_demi_god": "Тёмный полубог",
"experience.unicopia.monstrous.arch_demi_god": "Тёмный Властелин",
"experience.unicopia.pure.alicorn_princess": "Принцесса аликорн",
"experience.unicopia.impure.alicorn_princess": "Испорченная принцесса аликорн",
"experience.unicopia.tainted.alicorn_princess": "Заблудшая принцесса аликорн",
"experience.unicopia.twisted.alicorn_princess": "Падшая принцесса Аликорн",
"experience.unicopia.corrupt.alicorn_princess": "Теневой Лорд аликорн",
"experience.unicopia.monstrous.alicorn_princess": "Тёмный Властелин аликорн",
"experience.unicopia.pure.polycorn_princess": "Принцесса поликорн",
"experience.unicopia.impure.polycorn_princess": "Испорченная принцесса поликорн",
"experience.unicopia.tainted.polycorn_princess": "Заблудшая принцесса поликорн",
"experience.unicopia.twisted.polycorn_princess": "Падшая принцесса поликорн",
"experience.unicopia.corrupt.polycorn_princess": "Теневая королева поликорн",
"experience.unicopia.monstrous.polycorn_princess": "Тёмная королева поликорн",
"experience.unicopia.pure.faustian_legend": "Герой легенды",
"experience.unicopia.impure.faustian_legend": "Легендарный",
"experience.unicopia.tainted.faustian_legend": "Историческая фигура далёкого происхождения",
"experience.unicopia.twisted.faustian_legend": "Тёмная личность легенды",
"experience.unicopia.corrupt.faustian_legend": "Старый Бог",
"experience.unicopia.monstrous.faustian_legend": "Потусторонний ужас",
"unicopia.category.name": "Способности пони",
"key.unicopia.primary": "Первичная способность",
"key.unicopia.secondary": "Вторичная способность",
"key.unicopia.tertiary": "Третичная способность",
@ -1332,10 +1212,8 @@
"key.unicopia.ability_modifier_tap": "Модификатор способностей VR (1-TAP)",
"key.unicopia.ability_modifier_double_tap": "Модификатор способностей VR (2-TAP)",
"key.unicopia.ability_modifier_triple_tap": "Модификатор способностей VR (3-TAP)",
"key.unicopia.hud_page_dn": "Предыдущая страница",
"key.unicopia.hud_page_up": "Следующая страница",
"enchantment.unicopia.gem_finder": "Поиск самоцветов",
"enchantment.unicopia.gem_finder.desc": "Издает низкий гул, когда вы приближаетесь к ценным рудам",
"enchantment.unicopia.padded": "Мягкость",
@ -1360,7 +1238,6 @@
"enchantment.unicopia.consumption.desc": "Преобразует предметы, добытые с помощью инструмента, в опыт",
"enchantment.unicopia.feather_touch": "Касание пера",
"enchantment.unicopia.feather_touch.desc": "Позволяет ломать и размещать облачные блоки при держании",
"commands.race.success.self": "Изменена раса на %1$s.",
"commands.race.success": "%1$s изменил расу на %2$s.",
"commands.race.success.other": "Сменил расу %1$s на %2$s.",
@ -1368,17 +1245,13 @@
"commands.race.list": "Доступные расы:",
"commands.race.permission": "Выбранная раса не разрешена на данном сервере.",
"commands.race.fail": "\"%s\" не является признанной расой.",
"commands.skyangle.get": "Текущий угол наклона солнца составляет %sdeg",
"commands.skyangle.set": "Изменён угол наклона неба на %sdeg",
"commands.race.tell.self": "Вы - ",
"commands.race.tell.self.alt": "Вы - ",
"commands.race.tell.other": "%s - это ",
"commands.race.tell.other.alt": "%s - это ",
"commands.racelist.illegal": "Раса %s по умолчанию не может быть использована этой командой.",
"commands.racelist.get.allowed": "Разрешены (%s):",
"commands.racelist.get.not_allowed": "Не разрешены (%s):",
"commands.racelist.get.list_item": "- %s (%s)",
@ -1391,10 +1264,8 @@
"commands.racelist.allowed.failed": "Раса %1$s уже разрешена.",
"commands.racelist.disallowed": "Раса %1$s удалена из списка разрешений.",
"commands.racelist.disallowed.failed": "Раса %1$s уже не разрешена.",
"commands.worldtribe.success.get": "Раса по умолчанию для всех новых игроков в настоящее время установлена на: %s.",
"commands.worldtribe.success.set": "Установка расы по умолчанию для новых игроков теперь имеет значение: %s.",
"commands.disguise.notfound": "Идентификатор сущности \"%s\" не существует.",
"commands.disguise.removed": "Ваша маскировка была удалена.",
"commands.disguise.removed.self": "Удалена собственная маскировка.",
@ -1402,14 +1273,12 @@
"commands.disguise.success": "Вы замаскировались как %s.",
"commands.disguise.success.self": "Установил собственную маскировку на %s",
"commands.disguise.success.other": "%s изменил маскировку на %s",
"commands.gravity.get": "Ваша гравитация равна %f",
"commands.gravity.get.other": "%s имеет гравитацию %f",
"commands.gravity.set": "Ваша гравитация была обновлена до %f",
"commands.gravity.set.self": "Установить собственную гравитацию на %f",
"commands.gravity.set.other": "Установить гравитацию %s на %f",
"commands.gravity.set.multiple": "Обновлено %s сущностей",
"unicopia.options.title": "Опции Unicopia",
"unicopia.options.toggle_ability_keys": "Нажатие кнопки способности вместо зажатия",
"unicopia.options.ignore_mine_lp": "Игнорировать Mine Little Pony",
@ -1425,12 +1294,10 @@
"unicopia.options.world": "Настройки мира",
"unicopia.options.world.default_race": "Раса по умолчанию: %s",
"unicopia.options.lan": "Настройки многопользовательской игры (LAN)",
"command.unicopia.config.add": "[Config] Добавлено %s в свойство %s",
"command.unicopia.config.remove": "[Config] Удалено %s из свойства %s",
"command.unicopia.config.list": "[Config] Свойство (%s) содержит (%s) записей:",
"command.unicopia.config.clear": "[Config] Удалены все значения из свойства %s",
"race.unicopia.unset": "Не выбрано",
"race.unicopia.unset.alt": "не выбрано",
"race.unicopia.human": "Человек",
@ -1453,7 +1320,6 @@
"race.unicopia.hippogriff.alt": "Гиппогрифы",
"race.unicopia.seapony": "Морской пони",
"race.unicopia.seapony.alt": "Морские пони",
"death.attack.unicopia.generic.and_also": "%1$s и %2$s",
"death.attack.unicopia.generic.whilst_flying": "%1$s во время полёта",
"death.attack.unicopia.tribe_swap": "%1$s был перерождён в другое племя",
@ -1484,9 +1350,9 @@
"death.attack.unicopia.life_draining.self": "%1$s был убит своим собственным заклинанием",
"death.attack.unicopia.life_draining.player": "%1$s был убит заклинанием, созданным %2$s",
"death.attack.unicopia.bat_screech": "%1$s был напуган до смерти",
"death.attack.unicopia.bat_screech.self": "%1$ напугали себя до смерти",
"death.attack.unicopia.bat_screech.player": "%2$s напугал %1$s",
"death.attack.unicopia.bat_screech.item": "%1$s был напуган до смерти %2$s с помощью %3$s",
"death.attack.unicopia.bat_screech.self": "%1$ напугали себя до смерти",
"death.attack.unicopia.gravity_well_recoil": "%1$ превратился в спагетти",
"death.attack.unicopia.gravity_well_recoil.player": "%1$s превращён в спагетти заклинанием, созданным %2$s",
"death.attack.unicopia.gravity_well_recoil.item": "%1$s превращён в спагетти заклинанием, созданным %2$s с помощью %3$s",
@ -1524,7 +1390,6 @@
"death.attack.unicopia.horseshoe.player": "%2$s зарядил подковой в %1$s",
"death.attack.unicopia.spikes": "%1$s был заколот до смерти",
"death.attack.unicopia.spikes.player": "%1$s упал на шипы, пытаясь спастись от %2$s",
"death.fell.accident.ladder.pegasus": "%1$s забыл, что умеет летать, и упал с лестницы",
"death.fell.accident.vines.pegasus": "%1$s забыл, что умеет летать, и упал с лозы",
"death.fell.accident.weeping_vines.pegasus": "%1$ забыл, что умеет летать, и упал с плакучих лоз",
@ -1534,7 +1399,6 @@
"death.fell.accident.generic.pegasus": "%1$s забыл, что умеет летать",
"death.fell.accident.pegasus": "%1$s забыл, что умеет летать",
"death.fell.accident.water": "%1$s намочил свои крылья",
"painting.unicopia.hurricane.title": "Ураган",
"painting.unicopia.hurricane.author": "Племя пегасов",
"painting.unicopia.platinum.title": "Платина",
@ -1565,7 +1429,6 @@
"painting.unicopia.solar.author": "Королевская стража",
"painting.unicopia.equality.title": "Равенство",
"painting.unicopia.equality.author": "Старлайт Глиммер",
"unicopia.subtitle.flap_wings": "Взмах крыла",
"unicopia.subtitle.dash": "Пони мчится",
"unicopia.subtitle.wind_rush": "Порыв ветра",
@ -1574,7 +1437,7 @@
"unicopia.subtitle.batpony_eeee": "Бэтпони кричит",
"unicopia.subtitle.sonar": "Сонарные импульсы",
"unicopia.subtitle.changeling.transform": "Чейнджлинг трансформируется",
"unicopia.subtitle.screech": "Гиппогриф кричит",
"unicopia.subtitle.screech": "Игрок кричит",
"unicopia.subtitle.pegasus.molt": "Пегас теряет перо",
"unicopia.subtitle.unicorn.teleport": "Звук магии",
"unicopia.subtitle.player.wololo": "Вололо!",
@ -1583,7 +1446,6 @@
"unicopia.subtitle.entity.player.kick": "Игрок бьёт",
"unicopia.subtitle.magic_aura": "Магическое гудение",
"unicopia.subtitle.player.rebound": "Игрок отскакивает от стены",
"unicopia.subtitle.screech": "Игрок кричит",
"unicopia.subtitle.ears_ringing": "Звон в ушах",
"unicopia.subtitle.heartbeat": "Стук сердца",
"unicopia.subtitle.entity.artefact.ambient": "Магическое гудение",
@ -1616,7 +1478,6 @@
"unicopia.subtitle.spell.fire.shoot.bolt": "Стрельба огненным снарядом",
"unicopia.subtitle.spell.shield.projectile.burn": "Стрела горит",
"unicopia.subtitle.spell.transform.transmute.entity": "Звук магии",
"advancements.unicopia.root.title": "Unicopia",
"advancements.unicopia.root.description": "Мир волшебства и приключений",
"advancements.unicopia.praise_the_sun.title": "Хвала Солнцу!",
@ -1659,17 +1520,14 @@
"advancements.unicopia.oats_so_easy.description": "Вырастите немного овса",
"advancements.unicopia.imported_oats.title": "Столь же вкусные, сколь и дорогие",
"advancements.unicopia.imported_oats.description": "Отправьте или получите шикарный импортный овёс",
"advancements.unicopia.experimental.title": "Ты не можешь взять это с собой",
"advancements.unicopia.experimental.description": "Зачаровать инструмент на Потребление",
"advancements.unicopia.xp_miner.title": "Майнер опыта",
"advancements.unicopia.xp_miner.description": "Используйте Потребление, чтобы накопить опыт",
"advancements.unicopia.hearts_stronger_than_horses.title": "Сердца сильнее лошадей",
"advancements.unicopia.hearts_stronger_than_horses.description": "Зачаровать инструмент Связанным сердцем",
"advancements.unicopia.soulmate.title": "Ты можешь взять это с собой",
"advancements.unicopia.soulmate.description": "Умереть, держа в руках предмет связанный сердцем",
"advancements.unicopia.burn_juice.title": "Это кажется неправильным",
"advancements.unicopia.burn_juice.description": "Сжечь сок",
"advancements.unicopia.apple_route.title": "Яблоко, яблоко, яблоко",
@ -1692,7 +1550,6 @@
"advancements.unicopia.aeronaut.description": "Оснастите свою корзину фонарём и воздушным шаром",
"advancements.unicopia.travelling_in_style.title": "Путешествие со стилем",
"advancements.unicopia.travelling_in_style.description": "Прокатитесь на воздушном шаре",
"advancements.unicopia.bat_route.title": "Дети Ночи",
"advancements.unicopia.bat_route.description": "Пойдите по пути ночи",
"advancements.unicopia.screech_twenty_mobs.title": "Ужас с неба",
@ -1701,12 +1558,10 @@
"advancements.unicopia.screech_self.description": "Будьте настолько страшным, что даже немного напугайте себя",
"advancements.unicopia.extra_spooky.title": "Экстра жуткий",
"advancements.unicopia.extra_spooky.description": "Напугайте моба так сильно, чтобы он выронил кирпич",
"advancements.unicopia.sweet_sweet_revenge.title": "Сладкая, сладкая месть",
"advancements.unicopia.sweet_sweet_revenge.description": "Отомстите Селестии за то, что она выжгла вам глаза",
"advancements.unicopia.blasphemy.title": "Кощунство!",
"advancements.unicopia.blasphemy.description": "Ударьте Селестию по башке. Упс!",
"advancements.unicopia.earth_route.title": "Очаг Земли",
"advancements.unicopia.earth_route.description": "Вступить в клан Яблока",
"advancements.unicopia.sticks_and_stones.title": "Палки и камни",
@ -1725,7 +1580,6 @@
"advancements.unicopia.born_on_a_rock_farm.description": "Успешно вырастить свой первый камень",
"advancements.unicopia.thats_unusual.title": "Это необычно",
"advancements.unicopia.thats_unusual.description": "Но что оно делает?",
"advancements.unicopia.pegasus_route.title": "Путь Пегаса",
"advancements.unicopia.pegasus_route.description": "Присоединитесь к пегасам Клаудсдейла",
"advancements.unicopia.molting_season_1.title": "Сезон линьки",
@ -1758,10 +1612,8 @@
"advancements.unicopia.second_wind.description": "Летите сквозь боль",
"advancements.unicopia.deter_phantom.title": "Что летает вокруг",
"advancements.unicopia.deter_phantom.description": "Поднимитесь и дайте этим фантомам попробовать их собственное лекарство",
"advancements.unicopia.unicorn_route.title": "Рог единорога",
"advancements.unicopia.unicorn_route.description": "Окунитесь в мир блеска и радуги",
"advancements.unicopia.books.title": "Книги!",
"advancements.unicopia.books.description": "Это МОЯ книга заклинаний, и я собираюсь её ПРОЧИТАТЬ!",
"advancements.unicopia.books_books_books.title": "Книги! Книги! Книги!",
@ -1772,7 +1624,6 @@
"advancements.unicopia.hello_darkness_my_old_friend.description": "Углубитесь в силы тёмной стороны",
"advancements.unicopia.a_falling_wizard.title": "Падший волшебник",
"advancements.unicopia.a_falling_wizard.description": "Единорог безуспешно попытался наложить заклинание полёта",
"advancements.unicopia.split_the_sea.title": "Ты кто? Моисей?",
"advancements.unicopia.split_the_sea.description": "Используйте магию, чтобы переместить более 100 блоков воды за один раз",
"advancements.unicopia.save_the_day.title": "Спасти день",
@ -1787,14 +1638,12 @@
"advancements.unicopia.power_up_heart.description": "Увеличьте мощность кристального сердца",
"advancements.unicopia.love_is_power.title": "Любовь - это сила",
"advancements.unicopia.love_is_power.description": "Изгоните короля Сомбра с помощью кристального сердца",
"advancements.unicopia.hippogriff_route.title": "Всплеск Сиквестрии",
"advancements.unicopia.hippogriff_route.description": "Присоединитесь к гнезду гиппогрифов",
"advancements.unicopia.shoo_be_doo.title": "Шу-би-ду!",
"advancements.unicopia.shoo_be_doo.description": "Используйте жемчужное ожерелье, чтобы превратиться в морское существо",
"advancements.unicopia.shoo_be_done.title": "Шу-би-всё!",
"advancements.unicopia.shoo_be_done.description": "Используйте жемчужное ожерелье, чтобы стать снова собой",
"unicopia.toast.discoveries.title": "Новые открытия!",
"unicopia.toast.discoveries.description": "Проверьте свою книгу заклинаний"
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View file

@ -0,0 +1,11 @@
{
"animation": {
"frametime": 200,
"frames": [
0, 1, 2, 3,
1, 2, 3, 0,
2, 3, 0, 1,
3, 0, 1, 2
]
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

View file

@ -1,15 +0,0 @@
{
"replace": false,
"values": [
"#c:raw_insect",
"#unicopia:polearms",
"unicopia:mango_leaves",
"unicopia:mango_sapling",
"unicopia:mango",
"unicopia:pineapple",
"unicopia:pineapple_crown",
"unicopia:banana",
"unicopia:sunglasses",
"unicopia:broken_sunglasses"
]
}

View file

@ -1,22 +0,0 @@
{
"replace": false,
"values": [
"unicopia:carapace",
"unicopia:surface_chitin",
"unicopia:chitin",
"unicopia:chiselled_chitin",
"unicopia:chiselled_chitin_slab",
"unicopia:chiselled_chitin_stairs",
"unicopia:chiselled_chitin_hull",
"unicopia:chitin_spikes",
"unicopia:mysterious_egg",
"unicopia:green_fried_egg",
"unicopia:hive",
"unicopia:dark_oak_stable_door",
"#c:cooked_meat",
"#c:raw_meat",
"#c:raw_insect",
"#c:rotten_meat",
"#unicopia:container_with_love"
]
}

View file

@ -1,93 +0,0 @@
{
"replace": false,
"values": [
"unicopia:green_apple_leaves",
"unicopia:sweet_apple_leaves",
"unicopia:sour_apple_leaves",
"unicopia:zap_leaves",
"unicopia:flowering_zap_leaves",
"unicopia:zap_log",
"unicopia:zap_wood",
"unicopia:stripped_zap_log",
"unicopia:stripped_zap_wood",
"unicopia:zap_planks",
"unicopia:zap_stairs",
"unicopia:zap_slab",
"unicopia:zap_fence",
"unicopia:zap_fence_gate",
"unicopia:waxed_zap_log",
"unicopia:waxed_zap_wood",
"unicopia:waxed_stripped_zap_log",
"unicopia:waxed_stripped_zap_wood",
"unicopia:waxed_zap_planks",
"unicopia:waxed_zap_stairs",
"unicopia:waxed_zap_slab",
"unicopia:waxed_zap_fence",
"unicopia:waxed_zap_fence_gate",
"unicopia:candied_apple",
"unicopia:stable_door",
"unicopia:dark_oak_stable_door",
"minecraft:apple",
"unicopia:green_apple",
"unicopia:sweet_apple",
"unicopia:sour_apple",
"unicopia:zap_apple",
"unicopia:zap_bulb",
"unicopia:rotten_apple",
"unicopia:green_apple_seeds",
"unicopia:sweet_apple_seeds",
"unicopia:sour_apple_seeds",
"unicopia:green_apple_sapling",
"unicopia:sweet_apple_sapling",
"unicopia:sour_apple_sapling",
"unicopia:zapling",
"unicopia:palm_sapling",
"unicopia:curing_joke",
"unicopia:mango",
"unicopia:empty_jar",
"unicopia:cooked_zap_apple",
"unicopia:zap_apple_jam_jar",
"unicopia:oat_seeds",
"unicopia:oats",
"unicopia:imported_oats",
"unicopia:oatmeal",
"unicopia:oatmeal_cookie",
"unicopia:chocolate_oatmeal_cookie",
"unicopia:daffodil_daisy_sandwich",
"unicopia:hay_burger",
"unicopia:hay_fries",
"unicopia:crispy_hay_fries",
"unicopia:horse_shoe_fries",
"unicopia:wheat_worms",
"unicopia:baited_fishing_rod",
"unicopia:worm_block",
"unicopia:muffin",
"unicopia:scone",
"unicopia:acorn",
"unicopia:pinecone",
"unicopia:pinecone_cookie",
"unicopia:bowl_of_nuts",
"unicopia:crystal_shard",
"unicopia:pebbles",
"unicopia:rock",
"unicopia:weird_rock",
"unicopia:rock_stew",
"unicopia:rock_candy",
"unicopia:salt_cube",
"unicopia:mug",
"unicopia:cider",
"unicopia:juice",
"unicopia:burned_juice",
"unicopia:toast",
"unicopia:jam_toast",
"unicopia:burned_toast",
"unicopia:apple_pie",
"unicopia:apple_pie_hoof",
"unicopia:apple_pie_slice",
"unicopia:weather_vane",
"#unicopia:baskets",
"unicopia:giant_balloon",
"unicopia:cloth_bed",
"#unicopia:bed_sheets"
]
}

View file

@ -1,16 +0,0 @@
{
"replace": false,
"values": [
"#unicopia:forage/dangerous",
"#unicopia:forage/filling",
"#unicopia:forage/safe",
"#unicopia:forage/nauseating",
"#unicopia:forage/blinding",
"#unicopia:forage/prickly",
"#unicopia:forage/glowing",
"#unicopia:forage/risky",
"#unicopia:forage/severe/nauseating",
"#unicopia:forage/severe/prickly",
"#unicopia:forage/strenghtening"
]
}

View file

@ -1,39 +0,0 @@
{
"replace": false,
"values": [
"unicopia:shaping_bench",
"unicopia:cloud_chest",
"unicopia:cloud_lump",
"unicopia:cloud",
"unicopia:cloud_slab",
"unicopia:cloud_stairs",
"unicopia:cloud_planks",
"unicopia:cloud_plank_slab",
"unicopia:cloud_plank_stairs",
"unicopia:cloud_bricks",
"unicopia:cloud_brick_slab",
"unicopia:cloud_brick_stairs",
"unicopia:dense_cloud",
"unicopia:dense_cloud_slab",
"unicopia:dense_cloud_stairs",
"unicopia:etched_cloud",
"unicopia:etched_cloud_slab",
"unicopia:etched_cloud_stairs",
"unicopia:unstable_cloud",
"unicopia:cloud_pillar",
"unicopia:cloud_door",
"unicopia:cloud_bed",
"#unicopia:bed_sheets",
"#c:raw_fish",
"#c:cooked_fish",
"#c:rotten_fish",
"unicopia:rain_cloud_jar",
"unicopia:storm_cloud_jar",
"unicopia:lightning_jar",
"#unicopia:polearms",
"unicopia:pegasus_feather",
"unicopia:gryphon_feather",
"unicopia:golden_feather",
"unicopia:golden_wing"
]
}

View file

@ -1,10 +0,0 @@
{
"replace": false,
"values": [
"unicopia:pearl_necklace",
"#unicopia:shells",
"#unicopia:special_shells",
"#unicopia:food_types/low_quality_sea_vegetables",
"#unicopia:food_types/high_quality_sea_vegetables"
]
}

View file

@ -1,21 +0,0 @@
{
"replace": false,
"values": [
"unicopia:spellbook",
"unicopia:gemstone",
"unicopia:botched_gem",
"unicopia:friendship_bracelet",
"unicopia:crystal_heart",
"unicopia:crystal_shard",
"unicopia:crystal_door",
"unicopia:meadowbrooks_staff",
"unicopia:magic_staff",
"unicopia:grogars_bell",
"unicopia:dragon_breath_scroll",
"unicopia:pegasus_amulet",
"unicopia:alicorn_amulet",
"unicopia:broken_alicorn_amulet",
"unicopia:unicorn_amulet",
"unicopia:spectral_clock"
]
}