protocol for vehicles now properly handled, protocol for boat paddles now properly handled, boats can no longer spawn underwater, boats now properly float, boat metadata now properly broadcasted.
105 lines
2.0 KiB
C++
105 lines
2.0 KiB
C++
// ItemBoat.h
|
|
|
|
// Declares the various boat ItemHandlers
|
|
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
#include "../Entities/Boat.h"
|
|
#include "../LineBlockTracer.h"
|
|
|
|
|
|
|
|
|
|
|
|
class cItemBoatHandler :
|
|
public cItemHandler
|
|
{
|
|
typedef cItemHandler super;
|
|
|
|
public:
|
|
cItemBoatHandler(int a_ItemType) :
|
|
super(a_ItemType)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
virtual bool OnItemUse(
|
|
cWorld * a_World, cPlayer * a_Player, cBlockPluginInterface & a_PluginInterface, const cItem & a_Item,
|
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace
|
|
) override
|
|
{
|
|
if ((a_BlockFace != BLOCK_FACE_YM) && (a_BlockFace != BLOCK_FACE_NONE))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
class cCallbacks :
|
|
public cBlockTracer::cCallbacks
|
|
{
|
|
public:
|
|
Vector3d m_Pos;
|
|
bool m_HasFound;
|
|
|
|
cCallbacks(void) :
|
|
m_HasFound(false)
|
|
{
|
|
}
|
|
|
|
virtual bool OnNextBlock(int a_CBBlockX, int a_CBBlockY, int a_CBBlockZ, BLOCKTYPE a_CBBlockType, NIBBLETYPE a_CBBlockMeta, char a_CBEntryFace) override
|
|
{
|
|
if (a_CBBlockType != E_BLOCK_AIR)
|
|
{
|
|
m_Pos.Set(a_CBBlockX, a_CBBlockY, a_CBBlockZ);
|
|
m_HasFound = true;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
} Callbacks;
|
|
|
|
cLineBlockTracer Tracer(*a_World, 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_HasFound)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
double x = Callbacks.m_Pos.x;
|
|
double y = Callbacks.m_Pos.y;
|
|
double z = Callbacks.m_Pos.z;
|
|
|
|
// Verify that block type for spawn point is water
|
|
BLOCKTYPE SpawnBlock = a_World->GetBlock(x, y, z);
|
|
if (!IsBlockWater(SpawnBlock))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Block above must be air to spawn a boat (prevents spawning a boat underwater)
|
|
BLOCKTYPE BlockAbove = a_World->GetBlock(x, y + 1, z);
|
|
if (BlockAbove != E_BLOCK_AIR)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Spawn block at water level
|
|
cBoat * Boat = new cBoat(x + 0.5, y + 0.5, z + 0.5);
|
|
Boat->Initialize(*a_World);
|
|
|
|
return true;
|
|
}
|
|
} ;
|
|
|
|
|
|
|
|
|