Skip to content

Commit

Permalink
0.1.0b
Browse files Browse the repository at this point in the history
  • Loading branch information
Flamarine committed Oct 15, 2022
1 parent 5c085b4 commit d7b52ea
Show file tree
Hide file tree
Showing 23 changed files with 649 additions and 126 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ loom.platform=forge
yarn_mappings=1.18.2+build.4

# Mod Properties
mod_version=0.1.0a
mod_version=0.1.0b
maven_group=io.github.dovecotmc
archives_base_name=LeadBeyond
mod_id=lead_beyond
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import net.minecraft.client.render.RenderLayers;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;

@SuppressWarnings("unused")
public class LeadBeyondClient {
public static void clientSetup(final FMLClientSetupEvent event) {
RenderLayers.setRenderLayer(BlockReg.TICKET_VENDOR.get(), RenderLayer.getTranslucent());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package io.github.dovecotmc.leadbeyond.common.block;

import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.ShapeContext;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.shape.VoxelShape;
import net.minecraft.world.BlockView;

import java.util.function.Function;

public class CustomVoxelShapeBlock extends Block {
private final Function<BlockState, VoxelShape> shape;

public CustomVoxelShapeBlock(Settings settings, Function<BlockState, VoxelShape> shape) {
super(settings);
this.shape = shape;
}

public CustomVoxelShapeBlock(Settings settings, VoxelShape shape) {
super(settings);
this.shape = (state -> shape);
}

@Override
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
return shape.apply(state);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package io.github.dovecotmc.leadbeyond.common.block;

import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.item.ItemPlacementContext;
import net.minecraft.state.StateManager;
import net.minecraft.state.property.DirectionProperty;
import net.minecraft.state.property.Properties;
import net.minecraft.util.BlockMirror;
import net.minecraft.util.BlockRotation;
import net.minecraft.util.math.Direction;
import net.minecraft.util.shape.VoxelShape;

import java.util.function.Function;

public class HorizontalCVSBlock extends CustomVoxelShapeBlock {
public static final DirectionProperty FACING = Properties.HORIZONTAL_FACING;

public HorizontalCVSBlock(Settings settings, Function<BlockState, VoxelShape> shape) {
super(settings, shape);
setDefaultState(this.stateManager.getDefaultState()
.with(FACING, Direction.NORTH));
}

public HorizontalCVSBlock(Settings settings, VoxelShape shape) {
this(settings, (state -> shape));
}

public BlockState rotate(BlockState state, BlockRotation rotation) {
return state.with(FACING, rotation.rotate(state.get(FACING)));
}

public BlockState mirror(BlockState state, BlockMirror mirror) {
return state.rotate(mirror.getRotation(state.get(FACING)));
}

@Override
public BlockState getPlacementState(ItemPlacementContext ctx) {
return this.getDefaultState()
.with(FACING, ctx.getPlayerFacing().getOpposite());
}

@Override
protected void appendProperties(StateManager.Builder<Block, BlockState> stateManager) {
stateManager.add(FACING);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
package io.github.dovecotmc.leadbeyond.common.block;

import com.simibubi.create.content.contraptions.components.actors.SeatBlock;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.ShapeContext;
import net.minecraft.item.ItemPlacementContext;
import net.minecraft.state.StateManager;
import net.minecraft.state.property.DirectionProperty;
import net.minecraft.state.property.Properties;
import net.minecraft.util.BlockMirror;
import net.minecraft.util.BlockRotation;
import net.minecraft.util.DyeColor;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.shape.VoxelShape;
import net.minecraft.util.shape.VoxelShapes;
import net.minecraft.world.BlockView;
import org.jetbrains.annotations.NotNull;

public class LBSeatBlock extends SeatBlock {
public static final DirectionProperty FACING = Properties.HORIZONTAL_FACING;
private final VoxelShape northShape;
private final VoxelShape southShape;
private final VoxelShape westShape;
private final VoxelShape eastShape;

public LBSeatBlock(@NotNull Settings settings) {
super(settings.nonOpaque(), DyeColor.BLUE, true);
// Preventing lag
this.northShape = makeNorthShape();
this.southShape = makeSouthShape();
this.westShape = makeWestShape();
this.eastShape = makeEastShape();
setDefaultState(this.stateManager.getDefaultState()
.with(FACING, Direction.NORTH)
.with(WATERLOGGED, false));
}

@Override
protected void appendProperties(@NotNull StateManager.Builder<Block, BlockState> stateManager) {
super.appendProperties(stateManager.add(FACING));
}

public BlockState rotate(BlockState state, BlockRotation rotation) {
return state.with(FACING, rotation.rotate(state.get(FACING)));
}

public BlockState mirror(BlockState state, BlockMirror mirror) {
return state.rotate(mirror.getRotation(state.get(FACING)));
}

@Override
public BlockState getPlacementState(ItemPlacementContext ctx) {
return this.getDefaultState()
.with(FACING, ctx.getPlayerFacing().getOpposite())
.with(WATERLOGGED, false);
}

@Override
public @NotNull VoxelShape getOutlineShape(@NotNull BlockState state, @NotNull BlockView world, @NotNull BlockPos pos, @NotNull ShapeContext ctx) {
return switch (state.get(FACING)) {
default -> VoxelShapes.fullCube();
case NORTH -> northShape;
case SOUTH -> southShape;
case WEST -> westShape;
case EAST -> eastShape;
};
}

@Override
public @NotNull VoxelShape getCollisionShape(@NotNull BlockState state, @NotNull BlockView world, @NotNull BlockPos pos, @NotNull ShapeContext ctx) {
return getOutlineShape(state, world, pos, ctx);
}

// Generated using Blockbench
private static VoxelShape makeNorthShape(){
VoxelShape shape = VoxelShapes.empty();
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.8125, 0.0625, 0.375, 0.875, 0.25, 0.625));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.8125, 0, 0.1875, 0.875, 0.0625, 0.8125));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.125, 0.0625, 0.375, 0.1875, 0.25, 0.625));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.125, 0, 0.1875, 0.1875, 0.0625, 0.8125));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.1875, 0, 0.4375, 0.8125, 0.0625, 0.5625));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.125, 0.25, 0, 0.875, 0.5, 0.75));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.125, 0.375, 0.578125, 0.875, 1.375, 0.828125));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0, 0.25, 0.1875, 0.125, 0.6875, 0.8125));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0, 0.25, 0.03125, 0.125, 0.4375, 0.1875));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0, 0.6875, 0.0625, 0.125, 0.8125, 0.8125));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.875, 0.6875, 0.0625, 1, 0.8125, 0.8125));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.875, 0.25, 0.1875, 1, 0.6875, 0.8125));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.875, 0.25, 0.03125, 1, 0.4375, 0.1875));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.15625, 0.6875, 0.8125, 0.84375, 1.125, 0.84375));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.09375, 0.5625, 0.80625, 0.15625, 1.078125, 0.8375));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.84375, 0.5625, 0.80625, 0.90625, 1.078125, 0.8375));
return shape;
}

// Generated using Blockbench
private static VoxelShape makeSouthShape(){
VoxelShape shape = VoxelShapes.empty();
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.125, 0.0625, 0.375, 0.1875, 0.25, 0.625));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.125, 0, 0.1875, 0.1875, 0.0625, 0.8125));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.8125, 0.0625, 0.375, 0.875, 0.25, 0.625));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.8125, 0, 0.1875, 0.875, 0.0625, 0.8125));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.1875, 0, 0.4375, 0.8125, 0.0625, 0.5625));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.125, 0.25, 0.25, 0.875, 0.5, 1));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.125, 0.375, 0.171875, 0.875, 1.375, 0.421875));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.875, 0.25, 0.1875, 1, 0.6875, 0.8125));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.875, 0.25, 0.8125, 1, 0.4375, 0.96875));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.875, 0.6875, 0.1875, 1, 0.8125, 0.9375));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0, 0.6875, 0.1875, 0.125, 0.8125, 0.9375));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0, 0.25, 0.1875, 0.125, 0.6875, 0.8125));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0, 0.25, 0.8125, 0.125, 0.4375, 0.96875));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.15625, 0.6875, 0.15625, 0.84375, 1.125, 0.1875));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.84375, 0.5625, 0.1625, 0.90625, 1.078125, 0.19375));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.09375, 0.5625, 0.1625, 0.15625, 1.078125, 0.19375));
return shape;
}

// Generate using Blockbench
private static VoxelShape makeEastShape(){
VoxelShape shape = VoxelShapes.empty();
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.375, 0.0625, 0.8125, 0.625, 0.25, 0.875));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.1875, 0, 0.8125, 0.8125, 0.0625, 0.875));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.375, 0.0625, 0.125, 0.625, 0.25, 0.1875));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.1875, 0, 0.125, 0.8125, 0.0625, 0.1875));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.4375, 0, 0.1875, 0.5625, 0.0625, 0.8125));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.25, 0.25, 0.125, 1, 0.5, 0.875));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.171875, 0.375, 0.125, 0.421875, 1.375, 0.875));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.1875, 0.25, 0, 0.8125, 0.6875, 0.125));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.8125, 0.25, 0, 0.96875, 0.4375, 0.125));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.1875, 0.6875, 0, 0.9375, 0.8125, 0.125));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.1875, 0.6875, 0.875, 0.9375, 0.8125, 1));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.1875, 0.25, 0.875, 0.8125, 0.6875, 1));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.8125, 0.25, 0.875, 0.96875, 0.4375, 1));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.15625, 0.6875, 0.15625, 0.1875, 1.125, 0.84375));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.1625, 0.5625, 0.09375, 0.19375, 1.078125, 0.15625));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.1625, 0.5625, 0.84375, 0.19375, 1.078125, 0.90625));
return shape;
}

// Generate using Blockbench
private static VoxelShape makeWestShape(){
VoxelShape shape = VoxelShapes.empty();
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.375, 0.0625, 0.125, 0.625, 0.25, 0.1875));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.1875, 0, 0.125, 0.8125, 0.0625, 0.1875));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.375, 0.0625, 0.8125, 0.625, 0.25, 0.875));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.1875, 0, 0.8125, 0.8125, 0.0625, 0.875));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.4375, 0, 0.1875, 0.5625, 0.0625, 0.8125));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0, 0.25, 0.125, 0.75, 0.5, 0.875));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.578125, 0.375, 0.125, 0.828125, 1.375, 0.875));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.1875, 0.25, 0.875, 0.8125, 0.6875, 1));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.03125, 0.25, 0.875, 0.1875, 0.4375, 1));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.0625, 0.6875, 0.875, 0.8125, 0.8125, 1));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.0625, 0.6875, 0, 0.8125, 0.8125, 0.125));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.1875, 0.25, 0, 0.8125, 0.6875, 0.125));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.03125, 0.25, 0, 0.1875, 0.4375, 0.125));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.8125, 0.6875, 0.15625, 0.84375, 1.125, 0.84375));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.80625, 0.5625, 0.84375, 0.8375, 1.078125, 0.90625));
shape = VoxelShapes.union(shape, VoxelShapes.cuboid(0.80625, 0.5625, 0.09375, 0.8375, 1.078125, 0.15625));
return shape;
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,53 @@
package io.github.dovecotmc.leadbeyond.common.reg;

import com.simibubi.create.AllBlocks;
import io.github.dovecotmc.leadbeyond.LeadBeyond;
import io.github.dovecotmc.leadbeyond.common.block.HorizontalCVSBlock;
import io.github.dovecotmc.leadbeyond.common.block.LBSeatBlock;
import io.github.dovecotmc.leadbeyond.common.block.TicketVendorBlock;
import io.github.dovecotmc.leadbeyond.common.block.TurnstileBlock;
import net.minecraft.block.AbstractBlock;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.util.DyeColor;
import net.minecraft.util.shape.VoxelShape;
import net.minecraft.util.shape.VoxelShapes;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;

public class BlockReg {
public static final VoxelShape yzNsShape = VoxelShapes.union(VoxelShapes.cuboid(0.125, 0, 0.5625, 0.1875, 0.25, 0.8125),
VoxelShapes.cuboid(0.125, 0, 0.1875, 0.1875, 0.25, 0.4375),
VoxelShapes.cuboid(0.125, 0, 0.1875, 0.1875, 0.25, 0.4375),
VoxelShapes.cuboid(0.8125, 0, 0.1875, 0.875, 0.25, 0.4375),
VoxelShapes.cuboid(0.8125, 0, 0.5625, 0.875, 0.25, 0.8125),
VoxelShapes.cuboid(0, 0.25, 0, 1, 0.5, 1),
VoxelShapes.cuboid(0, 0.5, 0.375, 0.5, 1.4375, 0.625),
VoxelShapes.cuboid(0.53125, 0.5, 0.375, 1, 1.4375, 0.625));
public static final VoxelShape yzEwShape = VoxelShapes.union(VoxelShapes.cuboid(0.1875, 0, 0.125, 0.4375, 0.25, 0.1875),
VoxelShapes.cuboid(0.5625, 0, 0.125, 0.8125, 0.25, 0.1875),
VoxelShapes.cuboid(0.5625, 0, 0.8125, 0.8125, 0.25, 0.875),
VoxelShapes.cuboid(0.1875, 0, 0.8125, 0.4375, 0.25, 0.875),
VoxelShapes.cuboid(0, 0.25, 0, 1, 0.5, 1),
VoxelShapes.cuboid(0.375, 0.5, 0, 0.625, 1.4375, 0.5),
VoxelShapes.cuboid(0.375, 0.5, 0.53125, 0.625, 1.4375, 1));

public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS,
LeadBeyond.MODID);

public static final RegistryObject<Block> TICKET_VENDOR = BLOCKS.register("ticket_vendor", () ->
new TicketVendorBlock(AbstractBlock.Settings.copy(Blocks.IRON_BLOCK).nonOpaque()));
public static final RegistryObject<Block> TURNSTILE = BLOCKS.register("turnstile", () ->
new TurnstileBlock(AbstractBlock.Settings.copy(Blocks.IRON_BLOCK).nonOpaque()));
public static final RegistryObject<Block> RZ_SEAT = BLOCKS.register("rz_seat", () ->
new LBSeatBlock(AbstractBlock.Settings.copy(AllBlocks.SEATS.get(DyeColor.BLUE).get())));
public static final RegistryObject<Block> YZ_SEAT2 = BLOCKS.register("yz_seat2", () ->
new HorizontalCVSBlock(AbstractBlock.Settings.copy(AllBlocks.SEATS.get(DyeColor.BLUE).get()), state -> switch (state.get(HorizontalCVSBlock.FACING)) {
default -> VoxelShapes.fullCube();
case NORTH, SOUTH -> yzNsShape;
case WEST, EAST -> yzEwShape;
}));


}
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,8 @@ public class ItemReg {
new BlockItem(BlockReg.TICKET_VENDOR.get(), new Item.Settings().group(LBItemGroup.INSTANCE)));
public static final RegistryObject<Item> TURNSTILE = ITEM.register("turnstile", () ->
new BlockItem(BlockReg.TURNSTILE.get(), new Item.Settings().group(LBItemGroup.INSTANCE)));
public static final RegistryObject<Item> RZ_SEAT = ITEM.register("rz_seat", () ->
new BlockItem(BlockReg.RZ_SEAT.get(), new Item.Settings().group(LBItemGroup.INSTANCE)));
public static final RegistryObject<Item> YZ_SEAT2 = ITEM.register("yz_seat2", () ->
new BlockItem(BlockReg.YZ_SEAT2.get(), new Item.Settings().group(LBItemGroup.INSTANCE)));
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"variants": {
"facing=north": { "model": "lead_beyond:block/rz_seat", "y": 0 },
"facing=east": { "model": "lead_beyond:block/rz_seat", "y": 90 },
"facing=south": { "model": "lead_beyond:block/rz_seat", "y": 180 },
"facing=west": { "model": "lead_beyond:block/rz_seat", "y": 270 }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"variants": {
"facing=north": { "model": "lead_beyond:block/yz_seat2", "y": 0 },
"facing=east": { "model": "lead_beyond:block/yz_seat2", "y": 90 },
"facing=south": { "model": "lead_beyond:block/yz_seat2", "y": 180 },
"facing=west": { "model": "lead_beyond:block/yz_seat2", "y": 270 }
}
}
8 changes: 5 additions & 3 deletions src/main/resources/assets/lead_beyond/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@

"block.lead_beyond.turnstile": "Turnstile",
"block.lead_beyond.ticket_vendor": "Ticket Vendor",
"block.lead_beyond.rz_seat": "Soft Seat",
"block.lead_beyond.yz_seat2": "Hard Seat",

"message.lead_beyond.set_exit.true": "Set as Exit",
"message.lead_beyond.set_exit.false": "Set as Entrance",

"subtitle.lead_beyond.beep_ticket_vendor": "Ticket Vendor beeps",
"subtitle.lead_beyond.beep_turnstile": "Turnstile beeps",
"subtitle.lead_beyond.ticket_out": "Ticket Vendor issues a ticket",
"subtitles.lead_beyond.beep_ticket_vendor": "Ticket Vendor beeps",
"subtitles.lead_beyond.beep_turnstile": "Turnstile beeps",
"subtitles.lead_beyond.ticket_out": "Ticket Vendor issues a ticket",

"tooltip.lead_beyond.card.money": "Money: %s",
"tooltip.lead_beyond.ticket.used": "Used"
Expand Down
8 changes: 5 additions & 3 deletions src/main/resources/assets/lead_beyond/lang/zh_cn.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@

"block.lead_beyond.turnstile": "闸机",
"block.lead_beyond.ticket_vendor": "售票机",
"block.lead_beyond.rz_seat": "软座",
"block.lead_beyond.yz_seat2": "硬座",

"message.lead_beyond.set_exit.true": "已设置成出口",
"message.lead_beyond.set_exit.false": "已设置成入口",

"subtitle.lead_beyond.beep_ticket_vendor": "售票机:哔——",
"subtitle.lead_beyond.beep_turnstile": "闸门:哔——",
"subtitle.lead_beyond.ticket_out": "售票机:出票",
"subtitles.lead_beyond.beep_ticket_vendor": "售票机:哔——",
"subtitles.lead_beyond.beep_turnstile": "闸机:哔——",
"subtitles.lead_beyond.ticket_out": "售票机:出票",

"tooltip.lead_beyond.card.money": "金钱: %s",
"tooltip.lead_beyond.ticket.used": "已使用"
Expand Down
Loading

0 comments on commit d7b52ea

Please sign in to comment.