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) { static EquineContext of(ShapeContext context) {
if (context == ShapeContext.absent()) { 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; EquineContext result = context instanceof Container c ? c.get() : ABSENT;
return result == null ? ABSENT : result; return result == null ? ABSENT : result;

View file

@ -1,11 +1,13 @@
package com.minelittlepony.unicopia; package com.minelittlepony.unicopia;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.entity.player.dummy.DummyPlayerEntity; import com.minelittlepony.unicopia.entity.player.dummy.DummyPlayerEntity;
import com.minelittlepony.unicopia.particle.ParticleSpawner; import com.minelittlepony.unicopia.particle.ParticleSpawner;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
@ -30,12 +32,16 @@ public class InteractionManager {
public static final int SCREEN_DISPELL_ABILITY = 0; 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; return INSTANCE;
} }
public InteractionManager() {
INSTANCE = this;
}
public ParticleSpawner createBoundParticle(UUID id) { public ParticleSpawner createBoundParticle(UUID id) {
return ParticleSpawner.EMPTY; return ParticleSpawner.EMPTY;
} }
@ -96,4 +102,12 @@ public class InteractionManager {
public void addBlockBreakingParticles(BlockPos pos, Direction direction) { 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.resource.ResourceType;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import java.util.Optional;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; 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.damage.UDamageTypes;
import com.minelittlepony.unicopia.entity.effect.UPotions; import com.minelittlepony.unicopia.entity.effect.UPotions;
import com.minelittlepony.unicopia.entity.mob.UEntities; 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.UItems;
import com.minelittlepony.unicopia.item.enchantment.UEnchantments; import com.minelittlepony.unicopia.item.enchantment.UEnchantments;
import com.minelittlepony.unicopia.network.Channel; 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 String DEFAULT_NAMESPACE = "unicopia";
public static final Logger LOGGER = LogManager.getLogger(); public static final Logger LOGGER = LogManager.getLogger();
public static SidedAccess SIDE = Optional::empty;
private static Config CONFIG; private static Config CONFIG;
public static Config getConfig() { public static Config getConfig() {
@ -111,12 +106,4 @@ public class Unicopia implements ModInitializer {
registry.registerReloadListener(SpellbookChapterLoader.INSTANCE); registry.registerReloadListener(SpellbookChapterLoader.INSTANCE);
registry.registerReloadListener(new DietsLoader()); 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; 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. * 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; warmup = 0;
if (data.isPresent()) { if (data.isPresent()) {
InteractionManager.instance().sendPlayerLookAngles(player.asEntity()); InteractionManager.getInstance().sendPlayerLookAngles(player.asEntity());
Channel.CLIENT_PLAYER_ABILITY.sendToServer(new MsgPlayerAbility<>(ability, data, ActivationType.NONE)); Channel.CLIENT_PLAYER_ABILITY.sendToServer(new MsgPlayerAbility<>(ability, data, ActivationType.NONE));
} else { } else {
player.asEntity().playSound(USounds.GUI_ABILITY_FAIL, 1, 1); player.asEntity().playSound(USounds.GUI_ABILITY_FAIL, 1, 1);

View file

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

View file

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

View file

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

View file

@ -49,6 +49,11 @@ public class FlyingDashAbility implements Ability<Hit> {
return false; return false;
} }
@Override
public boolean acceptsQuickAction(Pony player, ActivationType type) {
return type == ActivationType.NONE || type == ActivationType.TAP;
}
@Override @Override
public boolean apply(Pony player, Hit data) { public boolean apply(Pony player, Hit data) {
player.getPhysics().dashForward((float)player.asWorld().random.nextTriangular(2.5F, 0.3F)); 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; return false;
} }
@Override
public boolean acceptsQuickAction(Pony player, ActivationType type) {
return type == ActivationType.NONE || type == ActivationType.TAP;
}
@Override @Override
public boolean apply(Pony player, Hit data) { 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()) { if (type == ActivationType.TAP && player.isClient()) {
InteractionManager.instance().openScreen(InteractionManager.SCREEN_DISPELL_ABILITY); InteractionManager.getInstance().openScreen(InteractionManager.SCREEN_DISPELL_ABILITY);
return true; return true;
} }
} }
@ -72,6 +72,11 @@ public class UnicornDispellAbility implements Ability<Pos> {
return false; return false;
} }
@Override
public boolean acceptsQuickAction(Pony player, ActivationType type) {
return type == ActivationType.NONE || (player.getSpecies() != Race.CHANGELING && type == ActivationType.TAP);
}
@Override @Override
public double getCostEstimate(Pony player) { public double getCostEstimate(Pony player) {
return getTarget(player) return getTarget(player)

View file

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

View file

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

View file

@ -108,7 +108,7 @@ public class RageAbilitySpell extends AbstractSpell {
if (source instanceof Pony pony) { if (source instanceof Pony pony) {
if (pony.isClientPlayer() && pony.asEntity().getAttackCooldownProgress(0) == 0) { 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(); Bar energyBar = pony.getMagicalReserves().getEnergy();
var energy = Math.min(1.01F, 0.5F + (age / 1000F)); 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 (source.isClient()) {
if (boundParticle == null) { 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); boundParticle.addParticle(new TargetBoundParticleEffect(UParticles.RAINBOOM_TRAIL, source.asEntity()), source.getOriginVector(), Vec3d.ZERO);

View file

@ -1,64 +1,182 @@
package com.minelittlepony.unicopia.block; package com.minelittlepony.unicopia.block;
import java.util.UUID;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.EquineContext; import com.minelittlepony.unicopia.EquineContext;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.USounds;
import com.minelittlepony.unicopia.item.FriendshipBraceletItem;
import com.minelittlepony.unicopia.item.UItems; import com.minelittlepony.unicopia.item.UItems;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockEntityProvider;
import net.minecraft.block.BlockSetType; import net.minecraft.block.BlockSetType;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.DoorBlock; import net.minecraft.block.DoorBlock;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.enums.DoubleBlockHalf; import net.minecraft.block.enums.DoubleBlockHalf;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity; 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.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.ActionResult;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
import net.minecraft.util.math.random.Random;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.event.GameEvent; 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) { public CrystalDoorBlock(Settings settings, BlockSetType blockSet) {
super(settings, 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 @Override
public void neighborUpdate(BlockState state, World world, BlockPos pos, Block sourceBlock, BlockPos sourcePos, boolean notify) { public void neighborUpdate(BlockState state, World world, BlockPos pos, Block sourceBlock, BlockPos sourcePos, boolean notify) {
boolean powered = world.isReceivingRedstonePower(pos) || world.isReceivingRedstonePower(pos.offset(state.get(HALF) == DoubleBlockHalf.LOWER ? Direction.UP : Direction.DOWN)); if (!state.get(LOCKED)) {
if (!getDefaultState().isOf(sourceBlock) && powered != state.get(POWERED)) { boolean powered = world.isReceivingRedstonePower(pos) || world.isReceivingRedstonePower(pos.offset(state.get(HALF) == DoubleBlockHalf.LOWER ? Direction.UP : Direction.DOWN));
if (powered) { if (!getDefaultState().isOf(sourceBlock) && powered != state.get(POWERED)) {
state = state.cycle(OPEN); if (powered) {
playOpenCloseSound(null, world, pos, state.get(OPEN)); state = state.cycle(OPEN);
world.emitGameEvent(null, state.get(OPEN) ? GameEvent.BLOCK_OPEN : GameEvent.BLOCK_CLOSE, pos); playOpenCloseSound(null, world, pos, state.get(OPEN));
} world.emitGameEvent(null, state.get(OPEN) ? GameEvent.BLOCK_OPEN : GameEvent.BLOCK_CLOSE, pos);
}
world.setBlockState(pos, state.with(POWERED, powered), Block.NOTIFY_LISTENERS); world.setBlockState(pos, state.with(POWERED, powered), Block.NOTIFY_LISTENERS);
}
}
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 @Override
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
if (!EquineContext.of(player).getCompositeRace().any(Race::canCast)) { if (!shouldProvideAccess(world, pos, player)) {
if (isLocked(world, pos) || !player.getStackInHand(hand).isOf(UItems.MEADOWBROOKS_STAFF)) {
if (!player.getStackInHand(hand).isOf(UItems.MEADOWBROOKS_STAFF)) {
playOpenCloseSound(player, world, pos, false); playOpenCloseSound(player, world, pos, false);
return ActionResult.FAIL; setOnGuard(state, world, pos, true);
return ActionResult.CONSUME;
} else { } else {
world.playSound(player, pos, USounds.ENTITY_CRYSTAL_SHARDS_AMBIENT, SoundCategory.BLOCKS, 1, world.getRandom().nextFloat() * 0.1F + 0.9F); 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); 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) { 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); 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<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<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<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) { static <T extends BlockEntity> BlockEntityType<T> create(String id, Builder<T> builder) {
return Registry.register(Registries.BLOCK_ENTITY_TYPE, id, builder.build(null)); 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.lang.ref.WeakReference;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.function.Supplier; import java.util.function.Supplier;
@ -168,4 +169,9 @@ public class ClientInteractionManager extends InteractionManager {
public void addBlockBreakingParticles(BlockPos pos, Direction direction) { public void addBlockBreakingParticles(BlockPos pos, Direction direction) {
client.particleManager.addBlockBreakingParticles(pos, 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.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicReference;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
@ -34,12 +36,12 @@ public class KeyBindingsHandler {
private final Map<Binding, AbilitySlot> keys = new HashMap<>(); private final Map<Binding, AbilitySlot> keys = new HashMap<>();
private final Map<AbilitySlot, Binding> reverse = 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 pageDown = new Binding(create(GLFW.GLFW_KEY_PAGE_DOWN, "hud_page_dn"));
private final Binding pageUp = register(GLFW.GLFW_KEY_PAGE_UP, "hud_page_up"); 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 KeyBinding singleTapModifier = createSticky(InputUtil.UNKNOWN_KEY.getCode(), "ability_modifier_tap");
private final Binding doubleTapModifier = register(InputUtil.UNKNOWN_KEY.getCode(), "ability_modifier_double_tap"); private final KeyBinding doubleTapModifier = createSticky(InputUtil.UNKNOWN_KEY.getCode(), "ability_modifier_double_tap");
private final Binding tripleTapModifier = register(InputUtil.UNKNOWN_KEY.getCode(), "ability_modifier_triple_tap"); private final KeyBinding tripleTapModifier = createSticky(InputUtil.UNKNOWN_KEY.getCode(), "ability_modifier_triple_tap");
private final Set<KeyBinding> pressed = new HashSet<>(); private final Set<KeyBinding> pressed = new HashSet<>();
@ -57,14 +59,34 @@ public class KeyBindingsHandler {
return Unicopia.getConfig().toggleAbilityKeys.get(); 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) { 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); reverse.put(slot, binding);
keys.put(binding, slot); keys.put(binding, slot);
} }
Binding register(int code, String name) { KeyBinding create(int code, String name) {
return new Binding(KeyBindingHelper.registerKeyBinding(new KeyBinding("key.unicopia." + name, code, KEY_CATEGORY))); 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) { public void tick(MinecraftClient client) {
@ -102,7 +124,7 @@ public class KeyBindingsHandler {
} }
} else { } else {
ActivationType type = i.getType(); ActivationType type = i.getType();
if (type != ActivationType.NONE) { if (type.isResult()) {
abilities.clear(slot, type, page); abilities.clear(slot, type, page);
} }
} }
@ -124,7 +146,7 @@ public class KeyBindingsHandler {
private long nextPhaseTime; private long nextPhaseTime;
private ActivationType type = ActivationType.NONE; private final AtomicReference<ActivationType> type = new AtomicReference<>(ActivationType.NONE);
Binding(KeyBinding binding) { Binding(KeyBinding binding) {
this.binding = binding; this.binding = binding;
@ -145,40 +167,25 @@ public class KeyBindingsHandler {
if (state == PressedState.RELEASED && now < nextPhaseTime + 10) { if (state == PressedState.RELEASED && now < nextPhaseTime + 10) {
nextPhaseTime = now + 200; nextPhaseTime = now + 200;
type = type.getNext(); type.set(type.get().getNext());
} }
return state; return state;
} }
public ActivationType getType() { public ActivationType getType() {
if (binding.isPressed() && binding instanceof StickyKeyBinding) { if (binding.isPressed()) {
if (singleTapModifier.binding.isPressed()) { ActivationType t = getForcedActivationType();
if (t.isResult()) {
KeyBinding.untoggleStickyKeys(); KeyBinding.untoggleStickyKeys();
return ActivationType.TAP; return t;
}
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 (!isToggleMode() && System.currentTimeMillis() > nextPhaseTime - 70) {
if (type != ActivationType.NONE && now > nextPhaseTime - 70) { return type.getAndSet(ActivationType.NONE);
ActivationType t = type;
type = ActivationType.NONE;
return t;
} }
return 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.client.gui.element.Button;
import com.minelittlepony.common.event.ScreenInitCallback; import com.minelittlepony.common.event.ScreenInitCallback;
import com.minelittlepony.common.event.ScreenInitCallback.ButtonList; import com.minelittlepony.common.event.ScreenInitCallback.ButtonList;
import com.minelittlepony.unicopia.InteractionManager;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.client.gui.LanSettingsScreen; import com.minelittlepony.unicopia.client.gui.LanSettingsScreen;
@ -51,6 +50,11 @@ public class UnicopiaClient implements ClientModInitializer {
return instance; return instance;
} }
@Nullable
public static Pony getClientPony() {
return Pony.of(MinecraftClient.getInstance().player);
}
@Nullable @Nullable
private Float originalRainGradient; private Float originalRainGradient;
private final Lerp rainGradient = new Lerp(0); private final Lerp rainGradient = new Lerp(0);
@ -61,18 +65,23 @@ public class UnicopiaClient implements ClientModInitializer {
private ZapAppleStageStore.Stage zapAppleStage = ZapAppleStageStore.Stage.HIBERNATING; private ZapAppleStageStore.Stage zapAppleStage = ZapAppleStageStore.Stage.HIBERNATING;
public static Optional<PlayerCamera> getCamera() { public static Optional<PlayerCamera> getCamera() {
return Optional.of(getNullableCamera());
}
@Nullable
private static PlayerCamera getNullableCamera() {
PlayerEntity player = MinecraftClient.getInstance().player; PlayerEntity player = MinecraftClient.getInstance().player;
if (player != null && MinecraftClient.getInstance().cameraEntity == 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) { public static Vec3d getAdjustedSoundPosition(Vec3d pos) {
PlayerCamera cam = getCamera().orElse(null); PlayerCamera cam = getNullableCamera();
if (cam == null) { if (cam == null) {
return pos; return pos;
} }
@ -124,7 +133,7 @@ public class UnicopiaClient implements ClientModInitializer {
@Override @Override
public void onInitializeClient() { public void onInitializeClient() {
InteractionManager.INSTANCE = new ClientInteractionManager(); new ClientInteractionManager();
new ClientNetworkHandlerImpl(); new ClientNetworkHandlerImpl();
KeyBindingsHandler.bootstrap(); 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(ViewportShader.INSTANCE);
ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(SpellEffectsRenderDispatcher.INSTANCE); ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(SpellEffectsRenderDispatcher.INSTANCE);
Unicopia.SIDE = () -> Optional.ofNullable(MinecraftClient.getInstance().player).map(Pony::of);
} }
private void onTick(MinecraftClient client) { private void onTick(MinecraftClient client) {

View file

@ -1,14 +1,20 @@
package com.minelittlepony.unicopia.client.gui; package com.minelittlepony.unicopia.client.gui;
import java.util.Optional;
import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.ability.Ability;
import com.minelittlepony.unicopia.ability.AbilityDispatcher; import com.minelittlepony.unicopia.ability.AbilityDispatcher;
import com.minelittlepony.unicopia.ability.AbilitySlot; import com.minelittlepony.unicopia.ability.AbilitySlot;
import com.minelittlepony.unicopia.ability.ActivationType;
import com.minelittlepony.unicopia.client.KeyBindingsHandler; import com.minelittlepony.unicopia.client.KeyBindingsHandler;
import com.minelittlepony.unicopia.client.UnicopiaClient;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.util.math.MatrixStack; 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; import net.minecraft.util.math.MathHelper;
class Slot { class Slot {
@ -130,11 +136,13 @@ class Slot {
void renderLabel(DrawContext context, AbilityDispatcher abilities, float tickDelta) { 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; return;
} }
Text label = KeyBindingsHandler.INSTANCE.getBinding(aSlot).getLabel(); MutableText label = KeyBindingsHandler.INSTANCE.getBinding(aSlot).getLabel().copy().formatted(Formatting.BOLD);
MatrixStack matrices = context.getMatrices(); MatrixStack matrices = context.getMatrices();
matrices.push(); matrices.push();
@ -150,6 +158,14 @@ class Slot {
matrices.translate(x, getY() + labelY, 0); matrices.translate(x, getY() + labelY, 0);
matrices.scale(0.5F, 0.5F, 0.5F); 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); context.drawText(uHud.font, label, 0, 0, 0xFFFFFF, true);
matrices.pop(); matrices.pop();

View file

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

View file

@ -104,7 +104,7 @@ public class DisguiseCommand {
} }
static Entity loadPlayer(ServerCommandSource source, String username) { 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) { static int reveal(ServerCommandSource source, PlayerEntity player) {

View file

@ -38,7 +38,7 @@ public class MagicalShapedEmiRecipe extends EmiCraftingRecipe {
ItemStack[] stacks = ingredient.getMatchingStacks(); ItemStack[] stacks = ingredient.getMatchingStacks();
for (int i = 0; i < stacks.length; i++) { 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 = Arrays.copyOf(stacks, stacks.length);
stacks[i] = EnchantableItem.enchant(stacks[i].copy(), spellEffect.type()); stacks[i] = EnchantableItem.enchant(stacks[i].copy(), spellEffect.type());
return EmiIngredient.of(Arrays.stream(stacks).map(EmiStack::of).toList()); 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.UBlockLootTableProvider;
import com.minelittlepony.unicopia.datagen.providers.loot.UChestAdditionsLootTableProvider; import com.minelittlepony.unicopia.datagen.providers.loot.UChestAdditionsLootTableProvider;
import com.minelittlepony.unicopia.datagen.providers.loot.UChestLootTableProvider; 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.loot.UEntityLootTableProvider;
import com.minelittlepony.unicopia.datagen.providers.recipe.URecipeProvider; import com.minelittlepony.unicopia.datagen.providers.recipe.URecipeProvider;
import com.minelittlepony.unicopia.datagen.providers.tag.UBlockTagProvider; import com.minelittlepony.unicopia.datagen.providers.tag.UBlockTagProvider;
@ -58,6 +59,7 @@ public class Datagen implements DataGeneratorEntrypoint {
pack.addProvider(URecipeProvider::new); pack.addProvider(URecipeProvider::new);
pack.addProvider(UBlockLootTableProvider::new); pack.addProvider(UBlockLootTableProvider::new);
pack.addProvider(UEntityLootTableProvider::new); pack.addProvider(UEntityLootTableProvider::new);
pack.addProvider(UEntityAdditionsLootTableProvider::new);
pack.addProvider(UChestLootTableProvider::new); pack.addProvider(UChestLootTableProvider::new);
pack.addProvider(UBlockAdditionsLootTableProvider::new); pack.addProvider(UBlockAdditionsLootTableProvider::new);
pack.addProvider(UChestAdditionsLootTableProvider::new); pack.addProvider(UChestAdditionsLootTableProvider::new);

View file

@ -27,6 +27,10 @@ public interface UBlockFamilies {
.slab(UBlocks.CLOUD_SLAB).stairs(UBlocks.CLOUD_STAIRS) .slab(UBlocks.CLOUD_SLAB).stairs(UBlocks.CLOUD_STAIRS)
.group("cloud").unlockCriterionName("has_cloud_lump") .group("cloud").unlockCriterionName("has_cloud_lump")
.build(); .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) BlockFamily CLOUD_PLANKS = new BlockFamily.Builder(UBlocks.CLOUD_PLANKS)
.slab(UBlocks.CLOUD_PLANK_SLAB).stairs(UBlocks.CLOUD_PLANK_STAIRS) .slab(UBlocks.CLOUD_PLANK_SLAB).stairs(UBlocks.CLOUD_PLANK_STAIRS)
.group("cloud").unlockCriterionName("has_cloud") .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.ModelIds;
import net.minecraft.data.client.Models; import net.minecraft.data.client.Models;
import net.minecraft.data.client.MultipartBlockStateSupplier; import net.minecraft.data.client.MultipartBlockStateSupplier;
import net.minecraft.data.client.TextureKey;
import net.minecraft.data.client.TextureMap; import net.minecraft.data.client.TextureMap;
import net.minecraft.data.client.TexturedModel; import net.minecraft.data.client.TexturedModel;
import net.minecraft.data.client.VariantSettings; 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((g, block) -> g.registerParentedItemModel(block, ModelIds.getBlockModelId(block)), UBlocks.SHAPING_BENCH, UBlocks.SURFACE_CHITIN);
registerAll(UBlockStateModelGenerator::registerSimpleState, UBlocks.SHAPING_BENCH, UBlocks.BANANAS); registerAll(UBlockStateModelGenerator::registerSimpleState, UBlocks.SHAPING_BENCH, UBlocks.BANANAS);
// doors // 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 // cloud blocks
createCustomTexturePool(UBlocks.CLOUD, TexturedModel.CUBE_ALL).same(UBlocks.UNSTABLE_CLOUD).slab(UBlocks.CLOUD_SLAB).stairs(UBlocks.CLOUD_STAIRS); 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) { 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); var variants = BlockStateVariantMap.create(Properties.HORIZONTAL_FACING, Properties.DOUBLE_BLOCK_HALF, Properties.DOOR_HINGE, Properties.OPEN);
fillStableDoorVariantMap(variants, DoubleBlockHalf.LOWER, registerItemModel(door.asItem());
BlockModels.DOOR_LEFT.upload(door, "_bottom_left", bottomTextures, modelCollector), buildDoorStateModels(door, "", variants::register);
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)
);
blockStateCollector.accept(VariantsBlockStateSupplier.create(door).coordinate(variants)); blockStateCollector.accept(VariantsBlockStateSupplier.create(door).coordinate(variants));
} }
public static void fillStableDoorVariantMap( public void registerLockingDoor(Block door) {
BlockStateVariantMap.QuadrupleProperty<Direction, DoubleBlockHalf, DoorHinge, Boolean> variantMap, 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) { DoubleBlockHalf targetHalf, Identifier leftModelId, Identifier rightModelId) {
fillStableDoorVariantMap(variantMap, targetHalf, DoorHinge.LEFT, false, R0, leftModelId); fillStableDoorVariantMap(variantMap, targetHalf, DoorHinge.LEFT, false, R0, leftModelId);
fillStableDoorVariantMap(variantMap, targetHalf, DoorHinge.RIGHT, false, R0, rightModelId); fillStableDoorVariantMap(variantMap, targetHalf, DoorHinge.RIGHT, false, R0, rightModelId);
@ -373,7 +389,7 @@ public class UBlockStateModelGenerator extends BlockStateModelGenerator {
} }
public static void fillStableDoorVariantMap( public static void fillStableDoorVariantMap(
BlockStateVariantMap.QuadrupleProperty<Direction, DoubleBlockHalf, DoorHinge, Boolean> variantMap, DoorStateConsumer variantMap,
DoubleBlockHalf targetHalf, DoubleBlockHalf targetHalf,
DoorHinge hinge, boolean open, Rotation rotation, DoorHinge hinge, boolean open, Rotation rotation,
Identifier modelId) { 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) { public void registerPillar(Block pillar) {
TextureMap textures = new TextureMap() TextureMap textures = new TextureMap()
.put(SIDE, ModelIds.getBlockSubModelId(pillar, "_side")) .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.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.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.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.DAFFODIL_DAISY_SANDWICH, UItems.DRAGON_BREATH_SCROLL,
UItems.EMPTY_JAR, 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.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.GRYPHON_FEATHER, UItems.GREEN_FRIED_EGG,
UItems.HAY_BURGER, UItems.HAY_FRIES, UItems.HORSE_SHOE_FRIES, 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.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.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(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"); 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) ShapelessRecipeJsonBuilder.create(RecipeCategory.FOOD, UItems.ZAP_APPLE_JAM_JAR)

View file

@ -1,5 +1,8 @@
package com.minelittlepony.unicopia.datagen.providers.tag; 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.Objects;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@ -9,14 +12,18 @@ import com.minelittlepony.unicopia.UTags;
import com.minelittlepony.unicopia.block.UBlocks; import com.minelittlepony.unicopia.block.UBlocks;
import com.minelittlepony.unicopia.datagen.Datagen; import com.minelittlepony.unicopia.datagen.Datagen;
import com.minelittlepony.unicopia.datagen.ItemFamilies; import com.minelittlepony.unicopia.datagen.ItemFamilies;
import com.minelittlepony.unicopia.datagen.UBlockFamilies;
import com.minelittlepony.unicopia.item.BedsheetsItem; import com.minelittlepony.unicopia.item.BedsheetsItem;
import com.minelittlepony.unicopia.item.UItems; 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.FabricDataOutput;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider; import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider;
import net.fabricmc.fabric.api.tag.convention.v1.ConventionalItemTags; import net.fabricmc.fabric.api.tag.convention.v1.ConventionalItemTags;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.data.family.BlockFamily;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemConvertible;
import net.minecraft.item.Items; import net.minecraft.item.Items;
import net.minecraft.registry.Registries; import net.minecraft.registry.Registries;
import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryKeys;
@ -138,6 +145,7 @@ public class UItemTagProvider extends FabricTagProvider.ItemTagProvider {
.forceAddTag(UConventionalTags.Items.CORALS).forceAddTag(UConventionalTags.Items.CORAL_FANS); .forceAddTag(UConventionalTags.Items.CORALS).forceAddTag(UConventionalTags.Items.CORAL_FANS);
exportForagingTags(); exportForagingTags();
exportCreativeTabs();
exportFarmersDelightItems(); exportFarmersDelightItems();
} }
@ -184,6 +192,112 @@ public class UItemTagProvider extends FabricTagProvider.ItemTagProvider {
getOrCreateTagBuilder(UTags.Items.FORAGE_STRENGHENING).add(Items.FERN); getOrCreateTagBuilder(UTags.Items.FORAGE_STRENGHENING).add(Items.FERN);
getOrCreateTagBuilder(UTags.Items.FORAGE_SEVERE_NAUSEATING).add(Items.PITCHER_PLANT); getOrCreateTagBuilder(UTags.Items.FORAGE_SEVERE_NAUSEATING).add(Items.PITCHER_PLANT);
getOrCreateTagBuilder(UTags.Items.FORAGE_SEVERE_PRICKLY).add(Items.LARGE_FERN); 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() { private void exportConventionalTags() {
@ -229,8 +343,8 @@ public class UItemTagProvider extends FabricTagProvider.ItemTagProvider {
.addOptionalTag(new Identifier("c", "lemon_chickens")); .addOptionalTag(new Identifier("c", "lemon_chickens"));
getOrCreateTagBuilder(UConventionalTags.Items.ROTTEN_MEAT).add(Items.ROTTEN_FLESH); getOrCreateTagBuilder(UConventionalTags.Items.ROTTEN_MEAT).add(Items.ROTTEN_FLESH);
getOrCreateTagBuilder(UConventionalTags.Items.ROTTEN_INSECT).add(Items.FERMENTED_SPIDER_EYE); getOrCreateTagBuilder(UConventionalTags.Items.ROTTEN_INSECT).add(Items.FERMENTED_SPIDER_EYE);
getOrCreateTagBuilder(UConventionalTags.Items.COOKED_INSECT);//.add(Items.FERMENTED_SPIDER_EYE); TODO getOrCreateTagBuilder(UConventionalTags.Items.COOKED_INSECT).add(UItems.COOKED_FROG_LEGS);
getOrCreateTagBuilder(UConventionalTags.Items.RAW_INSECT).add(Items.SPIDER_EYE, UItems.BUTTERFLY, UItems.WHEAT_WORMS, UBlocks.WORM_BLOCK.asItem()); 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.WORMS).add(UItems.WHEAT_WORMS);
getOrCreateTagBuilder(UConventionalTags.Items.STICKS).add(Items.STICK); getOrCreateTagBuilder(UConventionalTags.Items.STICKS).add(Items.STICK);
getOrCreateTagBuilder(UConventionalTags.Items.ROCKS).add(UItems.ROCK); getOrCreateTagBuilder(UConventionalTags.Items.ROCKS).add(UItems.ROCK);

View file

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

View file

@ -90,7 +90,7 @@ public class FleeExplosionGoal extends Goal {
public static void notifySurroundings(Entity explosionSource, float radius) { public static void notifySurroundings(Entity explosionSource, float radius) {
explosionSource.getWorld().getOtherEntities(explosionSource, explosionSource.getBoundingBox().expand(radius), e -> { 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 -> { }).forEach(e -> {
getGoals((Creature)Living.living(e)).forEach(goal -> goal.setFleeTarget(explosionSource)); 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) { public BeeEntity onCreate(BeeEntity entity, EntityAppearance context, boolean replaceOld) {
super.onCreate(entity, context, replaceOld); super.onCreate(entity, context, replaceOld);
if (replaceOld && entity.getWorld().isClient) { 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; 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) { private synchronized void createPlayer(NbtCompound nbt, GameProfile profile, Caster<?> source) {
remove(); remove();
entity = InteractionManager.instance().createPlayer(source.asEntity(), profile); entity = InteractionManager.getInstance().createPlayer(source.asEntity(), profile);
entity.setCustomName(source.asEntity().getName()); entity.setCustomName(source.asEntity().getName());
((PlayerEntity)entity).readNbt(nbt.getCompound("playerNbt")); ((PlayerEntity)entity).readNbt(nbt.getCompound("playerNbt"));
if (nbt.contains("playerVisibleParts", NbtElement.BYTE_TYPE)) { 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) { public AbstractMinecartEntity onCreate(AbstractMinecartEntity entity, EntityAppearance context, boolean replaceOld) {
super.onCreate(entity, context, replaceOld); super.onCreate(entity, context, replaceOld);
if (replaceOld && entity.getWorld().isClient) { 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; return entity;
} }

View file

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

View file

@ -75,7 +75,7 @@ public class CorruptionHandler implements Tickable {
private void recover(float percentage) { private void recover(float percentage) {
pony.getCorruption().set((int)(pony.getCorruption().get() * (1 - 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(); MagicReserves reserves = pony.getMagicalReserves();
reserves.getExertion().addPercent(10); reserves.getExertion().addPercent(10);
reserves.getEnergy().add(10); reserves.getEnergy().add(10);

View file

@ -459,13 +459,13 @@ public class PlayerPhysics extends EntityPhysics<PlayerEntity> implements Tickab
if (type.isAvian()) { if (type.isAvian()) {
if (!SpellPredicate.IS_DISGUISE.isOn(pony) && pony.isClient()) { if (!SpellPredicate.IS_DISGUISE.isOn(pony) && pony.isClient()) {
if (ticksInAir % GLIDING_SOUND_INTERVAL == 5) { 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)) { } else if (type == FlightType.INSECTOID && !SpellPredicate.IS_DISGUISE.isOn(pony)) {
if (entity.getWorld().isClient && !soundPlaying) { if (entity.getWorld().isClient && !soundPlaying) {
soundPlaying = true; 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)); entity.addStatusEffect(new StatusEffectInstance(UEffects.SUN_BLINDNESS, SunBlindnessStatusEffect.MAX_DURATION, 2, true, false));
UCriteria.LOOK_INTO_SUN.trigger(entity); UCriteria.LOOK_INTO_SUN.trigger(entity);
} else if (isClientPlayer()) { } 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()) { if (!isClient()) {
entity.addStatusEffect(new StatusEffectInstance(UEffects.SUN_BLINDNESS, SunBlindnessStatusEffect.MAX_DURATION, 1, true, false)); entity.addStatusEffect(new StatusEffectInstance(UEffects.SUN_BLINDNESS, SunBlindnessStatusEffect.MAX_DURATION, 1, true, false));
} else if (isClientPlayer()) { } 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) { } else if (ticksInSun > 0) {
@ -966,7 +966,7 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, Update
} }
public boolean isClientPlayer() { public boolean isClientPlayer() {
return InteractionManager.instance().isClientPlayer(asEntity()); return InteractionManager.getInstance().isClientPlayer(asEntity());
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")

View file

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

View file

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

View file

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

View file

@ -49,7 +49,7 @@ public class ForageableItem extends Item {
if (state.isIn(BlockTags.LEAVES)) { if (state.isIn(BlockTags.LEAVES)) {
player.swingHand(hand); player.swingHand(hand);
world.playSound(player, pos, state.getSoundGroup().getHitSound(), SoundCategory.BLOCKS); 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); 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(); .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) { public static Stream<Pony> getPartyMembers(Caster<?> caster, double radius) {
return Pony.stream(caster.findAllEntitiesInRange(radius, entity -> isComrade(caster, entity))); 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 java.util.function.Predicate;
import org.jetbrains.annotations.Nullable; 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.CustomisedSpellType;
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
import com.minelittlepony.unicopia.client.TextHelper; 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()); 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); line = line.formatted(Formatting.OBFUSCATED);
} }
@ -105,13 +105,13 @@ public class GemstoneItem extends Item implements MultiItem, EnchantableItem {
@Override @Override
public boolean hasGlint(ItemStack stack) { 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 @Override
public Text getName(ItemStack stack) { public Text getName(ItemStack stack) {
if (EnchantableItem.isEnchanted(stack)) { if (EnchantableItem.isEnchanted(stack)) {
if (!Unicopia.SIDE.getPlayerSpecies().canCast()) { if (!InteractionManager.getInstance().getClientSpecies().canCast()) {
return Text.translatable(getTranslationKey(stack) + ".obfuscated"); 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.ImmutableMultimap;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import com.minelittlepony.unicopia.InteractionManager;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.USounds;
import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.entity.damage.UDamageTypes; import com.minelittlepony.unicopia.entity.damage.UDamageTypes;
import com.minelittlepony.unicopia.entity.mob.UEntityAttributes; import com.minelittlepony.unicopia.entity.mob.UEntityAttributes;
import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.Pony;
@ -53,18 +53,15 @@ public class HorseShoeItem extends HeavyProjectileItem {
float inaccuracy = projectileInnacuracy + degradation * 30; float inaccuracy = projectileInnacuracy + degradation * 30;
tooltip.add(Text.empty()); tooltip.add(Text.empty());
Pony pony = Unicopia.SIDE.getPony().orElse(null); var race = InteractionManager.getInstance().getClientPony().map(Pony::getCompositeRace).orElse(null);
float speed = baseProjectileSpeed; float speed = baseProjectileSpeed;
if (pony != null) { if (race != null) {
var race = pony.getCompositeRace();
if (race.any(Race::canUseEarth)) { if (race.any(Race::canUseEarth)) {
speed += 0.5F; speed += 0.5F;
} }
if (!race.includes(Race.ALICORN) && race.physical().canFly()) { if (!race.includes(Race.ALICORN) && race.physical().canFly()) {
speed /= 1.5F; speed /= 1.5F;
} }
} }
speed /= 1.5F; speed /= 1.5F;
speed *= 1 - (0.6F * degradation); speed *= 1 - (0.6F * degradation);

View file

@ -31,6 +31,20 @@ public interface UFoodComponents {
FoodComponent SCONE = builder(2, 0.2F).build(); FoodComponent SCONE = builder(2, 0.2F).build();
FoodComponent FRIED_EGG = builder(4, 0.4F).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 WORMS = builder(1, 1.5F).alwaysEdible().meat().build();
FoodComponent INSECTS = builder(1, 0).alwaysEdible().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_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_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_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_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 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 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 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 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); 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 java.util.List;
import com.minelittlepony.unicopia.InteractionManager;
import com.minelittlepony.unicopia.UConventionalTags; import com.minelittlepony.unicopia.UConventionalTags;
import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.advancement.UCriteria; import com.minelittlepony.unicopia.advancement.UCriteria;
import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.Living;
import com.minelittlepony.unicopia.entity.damage.UDamageTypes; import com.minelittlepony.unicopia.entity.damage.UDamageTypes;
@ -101,7 +101,7 @@ public class ZapAppleItem extends Item implements ChameleonItem, MultiItem {
@Override @Override
public List<ItemStack> getDefaultStacks() { public List<ItemStack> getDefaultStacks() {
return Unicopia.SIDE.getPony().map(Pony::asWorld) return InteractionManager.getInstance().getClientPony().map(Pony::asWorld)
.stream() .stream()
.flatMap(world -> RegistryUtils.valuesForTag(world, UConventionalTags.Items.APPLES)) .flatMap(world -> RegistryUtils.valuesForTag(world, UConventionalTags.Items.APPLES))
.filter(a -> a != this).map(item -> { .filter(a -> a != this).map(item -> {

View file

@ -31,7 +31,7 @@ public class CloudBlockItem extends BlockItem {
@Override @Override
public TypedActionResult<ItemStack> use(World world, PlayerEntity user, Hand hand) { 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)); 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( ItemPlacementContext context = new ItemPlacementContext(user, hand, user.getStackInHand(hand), new BlockHitResult(
targetPos, targetPos,

View file

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

View file

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

View file

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

View file

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