Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
1package net.minecraft.server;
2
3import org.bukkit.BlockChangeDelegate;
4import org.bukkit.craftbukkit.generator.*;
5import org.bukkit.event.entity.EntityDamageEvent;
6import org.bukkit.event.weather.LightningStrikeEvent;
7import org.bukkit.generator.ChunkGenerator;
8
9import uk.betacraft.uberbukkit.UberbukkitConfig;
10
11import java.util.ArrayList;
12import java.util.List;
13
14// CraftBukkit start
15
16public class WorldServer extends World implements BlockChangeDelegate {
17 // CraftBukkit end
18
19 public ChunkProviderServer chunkProviderServer;
20 public boolean weirdIsOpCache = false;
21 public boolean canSave;
22 public final MinecraftServer server; // CraftBukkit - private -> public final
23 private EntityList G = new EntityList();
24
25 // CraftBukkit start - change signature
26 public WorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, String s, int i, long j, org.bukkit.World.Environment env, ChunkGenerator gen) {
27 super(idatamanager, s, j, WorldProvider.byDimension(env.getId()), gen, env);
28 this.server = minecraftserver;
29
30 this.dimension = i;
31 this.pvpMode = minecraftserver.pvpMode;
32 this.manager = new PlayerManager(minecraftserver, this.dimension, minecraftserver.propertyManager.getInt("view-distance", 10));
33 }
34
35 public final int dimension;
36 public EntityTracker tracker;
37 public PlayerManager manager;
38 // CraftBukkit end
39
40 public void entityJoinedWorld(Entity entity, boolean flag) {
41 /* CraftBukkit start - We prevent spawning in general, so this butchering is not needed
42 if (!this.server.spawnAnimals && (entity instanceof EntityAnimal || entity instanceof EntityWaterAnimal)) {
43 entity.die();
44 }
45 // CraftBukkit end */
46
47 if (entity.passenger == null || !(entity.passenger instanceof EntityHuman)) {
48 super.entityJoinedWorld(entity, flag);
49 }
50 }
51
52 public void vehicleEnteredWorld(Entity entity, boolean flag) {
53 super.entityJoinedWorld(entity, flag);
54 }
55
56 protected IChunkProvider b() {
57 IChunkLoader ichunkloader = this.w.a(this.worldProvider);
58
59 // CraftBukkit start
60 InternalChunkGenerator gen;
61
62 if (this.generator != null) {
63 gen = new CustomChunkGenerator(this, this.getSeed(), this.generator);
64 } else if (this.worldProvider instanceof WorldProviderHell) {
65 gen = new NetherChunkGenerator(this, this.getSeed());
66 } else if (this.worldProvider instanceof WorldProviderSky) {
67 gen = new SkyLandsChunkGenerator(this, this.getSeed());
68 } else {
69 gen = new NormalChunkGenerator(this, this.getSeed());
70 }
71
72 this.chunkProviderServer = new ChunkProviderServer(this, ichunkloader, gen);
73 // CraftBukkit end
74
75 return this.chunkProviderServer;
76 }
77
78 public List getTileEntities(int i, int j, int k, int l, int i1, int j1) {
79 ArrayList arraylist = new ArrayList();
80
81 for (int k1 = 0; k1 < this.c.size(); ++k1) {
82 TileEntity tileentity = (TileEntity) this.c.get(k1);
83
84 if (tileentity.x >= i && tileentity.y >= j && tileentity.z >= k && tileentity.x < l && tileentity.y < i1 && tileentity.z < j1) {
85 arraylist.add(tileentity);
86 }
87 }
88
89 return arraylist;
90 }
91
92 public boolean a(EntityHuman entityhuman, int i, int j, int k) {
93 int l = (int) MathHelper.abs((float) (i - this.worldData.c()));
94 int i1 = (int) MathHelper.abs((float) (k - this.worldData.e()));
95
96 if (l > i1) {
97 i1 = l;
98 }
99
100 // CraftBukkit - Configurable spawn protection
101 return i1 > this.getServer().getSpawnRadius() || this.server.serverConfigurationManager.isOp(entityhuman.name);
102 }
103
104 protected void c(Entity entity) {
105 super.c(entity);
106 this.G.a(entity.id, entity);
107 }
108
109 protected void d(Entity entity) {
110 super.d(entity);
111 this.G.d(entity.id);
112 }
113
114 public Entity getEntity(int i) {
115 return (Entity) this.G.a(i);
116 }
117
118 public boolean strikeLightning(Entity entity) {
119 // CraftBukkit start
120 LightningStrikeEvent lightning = new LightningStrikeEvent(this.getWorld(), (org.bukkit.entity.LightningStrike) entity.getBukkitEntity());
121 this.getServer().getPluginManager().callEvent(lightning);
122
123 // uberbukkit
124 if (lightning.isCancelled() || !UberbukkitConfig.getInstance().getBoolean("mechanics.do_weather", true)) {
125 return false;
126 }
127
128 // uberbukkit
129 if (super.strikeLightning(entity)) {
130 this.server.serverConfigurationManager.sendPacketNearby(entity.locX, entity.locY, entity.locZ, 512.0D, this.dimension, new Packet71Weather(entity));
131 // CraftBukkit end
132 return true;
133 } else {
134 return false;
135 }
136 }
137
138 public void a(Entity entity, byte b0) {
139 Packet38EntityStatus packet38entitystatus = new Packet38EntityStatus(entity.id, b0);
140
141 // CraftBukkit
142 this.server.getTracker(this.dimension).sendPacketToEntity(entity, packet38entitystatus);
143 }
144
145 //Project Poseidon Start
146 public Explosion createExplosion(Entity entity, double d0, double d1, double d2, float f, boolean flag, EntityDamageEvent.DamageCause customDamageCause) {
147 Explosion explosion = super.createExplosion(entity, d0, d1, d2, f, flag, customDamageCause);
148
149 if (explosion.wasCanceled) {
150 return explosion;
151 }
152 this.server.serverConfigurationManager.sendPacketNearby(d0, d1, d2, 64.0D, this.dimension, new Packet60Explosion(d0, d1, d2, f, explosion.blocks));
153
154 return explosion;
155 }
156 //Project Poseidon End
157
158 public Explosion createExplosion(Entity entity, double d0, double d1, double d2, float f, boolean flag) {
159 // CraftBukkit start
160 Explosion explosion = super.createExplosion(entity, d0, d1, d2, f, flag);
161
162 if (explosion.wasCanceled) {
163 return explosion;
164 }
165
166 /* Remove
167 explosion.a = flag;
168 explosion.a();
169 explosion.a(false);
170 */
171 this.server.serverConfigurationManager.sendPacketNearby(d0, d1, d2, 64.0D, this.dimension, new Packet60Explosion(d0, d1, d2, f, explosion.blocks));
172 // CraftBukkit end
173 return explosion;
174 }
175
176 public void playNote(int i, int j, int k, int l, int i1) {
177 super.playNote(i, j, k, l, i1);
178 // CraftBukkit
179 this.server.serverConfigurationManager.sendPacketNearby((double) i, (double) j, (double) k, 64.0D, this.dimension, new Packet54PlayNoteBlock(i, j, k, l, i1));
180 }
181
182 public void saveLevel() {
183 this.w.e();
184 }
185
186 protected void i() {
187 boolean flag = this.v();
188
189 super.i();
190 if (flag != this.v()) {
191 // CraftBukkit start - only sending weather packets to those affected
192 for (int i = 0; i < this.players.size(); ++i) {
193 EntityPlayer player = ((EntityPlayer) this.players.get(i));
194 if (player.world == this) {
195 player.netServerHandler.sendPacket(new Packet70Bed(flag ? 2 : 1));
196 }
197 }
198 // CraftBukkit end
199 }
200 }
201
202 // Poseidon
203 public PlayerManager getPlayerManager() {
204 return this.manager;
205 }
206}