示例#1
0
// 保存数据
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;
}
示例#2
0
// 加载数据
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;
}
示例#3
0
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;
}
示例#4
0
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;
}
示例#5
0
    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 );
    }
示例#6
0
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
示例#7
0
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");
}