예제 #1
0
파일: Network.cs 프로젝트: THDigi/PaintGun
        void HandlePacket(PacketBase packet, ulong senderSteamId, byte[] serialized = null)
        {
            // Server-side OriginalSender validation
            if (MyAPIGateway.Multiplayer.IsServer)
            {
                if (senderSteamId != packet.OriginalSenderSteamId)
                {
                    MyLog.Default.WriteLineAndConsole($"{ModName} WARNING: packet {packet.GetType().Name} from {senderSteamId.ToString()} has altered OriginalSenderSteamId to {packet.OriginalSenderSteamId.ToString()}. Replaced it with proper id, but if this triggers for everyone then it's a bug somewhere.");

                    packet.OriginalSenderSteamId = senderSteamId;
                    serialized = null; // force reserialize
                }
            }

            RelayMode relay = RelayMode.NoRelay;

            packet.Received(ref relay);

            if (MyAPIGateway.Multiplayer.IsServer && relay != RelayMode.NoRelay)
            {
                if (relay == RelayMode.RelayOriginal)
                {
                    RelayToClients(packet, senderSteamId, serialized);
                }
                else if (relay == RelayMode.RelayWithChanges)
                {
                    RelayToClients(packet, senderSteamId, null);
                }
                else
                {
                    throw new Exception($"{ModName}: Unknown relay mode: {relay.ToString()}");
                }
            }
        }
예제 #2
0
        void HandlePacket(PacketBase packet, ulong senderSteamId, byte[] serialized = null)
        {
            // validate OriginalSenderSteamId
            if (MyAPIGateway.Session.IsServer && senderSteamId != packet.OriginalSenderSteamId)
            {
                LogError($"{GetType().FullName} WARNING: packet {packet.GetType().Name} from {senderSteamId.ToString()} has altered SenderSteamId to {packet.OriginalSenderSteamId.ToString()}. I replaced it with the proper id, but if this triggers for everyone then it's a bug somewhere.");

                packet.OriginalSenderSteamId = senderSteamId;
                serialized = null; // force reserialize
            }

            RelayMode relay = RelayMode.NoRelay;

            packet.Received(ref relay, senderSteamId);

            if (MyAPIGateway.Session.IsServer && relay != RelayMode.NoRelay)
            {
                if (relay == RelayMode.RelayOriginal)
                {
                    RelayToOthers(packet, serialized, senderSteamId);
                }
                else if (relay == RelayMode.RelayWithChanges)
                {
                    RelayToOthers(packet, null, senderSteamId);
                }
                else
                {
                    throw new Exception($"Unknown relay mode: {relay.ToString()}");
                }
            }
        }
예제 #3
0
        public override void Received(ref RelayMode relay, ulong senderSteamId)
        {
            relay = RelayMode.RelayOriginal;

            if (!Networking.IsPlayer)
            {
                return;
            }

            Vector3D camPos = MyAPIGateway.Session.Camera.WorldMatrix.Translation;

            if (Vector3D.DistanceSquared(camPos, Position) > MaxDistanceSq)
            {
                return;
            }

            MatrixD worldMatrix = MatrixD.CreateFromQuaternion(Orientation);

            worldMatrix.Translation = Position;

            MyEntity3DSoundEmitter emitter = new MyEntity3DSoundEmitter(null);

            emitter.CustomVolume = 0.9f;
            emitter.SetPosition(Position);
            emitter.PlaySingleSound(new MySoundPair("PrgDeconstrPh03Fin"));

            // TODO: spawn smoke or something only from where the block was mounted
            CreateConstructionSmokes(worldMatrix);
        }
예제 #4
0
        public override void Received(ref RelayMode relay)
        {
            // no way to check if creative tools is enabled for sender but it's enough to check their access level.
            if (Main.IsServer && MyAPIGateway.Session.GetUserPromoteLevel(OriginalSenderSteamId) < MyPromoteLevel.SpaceMaster)
            {
                MyLog.Default.WriteLineAndConsole($"{PaintGunMod.MOD_NAME} Warning: Player {Utils.PrintPlayerName(OriginalSenderSteamId)} tried to use replace paint while not being at least SpaceMaster promote level.");
                Main.NetworkLibHandler.PacketWarningMessage.Send(OriginalSenderSteamId, "Failed to replace paint server side, access denied.");
                return;
            }

            bool modified = false;

            if (!Main.Palette.ValidateSkinOwnership(NewPaint.Skin, OriginalSenderSteamId))
            {
                NewPaint = new SerializedPaintMaterial(NewPaint.ColorMaskPacked, null);
                modified = true;
            }

            MyCubeGrid grid = Utils.GetEntityOrError <MyCubeGrid>(this, GridEntId, Constants.NETWORK_DESYNC_ERROR_LOGGING);

            if (grid == null)
            {
                if (Main.IsServer)
                {
                    Main.NetworkLibHandler.PacketWarningMessage.Send(OriginalSenderSteamId, "Failed to replace paint server side, grid no longer exists.");
                }

                return;
            }

            if (Main.IsServer)
            {
                // ensure server side if safezone permissions are respected
                if (!Utils.SafeZoneCanPaint(grid, OriginalSenderSteamId))
                {
                    Main.NetworkLibHandler.PacketWarningMessage.Send(OriginalSenderSteamId, "Failed to replace paint server side, denied by safe zone.");
                    return;
                }

                long identity = MyAPIGateway.Players.TryGetIdentityId(OriginalSenderSteamId);
                if (!Utils.AllowedToPaintGrid(grid, identity))
                {
                    Main.NetworkLibHandler.PacketWarningMessage.Send(OriginalSenderSteamId, "Failed to replace paint server side, ship not allied.");
                    return;
                }
            }

            PaintMaterial newPaint = new PaintMaterial(NewPaint);
            BlockMaterial oldPaint = new BlockMaterial(OldPaint);

            Main.Painting.ReplaceColorInGrid(false, grid, oldPaint, newPaint, IncludeSubgrids, OriginalSenderSteamId);

            if (Main.IsServer)
            {
                relay = modified ? RelayMode.RelayWithChanges : RelayMode.RelayOriginal;
            }
        }
예제 #5
0
        public override void Received(ref RelayMode relay)
        {
            if (Main.IsServer)
            {
                MyLog.Default.WriteLineAndConsole($"{PaintGunMod.MOD_NAME} :: warning message from {Utils.PrintPlayerName(OriginalSenderSteamId)} saying: {Message}");
            }

            Log.Info(Message, Log.PRINT_MESSAGE, 5000);
        }
예제 #6
0
 public override void Received(ref RelayMode relay)
 {
     if (Main.IsServer && !Main.IgnoreAmmoConsumption) // ammo consumption, only needed server side
     {
         IMyInventory inv = Utils.GetCharacterInventoryOrError(this, Utils.GetCharacterOrError(this, Utils.GetPlayerOrError(this, OriginalSenderSteamId)));
         if (inv != null)
         {
             inv.RemoveItemsOfType(1, Main.Constants.PAINT_MAG_ITEM, false);
         }
     }
 }
예제 #7
0
        public override void Received(ref RelayMode relay)
        {
            relay = RelayMode.RelayOriginal;

            if (Constants.NETWORK_ACTION_LOGGING)
            {
                Log.Info($"{GetType().Name} :: Received palette slot update; player={Utils.PrintPlayerName(OriginalSenderSteamId)}, slot={ColorIndex.ToString()}; color={ColorExtensions.UnpackHSVFromUint(ColorMaskPacked).ToString()}");
            }

            PlayerInfo pi = Main.Palette.GetOrAddPlayerInfo(OriginalSenderSteamId);

            pi.SetColorAt(ColorIndex, ColorExtensions.UnpackHSVFromUint(ColorMaskPacked));
        }
예제 #8
0
        public override void Received(ref RelayMode relay)
        {
            relay = (Reply ? RelayMode.RelayOriginal : RelayMode.NoRelay);

            if (PaletteOwnerSteamId != MyAPIGateway.Multiplayer.MyId)
            {
                if (Constants.NETWORK_ACTION_LOGGING)
                {
                    Log.Info($"{GetType().Name} :: received {Utils.PrintPlayerName(PaletteOwnerSteamId)}'s palette; Reply={Reply.ToString()}");
                }

                IMyPlayer player = Utils.GetPlayerBySteamId(PaletteOwnerSteamId);
                if (player == null)
                {
                    return;
                }

                // apply palette info
                PlayerInfo pi = Main.Palette.GetOrAddPlayerInfo(PaletteOwnerSteamId);
                pi.SelectedColorSlot = SelectedColorSlot;
                pi.SelectedSkin      = SelectedSkin;
                pi.ApplyColor        = ApplyColor;
                pi.ApplySkin         = ApplySkin;
                pi.ColorPickMode     = ColorPickMode;
                pi.SetColors(PackedColorMasks);
            }

            if (Reply && MyAPIGateway.Multiplayer.IsServer)
            {
                if (Constants.NETWORK_ACTION_LOGGING)
                {
                    Log.Info($"+ sending all players' palettes back to original sender.");
                }

                foreach (PlayerInfo pi in Main.Palette.PlayerInfo.Values)
                {
                    if (pi.SteamId == OriginalSenderSteamId)
                    {
                        continue; // don't send their own palette back to them
                    }
                    Main.NetworkLibHandler.PacketJoinSharePalette.Send(pi, OriginalSenderSteamId);
                }
            }
        }
예제 #9
0
        public override void Received(ref RelayMode relay, ulong senderSteamId)
        {
            if (!Networking.IsPlayer)
            {
                return;
            }

            IMyCubeGrid grid = MyEntities.GetEntityById(GridEntId) as IMyCubeGrid;

            if (grid == null)
            {
                return;
            }

            Vector3D worldPos = Vector3.Transform(LocalPos, grid.WorldMatrix);
            Vector3D camPos   = MyAPIGateway.Session.Camera.WorldMatrix.Translation;

            if (Vector3D.DistanceSquared(camPos, worldPos) > MaxDistanceSq)
            {
                return;
            }

            MatrixD worldMatrix = MatrixD.CreateFromQuaternion(LocalOrientation);

            worldMatrix.Translation  = LocalPos;
            worldMatrix.Translation += worldMatrix.Down * (grid.GridSize * 0.5f);
            worldMatrix             *= grid.WorldMatrix;

            float scale = grid.GridSize * 0.975f;

            SpawnWeldParticle(worldPos, worldMatrix, new Vector3(1, 0, 1), scale);
            SpawnWeldParticle(worldPos, worldMatrix, new Vector3(1, 0, -1), scale);
            SpawnWeldParticle(worldPos, worldMatrix, new Vector3(-1, 0, 1), scale);
            SpawnWeldParticle(worldPos, worldMatrix, new Vector3(-1, 0, -1), scale);

            MyEntity3DSoundEmitter emitter = new MyEntity3DSoundEmitter(null);

            emitter.CustomVolume = 0.9f;
            emitter.SetPosition(worldPos);
            emitter.PlaySingleSound(new MySoundPair("WeldPad_Weld"));
        }
예제 #10
0
        public override void Received(ref RelayMode relay)
        {
            // too frequent
            //if(Constants.NETWORK_ACTION_LOGGING)
            //{
            //    Log.Info($@"{GetType().Name} :: Received pallete update for {Utils.PrintPlayerName(SteamId)}; SelectedColorIndex={Utils.PrintNullable(SelectedColorIndex)}, SelectedSkinIndex={Utils.PrintNullable(SelectedSkinIndex)}, ApplyColor={Utils.PrintNullable(ApplyColor)}, ApplySkin={Utils.PrintNullable(ApplySkin)}, ColorPickMode={Utils.PrintNullable(ColorPickMode)}");
            //}

            relay = RelayMode.RelayOriginal;

            PlayerInfo pi = Main.Palette.GetOrAddPlayerInfo(OriginalSenderSteamId);

            if (SelectedColorSlot.HasValue)
            {
                pi.SelectedColorSlot = SelectedColorSlot.Value;
            }

            if (SelectedSkin.HasValue)
            {
                pi.SelectedSkin = SelectedSkin.Value;
            }

            if (ApplyColor.HasValue)
            {
                pi.ApplyColor = ApplyColor.Value;
            }

            if (ApplySkin.HasValue)
            {
                pi.ApplySkin = ApplySkin.Value;
            }

            if (ColorPickMode.HasValue)
            {
                pi.ColorPickMode = ColorPickMode.Value;
            }

            //if(PackedColorMasks != null)
            //    pi.SetColors(PackedColorMasks);
        }
	void Start ()
	{
		gameManager = GameObject.FindObjectOfType<GameManager> ();
		timerText = GameObject.Find ("TimerText").GetComponent<Text> ();
		scoreText = GameObject.Find ("Score").GetComponent<Text> ();
		HighScoreText = GameObject.Find ("HighScore").GetComponent<Text> ();

		//timeSlider = GameObject.Find("TimeSlider").GetComponent<Slider>();
		gameOverUIAnim = GameObject.Find ("GameOverUI").GetComponent<Animator> ();

		if (gameManager.subLevelIndex == 1) {
			currentMode = RelayMode.Second8;
		} else if (gameManager.subLevelIndex == 2) {
			currentMode = RelayMode.Second10;
		} else if (gameManager.subLevelIndex == 3) {
			currentMode = RelayMode.Second12;
		}
		if (gameManager.isSoundOn)
			GetComponent<AudioSource> ().volume = 1f;
		else
			GetComponent<AudioSource> ().volume = 0f;

		if (currentMode == RelayMode.Second8) {
			//totalTap = 25;
			timeCounter = 8f;
		} else if (currentMode == RelayMode.Second10) {
			//totalTap = 50;
			timeCounter = 10f;
		} else if (currentMode == RelayMode.Second12) {
			//totalTap = 50;
			timeCounter = 12f;
		}
        gameManager.ResetNoteIndex();
		//timeSlider.minValue = 0f;
		//timeSlider.maxValue = timeCounter;
		GenerateFullGrid ();
	}
예제 #12
0
        public override void Received(ref RelayMode relay)
        {
            relay = RelayMode.RelayOriginal;

            if (Main.IsPlayer)
            {
                IMyPlayer player = Utils.GetPlayerBySteamId(OriginalSenderSteamId);
                if (player == null)
                {
                    return;
                }

                List <PaintGunItem> tools = Main.ToolHandler.Tools;

                foreach (PaintGunItem tool in tools)
                {
                    if (tool.OwnerSteamId == OriginalSenderSteamId)
                    {
                        tool.Spraying = Spraying;
                        break;
                    }
                }
            }
        }
예제 #13
0
 /// <summary>
 /// Called when this packet is received on this machine.
 /// <para><paramref name="relay"/> = relay this packet instance to other clients when received server-side.</para>
 /// <para><paramref name="senderSteamId"/> = the packet's sender. NOTE: relayed packets will have the server as the sender!</para>
 /// </summary>
 public abstract void Received(ref RelayMode relay, ulong senderSteamId);
        void ChangeRelayOutputProperties(string token, string delayTime, RelayIdleState idleState, RelayMode mode)
        {
            RelayOutputSettings testSettings = new RelayOutputSettings();

            testSettings.DelayTime = delayTime;
            testSettings.IdleState = idleState;
            testSettings.Mode      = mode;

            RelayOutput output = new RelayOutput();

            output.token      = token;
            output.Properties = testSettings;

            SetRelayOutputSettings(output);

            RelayOutput[] actualOutputs = GetRelayOutputs();

            Assert(actualOutputs != null, "No relay outputs received via GetRelayOutputs", "Check that the DUT sent relay outputs information");

            RelayOutput actualOutput =
                actualOutputs.Where(o => o.token == token).FirstOrDefault();

            Assert(actualOutput != null,
                   string.Format("Relay output with token {0} not found", token),
                   "Find current output settings");

            ValidateRelayOutputSettings(testSettings, actualOutput.Properties);
        }
예제 #15
0
 /// <summary>
 /// Called when this packet is received on this machine.
 /// Assign <paramref name="relay"/> serverside if you want to auto-relay the received packet to other clients.
 /// </summary>
 public abstract void Received(ref RelayMode relay);
예제 #16
0
 public static void AddBlindApplication(this List <SensactApplication> list, ID appId, int OpenCloseTimeInSeconds, ushort OutputResourcePower, ushort OutputResourceDirection, RelayMode relMode)
 {
     list.Add(new BlindApplication {
         ApplicationId = appId.ToString(), OpenCloseTimeInSeconds = OpenCloseTimeInSeconds, OutputResourceUpOrPower = OutputResourcePower, OutputResourceDownOrDirection = OutputResourceDirection, RelayMode = relMode
     });
 }
예제 #17
0
        }                                 // Empty constructor required for deserialization

        public override void Received(ref RelayMode relay, ulong senderSteamId)
        {
            OnReceive?.Invoke(this);
        }
예제 #18
0
        public override void Received(ref RelayMode relay)
        {
            if (Main.IsServer && !Main.IgnoreAmmoConsumption) // ammo consumption, only needed server side
            {
                IMyInventory inv = Utils.GetCharacterInventoryOrError(this, Utils.GetCharacterOrError(this, Utils.GetPlayerOrError(this, OriginalSenderSteamId)));
                if (inv != null)
                {
                    inv.RemoveItemsOfType(1, Main.Constants.PAINT_MAG_ITEM, false);
                }
            }

            MyCubeGrid grid = Utils.GetEntityOrError <MyCubeGrid>(this, GridEntId, Constants.NETWORK_DESYNC_ERROR_LOGGING);

            if (grid == null)
            {
                return;
            }

            if (Main.IsServer)
            {
                // ensure server side if safezone permissions are respected
                if (!Utils.SafeZoneCanPaint(grid.GetCubeBlock(BlockPosition), OriginalSenderSteamId))
                {
                    if (Constants.NETWORK_DESYNC_ERROR_LOGGING)
                    {
                        IMySlimBlock block = (IMySlimBlock)grid.GetCubeBlock(BlockPosition);
                        Log.Error($"{GetType().Name} :: Can't paint inside no-build safe zone! Sender={OriginalSenderSteamId.ToString()}; Grid={grid} ({grid.EntityId.ToString()}); block={block.BlockDefinition.Id.ToString()} ({block.Position.ToString()})", Log.PRINT_MESSAGE);
                    }

                    Main.NetworkLibHandler.PacketWarningMessage.Send(OriginalSenderSteamId, "Failed to paint server side, denied by safe zone.");
                    return;
                }

                long identity = MyAPIGateway.Players.TryGetIdentityId(OriginalSenderSteamId);
                if (!Utils.AllowedToPaintGrid(grid, identity))
                {
                    if (Constants.NETWORK_DESYNC_ERROR_LOGGING)
                    {
                        Log.Error($"{GetType().Name} :: Can't paint non-allied grids! Sender={OriginalSenderSteamId.ToString()}; Grid={grid} ({grid.EntityId.ToString()})", Log.PRINT_MESSAGE);
                    }

                    Main.NetworkLibHandler.PacketWarningMessage.Send(OriginalSenderSteamId, "Failed to paint server side, ship not allied.");
                    return;
                }

                if (!grid.CubeExists(BlockPosition))
                {
                    if (Constants.NETWORK_DESYNC_ERROR_LOGGING)
                    {
                        Log.Error($"{GetType().Name} :: Can't paint inexistent blocks! Sender={OriginalSenderSteamId.ToString()}; Grid={grid} ({grid.EntityId.ToString()}) at GridPosition={BlockPosition.ToString()}", Log.PRINT_MESSAGE);
                    }

                    Main.NetworkLibHandler.PacketWarningMessage.Send(OriginalSenderSteamId, "Failed to paint server side, block no longer exists.");
                    return;
                }
            }

            if (DoAction(grid))
            {
                relay = RelayMode.RelayWithChanges;
            }
        }