Ejemplo n.º 1
0
        protected virtual GameMsg_SvVoteStatus UnpackSvVoteStatus(Unpacker unpacker,
                                                                  ref string failedOn)
        {
            var msg = new GameMsg_SvVoteStatus
            {
                Yes   = unpacker.GetInt(),
                No    = unpacker.GetInt(),
                Pass  = unpacker.GetInt(),
                Total = unpacker.GetInt(),
            };

            if (msg.Yes < 0)
            {
                failedOn = "Yes";
            }
            if (msg.No < 0)
            {
                failedOn = "No";
            }
            if (msg.Pass < 0)
            {
                failedOn = "Pass";
            }
            if (msg.Total < 0)
            {
                failedOn = "Total";
            }

            return(msg);
        }
Ejemplo n.º 2
0
        protected override void NetMsgInput(NetworkChunk packet, Unpacker unpacker, int clientId)
        {
            Clients[clientId].LastAckedSnapshot = unpacker.GetInt();
            var intendedTick = unpacker.GetInt();
            var size         = unpacker.GetInt();

            if (unpacker.Error || size / sizeof(int) > BaseServerClient.MAX_INPUT_SIZE)
            {
                return;
            }

            if (Clients[clientId].LastAckedSnapshot > 0)
            {
                Clients[clientId].SnapRate = SnapRate.FULL;
            }

            if (Clients[clientId].SnapshotStorage.Get(
                    Clients[clientId].LastAckedSnapshot,
                    out var tagTime,
                    out var _))
            {
                Clients[clientId].Latency =
                    (int)(((Time.Get() - tagTime) * 1000) / Time.Freq());
            }

            if (intendedTick > Clients[clientId].LastInputTick)
            {
                var timeLeft = (TickStartTime(intendedTick) - Time.Get()) * 1000 / Time.Freq();
                var msg      = new MsgPacker((int)NetworkMessages.SV_INPUT_TIMING);
                msg.AddInt(intendedTick);
                msg.AddInt((int)timeLeft);
                SendMsgEx(msg, MsgFlags.NONE, clientId, true);
            }

            Clients[clientId].LastInputTick = intendedTick;
            var input = Clients[clientId].Inputs[Clients[clientId].CurrentInput];

            if (intendedTick <= Tick)
            {
                intendedTick = Tick + 1;
            }

            var data = new int[size / sizeof(int)];

            for (var i = 0; i < data.Length; i++)
            {
                data[i] = unpacker.GetInt();
            }

            input.Tick = intendedTick;
            input.PlayerInput.Deserialize(data, 0);

            Clients[clientId].CurrentInput++;
            Clients[clientId].CurrentInput %= Clients[clientId].Inputs.Length;

            if (Clients[clientId].State == ServerClientState.IN_GAME)
            {
                GameContext.OnClientDirectInput(clientId, input.PlayerInput);
            }
        }
Ejemplo n.º 3
0
        protected virtual GameMsg_SvKillMsg UnpackSvKillMsg(Unpacker unpacker,
                                                            ref string failedOn)
        {
            var msg = new GameMsg_SvKillMsg
            {
                Killer      = unpacker.GetInt(),
                Victim      = unpacker.GetInt(),
                Weapon      = (Weapon)unpacker.GetInt(),
                ModeSpecial = unpacker.GetInt()
            };

            if (msg.Killer < 0)
            {
                failedOn = "Killer";
            }
            if (msg.Victim < 0)
            {
                failedOn = "Victim";
            }
            if (msg.Weapon < Weapon.GAME)
            {
                failedOn = "Weapon";
            }

            return(msg);
        }
Ejemplo n.º 4
0
 protected virtual GameMsg_ClChangeInfo UnpackClChangeInfo(
     Unpacker unpacker, ref string failedOn)
 {
     return(new GameMsg_ClChangeInfo
     {
         Name = unpacker.GetString(CC_TRIM),
         Clan = unpacker.GetString(CC_TRIM),
         Country = unpacker.GetInt(),
         Skin = unpacker.GetString(CC_TRIM),
         UseCustomColor = unpacker.GetInt() != 0,
         ColorBody = unpacker.GetInt(),
         ColorFeet = unpacker.GetInt()
     });
 }
Ejemplo n.º 5
0
        protected virtual GameMsg_SvVoteOptionListAdd UnpackSvVoteOptionListAdd(
            Unpacker unpacker, ref string failedOn)
        {
            var msg = new GameMsg_SvVoteOptionListAdd
            {
                NumOptions    = unpacker.GetInt(),
                Description0  = unpacker.GetString(CC_TRIM),
                Description1  = unpacker.GetString(CC_TRIM),
                Description2  = unpacker.GetString(CC_TRIM),
                Description3  = unpacker.GetString(CC_TRIM),
                Description4  = unpacker.GetString(CC_TRIM),
                Description5  = unpacker.GetString(CC_TRIM),
                Description6  = unpacker.GetString(CC_TRIM),
                Description7  = unpacker.GetString(CC_TRIM),
                Description8  = unpacker.GetString(CC_TRIM),
                Description9  = unpacker.GetString(CC_TRIM),
                Description10 = unpacker.GetString(CC_TRIM),
                Description11 = unpacker.GetString(CC_TRIM),
                Description12 = unpacker.GetString(CC_TRIM),
                Description13 = unpacker.GetString(CC_TRIM),
                Description14 = unpacker.GetString(CC_TRIM),
            };

            if (msg.NumOptions < 1 || msg.NumOptions > 15)
            {
                failedOn = "NumOptions";
            }

            return(msg);
        }
Ejemplo n.º 6
0
        protected virtual GameMsg_SvChat UnpackSvChat(Unpacker unpacker,
                                                      ref string failedOn)
        {
            var msg = new GameMsg_SvChat
            {
                IsTeam   = unpacker.GetInt() != 0,
                ClientId = unpacker.GetInt(),
                Message  = unpacker.GetString()
            };

            if (msg.ClientId < -1)
            {
                failedOn = "ClientId";
            }

            return(msg);
        }
Ejemplo n.º 7
0
        protected virtual bool DecodeLegacyHandShake(byte[] data, int dataSize, out uint legacyToken)
        {
            var unpacker = new Unpacker();

            unpacker.Reset(data, dataSize);
            var msgId = unpacker.GetInt();
            var token = unpacker.GetInt();

            if (unpacker.Error || msgId != System(NetworkMessages.CL_INPUT))
            {
                legacyToken = 0;
                return(false);
            }

            legacyToken = (uint)token;
            return(true);
        }
Ejemplo n.º 8
0
 protected virtual GameMsg_ClSay UnpackClSay(Unpacker unpacker,
                                             ref string failedOn)
 {
     return(new GameMsg_ClSay
     {
         IsTeam = unpacker.GetInt() != 0,
         Message = unpacker.GetString()
     });
 }
Ejemplo n.º 9
0
        protected virtual GameMsg_SvEmoticon UnpackSvEmoticon(Unpacker unpacker,
                                                              ref string failedOn)
        {
            var msg = new GameMsg_SvEmoticon
            {
                ClientId = unpacker.GetInt(),
                Emoticon = (Emoticons)unpacker.GetInt(),
            };

            if (msg.ClientId < 0)
            {
                failedOn = "ClientId";
            }
            if (msg.Emoticon < 0 || msg.Emoticon >= Emoticons.NUM_EMOTICONS)
            {
                failedOn = "Emoticon";
            }

            return(msg);
        }
Ejemplo n.º 10
0
        protected virtual GameMsg_ClSetSpectatorMode UnpackClSetSpectatorMode(
            Unpacker unpacker, ref string failedOn)
        {
            var msg = new GameMsg_ClSetSpectatorMode
            {
                SpectatorId = unpacker.GetInt()
            };

            if (msg.SpectatorId < -1)
            {
                failedOn = "SpectatorId";
            }

            return(msg);
        }
Ejemplo n.º 11
0
        protected virtual GameMsg_ClSetTeam UnpackClSetTeam(Unpacker unpacker,
                                                            ref string failedOn)
        {
            var msg = new GameMsg_ClSetTeam
            {
                Team = (Team)unpacker.GetInt()
            };

            if (msg.Team < Team.SPECTATORS || msg.Team > Team.BLUE)
            {
                failedOn = "Team";
            }

            return(msg);
        }
Ejemplo n.º 12
0
        protected virtual GameMsg_SvWeaponPickup UnpackSvWeaponPickup(Unpacker unpacker,
                                                                      ref string failedOn)
        {
            var msg = new GameMsg_SvWeaponPickup
            {
                Weapon = (Weapon)unpacker.GetInt()
            };

            if (msg.Weapon < 0 || msg.Weapon >= Weapon.NUM_WEAPONS)
            {
                failedOn = "Weapon";
            }

            return(msg);
        }
Ejemplo n.º 13
0
        protected virtual GameMsg_SvSoundGlobal UnpackSvSoundGlobal(Unpacker unpacker,
                                                                    ref string failedOn)
        {
            var msg = new GameMsg_SvSoundGlobal
            {
                Sound = (Sound)unpacker.GetInt()
            };

            if (msg.Sound < 0 || msg.Sound >= Sound.NUM_SOUNDS)
            {
                failedOn = "Sound";
            }

            return(msg);
        }
Ejemplo n.º 14
0
        protected virtual GameMsg_ClVote UnpackClVote(Unpacker unpacker,
                                                      ref string failedOn)
        {
            var msg = new GameMsg_ClVote
            {
                Vote = unpacker.GetInt()
            };

            if (msg.Vote < -1 || msg.Vote > 1)
            {
                failedOn = "Vote";
            }

            return(msg);
        }
Ejemplo n.º 15
0
        protected virtual GameMsg_ClEmoticon UnpackClEmoticon(Unpacker unpacker,
                                                              ref string failedOn)
        {
            var msg = new GameMsg_ClEmoticon
            {
                Emoticon = (Emoticons)unpacker.GetInt()
            };

            if (msg.Emoticon < 0 || msg.Emoticon >= Emoticons.NUM_EMOTICONS)
            {
                failedOn = "Emoticon";
            }

            return(msg);
        }
Ejemplo n.º 16
0
        protected virtual GameMsg_SvVoteSet UnpackSvVoteSet(Unpacker unpacker,
                                                            ref string failedOn)
        {
            var msg = new GameMsg_SvVoteSet
            {
                Timeout     = unpacker.GetInt(),
                Description = unpacker.GetString(CC_TRIM),
                Reason      = unpacker.GetString(CC_TRIM)
            };

            if (msg.Timeout < 0 || msg.Timeout > 60)
            {
                failedOn = "Timeout";
            }

            return(msg);
        }
Ejemplo n.º 17
0
        protected virtual void OnMsgIsDDNet(Unpacker unpacker, BasePlayer player, GameMsg_ClIsDDNet msg)
        {
            var version = unpacker.GetInt();

            if (unpacker.Error)
            {
                if (player.ClientVersion < ClientVersion.DDRACE)
                {
                    player.ClientVersion = ClientVersion.DDRACE;
                }
            }
            else
            {
                player.ClientVersion = (ClientVersion)version;
            }

            Debug.Warning("ddnet", $"{player.ClientId} using ddnet client ({player.ClientVersion})");
        }
Ejemplo n.º 18
0
        protected override void NetMsgRequestMapData(NetworkChunk packet, Unpacker unpacker, int clientId)
        {
            if (Clients[clientId].State < ServerClientState.CONNECTING)
            {
                return;
            }

            var chunk     = unpacker.GetInt();
            var chunkSize = 1024 - 128;
            var offset    = chunk * chunkSize;
            var last      = 0;

            _lastAsk[clientId]     = chunk;
            _lastAskTick[clientId] = Tick;

            if (chunk == 0)
            {
                _lastSent[clientId] = 0;
            }

            if (chunk < 0 || offset > CurrentMap.Size)
            {
                return;
            }

            if (offset + chunkSize >= CurrentMap.Size)
            {
                chunkSize = CurrentMap.Size - offset;
                last      = 1;

                if (chunkSize < 0)
                {
                    chunkSize = 0;
                }
            }

            if (_lastSent[clientId] < chunk + Config["SvMapWindow"] &&
                Config["SvFastDownload"])
            {
                return;
            }

            SendMapData(last, chunk, chunkSize, offset, clientId);
        }
Ejemplo n.º 19
0
        protected override void ProcessClientPacket(NetworkChunk packet)
        {
            var clientId = packet.ClientId;
            var unpacker = new Unpacker();

            unpacker.Reset(packet.Data, packet.DataSize);

            var msg         = unpacker.GetInt();
            var isSystemMsg = (msg & 1) != 0;

            msg >>= 1;

            if (unpacker.Error)
            {
                return;
            }

            if (Config["SvNetlimit"] &&
                !(isSystemMsg && msg == (int)NetworkMessages.CL_REQUEST_MAP_DATA))
            {
                var now   = Time.Get();
                var diff  = now - Clients[clientId].TrafficSince;
                var alpha = Config["SvNetlimitAlpha"] / 100f;
                var limit = (float)Config["SvNetlimit"] * 1024 / Time.Freq();

                if (Clients[clientId].Traffic > limit)
                {
                    NetworkBan.BanAddr(packet.EndPoint, 600, "Stressing network");
                    return;
                }

                if (diff > 100)
                {
                    Clients[clientId].Traffic = (int)(alpha * ((float)packet.DataSize / diff) +
                                                      (1.0f - alpha) * Clients[clientId].Traffic);
                    Clients[clientId].TrafficSince = now;
                }
            }

            if (isSystemMsg)
            {
                var networkMsg = (NetworkMessages)msg;
                switch (networkMsg)
                {
                case NetworkMessages.CL_INFO:
                    NetMsgInfo(packet, unpacker, clientId);
                    break;

                case NetworkMessages.CL_REQUEST_MAP_DATA:
                    NetMsgRequestMapData(packet, unpacker, clientId);
                    break;

                case NetworkMessages.CL_READY:
                    NetMsgReady(packet, unpacker, clientId);
                    break;

                case NetworkMessages.CL_ENTERGAME:
                    NetMsgEnterGame(packet, unpacker, clientId);
                    break;

                case NetworkMessages.CL_INPUT:
                    NetMsgInput(packet, unpacker, clientId);
                    break;

                case NetworkMessages.CL_RCON_CMD:
                    NetMsgRconCmd(packet, unpacker, clientId);
                    break;

                case NetworkMessages.CL_RCON_AUTH:
                    NetMsgRconAuth(packet, unpacker, clientId);
                    break;

                case NetworkMessages.PING:
                    NetMsgPing(packet, unpacker, clientId);
                    break;

                default:
                    Console.Print(OutputLevel.DEBUG, "server", $"strange message clientId={clientId} msg={msg} data_size={packet.DataSize}");
                    break;
                }
            }
            else if (Clients[clientId].State >= ServerClientState.READY)
            {
                GameContext.OnMessage(msg, unpacker, clientId);
            }
        }