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 message, Client c, object[] extraData = null) { message.WriteRangedSingle(MathHelper.Clamp(waterVolume / Volume, 0.0f, 1.5f), 0.0f, 1.5f, 8); message.WriteRangedSingle(MathHelper.Clamp(OxygenPercentage, 0.0f, 100.0f), 0.0f, 100.0f, 8); message.Write(FireSources.Count > 0); if (FireSources.Count > 0) { message.WriteRangedInteger(Math.Min(FireSources.Count, 16), 0, 16); for (int i = 0; i < Math.Min(FireSources.Count, 16); i++) { var fireSource = FireSources[i]; Vector2 normalizedPos = new Vector2( (fireSource.Position.X - rect.X) / rect.Width, (fireSource.Position.Y - (rect.Y - rect.Height)) / rect.Height); message.WriteRangedSingle(MathHelper.Clamp(normalizedPos.X, 0.0f, 1.0f), 0.0f, 1.0f, 8); message.WriteRangedSingle(MathHelper.Clamp(normalizedPos.Y, 0.0f, 1.0f), 0.0f, 1.0f, 8); message.WriteRangedSingle(MathHelper.Clamp(fireSource.Size.X / rect.Width, 0.0f, 1.0f), 0, 1.0f, 8); } } message.Write(extraData != null); if (extraData != null) { message.Write((bool)extraData[0]); // Section update if ((bool)extraData[0]) { int sectorToUpdate = (int)extraData[1]; int start = sectorToUpdate * BackgroundSectionsPerNetworkEvent; int end = Math.Min((sectorToUpdate + 1) * BackgroundSectionsPerNetworkEvent, BackgroundSections.Count - 1); message.WriteRangedInteger(sectorToUpdate, 0, BackgroundSections.Count - 1); for (int i = start; i < end; i++) { message.WriteRangedSingle(BackgroundSections[i].ColorStrength, 0.0f, 1.0f, 8); message.Write(BackgroundSections[i].Color.PackedValue); } } else // Decal update { message.WriteRangedInteger(decals.Count, 0, MaxDecalsPerHull); foreach (Decal decal in decals) { message.Write(decal.Prefab.UIntIdentifier); message.Write((byte)decal.SpriteIndex); float normalizedXPos = MathHelper.Clamp(MathUtils.InverseLerp(0.0f, rect.Width, decal.CenterPosition.X), 0.0f, 1.0f); float normalizedYPos = MathHelper.Clamp(MathUtils.InverseLerp(-rect.Height, 0.0f, decal.CenterPosition.Y), 0.0f, 1.0f); message.WriteRangedSingle(normalizedXPos, 0.0f, 1.0f, 8); message.WriteRangedSingle(normalizedYPos, 0.0f, 1.0f, 8); message.WriteRangedSingle(decal.Scale, 0f, 2f, 12); } } } }
public void ClientWrite(IWriteMessage msg) { System.Diagnostics.Debug.Assert(map.Locations.Count < UInt16.MaxValue); msg.Write(map.CurrentLocationIndex == -1 ? UInt16.MaxValue : (UInt16)map.CurrentLocationIndex); msg.Write(map.SelectedLocationIndex == -1 ? UInt16.MaxValue : (UInt16)map.SelectedLocationIndex); var selectedMissionIndices = map.GetSelectedMissionIndices(); msg.Write((byte)selectedMissionIndices.Count()); foreach (int selectedMissionIndex in selectedMissionIndices) { msg.Write((byte)selectedMissionIndex); } msg.Write(PurchasedHullRepairs); msg.Write(PurchasedItemRepairs); msg.Write(PurchasedLostShuttles); msg.Write((UInt16)CargoManager.ItemsInBuyCrate.Count); foreach (PurchasedItem pi in CargoManager.ItemsInBuyCrate) { msg.Write(pi.ItemPrefab.Identifier); msg.WriteRangedInteger(pi.Quantity, 0, 100); } msg.Write((UInt16)CargoManager.PurchasedItems.Count); foreach (PurchasedItem pi in CargoManager.PurchasedItems) { msg.Write(pi.ItemPrefab.Identifier); msg.WriteRangedInteger(pi.Quantity, 0, 100); } msg.Write((UInt16)CargoManager.SoldItems.Count); foreach (SoldItem si in CargoManager.SoldItems) { msg.Write(si.ItemPrefab.Identifier); msg.Write((UInt16)si.ID); msg.Write(si.Removed); msg.Write(si.SellerID); } msg.Write((ushort)UpgradeManager.PurchasedUpgrades.Count); foreach (var(prefab, category, level) in UpgradeManager.PurchasedUpgrades) { msg.Write(prefab.Identifier); msg.Write(category.Identifier); msg.Write((byte)level); } msg.Write((ushort)UpgradeManager.PurchasedItemSwaps.Count); foreach (var itemSwap in UpgradeManager.PurchasedItemSwaps) { msg.Write(itemSwap.ItemToRemove.ID); msg.Write(itemSwap.ItemToInstall?.Identifier ?? string.Empty); } }
public void ServerWriteBranchGrowth(IWriteMessage msg, BallastFloraBranch branch, int parentId = -1) { var(x, y) = branch.Position; msg.Write(parentId); msg.Write((int)branch.ID); msg.WriteRangedInteger((byte)branch.Type, 0b0000, 0b1111); msg.WriteRangedInteger((byte)branch.Sides, 0b0000, 0b1111); msg.WriteRangedInteger(branch.FlowerConfig.Serialize(), 0, 0xFFF); msg.WriteRangedInteger(branch.LeafConfig.Serialize(), 0, 0xFFF); msg.Write((ushort)branch.MaxHealth); msg.Write((int)(x / VineTile.Size)); msg.Write((int)(y / VineTile.Size)); }
public void ServerWrite(IWriteMessage msg, Client c, object[] extraData = null) { int eventIndex = (int)extraData[2]; int nodeStartIndex = eventIndex * MaxNodesPerNetworkEvent; int nodeCount = MathHelper.Clamp(nodes.Count - nodeStartIndex, 0, MaxNodesPerNetworkEvent); msg.WriteRangedInteger(eventIndex, 0, (int)Math.Ceiling(MaxNodeCount / (float)MaxNodesPerNetworkEvent)); msg.WriteRangedInteger(nodeCount, 0, MaxNodesPerNetworkEvent); for (int i = nodeStartIndex; i < nodeStartIndex + nodeCount; i++) { msg.Write(nodes[i].X); msg.Write(nodes[i].Y); } }
public void ServerWrite(IWriteMessage msg, Client c, object[] extraData = null) { LevelObject obj = extraData[0] as LevelObject; msg.WriteRangedInteger(objects.IndexOf(obj), 0, objects.Count); obj.ServerWrite(msg, c); }
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 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(); } }
private void Write(IWriteMessage msg, object[] extraData) { if (extraData == null || extraData.Length < 3) { return; } msg.WriteRangedInteger((int)extraData[2], 0, Signals.Length - 1); }
public void ServerWrite(IWriteMessage msg, Client c, object[] extraData = null) { msg.Write(deteriorationTimer); msg.Write(deteriorateAlwaysResetTimer); msg.Write(DeteriorateAlways); msg.Write(CurrentFixer == c.Character); msg.WriteRangedInteger((int)currentFixerAction, 0, 2); }
public void ServerWrite(IWriteMessage msg, Client c, object[] extraData = null) { msg.WriteRangedInteger((int)(rechargeSpeed / MaxRechargeSpeed * 10), 0, 10); float chargeRatio = MathHelper.Clamp(charge / capacity, 0.0f, 1.0f); msg.WriteRangedSingle(chargeRatio, 0.0f, 1.0f, 8); }
public void ClientWrite(IWriteMessage msg, object[] extraData = null) { if (extraData == null) { msg.WriteRangedInteger(0, 0, 2); msg.WriteRangedSingle(MathHelper.Clamp(waterVolume / Volume, 0.0f, 1.5f), 0.0f, 1.5f, 8); msg.Write(FireSources.Count > 0); if (FireSources.Count > 0) { msg.WriteRangedInteger(Math.Min(FireSources.Count, 16), 0, 16); for (int i = 0; i < Math.Min(FireSources.Count, 16); i++) { var fireSource = FireSources[i]; Vector2 normalizedPos = new Vector2( (fireSource.Position.X - rect.X) / rect.Width, (fireSource.Position.Y - (rect.Y - rect.Height)) / rect.Height); msg.WriteRangedSingle(MathHelper.Clamp(normalizedPos.X, 0.0f, 1.0f), 0.0f, 1.0f, 8); msg.WriteRangedSingle(MathHelper.Clamp(normalizedPos.Y, 0.0f, 1.0f), 0.0f, 1.0f, 8); msg.WriteRangedSingle(MathHelper.Clamp(fireSource.Size.X / rect.Width, 0.0f, 1.0f), 0, 1.0f, 8); } } } else if (extraData[0] is Decal decal) { msg.WriteRangedInteger(1, 0, 2); int decalIndex = decals.IndexOf(decal); msg.Write((byte)(decalIndex < 0 ? 255 : decalIndex)); msg.WriteRangedSingle(decal.BaseAlpha, 0.0f, 1.0f, 8); } else { msg.WriteRangedInteger(2, 0, 2); int sectorToUpdate = (int)extraData[0]; int start = sectorToUpdate * BackgroundSectionsPerNetworkEvent; int end = Math.Min((sectorToUpdate + 1) * BackgroundSectionsPerNetworkEvent, BackgroundSections.Count - 1); msg.WriteRangedInteger(sectorToUpdate, 0, BackgroundSections.Count - 1); for (int i = start; i < end; i++) { msg.WriteRangedSingle(BackgroundSections[i].ColorStrength, 0.0f, 1.0f, 8); msg.Write(BackgroundSections[i].Color.PackedValue); } } }
public void ServerWrite(IWriteMessage msg, Client c, object[] extraData = null) { int itemIndex = fabricatedItem == null ? -1 : fabricationRecipes.IndexOf(fabricatedItem); msg.WriteRangedInteger(itemIndex, -1, fabricationRecipes.Count - 1); UInt16 userID = fabricatedItem == null || user == null ? (UInt16)0 : user.ID; msg.Write(userID); }
public void ServerWrite(IWriteMessage msg, Client c, object[] extraData = null) { msg.Write(deteriorationTimer); msg.Write(deteriorateAlwaysResetTimer); msg.Write(DeteriorateAlways); msg.Write(tinkeringDuration); msg.Write(tinkeringStrength); msg.Write(CurrentFixer == null ? (ushort)0 : CurrentFixer.ID); msg.WriteRangedInteger((int)currentFixerAction, 0, 2); }
public void SharedWrite(IWriteMessage msg, object[] extraData = null) { msg.Write((byte)capacity); for (int i = 0; i < capacity; i++) { msg.WriteRangedInteger(slots[i].ItemCount, 0, MaxStackSize); foreach (Item item in slots[i].Items) { msg.Write((ushort)(item == null ? 0 : item.ID)); } } }
public void ServerWrite(IWriteMessage msg, Client c, object[] extraData = null) { FabricatorState stateAtEvent = (FabricatorState)extraData[3]; msg.Write((byte)stateAtEvent); msg.Write(timeUntilReady); int itemIndex = fabricatedItem == null ? -1 : fabricationRecipes.IndexOf(fabricatedItem); msg.WriteRangedInteger(itemIndex, -1, fabricationRecipes.Count - 1); UInt16 userID = fabricatedItem == null || user == null ? (UInt16)0 : user.ID; msg.Write(userID); }
private void WriteStatus(IWriteMessage msg) { msg.Write(IsDead); if (IsDead) { msg.WriteRangedInteger((int)CauseOfDeath.Type, 0, Enum.GetValues(typeof(CauseOfDeathType)).Length - 1); if (CauseOfDeath.Type == CauseOfDeathType.Affliction) { msg.WriteRangedInteger(AfflictionPrefab.List.IndexOf(CauseOfDeath.Affliction), 0, AfflictionPrefab.List.Count - 1); } if (AnimController?.LimbJoints == null) { //0 limbs severed msg.Write((byte)0); } else { List <int> severedJointIndices = new List <int>(); for (int i = 0; i < AnimController.LimbJoints.Length; i++) { if (AnimController.LimbJoints[i] != null && AnimController.LimbJoints[i].IsSevered) { severedJointIndices.Add(i); } } msg.Write((byte)severedJointIndices.Count); foreach (int jointIndex in severedJointIndices) { msg.Write((byte)jointIndex); } } } else { CharacterHealth.ServerWrite(msg); } }
public void ClientWrite(IWriteMessage msg) { System.Diagnostics.Debug.Assert(map.Locations.Count < UInt16.MaxValue); msg.Write(map.CurrentLocationIndex == -1 ? UInt16.MaxValue : (UInt16)map.CurrentLocationIndex); msg.Write(map.SelectedLocationIndex == -1 ? UInt16.MaxValue : (UInt16)map.SelectedLocationIndex); msg.Write(map.SelectedMissionIndex == -1 ? byte.MaxValue : (byte)map.SelectedMissionIndex); msg.Write(PurchasedHullRepairs); msg.Write(PurchasedItemRepairs); msg.Write(PurchasedLostShuttles); msg.Write((UInt16)CargoManager.ItemsInBuyCrate.Count); foreach (PurchasedItem pi in CargoManager.ItemsInBuyCrate) { msg.Write(pi.ItemPrefab.Identifier); msg.WriteRangedInteger(pi.Quantity, 0, 100); } msg.Write((UInt16)CargoManager.PurchasedItems.Count); foreach (PurchasedItem pi in CargoManager.PurchasedItems) { msg.Write(pi.ItemPrefab.Identifier); msg.WriteRangedInteger(pi.Quantity, 0, 100);
public void ServerWrite(IWriteMessage msg) { List <Affliction> activeAfflictions = afflictions.FindAll(a => a.Strength > 0.0f && a.Strength >= a.Prefab.ActivationThreshold); msg.Write((byte)activeAfflictions.Count); foreach (Affliction affliction in activeAfflictions) { msg.WriteRangedInteger(AfflictionPrefab.List.IndexOf(affliction.Prefab), 0, AfflictionPrefab.List.Count - 1); msg.WriteRangedSingle( MathHelper.Clamp(affliction.Strength, 0.0f, affliction.Prefab.MaxStrength), 0.0f, affliction.Prefab.MaxStrength, 8); } List <Pair <LimbHealth, Affliction> > limbAfflictions = new List <Pair <LimbHealth, Affliction> >(); foreach (LimbHealth limbHealth in limbHealths) { foreach (Affliction limbAffliction in limbHealth.Afflictions) { if (limbAffliction.Strength <= 0.0f || limbAffliction.Strength < limbAffliction.Prefab.ActivationThreshold) { continue; } limbAfflictions.Add(new Pair <LimbHealth, Affliction>(limbHealth, limbAffliction)); } } msg.Write((byte)limbAfflictions.Count); foreach (var limbAffliction in limbAfflictions) { msg.WriteRangedInteger(limbHealths.IndexOf(limbAffliction.First), 0, limbHealths.Count - 1); msg.WriteRangedInteger(AfflictionPrefab.List.IndexOf(limbAffliction.Second.Prefab), 0, AfflictionPrefab.List.Count - 1); msg.WriteRangedSingle( MathHelper.Clamp(limbAffliction.Second.Strength, 0.0f, limbAffliction.Second.Prefab.MaxStrength), 0.0f, limbAffliction.Second.Prefab.MaxStrength, 8); } }
public void ServerWrite(IWriteMessage msg, Client c, object[] extraData = null) { //flowpercentage can only be adjusted at 10% intervals -> no need for more accuracy than this msg.WriteRangedInteger((int)(flowPercentage / 10.0f), -10, 10); msg.Write(IsActive); msg.Write(Hijacked); if (TargetLevel != null) { msg.Write(true); msg.Write(TargetLevel.Value); } else { msg.Write(false); } }
public void ClientWrite(IWriteMessage msg, object[] extraData = null) { msg.WriteRangedSingle(MathHelper.Clamp(waterVolume / Volume, 0.0f, 1.5f), 0.0f, 1.5f, 8); msg.Write(FireSources.Count > 0); if (FireSources.Count > 0) { msg.WriteRangedInteger(Math.Min(FireSources.Count, 16), 0, 16); for (int i = 0; i < Math.Min(FireSources.Count, 16); i++) { var fireSource = FireSources[i]; Vector2 normalizedPos = new Vector2( (fireSource.Position.X - rect.X) / rect.Width, (fireSource.Position.Y - (rect.Y - rect.Height)) / rect.Height); msg.WriteRangedSingle(MathHelper.Clamp(normalizedPos.X, 0.0f, 1.0f), 0.0f, 1.0f, 8); msg.WriteRangedSingle(MathHelper.Clamp(normalizedPos.Y, 0.0f, 1.0f), 0.0f, 1.0f, 8); msg.WriteRangedSingle(MathHelper.Clamp(fireSource.Size.X / rect.Width, 0.0f, 1.0f), 0, 1.0f, 8); } } }
public void ServerWrite(IWriteMessage msg, Client c) { System.Diagnostics.Debug.Assert(map.Locations.Count < UInt16.MaxValue); msg.Write(CampaignID); msg.Write(lastUpdateID); msg.Write(lastSaveID); msg.Write(map.Seed); msg.Write(map.CurrentLocationIndex == -1 ? UInt16.MaxValue : (UInt16)map.CurrentLocationIndex); msg.Write(map.SelectedLocationIndex == -1 ? UInt16.MaxValue : (UInt16)map.SelectedLocationIndex); msg.Write(map.SelectedMissionIndex == -1 ? byte.MaxValue : (byte)map.SelectedMissionIndex); msg.Write(isRunning && startWatchman != null ? startWatchman.ID : (UInt16)0); msg.Write(isRunning && endWatchman != null ? endWatchman.ID : (UInt16)0); msg.Write(Money); msg.Write(PurchasedHullRepairs); msg.Write(PurchasedItemRepairs); msg.Write(PurchasedLostShuttles); msg.Write((UInt16)CargoManager.PurchasedItems.Count); foreach (PurchasedItem pi in CargoManager.PurchasedItems) { msg.Write(pi.ItemPrefab.Identifier); msg.WriteRangedInteger(pi.Quantity, 0, 100); } var characterData = GetClientCharacterData(c); if (characterData?.CharacterInfo == null) { msg.Write(false); } else { msg.Write(true); characterData.CharacterInfo.ServerWrite(msg); } }
public void ServerWrite(IWriteMessage msg, Client c, object[] extraData = null) { msg.WriteRangedSingle(Health, 0f, (float)MaxHealth, 8); if (extraData != null && extraData.Length >= 3 && extraData[2] is int offset) { int amountToSend = Math.Min(Vines.Count - offset, VineChunkSize); msg.WriteRangedInteger(offset, -1, MaximumVines); msg.WriteRangedInteger(amountToSend, 0, VineChunkSize); for (int i = offset; i < offset + amountToSend; i++) { VineTile vine = Vines[i]; var(x, y) = vine.Position; msg.WriteRangedInteger((byte)vine.Type, 0b0000, 0b1111); msg.WriteRangedInteger(vine.FlowerConfig.Serialize(), 0, 0xFFF); msg.WriteRangedInteger(vine.LeafConfig.Serialize(), 0, 0xFFF); msg.Write((byte)(x / VineTile.Size)); msg.Write((byte)(y / VineTile.Size)); } } else { msg.WriteRangedInteger(-1, -1, MaximumVines); } }
public void ClientWrite(IWriteMessage msg, object[] extraData) { msg.WriteRangedInteger((int)(rechargeSpeed / MaxRechargeSpeed * 10), 0, 10); }
public void ClientWrite(IWriteMessage msg, object[] extraData = null) { //flowpercentage can only be adjusted at 10% intervals -> no need for more accuracy than this msg.WriteRangedInteger((int)(flowPercentage / 10.0f), -10, 10); msg.Write(IsActive); }
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, Client c) { System.Diagnostics.Debug.Assert(map.Locations.Count < UInt16.MaxValue); Reputation reputation = Map?.CurrentLocation?.Reputation; msg.Write(IsFirstRound); msg.Write(CampaignID); msg.Write(lastUpdateID); msg.Write(lastSaveID); msg.Write(map.Seed); msg.Write(map.CurrentLocationIndex == -1 ? UInt16.MaxValue : (UInt16)map.CurrentLocationIndex); msg.Write(map.SelectedLocationIndex == -1 ? UInt16.MaxValue : (UInt16)map.SelectedLocationIndex); var selectedMissionIndices = map.GetSelectedMissionIndices(); msg.Write((byte)selectedMissionIndices.Count()); foreach (int selectedMissionIndex in selectedMissionIndices) { msg.Write((byte)selectedMissionIndex); } msg.Write(map.AllowDebugTeleport); msg.Write(reputation != null); if (reputation != null) { msg.Write(reputation.Value); } // hopefully we'll never have more than 128 factions msg.Write((byte)Factions.Count); foreach (Faction faction in Factions) { msg.Write(faction.Prefab.Identifier); msg.Write(faction.Reputation.Value); } msg.Write(ForceMapUI); msg.Write(Money); msg.Write(PurchasedHullRepairs); msg.Write(PurchasedItemRepairs); msg.Write(PurchasedLostShuttles); if (map.CurrentLocation != null) { msg.Write((byte)map.CurrentLocation?.AvailableMissions.Count()); foreach (Mission mission in map.CurrentLocation.AvailableMissions) { msg.Write(mission.Prefab.Identifier); if (mission.Locations[0] == mission.Locations[1]) { msg.Write((byte)255); } else { Location missionDestination = mission.Locations[0] == map.CurrentLocation ? mission.Locations[1] : mission.Locations[0]; LocationConnection connection = map.CurrentLocation.Connections.Find(c => c.OtherLocation(map.CurrentLocation) == missionDestination); msg.Write((byte)map.CurrentLocation.Connections.IndexOf(connection)); } } // Store balance msg.Write(true); msg.Write((UInt16)map.CurrentLocation.StoreCurrentBalance); } else { msg.Write((byte)0); // Store balance msg.Write(false); } msg.Write((UInt16)CargoManager.ItemsInBuyCrate.Count); foreach (PurchasedItem pi in CargoManager.ItemsInBuyCrate) { msg.Write(pi.ItemPrefab.Identifier); msg.WriteRangedInteger(pi.Quantity, 0, 100); } msg.Write((UInt16)CargoManager.PurchasedItems.Count); foreach (PurchasedItem pi in CargoManager.PurchasedItems) { msg.Write(pi.ItemPrefab.Identifier); msg.WriteRangedInteger(pi.Quantity, 0, 100); } msg.Write((UInt16)CargoManager.SoldItems.Count); foreach (SoldItem si in CargoManager.SoldItems) { msg.Write(si.ItemPrefab.Identifier); msg.Write((UInt16)si.ID); msg.Write(si.Removed); msg.Write(si.SellerID); } msg.Write((ushort)UpgradeManager.PendingUpgrades.Count); foreach (var(prefab, category, level) in UpgradeManager.PendingUpgrades) { msg.Write(prefab.Identifier); msg.Write(category.Identifier); msg.Write((byte)level); } msg.Write((ushort)UpgradeManager.PurchasedItemSwaps.Count); foreach (var itemSwap in UpgradeManager.PurchasedItemSwaps) { msg.Write(itemSwap.ItemToRemove.ID); msg.Write(itemSwap.ItemToInstall?.Identifier ?? string.Empty); } var characterData = GetClientCharacterData(c); if (characterData?.CharacterInfo == null) { msg.Write(false); } else { msg.Write(true); characterData.CharacterInfo.ServerWrite(msg); } }
public void ClientWrite(IWriteMessage msg, object[] extraData = null) { int itemIndex = pendingFabricatedItem == null ? -1 : fabricationRecipes.IndexOf(pendingFabricatedItem); msg.WriteRangedInteger(itemIndex, -1, fabricationRecipes.Count - 1); }
public void ClientWrite(IWriteMessage msg, object[] extraData = null) { msg.WriteRangedInteger((int)requestStartFixAction, 0, 2); }
public void ClientWrite(IWriteMessage msg, object[] extraData = null) { //targetForce can only be adjusted at 10% intervals -> no need for more accuracy than this msg.WriteRangedInteger((int)(targetForce / 10.0f), -10, 10); }