Exemplo n.º 1
0
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;
    }
}
Exemplo n.º 2
0
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);
		}
	}
}
Exemplo n.º 3
0
//创建角色
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);
	//合法性检测
}
Exemplo n.º 4
0
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;	
}
Exemplo n.º 5
0
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);//从数据库导入玩家信息
	}
}
Exemplo n.º 6
0
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;
}
Exemplo n.º 7
0
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;
}