blob: d54aa8a572f039f6c27a7566c5d882da3dc7d959 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#pragma once
#include "ChunkStay.h"
class cEntity;
class cWorld;
// This is the chunk stay which finds nearby nether portals
class cNetherPortalScanner : public cChunkStay
{
public:
cNetherPortalScanner(cEntity & a_MovingEntity, cWorld & a_DestinationWorld, Vector3d a_DestPosition, int a_MaxY);
virtual void OnChunkAvailable(int a_ChunkX, int a_ChunkY) override;
virtual bool OnAllChunksAvailable(void) override;
virtual void OnDisabled(void) override;
enum class Direction
{
X,
Y
};
private:
/** Length and height, including the obsidian. */
static const int PortalLength = 4;
static const int PortalHeight = 5;
static const int SearchRadius = 128;
static const int BuildSearchRadius = 16;
/** The width of a solid base to search for when building. */
static const int SearchSolidBaseWidth = 3;
/** Where to place the player out from the face and across the face */
static const double OutOffset;
static const double AcrossOffset;
/** Builds a portal. */
void BuildNetherPortal(Vector3i a_Location, Direction a_Direction, bool a_IncludePlatform);
/** Whether the given location is a valid location to build a portal. */
bool IsValidBuildLocation(Vector3i a_BlockPosition);
/** The ID of the entity that's being moved. */
UInt32 m_EntityID;
/** The world we're moving the entity from, used to query the entity ID. */
cWorld & m_SourceWorld;
/** The world we're moving the entity to. */
cWorld & m_World;
/** Whether we found a portal during the loading of the chunks. */
bool m_FoundPortal;
/** Whether to build a platform. True if we couldn't build the portal on solid ground */
bool m_BuildPlatform;
/** The direction of the portal. */
Direction m_Dir;
/** The position of the pre-existing portal. */
Vector3i m_PortalLoc;
/** The center of the search area */
Vector3d m_Position;
/** The maximum Y to scan to */
int m_MaxY;
};
|