void on_process_packet(struct connection *c,rpacket_t r) { uint32_t s = rpk_read_uint32(r); uint32_t t; if(s == (uint32_t)c) { t = rpk_read_uint32(r); uint32_t sys_t = GetSystemMs(); ava_interval += (sys_t - t); ava_interval /= 2; } }
void player_login(rpacket_t rpk,player_t ply) { uint32_t gateident = rpk_read_uint32(rpk); const char *actname = rpk_read_string(rpk); ply = find_player_by_actname(actname); if(ply){ //对象还未销毁 if(ply->_agentsession != 0){ //通知gate直接断掉连接 shortmsg2gate(CMD_GAME2GATE_INVID_CON,gateident); }else{ //重新绑定 } }else{ ply = create_player(actname,gateident); if(!ply){ //通知玩家系统繁忙 shortmsg2gate(CMD_GAME2GATE_BUSY,gateident); return; } if(0 != load_player_info(ply)){ shortmsg2gate(CMD_GAME2GATE_BUSY,gateident); remove_player(ply); } } }
//创建角色 void create_character(rpacket_t rpk,player_t ply) { uint8_t avattype = rpk_read_uint8(rpk); const char *chaname = rpk_read_string(rpk); uint32_t agentsession = rpk_read_uint32(rpk); //合法性检测 }
static int _read_int32(lua_State *L){ lua_packet_t p = lua_getluapacket(L,1); if(p->_packet->type != RPACKET) return luaL_error(L,"invaild opration"); rpacket_t rpk = (rpacket_t)p->_packet; lua_pushinteger(L,(int32_t)rpk_read_uint32(rpk)); return 1; }
void player_login(rpacket_t rpk) { string_t actname = rpk_read_string(rpk); uint32_t gateident = rpk_read_uint32(rpk); player_t ply = find_player_by_actname(actname); if(ply){ //对象还未销毁,重新绑定关系 }else{ create_player(actname,gateident); load_player_info(ply);//从数据库导入玩家信息 } }
const void* rpk_read_binary(rpacket_t r,uint32_t *len) { void *addr = 0; uint32_t size = 0; if(PACKET_RAW(r)) return rpk_raw_read_binary(r,len); size = rpk_read_uint32(r); *len = size; if(!r->data_remain || r->data_remain < size) return addr; if(r->readbuf->size - r->rpos >= size) { addr = &r->readbuf->buf[r->rpos]; r->rpos += size; r->data_remain -= size; if(r->rpos >= r->readbuf->size && r->data_remain) { //当前buffer数据已经被读完,切换到下一个buffer r->rpos = 0; r->readbuf = buffer_acquire(r->readbuf,r->readbuf->next); } } else { //数据跨越了buffer边界,创建binbuf,将数据拷贝到binbuf中 if(!r->binbuf) { r->binbufpos = 0; r->binbuf = buffer_create_and_acquire(NULL,r->len); } addr = r->binbuf->buf + r->binbufpos; while(size) { uint32_t copy_size = r->readbuf->size - r->rpos; copy_size = copy_size >= size ? size:copy_size; memcpy(r->binbuf->buf + r->binbufpos,r->readbuf->buf + r->rpos,copy_size); size -= copy_size; r->rpos += copy_size; r->data_remain -= copy_size; r->binbufpos += copy_size; if(r->rpos >= r->readbuf->size && r->data_remain) { //当前buffer数据已经被读完,切换到下一个buffer r->rpos = 0; r->readbuf = buffer_acquire(r->readbuf,r->readbuf->next); } } } return addr; }
int32_t agent_processpacket(msgdisp_t disp,rpacket_t rpk) { uint16_t cmd = rpk_peek_uint16(rpk); if(cmd == CMD_PLY_CONNECTING) { //绑定到asynnet service->msgdisp->bind(service->msgdisp,0,sock,0,30*1000,0);//由系统选择poller }else { if(cmd >= CMD_CLIENT2GATE && cmd < CMD_CLIENT2GATE_END){ rpk_read_uint16(rpk);//丢掉命令码 }else if(cmd >= CMD_GAME2CLIENT && cmd < CMD_GAME2CLIENT_END){ uint16_t size = reverse_read_uint16(rpk);//这个包需要发给多少个客户端 //在栈上创建一个rpacket_t用于读取需要广播的客户端 rpacket_t r = rpk_create_skip(rpk,size*sizeof(agentsession)+sizeof(size)); //将rpk中用于广播的信息丢掉 rpk_dropback(rpk,size*sizeof(agentsession)+sizeof(size)); int i = 0; wpacket_t wpk = wpk_create_by_rpacket(rpk); //发送给所有需要接收的客户端 for( ; i < size; ++i) { agentsession session; session.data = rpk_read_uint32(r); agentplayer_t ply = get_agentplayer(service,session); if(ply) asyn_send(ply->con,wpk); } rpk_destroy(&r); }else{ agentservice_t service = get_thd_agentservice(); sock_ident sock = CAST_2_SOCK(sender); agentsession session; session.data = (uint32_t)asynsock_get_ud(sock); agentplayer_t ply = get_agentplayer(service,session); if(ply && ply->status == agent_playing) { //转发到gameserver send2game(wpk_create_by_rpacket(rpk)); } } } return 1; }