diff --git a/src/main/java/net/id/paradiselost/blocks/mechanical/LevitaRailBlock.java b/src/main/java/net/id/paradiselost/blocks/mechanical/LevitaRailBlock.java index a311f0874..f8bbbbf93 100644 --- a/src/main/java/net/id/paradiselost/blocks/mechanical/LevitaRailBlock.java +++ b/src/main/java/net/id/paradiselost/blocks/mechanical/LevitaRailBlock.java @@ -3,12 +3,19 @@ import net.id.paradiselost.component.ParadiseLostComponents; import net.id.paradiselost.entities.ParadiseLostEntityExtensions; import net.minecraft.block.AbstractBlock; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.PoweredRailBlock; +import net.minecraft.block.enums.RailShape; import net.minecraft.entity.Entity; import net.minecraft.entity.vehicle.AbstractMinecartEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.BooleanProperty; +import net.minecraft.state.property.Properties; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; +import net.minecraft.util.math.random.Random; import net.minecraft.world.World; import java.util.List; @@ -16,8 +23,17 @@ public class LevitaRailBlock extends PoweredRailBlock { + public static final BooleanProperty TRIGGERED = Properties.TRIGGERED; + public LevitaRailBlock(AbstractBlock.Settings settings) { super(settings); + this.setDefaultState( + this.stateManager.getDefaultState() + .with(SHAPE, RailShape.NORTH_SOUTH) + .with(POWERED, Boolean.valueOf(false)) + .with(WATERLOGGED, Boolean.valueOf(false)) + .with(TRIGGERED, Boolean.valueOf(false)) + ); } @Override @@ -27,7 +43,11 @@ protected void onEntityCollision(BlockState state, World world, BlockPos pos, En for (AbstractMinecartEntity cart : list) { var floatingComponent = ParadiseLostComponents.FLOATING_KEY.get(cart); if (state.get(POWERED)) { - floatingComponent.startFloating(); + if (!state.get(TRIGGERED)) { + floatingComponent.addFloating(); + world.setBlockState(pos, state.with(TRIGGERED, true), 3); + world.scheduleBlockTick(pos, this, 80); + } } else { floatingComponent.stopFloating(); } @@ -36,6 +56,10 @@ protected void onEntityCollision(BlockState state, World world, BlockPos pos, En } } + protected void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + world.setBlockState(pos, state.with(TRIGGERED, false), 3); + } + private List getCarts(World world, BlockPos pos, Class entityClass, Predicate entityPredicate) { return world.getEntitiesByClass(entityClass, this.getCartDetectionBox(pos), entityPredicate); } @@ -51,4 +75,9 @@ private Box getCartDetectionBox(BlockPos pos) { pos.getZ() + 1 - radius ); } + + @Override + protected void appendProperties(StateManager.Builder builder) { + builder.add(SHAPE, POWERED, WATERLOGGED, TRIGGERED); + } } diff --git a/src/main/java/net/id/paradiselost/component/FloatingComponent.java b/src/main/java/net/id/paradiselost/component/FloatingComponent.java index 88c72d8fc..3eba5d774 100644 --- a/src/main/java/net/id/paradiselost/component/FloatingComponent.java +++ b/src/main/java/net/id/paradiselost/component/FloatingComponent.java @@ -36,9 +36,9 @@ public int getFloatTime() { return floatTime; } - public void startFloating() { + public void addFloating() { floating = true; - floatTime = 20 * FLOAT_SECONDS; + floatTime += 20 * FLOAT_SECONDS; } public void stopFloating() { diff --git a/src/main/java/net/id/paradiselost/mixin/entity/AbstractMinecartEntityMixin.java b/src/main/java/net/id/paradiselost/mixin/entity/AbstractMinecartEntityMixin.java index 3fa5a54f9..5707cd7df 100644 --- a/src/main/java/net/id/paradiselost/mixin/entity/AbstractMinecartEntityMixin.java +++ b/src/main/java/net/id/paradiselost/mixin/entity/AbstractMinecartEntityMixin.java @@ -40,6 +40,7 @@ protected void moveOffRail(CallbackInfo ci) { if (!this.isOnGround() && floatingComponent.getFloating() && floatingComponent.getFloatTime() > 0) { double d = this.getMaxSpeed(); Vec3d vec3d = this.getVelocity(); + System.out.println(vec3d); this.setVelocity(MathHelper.clamp(vec3d.x, -d, d), 0, MathHelper.clamp(vec3d.z, -d, d)); this.move(MovementType.SELF, this.getVelocity()); // decrement diff --git a/src/main/resources/assets/paradise_lost/blockstates/levita_rail.json b/src/main/resources/assets/paradise_lost/blockstates/levita_rail.json index 34a15b07c..4cc862d4b 100644 --- a/src/main/resources/assets/paradise_lost/blockstates/levita_rail.json +++ b/src/main/resources/assets/paradise_lost/blockstates/levita_rail.json @@ -1,46 +1,88 @@ { "variants": { - "powered=false,shape=ascending_east": { + "powered=false,triggered=false,shape=ascending_east": { "model": "paradise_lost:block/levita_rail_raised_ne", "y": 90 }, - "powered=false,shape=ascending_north": { + "powered=false,triggered=false,shape=ascending_north": { "model": "paradise_lost:block/levita_rail_raised_ne" }, - "powered=false,shape=ascending_south": { + "powered=false,triggered=false,shape=ascending_south": { "model": "paradise_lost:block/levita_rail_raised_sw" }, - "powered=false,shape=ascending_west": { + "powered=false,triggered=false,shape=ascending_west": { "model": "paradise_lost:block/levita_rail_raised_sw", "y": 90 }, - "powered=false,shape=east_west": { + "powered=false,triggered=false,shape=east_west": { "model": "paradise_lost:block/levita_rail", "y": 90 }, - "powered=false,shape=north_south": { + "powered=false,triggered=false,shape=north_south": { "model": "paradise_lost:block/levita_rail" }, - "powered=true,shape=ascending_east": { + "powered=true,triggered=false,shape=ascending_east": { "model": "paradise_lost:block/levita_rail_on_raised_ne", "y": 90 }, - "powered=true,shape=ascending_north": { + "powered=true,triggered=false,shape=ascending_north": { "model": "paradise_lost:block/levita_rail_on_raised_ne" }, - "powered=true,shape=ascending_south": { + "powered=true,triggered=false,shape=ascending_south": { "model": "paradise_lost:block/levita_rail_on_raised_sw" }, - "powered=true,shape=ascending_west": { + "powered=true,triggered=false,shape=ascending_west": { "model": "paradise_lost:block/levita_rail_on_raised_sw", "y": 90 }, - "powered=true,shape=east_west": { + "powered=true,triggered=false,shape=east_west": { "model": "paradise_lost:block/levita_rail_on", "y": 90 }, - "powered=true,shape=north_south": { + "powered=true,triggered=false,shape=north_south": { "model": "paradise_lost:block/levita_rail_on" + }, + "powered=false,triggered=true,shape=ascending_east": { + "model": "paradise_lost:block/levita_rail_triggered_raised_ne", + "y": 90 + }, + "powered=false,triggered=true,shape=ascending_north": { + "model": "paradise_lost:block/levita_rail_triggered_raised_ne" + }, + "powered=false,triggered=true,shape=ascending_south": { + "model": "paradise_lost:block/levita_rail_triggered_raised_sw" + }, + "powered=false,triggered=true,shape=ascending_west": { + "model": "paradise_lost:block/levita_rail_triggered_raised_sw", + "y": 90 + }, + "powered=false,triggered=true,shape=east_west": { + "model": "paradise_lost:block/levita_rail", + "y": 90 + }, + "powered=false,triggered=true,shape=north_south": { + "model": "paradise_lost:block/levita_rail" + }, + "powered=true,triggered=true,shape=ascending_east": { + "model": "paradise_lost:block/levita_rail_triggered_on_raised_ne", + "y": 90 + }, + "powered=true,triggered=true,shape=ascending_north": { + "model": "paradise_lost:block/levita_rail_triggered_on_raised_ne" + }, + "powered=true,triggered=true,shape=ascending_south": { + "model": "paradise_lost:block/levita_rail_triggered_on_raised_sw" + }, + "powered=true,triggered=true,shape=ascending_west": { + "model": "paradise_lost:block/levita_rail_triggered_on_raised_sw", + "y": 90 + }, + "powered=true,triggered=true,shape=east_west": { + "model": "paradise_lost:block/levita_rail_triggered_on", + "y": 90 + }, + "powered=true,triggered=true,shape=north_south": { + "model": "paradise_lost:block/levita_rail_triggered_on" } } } \ No newline at end of file diff --git a/src/main/resources/assets/paradise_lost/models/block/levita_rail_triggered.json b/src/main/resources/assets/paradise_lost/models/block/levita_rail_triggered.json new file mode 100644 index 000000000..d0e29c5ab --- /dev/null +++ b/src/main/resources/assets/paradise_lost/models/block/levita_rail_triggered.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/rail_flat", + "textures": { + "rail": "paradise_lost:block/levita_rail_triggered" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/paradise_lost/models/block/levita_rail_triggered_on.json b/src/main/resources/assets/paradise_lost/models/block/levita_rail_triggered_on.json new file mode 100644 index 000000000..c9e47f866 --- /dev/null +++ b/src/main/resources/assets/paradise_lost/models/block/levita_rail_triggered_on.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/rail_flat", + "textures": { + "rail": "paradise_lost:block/levita_rail_triggered_on" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/paradise_lost/models/block/levita_rail_triggered_on_raised_ne.json b/src/main/resources/assets/paradise_lost/models/block/levita_rail_triggered_on_raised_ne.json new file mode 100644 index 000000000..cdfdb44d3 --- /dev/null +++ b/src/main/resources/assets/paradise_lost/models/block/levita_rail_triggered_on_raised_ne.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_rail_raised_ne", + "textures": { + "rail": "paradise_lost:block/levita_rail_triggered_on" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/paradise_lost/models/block/levita_rail_triggered_on_raised_sw.json b/src/main/resources/assets/paradise_lost/models/block/levita_rail_triggered_on_raised_sw.json new file mode 100644 index 000000000..8e3a22c0d --- /dev/null +++ b/src/main/resources/assets/paradise_lost/models/block/levita_rail_triggered_on_raised_sw.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_rail_raised_sw", + "textures": { + "rail": "paradise_lost:block/levita_rail_triggered_on" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/paradise_lost/models/block/levita_rail_triggered_raised_ne.json b/src/main/resources/assets/paradise_lost/models/block/levita_rail_triggered_raised_ne.json new file mode 100644 index 000000000..46b3fd846 --- /dev/null +++ b/src/main/resources/assets/paradise_lost/models/block/levita_rail_triggered_raised_ne.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_rail_raised_ne", + "textures": { + "rail": "paradise_lost:block/levita_rail_triggered" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/paradise_lost/models/block/levita_rail_triggered_raised_sw.json b/src/main/resources/assets/paradise_lost/models/block/levita_rail_triggered_raised_sw.json new file mode 100644 index 000000000..b62ce8014 --- /dev/null +++ b/src/main/resources/assets/paradise_lost/models/block/levita_rail_triggered_raised_sw.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_rail_raised_sw", + "textures": { + "rail": "paradise_lost:block/levita_rail_triggered" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/paradise_lost/textures/block/levita_rail_triggered.png b/src/main/resources/assets/paradise_lost/textures/block/levita_rail_triggered.png new file mode 100644 index 000000000..4450c5df2 Binary files /dev/null and b/src/main/resources/assets/paradise_lost/textures/block/levita_rail_triggered.png differ diff --git a/src/main/resources/assets/paradise_lost/textures/block/levita_rail_triggered_on.png b/src/main/resources/assets/paradise_lost/textures/block/levita_rail_triggered_on.png new file mode 100644 index 000000000..71bc55d55 Binary files /dev/null and b/src/main/resources/assets/paradise_lost/textures/block/levita_rail_triggered_on.png differ