public void OnPlaceClaimCmd(PlaceClaimMsg msg) { // Apian has said this message is authoritative BaseBike b = CoreData.GetBaseBike(msg.bikeId); if (CoreData.Ground.IndicesAreOnMap(msg.xIdx, msg.zIdx)) { if (b == null) { logger.Warn($"OnPlaceClaimCmd() Bike:{msg.bikeId} not found!"); // can happen if RemoveCmd and ClaimObs interleave return; } b.UpdatePosFromCommand(msg.TimeStamp, FrameApianTime, BeamPlace.PlacePos(msg.xIdx, msg.zIdx), msg.exitHead); // Claim it BeamPlace p = CoreData.ClaimPlace(b, msg.xIdx, msg.zIdx, msg.TimeStamp + BeamPlace.kLifeTimeMs); if (p != null) { ApplyScoreUpdate(msg.scoreUpdates); logger.Verbose($"OnPlaceClaimCmd() Bike: {b.bikeId} claimed {BeamPlace.PlacePos( msg.xIdx, msg.zIdx).ToString()} at {msg.TimeStamp}"); //logger.Verbose($" BikePos: {b.position.ToString()}, FrameApianTime: {FrameApianTime} "); //logger.Verbose($" at Timestamp: BikePos: {b.PosAtTime(msg.TimeStamp, FrameApianTime).ToString()}, Time: {msg.TimeStamp} "); PlaceClaimedEvt?.Invoke(this, p); } else { logger.Warn($"OnPlaceClaimCmd()) failed. Place already claimed."); } } }