aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/LightningBolt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.World/LightningBolt.cpp')
-rw-r--r--Minecraft.World/LightningBolt.cpp143
1 files changed, 143 insertions, 0 deletions
diff --git a/Minecraft.World/LightningBolt.cpp b/Minecraft.World/LightningBolt.cpp
new file mode 100644
index 00000000..901bedf1
--- /dev/null
+++ b/Minecraft.World/LightningBolt.cpp
@@ -0,0 +1,143 @@
+#include "stdafx.h"
+#include "net.minecraft.world.level.h"
+#include "net.minecraft.world.level.tile.h"
+#include "net.minecraft.world.phys.h"
+#include "LightningBolt.h"
+#include "SoundTypes.h"
+#include "..\Minecraft.Client\MinecraftServer.h"
+#include "..\Minecraft.Client\PlayerList.h"
+#include "net.minecraft.world.level.dimension.h"
+
+
+LightningBolt::LightningBolt(Level *level, double x, double y, double z) :
+ life( 0 ),
+ seed( 0 ),
+ flashes( 0 ),
+ GlobalEntity( level )
+{
+ // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that
+ // the derived version of the function is called
+ this->defineSynchedData();
+
+ moveTo(x, y, z, 0, 0);
+ life = START_LIFE;
+ seed = random->nextLong();
+ // 4J-PB - Microsoft request due to photosensitivity issue with multiple flashes of lightning
+ //flashes = random->nextInt(3) + 1;
+ flashes = 1;
+
+ // 4J - added clientside check
+ if( !level->isClientSide )
+ {
+ if (level->difficulty >= 2 && level->hasChunksAt( Mth::floor(x), Mth::floor(y), Mth::floor(z), 10))
+ {
+ {
+ int xt = Mth::floor(x);
+ int yt = Mth::floor(y);
+ int zt = Mth::floor(z);
+ // 4J added - don't go setting tiles if we aren't tracking them for network synchronisation
+ if( MinecraftServer::getInstance()->getPlayers()->isTrackingTile(xt, yt, zt, level->dimension->id) )
+ {
+ if (level->getTile(xt, yt, zt) == 0 && Tile::fire->mayPlace(level, xt, yt, zt)) level->setTile(xt, yt, zt, Tile::fire_Id);
+ }
+ }
+
+ for (int i = 0; i < 4; i++)
+ {
+ int xt = Mth::floor(x) + random->nextInt(3) - 1;
+ int yt = Mth::floor(y) + random->nextInt(3) - 1;
+ int zt = Mth::floor(z) + random->nextInt(3) - 1;
+ // 4J added - don't go setting tiles if we aren't tracking them for network synchronisation
+ if( MinecraftServer::getInstance()->getPlayers()->isTrackingTile(xt, yt, zt, level->dimension->id) )
+ {
+ if (level->getTile(xt, yt, zt) == 0 && Tile::fire->mayPlace(level, xt, yt, zt)) level->setTile(xt, yt, zt, Tile::fire_Id);
+ }
+ }
+ }
+ }
+}
+
+void LightningBolt::tick()
+{
+ GlobalEntity::tick();
+
+ if (life == START_LIFE) {
+ // 4J-PB - this volume seems off the scale! But the volume is used to check the distance from the camera player - (volume*32) squared
+ // so we'll limit the sound in the sound engine
+ level->playSound(x, y, z, eSoundType_AMBIENT_WEATHER_THUNDER, 10000, 0.8f + random->nextFloat() * 0.2f);
+ level->playSound(x, y, z, eSoundType_RANDOM_EXPLODE, 2, 0.5f + random->nextFloat() * 0.2f);
+ }
+
+ life--;
+ if (life < 0)
+ {
+ if (flashes == 0)
+ {
+ remove();
+ }
+ else if (life < -random->nextInt(10))
+ {
+ flashes--;
+ life = 1;
+ // 4J - added clientside check
+ if( !level->isClientSide )
+ {
+ seed = random->nextLong();
+ if (level->hasChunksAt( (int) floor(x), (int) floor(y), (int) floor(z), 10))
+ {
+ int xt = (int) floor(x);
+ int yt = (int) floor(y);
+ int zt = (int) floor(z);
+
+ // 4J added - don't go setting tiles if we aren't tracking them for network synchronisation
+ if( MinecraftServer::getInstance()->getPlayers()->isTrackingTile(xt, yt, zt, level->dimension->id) )
+ {
+ if (level->getTile(xt, yt, zt) == 0 && Tile::fire->mayPlace(level, xt, yt, zt)) level->setTile(xt, yt, zt, Tile::fire_Id);
+ }
+ }
+ }
+ }
+ }
+
+ if (life >= 0)
+ {
+ double r = 3;
+ // 4J - added clientside check
+ if( !level->isClientSide )
+ {
+ vector<shared_ptr<Entity> > *entities = level->getEntities(shared_from_this(), AABB::newTemp(x - r, y - r, z - r, x + r, y + 6 + r, z + r));
+ AUTO_VAR(itEnd, entities->end());
+ for (AUTO_VAR(it, entities->begin()); it != itEnd; it++)
+ {
+ shared_ptr<Entity> e = (*it); //entities->at(i);
+ e->thunderHit(this);
+ }
+ }
+
+ level->lightningBoltTime = 2;
+ }
+}
+
+
+void LightningBolt::defineSynchedData()
+{
+}
+
+void LightningBolt::readAdditionalSaveData(CompoundTag *tag)
+{
+}
+
+void LightningBolt::addAdditonalSaveData(CompoundTag *tag)
+{
+}
+
+
+bool LightningBolt::shouldAlwaysRender()
+{
+ return true;
+}
+
+bool LightningBolt::shouldRender(Vec3 *c)
+{
+ return life >= 0;
+}