Skip to content

Commit

Permalink
Fix CME in WorldServer
Browse files Browse the repository at this point in the history
Signed-off-by: Ross Allan <rallanpcl@gmail.com>
  • Loading branch information
LunNova committed Jul 4, 2013
1 parent c01ec3d commit 9ce9620
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 20 deletions.
3 changes: 3 additions & 0 deletions resources/patches.xml
Expand Up @@ -127,6 +127,9 @@
<profile>tick</profile>
<insertSuper>initialize</insertSuper>
</class>
<class id="net.minecraft.world.ServerBlockEventList">
<public/>
</class>
<class id="net.minecraft.world.biome.BiomeDecorator">
<synchronize>decorate(Lnet/minecraft/world/World;Ljava/util/Random;II)V</synchronize>
</class>
Expand Down
@@ -0,0 +1,8 @@
package nallar.patched.world;

import nallar.patched.annotation.Public;
import net.minecraft.world.ServerBlockEventList;

@Public
public class PatchServerBlockEventList extends ServerBlockEventList {
}
32 changes: 12 additions & 20 deletions src/common/nallar/patched/world/PatchWorldServer.java
Expand Up @@ -33,6 +33,7 @@
import net.minecraft.world.IWorldAccess;
import net.minecraft.world.MinecraftException;
import net.minecraft.world.NextTickListEntry;
import net.minecraft.world.ServerBlockEventList;
import net.minecraft.world.SpawnerAnimals;
import net.minecraft.world.Teleporter;
import net.minecraft.world.WorldProvider;
Expand Down Expand Up @@ -650,40 +651,31 @@ public boolean safeToGenerate() {

@Override
public synchronized void addBlockEvent(int par1, int par2, int par3, int par4, int par5, int par6) {
BlockEventData blockeventdata = new BlockEventData(par1, par2, par3, par4, par5, par6);
ArrayList blockEventCache = this.blockEventCache[this.blockEventCacheIndex];
Iterator iterator = blockEventCache.iterator();
BlockEventData blockeventdata1;

do {
if (!iterator.hasNext()) {
blockEventCache.add(blockeventdata);
BlockEventData blockEventData1 = new BlockEventData(par1, par2, par3, par4, par5, par6);
ArrayList<BlockEventData> blockEventCache = this.blockEventCache[this.blockEventCacheIndex];
for (BlockEventData blockEventData2 : blockEventCache) {
if (blockEventData1.equals(blockEventData2)) {
return;
}

blockeventdata1 = (BlockEventData) iterator.next();
}
while (!blockeventdata1.equals(blockeventdata));
blockEventCache.add(blockEventData1);
}

@Override
protected void sendAndApplyBlockEvents() {
while (true) {
ArrayList blockEventCache;
ArrayList<BlockEventData> blockEventCache;
synchronized (this) {
int i = blockEventCacheIndex;
blockEventCache = this.blockEventCache[i];
blockEventCache = this.blockEventCache[blockEventCacheIndex];
if (blockEventCache.isEmpty()) {
return;
}
blockEventCacheIndex = i ^ 1;
this.blockEventCache[blockEventCacheIndex] = new ServerBlockEventList();
}

for (final Object aBlockEventCache : blockEventCache) {
BlockEventData blockeventdata = (BlockEventData) aBlockEventCache;

if (this.onBlockEventReceived(blockeventdata)) {
this.mcServer.getConfigurationManager().sendToAllNear((double) blockeventdata.getX(), (double) blockeventdata.getY(), (double) blockeventdata.getZ(), 64.0D, this.provider.dimensionId, new Packet54PlayNoteBlock(blockeventdata.getX(), blockeventdata.getY(), blockeventdata.getZ(), blockeventdata.getBlockID(), blockeventdata.getEventID(), blockeventdata.getEventParameter()));
for (BlockEventData blockEventData : blockEventCache) {
if (this.onBlockEventReceived(blockEventData)) {
this.mcServer.getConfigurationManager().sendToAllNear((double) blockEventData.getX(), (double) blockEventData.getY(), (double) blockEventData.getZ(), 64.0D, this.provider.dimensionId, new Packet54PlayNoteBlock(blockEventData.getX(), blockEventData.getY(), blockEventData.getZ(), blockEventData.getBlockID(), blockEventData.getEventID(), blockEventData.getEventParameter()));
}
}

Expand Down

0 comments on commit 9ce9620

Please sign in to comment.