mirror of
https://github.com/Sollace/Unicopia.git
synced 2024-11-23 21:38:00 +01:00
Fixed zap apple trees not progressing through their stages properly
This commit is contained in:
parent
b194f720ef
commit
fbe859dcc7
5 changed files with 87 additions and 120 deletions
|
@ -13,7 +13,7 @@ import net.minecraft.util.math.*;
|
||||||
import net.minecraft.util.math.random.Random;
|
import net.minecraft.util.math.random.Random;
|
||||||
import net.minecraft.world.*;
|
import net.minecraft.world.*;
|
||||||
|
|
||||||
public class BaseZapAppleLeavesBlock extends LeavesBlock implements TintedBlock {
|
public class BaseZapAppleLeavesBlock extends LeavesBlock implements TintedBlock, ZapStagedBlock {
|
||||||
|
|
||||||
BaseZapAppleLeavesBlock() {
|
BaseZapAppleLeavesBlock() {
|
||||||
super(Settings.create()
|
super(Settings.create()
|
||||||
|
@ -29,61 +29,35 @@ public class BaseZapAppleLeavesBlock extends LeavesBlock implements TintedBlock
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasRandomTicks(BlockState state) {
|
public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean notify) {
|
||||||
return !state.get(PERSISTENT);
|
if (state.get(PERSISTENT)
|
||||||
|
|| oldState.isOf(state.getBlock())
|
||||||
|
|| oldState.isOf(UBlocks.ZAP_LEAVES)
|
||||||
|
|| oldState.isOf(UBlocks.FLOWERING_ZAP_LEAVES)
|
||||||
|
|| oldState.isOf(UBlocks.ZAP_LEAVES_PLACEHOLDER)
|
||||||
|
|| !(world instanceof ServerWorld sw)) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
updateStage(state, sw, pos);
|
||||||
public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) {
|
|
||||||
super.randomTick(state, world, pos, random);
|
|
||||||
tryAdvanceStage(state, world, pos, random);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) {
|
|
||||||
if (state.get(PERSISTENT)) {
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (world instanceof ServerWorld sw) {
|
|
||||||
ZapAppleStageStore store = ZapAppleStageStore.get(sw);
|
|
||||||
ZapAppleStageStore.Stage currentStage = store.getStage();
|
|
||||||
if (currentStage == ZapAppleStageStore.Stage.HIBERNATING) {
|
|
||||||
return currentStage.getNewState(state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return state;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) {
|
public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) {
|
||||||
super.scheduledTick(state, world, pos, random);
|
super.scheduledTick(state, world, pos, random);
|
||||||
tryAdvanceStage(state, world, pos, random);
|
|
||||||
if (!state.get(PERSISTENT)) {
|
|
||||||
world.scheduleBlockTick(pos, this, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void tryAdvanceStage(BlockState state, ServerWorld world, BlockPos pos, Random random) {
|
|
||||||
if (state.get(PERSISTENT)) {
|
if (state.get(PERSISTENT)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
tryAdvanceStage(state, world, pos, random);
|
||||||
ZapAppleStageStore store = ZapAppleStageStore.get(world);
|
|
||||||
ZapAppleStageStore.Stage newStage = store.getStage();
|
|
||||||
if (!world.isDay() && getStage(state).mustChangeIntoInstantly(newStage)) {
|
|
||||||
world.setBlockState(pos, newStage.getNewState(state));
|
|
||||||
onStageChanged(store, newStage, world, state, pos, random);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ZapAppleStageStore.Stage getStage(BlockState state) {
|
@Override
|
||||||
|
public ZapAppleStageStore.Stage getStage(BlockState state) {
|
||||||
return ZapAppleStageStore.Stage.FLOWERING;
|
return ZapAppleStageStore.Stage.FLOWERING;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean shouldDecay(BlockState state) {
|
protected final boolean shouldDecay(BlockState state) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,40 +88,10 @@ public class BaseZapAppleLeavesBlock extends LeavesBlock implements TintedBlock
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getTint(BlockState state, @Nullable BlockRenderView world, @Nullable BlockPos pos, int foliageColor) {
|
public int getTint(BlockState state, @Nullable BlockRenderView world, @Nullable BlockPos pos, int foliageColor) {
|
||||||
|
|
||||||
if (pos == null) {
|
if (pos == null) {
|
||||||
return 0x4C7EFA;
|
return 0x4C7EFA;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TintedBlock.blend(TintedBlock.rotate(foliageColor, 2), 0x0000FF, 0.3F);
|
return TintedBlock.blend(TintedBlock.rotate(foliageColor, 2), 0x0000FF, 0.3F);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void onStageChanged(ZapAppleStageStore store, ZapAppleStageStore.Stage stage, ServerWorld world, BlockState state, BlockPos pos, Random random) {
|
|
||||||
boolean mustFruit = Random.create(state.getRenderingSeed(pos)).nextInt(5) < 2;
|
|
||||||
BlockState below = world.getBlockState(pos.down());
|
|
||||||
|
|
||||||
if (world.isAir(pos.down())) {
|
|
||||||
if (stage == ZapAppleStageStore.Stage.FRUITING && mustFruit) {
|
|
||||||
world.setBlockState(pos.down(), UBlocks.ZAP_BULB.getDefaultState(), Block.NOTIFY_ALL);
|
|
||||||
store.triggerLightningStrike(pos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stage != ZapAppleStageStore.Stage.HIBERNATING && world.getRandom().nextInt(10) == 0) {
|
|
||||||
store.triggerLightningStrike(pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stage == ZapAppleStageStore.Stage.RIPE) {
|
|
||||||
if (below.isOf(UBlocks.ZAP_BULB)) {
|
|
||||||
world.setBlockState(pos.down(), UBlocks.ZAP_APPLE.getDefaultState(), Block.NOTIFY_ALL);
|
|
||||||
store.playMoonEffect(pos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mustFruit && stage == ZapAppleStageStore.Stage.HIBERNATING) {
|
|
||||||
if (below.isOf(UBlocks.ZAP_APPLE) || below.isOf(UBlocks.ZAP_BULB)) {
|
|
||||||
world.setBlockState(pos.down(), Blocks.AIR.getDefaultState());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,11 +4,8 @@ import com.minelittlepony.unicopia.server.world.ZapAppleStageStore;
|
||||||
|
|
||||||
import net.minecraft.block.*;
|
import net.minecraft.block.*;
|
||||||
import net.minecraft.item.ItemPlacementContext;
|
import net.minecraft.item.ItemPlacementContext;
|
||||||
import net.minecraft.server.world.ServerWorld;
|
|
||||||
import net.minecraft.state.StateManager;
|
import net.minecraft.state.StateManager;
|
||||||
import net.minecraft.state.property.*;
|
import net.minecraft.state.property.*;
|
||||||
import net.minecraft.util.math.BlockPos;
|
|
||||||
import net.minecraft.world.World;
|
|
||||||
|
|
||||||
public class ZapAppleLeavesBlock extends BaseZapAppleLeavesBlock {
|
public class ZapAppleLeavesBlock extends BaseZapAppleLeavesBlock {
|
||||||
public static final EnumProperty<ZapAppleStageStore.Stage> STAGE = EnumProperty.of("stage", ZapAppleStageStore.Stage.class);
|
public static final EnumProperty<ZapAppleStageStore.Stage> STAGE = EnumProperty.of("stage", ZapAppleStageStore.Stage.class);
|
||||||
|
@ -17,31 +14,13 @@ public class ZapAppleLeavesBlock extends BaseZapAppleLeavesBlock {
|
||||||
setDefaultState(getDefaultState().with(STAGE, ZapAppleStageStore.Stage.GREENING));
|
setDefaultState(getDefaultState().with(STAGE, ZapAppleStageStore.Stage.GREENING));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean notify) {
|
|
||||||
if (state.get(PERSISTENT)
|
|
||||||
|| oldState.isOf(state.getBlock())
|
|
||||||
|| oldState.isOf(UBlocks.ZAP_LEAVES)
|
|
||||||
|| oldState.isOf(UBlocks.FLOWERING_ZAP_LEAVES)
|
|
||||||
|| oldState.isOf(UBlocks.ZAP_LEAVES_PLACEHOLDER)
|
|
||||||
|| !(world instanceof ServerWorld sw)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ZapAppleStageStore store = ZapAppleStageStore.get(sw);
|
|
||||||
ZapAppleStageStore.Stage currentStage = store.getStage();
|
|
||||||
if (currentStage != getStage(state)) {
|
|
||||||
world.setBlockState(pos, currentStage.getNewState(state));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockState getPlacementState(ItemPlacementContext ctx) {
|
public BlockState getPlacementState(ItemPlacementContext ctx) {
|
||||||
return super.getPlacementState(ctx).with(STAGE, ZapAppleStageStore.Stage.GREENING);
|
return super.getPlacementState(ctx).with(STAGE, ZapAppleStageStore.Stage.GREENING);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ZapAppleStageStore.Stage getStage(BlockState state) {
|
public ZapAppleStageStore.Stage getStage(BlockState state) {
|
||||||
return state.get(STAGE);
|
return state.get(STAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,51 +1,36 @@
|
||||||
package com.minelittlepony.unicopia.block;
|
package com.minelittlepony.unicopia.block;
|
||||||
|
|
||||||
import com.minelittlepony.unicopia.server.world.ZapAppleStageStore;
|
import com.minelittlepony.unicopia.server.world.ZapAppleStageStore;
|
||||||
|
import com.minelittlepony.unicopia.server.world.ZapAppleStageStore.Stage;
|
||||||
|
|
||||||
import net.minecraft.block.*;
|
import net.minecraft.block.*;
|
||||||
import net.minecraft.server.world.ServerWorld;
|
import net.minecraft.server.world.ServerWorld;
|
||||||
import net.minecraft.util.math.*;
|
import net.minecraft.util.math.*;
|
||||||
import net.minecraft.util.math.random.Random;
|
import net.minecraft.util.math.random.Random;
|
||||||
import net.minecraft.world.WorldAccess;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
public class ZapAppleLeavesPlaceholderBlock extends AirBlock {
|
public class ZapAppleLeavesPlaceholderBlock extends AirBlock implements ZapStagedBlock {
|
||||||
|
|
||||||
ZapAppleLeavesPlaceholderBlock() {
|
ZapAppleLeavesPlaceholderBlock() {
|
||||||
super(Settings.create().replaceable().noCollision().dropsNothing().air());
|
super(Settings.create().replaceable().noCollision().dropsNothing().air());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasRandomTicks(BlockState state) {
|
public Stage getStage(BlockState state) {
|
||||||
return true;
|
return ZapAppleStageStore.Stage.HIBERNATING;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) {
|
public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean notify) {
|
||||||
|
|
||||||
if (world instanceof ServerWorld sw) {
|
if (world instanceof ServerWorld sw) {
|
||||||
ZapAppleStageStore store = ZapAppleStageStore.get(sw);
|
updateStage(state, sw, pos);
|
||||||
ZapAppleStageStore.Stage currentStage = store.getStage();
|
|
||||||
if (currentStage != ZapAppleStageStore.Stage.HIBERNATING) {
|
|
||||||
return currentStage.getNewState(state);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) {
|
public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) {
|
||||||
super.scheduledTick(state, world, pos, random);
|
super.scheduledTick(state, world, pos, random);
|
||||||
|
tryAdvanceStage(state, world, pos, random);
|
||||||
ZapAppleStageStore store = ZapAppleStageStore.get(world);
|
|
||||||
ZapAppleStageStore.Stage newStage = store.getStage();
|
|
||||||
if (!world.isDay() && ZapAppleStageStore.Stage.HIBERNATING.mustChangeIntoInstantly(newStage)) {
|
|
||||||
state = newStage.getNewState(state);
|
|
||||||
world.setBlockState(pos, state);
|
|
||||||
BaseZapAppleLeavesBlock.onStageChanged(store, newStage, world, state, pos, random);
|
|
||||||
}
|
|
||||||
|
|
||||||
world.scheduleBlockTick(pos, state.getBlock(), 1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
package com.minelittlepony.unicopia.block;
|
||||||
|
|
||||||
|
import com.minelittlepony.unicopia.server.world.ZapAppleStageStore;
|
||||||
|
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.Blocks;
|
||||||
|
import net.minecraft.server.world.ServerWorld;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.random.Random;
|
||||||
|
|
||||||
|
public interface ZapStagedBlock {
|
||||||
|
ZapAppleStageStore.Stage getStage(BlockState state);
|
||||||
|
|
||||||
|
default void updateStage(BlockState state, ServerWorld world, BlockPos pos) {
|
||||||
|
ZapAppleStageStore.Stage currentStage = ZapAppleStageStore.get(world).getStage();
|
||||||
|
if (currentStage != getStage(state)) {
|
||||||
|
state = currentStage.getNewState(state);
|
||||||
|
world.setBlockState(pos, state);
|
||||||
|
}
|
||||||
|
world.scheduleBlockTick(pos, state.getBlock(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
default void tryAdvanceStage(BlockState state, ServerWorld world, BlockPos pos, Random random) {
|
||||||
|
ZapAppleStageStore store = ZapAppleStageStore.get(world);
|
||||||
|
ZapAppleStageStore.Stage newStage = store.getStage();
|
||||||
|
if (!world.isDay() && getStage(state).mustChangeIntoInstantly(newStage)) {
|
||||||
|
state = newStage.getNewState(state);
|
||||||
|
world.setBlockState(pos, state);
|
||||||
|
onStageChanged(store, newStage, world, state, pos, random);
|
||||||
|
}
|
||||||
|
world.scheduleBlockTick(pos, state.getBlock(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void onStageChanged(ZapAppleStageStore store, ZapAppleStageStore.Stage stage, ServerWorld world, BlockState state, BlockPos pos, Random random) {
|
||||||
|
boolean mustFruit = Random.create(state.getRenderingSeed(pos)).nextInt(5) < 2;
|
||||||
|
BlockState below = world.getBlockState(pos.down());
|
||||||
|
|
||||||
|
if (world.isAir(pos.down())) {
|
||||||
|
if (stage == ZapAppleStageStore.Stage.FRUITING && mustFruit) {
|
||||||
|
world.setBlockState(pos.down(), UBlocks.ZAP_BULB.getDefaultState(), Block.NOTIFY_ALL);
|
||||||
|
store.triggerLightningStrike(pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stage != ZapAppleStageStore.Stage.HIBERNATING && world.getRandom().nextInt(10) == 0) {
|
||||||
|
store.triggerLightningStrike(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stage == ZapAppleStageStore.Stage.RIPE) {
|
||||||
|
if (below.isOf(UBlocks.ZAP_BULB)) {
|
||||||
|
world.setBlockState(pos.down(), UBlocks.ZAP_APPLE.getDefaultState(), Block.NOTIFY_ALL);
|
||||||
|
store.playMoonEffect(pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mustFruit && stage == ZapAppleStageStore.Stage.HIBERNATING) {
|
||||||
|
if (below.isOf(UBlocks.ZAP_APPLE) || below.isOf(UBlocks.ZAP_BULB)) {
|
||||||
|
world.setBlockState(pos.down(), Blocks.AIR.getDefaultState());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -156,12 +156,8 @@ public class ZapAppleStageStore extends PersistentState implements Tickable {
|
||||||
return VALUES[MathHelper.clamp(id, 0, VALUES.length)];
|
return VALUES[MathHelper.clamp(id, 0, VALUES.length)];
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean mustChangeInto(Stage to) {
|
|
||||||
return this != to && (getNext() == to || this == HIBERNATING || to == HIBERNATING);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean mustChangeIntoInstantly(Stage to) {
|
public boolean mustChangeIntoInstantly(Stage to) {
|
||||||
return this != to && (this == HIBERNATING || to == HIBERNATING);
|
return this != to;// && (this == HIBERNATING || to == HIBERNATING);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlockState getNewState(BlockState currentState) {
|
public BlockState getNewState(BlockState currentState) {
|
||||||
|
|
Loading…
Reference in a new issue