public void ClientRead(ServerNetObject type, IReadMessage msg, float sendingTime) { if (correctionTimer > 0.0f) { StartDelayedCorrection(type, msg.ExtractBits(1 + 1 + 8 + 8 + 8 + 8), sendingTime); return; } AutoTemp = msg.ReadBoolean(); PowerOn = msg.ReadBoolean(); Temperature = msg.ReadRangedSingle(0.0f, 100.0f, 8); targetFissionRate = msg.ReadRangedSingle(0.0f, 100.0f, 8); targetTurbineOutput = msg.ReadRangedSingle(0.0f, 100.0f, 8); degreeOfSuccess = msg.ReadRangedSingle(0.0f, 1.0f, 8); if (Math.Abs(FissionRateScrollBar.BarScroll - targetFissionRate / 100.0f) > 0.01f) { FissionRateScrollBar.BarScroll = targetFissionRate / 100.0f; } if (Math.Abs(TurbineOutputScrollBar.BarScroll - targetTurbineOutput / 100.0f) > 0.01f) { TurbineOutputScrollBar.BarScroll = targetTurbineOutput / 100.0f; } IsActive = true; }
public void ClientRead(IReadMessage incMsg) { cachedServerListInfo = null; ServerName = incMsg.ReadString(); ServerMessageText = incMsg.ReadString(); MaxPlayers = incMsg.ReadByte(); HasPassword = incMsg.ReadBoolean(); IsPublic = incMsg.ReadBoolean(); GameMain.NetLobbyScreen.SetPublic(IsPublic); AllowFileTransfers = incMsg.ReadBoolean(); incMsg.ReadPadBits(); TickRate = incMsg.ReadRangedInteger(1, 60); GameMain.NetworkMember.TickRate = TickRate; ReadExtraCargo(incMsg); Voting.ClientRead(incMsg); bool isAdmin = incMsg.ReadBoolean(); incMsg.ReadPadBits(); if (isAdmin) { ClientAdminRead(incMsg); } }
public void ClientRead(ServerNetObject type, IReadMessage msg, float sendingTime) { var newState = (State)msg.ReadRangedInteger(0, Enum.GetNames(typeof(State)).Length); switch (newState) { case State.Transporting: ReturnCountdownStarted = msg.ReadBoolean(); maxTransportTime = msg.ReadSingle(); float transportTimeLeft = msg.ReadSingle(); ReturnTime = DateTime.Now + new TimeSpan(0, 0, 0, 0, milliseconds: (int)(transportTimeLeft * 1000.0f)); RespawnCountdownStarted = false; if (CurrentState != newState) { CoroutineManager.StopCoroutines("forcepos"); //CoroutineManager.StartCoroutine(ForceShuttleToPos(Level.Loaded.StartPosition - Vector2.UnitY * Level.ShaftHeight, 100.0f), "forcepos"); } break; case State.Waiting: RespawnCountdownStarted = msg.ReadBoolean(); ResetShuttle(); float newRespawnTime = msg.ReadSingle(); RespawnTime = DateTime.Now + new TimeSpan(0, 0, 0, 0, milliseconds: (int)(newRespawnTime * 1000.0f)); break; case State.Returning: RespawnCountdownStarted = false; break; } CurrentState = newState; msg.ReadPadBits(); }
public override void ClientRead(ServerNetObject type, IReadMessage msg, float sendingTime) { base.ClientRead(type, msg, sendingTime); bool open = msg.ReadBoolean(); bool broken = msg.ReadBoolean(); bool forcedOpen = msg.ReadBoolean(); bool isStuck = msg.ReadBoolean(); SetState(open, isNetworkMessage: true, sendNetworkMessage: false, forcedOpen: forcedOpen); stuck = msg.ReadRangedSingle(0.0f, 100.0f, 8); UInt16 lastUserID = msg.ReadUInt16(); Character user = lastUserID == 0 ? null : Entity.FindEntityByID(lastUserID) as Character; if (user != lastUser) { lastUser = user; toggleCooldownTimer = ToggleCoolDown; } this.isStuck = isStuck; if (isStuck) { OpenState = 0.0f; } IsBroken = broken; PredictedState = null; }
public virtual bool Read(IReadMessage msg, bool discardData = false) { if (!CanReceive) { throw new Exception("Called Read on a VoipQueue not set up for receiving"); } UInt16 incLatestBufferID = msg.ReadUInt16(); if ((firstRead || NetIdUtils.IdMoreRecent(incLatestBufferID, LatestBufferID)) && !discardData) { ForceLocal = msg.ReadBoolean(); msg.ReadPadBits(); firstRead = false; for (int i = 0; i < BUFFER_COUNT; i++) { bufferLengths[i] = msg.ReadByte(); buffers[i] = msg.ReadBytes(bufferLengths[i]); } newestBufferInd = BUFFER_COUNT - 1; LatestBufferID = incLatestBufferID; LastReadTime = DateTime.Now; return(true); } else { msg.ReadBoolean(); msg.ReadPadBits(); for (int i = 0; i < BUFFER_COUNT; i++) { byte len = msg.ReadByte(); msg.BitPosition += len * 8; } return(false); } }
public void ClientRead(ServerNetObject type, IReadMessage msg, float sendingTime) { int msgStartPos = msg.BitPosition; float flowPercentage = msg.ReadRangedInteger(-10, 10) * 10.0f; bool isActive = msg.ReadBoolean(); bool hijacked = msg.ReadBoolean(); float?targetLevel; if (msg.ReadBoolean()) { targetLevel = msg.ReadSingle(); } else { targetLevel = null; } if (correctionTimer > 0.0f) { int msgLength = msg.BitPosition - msgStartPos; msg.BitPosition = msgStartPos; StartDelayedCorrection(type, msg.ExtractBits(msgLength), sendingTime); return; } FlowPercentage = flowPercentage; IsActive = isActive; Hijacked = hijacked; TargetLevel = targetLevel; }
public void ClientRead(ServerNetObject type, IReadMessage msg, float sendingTime) { deteriorationTimer = msg.ReadSingle(); deteriorateAlwaysResetTimer = msg.ReadSingle(); DeteriorateAlways = msg.ReadBoolean(); CurrentFixer = msg.ReadBoolean() ? Character.Controlled : null; currentFixerAction = (FixActions)msg.ReadRangedInteger(0, 2); }
public PosInfo ClientRead(ServerNetObject type, IReadMessage msg, float sendingTime, string parentDebugName) { float MaxVel = NetConfig.MaxPhysicsBodyVelocity; float MaxAngularVel = NetConfig.MaxPhysicsBodyAngularVelocity; Vector2 newPosition = SimPosition; float? newRotation = null; bool awake = FarseerBody.Awake; Vector2 newVelocity = LinearVelocity; float? newAngularVelocity = null; newPosition = new Vector2( msg.ReadSingle(), msg.ReadSingle()); awake = msg.ReadBoolean(); bool fixedRotation = msg.ReadBoolean(); if (!fixedRotation) { newRotation = msg.ReadRangedSingle(0.0f, MathHelper.TwoPi, 8); } if (awake) { newVelocity = new Vector2( msg.ReadRangedSingle(-MaxVel, MaxVel, 12), msg.ReadRangedSingle(-MaxVel, MaxVel, 12)); newVelocity = NetConfig.Quantize(newVelocity, -MaxVel, MaxVel, 12); if (!fixedRotation) { newAngularVelocity = msg.ReadRangedSingle(-MaxAngularVel, MaxAngularVel, 8); newAngularVelocity = NetConfig.Quantize(newAngularVelocity.Value, -MaxAngularVel, MaxAngularVel, 8); } } msg.ReadPadBits(); if (!MathUtils.IsValid(newPosition) || !MathUtils.IsValid(newVelocity) || (newRotation.HasValue && !MathUtils.IsValid(newRotation.Value)) || (newAngularVelocity.HasValue && !MathUtils.IsValid(newAngularVelocity.Value))) { string errorMsg = "Received invalid position data for \"" + parentDebugName + "\" (position: " + newPosition + ", rotation: " + (newRotation ?? 0) + ", velocity: " + newVelocity + ", angular velocity: " + (newAngularVelocity ?? 0) + ")"; #if DEBUG DebugConsole.ThrowError(errorMsg); #endif GameAnalyticsManager.AddErrorEventOnce("PhysicsBody.ClientRead:InvalidData" + parentDebugName, GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); return(null); } return(lastProcessedNetworkState > sendingTime ? null : new PosInfo(newPosition, newRotation, newVelocity, newAngularVelocity, sendingTime)); }
public void ClientRead(IReadMessage inc) { AllowSubVoting = inc.ReadBoolean(); if (allowSubVoting) { UpdateVoteTexts(null, VoteType.Sub); int votableCount = inc.ReadByte(); for (int i = 0; i < votableCount; i++) { int votes = inc.ReadByte(); string subName = inc.ReadString(); List <Submarine> serversubs = new List <Submarine>(); foreach (GUIComponent item in GameMain.NetLobbyScreen?.SubList?.Content?.Children) { if (item.UserData != null && item.UserData is Submarine) { serversubs.Add(item.UserData as Submarine); } } Submarine sub = serversubs.FirstOrDefault(sm => sm.Name == subName); SetVoteText(GameMain.NetLobbyScreen.SubList, sub, votes); } } AllowModeVoting = inc.ReadBoolean(); if (allowModeVoting) { UpdateVoteTexts(null, VoteType.Mode); int votableCount = inc.ReadByte(); for (int i = 0; i < votableCount; i++) { int votes = inc.ReadByte(); string modeIdentifier = inc.ReadString(); GameModePreset mode = GameModePreset.List.Find(m => m.Identifier == modeIdentifier); SetVoteText(GameMain.NetLobbyScreen.ModeList, mode, votes); } } AllowEndVoting = inc.ReadBoolean(); if (AllowEndVoting) { GameMain.NetworkMember.EndVoteCount = inc.ReadByte(); GameMain.NetworkMember.EndVoteMax = inc.ReadByte(); } AllowVoteKick = inc.ReadBoolean(); GameMain.NetworkMember.ConnectedClients.ForEach(c => c.SetVote(VoteType.StartRound, false)); byte readyClientCount = inc.ReadByte(); for (int i = 0; i < readyClientCount; i++) { byte clientID = inc.ReadByte(); var matchingClient = GameMain.NetworkMember.ConnectedClients.Find(c => c.ID == clientID); matchingClient?.SetVote(VoteType.StartRound, true); } UpdateVoteTexts(GameMain.NetworkMember.ConnectedClients, VoteType.StartRound); inc.ReadPadBits(); }
public void ClientAdminRead(IReadMessage incMsg) { bool hasPermission = incMsg.ReadBoolean(); if (!hasPermission) { incMsg.ReadPadBits(); return; } bool isOwner = incMsg.ReadBoolean(); incMsg.ReadPadBits(); bannedPlayers.Clear(); UInt32 bannedPlayerCount = incMsg.ReadVariableUInt32(); for (int i = 0; i < (int)bannedPlayerCount; i++) { string name = incMsg.ReadString(); UInt16 uniqueIdentifier = incMsg.ReadUInt16(); bool isRangeBan = incMsg.ReadBoolean(); bool includesExpiration = incMsg.ReadBoolean(); incMsg.ReadPadBits(); DateTime?expiration = null; if (includesExpiration) { double hoursFromNow = incMsg.ReadDouble(); expiration = DateTime.Now + TimeSpan.FromHours(hoursFromNow); } string reason = incMsg.ReadString(); string endPoint = ""; UInt64 steamID = 0; if (isOwner) { endPoint = incMsg.ReadString(); steamID = incMsg.ReadUInt64(); } else { endPoint = "Endpoint concealed by host"; steamID = 0; } bannedPlayers.Add(new BannedPlayer(name, uniqueIdentifier, isRangeBan, endPoint, steamID, reason, expiration)); } if (banFrame != null) { var parent = banFrame.Parent; parent.RemoveChild(banFrame); CreateBanFrame(parent); } }
public void ClientReadCrew(IReadMessage msg) { ushort availableHireLength = msg.ReadUInt16(); List <CharacterInfo> availableHires = new List <CharacterInfo>(); for (int i = 0; i < availableHireLength; i++) { CharacterInfo hire = CharacterInfo.ClientRead("human", msg); hire.Salary = msg.ReadInt32(); availableHires.Add(hire); } ushort pendingHireLength = msg.ReadUInt16(); List <int> pendingHires = new List <int>(); for (int i = 0; i < pendingHireLength; i++) { pendingHires.Add(msg.ReadInt32()); } bool validateHires = msg.ReadBoolean(); bool fireCharacter = msg.ReadBoolean(); int firedIdentifier = -1; if (fireCharacter) { firedIdentifier = msg.ReadInt32(); } if (fireCharacter) { CharacterInfo firedCharacter = CrewManager.CharacterInfos.FirstOrDefault(info => info.GetIdentifier() == firedIdentifier); // this one might and is allowed to be null since the character is already fired on the original sender's game if (firedCharacter != null) { CrewManager.FireCharacter(firedCharacter); } } if (map?.CurrentLocation?.HireManager != null && CampaignUI?.CrewManagement != null) { CampaignUI?.CrewManagement?.SetHireables(map.CurrentLocation, availableHires); if (validateHires) { CampaignUI?.CrewManagement.ValidatePendingHires(); } CampaignUI?.CrewManagement?.SetPendingHires(pendingHires, map?.CurrentLocation); if (fireCharacter) { CampaignUI?.CrewManagement.UpdateCrew(); } } }
public void ClientRead(ServerNetObject type, IReadMessage msg, float sendingTime) { bool isDocked = msg.ReadBoolean(); for (int i = 0; i < 2; i++) { if (hulls[i] == null) { continue; } item.linkedTo.Remove(hulls[i]); hulls[i].Remove(); hulls[i] = null; } if (gap != null) { item.linkedTo.Remove(gap); gap.Remove(); gap = null; } if (isDocked) { ushort dockingTargetID = msg.ReadUInt16(); bool isLocked = msg.ReadBoolean(); Entity targetEntity = Entity.FindEntityByID(dockingTargetID); if (targetEntity == null || !(targetEntity is Item)) { DebugConsole.ThrowError("Invalid docking port network event (can't dock to " + targetEntity.ToString() + ")"); return; } DockingTarget = (targetEntity as Item).GetComponent <DockingPort>(); if (DockingTarget == null) { DebugConsole.ThrowError("Invalid docking port network event (" + targetEntity + " doesn't have a docking port component)"); return; } Dock(DockingTarget); if (isLocked) { Lock(isNetworkMessage: true, forcePosition: true); } } else { Undock(); } }
public override void ClientRead(ServerNetObject type, IReadMessage msg, float sendingTime) { base.ClientRead(type, msg, sendingTime); bool open = msg.ReadBoolean(); bool forcedOpen = msg.ReadBoolean(); SetState(open, isNetworkMessage: true, sendNetworkMessage: false, forcedOpen: forcedOpen); Stuck = msg.ReadRangedSingle(0.0f, 100.0f, 8); PredictedState = null; }
public override void ClientReadInitial(IReadMessage msg) { base.ClientReadInitial(msg); ushort targetItemCount = msg.ReadUInt16(); for (int i = 0; i < targetItemCount; i++) { var item = Item.ReadSpawnData(msg); items.Add(item); } byte characterCount = msg.ReadByte(); for (int i = 0; i < characterCount; i++) { Character character = Character.ReadSpawnData(msg); characters.Add(character); if (msg.ReadBoolean()) { requireKill.Add(character); } if (msg.ReadBoolean()) { requireRescue.Add(character); #if CLIENT GameMain.GameSession.CrewManager.AddCharacterToCrewList(character); #endif } ushort itemCount = msg.ReadUInt16(); for (int j = 0; j < itemCount; j++) { Item.ReadSpawnData(msg); } if (character.Submarine != null && character.AIController is EnemyAIController enemyAi) { enemyAi.UnattackableSubmarines.Add(character.Submarine); enemyAi.UnattackableSubmarines.Add(Submarine.MainSub); foreach (Submarine sub in Submarine.MainSub.DockedTo) { enemyAi.UnattackableSubmarines.Add(sub); } } } if (characters.Contains(null)) { throw new System.Exception("Error in AbandonedOutpostMission.ClientReadInitial: character list contains null (mission: " + Prefab.Identifier + ")"); } if (characters.Count != characterCount) { throw new System.Exception("Error in AbandonedOutpostMission.ClientReadInitial: character count does not match the server count (" + characters + " != " + characters.Count + "mission: " + Prefab.Identifier + ")"); } }
public bool ServerAdminRead(IReadMessage incMsg, Client c) { if (!c.HasPermission(ClientPermissions.ManageSettings)) { bool enabled = incMsg.ReadBoolean(); incMsg.ReadPadBits(); UInt16 removeCount = incMsg.ReadUInt16(); incMsg.BitPosition += removeCount * 4 * 8; UInt16 addCount = incMsg.ReadUInt16(); for (int i = 0; i < addCount; i++) { incMsg.ReadString(); //skip name incMsg.ReadString(); //skip ip } return(false); } else { bool prevEnabled = Enabled; bool enabled = incMsg.ReadBoolean(); incMsg.ReadPadBits(); Enabled = enabled; UInt16 removeCount = incMsg.ReadUInt16(); for (int i = 0; i < removeCount; i++) { UInt16 id = incMsg.ReadUInt16(); WhiteListedPlayer whitelistedPlayer = whitelistedPlayers.Find(p => p.UniqueIdentifier == id); if (whitelistedPlayer != null) { GameServer.Log(GameServer.ClientLogName(c) + " removed " + whitelistedPlayer.Name + " from whitelist (" + whitelistedPlayer.IP + ")", ServerLog.MessageType.ConsoleUsage); RemoveFromWhiteList(whitelistedPlayer); } } UInt16 addCount = incMsg.ReadUInt16(); for (int i = 0; i < addCount; i++) { string name = incMsg.ReadString(); string ip = incMsg.ReadString(); GameServer.Log(GameServer.ClientLogName(c) + " added " + name + " to whitelist (" + ip + ")", ServerLog.MessageType.ConsoleUsage); AddToWhiteList(name, ip); } bool changed = removeCount > 0 || addCount > 0 || prevEnabled != enabled; if (changed) { Save(); } return(changed); } }
public void ClientRead(ServerNetObject type, IReadMessage msg, float sendingTime) { for (int i = 0; i < customInterfaceElementList.Count; i++) { if (customInterfaceElementList[i].HasPropertyName) { if (!customInterfaceElementList[i].IsIntegerInput) { TextChanged(customInterfaceElementList[i], msg.ReadString()); } else { int.TryParse(msg.ReadString(), out int value); ValueChanged(customInterfaceElementList[i], value); } } else { bool elementState = msg.ReadBoolean(); if (customInterfaceElementList[i].ContinuousSignal) { ((GUITickBox)uiElements[i]).Selected = elementState; TickBoxToggled(customInterfaceElementList[i], elementState); } else if (elementState) { ButtonClicked(customInterfaceElementList[i]); } } } UpdateSignalsProjSpecific(); }
public void ClientRead(ServerNetObject type, IReadMessage message, float sendingTime) { remoteWaterVolume = message.ReadRangedSingle(0.0f, 1.5f, 8) * Volume; remoteOxygenPercentage = message.ReadRangedSingle(0.0f, 100.0f, 8); bool hasFireSources = message.ReadBoolean(); remoteFireSources = new List <Vector3>(); if (hasFireSources) { int fireSourceCount = message.ReadRangedInteger(0, 16); for (int i = 0; i < fireSourceCount; i++) { remoteFireSources.Add(new Vector3( MathHelper.Clamp(message.ReadRangedSingle(0.0f, 1.0f, 8), 0.05f, 0.95f), MathHelper.Clamp(message.ReadRangedSingle(0.0f, 1.0f, 8), 0.05f, 0.95f), message.ReadRangedSingle(0.0f, 1.0f, 8))); } } if (serverUpdateDelay > 0.0f) { return; } ApplyRemoteState(); }
public void ClientRead(ServerNetObject type, IReadMessage msg, float sendingTime) { bool isGlobalUpdate = msg.ReadBoolean(); if (isGlobalUpdate) { foreach (LevelWall levelWall in ExtraWalls) { if (levelWall.Body.BodyType == BodyType.Static) { continue; } Vector2 bodyPos = new Vector2( msg.ReadSingle(), msg.ReadSingle()); levelWall.MoveState = msg.ReadRangedSingle(0.0f, MathHelper.TwoPi, 16); DestructibleLevelWall destructibleWall = levelWall as DestructibleLevelWall; if (Vector2.DistanceSquared(bodyPos, levelWall.Body.Position) > 0.5f && (destructibleWall == null || !destructibleWall.Destroyed)) { levelWall.Body.SetTransformIgnoreContacts(ref bodyPos, levelWall.Body.Rotation); } } } else { int index = msg.ReadUInt16(); byte damageByte = msg.ReadByte(); if (index < ExtraWalls.Count && ExtraWalls[index] is DestructibleLevelWall destructibleWall) { destructibleWall.SetDamage(destructibleWall.MaxHealth * damageByte / 255.0f); } } }
public override void ClientReadInitial(IReadMessage msg) { byte characterCount = msg.ReadByte(); for (int i = 0; i < characterCount; i++) { Character character = Character.ReadSpawnData(msg); characters.Add(character); if (msg.ReadBoolean()) { terroristCharacters.Add(character); } ushort itemCount = msg.ReadUInt16(); for (int j = 0; j < itemCount; j++) { Item.ReadSpawnData(msg); } } if (characters.Contains(null)) { throw new System.Exception("Error in EscortMission.ClientReadInitial: character list contains null (mission: " + Prefab.Identifier + ")"); } if (characters.Count != characterCount) { throw new System.Exception("Error in EscortMission.ClientReadInitial: character count does not match the server count (" + characterCount + " != " + characters.Count + "mission: " + Prefab.Identifier + ")"); } InitCharacters(); }
public void ClientRead(IReadMessage inc) { bool shouldReset = inc.ReadBoolean(); int money = inc.ReadInt32(); // uint length = inc.ReadUInt32(); // // for (int i = 0; i < length; i++) // { // string key = inc.ReadString(); // byte value = inc.ReadByte(); // Metadata.SetValue(key, value); // } Campaign.Money = money; if (shouldReset) { ResetUpgrades(); } // spentMoney is local, so this message box should only appear for those who have spent money on upgrades if (spentMoney > 0) { GUIMessageBox msgBox = new GUIMessageBox(TextManager.Get("UpgradeRefundTitle"), TextManager.Get("UpgradeRefundBody"), new [] { TextManager.Get("Ok") }); msgBox.Buttons[0].OnClicked += msgBox.Close; } spentMoney = 0; PendingUpgrades.Clear(); PurchasedUpgrades.Clear(); CanUpgrade = false; }
public void ClientRead(ServerNetObject type, IReadMessage msg, float sendingTime) { state = msg.ReadBoolean(); ushort userID = msg.ReadUInt16(); if (userID == 0) { if (user != null) { IsActive = false; CancelUsing(user); user = null; } } else { Character newUser = Entity.FindEntityByID(userID) as Character; if (newUser != user) { CancelUsing(user); } user = newUser; IsActive = true; } }
public void ServerRead(ClientNetObject type, IReadMessage msg, Client c) { float newFlowPercentage = msg.ReadRangedInteger(-10, 10) * 10.0f; bool newIsActive = msg.ReadBoolean(); if (item.CanClientAccess(c)) { if (newFlowPercentage != FlowPercentage) { GameServer.Log(GameServer.CharacterLogName(c.Character) + " set the pumping speed of " + item.Name + " to " + (int)(newFlowPercentage) + " %", ServerLog.MessageType.ItemInteraction); } if (newIsActive != IsActive) { GameServer.Log(GameServer.CharacterLogName(c.Character) + (newIsActive ? " turned on " : " turned off ") + item.Name, ServerLog.MessageType.ItemInteraction); } if (pumpSpeedLockTimer <= 0.0f) { TargetLevel = null; } FlowPercentage = newFlowPercentage; IsActive = newIsActive; } //notify all clients of the changed state item.CreateServerEvent(this); }
public override void ClientRead(ServerNetObject type, IReadMessage msg, float sendingTime) { base.ClientRead(type, msg, sendingTime); bool readAttachData = msg.ReadBoolean(); if (!readAttachData) { return; } bool shouldBeAttached = msg.ReadBoolean(); Vector2 simPosition = new Vector2(msg.ReadSingle(), msg.ReadSingle()); UInt16 submarineID = msg.ReadUInt16(); Submarine sub = Entity.FindEntityByID(submarineID) as Submarine; if (shouldBeAttached) { if (!attached) { Drop(false, null); item.SetTransform(simPosition, 0.0f); item.Submarine = sub; AttachToWall(); } } else { if (attached) { DropConnectedWires(null); if (body != null) { item.body = body; item.body.Enabled = true; } IsActive = false; DeattachFromWall(); } else { item.SetTransform(simPosition, 0.0f); item.Submarine = sub; } } }
private void ReadStatus(IReadMessage msg) { bool isDead = msg.ReadBoolean(); if (isDead) { CauseOfDeathType causeOfDeathType = (CauseOfDeathType)msg.ReadRangedInteger(0, Enum.GetValues(typeof(CauseOfDeathType)).Length - 1); AfflictionPrefab causeOfDeathAffliction = null; if (causeOfDeathType == CauseOfDeathType.Affliction) { string afflictionName = msg.ReadString(); if (!AfflictionPrefab.Prefabs.ContainsKey(afflictionName)) { string errorMsg = $"Error in CharacterNetworking.ReadStatus: affliction not found ({afflictionName})"; causeOfDeathType = CauseOfDeathType.Unknown; GameAnalyticsManager.AddErrorEventOnce("CharacterNetworking.ReadStatus:AfflictionIndexOutOfBounts", GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); } else { causeOfDeathAffliction = AfflictionPrefab.Prefabs[afflictionName]; } } byte severedLimbCount = msg.ReadByte(); if (!IsDead) { if (causeOfDeathType == CauseOfDeathType.Pressure) { Implode(true); } else { Kill(causeOfDeathType, causeOfDeathAffliction?.Instantiate(1.0f), true); } } for (int i = 0; i < severedLimbCount; i++) { int severedJointIndex = msg.ReadByte(); if (severedJointIndex < 0 || severedJointIndex >= AnimController.LimbJoints.Length) { string errorMsg = $"Error in CharacterNetworking.ReadStatus: severed joint index out of bounds (index: {severedJointIndex}, joint count: {AnimController.LimbJoints.Length})"; GameAnalyticsManager.AddErrorEventOnce("CharacterNetworking.ReadStatus:JointIndexOutOfBounts", GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); } else { AnimController.SeverLimbJoint(AnimController.LimbJoints[severedJointIndex]); } } } else { if (IsDead) { Revive(); } CharacterHealth.ClientRead(msg); } }
private void ReadTraitorStatus(IReadMessage msg) { IsTraitor = msg.ReadBoolean(); if (IsTraitor) { TraitorCurrentObjective = msg.ReadString(); } }
//used when clients use the water/fire console commands public void ServerRead(ClientNetObject type, IReadMessage msg, Client c) { float newWaterVolume = msg.ReadRangedSingle(0.0f, 1.5f, 8) * Volume; bool hasFireSources = msg.ReadBoolean(); int fireSourceCount = 0; List <Vector3> newFireSources = new List <Vector3>(); if (hasFireSources) { fireSourceCount = msg.ReadRangedInteger(0, 16); for (int i = 0; i < fireSourceCount; i++) { newFireSources.Add(new Vector3( MathHelper.Clamp(msg.ReadRangedSingle(0.0f, 1.0f, 8), 0.05f, 0.95f), MathHelper.Clamp(msg.ReadRangedSingle(0.0f, 1.0f, 8), 0.05f, 0.95f), msg.ReadRangedSingle(0.0f, 1.0f, 8))); } } if (!c.HasPermission(ClientPermissions.ConsoleCommands) || !c.PermittedConsoleCommands.Any(command => command.names.Contains("fire") || command.names.Contains("editfire"))) { return; } WaterVolume = newWaterVolume; for (int i = 0; i < fireSourceCount; i++) { Vector2 pos = new Vector2( rect.X + rect.Width * newFireSources[i].X, rect.Y - rect.Height + (rect.Height * newFireSources[i].Y)); float size = newFireSources[i].Z * rect.Width; var newFire = i < FireSources.Count ? FireSources[i] : new FireSource(Submarine == null ? pos : pos + Submarine.Position, null, true); newFire.Position = pos; newFire.Size = new Vector2(size, newFire.Size.Y); //ignore if the fire wasn't added to this room (invalid position)? if (!FireSources.Contains(newFire)) { newFire.Remove(); continue; } } for (int i = FireSources.Count - 1; i >= fireSourceCount; i--) { FireSources[i].Remove(); if (i < FireSources.Count) { FireSources.RemoveAt(i); } } }
public void ClientAdminRead(IReadMessage incMsg) { bool hasPermission = incMsg.ReadBoolean(); if (!hasPermission) { incMsg.ReadPadBits(); return; } bool isOwner = incMsg.ReadBoolean(); incMsg.ReadPadBits(); bannedPlayers.Clear(); UInt32 bannedPlayerCount = incMsg.ReadVariableUInt32(); for (int i = 0; i < (int)bannedPlayerCount; i++) { string name = incMsg.ReadString(); UInt16 uniqueIdentifier = incMsg.ReadUInt16(); bool isRangeBan = incMsg.ReadBoolean(); incMsg.ReadPadBits(); string ip = ""; UInt64 steamID = 0; if (isOwner) { ip = incMsg.ReadString(); steamID = incMsg.ReadUInt64(); } else { ip = "IP concealed by host"; steamID = 0; } bannedPlayers.Add(new BannedPlayer(name, uniqueIdentifier, isRangeBan, ip, steamID)); } if (banFrame != null) { var parent = banFrame.Parent; parent.RemoveChild(banFrame); CreateBanFrame(parent); } }
public void ServerRead(ClientNetObject type, IReadMessage msg, Client c) { bool autoTemp = msg.ReadBoolean(); bool powerOn = msg.ReadBoolean(); float fissionRate = msg.ReadRangedSingle(0.0f, 100.0f, 8); float turbineOutput = msg.ReadRangedSingle(0.0f, 100.0f, 8); if (!item.CanClientAccess(c)) { return; } IsActive = true; if (!autoTemp && AutoTemp) { blameOnBroken = c; } if (turbineOutput < targetTurbineOutput) { blameOnBroken = c; } if (fissionRate > targetFissionRate) { blameOnBroken = c; } if (!_powerOn && powerOn) { blameOnBroken = c; } AutoTemp = autoTemp; _powerOn = powerOn; targetFissionRate = fissionRate; targetTurbineOutput = turbineOutput; LastUser = c.Character; if (nextServerLogWriteTime == null) { nextServerLogWriteTime = Math.Max(lastServerLogWriteTime + 1.0f, (float)Timing.TotalTime); } //need to create a server event to notify all clients of the changed state unsentChanges = true; }
public void ServerRead(ClientNetObject type, IReadMessage msg, Client c) { bool[] elementStates = new bool[customInterfaceElementList.Count]; string[] elementValues = new string[customInterfaceElementList.Count]; for (int i = 0; i < customInterfaceElementList.Count; i++) { if (customInterfaceElementList[i].HasPropertyName) { elementValues[i] = msg.ReadString(); } else { elementStates[i] = msg.ReadBoolean(); } } CustomInterfaceElement clickedButton = null; if ((c.Character != null && DrawHudWhenEquipped && item.ParentInventory?.Owner == c.Character) || item.CanClientAccess(c)) { for (int i = 0; i < customInterfaceElementList.Count; i++) { if (customInterfaceElementList[i].HasPropertyName) { if (!customInterfaceElementList[i].IsIntegerInput) { TextChanged(customInterfaceElementList[i], elementValues[i]); } else { int.TryParse(elementValues[i], out int value); ValueChanged(customInterfaceElementList[i], value); } } else if (customInterfaceElementList[i].ContinuousSignal) { TickBoxToggled(customInterfaceElementList[i], elementStates[i]); } else if (elementStates[i]) { clickedButton = customInterfaceElementList[i]; ButtonClicked(customInterfaceElementList[i]); } } } //notify all clients of the new state GameMain.Server.CreateEntityEvent(item, new object[] { NetEntityEvent.Type.ComponentState, item.GetComponentIndex(this), clickedButton }); item.CreateServerEvent(this); }
public void ClientRead(ServerNetObject type, IReadMessage msg, float sendingTime) { deteriorationTimer = msg.ReadSingle(); deteriorateAlwaysResetTimer = msg.ReadSingle(); DeteriorateAlways = msg.ReadBoolean(); ushort currentFixerID = msg.ReadUInt16(); currentFixerAction = (FixActions)msg.ReadRangedInteger(0, 2); CurrentFixer = currentFixerID != 0 ? Entity.FindEntityByID(currentFixerID) as Character : null; }