Exemple #1
0
        public virtual void OnNoticeReceived(AVIMNotice notice)
        {
            var response = new PlayResponse(notice.RawData);

            if (response.IsSuccessful)
            {
                if (Done != null)
                {
                    Done(Command, response);
                }
            }
            //Play.LogCommand(Command, null, Play.CommandType.WebSocket);
            //Play.LogCommand(null, response, Play.CommandType.WebSocket);
            if (EventCode != PlayEventCode.None)
            {
                var next = PlayStateMachine.Next(EventCode, response);
                if (response.IsSuccessful)
                {
                    Play.InvokeEvent(next);
                }
                else
                {
                    Play.InvokeEvent(next, response.ErrorCode, response.ErrorReason);
                }
            }
            Play.UnsubscribeNoticeReceived(this);
        }
Exemple #2
0
        /// <summary>
        /// Rejoin the room.
        /// </summary>
        /// <param name="roomName">Room name.</param>
        public static void RejoinRoom(string roomName = null)
        {
            if (string.IsNullOrEmpty(roomName))
            {
                if (Play.Room == null)
                {
                    Play.InvokeEvent(PlayEventCode.OnJoinRoomFailed, "-100", "can NOT join a room with the name is NULL.");
                    return;
                }
                roomName = Play.Room.Name;
            }

            var joinRoomCommand = new PlayCommand()
            {
                Body = new Dictionary <string, object>()
                {
                    { "cmd", "conv" },
                    { "op", "add" },
                    { "cid", roomName },
                    { "rejoin", true },
                },
            };

            RunSocketCommand(joinRoomCommand, done: DoRejoinRoom);
        }
Exemple #3
0
        internal static void MasterClientSwitch(string handler, string master)
        {
            //var handledPlayer = GetPlayer(handler);
            var newMasterPlayer = GetPlayer(master);

            Play.InvokeEvent(PlayEventCode.OnMasterClientSwitched, newMasterPlayer);
        }
Exemple #4
0
        public override void OnNoticeReceived(AVIMNotice notice)
        {
            var propObjs = notice.RawData["props"] as List <object>;

            if (propObjs != null)
            {
                propObjs.Every(metaData =>
                {
                    var prop = metaData as IDictionary <string, object>;
                    if (prop != null)
                    {
                        var clientId = prop["clientId"] as string;
                        if (clientId != null)
                        {
                            var player = Play.Room.GetPlayer(clientId);

                            var customProperties = prop["customProperties"] as IDictionary <string, object>;
                            if (player != null)
                            {
                                player.CustomPropertiesMetaData.Merge(customProperties);
                            }
                            Play.InvokeEvent(PlayEventCode.OnPlayerCustomPropertiesChanged, player, customProperties.ToHashtable());
                        }
                    }
                });
            }
        }
Exemple #5
0
        internal static void DoRejoinRoom(PlayCommand request, PlayResponse response)
        {
            if (!response.IsSuccessful)
            {
                Play.InvokeEvent(PlayEventCode.OnJoinRoomFailed, response.ErrorCode, response.ErrorReason);
                return;
            }
            var room = GetRoomWhenGet(request, response);

            Play.InvokeEvent(PlayEventCode.OnJoiningRoom);
            ConnectRoom(room, true);
        }
Exemple #6
0
        internal static void RunHttpCommand(PlayCommand command, PlayEventCode eventCode = PlayEventCode.None, Action <PlayCommand, PlayResponse> done = null)
        {
            if (eventCode != PlayEventCode.None)
            {
                Play.InvokeEvent(eventCode);
            }
            var httpRequest = command.HttpEncode;

            Play.ExecuteHttp(httpRequest, (tuple =>
            {
                int statusCode = (int)HttpStatusCode.BadRequest;
                IDictionary <string, object> body = new Dictionary <string, object>();
                try
                {
                    body = Json.Parse(tuple.Item2) as IDictionary <string, object>;
                    statusCode = (int)tuple.Item1;
                }
                catch
                {
                }
                var response = new PlayResponse()
                {
                    Body = body as IDictionary <string, object>,
                    StatusCode = (int)tuple.Item1
                };

                if (response.IsSuccessful)
                {
                    LogCommand(command, response);
                    if (done != null)
                    {
                        done(command, response);
                    }
                }
                else
                {
                    LogCommand(command, response, printer: ErrorLogger);
                }

                if (eventCode != PlayEventCode.None)
                {
                    var next = PlayStateMachine.Next(eventCode, response);
                    if (response.IsSuccessful)
                    {
                        Play.InvokeEvent(next);
                    }
                    else
                    {
                        Play.InvokeEvent(next, response.ErrorCode, response.ErrorReason);
                    }
                }
            }));
        }
Exemple #7
0
 internal static void ConnectRoom(PlayRoom room, bool isRejoin = false)
 {
     lock (roomLock)
     {
         DoConnectToGameSever(room, () =>
         {
             peer.SessionRoomJoin(room, isRejoin: isRejoin, roomJoined: (roomm, response) =>
             {
                 DoSetRoomProperties(roomm, response);
                 Play.Room = roomm;
                 Play.InvokeEvent(PlayEventCode.OnJoinedRoom);
             });
         });
     }
 }
Exemple #8
0
        /// <summary>
        ///
        /// </summary>
        public void ResetEnumerators()
        {
            listEnumerator         = new PlayQueryEnumerator <List <PlayRoom> >();
            listEnumerator.Command = new PlayCommand()
            {
                RelativeUrl   = "/rooms",
                Method        = "GET",
                UrlParameters = new Dictionary <string, object>()
            };

            listEnumerator.Limit = 20;

            listEnumerator.Decoder = (resp) =>
            {
                if (resp.IsSuccessful)
                {
                    var roomMetaDataObjs = resp.Body["rooms"] as List <object>;
                    if (roomMetaDataObjs != null)
                    {
                        var result = roomMetaDataObjs.Select(roomMetaDataObj =>
                        {
                            var room = new PlayRoom();
                            IDictionary <string, object> roomMetaData = roomMetaDataObj as IDictionary <string, object>;
                            room.MergeFromServer(roomMetaData);
                            return(room);
                        });
                        return(result.ToList());
                    }
                }
                else
                {
                    Play.InvokeEvent(PlayEventCode.OnFetchRoomListFailed, resp.ErrorCode, resp.ErrorReason);
                }
                return(new List <PlayRoom>());
            };

            listEnumerator.Before = () =>
            {
                Play.InvokeEvent(PlayEventCode.OnFetchingRoomList);
            };

            listEnumerator.Callback = (rooms) =>
            {
                AddRooms(rooms);
                Play.InvokeEvent(PlayEventCode.OnFetchedRoomList, rooms);
            };
        }
Exemple #9
0
        /// <summary>
        /// create a room with config and name.
        /// </summary>
        /// <param name="roomConfig">config of Room</param>
        /// <param name="roomName">name of Room</param>
        public static void CreateRoom(PlayRoom.RoomConfig roomConfig, string roomName = null)
        {
            var createRoomCommand = new PlayCommand()
            {
                Body = new Dictionary <string, object>()
                {
                    { "cmd", "conv" },
                    { "op", "start" },
                },
            };

            if (string.IsNullOrEmpty(roomName))
            {
                roomName = PlayRoom.RandomRoomName(24);
            }

            RunSocketCommand(createRoomCommand, done: (request, response) =>
            {
                // get game server address from game router
                var roomRemoteSecureAddress = response.Body["secureAddr"] as string;
                var roomRemoteAddress       = response.Body["addr"] as string;

                // open websocket connection with game server
                DoConnectToGameSever(roomRemoteSecureAddress, () =>
                {
                    Play.InvokeEvent(PlayEventCode.OnCreatingRoom);
                    // create room at game server
                    peer.SessionCreateRoom(roomName, roomConfig, (room) =>
                    {
                        Play.Room = room;
                        Play.InvokeEvent(PlayEventCode.OnCreatedRoom);
                        Play.InvokeEvent(PlayEventCode.OnJoinedRoom);
                    });
                });
            });
        }
Exemple #10
0
        internal void SessionCreateRoom(string roomName, PlayRoom.RoomConfig roomConfig, Action <PlayRoom> roomCreated = null)
        {
            IDictionary <string, object> body = new Dictionary <string, object>();

            if (roomConfig.CustomRoomProperties != null)
            {
                body.Add("attr", roomConfig.CustomRoomProperties.ToDictionary());
            }
            if (roomConfig.MaxPlayerCount > 0 && roomConfig.MaxPlayerCount != PlayRoom.DefaultMaxPlayerCount)
            {
                body.Add("maxMembers", roomConfig.MaxPlayerCount);
            }
            if (roomConfig.EmptyTimeToLive > 0 && roomConfig.EmptyTimeToLive != PlayRoom.DefaultMaxEmptyTimeToLive)
            {
                body.Add("emptyRoomTtl", roomConfig.EmptyTimeToLive);
            }
            if (roomConfig.PlayerTimeToKeep > 0 && roomConfig.PlayerTimeToKeep != PlayRoom.DefaultMaxKeepPlayerTime)
            {
                body.Add("playerTtl", roomConfig.PlayerTimeToKeep);
            }
            if (roomConfig.ExpectedUsers != null)
            {
                body.Add("expectMembers", roomConfig.ExpectedUsers);
            }
            if (!roomConfig.IsVisible)
            {
                body.Add("visible", roomConfig.IsVisible);
            }
            if (!roomConfig.IsOpen)
            {
                body.Add("open", roomConfig.IsOpen);
            }
            if (roomConfig.LobbyMatchKeys != null)
            {
                body.Add("lobbyAttrKeys", roomConfig.LobbyMatchKeys);
            }
            body.Add("cmd", "conv");
            body.Add("op", "start");
            body.Add("cid", roomName);
            var createCommand = new PlayCommand()
            {
                Body = body
            };

            Play.RunSocketCommand(createCommand, done: (req, response) =>
            {
                if (response.IsSuccessful)
                {
                    var room = new PlayRoom(roomConfig, roomName);
                    Play.DoSetRoomProperties(room, response);
                    if (roomCreated != null)
                    {
                        roomCreated(room);
                    }
                }
                else
                {
                    Play.InvokeEvent(PlayEventCode.OnCreateRoomFailed, response.ErrorCode, response.ErrorReason);
                }
            });
        }
Exemple #11
0
        private static void RoomConnection_OnClosed(int arg1, string arg2, string arg3)
        {
            Play.InvokeEvent(PlayEventCode.OnDisconnected);

            Log("sokcet closed: " + arg1 + arg2 + arg3);
        }
Exemple #12
0
 internal static void PlayerLeft(Player player)
 {
     Play.InvokeEvent(PlayEventCode.OnPlayerLeftRoom, player);
 }
Exemple #13
0
 internal static void PlayerRejoined(Player player)
 {
     Play.InvokeEvent(PlayEventCode.OnPlayerReconnectedRoom, player);
 }
Exemple #14
0
 internal static void PlayerOffline(Player player)
 {
     player.IsInactive = true;
     Play.InvokeEvent(PlayEventCode.OnPlayerActivityChanged, player);
 }
Exemple #15
0
 internal static void NewPlayerJoined(Player newPlayer)
 {
     Play.InvokeEvent(PlayEventCode.OnNewPlayerJoinedRoom, newPlayer);
 }
Exemple #16
0
 internal static void RoomUpdated(IDictionary <string, object> transformation)
 {
     Play.Room.Updated(transformation);
     Play.InvokeEvent(PlayEventCode.OnRoomCustomPropertiesUpdated, transformation.ToHashtable());
 }