Exemple #1
0
        public override Task <IEnumerable <SlarkClientConnection> > GetTargetsAsync(SlarkContext context)
        {
            var request = context.Message as PlayRequest;

            if (context.Server is PlayGameServer gameServer)
            {
                request.TryGet <string>("cid", "", out string cid);
                gameServer.Rooms.TryGet(r => r.Id == cid, out PlayRoom room);
                var notice = new PlayNotice()
                {
                    Body = new Dictionary <string, object>()
                    {
                        { "cmd", this.Command },
                        { "op", "updated" },
                    }
                };

                if (context.Sender.Client is PlayClient client)
                {
                    var player = room.Players.FirstOrDefault(p => p.Client == client);
                    notice.Body.Add("initby", player.PeerId);
                    notice.Body.Add("initByActor", player.ActorId);
                    notice.Body.Add("fromSA", false);
                }
                var noticeAttr = new Hashtable();
                if (request.Body.ContainsKey("casAttr"))
                {
                    var casAttr = (JObject)request.JsonObject["casAttr"];
                    Dictionary <string, PlayCAS> cas = new Dictionary <string, PlayCAS>();
                    foreach (var p in casAttr.Properties())
                    {
                        cas.Add(p.Name, new PlayCAS()
                        {
                            ExpectedValue = p.Value["expect"],
                            ValueToSet    = p.Value["value"],
                        });
                    }

                    var casNoticeAttr = room.CustomRoomProperties.AutomicUpdateOrAdd(cas);
                    noticeAttr.AutomicSet(casNoticeAttr);
                }

                if (request.Body.ContainsKey("attr"))
                {
                    var attr      = (JObject)request.JsonObject["attr"];
                    var attrTable = new Hashtable();
                    foreach (var p in attr.Properties())
                    {
                        attrTable.Add(p.Name, p.Value);
                    }
                    var setNoticeAttr = room.CustomRoomProperties.AutomicSet(attrTable);
                    noticeAttr.AutomicSet(setNoticeAttr);
                }

                notice.Body["attr"] = noticeAttr;
                context.Notice      = notice.Body.ToJsonString();

                return(Task.FromResult(room.Players.Select(p => p.ClientConnection)));
            }

            return(base.GetTargetsAsync(context));
        }