Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
        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);
                    }
                }
            }
        }
Ejemplo n.º 3
0
        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));
 }
Ejemplo n.º 5
0
        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);
            }
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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();
            }
        }
Ejemplo n.º 9
0
 private void Write(IWriteMessage msg, object[] extraData)
 {
     if (extraData == null || extraData.Length < 3)
     {
         return;
     }
     msg.WriteRangedInteger((int)extraData[2], 0, Signals.Length - 1);
 }
Ejemplo n.º 10
0
 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);
 }
Ejemplo n.º 11
0
        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);
        }
Ejemplo n.º 12
0
        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);
                }
            }
        }
Ejemplo n.º 13
0
        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);
        }
Ejemplo n.º 14
0
 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);
 }
Ejemplo n.º 15
0
 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));
         }
     }
 }
Ejemplo n.º 16
0
        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);
        }
Ejemplo n.º 17
0
        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);
            }
        }
Ejemplo n.º 18
0
        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);
Ejemplo n.º 19
0
        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);
            }
        }
Ejemplo n.º 20
0
 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);
     }
 }
Ejemplo n.º 21
0
        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);
                }
            }
        }
Ejemplo n.º 22
0
        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);
     }
 }
Ejemplo n.º 24
0
 public void ClientWrite(IWriteMessage msg, object[] extraData)
 {
     msg.WriteRangedInteger((int)(rechargeSpeed / MaxRechargeSpeed * 10), 0, 10);
 }
Ejemplo n.º 25
0
 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);
            }
        }
Ejemplo n.º 27
0
        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);
            }
        }
Ejemplo n.º 28
0
        public void ClientWrite(IWriteMessage msg, object[] extraData = null)
        {
            int itemIndex = pendingFabricatedItem == null ? -1 : fabricationRecipes.IndexOf(pendingFabricatedItem);

            msg.WriteRangedInteger(itemIndex, -1, fabricationRecipes.Count - 1);
        }
Ejemplo n.º 29
0
 public void ClientWrite(IWriteMessage msg, object[] extraData = null)
 {
     msg.WriteRangedInteger((int)requestStartFixAction, 0, 2);
 }
Ejemplo n.º 30
0
 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);
 }