Exemplo n.º 1
0
        //used when clients use the water/fire console commands
        public void ServerRead(ClientNetObject type, NetBuffer 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);
                }
            }
        }
Exemplo n.º 2
0
        private void ApplyRemoteState()
        {
            foreach (BackgroundSection remoteBackgroundSection in remoteBackgroundSections)
            {
                BackgroundSections[remoteBackgroundSection.Index].SetColor(remoteBackgroundSection.Color);
                BackgroundSections[remoteBackgroundSection.Index].SetColorStrength(remoteBackgroundSection.ColorStrength);
            }
            remoteBackgroundSections.Clear();

            if (remoteFireSources == null)
            {
                return;
            }

            WaterVolume      = remoteWaterVolume;
            OxygenPercentage = remoteOxygenPercentage;

            for (int i = 0; i < remoteFireSources.Count; i++)
            {
                Vector2 pos = new Vector2(
                    rect.X + rect.Width * remoteFireSources[i].X,
                    rect.Y - rect.Height + (rect.Height * remoteFireSources[i].Y));
                float size = remoteFireSources[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 >= remoteFireSources.Count; i--)
            {
                FireSources[i].Remove();
                if (i < FireSources.Count)
                {
                    FireSources.RemoveAt(i);
                }
            }
            remoteFireSources = null;
        }
Exemplo n.º 3
0
        private void ApplyRemoteState()
        {
            foreach (BackgroundSection remoteBackgroundSection in remoteBackgroundSections)
            {
                float prevColorStrength = BackgroundSections[remoteBackgroundSection.Index].ColorStrength;
                BackgroundSections[remoteBackgroundSection.Index].SetColor(remoteBackgroundSection.Color);
                BackgroundSections[remoteBackgroundSection.Index].SetColorStrength(remoteBackgroundSection.ColorStrength);
                paintAmount = Math.Max(0, paintAmount + (BackgroundSections[remoteBackgroundSection.Index].ColorStrength - prevColorStrength) / BackgroundSections.Count);
            }
            remoteBackgroundSections.Clear();

            if (remoteDecals.Any())
            {
                decals.Clear();
                foreach (RemoteDecal remoteDecal in remoteDecals)
                {
                    float decalPosX = MathHelper.Lerp(rect.X, rect.Right, remoteDecal.NormalizedPos.X);
                    float decalPosY = MathHelper.Lerp(rect.Y - rect.Height, rect.Y, remoteDecal.NormalizedPos.Y);
                    if (Submarine != null)
                    {
                        decalPosX += Submarine.Position.X;
                        decalPosY += Submarine.Position.Y;
                    }
                    AddDecal(remoteDecal.DecalId, new Vector2(decalPosX, decalPosY), remoteDecal.Scale, isNetworkEvent: true, spriteIndex: remoteDecal.SpriteIndex);
                }
                remoteDecals.Clear();
            }

            if (remoteFireSources == null)
            {
                return;
            }

            WaterVolume      = remoteWaterVolume;
            OxygenPercentage = remoteOxygenPercentage;

            for (int i = 0; i < remoteFireSources.Count; i++)
            {
                Vector2 pos = new Vector2(
                    rect.X + rect.Width * remoteFireSources[i].X,
                    rect.Y - rect.Height + (rect.Height * remoteFireSources[i].Y));
                float size = remoteFireSources[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 >= remoteFireSources.Count; i--)
            {
                FireSources[i].Remove();
                if (i < FireSources.Count)
                {
                    FireSources.RemoveAt(i);
                }
            }
            remoteFireSources = null;
        }
Exemplo n.º 4
0
        //used when clients use the water/fire console commands or section / decal updates are received
        public void ServerRead(ClientNetObject type, IReadMessage msg, Client c)
        {
            int messageType = msg.ReadRangedInteger(0, 2);

            if (messageType == 0)
            {
                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);
                    }
                }
            }
            else if (messageType == 1)
            {
                byte  decalIndex = msg.ReadByte();
                float decalAlpha = msg.ReadRangedSingle(0.0f, 1.0f, 255);
                if (decalIndex < 0 || decalIndex >= decals.Count)
                {
                    return;
                }
                if (c.Character != null && c.Character.AllowInput && c.Character.SelectedItems.Any(it => it?.GetComponent <Sprayer>() != null))
                {
                    decals[decalIndex].BaseAlpha = decalAlpha;
                }
                decalUpdatePending = true;
            }
            else
            {
                int sectorToUpdate = msg.ReadRangedInteger(0, BackgroundSections.Count - 1);
                int start          = sectorToUpdate * BackgroundSectionsPerNetworkEvent;
                int end            = Math.Min((sectorToUpdate + 1) * BackgroundSectionsPerNetworkEvent, BackgroundSections.Count - 1);
                for (int i = start; i < end; i++)
                {
                    float colorStrength = msg.ReadRangedSingle(0.0f, 1.0f, 8);
                    Color color         = new Color(msg.ReadUInt32());

                    //TODO: verify the client is close enough to this hull to paint it, that the sprayer is functional and that the color matches
                    if (c.Character != null && c.Character.AllowInput && c.Character.SelectedItems.Any(it => it?.GetComponent <Sprayer>() != null))
                    {
                        BackgroundSections[i].SetColorStrength(colorStrength);
                        BackgroundSections[i].SetColor(color);
                    }
                }
                //add to pending updates to notify other clients as well
                pendingSectionUpdates.Add(sectorToUpdate);
            }
        }