// Handle packet data void _Server::HandlePacket(_Buffer &Data, _Peer *Peer) { PacketType Type = Data.Read<PacketType>(); switch(Type) { case PacketType::ACCOUNT_LOGININFO: HandleLoginInfo(Data, Peer); break; case PacketType::CHARACTERS_REQUEST: HandleCharacterListRequest(Data, Peer); break; case PacketType::CHARACTERS_PLAY: HandleCharacterPlay(Data, Peer); break; case PacketType::CREATECHARACTER_INFO: HandleCharacterCreate(Data, Peer); break; case PacketType::CHARACTERS_DELETE: HandleCharacterDelete(Data, Peer); break; case PacketType::WORLD_MOVECOMMAND: HandleMoveCommand(Data, Peer); break; case PacketType::WORLD_RESPAWN: HandleRespawn(Data, Peer); break; case PacketType::ACTION_USE: HandleActionUse(Data, Peer); break; case PacketType::CHAT_MESSAGE: HandleChatMessage(Data, Peer); break; case PacketType::INVENTORY_MOVE: HandleInventoryMove(Data, Peer); break; case PacketType::INVENTORY_USE: HandleInventoryUse(Data, Peer); break; case PacketType::INVENTORY_SPLIT: HandleInventorySplit(Data, Peer); break; case PacketType::VENDOR_EXCHANGE: HandleVendorExchange(Data, Peer); break; case PacketType::TRADER_ACCEPT: HandleTraderAccept(Data, Peer); break; case PacketType::ACTIONBAR_CHANGED: HandleActionBarChanged(Data, Peer); break; case PacketType::SKILLS_SKILLADJUST: HandleSkillAdjust(Data, Peer); break; case PacketType::TRADE_REQUEST: HandleTradeRequest(Data, Peer); break; case PacketType::TRADE_CANCEL: HandleTradeCancel(Data, Peer); break; case PacketType::TRADE_GOLD: HandleTradeGold(Data, Peer); break; case PacketType::TRADE_ACCEPT: HandleTradeAccept(Data, Peer); break; case PacketType::PLAYER_STATUS: HandlePlayerStatus(Data, Peer); break; default: break; } }
//----------------------------------------------------------------------------- // Run this Bot's AI for one tick. //----------------------------------------------------------------------------- void CSDKBot::BotThink() { // Make sure we stay being a bot AddFlag( FL_FAKECLIENT ); if ( IsEFlagSet(EFL_BOT_FROZEN) ) return; CUserCmd cmd; Q_memset( &cmd, 0, sizeof( cmd ) ); ConVarRef bot_freeze("bot_freeze"); if ( !IsAlive() ) { HandleRespawn(cmd); } else if (bot_mimic.GetBool()) { CBasePlayer *pPlayer = UTIL_PlayerByIndex( bot_mimic.GetInt() ); if ( pPlayer && pPlayer->GetLastUserCommand() ) { cmd = *pPlayer->GetLastUserCommand(); ConVarRef bot_mimic_yaw_offset("bot_mimic_yaw_offset"); cmd.viewangles[YAW] += bot_mimic_yaw_offset.GetFloat(); ConVarRef bot_crouch("bot_crouch"); if( bot_crouch.GetInt() ) cmd.buttons |= IN_DUCK; } } else if (!bot_freeze.GetBool()) { trace_t tr_front; Vector Forward; AngleVectors(GetLocalAngles(), &Forward); UTIL_TraceHull( GetLocalOrigin()+Vector(0,0,5), GetLocalOrigin() + Vector(0,0,5) + (Forward * 50), GetPlayerMins(), GetPlayerMaxs(), MASK_PLAYERSOLID, this, COLLISION_GROUP_NONE, &tr_front ); // enemy acquisition if( !GetEnemy() || RecheckEnemy() || !GetEnemy()->IsAlive() ) { if( GetEnemy() && !GetEnemy()->IsAlive() ) ResetNavigationParams(); AcquireEnemy(); m_flTimeToRecheckEnemy = gpGlobals->curtime + 1.0f; } // assume we have an enemy from now on InfoGathering(); Attack(cmd); if( m_flTimeToRecheckStuck < gpGlobals->curtime ) CheckStuck(cmd); if( m_flNextDealObstacles < gpGlobals->curtime ) DealWithObstacles(tr_front.m_pEnt, cmd); Navigation(cmd); CheckNavMeshAttrib(&tr_front, cmd); } // debug waypoint related position /*for( int i=0; i<m_Waypoints.Count(); i++ ) { NDebugOverlay::Cross3DOriented( m_Waypoints[i].Center, QAngle(0,0,0), 5*i+1, 200, 0, 0, false, -1 ); }*/ RunPlayerMove( cmd, gpGlobals->frametime ); }