void Worker::onRouterMessage(Connection *router) { Buffer *pBuffer = router->getBuffer(); while(pBuffer->size()) { if(pBuffer->size() < ROUTER_HEAD_SIZE){ return ; } RouterMsg msg = Router::unpackMsg(pBuffer->data()); if(pBuffer->size() < ROUTER_HEAD_SIZE + msg.slen + msg.len){ return ; } RouterMsg *pMsg = (RouterMsg*)pBuffer->data(); pMsg->type = msg.type; pMsg->slen = msg.slen; pMsg->len = msg.len; LOG("on router data,type=%d, slen=%d, len=%d", pMsg->type, pMsg->slen, pMsg->len); switch(pMsg->type){ case ROUTER_MSG_KICK: doKick(pMsg); break; case ROUTER_MSG_SEND_MSG: doSendMsg(pMsg); break; case ROUTER_MSG_SEND_ALL: doSendAllMsg(pMsg); break; case ROUTER_MSG_CH_ADD: doChannelAdd(pMsg); break; case ROUTER_MSG_CH_DEL: doChannelDel(pMsg); break; case ROUTER_MSG_CH_PUB: doChannelPub(pMsg); break; default: LOG("invalid type"); break; } pBuffer->seek(ROUTER_HEAD_SIZE + pMsg->slen + pMsg->len); } }
/*! execute action */ bool Bhv_GoalieFreeKick::execute( rcsc::PlayerAgent * agent ) { static bool s_first_move = false; static bool s_second_move = false; static int s_second_wait_count = 0; rcsc::dlog.addText( rcsc::Logger::TEAM, __FILE__": Bhf_GoalieFreeKick" ); if ( agent->world().gameMode().type() != rcsc::GameMode::GoalieCatch_ || agent->world().gameMode().side() != agent->world().ourSide() || ! agent->world().self().isKickable() ) { rcsc::dlog.addText( rcsc::Logger::TEAM, __FILE__": Bhv_GoalieFreeKick. Not a goalie catch mode" ); Bhv_GoalieBasicMove().execute( agent ); return true; } const long time_diff = agent->world().time().cycle() - agent->effector().getCatchTime().cycle(); //- M_catch_time.cycle(); // reset flags & wait if ( time_diff <= 2 ) { s_first_move = false; s_second_move = false; s_second_wait_count = 0; doWait( agent ); return true; } // first move if ( ! s_first_move ) { //rcsc::Vector2D move_target( rcsc::ServerParam::i().ourPenaltyAreaLine() - 0.8, 0.0 ); rcsc::Vector2D move_target( rcsc::ServerParam::i().ourPenaltyAreaLineX() - 1.5, agent->world().ball().pos().y > 0.0 ? -17.0 : 17.0 ); //rcsc::Vector2D move_target( -45.0, 0.0 ); s_first_move = true; s_second_move = false; s_second_wait_count = 0; agent->doMove( move_target.x, move_target.y ); agent->setNeckAction( new rcsc::Neck_ScanField ); return true; } // after first move // check stamina recovery or wait teammate rcsc::Rect2D our_pen( rcsc::Vector2D( -52.5, -40.0 ), rcsc::Vector2D( -36.0, 40.0 ) ); if ( time_diff < 50 || agent->world().setplayCount() < 3 || ( time_diff < rcsc::ServerParam::i().dropBallTime() - 15 && ( agent->world().self().stamina() < rcsc::ServerParam::i().staminaMax() * 0.9 || agent->world().existTeammateIn( our_pen, 20, true ) ) ) ) { doWait( agent ); return true; } // second move if ( ! s_second_move ) { rcsc::Vector2D kick_point = getKickPoint( agent ); agent->doMove( kick_point.x, kick_point.y ); agent->setNeckAction( new rcsc::Neck_ScanField ); s_second_move = true; s_second_wait_count = 0; return true; } s_second_wait_count++; // after second move // wait see info if ( s_second_wait_count < 5 || agent->world().seeTime() != agent->world().time() ) { doWait( agent ); return true; } s_first_move = false; s_second_move = false; s_second_wait_count = 0; // register kick intention doKick( agent ); return true; }
void Router::onMessage(Connection *conn) { Buffer *pBuffer = conn->getBuffer(); while(true) { if(pBuffer->size() < ROUTER_HEAD_SIZE){ return ; } RouterMsg msg = unpackMsg(pBuffer->data()); if(pBuffer->size() < ROUTER_HEAD_SIZE + msg.slen + msg.len){ return ; } RouterMsg *pMsg = (RouterMsg*)pBuffer->data(); pMsg->type = msg.type; pMsg->slen = msg.slen; pMsg->len = msg.len; LOG("on data, type=%d, slen=%d, len=%d", pMsg->type, pMsg->slen, pMsg->len); switch(pMsg->type){ case ROUTER_MSG_AUTH: doAuth(conn, pMsg); break; case ROUTER_MSG_CONN: doConn(conn, pMsg); break; case ROUTER_MSG_CLOSE: doClose(conn, pMsg); break; case ROUTER_MSG_KICK: doKick(conn, pMsg); break; case ROUTER_MSG_SEND_MSG: doSendMsg(conn, pMsg); break; case ROUTER_MSG_SEND_ALL: doSendAllMsg(conn, pMsg); break; case ROUTER_MSG_CH_ADD: doChannelAdd(conn, pMsg); break; case ROUTER_MSG_CH_DEL: doChannelDel(conn, pMsg); break; case ROUTER_MSG_CH_PUB: doChannelPub(conn, pMsg); break; case ROUTER_MSG_CH_SUB: doChannelSub(conn, pMsg); break; case ROUTER_MSG_CH_UNSUB: doChannelUnSub(conn, pMsg); break; case ROUTER_MSG_INFO: doInfo(conn, pMsg); break; default: LOG("[router]error type"); break; } pBuffer->seek(ROUTER_HEAD_SIZE + pMsg->slen + pMsg->len); } }