public void ClearBoard(Mobile from, PlayerInfo player)
 {
     if (from != player.mobile)
     {
         from.SendMessage("This game needs maintenance.");
         SecurityCamera(0, "This game needs maintenance.");
         Active = false;
         return;
     }
     PayMethod PayTable = PayMethod.QuickPick;
     byte[] Selected = new byte[80];
     byte[] MachinePicks = new byte[] { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 };
     byte TotalSelected = 15;
     byte[] TPicks = PickNumbers(TotalSelected);
     for (int i = 0; i < TotalSelected; i++)
         Selected[TPicks[i]] = 1;
     from.CloseGump(typeof(KenoGump));
     from.SendGump(new KenoGump(this, from, player, false, (int)PayTable, GetPayTable((int)PayTable, player.Cost, TotalSelected), 2, TotalSelected, false, Selected, TotalSelected, MachinePicks));
     player.LastPlayed = DateTime.Now;
 }
        public void DoCashOut(Mobile from, PlayerInfo player)
        {

            if (from != player.mobile)
            {
                from.SendMessage("This game needs maintenance.");
                SecurityCamera(0, "This game needs maintenance.");
                Active = false;
                return;
            }
            int credit = player.OnCredit;
            if (from == null || credit == 0)
                return;
            if (!m_Active && (m_ErrorCode == 9500 || m_ErrorCode == 9501 || m_ErrorCode == 9502)) // Prevent a loop cashing out
                return;
            if (from != player.mobile)
            {
                from.SendMessage("You are no longer playing this game!");
                return;
            }
            if (player.OnCredit < 0) // This should never happen but protect against some kind of overflow and a wild payout
            {
                if (from.AccessLevel >= AccessLevel.GameMaster) // Allow a GM to clear out the invalid amount
                {
                    from.SendMessage("Invalid gold won amount({0}), reset to 0.", player.OnCredit);
                    player.OnCredit = 0;
                }
                from.SendMessage("There's a problem with this machine's gold amount, this game is offline. Page for help.");
                KenoOffline(9502);
                return;
            }
            if (player.OnCredit < 1000)
            {
                try
                {
                    from.AddToBackpack(new Gold(player.OnCredit));
                    from.SendMessage("{0} gold has been added to your pack.", credit);
                }
                catch
                {
                    from.SendMessage("There's a problem returning your gold, this game is offline. Page for help.");
                    KenoOffline(9500);
                    return;
                }
            }
            else
            {
                try
                {
                    from.AddToBackpack(new BankCheck(player.OnCredit));
                    from.SendMessage("A bank check for {0} gold has been placed in your pack.", credit);
                }
                catch
                {
                    from.SendMessage("There's a problem returning your gold, this game is offline. Page for help.");
                    KenoOffline(9501);
                    return;
                }

            }
            player.OnCredit = 0;
            string text = null;
            if (credit >= 10000)
            {
                text = String.Format("{0} is cashing out {1} Gold!", from.Name, credit);
                this.PublicOverheadMessage(0, (this.Hue == 907 ? 0 : this.Hue), false, text);
            }
            text = String.Format("{0} is cashing out {1} Gold!", from.Name, credit);
            SecurityCamera(credit >= 10000 ? 0 : 1, text);
            from.PlaySound(52);
            from.PlaySound(53);
            from.PlaySound(54);
            from.PlaySound(55);
        }
 public int ProcessPlay(Mobile from, PlayerInfo player, int amount)
 {
     player.OnCredit += amount;
     if (player.Cost * 2 < amount && !m_Profile)
         DoWinSound(from, player.mobile.Female, amount);
     m_TotalWon += (ulong)amount;
     UpdateLastWonBy(from, amount);
     string text = null;
     if (amount > 499999 && !m_Profile)
     {
         if (m_MembershipCard)
             IssueMembershipCard(from, amount);
         if (m_AnnounceBigWins)
         {
             text = String.Format("{0} has won {1} gold on {2}!", from.Name, amount, this.Name);
             AnnounceWin(from, text);
         }
     }
     text = String.Format("{0} wins {1}.", from.Name, amount);
     SecurityCamera(amount > 5000 ? 0 : 1, text);
     text = String.Format("OnCredit={1}.", player.mobile.Name, player.OnCredit);
     SecurityCamera(player.OnCredit > 10000 ? 1 : 2, text);
     return player.OnCredit;
 }
 public int OnCredit(Mobile from, PlayerInfo player, int amount)
 {
     if (from == null || player == null || from != player.mobile)
     {
         from.SendMessage("This game needs maintenance.");
         SecurityCamera(0, "This game needs maintenance.");
         Active = false;
         return player.OnCredit;
     }
     player.OnCredit += amount;
     if (amount < 0)
         m_TotalCollected += (ulong)Math.Abs(amount);
     return player.OnCredit;
 }
 public bool RemovePlayer(Mobile from, PlayerInfo player)
 {
     if (from != player.mobile)
     {
         from.SendMessage("This game needs maintenance.");
         SecurityCamera(0, "This game needs maintenance.");
         Active = false;
         return false;
     }
     string text = String.Format("Removing: {0}.", player.mobile.Name);
     SecurityCamera(0, text);
     if (player.OnCredit != 0)
         DoCashOut(from, player);
     PlayerList.Remove(player);
     m_TotalPlayers--;
     InvalidateProperties();
     return true;
 }
        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
            int version = reader.ReadInt();
            m_Active = reader.ReadBool();
            m_Theme = (ThemeType)reader.ReadInt();
            m_TotalSpins = reader.ReadULong();
            m_TotalCollected = reader.ReadULong();
            m_TotalWon = reader.ReadULong();
            m_ErrorCode = reader.ReadInt();
            m_OrigHue = reader.ReadInt();
            m_Throttle = reader.ReadBool();
            m_ThrottleSeconds = reader.ReadDouble();
            m_CardClubOnly = reader.ReadBool();
            m_MembershipCard = reader.ReadBool();

            m_LastWonBy = reader.ReadMobile();
            m_LastWonByDate = reader.ReadDateTime();
            m_LastWonAmount = reader.ReadInt();

            m_SecurityCamMobile = reader.ReadMobile();
            m_SecurityChatter = (VerboseType)reader.ReadInt();
            m_TotalPlayers = reader.ReadInt();
            InvalidateProperties();
            if (m_TotalPlayers > 0)
            {
                for (int i = 0; i < m_TotalPlayers; i++)
                {
                    PlayerInfo player = new PlayerInfo();

                    player.mobile = reader.ReadMobile();
                    player.LastPlayed = reader.ReadDateTime();
                    player.OnCredit = reader.ReadInt();
                    player.Cost = reader.ReadInt();
                    PlayerList.Add(player);
                }
            }

            for (int i = 0; i < m_HitStats.Length; i++)
                m_HitStats[i] = reader.ReadULong();

            if (m_OrigHue != -1 && m_Active)
            {
                this.Hue = m_OrigHue;
                m_OrigHue = -1;
            }
            SetupTheme(m_Theme);
            ActivateIdleTimer(TimeSpan.FromMinutes(5));
            m_GameSpeed = Utility.RandomList(5, 6, 7, 8, 9, 10, 11, 12);
        }
 public PlayerInfo AddNewPlayer(Mobile from)
 {
     if (PlayerList.Count > MAXUSERS)
     {
         from.SendMessage("This game is full, try again later.");
         return null;
     }
     for (int i = 0; i < PlayerList.Count; i++)
     {
         PlayerInfo p = (PlayerInfo)PlayerList[i];
         if (p.mobile == null)
         {
             p.mobile = from;
             p.LastPlayed = DateTime.Now;
             p.OnCredit = 0;
             p.Cost = 1;
             m_TotalPlayers++;
             InvalidateProperties();
             return p;
         }
     }
     PlayerInfo player = new PlayerInfo();
     player.mobile = from;
     player.LastPlayed = DateTime.Now;
     player.OnCredit = 0;
     InvalidateProperties();
     player.Cost = 1;
     PlayerList.Add(player);
     m_TotalPlayers++;
     InvalidateProperties();
     /*for (int i = 0; i < PlayerList.Count; i++)
     {
         PlayerInfo tplayer = (PlayerInfo) PlayerList[i];
         //Console.WriteLine("(AddNewPlayer) Added/{0}/{1}", i, tplayer.mobile);
     }*/
     return player;
 }
 public bool SearchForPlayer(Mobile from, out PlayerInfo player)
 {
     for (int i = 0; i < PlayerList.Count; i++)
     {
         player = (PlayerInfo)PlayerList[i];
         if (player.mobile == from)
         {
             player.LastPlayed = DateTime.Now;
             return true;
         }
     }
     player = null;
     return false;
 }
        public bool CashCheck(Mobile m, PlayerInfo player, out int amount)
        {
            amount = 0;
            if (m != player.mobile)
            {
                m.SendMessage("This game needs maintenance.");
                SecurityCamera(0, "This game needs maintenance.");
                Active = false;
                return false;
            }
            if (m == null || m.Backpack == null || player == null)
                return false;
#if RUNUO2RC1
			List<Item> packlist = m.Backpack.Items;
#else
			ArrayList packlist = m.Backpack.Items;
#endif

            for (int i = 0; i < packlist.Count; ++i)
            {
                Item item = (Item)packlist[i];
                if (item != null && !item.Deleted && item is BankCheck)
                {
                    amount = ((BankCheck)item).Worth;
                    item.Delete();
                    if (item.Deleted)
                    {
                        string text = null;
                        Effects.PlaySound(new Point3D(this.X, this.Y, this.Z), this.Map, 501);
                        player.OnCredit += amount;
                        text = String.Format("{0}:Check={1}.", player.mobile.Name, amount);
                        SecurityCamera(amount > 5000 ? 0 : 1, text);
                        text = String.Format("OnCredit={1}.", player.mobile.Name, player.OnCredit);
                        SecurityCamera(player.OnCredit > 10000 ? 1 : 2, text);
                    }
                    else
                    {
                        m.SendMessage("There's a problem trying to cash a check in your backpack, this game is offline. Page for help.");
                        KenoOffline(9503);
                        return false;
                    }
                    return true;
                }
            }
            return false;
        }
Beispiel #10
0
        static void ReceiveClientProcess(Object socket)
        {
            bool bQuit = false;

            // Cast object argument back into a socket
            Socket chatClient = (Socket)socket;

            // Server console debug message
            Console.WriteLine("client receive thread for " + GetNameFromSocket(chatClient));

            // Create a new Player class instance
            Player newPlayer = new Player(GetNameFromSocket(chatClient));

            // Initialise the start location
            newPlayer.CurrentRoom = myDungeon.StartRoom;

            // Locking on heavens door
            lock (playerDictionary)
            {
                // Sanity check, then add new Player and appropriate socket as a PlayerInfo struct to the playerDictionary with the clientName as the dictionary's key
                if (playerDictionary.ContainsKey(GetNameFromSocket(chatClient)))
                {
                    playerDictionary[GetNameFromSocket(chatClient)] = new PlayerInfo(newPlayer, chatClient);
                }
                else
                {
                    playerDictionary.Add(GetNameFromSocket(chatClient), new PlayerInfo(newPlayer, chatClient));
                }
            }

            // On new player instantiation, update all players with the new client list
            SendClientList();

            // Initialise string that will recieve the message from the server
            String sendMsg = "";

            while (bQuit == false)
            {
                try
                {
                    byte[] buffer = new byte[4096];
                    int    result;

                    result = chatClient.Receive(buffer);

                    if (result > 0)
                    {
                        MemoryStream stream = new MemoryStream(buffer);
                        BinaryReader read   = new BinaryReader(stream);

                        Msg message = Msg.DecodeStream(read);

                        if (message != null)
                        {
                            Console.Write("Got a message: ");
                            switch (message.mID)
                            {
                            case PublicChatMsg.ID:
                            {
                                PublicChatMsg publicMsg = (PublicChatMsg)message;

                                String formattedMsg = "<" + GetNameFromSocket(chatClient) + "> " + publicMsg.msg;

                                Console.WriteLine("public chat - " + formattedMsg);

                                SendChatMessage(formattedMsg);
                            }
                            break;

                            case PrivateChatMsg.ID:
                            {
                                PrivateChatMsg privateMsg = (PrivateChatMsg)message;

                                String formattedMsg = "PRIVATE <" + GetNameFromSocket(chatClient) + "> " + privateMsg.msg;

                                Console.WriteLine("private chat - " + formattedMsg + "to " + privateMsg.destination);

                                SendPrivateMessage(GetSocketFromName(privateMsg.destination), GetNameFromSocket(chatClient), formattedMsg);

                                formattedMsg = "<" + GetNameFromSocket(chatClient) + "> --> <" + privateMsg.destination + "> " + privateMsg.msg;
                                SendPrivateMessage(chatClient, "", formattedMsg);
                            }
                            break;

                            case GameMsg.ID:
                            {
                                // Cast back to GameMsg class
                                GameMsg gameMessage = (GameMsg)message;

                                // Get the string from the GameMsg class
                                String formattedMsg = gameMessage.msg;

                                // Filter the incoming message for a reference to another player and store
                                // Empty player with otherwise unassignable name, this can be picked up in the controls checks
                                Player   targetedOtherPlayer  = null;     // new Player("unassigned", new List<Item>());
                                String[] FormattedStringWords = formattedMsg.Split(' ');
                                foreach (String possibleName in FormattedStringWords)
                                {
                                    if (playerDictionary.ContainsKey(possibleName))
                                    {
                                        targetedOtherPlayer = playerDictionary[possibleName].player;
                                        break;
                                    }
                                }

                                // Get the sending client name, to be used as a dictionary key next, and to pass the String value
                                String clientName = GetNameFromSocket(chatClient);

                                // Lock it before changing it
                                lock (playerDictionary)
                                {
                                    // Temporary variable to alter outside of dictionary
                                    Player tempPlayer = playerDictionary[clientName].player;

                                    // Update function of the DungeonClass instance. If moved, Updates the current room of the player instance, and the currentRoom occupency of the dungeon room
                                    sendMsg = controls.Update(ref tempPlayer, ref targetedOtherPlayer, formattedMsg);

                                    // Console debug message
                                    Console.WriteLine(sendMsg);

                                    // Update dictionary variable
                                    playerDictionary[clientName] = new PlayerInfo(tempPlayer, playerDictionary[clientName].socket);

                                    // Parse the returned String from the controls for any server specific commands. Program.cs is the glue which holds the playerDictionary together.
                                    // OUTBOUND STRING PARSING!!! Is this a good idea?

                                    // Try/catch is needed to avoid crashing due to mismatched string sizes. i.e. comparing the first 14 characters of a 10 length string.

                                    // "Say" command will always return a sendMsg beginning with "Room chat:". If true then send private message to all players in room
                                    try
                                    {
                                        if (sendMsg.Substring(0, 10) == "Room chat:")
                                        {
                                            foreach (String playerName in tempPlayer.GetCurrentRoomRef.PlayersInRoom)
                                            {
                                                SendPrivateMessage(playerDictionary[playerName].socket, "", sendMsg);
                                            }
                                            break;
                                        }
                                    }
                                    catch
                                    {
                                    }



                                    // If sendMsg conditions have not returned true for any of the ablove specific cases, then send the message to the player socket
                                    SendGameMessage(chatClient, "", sendMsg);
                                }
                            }
                            break;

                            case PlayerInitMsg.ID:
                            {
                                // Cast back to GameMsg class
                                PlayerInitMsg playerInitMessage = (PlayerInitMsg)message;

                                // Get the string from the PlayerInitMsg class
                                // String characterSheetString = playerInitMessage.msg;

                                // String[] processedCharacterSheet = characterSheetString.Split(' ');

                                // Get the sending client name, to be used as a dictionary key next, and to pass the String value
                                String clientName = GetNameFromSocket(chatClient);

                                // Lock
                                lock (playerDictionary)
                                {
                                    // Temporary variable to assign value outside of dictionary
                                    Player tempPlayer = playerDictionary[clientName].player;


                                    // Update dictionary variable
                                    playerDictionary[clientName] = new PlayerInfo(tempPlayer, playerDictionary[clientName].socket);
                                }
                            }
                            break;

                            default:
                                break;
                            }
                        }
                    }
                }

                // Remove player from game
                catch (Exception)
                {
                    bQuit = true;

                    // Lost the player message
                    String output = "Lost client: " + GetNameFromSocket(chatClient);

                    // Debug message to server console
                    Console.WriteLine(output);

                    // Inform the other players
                    SendChatMessage(output);

                    // Always lock the list!!!
                    lock (playerDictionary)
                    {
                        try
                        {
                            // Sanity check, then remove player name from the current rooms list of currently occupying players names
                            if (playerDictionary[GetNameFromSocket(chatClient)].player.GetCurrentRoomRef.PlayersInRoom.Contains(GetNameFromSocket(chatClient)))
                            {
                                playerDictionary[GetNameFromSocket(chatClient)].player.GetCurrentRoomRef.RemovePlayer(GetNameFromSocket(chatClient));
                            }

                            // Sanity check, then remove player information from playerDictionary
                            if (playerDictionary.ContainsKey(GetNameFromSocket(chatClient)))
                            {
                                playerDictionary.Remove(GetNameFromSocket(chatClient));
                            }
                        }
                        catch (Exception)
                        { }
                    }

                    // Update all other players current client list
                    SendClientList();
                }
            }
        }
        public void StartServer()
        {
            TcpListener tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 7777);

            tcpListener.Start();
            Console.WriteLine("Server started");
            Random rnd = new Random();

            while (true)
            {
                if (tcpListener.Pending())
                {
                    Console.WriteLine("New pending connection");
                    tcpListener.BeginAcceptTcpClient(AcceptTcpClient, tcpListener);
                }

                foreach (Player player in _playerList)
                {
                    switch (player.GameState)
                    {
                    case GameState.Connecting:
                        if (player.DataAvailable())
                        {
                            Console.WriteLine("New player registering");
                            string playerJson = player.BinaryReader.ReadString();
                            Player playerMsg  = JsonConvert.DeserializeObject <Player>(playerJson);
                            player.Name = playerMsg.Name;

                            foreach (Player notifyPlayer in _playerList)
                            {
                                Message msg = new Message();
                                msg.MessageType = MessageType.NewPlayer;
                                msg.Description = (notifyPlayer == player) ?
                                                  "Successfully joined" :
                                                  "Player " + player.Name + " has joined";
                                PlayerInfo playerInfo = new PlayerInfo();
                                playerInfo.Id       = player.Id;
                                playerInfo.Name     = player.Name;
                                playerInfo.X        = 0;
                                playerInfo.Y        = 0;
                                playerInfo.Z        = 0;
                                playerInfo.Rotation = 0;
                                playerInfo.HP       = 3;
                                msg.PlayerInfo      = playerInfo;

                                int slot = Array.IndexOf(picked, false);
                                playerInfo.SpawnLocation = slot;
                                picked[slot]             = true;
                                Console.WriteLine(slot);

                                string msgJson = JsonConvert.SerializeObject(msg);
                                notifyPlayer.BinaryWriter.Write(msgJson);
                                notifyPlayer.MessageList.Add(msg);
                                Console.WriteLine(msgJson);
                            }
                            player.GameState = GameState.Sync;
                        }
                        break;

                    case GameState.Sync:
                        Console.WriteLine("New player sync");
                        // processar todos os NewPlayer
                        SyncNewPlayers(player);
                        Console.WriteLine("1231231212");
                        // processar todos os PlayerMovement
                        SyncPlayerMovement(player);

                        Message messagePlayer = new Message();
                        messagePlayer.MessageType = MessageType.FinishedSync;
                        string msgPlayerJson = JsonConvert.SerializeObject(messagePlayer);
                        player.BinaryWriter.Write(msgPlayerJson);
                        player.GameState = GameState.GameStarted;
                        Console.WriteLine(msgPlayerJson);
                        Console.WriteLine("dg4gaegae");
                        break;

                    case GameState.GameStarted:
                        if (player.DataAvailable())
                        {
                            Console.WriteLine("New player position");
                            string msgJson = player.BinaryReader.ReadString();
                            Console.WriteLine(msgJson);
                            Message message = JsonConvert.DeserializeObject <Message>(msgJson);
                            if (message.MessageType == MessageType.PlayerMovement)
                            {
                                //if(message.PlayerInfo.HP <= 0)
                                //{
                                //   var remove = _playerList.First(item => item.Name == player.Name);
                                //    _deadPlayerList.Add(remove);
                                //    _playerList.Remove(remove);
                                //}
                                foreach (Player p in _playerList)
                                {
                                    if (p.GameState == GameState.GameStarted)
                                    {
                                        p.BinaryWriter.Write(msgJson);
                                    }
                                }
                            }
                        }
                        break;
                    }
                }
            }
        }