void ItemType::unserialize(const BinaryTreePtr& node) { m_null = false; m_category = (ItemCategory)node->getU8(); node->getU32(); // flags static uint16 lastId = 99; while(node->canRead()) { uint8 attr = node->getU8(); if(attr == 0 || attr == 0xFF) break; uint16 len = node->getU16(); switch(attr) { case ItemTypeAttrServerId: { uint16 serverId = node->getU16(); if(g_game.getClientVersion() < 960) { if(serverId > 20000 && serverId < 20100) { serverId -= 20000; } else if(lastId > 99 && lastId != serverId - 1) { while(lastId != serverId - 1) { ItemTypePtr tmp(new ItemType); tmp->setServerId(lastId++); g_things.addItemType(tmp); } } } else { if(serverId > 30000 && serverId < 30100) { serverId -= 30000; } else if(lastId > 99 && lastId != serverId - 1) { while(lastId != serverId - 1) { ItemTypePtr tmp(new ItemType); tmp->setServerId(lastId++); g_things.addItemType(tmp); } } } setServerId(serverId); lastId = serverId; break; } case ItemTypeAttrClientId: setClientId(node->getU16()); break; case ItemTypeAttrName: setName(node->getString(len)); break; case ItemTypeAttrWritable: m_attribs.set(ItemTypeAttrWritable, true); break; default: node->skip(len); // skip attribute break; } } }
void GateLogic::parseBody( short message_id, std::shared_ptr<EasyBuffer> buf_ptr_, int from_connection_id, int char_id) { const char* c = buf_ptr_->get_buffer(); int size = buf_ptr_->get_size(); switch(message_id){ case msgid::togate::player_login: { gr::Player_Login msg; msg.ParseFromArray(c, size); int char_id = msg.char_id(); int ip = msg.ipv4(); if(isPermited(ip)){ if(isOnline(char_id)){ //删除原来的connection cmp_->remove_from_manager(getConnectionId(char_id)); } //给obj-master发消息 int obj_master = 0; gr::Notify_Obj_Master_Player_Login send_msg; send_msg.set_char_id(char_id); std::shared_ptr<EasyBuffer> buf(new EasyBuffer); int size = send_msg.ByteSize(); buf->prepare(size); send_msg.SerializeToArray(buf->get_buffer(), size); connection_ptr c_p_ = getConnection(obj_master); c_p_->get_io_service().post(boost::bind(&Tcp_Connection::send, c_p_, buf, msgid::fromgate::notify_obj_master_player_login, size)); } break; } case msgid::togate::inter_server_register: { gr::Inter_Server_Register msg; msg.ParseFromArray(c, size); setServerId(msg.server_type(),from_connection_id); std::shared_ptr<EasyBuffer> buf(new EasyBuffer); connection_ptr c_p_ = getConnection(from_connection_id); c_p_->get_io_service().post(boost::bind(&Tcp_Connection::send_to_connection, c_p_, buf, msgid::fromgate::server_registered, 0)); break; } case msgid::togate::transmission: { connection_ptr c_p_ = getConnection(getConnectionId(char_id)); c_p_->get_io_service().post(boost::bind(&Tcp_Connection::send_to_connection, c_p_, buf_ptr_, message_id, buf_ptr_->get_size())); break; } } }