예제 #1
0
 private SyncingPeerData _UpdateSyncingPeer(SyncingPeerData peerData, long first, long firstPeerHas)
 {
     // TODO: This should not be able to happen
     peerData.nextCommandToSend   = Math.Min(peerData.nextCommandToSend, first);
     peerData.firstCommandPeerHas = Math.Max(peerData.firstCommandPeerHas, firstPeerHas);
     return(peerData);
 }
예제 #2
0
            public void AddSyncingPeer(string peerId, long firstNeededCmd, long firstStashedCmd)
            {
                SyncingPeerData peer = !syncingPeers.ContainsKey(peerId) ? new SyncingPeerData(peerId, firstNeededCmd, firstStashedCmd)
                    : _UpdateSyncingPeer(syncingPeers[peerId], firstNeededCmd, firstStashedCmd);

                syncingPeers[peerId] = peer;
            }
예제 #3
0
            private int _SendCmdsToOnePeer(SyncingPeerData sPeer, Dictionary <long, ApianCommand> commandStash, int maxToSend)  // true means "keep going"
            {
                int cmdsSent = 0;

                for (int i = 0; i < maxToSend; i++)
                {
                    long cmdNum = sPeer.nextCommandToSend;
                    if (commandStash.ContainsKey(cmdNum))
                    {
                        ApianCommand cmd = commandStash[cmdNum];
                        ApianInst.GameNet.SendApianMessage(sPeer.peerId, cmd);
                        cmdsSent++;
                        sPeer.nextCommandToSend++;
                        if (sPeer.nextCommandToSend == sPeer.firstCommandPeerHas)
                        {
                            break;
                        }
                    }
                    else
                    {
                        break; // should have access to logger to warn
                    }
                }
                return(cmdsSent);
            }