136 lines
8.7 KiB
Diff
136 lines
8.7 KiB
Diff
From 58cdfccf5ed3401d652bcbbc099103b7f19141ff Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Fri, 18 Mar 2016 21:22:56 -0400
|
|
Subject: [PATCH] Optimized Light Level Comparisons
|
|
|
|
Use an optimized method to test if a block position meets a desired light level.
|
|
|
|
This method benefits from returning as soon as the desired light level matches.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/BlockCrops.java b/src/main/java/net/minecraft/server/BlockCrops.java
|
|
index 5f8bffe..ab8d18e 100644
|
|
--- a/src/main/java/net/minecraft/server/BlockCrops.java
|
|
+++ b/src/main/java/net/minecraft/server/BlockCrops.java
|
|
@@ -48,7 +48,7 @@ public class BlockCrops extends BlockPlant implements IBlockFragilePlantElement
|
|
|
|
public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) {
|
|
super.b(world, blockposition, iblockdata, random);
|
|
- if (world.getLightLevel(blockposition.up()) >= 9) {
|
|
+ if (world.isLightLevel(blockposition.up(), 9)) { // Paper
|
|
int i = this.x(iblockdata);
|
|
|
|
if (i < this.g()) {
|
|
diff --git a/src/main/java/net/minecraft/server/BlockGrass.java b/src/main/java/net/minecraft/server/BlockGrass.java
|
|
index fe55848..8fc736d 100644
|
|
--- a/src/main/java/net/minecraft/server/BlockGrass.java
|
|
+++ b/src/main/java/net/minecraft/server/BlockGrass.java
|
|
@@ -29,7 +29,8 @@ public class BlockGrass extends Block implements IBlockFragilePlantElement {
|
|
|
|
public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) {
|
|
if (!world.isClientSide) {
|
|
- if (world.getLightLevel(blockposition.up()) < 4 && world.getType(blockposition.up()).c() > 2) {
|
|
+ int lightLevel = -1; // Paper
|
|
+ if (world.getType(blockposition.up()).c() > 2 && (lightLevel = world.getLightLevel(blockposition.up())) < 4) { // Paper - move light check to end to avoid unneeded light lookups
|
|
// CraftBukkit start
|
|
// world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData());
|
|
org.bukkit.World bworld = world.getWorld();
|
|
@@ -44,18 +45,25 @@ public class BlockGrass extends Block implements IBlockFragilePlantElement {
|
|
}
|
|
// CraftBukkit end
|
|
} else {
|
|
- if (world.getLightLevel(blockposition.up()) >= 9) {
|
|
+ // Paper start
|
|
+ // If light was calculated above, reuse it, else grab it
|
|
+ if (lightLevel == -1) {
|
|
+ lightLevel = world.getLightLevel(blockposition.up());
|
|
+ }
|
|
+ if (lightLevel >= 9) {
|
|
+ // Paper end
|
|
for (int i = 0; i < 4; ++i) {
|
|
BlockPosition blockposition1 = blockposition.a(random.nextInt(3) - 1, random.nextInt(5) - 3, random.nextInt(3) - 1);
|
|
|
|
- if (blockposition1.getY() >= 0 && blockposition1.getY() < 256 && !world.isLoaded(blockposition1)) {
|
|
+ IBlockData iblockdata2 = world.getTypeIfLoaded(blockposition1); // Paper - moved up
|
|
+ if (iblockdata2 == null) { // Paper
|
|
return;
|
|
}
|
|
|
|
IBlockData iblockdata1 = world.getType(blockposition1.up());
|
|
- IBlockData iblockdata2 = world.getType(blockposition1);
|
|
+ //IBlockData iblockdata2 = world.getTypeIfLoaded(blockposition1); // Paper - moved up
|
|
|
|
- if (iblockdata2.getBlock() == Blocks.DIRT && iblockdata2.get(BlockDirt.VARIANT) == BlockDirt.EnumDirtVariant.DIRT && world.getLightLevel(blockposition1.up()) >= 4 && iblockdata1.c() <= 2) {
|
|
+ if (iblockdata2.getBlock() == Blocks.DIRT && iblockdata2.get(BlockDirt.VARIANT) == BlockDirt.EnumDirtVariant.DIRT && iblockdata1.c() <= 2 && world.isLightLevel(blockposition1.up(), 4)) { // Paper - move last check before isLightLevel to avoid unneeded light checks
|
|
// CraftBukkit start
|
|
// world.setTypeUpdate(blockposition1, Blocks.GRASS.getBlockData());
|
|
org.bukkit.World bworld = world.getWorld();
|
|
diff --git a/src/main/java/net/minecraft/server/BlockSapling.java b/src/main/java/net/minecraft/server/BlockSapling.java
|
|
index 76b13a3..b7776fb 100644
|
|
--- a/src/main/java/net/minecraft/server/BlockSapling.java
|
|
+++ b/src/main/java/net/minecraft/server/BlockSapling.java
|
|
@@ -34,7 +34,7 @@ public class BlockSapling extends BlockPlant implements IBlockFragilePlantElemen
|
|
public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) {
|
|
if (!world.isClientSide) {
|
|
super.b(world, blockposition, iblockdata, random);
|
|
- if (world.getLightLevel(blockposition.up()) >= 9 && random.nextInt(Math.max(2, (int) (((100.0F / world.spigotConfig.saplingModifier) * 7) + 0.5F))) == 0) { // Spigot
|
|
+ if (world.isLightLevel(blockposition.up(), 9) && random.nextInt(Math.max(2, (int) (((100.0F / world.spigotConfig.saplingModifier) * 7) + 0.5F))) == 0) { // Spigot // Paper
|
|
// CraftBukkit start
|
|
world.captureTreeGeneration = true;
|
|
// CraftBukkit end
|
|
diff --git a/src/main/java/net/minecraft/server/BlockStem.java b/src/main/java/net/minecraft/server/BlockStem.java
|
|
index 73e68d8..439a77e 100644
|
|
--- a/src/main/java/net/minecraft/server/BlockStem.java
|
|
+++ b/src/main/java/net/minecraft/server/BlockStem.java
|
|
@@ -47,7 +47,7 @@ public class BlockStem extends BlockPlant implements IBlockFragilePlantElement {
|
|
|
|
public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) {
|
|
super.b(world, blockposition, iblockdata, random);
|
|
- if (world.getLightLevel(blockposition.up()) >= 9) {
|
|
+ if (world.isLightLevel(blockposition.up(), 9)) { // Paper
|
|
float f = BlockCrops.a((Block) this, world, blockposition);
|
|
|
|
if (random.nextInt((int) ((100.0F / (this == Blocks.PUMPKIN_STEM ? world.spigotConfig.pumpkinModifier : world.spigotConfig.melonModifier)) * (25.0F / f)) + 1) == 0) { // Spigot
|
|
diff --git a/src/main/java/net/minecraft/server/EntityMonster.java b/src/main/java/net/minecraft/server/EntityMonster.java
|
|
index f477036..23826fe 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityMonster.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityMonster.java
|
|
@@ -118,17 +118,17 @@ public abstract class EntityMonster extends EntityCreature implements IMonster {
|
|
if (this.world.b(EnumSkyBlock.SKY, blockposition) > this.random.nextInt(32)) {
|
|
return false;
|
|
} else {
|
|
- int i = this.world.getLightLevel(blockposition);
|
|
-
|
|
+ //int i = this.world.getLightLevel(blockposition); // Paper
|
|
+ boolean passes; // Paper
|
|
if (this.world.V()) {
|
|
int j = this.world.af();
|
|
|
|
this.world.c(10);
|
|
- i = this.world.getLightLevel(blockposition);
|
|
+ passes = !world.isLightLevel(blockposition, this.random.nextInt(9)); // Paper
|
|
this.world.c(j);
|
|
- }
|
|
+ } else { passes = !world.isLightLevel(blockposition, this.random.nextInt(9)); } // Paper
|
|
|
|
- return i <= this.random.nextInt(8);
|
|
+ return passes; // Paper
|
|
}
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/EntityZombie.java b/src/main/java/net/minecraft/server/EntityZombie.java
|
|
index 28fed1f..e3cce4c 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityZombie.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityZombie.java
|
|
@@ -194,7 +194,7 @@ public class EntityZombie extends EntityMonster {
|
|
int j1 = j + MathHelper.nextInt(this.random, 7, 40) * MathHelper.nextInt(this.random, -1, 1);
|
|
int k1 = k + MathHelper.nextInt(this.random, 7, 40) * MathHelper.nextInt(this.random, -1, 1);
|
|
|
|
- if (this.world.getType(new BlockPosition(i1, j1 - 1, k1)).q() && this.world.getLightLevel(new BlockPosition(i1, j1, k1)) < 10) {
|
|
+ if (this.world.getType(new BlockPosition(i1, j1 - 1, k1)).q() && !this.world.isLightLevel(new BlockPosition(i1, j1, k1), 10)) { // Paper
|
|
entityzombie.setPosition((double) i1, (double) j1, (double) k1);
|
|
if (!this.world.isPlayerNearby((double) i1, (double) j1, (double) k1, 7.0D, EntityHuman.affectsSpawningFilter()) && this.world.a(entityzombie.getBoundingBox(), (Entity) entityzombie) && this.world.getCubes(entityzombie, entityzombie.getBoundingBox()).isEmpty() && !this.world.containsLiquid(entityzombie.getBoundingBox())) { // Paper - affectsSpawning filter
|
|
this.world.addEntity(entityzombie, CreatureSpawnEvent.SpawnReason.REINFORCEMENTS); // CraftBukkit
|
|
--
|
|
2.8.0
|
|
|