// Ryzom - MMORPG Framework // Copyright (C) 2010 Winch Gate Property Limited // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include "stdpch.h" // include files #include "nel/misc/types_nl.h" #include "client_messages.h" //#include "game_share/tick_event_handler.h" //#include "game_share/msg_client_server.h" //#include "game_share/mode_and_behaviour.h" //TEMP!!! //#include "game_share/news_types.h" //#include "game_share/bot_chat_types.h" //#include "game_share/brick_types.h" //#include "game_share/loot_harvest_state.h" //#include "game_share/ryzom_version.h" //#include "game_share/ryzom_mirror_properties.h" #include "server_share/r2_variables.h" #include "world_position_manager.h" #include "gpm_service.h" using namespace std; using namespace NLMISC; using namespace NLNET; /****************************************************************\ cbUpdateEntityPosition() \****************************************************************/ void cbClientPosition( CMessage& msgin, const string &serviceName, NLNET::TServiceId serviceId ) { H_AUTO(cbClientPosition); CEntityId id; NLMISC::TGameCycle tick; msgin.serial(id, tick); TDataSetRow entityIndex = TheDataset.getDataSetRow( id ); if ( !entityIndex.isValid() ) { // client may send position even before it is added in system //nldebug( "%u: Receiving a position from client %s which is not in mirror yet", CTickEventHandler::getGameCycle(), id.toString().c_str() ); return; } // entity pos (x, y, z, theta) sint32 x, y, z; float heading; msgin.serial(x, y, z, heading); if (IsRingShard) { // make sure the move that the player is trying to make is legal // if the move wasn't legal then the values of 'x' and 'y' will be changed to make them legal bool moveWasLegal= pCGPMS->MoveChecker->checkMove(entityIndex, x, y, tick); // if the move wasn't legal then dispatch a message to the player if (!moveWasLegal) { // ***TODO *** // // Teleport the player back to a previous valid location // CMessage msgout( "IMPULSION_ID" ); // msgout.serial( master->Id ); // CBitMemStream bms; // GenericXmlMsgManager.pushNameToStream( "TP:CORRECT", bms ); // bms.serial( x ); // bms.serial( y ); // bms.serial( z ); // msgout.serialMemStream( bms ); // CUnifiedNetwork::getInstance()->send( master->Id.getDynamicId(), msgout ); // ***TODO *** } // set the player coordinates in the ring vision universe pCGPMS->RingVisionUniverse->setEntityPosition(entityIndex,x,y); // todo: determine whether player is in water etc for real; bool local= false; bool interior= false; bool water= false; // update the player coordinates in the mirror CMirrorPropValue1DS( TheDataset, entityIndex, DSPropertyPOSX )= x; CMirrorPropValue1DS( TheDataset, entityIndex, DSPropertyPOSY )= y; CMirrorPropValue1DS( TheDataset, entityIndex, DSPropertyPOSZ )= (z&~7) + (local ? 1 : 0) + (interior ? 2 : 0) + (water ? 4 : 0); CMirrorPropValue1DS( TheDataset, entityIndex, DSPropertyORIENTATION )= heading; CMirrorPropValue1DS( TheDataset, entityIndex, DSPropertyTICK_POS )= tick; CMirrorPropValue1DS cell ( TheDataset, entityIndex, DSPropertyCELL ); uint32 cx = (uint16) ( + x/CWorldPositionManager::getCellSize() ); uint32 cy = (uint16) ( - y/CWorldPositionManager::getCellSize() ); cell = (cx<<16) + cy; // update the player position in the ring vision grid pCGPMS->RingVisionUniverse->setEntityPosition(entityIndex,x,y); } else { /* // check player mode and behaviour CMirrorPropValueRO propMode( TheDataset, entityIndex, DSPropertyMODE ); MBEHAV::EMode mode = (MBEHAV::EMode)(propMode().Mode); CMirrorPropValueRO propBehaviour( TheDataset, entityIndex, DSPropertyBEHAVIOUR ); MBEHAV::EBehaviour behaviour = (MBEHAV::EBehaviour)(propBehaviour().Behaviour); if ( (mode == MBEHAV::COMBAT) || (mode == MBEHAV::COMBAT_FLOAT) || (mode == MBEHAV::DEATH) ) { H_AFTER(cbClientPosition); return; } */ CWorldEntity *player = CWorldPositionManager::getEntityPtr(entityIndex); if (player == NULL) { return; } if (player->X() == 0 && player->Y() == 0 && player->Z() == 0) { return; } //CWorldPositionManager::setEntityPosition(id, x, y, z, heading, tick); if (player->getType() == CWorldEntity::Player && player->CheckMotion && player->PosInitialised) { CWorldPositionManager::movePlayer(player, x, y, z, heading, tick); } } } // cbClientPosition // //---------------------------- // CbClientArray //---------------------------- TUnifiedCallbackItem CbClientArray[]= { { "CLIENT:POSITION", cbClientPosition }, }; //------------------------------------------------------------------------- // singleton initialisation and release void CClientMessages::init() { // setup the callback array CUnifiedNetwork::getInstance()->addCallbackArray( CbClientArray, sizeof(CbClientArray)/sizeof(CbClientArray[0]) ); } void CClientMessages::release() { }