Esempio n. 1
0
    public void SendGeneralPacket(bool players, bool spectators)
    {
        var mobiles = GetInGameMobiles(players, spectators);

        if (mobiles.Count == 0)
        {
            return;
        }

        Span <byte> generalInfo = stackalloc byte[MahjongPackets.MahjongGeneralInfoPacketLength].InitializePacket();

        foreach (var mobile in mobiles)
        {
            MahjongPackets.CreateMahjongGeneralInfo(generalInfo, _game);
            mobile.NetState?.Send(generalInfo);
        }
    }
Esempio n. 2
0
    public void SendRelievePacket(bool players, bool spectators)
    {
        var mobiles = GetInGameMobiles(players, spectators);

        if (mobiles.Count == 0)
        {
            return;
        }

        Span <byte> relievePacket = stackalloc byte[MahjongPackets.MahjongRelievePacketLength].InitializePacket();

        foreach (var mobile in mobiles)
        {
            MahjongPackets.CreateMahjongRelieve(relievePacket, _game.Serial);
            mobile.NetState?.Send(relievePacket);
        }
    }
Esempio n. 3
0
    public void CheckPlayers()
    {
        var removed = false;

        Span <byte> relievePacket = stackalloc byte[MahjongPackets.MahjongRelievePacketLength].InitializePacket();

        for (var i = 0; i < _players.Length; i++)
        {
            var player = _players[i];

            if (player == null)
            {
                continue;
            }

            if (player.Deleted)
            {
                _players[i] = null;

                SendPlayerExitMessage(player);
                UpdateDealer(true);

                removed = true;
            }
            else if (_inGame[i])
            {
                if (player.NetState == null)
                {
                    _inGame[i] = false;

                    SendPlayerExitMessage(player);
                    UpdateDealer(true);

                    removed = true;
                }
                else if (!_game.IsAccessibleTo(player) || player.Map != _game.Map ||
                         !player.InRange(_game.GetWorldLocation(), 5))
                {
                    _inGame[i] = false;

                    MahjongPackets.CreateMahjongRelieve(relievePacket, _game.Serial);
                    player.NetState?.Send(relievePacket);

                    SendPlayerExitMessage(player);
                    UpdateDealer(true);

                    removed = true;
                }
            }
        }

        for (var i = 0; i < _spectators.Count;)
        {
            var mobile = _spectators[i];

            if (mobile.NetState == null || mobile.Deleted)
            {
                _spectators.RemoveAt(i);
            }
            else if (!_game.IsAccessibleTo(mobile) || mobile.Map != _game.Map ||
                     !mobile.InRange(_game.GetWorldLocation(), 5))
            {
                _spectators.RemoveAt(i);

                MahjongPackets.CreateMahjongRelieve(relievePacket, _game.Serial);
                mobile.NetState?.Send(relievePacket);
            }
            else
            {
                i++;
            }
        }

        if (removed && !UpdateSpectators())
        {
            SendPlayersPacket(true, true);
        }
    }