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); }
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); } }
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); }
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() }); }
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); }
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); }
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); }
protected virtual GameMsg_ClSay UnpackClSay(Unpacker unpacker, ref string failedOn) { return(new GameMsg_ClSay { IsTeam = unpacker.GetInt() != 0, Message = unpacker.GetString() }); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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})"); }
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); }
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); } }