public void ServerWrite(IWriteMessage outMsg, Client c) { outMsg.Write(ServerName); outMsg.Write(ServerMessageText); outMsg.Write((byte)MaxPlayers); outMsg.Write(HasPassword); outMsg.Write(IsPublic); outMsg.WritePadBits(); outMsg.WriteRangedInteger(TickRate, 1, 60); WriteExtraCargo(outMsg); Voting.ServerWrite(outMsg); if (c.HasPermission(Networking.ClientPermissions.ManageSettings)) { outMsg.Write(true); outMsg.WritePadBits(); ServerAdminWrite(outMsg, c); } else { outMsg.Write(false); outMsg.WritePadBits(); } }
public void ServerAdminWrite(IWriteMessage outMsg, Client c) { if (!c.HasPermission(ClientPermissions.ManageSettings)) { outMsg.Write(false); outMsg.WritePadBits(); return; } outMsg.Write(true); outMsg.Write(c.Connection == GameMain.Server.OwnerConnection); outMsg.Write(Enabled); outMsg.WritePadBits(); outMsg.WriteVariableUInt32((UInt32)whitelistedPlayers.Count); for (int i = 0; i < whitelistedPlayers.Count; i++) { WhiteListedPlayer whitelistedPlayer = whitelistedPlayers[i]; outMsg.Write(whitelistedPlayer.Name); outMsg.Write(whitelistedPlayer.UniqueIdentifier); if (c.Connection == GameMain.Server.OwnerConnection) { outMsg.Write(whitelistedPlayer.IP); //outMsg.Write(whitelistedPlayer.SteamID); //TODO: add steamid to whitelisted players } } }
public void ServerAdminWrite(IWriteMessage outMsg, Client c) { try { if (outMsg == null) { throw new ArgumentException("OutMsg was null"); } if (GameMain.Server == null) { throw new Exception("GameMain.Server was null"); } if (!c.HasPermission(ClientPermissions.Ban)) { outMsg.Write(false); outMsg.WritePadBits(); return; } outMsg.Write(true); outMsg.Write(c.Connection == GameMain.Server.OwnerConnection); outMsg.WritePadBits(); outMsg.WriteVariableUInt32((UInt32)bannedPlayers.Count); for (int i = 0; i < bannedPlayers.Count; i++) { BannedPlayer bannedPlayer = bannedPlayers[i]; outMsg.Write(bannedPlayer.Name); outMsg.Write(bannedPlayer.UniqueIdentifier); outMsg.Write(bannedPlayer.IsRangeBan); outMsg.Write(bannedPlayer.ExpirationTime != null); outMsg.WritePadBits(); if (bannedPlayer.ExpirationTime != null) { double hoursFromNow = (bannedPlayer.ExpirationTime.Value - DateTime.Now).TotalHours; outMsg.Write(hoursFromNow); } outMsg.Write(bannedPlayer.Reason ?? ""); if (c.Connection == GameMain.Server.OwnerConnection) { outMsg.Write(bannedPlayer.EndPoint); outMsg.Write(bannedPlayer.SteamID); } } } catch (Exception e) { string errorMsg = "Error while writing banlist. {" + e + "}\n" + e.StackTrace.CleanupStackTrace(); GameAnalyticsManager.AddErrorEventOnce("Banlist.ServerAdminWrite", GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); throw; } }
public virtual void ServerWrite(IWriteMessage msg, Client c) { msg.Write((byte)ServerNetObject.CHAT_MESSAGE); msg.Write(NetStateID); msg.Write((byte)Type); msg.Write((byte)ChangeType); msg.Write(Text); msg.Write(SenderName); msg.Write(SenderClient != null); if (SenderClient != null) { msg.Write((SenderClient.SteamID != 0) ? SenderClient.SteamID : SenderClient.ID); } msg.Write(Sender != null && c.InGame); if (Sender != null && c.InGame) { msg.Write(Sender.ID); } msg.WritePadBits(); if (Type == ChatMessageType.ServerMessageBoxInGame) { msg.Write(IconStyle); } }
public void ServerWrite(IWriteMessage msg, Client c, object[] extraData = null) { msg.WriteRangedInteger((int)CurrentState, 0, Enum.GetNames(typeof(State)).Length); switch (CurrentState) { case State.Transporting: msg.Write(ReturnCountdownStarted); msg.Write(GameMain.Server.ServerSettings.MaxTransportTime); msg.Write((float)(ReturnTime - DateTime.Now).TotalSeconds); break; case State.Waiting: msg.Write((ushort)pendingRespawnCount); msg.Write((ushort)requiredRespawnCount); msg.Write(RespawnCountdownStarted); msg.Write((float)(RespawnTime - DateTime.Now).TotalSeconds); break; case State.Returning: break; } msg.WritePadBits(); }
public virtual void ClientWrite(IWriteMessage msg, object[] extraData = null) { if (extraData != null) { switch ((NetEntityEvent.Type)extraData[0]) { case NetEntityEvent.Type.InventoryState: msg.WriteRangedInteger(0, 0, 4); Inventory.ClientWrite(msg, extraData); break; case NetEntityEvent.Type.Treatment: msg.WriteRangedInteger(1, 0, 4); msg.Write(AnimController.Anim == AnimController.Animation.CPR); break; case NetEntityEvent.Type.Status: msg.WriteRangedInteger(2, 0, 4); break; case NetEntityEvent.Type.UpdateTalents: msg.WriteRangedInteger(3, 0, 4); msg.Write((ushort)characterTalents.Count); foreach (var unlockedTalent in characterTalents) { msg.Write(unlockedTalent.Prefab.UIntIdentifier); } break; } } else { msg.Write((byte)ClientNetObject.CHARACTER_INPUT); if (memInput.Count > 60) { memInput.RemoveRange(60, memInput.Count - 60); } msg.Write(LastNetworkUpdateID); byte inputCount = Math.Min((byte)memInput.Count, (byte)60); msg.Write(inputCount); for (int i = 0; i < inputCount; i++) { msg.WriteRangedInteger((int)memInput[i].states, 0, (int)InputNetFlags.MaxVal); msg.Write(memInput[i].intAim); if (memInput[i].states.HasFlag(InputNetFlags.Select) || memInput[i].states.HasFlag(InputNetFlags.Deselect) || memInput[i].states.HasFlag(InputNetFlags.Use) || memInput[i].states.HasFlag(InputNetFlags.Health) || memInput[i].states.HasFlag(InputNetFlags.Grab)) { msg.Write(memInput[i].interact); } } } msg.WritePadBits(); }
public void ServerWrite(IWriteMessage msg, Client c, object[] extraData = null) { msg.Write(ID); IWriteMessage tempBuffer = new WriteOnlyMessage(); subBody.Body.ServerWrite(tempBuffer, c, extraData); msg.Write((byte)tempBuffer.LengthBytes); msg.Write(tempBuffer.Buffer, 0, tempBuffer.LengthBytes); msg.WritePadBits(); }
public void ClientWrite(IWriteMessage msg, VoteType voteType, object data) { msg.Write((byte)voteType); switch (voteType) { case VoteType.Sub: Submarine sub = data as Submarine; if (sub == null) { return; } msg.Write(sub.Name); break; case VoteType.Mode: GameModePreset gameMode = data as GameModePreset; if (gameMode == null) { return; } msg.Write(gameMode.Identifier); break; case VoteType.EndRound: if (!(data is bool)) { return; } msg.Write((bool)data); break; case VoteType.Kick: Client votedClient = data as Client; if (votedClient == null) { return; } msg.Write(votedClient.ID); break; case VoteType.StartRound: if (!(data is bool)) { return; } msg.Write((bool)data); break; } msg.WritePadBits(); }
public void ServerWritePosition(IWriteMessage msg, Client c, object[] extraData = null) { msg.Write(ID); IWriteMessage tempBuffer = new WriteOnlyMessage(); body.ServerWrite(tempBuffer, c, extraData); msg.WriteVariableUInt32((uint)tempBuffer.LengthBytes); msg.Write(tempBuffer.Buffer, 0, tempBuffer.LengthBytes); msg.WritePadBits(); }
public void ServerWrite(IWriteMessage msg) { if (GameMain.Server == null) { return; } msg.Write(allowSubVoting); if (allowSubVoting) { List <Pair <object, int> > voteList = GetVoteList(VoteType.Sub, GameMain.Server.ConnectedClients); msg.Write((byte)voteList.Count); foreach (Pair <object, int> vote in voteList) { msg.Write((byte)vote.Second); msg.Write(((Submarine)vote.First).Name); } } msg.Write(AllowModeVoting); if (allowModeVoting) { List <Pair <object, int> > voteList = GetVoteList(VoteType.Mode, GameMain.Server.ConnectedClients); msg.Write((byte)voteList.Count); foreach (Pair <object, int> vote in voteList) { msg.Write((byte)vote.Second); msg.Write(((GameModePreset)vote.First).Identifier); } } msg.Write(AllowEndVoting); if (AllowEndVoting) { msg.Write((byte)GameMain.Server.ConnectedClients.Count(c => c.HasSpawned && c.GetVote <bool>(VoteType.EndRound))); msg.Write((byte)GameMain.Server.ConnectedClients.Count(c => c.HasSpawned)); } msg.Write(AllowVoteKick); var readyClients = GameMain.Server.ConnectedClients.FindAll(c => c.GetVote <bool>(VoteType.StartRound)); msg.Write((byte)readyClients.Count); foreach (Client c in readyClients) { msg.Write(c.ID); } msg.WritePadBits(); }
public void WriteMonsterEnabled(IWriteMessage msg, Dictionary <string, bool> monsterEnabled = null) { //monster spawn settings if (monsterEnabled == null) { monsterEnabled = MonsterEnabled; } List <string> monsterNames = monsterEnabled.Keys.ToList(); foreach (string s in monsterNames) { msg.Write(monsterEnabled[s]); } msg.WritePadBits(); }
public virtual void Write(IWriteMessage msg) { if (!CanSend) { throw new Exception("Called Write on a VoipQueue not set up for sending"); } msg.Write((UInt16)LatestBufferID); msg.Write(ForceLocal); msg.WritePadBits(); for (int i = 0; i < BUFFER_COUNT; i++) { int index = (newestBufferInd + i + 1) % BUFFER_COUNT; msg.Write((byte)bufferLengths[index]); msg.Write(buffers[index], 0, bufferLengths[index]); } }
public override void ServerWrite(IWriteMessage msg, Client c) { msg.Write((byte)ServerNetObject.CHAT_MESSAGE); msg.Write(NetStateID); msg.Write((byte)ChatMessageType.Order); msg.Write(SenderName); msg.Write(SenderClient != null); if (SenderClient != null) { msg.Write((SenderClient.SteamID != 0) ? SenderClient.SteamID : SenderClient.ID); } msg.Write(Sender != null && c.InGame); if (Sender != null && c.InGame) { msg.Write(Sender.ID); } msg.WritePadBits(); WriteOrder(msg); }
public void ClientAdminWrite(IWriteMessage outMsg) { outMsg.Write(localEnabled); outMsg.WritePadBits(); outMsg.Write((UInt16)localRemoved.Count); foreach (UInt16 uniqueId in localRemoved) { outMsg.Write(uniqueId); } outMsg.Write((UInt16)localAdded.Count); foreach (LocalAdded lad in localAdded) { outMsg.Write(lad.Name); outMsg.Write(lad.IP); //TODO: ENCRYPT } localRemoved.Clear(); localAdded.Clear(); }
public void ServerWrite(IWriteMessage msg, Client c, object[] extraData = null) { float MaxVel = NetConfig.MaxPhysicsBodyVelocity; float MaxAngularVel = NetConfig.MaxPhysicsBodyAngularVelocity; msg.Write(SimPosition.X); msg.Write(SimPosition.Y); #if DEBUG if (Math.Abs(FarseerBody.LinearVelocity.X) > MaxVel || Math.Abs(FarseerBody.LinearVelocity.Y) > MaxVel) { DebugConsole.ThrowError($"Entity velocity out of range ({(UserData?.ToString() ?? "null")}, {FarseerBody.LinearVelocity})"); } #endif msg.Write(FarseerBody.Awake); msg.Write(FarseerBody.FixedRotation); if (!FarseerBody.FixedRotation) { msg.WriteRangedSingle(MathUtils.WrapAngleTwoPi(FarseerBody.Rotation), 0.0f, MathHelper.TwoPi, 8); } if (FarseerBody.Awake) { FarseerBody.Enabled = true; FarseerBody.LinearVelocity = new Vector2( MathHelper.Clamp(FarseerBody.LinearVelocity.X, -MaxVel, MaxVel), MathHelper.Clamp(FarseerBody.LinearVelocity.Y, -MaxVel, MaxVel)); msg.WriteRangedSingle(FarseerBody.LinearVelocity.X, -MaxVel, MaxVel, 12); msg.WriteRangedSingle(FarseerBody.LinearVelocity.Y, -MaxVel, MaxVel, 12); if (!FarseerBody.FixedRotation) { FarseerBody.AngularVelocity = MathHelper.Clamp(FarseerBody.AngularVelocity, -MaxAngularVel, MaxAngularVel); msg.WriteRangedSingle(FarseerBody.AngularVelocity, -MaxAngularVel, MaxAngularVel, 8); } } msg.WritePadBits(); }
public void ClientWrite(IWriteMessage msg, VoteType voteType, object data) { msg.Write((byte)voteType); switch (voteType) { case VoteType.Sub: if (!(data is SubmarineInfo sub)) { return; } msg.Write(sub.EqualityCheckVal); if (sub.EqualityCheckVal == 0) { //sub doesn't exist client-side, use hash to let the server know which one we voted for msg.Write(sub.MD5Hash.Hash); } break; case VoteType.Mode: if (!(data is GameModePreset gameMode)) { return; } msg.Write(gameMode.Identifier); break; case VoteType.EndRound: if (!(data is bool)) { return; } msg.Write((bool)data); break; case VoteType.Kick: if (!(data is Client votedClient)) { return; } msg.Write(votedClient.ID); break; case VoteType.StartRound: if (!(data is bool)) { return; } msg.Write((bool)data); break; case VoteType.PurchaseAndSwitchSub: case VoteType.PurchaseSub: case VoteType.SwitchSub: if (!VoteRunning) { SubmarineInfo voteSub = data as SubmarineInfo; if (voteSub == null) { return; } msg.Write(true); msg.Write(voteSub.Name); } else { if (!(data is int)) { return; } msg.Write(false); msg.Write((int)data); } break; } msg.WritePadBits(); }
public virtual void ServerWrite(IWriteMessage msg, Client c, object[] extraData = null) { if (GameMain.Server == null) { return; } if (extraData != null) { const int min = 0, max = 13; switch ((NetEntityEvent.Type)extraData[0]) { case NetEntityEvent.Type.InventoryState: msg.WriteRangedInteger(0, min, max); msg.Write(GameMain.Server.EntityEventManager.Events.Last()?.ID ?? (ushort)0); Inventory.ServerWrite(msg, c); break; case NetEntityEvent.Type.Control: msg.WriteRangedInteger(1, min, max); Client owner = (Client)extraData[1]; msg.Write(owner != null && owner.Character == this && GameMain.Server.ConnectedClients.Contains(owner) ? owner.ID : (byte)0); break; case NetEntityEvent.Type.Status: msg.WriteRangedInteger(2, min, max); WriteStatus(msg); break; case NetEntityEvent.Type.UpdateSkills: msg.WriteRangedInteger(3, min, max); if (Info?.Job == null) { msg.Write((byte)0); } else { msg.Write((byte)Info.Job.Skills.Count); foreach (Skill skill in Info.Job.Skills) { msg.Write(skill.Identifier); msg.Write(skill.Level); } } break; case NetEntityEvent.Type.SetAttackTarget: case NetEntityEvent.Type.ExecuteAttack: Limb attackLimb = extraData[1] as Limb; UInt16 targetEntityID = (UInt16)extraData[2]; int targetLimbIndex = extraData.Length > 3 ? (int)extraData[3] : 0; msg.WriteRangedInteger(extraData[0] is NetEntityEvent.Type.SetAttackTarget ? 4 : 5, min, max); msg.Write((byte)(Removed ? 255 : Array.IndexOf(AnimController.Limbs, attackLimb))); msg.Write(targetEntityID); msg.Write((byte)targetLimbIndex); msg.Write(extraData.Length > 4 ? (float)extraData[4] : 0); msg.Write(extraData.Length > 5 ? (float)extraData[5] : 0); break; case NetEntityEvent.Type.AssignCampaignInteraction: msg.WriteRangedInteger(6, min, max); msg.Write((byte)CampaignInteractionType); msg.Write(RequireConsciousnessForCustomInteract); break; case NetEntityEvent.Type.ObjectiveManagerState: msg.WriteRangedInteger(7, min, max); int type = (extraData[1] as string) switch { "order" => 1, "objective" => 2, _ => 0 }; msg.WriteRangedInteger(type, 0, 2); if (!(AIController is HumanAIController controller)) { msg.Write(false); break; } if (type == 1) { var currentOrderInfo = controller.ObjectiveManager.GetCurrentOrderInfo(); bool validOrder = currentOrderInfo.HasValue; msg.Write(validOrder); if (!validOrder) { break; } var orderPrefab = currentOrderInfo.Value.Order.Prefab; int orderIndex = Order.PrefabList.IndexOf(orderPrefab); msg.WriteRangedInteger(orderIndex, 0, Order.PrefabList.Count); if (!orderPrefab.HasOptions) { break; } int optionIndex = orderPrefab.AllOptions.IndexOf(currentOrderInfo.Value.OrderOption); if (optionIndex == -1) { DebugConsole.AddWarning($"Error while writing order data. Order option \"{(currentOrderInfo.Value.OrderOption ?? null)}\" not found in the order prefab \"{orderPrefab.Name}\"."); } msg.WriteRangedInteger(optionIndex, -1, orderPrefab.AllOptions.Length); } else if (type == 2) { var objective = controller.ObjectiveManager.CurrentObjective; bool validObjective = !string.IsNullOrEmpty(objective?.Identifier); msg.Write(validObjective); if (!validObjective) { break; } msg.Write(objective.Identifier); msg.Write(objective.Option ?? ""); UInt16 targetEntityId = 0; if (objective is AIObjectiveOperateItem operateObjective && operateObjective.OperateTarget != null) { targetEntityId = operateObjective.OperateTarget.ID; } msg.Write(targetEntityId); } break; case NetEntityEvent.Type.TeamChange: msg.WriteRangedInteger(8, min, max); msg.Write((byte)TeamID); break; case NetEntityEvent.Type.AddToCrew: msg.WriteRangedInteger(9, min, max); msg.Write((byte)(CharacterTeamType)extraData[1]); // team id ushort[] inventoryItemIDs = (ushort[])extraData[2]; msg.Write((ushort)inventoryItemIDs.Length); for (int i = 0; i < inventoryItemIDs.Length; i++) { msg.Write(inventoryItemIDs[i]); } break; case NetEntityEvent.Type.UpdateExperience: msg.WriteRangedInteger(10, min, max); msg.Write(Info.ExperiencePoints); break; case NetEntityEvent.Type.UpdateTalents: msg.WriteRangedInteger(11, min, max); msg.Write((ushort)characterTalents.Count); foreach (var unlockedTalent in characterTalents) { msg.Write(unlockedTalent.AddedThisRound); msg.Write(unlockedTalent.Prefab.UIntIdentifier); } break; case NetEntityEvent.Type.UpdateMoney: msg.WriteRangedInteger(12, min, max); msg.Write(GameMain.GameSession.Campaign.Money); break; case NetEntityEvent.Type.UpdatePermanentStats: msg.WriteRangedInteger(13, min, max); if (Info == null || extraData.Length < 2 || !(extraData[1] is StatTypes statType)) { msg.Write((byte)0); msg.Write((byte)0); } else if (!Info.SavedStatValues.ContainsKey(statType)) { msg.Write((byte)0); msg.Write((byte)statType); } else { msg.Write((byte)Info.SavedStatValues[statType].Count); msg.Write((byte)statType); foreach (var savedStatValue in Info.SavedStatValues[statType]) { msg.Write(savedStatValue.StatIdentifier); msg.Write(savedStatValue.StatValue); msg.Write(savedStatValue.RemoveOnDeath); } } break; default: DebugConsole.ThrowError("Invalid NetworkEvent type for entity " + ToString() + " (" + (NetEntityEvent.Type)extraData[0] + ")"); break; } msg.WritePadBits(); } else { msg.Write(ID); IWriteMessage tempBuffer = new WriteOnlyMessage(); if (this == c.Character) { tempBuffer.Write(true); if (LastNetworkUpdateID < memInput.Count + 1) { tempBuffer.Write((UInt16)0); } else { tempBuffer.Write((UInt16)(LastNetworkUpdateID - memInput.Count - 1)); } } else { tempBuffer.Write(false); bool aiming = false; bool use = false; bool attack = false; bool shoot = false; if (IsRemotePlayer) { aiming = dequeuedInput.HasFlag(InputNetFlags.Aim); use = dequeuedInput.HasFlag(InputNetFlags.Use); attack = dequeuedInput.HasFlag(InputNetFlags.Attack); shoot = dequeuedInput.HasFlag(InputNetFlags.Shoot); } else if (keys != null) { aiming = keys[(int)InputType.Aim].GetHeldQueue; use = keys[(int)InputType.Use].GetHeldQueue; attack = keys[(int)InputType.Attack].GetHeldQueue; shoot = keys[(int)InputType.Shoot].GetHeldQueue; networkUpdateSent = true; } tempBuffer.Write(aiming); tempBuffer.Write(shoot); tempBuffer.Write(use); if (AnimController is HumanoidAnimController) { tempBuffer.Write(((HumanoidAnimController)AnimController).Crouching); } tempBuffer.Write(attack); Vector2 relativeCursorPos = cursorPosition - AimRefPosition; tempBuffer.Write((UInt16)(65535.0 * Math.Atan2(relativeCursorPos.Y, relativeCursorPos.X) / (2.0 * Math.PI))); tempBuffer.Write(IsRagdolled || Stun > 0.0f || IsDead || IsIncapacitated); tempBuffer.Write(AnimController.Dir > 0.0f); } if (SelectedCharacter != null || SelectedConstruction != null) { tempBuffer.Write(true); tempBuffer.Write(SelectedCharacter != null ? SelectedCharacter.ID : NullEntityID); tempBuffer.Write(SelectedConstruction != null ? SelectedConstruction.ID : NullEntityID); if (SelectedCharacter != null) { tempBuffer.Write(AnimController.Anim == AnimController.Animation.CPR); } } else { tempBuffer.Write(false); } tempBuffer.Write(SimPosition.X); tempBuffer.Write(SimPosition.Y); float MaxVel = NetConfig.MaxPhysicsBodyVelocity; AnimController.Collider.LinearVelocity = new Vector2( MathHelper.Clamp(AnimController.Collider.LinearVelocity.X, -MaxVel, MaxVel), MathHelper.Clamp(AnimController.Collider.LinearVelocity.Y, -MaxVel, MaxVel)); tempBuffer.WriteRangedSingle(AnimController.Collider.LinearVelocity.X, -MaxVel, MaxVel, 12); tempBuffer.WriteRangedSingle(AnimController.Collider.LinearVelocity.Y, -MaxVel, MaxVel, 12); bool fixedRotation = AnimController.Collider.FarseerBody.FixedRotation || !AnimController.Collider.PhysEnabled; tempBuffer.Write(fixedRotation); if (!fixedRotation) { tempBuffer.Write(AnimController.Collider.Rotation); float MaxAngularVel = NetConfig.MaxPhysicsBodyAngularVelocity; AnimController.Collider.AngularVelocity = NetConfig.Quantize(AnimController.Collider.AngularVelocity, -MaxAngularVel, MaxAngularVel, 8); tempBuffer.WriteRangedSingle(MathHelper.Clamp(AnimController.Collider.AngularVelocity, -MaxAngularVel, MaxAngularVel), -MaxAngularVel, MaxAngularVel, 8); } bool writeStatus = healthUpdateTimer <= 0.0f; tempBuffer.Write(writeStatus); if (writeStatus) { WriteStatus(tempBuffer); AIController?.ServerWrite(tempBuffer); HealthUpdatePending = false; } tempBuffer.WritePadBits(); msg.WriteVariableUInt32((uint)tempBuffer.LengthBytes); msg.Write(tempBuffer.Buffer, 0, tempBuffer.LengthBytes); } }
public virtual void ServerWrite(IWriteMessage msg, Client c, object[] extraData = null) { if (GameMain.Server == null) { return; } if (extraData != null) { switch ((NetEntityEvent.Type)extraData[0]) { case NetEntityEvent.Type.InventoryState: msg.WriteRangedInteger(0, 0, 5); msg.Write(GameMain.Server.EntityEventManager.Events.Last()?.ID ?? (ushort)0); Inventory.ServerWrite(msg, c); break; case NetEntityEvent.Type.Control: msg.WriteRangedInteger(1, 0, 5); Client owner = (Client)extraData[1]; msg.Write(owner != null && owner.Character == this && GameMain.Server.ConnectedClients.Contains(owner) ? owner.ID : (byte)0); break; case NetEntityEvent.Type.Status: msg.WriteRangedInteger(2, 0, 5); WriteStatus(msg); break; case NetEntityEvent.Type.UpdateSkills: msg.WriteRangedInteger(3, 0, 5); if (Info?.Job == null) { msg.Write((byte)0); } else { msg.Write((byte)Info.Job.Skills.Count); foreach (Skill skill in Info.Job.Skills) { msg.Write(skill.Identifier); msg.Write(skill.Level); } } break; case NetEntityEvent.Type.ExecuteAttack: Limb attackLimb = extraData[1] as Limb; UInt16 targetEntityID = (UInt16)extraData[2]; int targetLimbIndex = extraData.Length > 3 ? (int)extraData[3] : 0; msg.WriteRangedInteger(4, 0, 5); msg.Write((byte)(Removed ? 255 : Array.IndexOf(AnimController.Limbs, attackLimb))); msg.Write(targetEntityID); msg.Write((byte)targetLimbIndex); break; case NetEntityEvent.Type.AssignCampaignInteraction: msg.WriteRangedInteger(5, 0, 5); msg.Write((byte)CampaignInteractionType); break; default: DebugConsole.ThrowError("Invalid NetworkEvent type for entity " + ToString() + " (" + (NetEntityEvent.Type)extraData[0] + ")"); break; } msg.WritePadBits(); } else { msg.Write(ID); IWriteMessage tempBuffer = new WriteOnlyMessage(); if (this == c.Character) { tempBuffer.Write(true); if (LastNetworkUpdateID < memInput.Count + 1) { tempBuffer.Write((UInt16)0); } else { tempBuffer.Write((UInt16)(LastNetworkUpdateID - memInput.Count - 1)); } } else { tempBuffer.Write(false); bool aiming = false; bool use = false; bool attack = false; bool shoot = false; if (IsRemotePlayer) { aiming = dequeuedInput.HasFlag(InputNetFlags.Aim); use = dequeuedInput.HasFlag(InputNetFlags.Use); attack = dequeuedInput.HasFlag(InputNetFlags.Attack); shoot = dequeuedInput.HasFlag(InputNetFlags.Shoot); } else if (keys != null) { aiming = keys[(int)InputType.Aim].GetHeldQueue; use = keys[(int)InputType.Use].GetHeldQueue; attack = keys[(int)InputType.Attack].GetHeldQueue; shoot = keys[(int)InputType.Shoot].GetHeldQueue; networkUpdateSent = true; } tempBuffer.Write(aiming); tempBuffer.Write(shoot); tempBuffer.Write(use); if (AnimController is HumanoidAnimController) { tempBuffer.Write(((HumanoidAnimController)AnimController).Crouching); } tempBuffer.Write(attack); Vector2 relativeCursorPos = cursorPosition - AimRefPosition; tempBuffer.Write((UInt16)(65535.0 * Math.Atan2(relativeCursorPos.Y, relativeCursorPos.X) / (2.0 * Math.PI))); tempBuffer.Write(IsRagdolled || Stun > 0.0f || IsDead || IsIncapacitated); tempBuffer.Write(AnimController.Dir > 0.0f); } if (SelectedCharacter != null || SelectedConstruction != null) { tempBuffer.Write(true); tempBuffer.Write(SelectedCharacter != null ? SelectedCharacter.ID : NullEntityID); tempBuffer.Write(SelectedConstruction != null ? SelectedConstruction.ID : NullEntityID); if (SelectedCharacter != null) { tempBuffer.Write(AnimController.Anim == AnimController.Animation.CPR); } } else { tempBuffer.Write(false); } tempBuffer.Write(SimPosition.X); tempBuffer.Write(SimPosition.Y); float MaxVel = NetConfig.MaxPhysicsBodyVelocity; AnimController.Collider.LinearVelocity = new Vector2( MathHelper.Clamp(AnimController.Collider.LinearVelocity.X, -MaxVel, MaxVel), MathHelper.Clamp(AnimController.Collider.LinearVelocity.Y, -MaxVel, MaxVel)); tempBuffer.WriteRangedSingle(AnimController.Collider.LinearVelocity.X, -MaxVel, MaxVel, 12); tempBuffer.WriteRangedSingle(AnimController.Collider.LinearVelocity.Y, -MaxVel, MaxVel, 12); bool fixedRotation = AnimController.Collider.FarseerBody.FixedRotation || !AnimController.Collider.PhysEnabled; tempBuffer.Write(fixedRotation); if (!fixedRotation) { tempBuffer.Write(AnimController.Collider.Rotation); float MaxAngularVel = NetConfig.MaxPhysicsBodyAngularVelocity; AnimController.Collider.AngularVelocity = NetConfig.Quantize(AnimController.Collider.AngularVelocity, -MaxAngularVel, MaxAngularVel, 8); tempBuffer.WriteRangedSingle(MathHelper.Clamp(AnimController.Collider.AngularVelocity, -MaxAngularVel, MaxAngularVel), -MaxAngularVel, MaxAngularVel, 8); } bool writeStatus = healthUpdateTimer <= 0.0f; tempBuffer.Write(writeStatus); if (writeStatus) { WriteStatus(tempBuffer); HealthUpdatePending = false; } tempBuffer.WritePadBits(); msg.WriteVariableUInt32((uint)tempBuffer.LengthBytes); msg.Write(tempBuffer.Buffer, 0, tempBuffer.LengthBytes); } }
public void ServerWrite(IWriteMessage msg) { if (GameMain.Server == null) { return; } msg.Write(allowSubVoting); if (allowSubVoting) { List <Pair <object, int> > voteList = GetVoteList(VoteType.Sub, GameMain.Server.ConnectedClients); msg.Write((byte)voteList.Count); foreach (Pair <object, int> vote in voteList) { msg.Write((byte)vote.Second); msg.Write(((SubmarineInfo)vote.First).Name); } } msg.Write(AllowModeVoting); if (allowModeVoting) { List <Pair <object, int> > voteList = GetVoteList(VoteType.Mode, GameMain.Server.ConnectedClients); msg.Write((byte)voteList.Count); foreach (Pair <object, int> vote in voteList) { msg.Write((byte)vote.Second); msg.Write(((GameModePreset)vote.First).Identifier); } } msg.Write(AllowEndVoting); if (AllowEndVoting) { msg.Write((byte)GameMain.Server.ConnectedClients.Count(c => c.HasSpawned && c.GetVote <bool>(VoteType.EndRound))); msg.Write((byte)GameMain.Server.ConnectedClients.Count(c => c.HasSpawned)); } msg.Write(AllowVoteKick); msg.Write((byte)SubVote.State); if (SubVote.State != VoteState.None) { msg.Write((byte)SubVote.VoteType); if (SubVote.VoteType != VoteType.Unknown) { var yesClients = GameMain.Server.ConnectedClients.FindAll(c => c.GetVote <int>(SubVote.VoteType) == 2); msg.Write((byte)yesClients.Count); foreach (Client c in yesClients) { msg.Write(c.ID); } var noClients = GameMain.Server.ConnectedClients.FindAll(c => c.GetVote <int>(SubVote.VoteType) == 1); msg.Write((byte)noClients.Count); foreach (Client c in noClients) { msg.Write(c.ID); } msg.Write((byte)GameMain.Server.SubmarineVoteMax); switch (SubVote.State) { case VoteState.Started: msg.Write(SubVote.Sub.Name); msg.Write(SubVote.VoteStarter.ID); msg.Write((byte)GameMain.Server.ServerSettings.SubmarineVoteTimeout); break; case VoteState.Running: // Nothing specific break; case VoteState.Passed: case VoteState.Failed: msg.Write(SubVote.State == VoteState.Passed); msg.Write(SubVote.Sub.Name); if (SubVote.State == VoteState.Passed) { msg.Write((short)SubVote.DeliveryFee); } break; } } } var readyClients = GameMain.Server.ConnectedClients.FindAll(c => c.GetVote <bool>(VoteType.StartRound)); msg.Write((byte)readyClients.Count); foreach (Client c in readyClients) { msg.Write(c.ID); } msg.WritePadBits(); }
public void ClientWrite(IWriteMessage msg, VoteType voteType, object data) { msg.Write((byte)voteType); switch (voteType) { case VoteType.Sub: SubmarineInfo sub = data as SubmarineInfo; if (sub == null) { return; } msg.Write(sub.EqualityCheckVal); break; case VoteType.Mode: GameModePreset gameMode = data as GameModePreset; if (gameMode == null) { return; } msg.Write(gameMode.Identifier); break; case VoteType.EndRound: if (!(data is bool)) { return; } msg.Write((bool)data); break; case VoteType.Kick: Client votedClient = data as Client; if (votedClient == null) { return; } msg.Write(votedClient.ID); break; case VoteType.StartRound: if (!(data is bool)) { return; } msg.Write((bool)data); break; case VoteType.PurchaseAndSwitchSub: case VoteType.PurchaseSub: case VoteType.SwitchSub: if (!VoteRunning) { SubmarineInfo voteSub = data as SubmarineInfo; if (voteSub == null) { return; } msg.Write(true); msg.Write(voteSub.Name); } else { if (!(data is int)) { return; } msg.Write(false); msg.Write((int)data); } break; } msg.WritePadBits(); }