diff --git a/src/main/java/cn/nukkit/Player.java b/src/main/java/cn/nukkit/Player.java index 559bec498..fd8569734 100644 --- a/src/main/java/cn/nukkit/Player.java +++ b/src/main/java/cn/nukkit/Player.java @@ -1790,6 +1790,7 @@ protected void checkBlockCollision() { boolean portal = false; boolean endPortal = false; boolean scaffolding = false; + boolean powderSnow = false; for (Block block : this.getCollisionBlocks()) { switch (block.getId()) { @@ -1802,6 +1803,9 @@ protected void checkBlockCollision() { case Block.SCAFFOLDING: scaffolding = true; break; + case Block.POWDER_SNOW: + powderSnow = true; + break; } block.onEntityCollide(this); @@ -1905,6 +1909,26 @@ public void onRun() { } } } + + if(this.getFreezingTicks() < 140 && powderSnow) { + if (getFreezingTicks() == 0) { + this.setSprinting(false); + } + this.addFreezingTicks(1); + EntityFreezeEvent event = new EntityFreezeEvent(this); + this.server.getPluginManager().callEvent(event); + if (!event.isCancelled()) { + this.setMovementSpeed((float) Math.max(0.05, getMovementSpeed() - 3.58e-4)); + } + } + if(!powderSnow && this.getFreezingTicks() > 0) { + this.addFreezingTicks(-1); + this.setMovementSpeed((float) Math.min(Player.DEFAULT_SPEED, getMovementSpeed() + 3.58e-4));//This magic number is to change the player's 0.05 speed within 140tick + } + + if (this.getFreezingTicks() == 140 && this.getServer().getTick() % 40 == 0) { + this.attack(new EntityDamageEvent(this, EntityDamageEvent.DamageCause.FREEZING, getFrostbiteInjury())); + } } /** diff --git a/src/main/java/cn/nukkit/block/BlockStonecutterBlock.java b/src/main/java/cn/nukkit/block/BlockStonecutterBlock.java new file mode 100644 index 000000000..30373560b --- /dev/null +++ b/src/main/java/cn/nukkit/block/BlockStonecutterBlock.java @@ -0,0 +1,94 @@ +package cn.nukkit.block; + +import cn.nukkit.Player; +import cn.nukkit.item.Item; +import cn.nukkit.item.ItemBlock; +import cn.nukkit.item.ItemTool; +import cn.nukkit.math.BlockFace; +import cn.nukkit.utils.Faceable; + +public class BlockStonecutterBlock extends BlockSolidMeta implements Faceable { + + public BlockStonecutterBlock() { + this(0); + } + + public BlockStonecutterBlock(int meta) { + super(meta); + } + + @Override + public String getName() { + return "Stonecutter Block"; + } + + @Override + public int getId() { + return STONECUTTER_BLOCK; + } + + @Override + public double getHardness() { + return 3.5; + } + + @Override + public double getResistance() { + return 17.5; + } + + @Override + public boolean canHarvestWithHand() { + return false; + } + + @Override + public int getToolType() { + return ItemTool.TYPE_PICKAXE; + } + + @Override + public int getToolTier() { + return ItemTool.TIER_WOODEN; + } + + @Override + public Item[] getDrops(Item item) { + return new Item[]{toItem()}; + } + + @Override + public Item toItem() { + return new ItemBlock(new BlockStonecutterBlock()); + } + + @Override + public double getMaxY() { + return y + 0.5625; + } + + @Override + public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) { + this.setDamage(Block.FACES2534[player != null ? player.getDirection().getHorizontalIndex() : 0]); + return super.place(item, block, target, face, fx, fy, fz, player); + } + + //TODO: Add Stonecutter functionality + /*@Override + public boolean canBeActivated() { + return true; + } + + @Override + public boolean onActivate(Item item, Player player) { + if (player != null) { + player.addWindow(new StonecutterInventory(player.getUIInventory(), this), Player.STONECUTTER_WINDOW_ID); + } + return true; + }*/ + + @Override + public BlockFace getBlockFace() { + return BlockFace.fromHorizontalIndex(this.getDamage() & 0x7); + } +} \ No newline at end of file diff --git a/src/main/java/cn/nukkit/block/Blocks.java b/src/main/java/cn/nukkit/block/Blocks.java index 9726622f9..d7bcc8f9c 100644 --- a/src/main/java/cn/nukkit/block/Blocks.java +++ b/src/main/java/cn/nukkit/block/Blocks.java @@ -345,6 +345,7 @@ public class Blocks { list[LECTERN] = BlockLectern.class; //449 list[GRINDSTONE] = BlockGrindstone.class; //450 list[BLAST_FURNACE] = BlockBlastFurnace.class; //451 + list[STONECUTTER_BLOCK] = BlockStonecutterBlock.class; //452 list[SMOKER] = BlockSmoker.class; //453 list[LIT_SMOKER] = BlockSmokerLit.class; //454 list[CARTOGRAPHY_TABLE] = BlockCartographyTable.class; //455 diff --git a/src/main/java/cn/nukkit/entity/Entity.java b/src/main/java/cn/nukkit/entity/Entity.java index ffa01d1d7..ffdd50e93 100644 --- a/src/main/java/cn/nukkit/entity/Entity.java +++ b/src/main/java/cn/nukkit/entity/Entity.java @@ -444,6 +444,7 @@ public abstract class Entity extends Location implements Metadatable { public int lastUpdate; public int fireTicks = 0; public int inPortalTicks = 0; + public int freezingTicks = 0;//0 - 140 public int inEndPortalTicks = 0; public Position portalPos = null; @@ -534,6 +535,10 @@ protected float getBaseOffset() { return 0; } + public int getFrostbiteInjury() { + return 1; + } + public Entity(FullChunk chunk, CompoundTag nbt) { this.isPlayer = this instanceof Player; if (this.isPlayer) { @@ -2599,6 +2604,7 @@ protected void checkBlockCollision() { Vector3 vector = new Vector3(0, 0, 0); boolean portal = false; + boolean powderSnow = false; for (Block block : this.getCollisionBlocks()) { if (block.getId() == Block.NETHER_PORTAL) { @@ -2606,6 +2612,11 @@ protected void checkBlockCollision() { continue; } + if (block.getId() == Block.POWDER_SNOW) { + portal = true; + continue; + } + block.onEntityCollide(this); block.getLevelBlockAtLayer(1).onEntityCollide(this); block.addVelocityToEntity(this, vector); @@ -2616,7 +2627,7 @@ protected void checkBlockCollision() { } else { this.inPortalTicks = 0; } - + if (vector.lengthSquared() > 0) { vector = vector.normalize(); double d = 0.014d; @@ -3210,6 +3221,34 @@ public List getAllTags() { return this.namedTag.getList("Tags", StringTag.class).getAll(); } + public float getFreezingEffectStrength() { + return getDataPropertyFloat(DATA_FREEZING_EFFECT_STRENGTH); + } + + public void setFreezingEffectStrength(float strength) { + if (strength < 0 || strength > 1) + throw new IllegalArgumentException("Freezing Effect Strength must be between 0 and 1"); + this.setDataProperty(new FloatEntityData(DATA_FREEZING_EFFECT_STRENGTH, strength)); + } + + public int getFreezingTicks() { + return this.freezingTicks; + } + + public void setFreezingTicks(int ticks) { + if (ticks < 0) this.freezingTicks = 0; + else if (ticks > 140) this.freezingTicks = 140; + else this.freezingTicks = ticks; + setFreezingEffectStrength(ticks / 140f); + } + + public void addFreezingTicks(int increments) { + if (freezingTicks + increments < 0) this.freezingTicks = 0; + else if (freezingTicks + increments > 140) this.freezingTicks = 140; + else this.freezingTicks += increments; + setFreezingEffectStrength(this.freezingTicks / 140f); + } + private boolean validateAndSetIntProperty(String identifier, int value) { if(!intProperties.containsKey(identifier)) { return false; diff --git a/src/main/java/cn/nukkit/event/entity/EntityDamageEvent.java b/src/main/java/cn/nukkit/event/entity/EntityDamageEvent.java index e81375dda..a2e62f5db 100644 --- a/src/main/java/cn/nukkit/event/entity/EntityDamageEvent.java +++ b/src/main/java/cn/nukkit/event/entity/EntityDamageEvent.java @@ -252,7 +252,11 @@ public enum DamageCause { /** * Damage caused by standing on BlockMagma */ - HOT_FLOOR + HOT_FLOOR, + /** + * Damage caused by temperature + */ + FREEZING } private static class DamageModifierFloatEnumMap extends EnumMap { diff --git a/src/main/java/cn/nukkit/event/entity/EntityFreezeEvent.java b/src/main/java/cn/nukkit/event/entity/EntityFreezeEvent.java new file mode 100644 index 000000000..f74987a8f --- /dev/null +++ b/src/main/java/cn/nukkit/event/entity/EntityFreezeEvent.java @@ -0,0 +1,19 @@ +package cn.nukkit.event.entity; + +import cn.nukkit.entity.Entity; +import cn.nukkit.event.Cancellable; +import cn.nukkit.event.HandlerList; + +public class EntityFreezeEvent extends EntityEvent implements Cancellable { + private final Entity entity; + + private static final HandlerList handlers = new HandlerList(); + + public static HandlerList getHandlers() { + return handlers; + } + + public EntityFreezeEvent(Entity human) { + this.entity = human; + } +} \ No newline at end of file diff --git a/src/main/resources/runtime_block_states_440.dat b/src/main/resources/runtime_block_states_440.dat index b76db9eb8..68d0a1b9c 100644 Binary files a/src/main/resources/runtime_block_states_440.dat and b/src/main/resources/runtime_block_states_440.dat differ diff --git a/src/main/resources/runtime_block_states_448.dat b/src/main/resources/runtime_block_states_448.dat index 880c6d66c..a9ff8fc55 100644 Binary files a/src/main/resources/runtime_block_states_448.dat and b/src/main/resources/runtime_block_states_448.dat differ diff --git a/src/main/resources/runtime_block_states_465.dat b/src/main/resources/runtime_block_states_465.dat index 494774d13..100dddfb4 100644 Binary files a/src/main/resources/runtime_block_states_465.dat and b/src/main/resources/runtime_block_states_465.dat differ diff --git a/src/main/resources/runtime_block_states_471.dat b/src/main/resources/runtime_block_states_471.dat index 82a63e6ff..52cb6da6a 100644 Binary files a/src/main/resources/runtime_block_states_471.dat and b/src/main/resources/runtime_block_states_471.dat differ diff --git a/src/main/resources/runtime_block_states_486.dat b/src/main/resources/runtime_block_states_486.dat index 7aceb477d..4eb46020e 100644 Binary files a/src/main/resources/runtime_block_states_486.dat and b/src/main/resources/runtime_block_states_486.dat differ diff --git a/src/main/resources/runtime_block_states_503.dat b/src/main/resources/runtime_block_states_503.dat index b8e50a5f5..28e66e6f7 100644 Binary files a/src/main/resources/runtime_block_states_503.dat and b/src/main/resources/runtime_block_states_503.dat differ diff --git a/src/main/resources/runtime_block_states_527.dat b/src/main/resources/runtime_block_states_527.dat index fb75644e7..3432b066b 100644 Binary files a/src/main/resources/runtime_block_states_527.dat and b/src/main/resources/runtime_block_states_527.dat differ diff --git a/src/main/resources/runtime_block_states_544.dat b/src/main/resources/runtime_block_states_544.dat index 7ff55cad1..914a0d40a 100644 Binary files a/src/main/resources/runtime_block_states_544.dat and b/src/main/resources/runtime_block_states_544.dat differ diff --git a/src/main/resources/runtime_block_states_560.dat b/src/main/resources/runtime_block_states_560.dat index 379a18708..24ff4d71f 100644 Binary files a/src/main/resources/runtime_block_states_560.dat and b/src/main/resources/runtime_block_states_560.dat differ diff --git a/src/main/resources/runtime_block_states_567.dat b/src/main/resources/runtime_block_states_567.dat index 020b59d2b..5858d13d5 100644 Binary files a/src/main/resources/runtime_block_states_567.dat and b/src/main/resources/runtime_block_states_567.dat differ diff --git a/src/main/resources/runtime_block_states_575.dat b/src/main/resources/runtime_block_states_575.dat index 645c3ba91..50e471301 100644 Binary files a/src/main/resources/runtime_block_states_575.dat and b/src/main/resources/runtime_block_states_575.dat differ diff --git a/src/main/resources/runtime_block_states_582.dat b/src/main/resources/runtime_block_states_582.dat index c3ecc547b..f8e87c907 100644 Binary files a/src/main/resources/runtime_block_states_582.dat and b/src/main/resources/runtime_block_states_582.dat differ diff --git a/src/main/resources/runtime_block_states_589.dat b/src/main/resources/runtime_block_states_589.dat index 4825b70be..8a54bceee 100644 Binary files a/src/main/resources/runtime_block_states_589.dat and b/src/main/resources/runtime_block_states_589.dat differ diff --git a/src/main/resources/runtime_block_states_594.dat b/src/main/resources/runtime_block_states_594.dat index 74efa405c..50ffc5c27 100644 Binary files a/src/main/resources/runtime_block_states_594.dat and b/src/main/resources/runtime_block_states_594.dat differ diff --git a/src/main/resources/runtime_block_states_618.dat b/src/main/resources/runtime_block_states_618.dat index 16b11ff90..2d1faa8b9 100644 Binary files a/src/main/resources/runtime_block_states_618.dat and b/src/main/resources/runtime_block_states_618.dat differ diff --git a/src/main/resources/runtime_block_states_622.dat b/src/main/resources/runtime_block_states_622.dat index eb6c1aa69..0765a102c 100644 Binary files a/src/main/resources/runtime_block_states_622.dat and b/src/main/resources/runtime_block_states_622.dat differ diff --git a/src/main/resources/runtime_block_states_630.dat b/src/main/resources/runtime_block_states_630.dat index edd6a23ef..365d6d187 100644 Binary files a/src/main/resources/runtime_block_states_630.dat and b/src/main/resources/runtime_block_states_630.dat differ diff --git a/src/main/resources/runtime_block_states_649.dat b/src/main/resources/runtime_block_states_649.dat index 24aa8ee9e..b6074ca8f 100644 Binary files a/src/main/resources/runtime_block_states_649.dat and b/src/main/resources/runtime_block_states_649.dat differ diff --git a/src/main/resources/runtime_block_states_662.dat b/src/main/resources/runtime_block_states_662.dat index 743697a1e..a8473cf3a 100644 Binary files a/src/main/resources/runtime_block_states_662.dat and b/src/main/resources/runtime_block_states_662.dat differ diff --git a/src/main/resources/runtime_block_states_671.dat b/src/main/resources/runtime_block_states_671.dat index 81521813e..4cc46fb11 100644 Binary files a/src/main/resources/runtime_block_states_671.dat and b/src/main/resources/runtime_block_states_671.dat differ diff --git a/src/main/resources/runtime_block_states_685.dat b/src/main/resources/runtime_block_states_685.dat index 6dccc44f1..0de58d958 100644 Binary files a/src/main/resources/runtime_block_states_685.dat and b/src/main/resources/runtime_block_states_685.dat differ diff --git a/src/main/resources/runtime_block_states_712.dat b/src/main/resources/runtime_block_states_712.dat index 5565568b4..a6fa78063 100644 Binary files a/src/main/resources/runtime_block_states_712.dat and b/src/main/resources/runtime_block_states_712.dat differ diff --git a/src/main/resources/runtime_block_states_729.dat b/src/main/resources/runtime_block_states_729.dat index c21dca92f..fbcd9ec23 100644 Binary files a/src/main/resources/runtime_block_states_729.dat and b/src/main/resources/runtime_block_states_729.dat differ diff --git a/src/main/resources/runtime_block_states_748.dat b/src/main/resources/runtime_block_states_748.dat index 1b8eb92f1..a92a0a7b5 100644 Binary files a/src/main/resources/runtime_block_states_748.dat and b/src/main/resources/runtime_block_states_748.dat differ diff --git a/src/main/resources/runtime_block_states_766.dat b/src/main/resources/runtime_block_states_766.dat index e8fc172ff..51e6d0369 100644 Binary files a/src/main/resources/runtime_block_states_766.dat and b/src/main/resources/runtime_block_states_766.dat differ