aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/PortalTile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.World/PortalTile.cpp')
-rw-r--r--Minecraft.World/PortalTile.cpp222
1 files changed, 113 insertions, 109 deletions
diff --git a/Minecraft.World/PortalTile.cpp b/Minecraft.World/PortalTile.cpp
index 1b500a36..5e891e53 100644
--- a/Minecraft.World/PortalTile.cpp
+++ b/Minecraft.World/PortalTile.cpp
@@ -26,8 +26,12 @@ void PortalTile::tick(Level *level, int x, int y, int z, Random *random)
if (y0 > 0 && !level->isSolidBlockingTile(x, y0 + 1, z))
{
// spawn a pig man here
- int result = 0;
- bool spawned = MonsterPlacerItem::spawnMobAt(level, 57, x + .5, y0 + 1.1, z + .5, &result) != NULL;
+ int iResult = 0;
+ shared_ptr<Entity> entity = SpawnEggItem::spawnMobAt(level, 57, x + .5, y0 + 1.1, z + .5, &iResult);
+ if (entity != NULL)
+ {
+ entity->changingDimensionDelay = entity->getDimensionChangingDelay();
+ }
}
}
}
@@ -39,18 +43,18 @@ AABB *PortalTile::getAABB(Level *level, int x, int y, int z)
void PortalTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr<TileEntity> forceEntity) // 4J added forceData, forceEntity param
{
- if (level->getTile(x - 1, y, z) == id || level->getTile(x + 1, y, z) == id)
+ if (level->getTile(x - 1, y, z) == id || level->getTile(x + 1, y, z) == id)
{
- float xr = 8 / 16.0f;
- float yr = 2 / 16.0f;
- this->setShape(0.5f - xr, 0, 0.5f - yr, 0.5f + xr, 1, 0.5f + yr);
- }
+ float xr = 8 / 16.0f;
+ float yr = 2 / 16.0f;
+ setShape(0.5f - xr, 0, 0.5f - yr, 0.5f + xr, 1, 0.5f + yr);
+ }
else
{
- float xr = 2 / 16.0f;
- float yr = 8 / 16.0f;
- this->setShape(0.5f - xr, 0, 0.5f - yr, 0.5f + xr, 1, 0.5f + yr);
- }
+ float xr = 2 / 16.0f;
+ float yr = 8 / 16.0f;
+ setShape(0.5f - xr, 0, 0.5f - yr, 0.5f + xr, 1, 0.5f + yr);
+ }
}
bool PortalTile::isSolidRender(bool isServerLevel)
@@ -65,124 +69,122 @@ bool PortalTile::isCubeShaped()
bool PortalTile::trySpawnPortal(Level *level, int x, int y, int z, bool actuallySpawn)
{
- int xd = 0;
- int zd = 0;
- if (level->getTile(x - 1, y, z) == Tile::obsidian_Id || level->getTile(x + 1, y, z) == Tile::obsidian_Id) xd = 1;
- if (level->getTile(x, y, z - 1) == Tile::obsidian_Id || level->getTile(x, y, z + 1) == Tile::obsidian_Id) zd = 1;
+ int xd = 0;
+ int zd = 0;
+ if (level->getTile(x - 1, y, z) == Tile::obsidian_Id || level->getTile(x + 1, y, z) == Tile::obsidian_Id) xd = 1;
+ if (level->getTile(x, y, z - 1) == Tile::obsidian_Id || level->getTile(x, y, z + 1) == Tile::obsidian_Id) zd = 1;
- if (xd == zd) return false;
+ if (xd == zd) return false;
- if (level->getTile(x - xd, y, z - zd) == 0)
+ if (level->getTile(x - xd, y, z - zd) == 0)
{
- x -= xd;
- z -= zd;
- }
+ x -= xd;
+ z -= zd;
+ }
- for (int xx = -1; xx <= 2; xx++)
+ for (int xx = -1; xx <= 2; xx++)
{
- for (int yy = -1; yy <= 3; yy++)
+ for (int yy = -1; yy <= 3; yy++)
{
- bool edge = (xx == -1) || (xx == 2) || (yy == -1) || (yy == 3);
- if ((xx == -1 || xx == 2) && (yy == -1 || yy == 3)) continue;
+ bool edge = (xx == -1) || (xx == 2) || (yy == -1) || (yy == 3);
+ if ((xx == -1 || xx == 2) && (yy == -1 || yy == 3)) continue;
- int t = level->getTile(x + xd * xx, y + yy, z + zd * xx);
+ int t = level->getTile(x + xd * xx, y + yy, z + zd * xx);
- if (edge)
+ if (edge)
{
- if (t != Tile::obsidian_Id) return false;
- }
+ if (t != Tile::obsidian_Id) return false;
+ }
else
{
- if (t != 0 && t != Tile::fire_Id) return false;
- }
- }
- }
+ if (t != 0 && t != Tile::fire_Id) return false;
+ }
+ }
+ }
if( !actuallySpawn )
return true;
- level->noNeighborUpdate = true;
- for (int xx = 0; xx < 2; xx++)
+ for (int xx = 0; xx < 2; xx++)
{
- for (int yy = 0; yy < 3; yy++)
+ for (int yy = 0; yy < 3; yy++)
{
- level->setTile(x + xd * xx, y + yy, z + zd * xx, Tile::portalTile_Id);
- }
- }
- level->noNeighborUpdate = false;
+ level->setTileAndData(x + xd * xx, y + yy, z + zd * xx, Tile::portalTile_Id, 0, Tile::UPDATE_CLIENTS);
+ }
+ }
- return true;
+ return true;
}
void PortalTile::neighborChanged(Level *level, int x, int y, int z, int type)
{
- int xd = 0;
- int zd = 1;
- if (level->getTile(x - 1, y, z) == id || level->getTile(x + 1, y, z) == id)
+ int xd = 0;
+ int zd = 1;
+ if (level->getTile(x - 1, y, z) == id || level->getTile(x + 1, y, z) == id)
{
- xd = 1;
- zd = 0;
- }
+ xd = 1;
+ zd = 0;
+ }
- int yBottom = y;
- while (level->getTile(x, yBottom - 1, z) == id)
- yBottom--;
+ int yBottom = y;
+ while (level->getTile(x, yBottom - 1, z) == id)
+ yBottom--;
- if (level->getTile(x, yBottom - 1, z) != Tile::obsidian_Id)
+ if (level->getTile(x, yBottom - 1, z) != Tile::obsidian_Id)
{
- level->setTile(x, y, z, 0);
- return;
- }
+ level->removeTile(x, y, z);
+ return;
+ }
- int height = 1;
- while (height < 4 && level->getTile(x, yBottom + height, z) == id)
- height++;
+ int height = 1;
+ while (height < 4 && level->getTile(x, yBottom + height, z) == id)
+ height++;
- if (height != 3 || level->getTile(x, yBottom + height, z) != Tile::obsidian_Id)
+ if (height != 3 || level->getTile(x, yBottom + height, z) != Tile::obsidian_Id)
{
- level->setTile(x, y, z, 0);
- return;
- }
+ level->removeTile(x, y, z);
+ return;
+ }
- bool we = level->getTile(x - 1, y, z) == id || level->getTile(x + 1, y, z) == id;
- bool ns = level->getTile(x, y, z - 1) == id || level->getTile(x, y, z + 1) == id;
- if (we && ns)
+ bool we = level->getTile(x - 1, y, z) == id || level->getTile(x + 1, y, z) == id;
+ bool ns = level->getTile(x, y, z - 1) == id || level->getTile(x, y, z + 1) == id;
+ if (we && ns)
{
- level->setTile(x, y, z, 0);
- return;
- }
-
- if (!(//
- (level->getTile(x + xd, y, z + zd) == Tile::obsidian_Id && level->getTile(x - xd, y, z - zd) == id) || //
- (level->getTile(x - xd, y, z - zd) == Tile::obsidian_Id && level->getTile(x + xd, y, z + zd) == id)//
- ))
+ level->removeTile(x, y, z);
+ return;
+ }
+
+ if (!(//
+ (level->getTile(x + xd, y, z + zd) == Tile::obsidian_Id && level->getTile(x - xd, y, z - zd) == id) || //
+ (level->getTile(x - xd, y, z - zd) == Tile::obsidian_Id && level->getTile(x + xd, y, z + zd) == id)//
+ ))
{
- level->setTile(x, y, z, 0);
- return;
- }
+ level->removeTile(x, y, z);
+ return;
+ }
}
bool PortalTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face)
{
- if (level->getTile(x, y, z) == id) return false;
+ if (level->getTile(x, y, z) == id) return false;
- bool w = level->getTile(x - 1, y, z) == id && level->getTile(x - 2, y, z) != id;
- bool e = level->getTile(x + 1, y, z) == id && level->getTile(x + 2, y, z) != id;
+ bool w = level->getTile(x - 1, y, z) == id && level->getTile(x - 2, y, z) != id;
+ bool e = level->getTile(x + 1, y, z) == id && level->getTile(x + 2, y, z) != id;
- bool n = level->getTile(x, y, z - 1) == id && level->getTile(x, y, z - 2) != id;
- bool s = level->getTile(x, y, z + 1) == id && level->getTile(x, y, z + 2) != id;
+ bool n = level->getTile(x, y, z - 1) == id && level->getTile(x, y, z - 2) != id;
+ bool s = level->getTile(x, y, z + 1) == id && level->getTile(x, y, z + 2) != id;
- bool we = w || e;
- bool ns = n || s;
+ bool we = w || e;
+ bool ns = n || s;
- if (we && face == 4) return true;
- if (we && face == 5) return true;
- if (ns && face == 2) return true;
- if (ns && face == 3) return true;
+ if (we && face == 4) return true;
+ if (we && face == 5) return true;
+ if (ns && face == 2) return true;
+ if (ns && face == 3) return true;
- return false;
+ return false;
}
int PortalTile::getResourceCount(Random *random)
@@ -197,40 +199,42 @@ int PortalTile::getRenderLayer()
void PortalTile::entityInside(Level *level, int x, int y, int z, shared_ptr<Entity> entity)
{
+ if (entity->GetType() == eTYPE_EXPERIENCEORB ) return; // 4J added
+
if (entity->riding == NULL && entity->rider.lock() == NULL) entity->handleInsidePortal();
}
void PortalTile::animateTick(Level *level, int xt, int yt, int zt, Random *random)
{
- if (random->nextInt(100) == 0)
+ if (random->nextInt(100) == 0)
{
- level->playLocalSound(xt + 0.5, yt + 0.5, zt + 0.5, eSoundType_PORTAL_PORTAL, 0.5f, random->nextFloat() * 0.4f + 0.8f);
- }
- for (int i = 0; i < 4; i++)
+ level->playLocalSound(xt + 0.5, yt + 0.5, zt + 0.5, eSoundType_PORTAL_PORTAL, 0.5f, random->nextFloat() * 0.4f + 0.8f, false);
+ }
+ for (int i = 0; i < 4; i++)
{
- double x = xt + random->nextFloat();
- double y = yt + random->nextFloat();
- double z = zt + random->nextFloat();
- double xa = 0;
- double ya = 0;
- double za = 0;
- int flip = random->nextInt(2) * 2 - 1;
- xa = (random->nextFloat() - 0.5) * 0.5;
- ya = (random->nextFloat() - 0.5) * 0.5;
- za = (random->nextFloat() - 0.5) * 0.5;
- if (level->getTile(xt - 1, yt, zt) == id || level->getTile(xt + 1, yt, zt) == id)
+ double x = xt + random->nextFloat();
+ double y = yt + random->nextFloat();
+ double z = zt + random->nextFloat();
+ double xa = 0;
+ double ya = 0;
+ double za = 0;
+ int flip = random->nextInt(2) * 2 - 1;
+ xa = (random->nextFloat() - 0.5) * 0.5;
+ ya = (random->nextFloat() - 0.5) * 0.5;
+ za = (random->nextFloat() - 0.5) * 0.5;
+ if (level->getTile(xt - 1, yt, zt) == id || level->getTile(xt + 1, yt, zt) == id)
{
- z = zt + 0.5 + (0.25) * flip;
- za = (random->nextFloat() * 2) * flip;
- }
+ z = zt + 0.5 + (0.25) * flip;
+ za = (random->nextFloat() * 2) * flip;
+ }
else
{
- x = xt + 0.5 + (0.25) * flip;
- xa = (random->nextFloat() * 2) * flip;
- }
+ x = xt + 0.5 + (0.25) * flip;
+ xa = (random->nextFloat() * 2) * flip;
+ }
- level->addParticle(eParticleType_netherportal, x, y, z, xa, ya, za);
- }
+ level->addParticle(eParticleType_netherportal, x, y, z, xa, ya, za);
+ }
}
int PortalTile::cloneTileId(Level *level, int x, int y, int z)