• ms人物上线


    在看MS人物上线
    else if(gs2ms_add_player == pkt.cmd)
    {
        PlayerChannel* pPC = new PlayerChannel(this);
        //加到地图中,但是并未激活该玩家
        int nChannelId = pPC->OnPlayerEnter(pkt.data, pkt.len);//主要playchannel人物基本信息的初始化
        m_vecPlayerChannel[nChannelId] = pPC;
        AddPlayer(nChannelId);    //人物上线位置和血量处理    
    }
    
    m_fnSendCmd2Client(s2c_enter_newmap, &cPkt, sizeof(cPkt));//向客户端发送enter_map包,以前这个是走json的,现在服务器全部不走json,因为read_json效率很低
    然后客户端想服务器发送c2s_activate_player激活包
    激活包做的事情很多
    void Map::ActivatePlayer(int mapChannelId) //激活玩家
    {
        PlayerChannel* pPC = m_vecPlayerChannel[mapChannelId];
        if (pPC->m_bBeActived)
            return;
        pPC->m_bBeActived = true;
        auto& pActorInfoEx = pPC->m_pActorInfoEx;
    
        if (!pActorInfoEx->m_bGaming) 
        {//第一次进游戏
            pActorInfoEx->m_bGaming = true;
            StartGame(mapChannelId);//好友上线通知,任务面板的显示
        }        
        pos2d& cPlayerMapPos = m_spBase->GetMapPos(pPC->tgtPos); 
    //    SetMapColl(mpos.x, mpos.y, true);
        GetAllPlayers()[pPC->objId.id] = pPC;
        m_MapCellMgr.AddObj(cPlayerMapPos.x, cPlayerMapPos.y, pPC);
    
        //在新进入块中通知
        pos2d newBlockPos = {pPC->m_nBlockX, pPC->m_nBlockY};
        pPC->m_fnSendStatChange(pPC->stat);
        NotifyBlock(pos2d(), newBlockPos, pPC, true);
    
        //让玩家上线就能看到所有附近角色的动作。
        m_MapCellMgr.m_vecRolesBlock[pPC->m_nBlockX][pPC->m_nBlockY].Add(pPC);
    
        UpdateRegionInfo(pPC, cPlayerMapPos);
    
        //判断罪恶值
        if(pPC->m_pActorInfoEx->GetSinValue() > 0)
        {
            m_spSinMgr->AddPlayer(pPC);
        }
    
        //宠物(现在主要是切图时宠物携带)
        if(pPC->m_pActorInfoEx->IsCarryTempPet())
        {
            const ShuiHu::PetInfo* pTempPetInfo = pPC->m_pActorInfoEx->GetTempPetInfoPtr();
            if (pTempPetInfo->m_nCurHP <= 0)
            {
                ShuiHu::GetLogger()->Warning("玩家(ID=%d)进入新地图(%d),带了个血量为<=0的宠物(ID=%d)!",
                    pPC->objId.id, m_nMapId, pTempPetInfo->m_nID);
                return;
            }
            pos2d cPetMapPos = {0};
            if (!Round(1, cPlayerMapPos, cPetMapPos))
            {
                pPC->m_pActorInfoEx->SetNoneTempPet();
                return; 
            }
    
            // 召唤正式宠物
            m_pSkill->CallPetByPos(pPC, *pTempPetInfo, cPetMapPos);
        }
    }
    map暂时就看到这了,在回到share中
  • 相关阅读:
    loj2042 「CQOI2016」不同的最小割
    loj2035 「SDOI2016」征途
    luogu2120 [ZJOI2007]仓库建设
    luogu3195 [HNOI2008]玩具装箱TOY
    51nod 1069 Nim游戏 + BZOJ 1022: [SHOI2008]小约翰的游戏John(Nim游戏和Anti-Nim游戏)
    HDU 5723 Abandoned country(最小生成树+边两边点数)
    BZOJ 1497: [NOI2006]最大获利(最大权闭合图)
    51nod 1615 跳跃的杰克
    SPOJ 839 Optimal Marks(最小割的应用)
    UVa 11107 生命的形式(不小于k个字符串中的最长子串)
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/4168467.html
Copyright © 2020-2023  润新知