1
0
Fork 0
cuberite-2a/src/Items/ItemBoat.h

98 lines
2.1 KiB
C
Raw Normal View History

#pragma once
#include "../Entities/Boat.h"
2013-12-16 17:01:33 +00:00
#include "../LineBlockTracer.h"
class cItemBoatHandler final:
public cItemHandler
{
2020-04-13 16:38:06 +00:00
using Super = cItemHandler;
2016-02-05 21:45:45 +00:00
public:
2020-04-13 16:38:06 +00:00
using Super::Super;
2016-02-05 21:45:45 +00:00
virtual bool OnItemUse(
cWorld * a_World,
cPlayer * a_Player,
cBlockPluginInterface & a_PluginInterface,
const cItem & a_HeldItem,
const Vector3i a_ClickedBlockPos,
eBlockFace a_ClickedBlockFace
) const override
{
// Only allow placing blocks on top of blocks, or when not in range of dest block:
if ((a_ClickedBlockFace != BLOCK_FACE_YM) && (a_ClickedBlockFace != BLOCK_FACE_NONE))
{
return false;
}
2013-12-16 17:01:33 +00:00
// Find the actual placement position by tracing line of sight until non-air block:
class cCallbacks:
2013-12-16 17:01:33 +00:00
public cBlockTracer::cCallbacks
{
public:
2014-04-02 14:40:13 +00:00
Vector3d m_Pos;
bool m_HasFound;
2016-02-05 21:45:45 +00:00
cCallbacks():
2014-04-02 14:40:13 +00:00
m_HasFound(false)
2013-12-16 17:01:33 +00:00
{
2014-04-02 14:40:13 +00:00
}
2016-02-05 21:45:45 +00:00
virtual bool OnNextBlock(Vector3i a_CBBlockPos, BLOCKTYPE a_CBBlockType, NIBBLETYPE a_CBBlockMeta, eBlockFace a_CBEntryFace) override
2014-04-02 14:40:13 +00:00
{
if (a_CBBlockType != E_BLOCK_AIR)
2013-12-16 17:01:33 +00:00
{
m_Pos = a_CBBlockPos;
2014-04-02 14:40:13 +00:00
m_HasFound = true;
2013-12-16 17:01:33 +00:00
return true;
}
return false;
}
} Callbacks;
auto Start = a_Player->GetEyePosition() + a_Player->GetLookVector();
auto End = a_Player->GetEyePosition() + a_Player->GetLookVector() * 5;
cLineBlockTracer::Trace(*a_World, Callbacks, Start, End);
2014-04-02 14:40:13 +00:00
if (!Callbacks.m_HasFound)
2013-12-16 17:01:33 +00:00
{
return false;
}
// Block above must be air to spawn a boat (prevents spawning a boat underwater)
auto PosAbove = Callbacks.m_Pos.Floor().addedY(1);
if (!cChunkDef::IsValidHeight(PosAbove.y))
{
return false;
}
BLOCKTYPE BlockAbove = a_World->GetBlock(PosAbove);
if (BlockAbove != E_BLOCK_AIR)
{
return false;
}
// Spawn block at water level
2020-03-05 14:05:30 +00:00
if (a_World->SpawnBoat(Callbacks.m_Pos + Vector3d(0.5, 1, 0.5), cBoat::ItemToMaterial(a_Player->GetEquippedItem())) == cEntity::INVALID_ID)
{
return false;
}
// Remove boat from players hand
if (!a_Player->IsGameModeCreative())
{
a_Player->GetInventory().RemoveOneEquippedItem();
}
return true;
}
} ;