// 保存数据 bool CPlayer::SaveData(google::protobuf::Message *pMsg) { // 没有加载数据的时候,不保存数据 if (!m_LoadDataSucc) return true; if (!pMsg) return false; if (PackData()) { svrData::LoadPlayerData *data = (svrData::LoadPlayerData *)pMsg; m_LastSaveTime = CTimer::GetTime(); data->set_account(GetAccount()); data->set_name(GetName()); data->set_nguid(GetGuid()); data->set_nsex(GetSex()); data->set_njob(GetJob()); data->set_nlevel(GetLevel()); data->set_ncreatetime(GetCreateTime()); data->set_nlogintime(GetLoginTime()); data->set_nmapid(GetMapID()); data->set_nx(GetNowPosX()); data->set_ny(GetNowPosY()); data->set_nz(GetNowPosZ()); data->set_data(g_Base64Data); return true; } return false; }
// 加载数据 bool CPlayer::LoadData(Msg *pMsg) { svrData::LoadPlayerData msg; _CHECK_PARSE_(pMsg, msg) false; if (!UnPackData(msg.data().c_str(), msg.data().size())) return false; SetAccount(msg.account()); SetName(msg.name().c_str()); SetGuid(msg.nguid()); SetSex(msg.nsex()); SetJob(msg.njob()); SetLevel(msg.nlevel()); SetCreateTime(msg.ncreatetime()); SetLoginTime(msg.nlogintime()); SetMapID(msg.nmapid()); SetNowPos(msg.nx(), msg.ny(), msg.nz()); m_LastSaveTime = CTimer::GetTime() + CRandomPool::GetOneLess(60); RunStateLog("加载玩家:%s数据成功!账号:%s", GetName(), msg.account().c_str()); if (!msg.bchangeline()) { svrData::AddPlayerToCenter SendMsg; SendMsg.set_nguid(GetGuid()); SendMsg.set_ngameid(GetGameID()); SendMsg.set_nclientid(GetClientID()); SendMsg.set_ngateid(GetGateID()); SendMsg.set_account(GetAccount()); FuncUti::SendMsgToCenter(this, SendMsg, SERVER_TYPE_MAIN, SVR_SUB_ADD_PLAYER_TO_CENTER); } m_LoadDataSucc = true; return true; }
StrongHandle<FmodEventInst> FmodEventDesc::SpawnInst() { ASSERT(m_valid); StrongHandle<FmodEventInst> result = new FmodEventInst; // init the instance FMOD::Studio::EventInstance & inst = result->GetInst(); FMOD_ERROR_CHECK( m_desc.createInstance( &inst ) ); result->Init( GetGuid().c_str(), this->GetHandle() ); RegisterInst(result); return result; }
UINT CResPacker::Add(PVOID buffer, UINT size) { _ResFrame frame; if (size < 1) { return RES_INVALID_ID; } frame.id = GetGuid(); frame.pdata = calloc(size, 1); frame.size = size; if (!frame.pdata) { return RES_INVALID_ID; } memcpy(frame.pdata, buffer, size); _res.push_back(frame); return frame.id; }
void CreateBuilding( SUser *user, uint8 building_type, S2UInt32 position ) { CBuildingData::SData *data = theBuildingExt.Find( building_type ); if ( data == NULL ) { HandleErrCode(user, kErrBuildingDataNotExist, 0); return; } std::vector<SUserBuilding>::iterator iter = std::find_if(user->data.building_list.begin(), user->data.building_list.end(), Building_EqualBuildingType( building_type ) ); //所有的建筑物,限制一个 if ( user->data.building_list.end() != iter ) { HandleErrCode(user, kErrBuildingCountNotMax, 0); return; } SUserBuilding sbuilding; sbuilding.building_guid = GetGuid( user, building_type ); sbuilding.building_type = building_type; sbuilding.data.target_id = user->guid; sbuilding.data.info_id = sbuilding.building_guid; sbuilding.data.info_type = building_type; sbuilding.data.info_level = 1; sbuilding.data.info_position = position; sbuilding.ext.production = 0; sbuilding.ext.time_point = (uint32)server::local_time(); user->data.building_list.push_back( sbuilding ); sbuilding.ext.production = SetMaxValue( user, building_type ); ReplyBuildingSet( user, sbuilding, kObjectAdd ); }
void WorldSession::_HandleUpdateObjectOpcode(WorldPacket& recvPacket) { uint8 utype; //uint8 hasTransport; uint32 usize, ublocks, readblocks=0; uint64 uguid; recvPacket >> ublocks; // >> hasTransport; //logdev("UpdateObject: blocks = %u, hasTransport = %u", ublocks, hasTransport); logdev("UpdateObject: blocks = %u", ublocks); while((recvPacket.rpos() < recvPacket.size())&& (readblocks < ublocks)) { recvPacket >> utype; switch(utype) { case UPDATETYPE_VALUES: { uguid = recvPacket.GetPackedGuid(); _ValuesUpdate(uguid,recvPacket); } break; case UPDATETYPE_MOVEMENT: { recvPacket >> uguid; // the guid is NOT packed here! uint8 tyid; Object *obj = objmgr.GetObj(uguid, true); // here we update also depleted objects, its just safer if(obj) tyid = obj->GetTypeId(); else // sometimes objects get deleted BEFORE a last update packet arrives, this must be handled also { tyid = GetTypeIdByGuid(uguid); logerror("Got UpdateObject_Movement for unknown object "I64FMT". Using typeid %u",uguid,(uint32)tyid); } if(obj) this->_MovementUpdate(tyid,uguid,recvPacket); } break; case UPDATETYPE_CREATE_OBJECT2: // will be sent when our very own character is created case UPDATETYPE_CREATE_OBJECT: // will be sent on any other object creation { uguid = recvPacket.GetPackedGuid(); uint8 objtypeid; recvPacket >> objtypeid; logdebug("Create Object type %u with guid "I64FMT,objtypeid,uguid); // dont create objects if already present in memory. // recreate every object except ourself! if(objmgr.GetObj(uguid)) { if(uguid != GetGuid()) { logdev("- already exists, deleting old, creating new object"); objmgr.Remove(uguid, false); // do not call script here, since the object does not really get deleted } else { logdev("- already exists, but not deleted (has our current GUID)"); } } // only if the obj didnt exist or was just deleted above, create it.... if(!objmgr.GetObj(uguid)) { switch(objtypeid) { case TYPEID_OBJECT: // no data to read { logerror("Recieved wrong UPDATETYPE_CREATE_OBJECT to create Object base type!"); logerror("%s",toHexDump((uint8*)recvPacket.contents(),recvPacket.size(),true).c_str()); } case TYPEID_ITEM: { Item *item = new Item(); item->Create(uguid); objmgr.Add(item); break; } case TYPEID_CONTAINER: { Bag *bag = new Bag(); bag->Create(uguid); objmgr.Add(bag); break; } case TYPEID_UNIT: { Unit *unit = new Unit(); unit->Create(uguid); objmgr.Add(unit); break; } case TYPEID_PLAYER: { if(GetGuid() == uguid) // objmgr.Add() would cause quite some trouble if we added ourself again break; Player *player = new Player(); player->Create(uguid); objmgr.Add(player); break; } case TYPEID_GAMEOBJECT: { GameObject *go = new GameObject(); go->Create(uguid); objmgr.Add(go); break; } case TYPEID_CORPSE: { Corpse *corpse = new Corpse(); corpse->Create(uguid); objmgr.Add(corpse); break; } case TYPEID_DYNAMICOBJECT: { DynamicObject *dobj = new DynamicObject(); dobj->Create(uguid); objmgr.Add(dobj); break; } } } else { logdebug("Obj "I64FMT" not created, already exists",uguid); } // ...regardless if it was freshly created or already present, update its values and stuff now... this->_MovementUpdate(objtypeid, uguid, recvPacket); this->_ValuesUpdate(uguid, recvPacket); // ...and ask the server for eventually missing data. _QueryObjectInfo(uguid); // call script "_OnObjectCreate" if(GetInstance()->GetScripts()->ScriptExists("_onobjectcreate")) { CmdSet Set; Set.defaultarg = toString(uguid); Set.arg[0] = toString(objtypeid); GetInstance()->GetScripts()->RunScript("_onobjectcreate", &Set); } // if our own character got finally created, we have successfully entered the world, // and should have gotten all info about our char already. } break; case UPDATETYPE_OUT_OF_RANGE_OBJECTS: { recvPacket >> usize; for(uint16 i=0; i<usize; i++) { uguid = recvPacket.GetPackedGuid(); // not 100% sure if this is correct logdebug("GUID "I64FMT" out of range",uguid); // call script just before object removal if(GetInstance()->GetScripts()->ScriptExists("_onobjectdelete")) { Object *del_obj = objmgr.GetObj(uguid); CmdSet Set; Set.defaultarg = toString(uguid); Set.arg[0] = del_obj ? toString(del_obj->GetTypeId()) : ""; Set.arg[1] = "true"; // out of range = true GetInstance()->GetScripts()->RunScript("_onobjectdelete", &Set); } objmgr.Remove(uguid, false); } } break; default: { logerror("UPDATE_OBJECT: Got unk updatetype 0x%X",utype); logerror("UPDATE_OBJECT: Read %u / %u bytes, skipped rest",recvPacket.rpos(),recvPacket.size()); logerror("%s",toHexDump((uint8*)recvPacket.contents(),recvPacket.size(),true).c_str()); char buf[100]; sprintf(buf,"Got unk updatetype=0x%X, read %u / %u bytes",utype,recvPacket.rpos(),recvPacket.size()); if(GetInstance()->GetConf()->dumpPackets) { char buf[100]; sprintf(buf,"Got unk updatetype=0x%X, read %u / %u bytes",utype,recvPacket.rpos(),recvPacket.size()); DumpPacket(recvPacket, recvPacket.rpos(),buf); } return; } } // switch readblocks++; } // while } // func
void WebFeedEntry::SaveL(WriteBuffer &buf) { buf.Append("\n<entry id=\""); buf.Append(m_id); buf.Append("\""); if (m_status == STATUS_READ) buf.Append(" read=\"yes\""); if (m_keep_item) buf.Append(" keep=\"yes\""); if (GetGuid()) { buf.Append(" guid=\""); buf.AppendQuotedL(GetGuid()); buf.Append("\""); } buf.Append(">\n"); if (m_title) { buf.Append("<title>"); m_title->SaveL(buf, FALSE); buf.Append("</title>\n"); } if (m_pubdate != 0.0) { buf.Append("<date type=\"published\" value=\""); buf.AppendDate(m_pubdate); buf.Append("\"/>\n"); } if (!GetPrimaryLink().IsEmpty()) { OpString8 link; GetPrimaryLink().GetAttributeL(URL::KName_With_Fragment_Username_Password_Escaped_NOT_FOR_UI, link); buf.Append("<url value=\""); buf.AppendQuotedL(link.CStr()); buf.Append("\"/>"); } if (m_properties) { WebFeedPropElm *prop = (WebFeedPropElm *)m_properties->First(); while (prop) { buf.Append("<prop name=\""); buf.Append(prop->GetName()); buf.Append("\">"); prop->GetContent()->SaveL(buf, FALSE); buf.Append("</prop>\n"); prop = (WebFeedPropElm *)prop->Suc(); } } if (m_content) m_content->SaveL(buf, TRUE); buf.Append("\n</entry>\n"); }