Polish Milestone 7 models textures and link effects
Build / build (push) Canceled after 0s

This commit is contained in:
dnorberg committed 2026-10-19 04:32:35 -04:00
1 parent b154455563
commit 1ff62e9aaa
32 files changed
+1166 -64

No files matched your search

@@ -1,14 +1,12 @@
package net.dnorberg.rivencraft.block;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
/** Solid footing for Age arrivals, rendered as a translucent cloud. */
/** Solid crystal-textured footing for Age arrivals that cannot be collected. */
public final class CloudPlatformBlock extends Block {
public CloudPlatformBlock(Properties properties) {
super(properties);
@@ -18,19 +16,4 @@ public final class CloudPlatformBlock extends Block {
public ItemStack getCloneItemStack(LevelReader level, BlockPos pos, BlockState state) {
return ItemStack.EMPTY;
}
@Override
protected boolean skipRendering(BlockState state, BlockState adjacent, Direction side) {
return adjacent.is(this) || super.skipRendering(state, adjacent, side);
}
@Override
protected boolean propagatesSkylightDown(BlockState state, BlockGetter level, BlockPos pos) {
return true;
}
@Override
protected int getLightBlock(BlockState state, BlockGetter level, BlockPos pos) {
return 0;
}
}
@@ -20,6 +20,9 @@ public final class CloudPlatformGameTests {
helper.getLevel().setBlock(pos, state, 2);
helper.assertTrue(!state.getCollisionShape(helper.getLevel(), pos).isEmpty(),
"Cloud platform must support a standing player");
helper.assertTrue(state.canOcclude(), "Arrival platform must be opaque");
helper.assertValueEqual(state.getDestroySpeed(helper.getLevel(), pos), 0.3F,
"Arrival platform should break as easily as glass");
helper.assertTrue(ModBlocks.CLOUD_PLATFORM.get().getCloneItemStack(helper.getLevel(), pos, state).isEmpty(),
"Cloud platform must not provide a pick-block item");
helper.succeed();
@@ -0,0 +1,41 @@
package net.dnorberg.rivencraft.book;
import net.dnorberg.rivencraft.registry.ModSounds;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.phys.Vec3;
/** Legacy-style sound and particle bursts at both ends of a successful link. */
public final class LinkVisualEffects {
private static final int PARTICLE_COUNT = 50;
private LinkVisualEffects() {}
public static SoundEvent sound(LinkProperties properties, boolean portal) {
// Legacy's Disarm flag takes precedence over a portal's sound override.
if (properties.has(LinkProperties.DISARM)) return ModSounds.LINK_DISARM.get();
if (portal) return ModSounds.LINK_PORTAL.get();
if (properties.has(LinkProperties.INTRA_LINKING)) return ModSounds.LINK_INTRA.get();
return ModSounds.LINK.get();
}
public static void play(ServerLevel source, Vec3 departure, ServerPlayer player,
LinkProperties properties, boolean portal) {
SoundEvent event = sound(properties, portal);
burst(source, departure, event);
burst(player.serverLevel(), player.position(), event);
}
private static void burst(ServerLevel level, Vec3 position, SoundEvent event) {
level.playSound(null, position.x, position.y, position.z, event,
SoundSource.PLAYERS, 0.8F, level.random.nextFloat() * 0.2F + 0.9F);
// Legacy emitted 50 small neutral particles in a roughly one-by-two-
// block space. Cloud particles are a vanilla gray-white stand-in for
// its removed fixed-function particle class.
level.sendParticles(ParticleTypes.CLOUD, position.x, position.y, position.z,
PARTICLE_COUNT, 0.5, 1.0, 0.5, 0.005);
}
}
@@ -78,7 +78,7 @@ public final class ClientEvents {
ItemBlockRenderTypes.setRenderLayer(ModBlocks.MEDIUM_CRYSTAL_BUD.get(), RenderType.cutout());
ItemBlockRenderTypes.setRenderLayer(ModBlocks.LARGE_CRYSTAL_BUD.get(), RenderType.cutout());
ItemBlockRenderTypes.setRenderLayer(ModBlocks.CRYSTAL_CLUSTER.get(), RenderType.cutout());
ItemBlockRenderTypes.setRenderLayer(ModBlocks.CLOUD_PLATFORM.get(), RenderType.translucent());
ItemBlockRenderTypes.setRenderLayer(ModBlocks.INK_MIXER.get(), RenderType.cutout());
ItemBlockRenderTypes.setRenderLayer(ModBlocks.CRYSTAL_PORTAL.get(), RenderType.translucent());
// Immersive Portals composes the remote view before translucent blocks.
// Draw the opaque crystal frame in that later pass so it masks the view;
@@ -0,0 +1,31 @@
package net.dnorberg.rivencraft.gametest;
import net.dnorberg.rivencraft.Rivencraft;
import net.dnorberg.rivencraft.book.LinkProperties;
import net.dnorberg.rivencraft.book.LinkVisualEffects;
import net.dnorberg.rivencraft.registry.ModSounds;
import net.minecraft.gametest.framework.GameTest;
import net.minecraft.gametest.framework.GameTestHelper;
import net.neoforged.neoforge.gametest.GameTestHolder;
import net.neoforged.neoforge.gametest.PrefixGameTestTemplate;
@GameTestHolder(Rivencraft.MOD_ID)
@PrefixGameTestTemplate(false)
public final class Milestone7PolishGameTests {
private Milestone7PolishGameTests() {}
@GameTest(template = "empty")
public static void linkSoundPriorityMatchesLegacy(GameTestHelper helper) {
helper.assertTrue(LinkVisualEffects.sound(LinkProperties.NONE, false) == ModSounds.LINK.get(),
"Ordinary book travel uses the Legacy link sound");
helper.assertTrue(LinkVisualEffects.sound(new LinkProperties(LinkProperties.INTRA_LINKING), false)
== ModSounds.LINK_INTRA.get(),
"Intra Linking uses its Legacy sound");
helper.assertTrue(LinkVisualEffects.sound(LinkProperties.NONE, true) == ModSounds.LINK_PORTAL.get(),
"Portal travel uses its Legacy sound");
helper.assertTrue(LinkVisualEffects.sound(new LinkProperties(LinkProperties.DISARM), true)
== ModSounds.LINK_DISARM.get(),
"Legacy Disarm takes precedence over the portal sound");
helper.succeed();
}
}
@@ -6,21 +6,21 @@ import net.dnorberg.rivencraft.book.AgeVisitSavedData;
import net.dnorberg.rivencraft.book.LinkTarget;
import net.dnorberg.rivencraft.book.LinkProperties;
import net.dnorberg.rivencraft.book.LinkingService;
import net.dnorberg.rivencraft.book.LinkVisualEffects;
import net.dnorberg.rivencraft.book.AgeDimensionService;
import net.dnorberg.rivencraft.config.RivencraftConfig;
import net.dnorberg.rivencraft.registry.ModDataComponents;
import net.dnorberg.rivencraft.registry.ModItems;
import net.dnorberg.rivencraft.registry.ModSounds;
import net.minecraft.ChatFormatting;
import net.minecraft.core.component.DataComponents;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundSource;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.phys.Vec3;
/**
* A book that will eventually describe and link to a generated Age.
@@ -62,7 +62,7 @@ public final class DescriptiveBookItem extends Item {
}
ServerLevel sourceLevel = player.serverLevel();
var sourcePosition = player.blockPosition();
Vec3 sourcePosition = player.position();
LinkProperties properties = stack.getOrDefault(ModDataComponents.LINK_PROPERTIES.get(), LinkProperties.NONE)
.forDescriptiveBook();
LinkingService.LinkResult result = portal
@@ -85,10 +85,7 @@ public final class DescriptiveBookItem extends Item {
player.drop(returnBook, false);
}
}
sourceLevel.playSound(null, sourcePosition, (portal ? ModSounds.LINK_PORTAL : ModSounds.LINK).get(), SoundSource.PLAYERS,
0.8F, sourceLevel.random.nextFloat() * 0.2F + 0.9F);
player.level().playSound(null, player.blockPosition(), (portal ? ModSounds.LINK_PORTAL : ModSounds.LINK).get(), SoundSource.PLAYERS,
0.8F, player.level().random.nextFloat() * 0.2F + 0.9F);
LinkVisualEffects.play(sourceLevel, sourcePosition, player, properties, portal);
player.displayClientMessage(Component.translatable(
createReturnLink ? "message.rivencraft.descriptive_book.linked_first" : "message.rivencraft.descriptive_book.linked",
age.name()
@@ -4,16 +4,15 @@ import java.util.List;
import net.dnorberg.rivencraft.book.LinkTarget;
import net.dnorberg.rivencraft.book.AgeRegistrySavedData;
import net.dnorberg.rivencraft.book.LinkingService;
import net.dnorberg.rivencraft.book.LinkVisualEffects;
import net.dnorberg.rivencraft.book.LinkProperties;
import net.dnorberg.rivencraft.registry.ModDataComponents;
import net.dnorberg.rivencraft.registry.ModSounds;
import net.minecraft.ChatFormatting;
import net.minecraft.core.BlockPos;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.entity.player.Player;
@@ -21,6 +20,7 @@ import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
public final class LinkingBookItem extends Item {
public LinkingBookItem(Properties properties) {
@@ -56,23 +56,14 @@ public final class LinkingBookItem extends Item {
return InteractionResultHolder.fail(stack);
}
Level sourceLevel = player.level();
BlockPos sourcePosition = player.blockPosition();
ServerLevel sourceLevel = player.serverLevel();
Vec3 sourcePosition = player.position();
LinkProperties properties = stack.getOrDefault(ModDataComponents.LINK_PROPERTIES.get(), LinkProperties.NONE);
LinkingService.LinkResult result = portal
? LinkingService.travelPortal(player, target, properties)
: LinkingService.travel(player, target, properties);
if (result == LinkingService.LinkResult.SUCCESS) {
sourceLevel.playSound(null, sourcePosition, (portal ? ModSounds.LINK_PORTAL : ModSounds.LINK).get(), SoundSource.PLAYERS,
0.8F, sourceLevel.random.nextFloat() * 0.2F + 0.9F);
player.level().playSound(
null,
player.blockPosition(),
(portal ? ModSounds.LINK_PORTAL : ModSounds.LINK).get(),
SoundSource.PLAYERS,
0.8F,
player.level().random.nextFloat() * 0.2F + 0.9F
);
LinkVisualEffects.play(sourceLevel, sourcePosition, player, properties, portal);
player.displayClientMessage(Component.translatable("message.rivencraft.linking_book.linked"), true);
return InteractionResultHolder.success(stack);
}
@@ -70,8 +70,8 @@ public final class ModBlocks {
DecayBlock::new, BlockBehaviour.Properties.ofFullCopy(Blocks.STONE)
.strength(5.0F, 10.0F).noLootTable());
public static final DeferredBlock<CloudPlatformBlock> CLOUD_PLATFORM = BLOCKS.registerBlock("cloud_platform",
CloudPlatformBlock::new, BlockBehaviour.Properties.ofFullCopy(Blocks.WHITE_STAINED_GLASS)
.strength(1.5F).noOcclusion().noLootTable());
CloudPlatformBlock::new, BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK)
.mapColor(MapColor.COLOR_BLUE).strength(0.3F).noLootTable());
private ModBlocks() {
}
@@ -14,6 +14,8 @@ public final class ModSounds {
DeferredRegister.create(Registries.SOUND_EVENT, Rivencraft.MOD_ID);
public static final DeferredHolder<SoundEvent, SoundEvent> LINK = register("linking.link");
public static final DeferredHolder<SoundEvent, SoundEvent> LINK_DISARM = register("linking.link-disarm");
public static final DeferredHolder<SoundEvent, SoundEvent> LINK_INTRA = register("linking.link-intra");
public static final DeferredHolder<SoundEvent, SoundEvent> LINK_FISSURE = register("linking.link-fissure");
public static final DeferredHolder<SoundEvent, SoundEvent> LINK_PORTAL = register("linking.link-portal");
public static final DeferredHolder<SoundEvent, SoundEvent> METEOR_ROAR = register("entity.meteor.roar");
@@ -26,7 +26,7 @@
"container.rivencraft.book_binder": "Book Binder",
"block.rivencraft.ink_mixer": "Ink Mixer",
"block.rivencraft.decay": "Decay",
"block.rivencraft.cloud_platform": "Cloud Platform",
"block.rivencraft.cloud_platform": "Crystal Platform",
"container.rivencraft.ink_mixer": "Ink Mixer",
"screen.rivencraft.ink_mixer.ink": "Ink: %s/%s",
"screen.rivencraft.ink_mixer.additive_hint": "Click the basin with an additive; right-click adds one.",
@@ -39,6 +39,28 @@
"down": {"texture":"#press","uv":[8.5,0,10,7]}
}
},
{
"from": [6, 10, 1], "to": [7, 14, 15],
"faces": {
"north": {"texture":"#press","uv":[7,13,7.5,15]},
"east": {"texture":"#press","uv":[7.5,13,14.5,15]},
"south": {"texture":"#press","uv":[14.5,13,15,15]},
"west": {"texture":"#press","uv":[0,13,7,15]},
"up": {"texture":"#press","uv":[0,6,0.5,13]},
"down": {"texture":"#press","uv":[0.5,6,1,13]}
}
},
{
"from": [9, 10, 1], "to": [10, 14, 15],
"faces": {
"north": {"texture":"#press","uv":[7,13,7.5,15]},
"east": {"texture":"#press","uv":[0,13,7,15]},
"south": {"texture":"#press","uv":[14.5,13,15,15]},
"west": {"texture":"#press","uv":[7.5,13,14.5,15]},
"up": {"texture":"#press","uv":[0,6,0.5,13]},
"down": {"texture":"#press","uv":[0.5,6,1,13]}
}
},
{
"from": [3, 11, 3], "to": [13, 12, 4],
"faces": {
@@ -56,6 +78,17 @@
"up": {"texture":"#press","uv":[0.5,15,5.5,15.5]},
"down": {"texture":"#press","uv":[5.5,15,10.5,15.5]}
}
},
{
"from": [7, 10, 4.5], "to": [9, 15, 11.5],
"faces": {
"north": {"texture":"#press","uv":[4.5,10.5,5.5,13]},
"east": {"texture":"#press","uv":[1,10.5,4.5,13]},
"south": {"texture":"#press","uv":[9,10,10,13]},
"west": {"texture":"#press","uv":[5.5,10.5,9,13]},
"up": {"texture":"#press","uv":[4.5,7,5.5,10.5]},
"down": {"texture":"#press","uv":[5.5,7,6.5,10.5]}
}
}
]
}
@@ -1 +1 @@
{"parent":"minecraft:block/cube_all","render_type":"minecraft:translucent","textures":{"all":"rivencraft:block/cloud_platform"}}
{"parent":"minecraft:block/cube_all","textures":{"all":"rivencraft:block/crystal_block"}}
@@ -1 +1 @@
{"textures":{"portal":"rivencraft:block/crystal_portal"},"elements":[{"from":[0,0,7.5],"to":[16,16,8.5],"shade":false,"faces":{"north":{"texture":"#portal"},"south":{"texture":"#portal"}}}]}
{"render_type":"minecraft:translucent","ambientocclusion":false,"textures":{"particle":"rivencraft:block/crystal_portal","portal":"rivencraft:block/crystal_portal"},"elements":[{"from":[0,0,6],"to":[16,16,10],"shade":false,"faces":{"north":{"texture":"#portal"},"south":{"texture":"#portal"}}}]}
@@ -1,23 +1,971 @@
{
"parent": "minecraft:block/block",
"textures": {
"particle": "rivencraft:block/ink_mixer_side",
"side": "rivencraft:block/ink_mixer_side",
"top": "rivencraft:block/ink_mixer_top",
"bottom": "rivencraft:block/ink_mixer_bottom"
"0": "rivencraft:block/inkwell_base",
"1": "rivencraft:block/inkwell_cup",
"2": "rivencraft:block/ink",
"3": "rivencraft:block/ink_glass",
"particle": "rivencraft:block/inkwell_base",
"paper": "minecraft:block/white_concrete"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 12, 16],
"from": [
0,
0,
0
],
"to": [
16,
9,
16
],
"faces": {
"north": { "texture": "#side", "uv": [0, 4, 16, 16] },
"east": { "texture": "#side", "uv": [0, 4, 16, 16] },
"south": { "texture": "#side", "uv": [0, 4, 16, 16] },
"west": { "texture": "#side", "uv": [0, 4, 16, 16] },
"up": { "texture": "#top" },
"down": { "texture": "#bottom" }
"north": {
"texture": "#0",
"uv": [
0,
5,
4,
7
]
},
"east": {
"texture": "#0",
"uv": [
4,
5,
8,
7
]
},
"south": {
"texture": "#0",
"uv": [
8,
5,
12,
7
]
},
"west": {
"texture": "#0",
"uv": [
12,
5,
16,
7
]
},
"down": {
"texture": "#0",
"uv": [
8,
0,
12,
4
]
}
}
},
{
"from": [
0,
9,
0
],
"to": [
16,
12,
16
],
"faces": {
"north": {
"texture": "#0",
"uv": [
0,
4,
4,
5
]
},
"east": {
"texture": "#0",
"uv": [
4,
4,
8,
5
]
},
"south": {
"texture": "#0",
"uv": [
8,
4,
12,
5
]
},
"west": {
"texture": "#0",
"uv": [
12,
4,
16,
5
]
},
"up": {
"texture": "#0",
"uv": [
4,
0,
8,
4
]
}
}
},
{
"from": [
9,
12,
6
],
"to": [
13,
13,
10
],
"faces": {
"north": {
"texture": "#1",
"uv": [
0,
0,
4,
1
]
},
"east": {
"texture": "#1",
"uv": [
4,
0,
8,
1
]
},
"south": {
"texture": "#1",
"uv": [
8,
0,
12,
1
]
},
"west": {
"texture": "#1",
"uv": [
12,
0,
16,
1
]
}
}
},
{
"from": [
8,
13,
5
],
"to": [
14,
16,
6
],
"faces": {
"north": {
"texture": "#1",
"uv": [
7,
1,
13,
4
]
},
"east": {
"texture": "#1",
"uv": [
6,
1,
7,
4
]
},
"south": {
"texture": "#1",
"uv": [
0,
1,
6,
4
]
},
"west": {
"texture": "#1",
"uv": [
13,
1,
14,
4
]
},
"up": {
"texture": "#1",
"uv": [
0,
0,
6,
1
]
},
"down": {
"texture": "#1",
"uv": [
0,
0,
6,
1
]
}
}
},
{
"from": [
8,
13,
10
],
"to": [
14,
16,
11
],
"faces": {
"north": {
"texture": "#1",
"uv": [
0,
0,
6,
3
]
},
"east": {
"texture": "#1",
"uv": [
0,
0,
1,
3
]
},
"south": {
"texture": "#1",
"uv": [
0,
0,
6,
3
]
},
"west": {
"texture": "#1",
"uv": [
0,
0,
1,
3
]
},
"up": {
"texture": "#1",
"uv": [
0,
0,
6,
1
]
},
"down": {
"texture": "#1",
"uv": [
0,
0,
6,
1
]
}
}
},
{
"from": [
8,
13,
6
],
"to": [
9,
16,
10
],
"faces": {
"north": {
"texture": "#1",
"uv": [
0,
0,
1,
3
]
},
"east": {
"texture": "#1",
"uv": [
0,
0,
4,
3
]
},
"south": {
"texture": "#1",
"uv": [
0,
0,
1,
3
]
},
"west": {
"texture": "#1",
"uv": [
0,
0,
4,
3
]
},
"up": {
"texture": "#1",
"uv": [
0,
0,
1,
4
]
},
"down": {
"texture": "#1",
"uv": [
0,
0,
1,
4
]
}
}
},
{
"from": [
13,
13,
6
],
"to": [
14,
16,
10
],
"faces": {
"north": {
"texture": "#1",
"uv": [
0,
0,
1,
3
]
},
"east": {
"texture": "#1",
"uv": [
0,
0,
4,
3
]
},
"south": {
"texture": "#1",
"uv": [
0,
0,
1,
3
]
},
"west": {
"texture": "#1",
"uv": [
0,
0,
4,
3
]
},
"up": {
"texture": "#1",
"uv": [
0,
0,
1,
4
]
},
"down": {
"texture": "#1",
"uv": [
0,
0,
1,
4
]
}
}
},
{
"from": [
9,
14,
6
],
"to": [
13,
15,
10
],
"faces": {
"up": {
"texture": "#2",
"uv": [
0,
0,
4,
3
]
}
}
},
{
"from": [
7,
12,
2
],
"to": [
9,
14,
4
],
"rotation": {
"origin": [
8,
8,
8
],
"axis": "y",
"angle": 22.5
},
"faces": {
"north": {
"texture": "#3",
"uv": [
0,
0,
2,
2
]
},
"east": {
"texture": "#3",
"uv": [
2,
0,
4,
2
]
},
"south": {
"texture": "#3",
"uv": [
4,
0,
6,
2
]
},
"west": {
"texture": "#3",
"uv": [
6,
0,
8,
2
]
},
"up": {
"texture": "#3",
"uv": [
0,
2,
2,
4
]
},
"down": {
"texture": "#3",
"uv": [
0,
0,
2,
2
]
}
}
},
{
"from": [
1,
12,
6
],
"to": [
3,
14,
8
],
"rotation": {
"origin": [
8,
8,
8
],
"axis": "y",
"angle": -22.5
},
"faces": {
"north": {
"texture": "#3",
"uv": [
0,
0,
2,
2
]
},
"east": {
"texture": "#3",
"uv": [
2,
0,
4,
2
]
},
"south": {
"texture": "#3",
"uv": [
4,
0,
6,
2
]
},
"west": {
"texture": "#3",
"uv": [
6,
0,
8,
2
]
},
"up": {
"texture": "#3",
"uv": [
0,
2,
2,
4
]
},
"down": {
"texture": "#3",
"uv": [
0,
0,
2,
2
]
}
}
},
{
"from": [
7.5,
14,
2.5
],
"to": [
8.5,
15,
3.5
],
"rotation": {
"origin": [
8,
8,
8
],
"axis": "y",
"angle": 22.5
},
"faces": {
"north": {
"texture": "#3",
"uv": [
0,
0,
1,
1
]
},
"east": {
"texture": "#3",
"uv": [
2,
0,
3,
1
]
},
"south": {
"texture": "#3",
"uv": [
4,
0,
5,
1
]
},
"west": {
"texture": "#3",
"uv": [
6,
0,
7,
1
]
},
"up": {
"texture": "#3",
"uv": [
0,
2,
1,
3
]
},
"down": {
"texture": "#3",
"uv": [
0,
0,
1,
1
]
}
}
},
{
"from": [
1.5,
14,
6.5
],
"to": [
2.5,
15,
7.5
],
"rotation": {
"origin": [
8,
8,
8
],
"axis": "y",
"angle": -22.5
},
"faces": {
"north": {
"texture": "#3",
"uv": [
0,
0,
1,
1
]
},
"east": {
"texture": "#3",
"uv": [
2,
0,
3,
1
]
},
"south": {
"texture": "#3",
"uv": [
4,
0,
5,
1
]
},
"west": {
"texture": "#3",
"uv": [
6,
0,
7,
1
]
},
"up": {
"texture": "#3",
"uv": [
0,
2,
1,
3
]
},
"down": {
"texture": "#3",
"uv": [
0,
0,
1,
1
]
}
}
},
{
"from": [
4,
12,
5
],
"to": [
6,
14,
7
],
"rotation": {
"origin": [
8,
8,
8
],
"axis": "y",
"angle": 22.5
},
"faces": {
"north": {
"texture": "#3",
"uv": [
0,
0,
2,
2
]
},
"east": {
"texture": "#3",
"uv": [
2,
0,
4,
2
]
},
"south": {
"texture": "#3",
"uv": [
4,
0,
6,
2
]
},
"west": {
"texture": "#3",
"uv": [
6,
0,
8,
2
]
},
"up": {
"texture": "#3",
"uv": [
0,
2,
2,
4
]
},
"down": {
"texture": "#3",
"uv": [
0,
0,
2,
2
]
}
}
},
{
"from": [
4.5,
14,
5.5
],
"to": [
5.5,
15,
6.5
],
"rotation": {
"origin": [
8,
8,
8
],
"axis": "y",
"angle": 22.5
},
"faces": {
"north": {
"texture": "#3",
"uv": [
0,
0,
1,
1
]
},
"east": {
"texture": "#3",
"uv": [
2,
0,
3,
1
]
},
"south": {
"texture": "#3",
"uv": [
4,
0,
5,
1
]
},
"west": {
"texture": "#3",
"uv": [
6,
0,
7,
1
]
},
"up": {
"texture": "#3",
"uv": [
0,
2,
1,
3
]
},
"down": {
"texture": "#3",
"uv": [
0,
0,
1,
1
]
}
}
},
{
"from": [
1,
12.01,
2
],
"to": [
7,
12.16,
11
],
"faces": {
"north": {
"texture": "#paper"
},
"east": {
"texture": "#paper"
},
"south": {
"texture": "#paper"
},
"west": {
"texture": "#paper"
},
"up": {
"texture": "#paper"
},
"down": {
"texture": "#paper"
}
}
}
]
],
"render_type": "minecraft:cutout"
}
@@ -7,6 +7,14 @@
}
]
},
"linking.link-disarm": {
"category": "player",
"sounds": [{"name": "rivencraft:linking/link-disarm"}]
},
"linking.link-intra": {
"category": "player",
"sounds": [{"name": "rivencraft:linking/link-intra"}]
},
"linking.link-fissure": {
"category": "player",
"sounds": [{"name": "rivencraft:linking/link-fissure"}]
Binary file not shown.

Before

Width:  |  Height:  |  Size: 868 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 311 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 747 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 616 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 715 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 B