2008-06-16 20:19:35 +02:00
|
|
|
/**
|
|
|
|
*-----------------------------------------------------------------------------
|
|
|
|
* FILE : NetMessage.cpp
|
|
|
|
* PROJECT : 0 A.D.
|
|
|
|
* DESCRIPTION :
|
|
|
|
*-----------------------------------------------------------------------------
|
|
|
|
*/
|
2003-11-25 03:11:50 +01:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
// INCLUDES
|
|
|
|
#include "precompiled.h"
|
2006-06-02 04:10:27 +02:00
|
|
|
#include "simulation/Entity.h"
|
2006-06-02 05:56:24 +02:00
|
|
|
#include "ps/Vector2D.h"
|
2003-11-25 03:11:50 +01:00
|
|
|
#define ALLNETMSGS_IMPLEMENT
|
|
|
|
#include "NetMessage.h"
|
2006-06-02 04:10:27 +02:00
|
|
|
#include "ps/CLogger.h"
|
2008-06-16 20:19:35 +02:00
|
|
|
#include "Network.h"
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <map>
|
2004-08-16 17:19:17 +02:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
// DEFINES
|
2003-11-25 03:11:50 +01:00
|
|
|
|
2006-11-12 05:02:36 +01:00
|
|
|
// Please don't modify the deserializer map outside the ONCE-block in DeserializeMessage
|
2008-06-16 20:19:35 +02:00
|
|
|
//typedef std::map< NetMessageType, NetMessageDeserializer > MessageDeserializerMap;
|
|
|
|
//MessageDeserializerMap g_DeserializerMap;
|
2003-11-25 03:11:50 +01:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: CNetMessage()
|
|
|
|
// Desc: Constructor
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
CNetMessage::CNetMessage( void )
|
2004-09-21 16:40:43 +02:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
m_Type = NMT_INVALID;
|
|
|
|
m_Dirty = false;
|
2004-09-21 16:40:43 +02:00
|
|
|
}
|
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: CNetMessage()
|
|
|
|
// Desc: Constructor
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
CNetMessage::CNetMessage( NetMessageType type )
|
2003-11-25 03:11:50 +01:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
m_Type = type;
|
|
|
|
m_Dirty = false;
|
2003-11-25 03:11:50 +01:00
|
|
|
}
|
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: ~CNetMessage()
|
|
|
|
// Desc: Destructor
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
CNetMessage::~CNetMessage( void )
|
2004-09-21 16:40:43 +02:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
m_Dirty = false;
|
2004-09-21 16:40:43 +02:00
|
|
|
}
|
2004-03-08 03:04:34 +01:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: Serialize()
|
|
|
|
// Desc: Serializes the message into the buffer parameter
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
u8* CNetMessage::Serialize( u8* pBuffer ) const
|
2005-08-09 17:55:44 +02:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
// Validate parameters
|
|
|
|
if ( !pBuffer ) return NULL;
|
|
|
|
|
|
|
|
// Serialize_int_1( pBuffer, m_Type );
|
|
|
|
// Serialize_int_2( pBuffer, m_SerializeSize );
|
|
|
|
|
|
|
|
// Serialize message type and its size
|
|
|
|
*( ( NetMessageType* )pBuffer ) = m_Type;
|
|
|
|
*( ( uint* )( pBuffer + sizeof( NetMessageType ) ) ) = GetSerializedLength();
|
|
|
|
|
|
|
|
return pBuffer + sizeof( NetMessageType ) + sizeof( uint );
|
2005-08-09 17:55:44 +02:00
|
|
|
}
|
2004-03-08 03:04:34 +01:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: Deserialize()
|
|
|
|
// Desc: Loads this message from the specifie buffer parameter
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
const u8* CNetMessage::Deserialize( const u8* pStart, const u8* pEnd )
|
2004-08-16 17:19:17 +02:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
// Validate parameters
|
|
|
|
if ( !pStart || !pEnd ) return NULL;
|
|
|
|
|
|
|
|
// Deserialize message type and its size
|
|
|
|
|
|
|
|
// Deserialize_int_1( pStart, m_Type );
|
|
|
|
// Deserialize_int_2( pStart, m_SerializeSize );
|
|
|
|
|
|
|
|
m_Type = *( ( NetMessageType* )pStart );
|
|
|
|
uint size = *( ( uint* )( pStart + sizeof( NetMessageType ) ) );
|
|
|
|
|
|
|
|
assert( pStart + size == pEnd );
|
|
|
|
|
|
|
|
return pStart + sizeof( NetMessageType ) + sizeof( size );
|
2004-08-16 17:19:17 +02:00
|
|
|
}
|
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: Deserialize()
|
|
|
|
// Desc: Constructs a CNetMessage object from the specified buffer parameter
|
|
|
|
// Note: It uses the registered desrializers to create the CNetMessage object
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
/*CNetMessage* CNetMessage::Deserialize(
|
|
|
|
NetMessageType type,
|
|
|
|
const u8* pBuffer,
|
|
|
|
uint bufferSize )
|
2003-11-25 03:11:50 +01:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
ONCE
|
|
|
|
(
|
|
|
|
SNetMessageDeserializer* pDeserializer = &g_DeserializerRegistrations[ 0 ];
|
|
|
|
for ( ; pDeserializer->Deserializer; pDeserializer++ )
|
2003-11-25 03:11:50 +01:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
g_DeserializerMap.insert( std::make_pair(
|
|
|
|
pDeserializer->Type,
|
|
|
|
pDeserializer->Deserializer ) );
|
2003-11-25 03:11:50 +01:00
|
|
|
}
|
2004-05-06 19:14:30 +02:00
|
|
|
);
|
2003-11-25 03:11:50 +01:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
MessageDeserializerMap::const_iterator it = g_DeserializerMap.find( type );
|
|
|
|
if ( it == g_DeserializerMap.end() )
|
2004-08-16 17:19:17 +02:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
LOG(WARNING, LOG_CAT_NET, "Unknown message received on socket: type 0x%04x, length %u", type, length);
|
|
|
|
|
2003-11-25 03:11:50 +01:00
|
|
|
return NULL;
|
2004-08-16 17:19:17 +02:00
|
|
|
}
|
2008-06-16 20:19:35 +02:00
|
|
|
|
|
|
|
pfnNetMessageDeserializer pDeserializer = it->second;
|
|
|
|
if ( pDeserializer )
|
|
|
|
{
|
|
|
|
// Call deserializer
|
|
|
|
return ( pDeserializer )( pBuffer, bufferSize );
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}*/
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: GetSerializedLength()
|
|
|
|
// Desc: Returns the size of the serialized message
|
|
|
|
//-----------------------------------------------------------------------------
|
2008-06-26 09:25:50 +02:00
|
|
|
size_t CNetMessage::GetSerializedLength( void ) const
|
2008-06-16 20:19:35 +02:00
|
|
|
{
|
|
|
|
// By default, return header size
|
|
|
|
return ( sizeof( m_Type ) + sizeof( uint ) );
|
2003-11-25 03:11:50 +01:00
|
|
|
}
|
2004-03-08 03:04:34 +01:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: operator ( ENetPacket* )()
|
|
|
|
// Desc: Cast to an ENetPacket structure
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
/*void CNetMessage::operator ENetPacket*( void )
|
|
|
|
{
|
|
|
|
// Did we already serialized the message?
|
|
|
|
if ( m_Packet )
|
|
|
|
{
|
|
|
|
// Dirty message?
|
|
|
|
if ( m_Dirty )
|
|
|
|
{
|
|
|
|
// Make room for the new message content
|
|
|
|
enet_packet_resize( m_Packet, GetSerializedLength() );
|
|
|
|
|
|
|
|
// Serialize into buffer
|
|
|
|
Serialize( m_Packet->data );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Serialize message into temporary buffer
|
|
|
|
u8* pBuffer = new u8[ GetSerializedLength() ];
|
|
|
|
if ( !pBuffer ) return NULL;
|
|
|
|
|
|
|
|
Serialize( pBuffer );
|
|
|
|
|
|
|
|
// Create ENet packet for this message
|
|
|
|
m_Packet = enet_packet_create( pBuffer, GetSerializedLength(), ENET_PACKET_FLAG_RELIABLE );
|
|
|
|
|
|
|
|
delete [] pBuffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
return m_Packet;
|
|
|
|
}*/
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: ToString()
|
|
|
|
// Desc: Returns a string representation for the message
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
CStr CNetMessage::ToString( void ) const
|
|
|
|
{
|
|
|
|
CStr ret;
|
|
|
|
|
|
|
|
// Not defined yet?
|
|
|
|
if ( GetType() == NMT_INVALID )
|
|
|
|
{
|
|
|
|
ret = "MESSAGE_TYPE_NONE { Undefined Message }";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ret = " Unknown Message " + CStr( GetType() );
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: ScriptingInit()
|
|
|
|
// Desc:
|
|
|
|
//-----------------------------------------------------------------------------
|
2005-05-18 07:32:09 +02:00
|
|
|
void CNetMessage::ScriptingInit()
|
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
g_ScriptingHost.DefineConstant( "NMT_GOTO", NMT_GOTO );
|
|
|
|
g_ScriptingHost.DefineConstant( "NMT_RUN", NMT_RUN );
|
|
|
|
g_ScriptingHost.DefineConstant( "NMT_PATROL", NMT_PATROL );
|
|
|
|
g_ScriptingHost.DefineConstant( "NMT_ADD_WAYPOINT", NMT_ADD_WAYPOINT );
|
|
|
|
g_ScriptingHost.DefineConstant( "NMT_GENERIC", NMT_GENERIC );
|
|
|
|
g_ScriptingHost.DefineConstant( "NMT_PRODUCE", NMT_PRODUCE );
|
|
|
|
g_ScriptingHost.DefineConstant( "NMT_PLACE_OBJECT", NMT_PLACE_OBJECT );
|
2008-07-13 19:37:45 +02:00
|
|
|
g_ScriptingHost.DefineConstant( "NMT_SET_RALLY_POINT", NMT_SET_RALLY_POINT );
|
2008-06-16 20:19:35 +02:00
|
|
|
g_ScriptingHost.DefineConstant( "NMT_NOTIFY_REQUEST", NMT_NOTIFY_REQUEST );
|
|
|
|
g_ScriptingHost.DefineConstant( "NMT_FORMATION_GOTO", NMT_FORMATION_GOTO );
|
|
|
|
g_ScriptingHost.DefineConstant( "NMT_FORMATION_GENERIC", NMT_FORMATION_GENERIC );
|
2005-05-18 07:32:09 +02:00
|
|
|
}
|
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: CommandFromJSArgs()
|
|
|
|
// Desc:
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
CNetMessage* CNetMessage::CommandFromJSArgs(
|
|
|
|
const CEntityList &entities,
|
|
|
|
JSContext* pContext,
|
|
|
|
uintN argc,
|
|
|
|
jsval* argv,
|
|
|
|
bool isQueued )
|
2005-05-18 07:32:09 +02:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
uint idx = 0;
|
|
|
|
uint messageType;
|
2005-05-18 07:32:09 +02:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
// Validate parameters
|
|
|
|
if ( argv == 0 ) return NULL;
|
2005-05-18 07:32:09 +02:00
|
|
|
|
|
|
|
try
|
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
messageType = ToPrimitive< uint >( argv[ idx++ ] );
|
2005-05-18 07:32:09 +02:00
|
|
|
}
|
2008-06-16 20:19:35 +02:00
|
|
|
catch ( PSERROR_Scripting_ConversionFailed )
|
2005-05-18 07:32:09 +02:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
JS_ReportError( pContext, "Invalid order type" );
|
2005-05-18 07:32:09 +02:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
switch ( messageType )
|
|
|
|
{
|
|
|
|
case NMT_GOTO:
|
|
|
|
{
|
|
|
|
CGotoMessage* pMessage = new CGotoMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = isQueued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if ( idx + 2 > argc )
|
|
|
|
{
|
2008-07-13 08:24:50 +02:00
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
2008-06-16 20:19:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) ||
|
|
|
|
!JSVAL_IS_INT( argv[ idx + 1 ] ) )
|
|
|
|
{
|
2008-07-13 08:24:50 +02:00
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
2008-06-16 20:19:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_TargetX = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
pMessage->m_TargetY = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
}
|
|
|
|
catch ( PSERROR_Scripting_ConversionFailed )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Invalid location" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return pMessage;
|
2005-05-18 07:32:09 +02:00
|
|
|
}
|
2008-06-16 20:19:35 +02:00
|
|
|
|
|
|
|
case NMT_RUN:
|
|
|
|
{
|
|
|
|
CRunMessage* pMessage = new CRunMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = isQueued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if ( idx + 2 > argc )
|
|
|
|
{
|
2008-07-13 08:24:50 +02:00
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
2008-06-16 20:19:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) ||
|
|
|
|
!JSVAL_IS_INT( argv[ idx + 1 ] ) )
|
|
|
|
{
|
2008-07-13 08:24:50 +02:00
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
2008-06-16 20:19:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_TargetX = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
pMessage->m_TargetY = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
}
|
|
|
|
catch ( PSERROR_Scripting_ConversionFailed )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Invalid location" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return pMessage;
|
2005-05-18 07:32:09 +02:00
|
|
|
}
|
2008-06-16 20:19:35 +02:00
|
|
|
|
|
|
|
case NMT_PATROL:
|
|
|
|
{
|
|
|
|
CPatrolMessage* pMessage = new CPatrolMessage;
|
|
|
|
if ( pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = isQueued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if ( idx + 2 > argc )
|
|
|
|
{
|
2008-07-13 08:24:50 +02:00
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
2008-06-16 20:19:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) ||
|
|
|
|
!JSVAL_IS_INT( argv[ idx + 1 ] ) )
|
|
|
|
{
|
2008-07-13 08:24:50 +02:00
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
2008-06-16 20:19:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_TargetX = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
pMessage->m_TargetY = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
}
|
|
|
|
catch ( PSERROR_Scripting_ConversionFailed )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Invalid location" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return pMessage;
|
2005-05-18 07:32:09 +02:00
|
|
|
}
|
2005-12-29 09:42:44 +01:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
case NMT_ADD_WAYPOINT:
|
|
|
|
{
|
|
|
|
CAddWaypointMessage* pMessage = new CAddWaypointMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = isQueued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if ( idx + 2 > argc )
|
|
|
|
{
|
2008-07-13 08:24:50 +02:00
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
2008-06-16 20:19:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) ||
|
|
|
|
!JSVAL_IS_INT( argv[ idx + 1 ] ) )
|
|
|
|
{
|
2008-07-13 08:24:50 +02:00
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
2008-06-16 20:19:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_TargetX = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
pMessage->m_TargetY = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
}
|
|
|
|
catch ( PSERROR_Scripting_ConversionFailed )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Invalid location" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return pMessage;
|
2005-12-29 09:42:44 +01:00
|
|
|
}
|
2008-06-16 20:19:35 +02:00
|
|
|
|
2008-07-13 19:37:45 +02:00
|
|
|
case NMT_SET_RALLY_POINT:
|
|
|
|
{
|
|
|
|
CSetRallyPointMessage* pMessage = new CSetRallyPointMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = isQueued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if ( idx + 2 > argc )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) ||
|
|
|
|
!JSVAL_IS_INT( argv[ idx + 1 ] ) )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_TargetX = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
pMessage->m_TargetY = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
}
|
|
|
|
catch ( PSERROR_Scripting_ConversionFailed )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Invalid location" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return pMessage;
|
|
|
|
}
|
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
case NMT_FORMATION_GOTO:
|
|
|
|
{
|
|
|
|
CFormationGotoMessage* pMessage = new CFormationGotoMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
2005-05-18 07:32:09 +02:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
pMessage->m_IsQueued = isQueued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if ( idx + 2 > argc )
|
|
|
|
{
|
2008-07-13 08:24:50 +02:00
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
2008-06-16 20:19:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) ||
|
|
|
|
!JSVAL_IS_INT( argv[ idx + 1 ] ) )
|
|
|
|
{
|
2008-07-13 08:24:50 +02:00
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
2008-06-16 20:19:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_TargetX = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
pMessage->m_TargetY = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
}
|
|
|
|
catch ( PSERROR_Scripting_ConversionFailed )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Invalid location" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return pMessage;
|
2006-02-22 23:45:16 +01:00
|
|
|
}
|
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
case NMT_GENERIC:
|
|
|
|
{
|
|
|
|
CGenericMessage* pMessage = new CGenericMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = isQueued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
2008-07-13 08:24:50 +02:00
|
|
|
if ( idx + 3 > argc )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_OBJECT( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
CEntity* pEntity = ToNative< CEntity >( argv[ idx++ ] );
|
|
|
|
if ( !pEntity )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Invalid entity parameter" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Target = pEntity->me;
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Action = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_BOOLEAN( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Run = ToPrimitive< bool >( argv[ idx++ ] );
|
2008-06-16 20:19:35 +02:00
|
|
|
|
|
|
|
return pMessage;
|
2006-05-04 09:40:31 +02:00
|
|
|
}
|
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
case NMT_NOTIFY_REQUEST:
|
|
|
|
{
|
|
|
|
CNotifyRequestMessage* pMessage = new CNotifyRequestMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = isQueued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
2008-07-13 08:24:50 +02:00
|
|
|
if ( idx + 1 > argc )
|
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
|
2008-07-13 08:24:50 +02:00
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
2008-06-16 20:19:35 +02:00
|
|
|
|
2008-07-13 08:24:50 +02:00
|
|
|
if ( !JSVAL_IS_OBJECT( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
CEntity* pEntity = ToNative< CEntity >( argv[ idx++ ] );
|
|
|
|
if ( !pEntity )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Invalid entity parameter" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Target = pEntity->me;
|
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
return pMessage;
|
|
|
|
}
|
|
|
|
|
|
|
|
case NMT_FORMATION_GENERIC:
|
|
|
|
{
|
|
|
|
CFormationGenericMessage* pMessage = new CFormationGenericMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = isQueued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
2008-07-13 08:24:50 +02:00
|
|
|
if ( idx + 1 > argc )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );\
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_OBJECT( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
CEntity* pEntity = ToNative< CEntity >( argv[ idx++ ] );
|
|
|
|
if ( !pEntity )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Invalid entity parameter" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Target = pEntity->me;
|
2008-06-16 20:19:35 +02:00
|
|
|
|
|
|
|
return pMessage;
|
|
|
|
}
|
|
|
|
|
|
|
|
case NMT_PRODUCE:
|
|
|
|
{
|
|
|
|
CProduceMessage* pMessage = new CProduceMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = isQueued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
2008-07-13 08:24:50 +02:00
|
|
|
if ( idx + 1 > argc )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Type = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
|
|
|
|
if ( idx + 1 > argc )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_STRING( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Name = ToPrimitive< CStrW >( argv[ idx++ ] );
|
2008-06-16 20:19:35 +02:00
|
|
|
|
|
|
|
return pMessage;
|
|
|
|
}
|
|
|
|
|
|
|
|
case NMT_PLACE_OBJECT:
|
|
|
|
{
|
|
|
|
CPlaceObjectMessage* pMessage = new CPlaceObjectMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = isQueued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
2008-07-13 08:24:50 +02:00
|
|
|
if ( idx + 1 > argc )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_STRING( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Template = ToPrimitive< CStrW >( argv[ idx++ ] );
|
|
|
|
|
|
|
|
if ( idx + 1 > argc )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_X = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
|
|
|
|
if ( idx + 1 > argc )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Y = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
|
|
|
|
if ( idx + 1 > argc )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Z = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
|
|
|
|
if ( idx + 1 > argc )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Angle = ToPrimitive< int >( argv[ idx++ ] );
|
2008-06-16 20:19:35 +02:00
|
|
|
|
|
|
|
return pMessage;
|
|
|
|
}
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
JS_ReportError( pContext, "Invalid order type" );
|
|
|
|
break;
|
2005-05-18 07:32:09 +02:00
|
|
|
}
|
2008-06-16 20:19:35 +02:00
|
|
|
|
|
|
|
return NULL;
|
2005-05-18 07:32:09 +02:00
|
|
|
}
|
2006-03-31 05:30:34 +02:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: CreatePositionMessage()
|
|
|
|
// Desc:
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
CNetMessage* CNetMessage::CreatePositionMessage(
|
|
|
|
const CEntityList& entities,
|
|
|
|
const int type,
|
|
|
|
CVector2D pos )
|
2006-03-31 05:30:34 +02:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
switch ( type )
|
2006-03-31 05:30:34 +02:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
case NMT_GOTO:
|
|
|
|
{
|
|
|
|
CGotoMessage *pMessage = new CGotoMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
pMessage->m_TargetX = pos.x;
|
|
|
|
pMessage->m_TargetY = pos.y;
|
|
|
|
|
|
|
|
return pMessage;
|
|
|
|
}
|
|
|
|
|
|
|
|
case NMT_RUN:
|
|
|
|
{
|
|
|
|
CRunMessage *pMessage = new CRunMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
pMessage->m_TargetX = pos.x;
|
|
|
|
pMessage->m_TargetY = pos.y;
|
|
|
|
|
|
|
|
return pMessage;
|
|
|
|
}
|
|
|
|
|
|
|
|
case NMT_PATROL:
|
|
|
|
{
|
|
|
|
CPatrolMessage *pMessage = new CPatrolMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
pMessage->m_TargetX = pos.x;
|
|
|
|
pMessage->m_TargetY = pos.y;
|
|
|
|
|
|
|
|
return pMessage;
|
|
|
|
}
|
|
|
|
|
|
|
|
case NMT_ADD_WAYPOINT:
|
|
|
|
{
|
|
|
|
CAddWaypointMessage *pMessage = new CAddWaypointMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
pMessage->m_TargetX = pos.x;
|
|
|
|
pMessage->m_TargetY = pos.y;
|
|
|
|
|
|
|
|
return pMessage;
|
|
|
|
}
|
|
|
|
|
2008-07-13 19:37:45 +02:00
|
|
|
case NMT_SET_RALLY_POINT:
|
|
|
|
{
|
|
|
|
CSetRallyPointMessage *pMessage = new CSetRallyPointMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
pMessage->m_TargetX = pos.x;
|
|
|
|
pMessage->m_TargetY = pos.y;
|
|
|
|
|
|
|
|
return pMessage;
|
|
|
|
}
|
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
case NMT_FORMATION_GOTO:
|
|
|
|
{
|
|
|
|
CFormationGotoMessage *pMessage = new CFormationGotoMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
pMessage->m_TargetX = pos.x;
|
|
|
|
pMessage->m_TargetY = pos.y;
|
|
|
|
|
|
|
|
return pMessage;
|
|
|
|
}
|
2006-03-31 05:30:34 +02:00
|
|
|
}
|
2008-06-16 20:19:35 +02:00
|
|
|
|
|
|
|
return NULL;
|
2006-03-31 05:30:34 +02:00
|
|
|
}
|
2008-06-16 20:19:35 +02:00
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: CreateEntityIntMessage()
|
|
|
|
// Desc:
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
CNetMessage* CNetMessage::CreateEntityIntMessage(
|
|
|
|
const CEntityList& entities,
|
|
|
|
const int type,
|
|
|
|
HEntity& target,
|
|
|
|
int action )
|
2006-03-31 05:30:34 +02:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
switch ( type )
|
|
|
|
{
|
|
|
|
case NMT_GENERIC:
|
|
|
|
{
|
|
|
|
CGenericMessage *pMessage = new CGenericMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
pMessage->m_Target = target;
|
|
|
|
pMessage->m_Action = action;
|
2008-07-13 19:37:45 +02:00
|
|
|
pMessage->m_Run = false;
|
2008-06-16 20:19:35 +02:00
|
|
|
|
|
|
|
return pMessage;
|
2006-03-31 05:30:34 +02:00
|
|
|
}
|
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
case NMT_NOTIFY_REQUEST:
|
|
|
|
{
|
|
|
|
CNotifyRequestMessage *pMessage = new CNotifyRequestMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
2006-03-31 05:30:34 +02:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
pMessage->m_Target = target;
|
|
|
|
pMessage->m_Action = action;
|
|
|
|
|
|
|
|
return pMessage;
|
|
|
|
}
|
|
|
|
|
|
|
|
case NMT_FORMATION_GENERIC:
|
|
|
|
{
|
|
|
|
CFormationGenericMessage *pMessage = new CFormationGenericMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
pMessage->m_Target = target;
|
|
|
|
pMessage->m_Action = action;
|
|
|
|
|
|
|
|
return pMessage;
|
|
|
|
}
|
2006-03-31 05:30:34 +02:00
|
|
|
}
|
2008-06-16 20:19:35 +02:00
|
|
|
|
|
|
|
return NULL;
|
2006-03-31 05:30:34 +02:00
|
|
|
}
|
2008-06-16 20:19:35 +02:00
|
|
|
CNetMessage* CNetMessage::CreateProduceMessage( const CEntityList& entities, const int type, int proType, const CStrW& name )
|
2006-03-31 05:30:34 +02:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
switch ( type )
|
|
|
|
{
|
|
|
|
case NMT_PRODUCE:
|
|
|
|
{
|
|
|
|
CProduceMessage* pMessage = new CProduceMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
pMessage->m_Type = proType;
|
|
|
|
pMessage->m_Name = name;
|
|
|
|
|
|
|
|
return pMessage;
|
2006-03-31 05:30:34 +02:00
|
|
|
}
|
2008-06-16 20:19:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
2006-03-31 05:30:34 +02:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: CreateMessage()
|
|
|
|
// Desc: Creates the appropriate message based on the given data
|
|
|
|
//-----------------------------------------------------------------------------
|
2008-06-26 09:25:50 +02:00
|
|
|
CNetMessage* CNetMessageFactory::CreateMessage(const void* pData,
|
|
|
|
size_t dataSize )
|
2008-06-16 20:19:35 +02:00
|
|
|
{
|
|
|
|
CNetMessage* pNewMessage = NULL;
|
|
|
|
CNetMessage header;
|
|
|
|
|
|
|
|
// Validate parameters
|
|
|
|
if ( !pData ) return NULL;
|
|
|
|
|
|
|
|
// Figure out message type
|
|
|
|
header.Deserialize( ( const u8* )pData, ( const u8* )pData + dataSize );
|
|
|
|
|
|
|
|
switch ( header.GetType() )
|
2006-03-31 05:30:34 +02:00
|
|
|
{
|
2008-06-16 20:19:35 +02:00
|
|
|
case NMT_GAME_SETUP:
|
|
|
|
pNewMessage = new CGameSetupMessage;
|
|
|
|
break;
|
2006-03-31 05:30:34 +02:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
case NMT_ASSIGN_PLAYER_SLOT:
|
|
|
|
pNewMessage = new CAssignPlayerSlotMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_PLAYER_CONFIG:
|
|
|
|
pNewMessage = new CPlayerConfigMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_PLAYER_JOIN:
|
|
|
|
pNewMessage = new CPlayerJoinMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_SERVER_HANDSHAKE:
|
|
|
|
pNewMessage = new CSrvHandshakeMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_SERVER_HANDSHAKE_RESPONSE:
|
|
|
|
pNewMessage = new CSrvHandshakeResponseMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_CONNECT_COMPLETE:
|
|
|
|
pNewMessage = new CConnectCompleteMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_ERROR:
|
|
|
|
pNewMessage = new CErrorMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_CLIENT_HANDSHAKE:
|
|
|
|
pNewMessage = new CCliHandshakeMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_AUTHENTICATE:
|
|
|
|
pNewMessage = new CAuthenticateMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_AUTHENTICATE_RESULT:
|
|
|
|
pNewMessage = new CAuthenticateResultMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_GAME_START:
|
|
|
|
pNewMessage = new CGameStartMessage;
|
|
|
|
break;
|
2008-07-03 08:29:22 +02:00
|
|
|
|
|
|
|
case NMT_END_COMMAND_BATCH:
|
|
|
|
pNewMessage = new CEndCommandBatchMessage;
|
|
|
|
break;
|
2008-07-12 21:08:38 +02:00
|
|
|
|
|
|
|
case NMT_CHAT:
|
|
|
|
pNewMessage = new CChatMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_GOTO:
|
|
|
|
pNewMessage = new CGotoMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_PATROL:
|
|
|
|
pNewMessage = new CPatrolMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_ADD_WAYPOINT:
|
|
|
|
pNewMessage = new CAddWaypointMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_GENERIC:
|
|
|
|
pNewMessage = new CGenericMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_PRODUCE:
|
|
|
|
pNewMessage = new CProduceMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_PLACE_OBJECT:
|
|
|
|
pNewMessage = new CPlaceObjectMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_RUN:
|
|
|
|
pNewMessage = new CRunMessage;
|
|
|
|
break;
|
|
|
|
|
2008-07-13 19:37:45 +02:00
|
|
|
case NMT_SET_RALLY_POINT:
|
|
|
|
pNewMessage = new CSetRallyPointMessage;
|
|
|
|
break;
|
|
|
|
|
2008-07-12 21:08:38 +02:00
|
|
|
case NMT_NOTIFY_REQUEST:
|
|
|
|
pNewMessage = new CNotifyRequestMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_FORMATION_GOTO:
|
|
|
|
pNewMessage = new CFormationGotoMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_FORMATION_GENERIC:
|
|
|
|
pNewMessage = new CFormationGenericMessage;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
LOG(CLogger::Error, LOG_CAT_NET, "CNetMessageFactory::CreateMessage(): Unknown message received" );
|
|
|
|
break;
|
2006-03-31 05:30:34 +02:00
|
|
|
}
|
2008-06-16 20:19:35 +02:00
|
|
|
|
|
|
|
if ( pNewMessage )
|
|
|
|
pNewMessage->Deserialize( ( const u8* )pData, ( const u8* )pData + dataSize );
|
|
|
|
|
|
|
|
return pNewMessage;
|
2006-03-31 05:30:34 +02:00
|
|
|
}
|
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Name: CreateMessage()
|
|
|
|
// Desc: Creates a message from the specified JavaScript arguments
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
CNetMessage* CNetMessageFactory::CreateMessage(
|
|
|
|
const CEntityList &entities,
|
|
|
|
JSContext *pContext,
|
|
|
|
uintN argc,
|
|
|
|
jsval *argv,
|
|
|
|
bool queued )
|
|
|
|
{
|
|
|
|
CNetMessage* pNewMessage = NULL;
|
|
|
|
uint idx = 0;
|
|
|
|
uint msgType;
|
|
|
|
|
|
|
|
// Validate parameters
|
|
|
|
if ( argv == 0 ) return NULL;
|
2006-03-31 05:30:34 +02:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
try
|
|
|
|
{
|
|
|
|
msgType = ToPrimitive< uint >( argv[ idx++ ] );
|
|
|
|
}
|
|
|
|
catch ( PSERROR_Scripting_ConversionFailed )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Invalid order type" );
|
|
|
|
return NULL;
|
|
|
|
}
|
2006-10-20 03:06:43 +02:00
|
|
|
|
2008-06-16 20:19:35 +02:00
|
|
|
switch ( msgType )
|
|
|
|
{
|
|
|
|
case NMT_GOTO:
|
|
|
|
{
|
|
|
|
CGotoMessage *pMessage = new CGotoMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = queued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if ( idx + 2 > argc )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) ||
|
|
|
|
!JSVAL_IS_INT( argv[ idx + 1 ] ) )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_TargetX = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
pMessage->m_TargetY = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
}
|
|
|
|
catch ( PSERROR_Scripting_ConversionFailed )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Invalid location" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pNewMessage = pMessage;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_RUN:
|
|
|
|
{
|
|
|
|
CRunMessage *pMessage = new CRunMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = queued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if ( idx + 2 > argc )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) ||
|
|
|
|
!JSVAL_IS_INT( argv[ idx + 1 ] ) )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_TargetX = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
pMessage->m_TargetY = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
}
|
|
|
|
catch ( PSERROR_Scripting_ConversionFailed )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Invalid location" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pNewMessage = pMessage;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_PATROL:
|
|
|
|
{
|
|
|
|
CPatrolMessage *pMessage = new CPatrolMessage;
|
|
|
|
if ( pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = queued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if ( idx + 2 > argc )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) ||
|
|
|
|
!JSVAL_IS_INT( argv[ idx + 1 ] ) )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_TargetX = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
pMessage->m_TargetY = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
}
|
|
|
|
catch ( PSERROR_Scripting_ConversionFailed )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Invalid location" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pNewMessage = pMessage;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_ADD_WAYPOINT:
|
|
|
|
{
|
|
|
|
CAddWaypointMessage *pMessage = new CAddWaypointMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = queued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if ( idx + 2 > argc )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) ||
|
2008-07-13 19:37:45 +02:00
|
|
|
!JSVAL_IS_INT( argv[ idx + 1 ] ) )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_TargetX = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
pMessage->m_TargetY = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
}
|
|
|
|
catch ( PSERROR_Scripting_ConversionFailed )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Invalid location" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pNewMessage = pMessage;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_SET_RALLY_POINT:
|
|
|
|
{
|
|
|
|
CSetRallyPointMessage *pMessage = new CSetRallyPointMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = queued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if ( idx + 2 > argc )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) ||
|
2008-06-16 20:19:35 +02:00
|
|
|
!JSVAL_IS_INT( argv[ idx + 1 ] ) )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_TargetX = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
pMessage->m_TargetY = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
}
|
|
|
|
catch ( PSERROR_Scripting_ConversionFailed )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Invalid location" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pNewMessage = pMessage;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_FORMATION_GOTO:
|
|
|
|
{
|
|
|
|
CFormationGotoMessage *pMessage = new CFormationGotoMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = queued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if ( idx + 2 > argc )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) ||
|
|
|
|
!JSVAL_IS_INT( argv[ idx + 1 ] ) )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_TargetX = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
pMessage->m_TargetY = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
}
|
|
|
|
catch ( PSERROR_Scripting_ConversionFailed )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Invalid location" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pNewMessage = pMessage;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_GENERIC:
|
|
|
|
{
|
|
|
|
CGenericMessage* pMessage = new CGenericMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = queued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
|
|
|
if ( idx + 1 > argc )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_OBJECT( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
CEntity* pEntity = ToNative< CEntity >( argv[ idx++ ] );
|
|
|
|
if ( !pEntity )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Invalid entity parameter" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Target = pEntity->me;
|
|
|
|
|
|
|
|
pNewMessage = pMessage;
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Action = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case NMT_NOTIFY_REQUEST:
|
|
|
|
{
|
|
|
|
CNotifyRequestMessage* pMessage = new CNotifyRequestMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = queued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
|
|
|
STMT(
|
|
|
|
if ( idx + 1 > argc )
|
|
|
|
{
|
|
|
|
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_OBJECT( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
CEntity* pEntity = ToNative< CEntity >( argv[ idx++ ] );
|
|
|
|
if ( !pEntity )
|
|
|
|
{
|
|
|
|
JS_ReportError( pContext, "Invalid entity parameter" );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Target = pEntity->me;
|
|
|
|
);
|
|
|
|
|
|
|
|
pNewMessage = pMessage;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_FORMATION_GENERIC:
|
|
|
|
{
|
|
|
|
CFormationGenericMessage* pMessage = new CFormationGenericMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = queued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
|
|
|
STMT(
|
|
|
|
if ( idx + 1 > argc )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );\
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_OBJECT( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
CEntity* pEntity = ToNative< CEntity >( argv[ idx++ ] );
|
|
|
|
if ( !pEntity )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Invalid entity parameter" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Target = pEntity->me;
|
|
|
|
);
|
|
|
|
|
|
|
|
pNewMessage = pMessage;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_PRODUCE:
|
|
|
|
{
|
|
|
|
CProduceMessage* pMessage = new CProduceMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = queued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
|
|
|
STMT(
|
|
|
|
if ( idx + 1 > argc )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Type = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
);
|
|
|
|
|
|
|
|
STMT(
|
|
|
|
if ( idx + 1 > argc )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_STRING( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Name = ToPrimitive< CStrW >( argv[ idx++ ] );
|
|
|
|
);
|
|
|
|
|
|
|
|
pNewMessage = pMessage;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NMT_PLACE_OBJECT:
|
|
|
|
{
|
|
|
|
CPlaceObjectMessage* pMessage = new CPlaceObjectMessage;
|
|
|
|
if ( !pMessage ) return NULL;
|
|
|
|
|
|
|
|
pMessage->m_IsQueued = queued;
|
|
|
|
pMessage->m_Entities = entities;
|
|
|
|
|
|
|
|
STMT(
|
|
|
|
if ( idx + 1 > argc )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_STRING( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Template = ToPrimitive< CStrW >( argv[ idx++ ] );
|
|
|
|
);
|
|
|
|
|
|
|
|
STMT(
|
|
|
|
if ( idx + 1 > argc )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_X = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
);
|
|
|
|
|
|
|
|
STMT(
|
|
|
|
if ( idx + 1 > argc )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Y = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
);
|
|
|
|
|
|
|
|
STMT(
|
|
|
|
if ( idx + 1 > argc )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Z = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
);
|
|
|
|
|
|
|
|
STMT(
|
|
|
|
if ( idx + 1 > argc )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Too few parameters!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !JSVAL_IS_INT( argv[ idx ] ) )
|
|
|
|
{
|
|
|
|
STMT(
|
|
|
|
JS_ReportError( pContext, "Parameter type error!" );
|
|
|
|
return NULL;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
pMessage->m_Angle = ToPrimitive< int >( argv[ idx++ ] );
|
|
|
|
);
|
|
|
|
|
|
|
|
pNewMessage = pMessage;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
JS_ReportError( pContext, "Invalid order type" );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return pNewMessage;
|
|
|
|
}
|
|
|
|
|