const cMapDecorator cMap::CreateDecorator(const cEntity * a_TrackedEntity) { int InsideWidth = (GetWidth() / 2) - 1; int InsideHeight = (GetHeight() / 2) - 1; // Center of pixel int PixelX = static_cast<int>(a_TrackedEntity->GetPosX() - GetCenterX()) / static_cast<int>(GetPixelWidth()); int PixelZ = static_cast<int>(a_TrackedEntity->GetPosZ() - GetCenterZ()) / static_cast<int>(GetPixelWidth()); cMapDecorator::eType Type; int Rot; if ((PixelX > -InsideWidth) && (PixelX <= InsideWidth) && (PixelZ > -InsideHeight) && (PixelZ <= InsideHeight)) { double Yaw = a_TrackedEntity->GetYaw(); if (GetDimension() == dimNether) { // TODO 2014-02-19 xdot: Refine Rot = GetRandomProvider().RandInt(15); } else { Rot = CeilC(((Yaw - 11.25) * 16) / 360); } Type = cMapDecorator::eType::E_TYPE_PLAYER; } else { if ((PixelX > 320.0) || (PixelZ > 320.0)) { ; } Rot = 0; Type = cMapDecorator::eType::E_TYPE_PLAYER_OUTSIDE; // Move to border if (PixelX <= -InsideWidth) { PixelX = -InsideWidth; } if (PixelZ <= -InsideHeight) { PixelZ = -InsideHeight; } if (PixelX > InsideWidth) { PixelX = InsideWidth; } if (PixelZ > InsideHeight) { PixelZ = InsideHeight; } } return {Type, static_cast<unsigned>(2 * PixelX + 1), static_cast<unsigned>(2 * PixelZ + 1), Rot}; }
virtual void DrawIntoChunk(cChunkDesc & a_ChunkDesc) override { int BlockStartX = a_ChunkDesc.GetChunkX() * cChunkDef::Width; int BlockStartZ = a_ChunkDesc.GetChunkZ() * cChunkDef::Width; int BlockEndX = BlockStartX + cChunkDef::Width; int BlockEndZ = BlockStartZ + cChunkDef::Width; for (sRavineDefPoints::const_iterator itr = m_DefPoints.begin(), end = m_DefPoints.end(); itr != end; ++itr) { if ( (ceilf (itr->m_X + itr->m_Radius + 2) < BlockStartX) || (floorf(itr->m_X - itr->m_Radius - 2) > BlockEndX) || (ceilf (itr->m_Z + itr->m_Radius + 2) < BlockStartZ) || (floorf(itr->m_Z - itr->m_Radius - 2) > BlockEndZ) ) { // Cannot intersect, bail out early continue; } // Carve out a cylinder around the xz point, up to (m_Radius + 2) in diameter, from Bottom to Top: // On each height level, use m_PerHeightRadius[] to modify the actual radius used // EnlargedRadiusSq is the square of the radius enlarged by the maximum m_PerHeightRadius offset - anything outside it will never be touched. float RadiusSq = (itr->m_Radius + 2) * (itr->m_Radius + 2); float DifX = BlockStartX - itr->m_X; // substitution for faster calc float DifZ = BlockStartZ - itr->m_Z; // substitution for faster calc for (int x = 0; x < cChunkDef::Width; x++) for (int z = 0; z < cChunkDef::Width; z++) { #ifdef _DEBUG // DEBUG: Make the roughravine shapepoints visible on a single layer (so that we can see with Minutor what's going on) if ((FloorC(DifX + x) == 0) && (FloorC(DifZ + z) == 0)) { a_ChunkDesc.SetBlockType(x, 4, z, E_BLOCK_LAPIS_ORE); } #endif // _DEBUG // If the column is outside the enlarged radius, bail out completely float DistSq = (DifX + x) * (DifX + x) + (DifZ + z) * (DifZ + z); if (DistSq > RadiusSq) { continue; } int Top = std::min(CeilC(itr->m_Top), +cChunkDef::Height); for (int y = std::max(FloorC(itr->m_Bottom), 1); y <= Top; y++) { if ((itr->m_Radius + m_PerHeightRadius[y]) * (itr->m_Radius + m_PerHeightRadius[y]) < DistSq) { continue; } if (cBlockInfo::CanBeTerraformed(a_ChunkDesc.GetBlockType(x, y, z))) { a_ChunkDesc.SetBlockType(x, y, z, E_BLOCK_AIR); } } // for y } // for x, z - a_BlockTypes } // for itr - m_Points[] }
/* cPath implementation */ cPath::cPath( cChunk & a_Chunk, const Vector3d & a_StartingPoint, const Vector3d & a_EndingPoint, int a_MaxSteps, double a_BoundingBoxWidth, double a_BoundingBoxHeight, int a_MaxUp, int a_MaxDown ) : m_StepsLeft(a_MaxSteps), m_CurrentPoint(0), // GetNextPoint increments this to 1, but that's fine, since the first cell is always a_StartingPoint m_Chunk(&a_Chunk), m_BadChunkFound(false) { // TODO: if src not walkable OR dest not walkable, then abort. // Borrow a new "isWalkable" from ProcessIfWalkable, make ProcessIfWalkable also call isWalkable a_BoundingBoxWidth = 1; // Until we improve physics, if ever. m_BoundingBoxWidth = CeilC(a_BoundingBoxWidth); m_BoundingBoxHeight = CeilC(a_BoundingBoxHeight); m_HalfWidth = a_BoundingBoxWidth / 2; int HalfWidthInt = FloorC(a_BoundingBoxWidth / 2); m_Source.x = FloorC(a_StartingPoint.x - HalfWidthInt); m_Source.y = FloorC(a_StartingPoint.y); m_Source.z = FloorC(a_StartingPoint.z - HalfWidthInt); m_Destination.x = FloorC(a_EndingPoint.x - HalfWidthInt); m_Destination.y = FloorC(a_EndingPoint.y); m_Destination.z = FloorC(a_EndingPoint.z - HalfWidthInt); if (GetCell(m_Source)->m_IsSolid || GetCell(m_Destination)->m_IsSolid) { m_Status = ePathFinderStatus::PATH_NOT_FOUND; return; } m_NearestPointToTarget = GetCell(m_Source); m_Status = ePathFinderStatus::CALCULATING; ProcessCell(GetCell(m_Source), nullptr, 0); }
/* cPath implementation */ cPath::cPath( cChunk & a_Chunk, const Vector3d & a_StartingPoint, const Vector3d & a_EndingPoint, int a_MaxSteps, double a_BoundingBoxWidth, double a_BoundingBoxHeight ) : m_StepsLeft(a_MaxSteps), m_IsValid(true), m_CurrentPoint(0), // GetNextPoint increments this to 1, but that's fine, since the first cell is always a_StartingPoint m_Chunk(&a_Chunk), m_BadChunkFound(false) { a_BoundingBoxWidth = 1; // Treat all mobs width as 1 until physics is improved. m_BoundingBoxWidth = CeilC(a_BoundingBoxWidth); m_BoundingBoxHeight = CeilC(a_BoundingBoxHeight); m_HalfWidth = a_BoundingBoxWidth / 2; int HalfWidthInt = FloorC(a_BoundingBoxWidth / 2); m_Source.x = FloorC(a_StartingPoint.x - HalfWidthInt); m_Source.y = FloorC(a_StartingPoint.y); m_Source.z = FloorC(a_StartingPoint.z - HalfWidthInt); m_Destination.x = FloorC(a_EndingPoint.x - HalfWidthInt); m_Destination.y = FloorC(a_EndingPoint.y); m_Destination.z = FloorC(a_EndingPoint.z - HalfWidthInt); if (!IsWalkable(m_Source, m_Source)) { m_Status = ePathFinderStatus::PATH_NOT_FOUND; return; } m_NearestPointToTarget = GetCell(m_Source); m_Status = ePathFinderStatus::CALCULATING; ProcessCell(GetCell(m_Source), nullptr, 0); }
cNetherPortalScanner::cNetherPortalScanner(cEntity * a_MovingEntity, cWorld * a_DestinationWorld, Vector3d a_DestPosition, int a_MaxY) : m_Entity(a_MovingEntity), m_World(a_DestinationWorld), m_FoundPortal(false), m_BuildPlatform(true), m_Dir(Direction::X), m_PortalLoc(a_DestPosition.Floor()), m_Position(a_DestPosition), m_MaxY(a_MaxY) { int MinX = FloorC((m_Position.x - SearchRadius) / cChunkDef::Width); int MinZ = FloorC((m_Position.z - SearchRadius) / cChunkDef::Width); int MaxX = CeilC((m_Position.x + SearchRadius) / cChunkDef::Width); int MaxZ = CeilC((m_Position.z + SearchRadius) / cChunkDef::Width); for (int x = MinX; x < MaxX; x++) { for (int z = MinZ; z < MaxZ; z++) { Add(x, z); } } Enable(*a_DestinationWorld->GetChunkMap()); }