// // CL_ResetSectors // // Moves predicting sectors to their most recent snapshot received from the // server. Also performs cleanup on the list of predicting sectors when // sectors have finished their movement. // static void CL_ResetSectors() { std::list<movingsector_t>::iterator itr; itr = movingsectors.begin(); // Iterate through all predicted sectors while (itr != movingsectors.end()) { sector_t *sector = itr->sector; unsigned short sectornum = sector - sectors; if (sectornum >= numsectors) continue; // Find the most recent snapshot received from the server for this sector SectorSnapshotManager *mgr = CL_GetSectorSnapshotManager(sector); bool snapfinished = false; if (mgr && !mgr->empty()) { int mostrecent = mgr->getMostRecentTime(); SectorSnapshot snap = mgr->getSnapshot(mostrecent); bool ceilingdone = P_CeilingSnapshotDone(&snap); bool floordone = P_FloorSnapshotDone(&snap); if (ceilingdone && floordone) snapfinished = true; else { // snapshots have been received for this sector recently, so // reset this sector to the most recent snapshot from the server snap.toSector(sector); } } else snapfinished = true; if (snapfinished && P_MovingCeilingCompleted(sector) && P_MovingFloorCompleted(sector)) { // no valid snapshots in the container so remove this sector from the // movingsectors list whenever prediction is done movingsectors.erase(itr++); } else { ++itr; } } }
// // Do Platforms // [RH] Changed amount to height and added delay, // lip, change, tag, and speed parameters. // BOOL EV_DoPlat (int tag, line_t *line, DPlat::EPlatType type, fixed_t height, int speed, int delay, fixed_t lip, int change) { DPlat *plat; int secnum; sector_t *sec; int rtn = false; BOOL manual = false; // [RH] If tag is zero, use the sector on the back side // of the activating line (if any). if (!tag) { if (!line || !(sec = line->backsector)) return false; secnum = sec - sectors; manual = true; goto manual_plat; } // Activate all <type> plats that are in_stasis switch (type) { case DPlat::platToggle: rtn = true; case DPlat::platPerpetualRaise: P_ActivateInStasis (tag); break; default: break; } secnum = -1; while ((secnum = P_FindSectorFromTag (tag, secnum)) >= 0) { sec = §ors[secnum]; manual_plat: if (sec->floordata) { if (P_MovingFloorCompleted(sec)) sec->floordata->Destroy(); else continue; } // Find lowest & highest floors around sector rtn = true; plat = new DPlat(sec,type, height, speed, delay, lip); P_AddMovingFloor(sec); plat->m_Tag = tag; if (change) { if (line) sec->floorpic = sides[line->sidenum[0]].sector->floorpic; if (change == 1) sec->special = 0; // Stop damage and other stuff, if any } if (manual) return rtn; } return rtn; }