diff --git a/src/main/java/net/minecraft/entity/Entity.java b/src/main/java/net/minecraft/entity/Entity.java index 2ed0bfb..0ca21cc 100644 --- a/src/main/java/net/minecraft/entity/Entity.java +++ b/src/main/java/net/minecraft/entity/Entity.java @@ -3,12 +3,14 @@ import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Random; import java.util.UUID; import java.util.concurrent.Callable; + import net.minecraft.block.Block; import net.minecraft.block.BlockLiquid; import net.minecraft.block.material.Material; @@ -1300,6 +1302,7 @@ { try { + if(owner != null) p_70109_1_.setString("#", owner); p_70109_1_.setTag("Pos", this.newDoubleNBTList(new double[] {this.posX, this.posY + (double)this.ySize, this.posZ})); p_70109_1_.setTag("Motion", this.newDoubleNBTList(new double[] {this.motionX, this.motionY, this.motionZ})); p_70109_1_.setTag("Rotation", this.newFloatNBTList(new float[] {this.rotationYaw, this.rotationPitch})); @@ -1356,6 +1359,7 @@ { try { + owner = p_70020_1_.hasKey("#") ? p_70020_1_.getString("#") : null; NBTTagList nbttaglist = p_70020_1_.getTagList("Pos", 6); NBTTagList nbttaglist1 = p_70020_1_.getTagList("Motion", 6); NBTTagList nbttaglist2 = p_70020_1_.getTagList("Rotation", 5); @@ -2472,6 +2476,19 @@ /* ===================================== ULTRAMINE START =====================================*/ + private String owner; + + public final void setObjectOwner(String owner) + { + if(this.owner == null) + this.owner = owner; + } + + public final String getObjectOwner() + { + return this.owner; + } + public boolean isEntityLiving() { return false; diff --git a/src/main/java/net/minecraft/entity/EntityHanging.java b/src/main/java/net/minecraft/entity/EntityHanging.java index 2ae869b..0571a45 100644 --- a/src/main/java/net/minecraft/entity/EntityHanging.java +++ b/src/main/java/net/minecraft/entity/EntityHanging.java @@ -2,6 +2,9 @@ import java.util.Iterator; import java.util.List; + +import org.ultramine.server.event.UMEventFactory; + import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; @@ -231,7 +234,7 @@ } else { - if (!this.isDead && !this.worldObj.isRemote) + if (!this.isDead && !this.worldObj.isRemote && !UMEventFactory.fireHangingBreak(this, p_70097_1_)) { this.setDead(); this.setBeenAttacked(); diff --git a/src/main/java/net/minecraft/entity/player/EntityPlayerMP.java b/src/main/java/net/minecraft/entity/player/EntityPlayerMP.java index 1c9b025..2072bfb 100644 --- a/src/main/java/net/minecraft/entity/player/EntityPlayerMP.java +++ b/src/main/java/net/minecraft/entity/player/EntityPlayerMP.java @@ -106,6 +106,7 @@ import org.ultramine.server.PermissionHandler; import org.ultramine.server.chunk.ChunkSendManager; import org.ultramine.server.data.player.PlayerData; +import org.ultramine.server.event.UMEventFactory; import net.minecraft.entity.item.EntityItem; import net.minecraftforge.common.ForgeHooks; @@ -743,6 +744,7 @@ public void closeContainer() { + UMEventFactory.fireInventoryClose(this); this.openContainer.onContainerClosed(this); this.openContainer = this.inventoryContainer; } diff --git a/src/main/java/net/minecraft/network/NetworkManager.java b/src/main/java/net/minecraft/network/NetworkManager.java index d88ce43..24565d8 100644 --- a/src/main/java/net/minecraft/network/NetworkManager.java +++ b/src/main/java/net/minecraft/network/NetworkManager.java @@ -22,10 +22,14 @@ import io.netty.handler.timeout.TimeoutException; import io.netty.util.AttributeKey; import io.netty.util.concurrent.GenericFutureListener; + import java.net.InetAddress; import java.net.SocketAddress; import java.util.Queue; + import javax.crypto.SecretKey; + +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.CryptManager; import net.minecraft.util.IChatComponent; @@ -33,11 +37,13 @@ import net.minecraft.util.MessageDeserializer2; import net.minecraft.util.MessageSerializer; import net.minecraft.util.MessageSerializer2; + import org.apache.commons.lang3.Validate; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.MarkerManager; +import org.ultramine.server.event.WorldUpdateObjectType; public class NetworkManager extends SimpleChannelInboundHandler { @@ -206,12 +212,22 @@ if (this.netHandler != null) { + EntityPlayerMP player = netHandler instanceof NetHandlerPlayServer ? ((NetHandlerPlayServer)netHandler).playerEntity : null; + if(player != null) + { + player.worldObj.getEventProxy().pushState(WorldUpdateObjectType.PLAYER); + player.worldObj.getEventProxy().startEntity(player); + } + for (int i = 1000; !this.receivedPacketsQueue.isEmpty() && i >= 0; --i) { Packet packet = (Packet)this.receivedPacketsQueue.poll(); packet.processPacket(this.netHandler); } + if(player != null) + player.worldObj.getEventProxy().popState(); + this.netHandler.onNetworkTick(); } diff --git a/src/main/java/net/minecraft/server/management/ItemInWorldManager.java b/src/main/java/net/minecraft/server/management/ItemInWorldManager.java index 56b95b1..83113b1 100644 --- a/src/main/java/net/minecraft/server/management/ItemInWorldManager.java +++ b/src/main/java/net/minecraft/server/management/ItemInWorldManager.java @@ -374,6 +374,7 @@ if (!useBlock) useBlock = p_73078_1_.getHeldItem().getItem().doesSneakBypassUse(p_73078_2_, p_73078_4_, p_73078_5_, p_73078_6_, p_73078_1_); boolean result = false; + p_73078_2_.getEventProxy().startInteract(p_73078_3_, block, p_73078_4_, p_73078_5_, p_73078_6_); if (useBlock) { if (event.useBlock != Event.Result.DENY) @@ -399,6 +400,7 @@ } if (p_73078_3_.stackSize <= 0) ForgeEventFactory.onPlayerDestroyItem(thisPlayerMP, p_73078_3_); } + p_73078_2_.getEventProxy().endInteract(); /* Re-enable if this causes bukkit incompatibility, or re-write client side to only send a single packet per right click. if (par3ItemStack != null && ((!result && event.useItem != Event.Result.DENY) || event.useItem == Event.Result.ALLOW)) diff --git a/src/main/java/net/minecraft/tileentity/TileEntity.java b/src/main/java/net/minecraft/tileentity/TileEntity.java index 3026dee..394c250 100644 --- a/src/main/java/net/minecraft/tileentity/TileEntity.java +++ b/src/main/java/net/minecraft/tileentity/TileEntity.java @@ -3,6 +3,7 @@ import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; + import java.util.HashMap; import java.util.Map; import java.util.concurrent.Callable; @@ -66,6 +67,7 @@ public void readFromNBT(NBTTagCompound p_145839_1_) { + if(owner == null && p_145839_1_.hasKey("#")) owner = p_145839_1_.getString("#"); this.xCoord = p_145839_1_.getInteger("x"); this.yCoord = p_145839_1_.getInteger("y"); this.zCoord = p_145839_1_.getInteger("z"); @@ -81,6 +83,7 @@ } else { + if(owner != null) p_145841_1_.setString("#", owner); p_145841_1_.setString("id", s); p_145841_1_.setInteger("x", this.xCoord); p_145841_1_.setInteger("y", this.yCoord); @@ -370,4 +373,19 @@ } return bb; } + + /* ======================================== ULTRAMINE START ===================================== */ + + private String owner; + + public final void setObjectOwner(String owner) + { + if(this.owner == null) + this.owner = owner; + } + + public final String getObjectOwner() + { + return this.owner; + } } \ No newline at end of file diff --git a/src/main/java/net/minecraft/world/World.java b/src/main/java/net/minecraft/world/World.java index 23638e5..ab83e32 100644 --- a/src/main/java/net/minecraft/world/World.java +++ b/src/main/java/net/minecraft/world/World.java @@ -23,6 +23,9 @@ import org.ultramine.server.chunk.ChunkProfiler; import org.ultramine.server.chunk.ChunkProfiler.WorldChunkProfiler; import org.ultramine.server.chunk.IChunkLoadCallback; +import org.ultramine.server.event.ServerWorldEventProxy; +import org.ultramine.server.event.WorldEventProxy; +import org.ultramine.server.event.WorldUpdateObjectType; import net.minecraft.block.Block; import net.minecraft.block.BlockHopper; @@ -65,6 +68,7 @@ import net.minecraft.world.storage.ISaveHandler; import net.minecraft.world.storage.MapStorage; import net.minecraft.world.storage.WorldInfo; +import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.FMLLog; import com.google.common.collect.ImmutableSetMultimap; @@ -437,7 +441,17 @@ return this.chunkProvider.provideChunk(p_72964_1_, p_72964_2_); } - public boolean setBlock(int p_147465_1_, int p_147465_2_, int p_147465_3_, Block p_147465_4_, int p_147465_5_, int p_147465_6_) + public boolean setBlockSilently(int x, int y, int z, Block block, int meta, int flags) + { + return setBlock(x, y, z, block, meta, flags, false); + } + + public boolean setBlock(int x, int y, int z, Block block, int meta, int flags) + { + return setBlock(x, y, z, block, meta, flags, true); + } + + public boolean setBlock(int p_147465_1_, int p_147465_2_, int p_147465_3_, Block p_147465_4_, int p_147465_5_, int p_147465_6_, boolean fireEvent) { if (p_147465_1_ >= -MAX_BLOCK_COORD && p_147465_3_ >= -MAX_BLOCK_COORD && p_147465_1_ < MAX_BLOCK_COORD && p_147465_3_ < MAX_BLOCK_COORD) { @@ -451,6 +465,8 @@ } else { + if(fireEvent && !eventProxy.canChangeBlock(p_147465_1_, p_147465_2_, p_147465_3_, p_147465_4_, p_147465_5_, p_147465_6_)) + return false; Chunk chunk = this.getChunkFromChunkCoords(p_147465_1_ >> 4, p_147465_3_ >> 4); Block block1 = null; net.minecraftforge.common.util.BlockSnapshot blockSnapshot = null; @@ -467,6 +483,13 @@ } boolean flag = chunk.func_150807_a(p_147465_1_ & 15, p_147465_2_, p_147465_3_ & 15, p_147465_4_, p_147465_5_); + + if(p_147465_4_.hasTileEntity(p_147465_5_)) + { + TileEntity te = getTileEntity(p_147465_1_, p_147465_2_, p_147465_3_); + if(te != null) + te.setObjectOwner(eventProxy.getObjectOwner()); + } if (!flag && blockSnapshot != null) { @@ -712,7 +735,9 @@ try { + eventProxy.startNeighbor(p_147460_1_, p_147460_2_, p_147460_3_); block.onNeighborBlockChange(this, p_147460_1_, p_147460_2_, p_147460_3_, p_147460_4_); + eventProxy.endNeighbor(); } catch (Throwable throwable1) { @@ -1337,6 +1362,10 @@ { flag = true; } + else + { + p_72838_1_.setObjectOwner(eventProxy.getObjectOwner()); + } if (!flag && !chunkExists) { @@ -1835,9 +1864,11 @@ CrashReport crashreport; CrashReportCategory crashreportcategory; + eventProxy.pushState(WorldUpdateObjectType.ENTITY_WEATHER); for (i = 0; i < this.weatherEffects.size(); ++i) { entity = (Entity)this.weatherEffects.get(i); + eventProxy.startEntity(entity); try { @@ -1874,6 +1905,7 @@ this.weatherEffects.remove(i--); } } + eventProxy.popState(); this.theProfiler.endStartSection("remove"); this.loadedEntityList.removeAll(this.unloadedEntityList); @@ -1900,9 +1932,11 @@ this.unloadedEntityList.clear(); this.theProfiler.endStartSection("regular"); + eventProxy.pushState(WorldUpdateObjectType.ENTITY); for (i = 0; i < this.loadedEntityList.size(); ++i) { entity = (Entity)this.loadedEntityList.get(i); + eventProxy.startEntity(entity); if (entity.ridingEntity != null) { @@ -1960,14 +1994,17 @@ this.theProfiler.endSection(); } + eventProxy.popState(); this.theProfiler.endStartSection("blockEntities"); this.field_147481_N = true; Iterator iterator = this.loadedTileEntityList.iterator(); + eventProxy.pushState(WorldUpdateObjectType.TILEE_ENTITY); while (iterator.hasNext()) { TileEntity tileentity = (TileEntity)iterator.next(); + eventProxy.startTileEntity(tileentity); int key = ChunkHash.chunkToKey(tileentity.xCoord >> 4, tileentity.zCoord >> 4); if (!tileentity.isInvalid() && tileentity.hasWorldObj() && activeChunkSet.containsKey(key)) @@ -2011,6 +2048,7 @@ } } } + eventProxy.popState(); if (!this.field_147483_b.isEmpty()) { @@ -4109,6 +4147,7 @@ public static final int MAX_BLOCK_COORD = 500000;//524288; private final ServerLoadBalancer balancer = new ServerLoadBalancer(this); + private final WorldEventProxy eventProxy = FMLCommonHandler.instance().getSide().isServer() && this instanceof WorldServer ? new ServerWorldEventProxy((WorldServer)this) : new WorldEventProxy(); private final WorldChunkProfiler chunkProfiler; public Chunk getChunkIfExists(int cx, int cz) @@ -4174,4 +4213,9 @@ this.field_147483_b.clear(); } } + + public WorldEventProxy getEventProxy() + { + return eventProxy; + } } diff --git a/src/main/java/net/minecraft/world/WorldServer.java b/src/main/java/net/minecraft/world/WorldServer.java index 9816030..bf29064 100644 --- a/src/main/java/net/minecraft/world/WorldServer.java +++ b/src/main/java/net/minecraft/world/WorldServer.java @@ -78,6 +78,7 @@ import org.ultramine.server.WorldsConfig.WorldConfig.Settings.WorldTime; import org.ultramine.server.chunk.ChunkHash; import org.ultramine.server.chunk.PendingBlockUpdate; +import org.ultramine.server.event.WorldUpdateObjectType; import org.ultramine.server.mobspawn.MobSpawnManager; public class WorldServer extends World @@ -364,6 +365,7 @@ if (provider.canDoRainSnowIce(chunk) && this.rand.nextInt(16) == 0) { + getEventProxy().pushState(WorldUpdateObjectType.WEATHER); this.updateLCG = this.updateLCG * 3 + 1013904223; i1 = this.updateLCG >> 2; j1 = i1 & 15; @@ -389,12 +391,14 @@ this.getBlock(j1 + k, l1 - 1, k1 + l).fillWithRain(this, j1 + k, l1 - 1, k1 + l); } } + getEventProxy().popState(); } this.theProfiler.endStartSection("tickBlocks"); ExtendedBlockStorage[] aextendedblockstorage = chunk.getBlockStorageArray(); j1 = aextendedblockstorage.length; + getEventProxy().pushState(WorldUpdateObjectType.BLOCK_RANDOM); for (k1 = 0; k1 < j1; ++k1) { ExtendedBlockStorage extendedblockstorage = aextendedblockstorage[k1]; @@ -414,11 +418,13 @@ if (block.getTickRandomly()) { ++i; + getEventProxy().startBlock(block, j2 + k, l2 + extendedblockstorage.getYLocation(), k2 + l); block.updateTick(this, j2 + k, l2 + extendedblockstorage.getYLocation(), k2 + l, this.rand); } } } } + getEventProxy().popState(); this.theProfiler.endSection(); } @@ -816,6 +822,7 @@ private void func_147488_Z() { + getEventProxy().pushState(WorldUpdateObjectType.BLOCK_EVENT); while (!this.field_147490_S[this.blockEventCacheIndex].isEmpty()) { int i = this.blockEventCacheIndex; @@ -825,6 +832,9 @@ while (iterator.hasNext()) { BlockEventData blockeventdata = (BlockEventData)iterator.next(); + Block block = getBlockIfExists(blockeventdata.func_151340_a(), blockeventdata.func_151342_b(), blockeventdata.func_151341_c()); + if(block == blockeventdata.getBlock()) + getEventProxy().startBlock(block, blockeventdata.func_151340_a(), blockeventdata.func_151342_b(), blockeventdata.func_151341_c()); if (this.func_147485_a(blockeventdata)) { @@ -834,11 +844,12 @@ this.field_147490_S[i].clear(); } + getEventProxy().popState(); } private boolean func_147485_a(BlockEventData p_147485_1_) { - Block block = this.getBlock(p_147485_1_.func_151340_a(), p_147485_1_.func_151342_b(), p_147485_1_.func_151341_c()); + Block block = this.getBlockIfExists(p_147485_1_.func_151340_a(), p_147485_1_.func_151342_b(), p_147485_1_.func_151341_c()); return block == p_147485_1_.getBlock() ? block.onBlockEventReceived(this, p_147485_1_.func_151340_a(), p_147485_1_.func_151342_b(), p_147485_1_.func_151341_c(), p_147485_1_.getEventID(), p_147485_1_.getEventParameter()) : false; } @@ -990,16 +1001,19 @@ int x = chunk.xPosition << 4; int z = chunk.zPosition << 4; + getEventProxy().pushState(WorldUpdateObjectType.BLOCK_PENDING); PendingBlockUpdate p; while((p = chunk.pollPending(time)) != null) { updateBlock(x + p.x, p.y, z + p.z, p.getBlock()); } + getEventProxy().popState(); } private void updateBlock(int x, int y, int z, Block block1) { Block block = this.getBlock(x, y, z); + getEventProxy().startBlock(block, x, y, z); if (block.getMaterial() != Material.air && Block.isEqualTo(block, block1)) { diff --git a/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java b/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java index 9beac4d..c83ccab 100644 --- a/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java +++ b/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java @@ -205,7 +205,9 @@ { try { + isGenerating = true; chunk = this.currentChunkProvider.provideChunk(par1, par2); + isGenerating = false; } catch (Throwable throwable) { @@ -310,10 +312,12 @@ if (this.currentChunkProvider != null) { + isGenerating = true; this.currentChunkProvider.populate(par1IChunkProvider, par2, par3); if(!worldObj.getConfig().generation.disableModGeneration) GameRegistry.generateWorld(par2, par3, worldObj, currentChunkProvider, par1IChunkProvider); chunk.setChunkModified(); + isGenerating = false; } } } @@ -460,6 +464,7 @@ private int lastFullSaveTick; private boolean preventSaving; private boolean isWorldUnloaded; + private boolean isGenerating; @SideOnly(Side.SERVER) private ChunkGC chunkGC; @@ -635,4 +640,9 @@ possibleSaves.clear(); ((AnvilChunkLoader)currentChunkLoader).unsafeRemoveAll(); } + + public boolean isGenerating() + { + return isGenerating; + } } \ No newline at end of file diff --git a/src/main/java/net/minecraftforge/common/util/BlockSnapshot.java b/src/main/java/net/minecraftforge/common/util/BlockSnapshot.java index 089a9bf..8380640 100644 --- a/src/main/java/net/minecraftforge/common/util/BlockSnapshot.java +++ b/src/main/java/net/minecraftforge/common/util/BlockSnapshot.java @@ -169,7 +169,7 @@ { if (force) { - world.setBlock(x, y, z, getReplacedBlock(), meta, applyPhysics ? 3 : 2); + world.setBlockSilently(x, y, z, getReplacedBlock(), meta, applyPhysics ? 3 : 2); } else { @@ -202,7 +202,7 @@ { if (force) { - world.setBlock(x, y, z, getReplacedBlock(), meta, applyPhysics ? 3 : 2); + world.setBlockSilently(x, y, z, getReplacedBlock(), meta, applyPhysics ? 3 : 2); } else { diff --git a/src/main/java/org/ultramine/server/event/HangingEvent.java b/src/main/java/org/ultramine/server/event/HangingEvent.java new file mode 100644 index 0000000..63dfa18 --- /dev/null +++ b/src/main/java/org/ultramine/server/event/HangingEvent.java @@ -0,0 +1,28 @@ +package org.ultramine.server.event; + +import net.minecraft.entity.EntityHanging; +import net.minecraft.util.DamageSource; +import cpw.mods.fml.common.eventhandler.Cancelable; +import cpw.mods.fml.common.eventhandler.Event; + +@Cancelable +public class HangingEvent extends Event +{ + public final EntityHanging entity; + + public HangingEvent(EntityHanging entity) + { + this.entity = entity; + } + + public static class HangingBreakEvent extends HangingEvent + { + public final DamageSource source; + + public HangingBreakEvent(EntityHanging entity, DamageSource source) + { + super(entity); + this.source = source; + } + } +} diff --git a/src/main/java/org/ultramine/server/event/InventoryCloseEvent.java b/src/main/java/org/ultramine/server/event/InventoryCloseEvent.java new file mode 100644 index 0000000..2114725 --- /dev/null +++ b/src/main/java/org/ultramine/server/event/InventoryCloseEvent.java @@ -0,0 +1,14 @@ +package org.ultramine.server.event; + +import net.minecraft.entity.player.EntityPlayerMP; +import cpw.mods.fml.common.eventhandler.Event; + +public class InventoryCloseEvent extends Event +{ + public final EntityPlayerMP player; + + public InventoryCloseEvent(EntityPlayerMP player) + { + this.player = player; + } +} diff --git a/src/main/java/org/ultramine/server/event/ServerWorldEventProxy.java b/src/main/java/org/ultramine/server/event/ServerWorldEventProxy.java new file mode 100644 index 0000000..eab5974 --- /dev/null +++ b/src/main/java/org/ultramine/server/event/ServerWorldEventProxy.java @@ -0,0 +1,139 @@ +package org.ultramine.server.event; + +import org.ultramine.server.chunk.ChunkHash; + +import gnu.trove.list.TLongList; +import gnu.trove.list.array.TLongArrayList; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.WorldServer; +import net.minecraftforge.common.MinecraftForge; + +public class ServerWorldEventProxy extends WorldEventProxy +{ + private final WorldServer world; + private final WorldUpdateObject object = new WorldUpdateObject(); + private final TLongList neighborStack = new TLongArrayList(); + + public ServerWorldEventProxy(WorldServer world) + { + this.world = world; + } + + @Override + public void pushState(WorldUpdateObjectType state) + { + object.setType(state); + } + + @Override + public void popState() + { + object.setType(WorldUpdateObjectType.UNKNOWN); + object.setEntity(null); + object.setTileEntity(null); + } + + @Override + public void startEntity(Entity entity) + { + object.setEntity(entity); + } + + @Override + public void startTileEntity(TileEntity tile) + { + object.setTileEntity(tile); + } + + @Override + public void startBlock(Block block, int x, int y, int z) + { + object.setBlock(block, x, y, z); + } + + @Override + public void startNeighbor(int x, int y, int z) + { + neighborStack.add(ChunkHash.blockCoordToHash(x, y, z)); + } + + @Override + public void endNeighbor() + { + neighborStack.removeAt(neighborStack.size() - 1); + } + + @Override + public void startInteract(ItemStack stack, Block block, int x, int y, int z) + { + object.setInteracting(true); + object.setInteractBlock(stack, block, x, y, z); + } + + @Override + public void endInteract() + { + object.setInteracting(false); + } + + @Override + public String getObjectOwner() + { + switch(object.getType()) + { + case BLOCK_EVENT: + case BLOCK_PENDING: + case BLOCK_RANDOM: + TileEntity te = world.getTileEntity(object.getX(), object.getY(), object.getZ()); + if(te != null) + return te.getObjectOwner(); + break; + case ENTITY: + return object.getEntity().getObjectOwner(); + case ENTITY_WEATHER: + break; + case PLAYER: + return ((EntityPlayer)object.getEntity()).getGameProfile().getName(); + case TILEE_ENTITY: + return object.getTileEntity().getObjectOwner(); + case UNKNOWN: + break; + case WEATHER: + break; + } + + return null; + } + + @Override + public boolean canChangeBlock(int x, int y, int z, Block block, int meta, int flags) + { + if(world.theChunkProviderServer.isGenerating()) + return true; + if(block != Blocks.air) + { + WorldUpdateObjectType type = object.getType(); + if(type == WorldUpdateObjectType.TILEE_ENTITY) + { + TileEntity tile = object.getTileEntity(); + if(tile.xCoord == x && tile.yCoord == y && tile.zCoord == z) + return true; + } + else if(type == WorldUpdateObjectType.BLOCK_RANDOM || type == WorldUpdateObjectType.BLOCK_PENDING || type == WorldUpdateObjectType.BLOCK_EVENT) + { + if(x == object.getX() && y == object.getY() && z == object.getZ()) + return true; + } + } + + boolean isNeighbor = neighborStack.size() > 0; + boolean isNeighborItself = isNeighbor && neighborStack.get(neighborStack.size() - 1) == ChunkHash.blockCoordToHash(x, y, z); + + return !MinecraftForge.EVENT_BUS.post(new SetBlockEvent(world, x, y, z, block, meta, object, isNeighbor, isNeighborItself)); + } +} diff --git a/src/main/java/org/ultramine/server/event/SetBlockEvent.java b/src/main/java/org/ultramine/server/event/SetBlockEvent.java new file mode 100644 index 0000000..ddbbedf --- /dev/null +++ b/src/main/java/org/ultramine/server/event/SetBlockEvent.java @@ -0,0 +1,35 @@ +package org.ultramine.server.event; + +import net.minecraft.block.Block; +import net.minecraft.world.WorldServer; +import cpw.mods.fml.common.eventhandler.Cancelable; +import cpw.mods.fml.common.eventhandler.Event; + +@Cancelable +public class SetBlockEvent extends Event +{ + public final WorldServer world; + public final int x; + public final int y; + public final int z; + + public final Block newBlock; + public final int newMeta; + + public final WorldUpdateObject initiator; + public final boolean isNeighborChange; + public final boolean isNeighborChangeItself; + + public SetBlockEvent(WorldServer world, int x, int y, int z, Block newBlock, int newMeta, WorldUpdateObject initiator, boolean isNeighborChange, boolean isNeighborChangeItself) + { + this.world = world; + this.x = x; + this.y = y; + this.z = z; + this.newBlock = newBlock; + this.newMeta = newMeta; + this.initiator = initiator; + this.isNeighborChange = isNeighborChange; + this.isNeighborChangeItself = isNeighborChangeItself; + } +} diff --git a/src/main/java/org/ultramine/server/event/UMEventFactory.java b/src/main/java/org/ultramine/server/event/UMEventFactory.java new file mode 100644 index 0000000..40091e2 --- /dev/null +++ b/src/main/java/org/ultramine/server/event/UMEventFactory.java @@ -0,0 +1,19 @@ +package org.ultramine.server.event; + +import net.minecraft.entity.EntityHanging; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.util.DamageSource; +import net.minecraftforge.common.MinecraftForge; + +public class UMEventFactory +{ + public static void fireInventoryClose(EntityPlayerMP player) + { + MinecraftForge.EVENT_BUS.post(new InventoryCloseEvent(player)); + } + + public static boolean fireHangingBreak(EntityHanging entity, DamageSource source) + { + return MinecraftForge.EVENT_BUS.post(new HangingEvent.HangingBreakEvent(entity, source)); + } +} diff --git a/src/main/java/org/ultramine/server/event/WorldEventProxy.java b/src/main/java/org/ultramine/server/event/WorldEventProxy.java new file mode 100644 index 0000000..e11f3fe --- /dev/null +++ b/src/main/java/org/ultramine/server/event/WorldEventProxy.java @@ -0,0 +1,55 @@ +package org.ultramine.server.event; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; + +public class WorldEventProxy +{ + public void pushState(WorldUpdateObjectType state) + { + } + + public void popState() + { + } + + public void startEntity(Entity entity) + { + } + + public void startTileEntity(TileEntity tile) + { + } + + public void startBlock(Block block, int x, int y, int z) + { + } + + public void startNeighbor(int x, int y, int z) + { + } + + public void endNeighbor() + { + } + + public void startInteract(ItemStack stack, Block block, int x, int y, int z) + { + } + + public void endInteract() + { + } + + public String getObjectOwner() + { + return null; + } + + public boolean canChangeBlock(int x, int y, int z, Block block, int meta, int flags) + { + return true; + } +} diff --git a/src/main/java/org/ultramine/server/event/WorldUpdateObject.java b/src/main/java/org/ultramine/server/event/WorldUpdateObject.java new file mode 100644 index 0000000..b75ae65 --- /dev/null +++ b/src/main/java/org/ultramine/server/event/WorldUpdateObject.java @@ -0,0 +1,161 @@ +package org.ultramine.server.event; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; + +public class WorldUpdateObject +{ + private WorldUpdateObjectType type; + private Entity entity; + private TileEntity tile; + private Block block; + private int x; + private int y; + private int z; + + private boolean isInteracting; + private ItemStack interactStack; + private Block interactBlock; + private int intx; + private int inty; + private int intz; + + public WorldUpdateObject() + { + this.type = WorldUpdateObjectType.UNKNOWN; + } + + WorldUpdateObject setType(WorldUpdateObjectType type) + { + this.type = type; + return this; + } + + public WorldUpdateObjectType getType() + { + return type; + } + + void setEntity(Entity entity) + { + this.entity = entity; + } + + public Entity getEntity() + { + return entity; + } + + void setTileEntity(TileEntity tile) + { + this.tile = tile; + } + + public TileEntity getTileEntity() + { + return tile; + } + + void setInteracting(boolean isInteracting) + { + this.isInteracting = isInteracting; + } + + public boolean isInteracting() + { + return isInteracting; + } + + void setBlock(Block block, int x, int y, int z) + { + this.block = block; + this.x = x; + this.y = y; + this.z = z; + } + + public Block getBlock() + { + return block; + } + + public int getX() + { + return x; + } + + public int getY() + { + return y; + } + + public int getZ() + { + return z; + } + + void setInteractBlock(ItemStack interactStack, Block interactBlock, int x, int y, int z) + { + this.interactStack = interactStack; + this.interactBlock = interactBlock; + this.intx = x; + this.inty = y; + this.intz = z; + } + + public ItemStack getInteractStack() + { + return interactStack; + } + + public Block getInteractBlock() + { + return interactBlock; + } + + public int getInteractX() + { + return intx; + } + + public int getInteractY() + { + return inty; + } + + public int getInteractZ() + { + return intz; + } + + public String getOwner() + { + switch(type) + { + case BLOCK_EVENT: + case BLOCK_PENDING: + case BLOCK_RANDOM: + + break; + case ENTITY: + return entity.isEntityPlayerMP() ? ((EntityPlayer)entity).getGameProfile().getName() : entity.getObjectOwner(); + case ENTITY_WEATHER: + break; + case PLAYER: + return ((EntityPlayer)getEntity()).getGameProfile().getName(); + case TILEE_ENTITY: + return getTileEntity().getObjectOwner(); + case UNKNOWN: + break; + case WEATHER: + break; + default: + break; + } + + return null; + } +} diff --git a/src/main/java/org/ultramine/server/event/WorldUpdateObjectType.java b/src/main/java/org/ultramine/server/event/WorldUpdateObjectType.java new file mode 100644 index 0000000..3dae5d8 --- /dev/null +++ b/src/main/java/org/ultramine/server/event/WorldUpdateObjectType.java @@ -0,0 +1,14 @@ +package org.ultramine.server.event; + +public enum WorldUpdateObjectType +{ + UNKNOWN, + WEATHER, + PLAYER, + ENTITY_WEATHER, + ENTITY, + TILEE_ENTITY, + BLOCK_RANDOM, + BLOCK_EVENT, + BLOCK_PENDING; +}