玩家移动 //好长时间没看这些,好多都看不懂了 void Map::UpdatePlayerPos(TgtPos pos, PlayerInfo* pl) { // m_pLog->Logs(eLogLevel_Warning, "人物移动"); // 检查位置包 auto& mpos = m_spBase->GetMapPos(pos.tgtPos); if(!CheckMovePos(pos, pl))//纠正包不知干啥的 return; pl->m_CurPos = pl->tgtPos; pl->tgtPos = pos.tgtPos; pl->m_fSpeed = pos.speed; pl->mov_face = pos.mov_face; pl->mov_mode = pos.mov_mode; pl->dir = pos.dir; int curPosX = pl->m_CurPos.x; int curPosY = pl->m_CurPos.y; int tgtPosX = pl->tgtPos.x; int tgtPosY = pl->tgtPos.y; //[+]设置阻挡(压测的时候取消设置) pos2d cur_map_pos = m_spBase->GetMapPos(curPosX, curPosY); pos2d tgt_map_pos = m_spBase->GetMapPos(tgtPosX, tgtPosY); int id = pl->objId.id; //标记移动 m_MoveMgr.AddMask(pl); //没有发生位置移动 if(cur_map_pos == tgt_map_pos) return; m_MapCellMgr.UpdateObjPos(pl, cur_map_pos, tgt_map_pos); //分配到指定的地图块上面(确定是否离开了所在块) int x = pl->m_nBlockX; int y = pl->m_nBlockY; //更新区域 //pl->region = getRegion(tgt_map_pos); UpdateRegionInfo(pl, tgt_map_pos); pos2d new_block_pos = m_spBase->GetBlockPos(tgtPosX, tgtPosY); // 火墙移动处理 FireWall(pl, pos.tgtPos); if((x == new_block_pos.x) && (y == new_block_pos.y)) return ; //没变化 //删除原来的 ObjID plid; plid.id = id; plid.type = ObjID_Player; m_MapCellMgr.m_vecRolesBlock[x][y].Del(plid); //更新玩家附近的对象(其他玩家/怪) pos2d olDBlockPos = {x, y}; NotifyBlock(olDBlockPos, new_block_pos, pl); //加入新的 pl->m_nBlockX = new_block_pos.x; pl->m_nBlockY = new_block_pos.y; m_MapCellMgr.m_vecRolesBlock[new_block_pos.x][new_block_pos.y].Add(pl); //eSkillId_FireWall处理 }
时间: 2024-10-13 18:07:30