l2-unlegits/l2ooghelper/packet_handlers/ph_MoveToPawn.cpp
2012-02-01 05:25:08 +00:00

117 lines
3.9 KiB
C++

#include "stdafx.h"
#include "Logger.h"
#include "L2Client.h"
/** Server: Len 27 [MoveToPawn]
1B 00
72 // MoveToPawn
6C 08 00 10 // _charObjId // 6C080010 objectID who is moving (can be user at least)
B2 16 00 10 // _targetId // B2160010 is target object id, to which he moves to
39 00 00 00 // _distance wtf is 57?..
C7 AC 00 00 // x
0A A6 00 00 // y dunno if it is user coordinates or mob coordinates
5D F2 FF FF // z
possible these are target's coordinates */
void L2Client::ph_MoveToPawn( class L2Client *pcls, L2GamePacket *p )
{
p->getPacketType();
unsigned int movingObjectId = p->readUInt();
unsigned int targetObjectId = p->readUInt();
/*int dist = */p->readInt();
int targetX = p->readInt();
int targetY = p->readInt();
int targetZ = p->readInt();
//
if( movingObjectId == pcls->usr.objectID )
{
//pcls->usr.targetObjectID = targetObjectId;
//log_error( LOG_OK, "User (%d,%d,%d) is moving to pawn %u (%d,%d,%d)\n",
// pcls->usr.x, pcls->usr.y, pcls->usr.z, targetObjectId, targetX, targetY, targetZ );
// get target coordinates
WorldObjectTreeNode wotNode;
if( pcls->world_tree.GetInfoByObjectID( targetObjectId, &wotNode ) )
{
int idx = wotNode.getArrayIdx();
switch( wotNode.getObjectType() )
{
case L2OT_PC:
{
targetX = pcls->world_chars.chars_array[idx]->x;
targetY = pcls->world_chars.chars_array[idx]->y;
targetZ = pcls->world_chars.chars_array[idx]->z;
} break;
case L2OT_NPC:
{
targetX = pcls->world_npcs.npcs_array[idx]->x;
targetY = pcls->world_npcs.npcs_array[idx]->y;
targetZ = pcls->world_npcs.npcs_array[idx]->z;
} break;
}
pcls->usr.startMoveTo( targetX, targetY, targetZ, pcls->usr.x, pcls->usr.y, pcls->usr.z );
//
//log_error( LOG_OK, "Calculated pawn coords: (%d,%d,%d)\n", targetX, targetY, targetZ );
}
//log_error( LOG_OK, "MoveToPawn: user move\n" );
}
else
{
WorldObjectTreeNode wotNode;
// get target coordinates
if( pcls->world_tree.GetInfoByObjectID( targetObjectId, &wotNode ) )
{
int idx = wotNode.getArrayIdx();
switch( wotNode.getObjectType() )
{
case L2OT_PC:
{
targetX = pcls->world_chars.chars_array[idx]->x;
targetY = pcls->world_chars.chars_array[idx]->y;
targetZ = pcls->world_chars.chars_array[idx]->z;
} break;
case L2OT_NPC:
{
targetX = pcls->world_npcs.npcs_array[idx]->x;
targetY = pcls->world_npcs.npcs_array[idx]->y;
targetZ = pcls->world_npcs.npcs_array[idx]->z;
} break;
}
}
else
{
// maybe someone is movin to me?
if( targetObjectId == pcls->usr.objectID )
{
targetX = pcls->usr.x;
targetY = pcls->usr.y;
targetZ = pcls->usr.z;
}
}
// get moving object's coordinates
wotNode.~WorldObjectTreeNode();
if( pcls->world_tree.GetInfoByObjectID( movingObjectId, &wotNode ) )
{
int idx = wotNode.getArrayIdx();
switch( wotNode.getObjectType() )
{
case L2OT_PC:
{
//log_error( LOG_OK, "MoveToPawn: PC move [%S]\n", pcls->world_chars.chars_array[idx]->charName );
int x = pcls->world_chars.chars_array[idx]->x;
int y = pcls->world_chars.chars_array[idx]->y;
int z = pcls->world_chars.chars_array[idx]->z;
pcls->world_chars.chars_array[idx]->startMoveTo( targetX, targetY, targetZ, x, y, z );
} break;
case L2OT_NPC:
{
int x = pcls->world_npcs.npcs_array[idx]->x;
int y = pcls->world_npcs.npcs_array[idx]->y;
int z = pcls->world_npcs.npcs_array[idx]->z;
//log_error( LOG_OK, "MoveToPawn NPC %S\n", pcls->world_npcs.npcs_array[idx]->charName );
pcls->world_npcs.npcs_array[idx]->startMoveTo( targetX, targetY, targetZ, x, y, z );
} break;
}
}
else log_error( LOG_ERROR, "WOT cannot find objectID while MoveToPawn\n" );
}
}