summaryrefslogblamecommitdiffstats
path: root/src/Blocks/BlockLilypad.h
blob: 3db280d80a82632f78946341d38fa3426ca957bb (plain) (tree)



















































































                                                                                                                                                                                    

#pragma once

#include "BlockHandler.h"
#include "../Entities/Player.h"
#include "Vector3.h"
#include "../LineBlockTracer.h"





class cBlockLilypadHandler :
	public cBlockHandler
{
	typedef cBlockHandler super;

public:
	cBlockLilypadHandler(BLOCKTYPE a_BlockType)
		: cBlockHandler(a_BlockType)
	{

	}

	virtual bool GetPlacementBlockTypeMeta(
		cChunkInterface & a_ChunkInterface, cPlayer * a_Player,
		int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace,
		int a_CursorX, int a_CursorY, int a_CursorZ,
		BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta
		) override
	{
		if (a_BlockFace > 0)
		{
			return false;
		}

		class cCallbacks :
			public cBlockTracer::cCallbacks
		{
		public:
			cCallbacks(void) :
				m_HasHitFluid(false)
			{
			}

			virtual bool OnNextBlock(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, char a_EntryFace) override
			{
				if (IsBlockWater(a_BlockType) || IsBlockLava(a_BlockType))
				{
					if ((a_BlockMeta != 0) || (a_EntryFace == BLOCK_FACE_NONE)) // The hit block should be a source. The FACE_NONE check is for AddFaceDir below
					{
						return false;
					}
					m_HasHitFluid = true;
					AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, (eBlockFace)a_EntryFace);
					m_Pos.Set(a_BlockX, a_BlockY, a_BlockZ);
					return true;
				}
				return false;
			}

			Vector3i m_Pos;
			bool m_HasHitFluid;

		} Callbacks;

		cLineBlockTracer Tracer(*a_Player->GetWorld(), Callbacks);
		Vector3d Start(a_Player->GetEyePosition() + a_Player->GetLookVector());
		Vector3d End(a_Player->GetEyePosition() + a_Player->GetLookVector() * 5);

		Tracer.Trace(Start.x, Start.y, Start.z, End.x, End.y, End.z);

		if (Callbacks.m_HasHitFluid)
		{
			a_Player->GetWorld()->SetBlock(Callbacks.m_Pos.x, Callbacks.m_Pos.y, Callbacks.m_Pos.z, E_BLOCK_LILY_PAD, 0);
		}

		return false;
	}
};