#include "testserversnakebite.h"
#include <cmath>
TestServerSnakeBite::TestServerSnakeBite(
ServerFramework * f,
int x,
int y,
double angle,
TestServerSnakeBite * nextbite,
bool is_head,
Client * owner) :
ServerData(f, 15, false),
m_x(x),
m_y(y),
m_angle(angle),
m_nextbite(nextbite),
m_is_head(is_head),
m_owner(owner)
{
if(m_is_head)
{
m_x_dest = m_x + 50;
m_y_dest = m_y + 50;
}
}
TestServerSnakeBite::~TestServerSnakeBite()
{
std::cout << "Sending DestroyObject("<<getFrameworkId()<<" to all\n";
sendDestroyToAll();
}
void TestServerSnakeBite::fillUpdatePacket( ServerPacket * packet, unsigned char type ) const
{
switch(type)
{
case 10:
packet->writeInt32((int)m_x);
packet->writeInt32((int)m_y);
packet->writeDouble64(m_angle);
break;
case 20:
packet->writePtr(m_nextbite);
break;
case 30:
case 40:
break;
default:
std::cout << "damn unknown update-type:" << type << std::endl;
break;
}
}
void TestServerSnakeBite::fillCreateObjectPacket( ServerPacket * packet ) const
{
packet->writeInt32((int)m_x);
packet->writeInt32((int)m_y);
packet->writeDouble64(m_angle);
packet->writePtr(m_nextbite);
packet->writeBool8(m_is_head);
}
void TestServerSnakeBite::clientPacket( Client * client, unsigned char type, ServerPacket * packet )
{
switch(type)
{
case 10:
m_x_dest = packet->readInt32();
m_y_dest = packet->readInt32();
break;
}
}
void TestServerSnakeBite::updateMovement( )
{
if(m_nextbite)
{
double dx,dy;
dx = m_x - m_nextbite->m_x;
dy = m_y - m_nextbite->m_y;
double dist = std::sqrt(dx * dx + dy * dy);
if(dist > 5.0)
{
m_x -= dx * 0.3;
m_y -= dy * 0.3;
}
}
else
{
m_x = m_x_dest;
m_y = m_y_dest;
}
}
double TestServerSnakeBite::dist( const TestServerSnakeBite & bite ) const
{
double dx = m_x - bite.m_x;
double dy = m_y - bite.m_y;
return std::sqrt(dx * dx + dy * dy);
}