2013-09-07 19:14:57 -04:00
|
|
|
|
2013-09-08 11:56:16 -04:00
|
|
|
// Boat.cpp
|
2013-09-07 19:14:57 -04:00
|
|
|
|
2013-09-08 11:56:16 -04:00
|
|
|
// Implements the cBoat class representing a boat in the world
|
2013-09-07 19:14:57 -04:00
|
|
|
|
|
|
|
#include "Globals.h"
|
|
|
|
#include "Boat.h"
|
|
|
|
#include "../World.h"
|
|
|
|
#include "../ClientHandle.h"
|
|
|
|
#include "Player.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cBoat::cBoat(double a_X, double a_Y, double a_Z) :
|
|
|
|
super(etBoat, a_X, a_Y, a_Z, 0.98, 0.7)
|
|
|
|
{
|
|
|
|
SetMass(20.f);
|
|
|
|
SetMaxHealth(6);
|
|
|
|
SetHealth(6);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cBoat::SpawnOn(cClientHandle & a_ClientHandle)
|
|
|
|
{
|
2013-09-09 05:13:14 -04:00
|
|
|
a_ClientHandle.SendSpawnVehicle(*this, 1);
|
2013-09-07 19:14:57 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cBoat::DoTakeDamage(TakeDamageInfo & TDI)
|
|
|
|
{
|
|
|
|
super::DoTakeDamage(TDI);
|
|
|
|
|
|
|
|
if (GetHealth() == 0)
|
|
|
|
{
|
2013-12-16 12:03:39 -05:00
|
|
|
if (TDI.Attacker != NULL)
|
|
|
|
{
|
|
|
|
if (TDI.Attacker->IsPlayer())
|
|
|
|
{
|
|
|
|
cItems Pickups;
|
|
|
|
Pickups.Add(cItem(E_ITEM_BOAT));
|
|
|
|
m_World->SpawnItemPickups(Pickups, GetPosX(), GetPosY(), GetPosZ(), 0, 0, 0, true);
|
|
|
|
}
|
|
|
|
}
|
2013-09-07 19:14:57 -04:00
|
|
|
Destroy(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cBoat::OnRightClicked(cPlayer & a_Player)
|
|
|
|
{
|
|
|
|
if (m_Attachee != NULL)
|
|
|
|
{
|
|
|
|
if (m_Attachee->GetUniqueID() == a_Player.GetUniqueID())
|
|
|
|
{
|
|
|
|
// This player is already sitting in, they want out.
|
|
|
|
a_Player.Detach();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_Attachee->IsPlayer())
|
|
|
|
{
|
|
|
|
// Another player is already sitting in here, cannot attach
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-09-09 05:13:14 -04:00
|
|
|
// Detach whatever is sitting in this boat now:
|
2013-09-07 19:14:57 -04:00
|
|
|
m_Attachee->Detach();
|
|
|
|
}
|
|
|
|
|
2013-09-09 05:13:14 -04:00
|
|
|
// Attach the player to this boat
|
2013-09-07 19:14:57 -04:00
|
|
|
a_Player.AttachTo(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-12-16 12:03:39 -05:00
|
|
|
void cBoat::Tick(float a_Dt, cChunk & a_Chunk)
|
2013-09-07 19:14:57 -04:00
|
|
|
{
|
2013-12-16 12:03:39 -05:00
|
|
|
super::Tick(a_Dt, a_Chunk);
|
2013-09-07 19:14:57 -04:00
|
|
|
BroadcastMovementUpdate();
|
2014-02-08 18:02:50 -05:00
|
|
|
SetSpeed(GetSpeed() * 0.97); // Slowly decrease the speed
|
|
|
|
|
|
|
|
if ((POSY_TOINT < 0) || (POSY_TOINT > cChunkDef::Height))
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (IsBlockWater(m_World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT)))
|
2013-12-16 12:03:39 -05:00
|
|
|
{
|
|
|
|
SetSpeedY(1);
|
|
|
|
}
|
2013-09-07 19:14:57 -04:00
|
|
|
}
|
2013-09-09 05:13:14 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-12-16 12:03:39 -05:00
|
|
|
|
|
|
|
void cBoat::HandleSpeedFromAttachee(float a_Forward, float a_Sideways)
|
|
|
|
{
|
|
|
|
if (GetSpeed().Length() > 7)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Vector3d ToAddSpeed(m_Attachee->GetLookVector() * (a_Sideways * 1.5));
|
|
|
|
ToAddSpeed.y = 0;
|
|
|
|
|
|
|
|
AddSpeed(ToAddSpeed);
|
|
|
|
}
|
|
|
|
|
|
|
|
|