private void ProcessJoinClient()
        {
            var per  = State.Perception as BattlePerception;
            var view = per.View as GameViews.BattlePerceptionView;

            lock (syncRoot)
            {
                //send Init message.
                while (_addTemp.Count > 0)
                {
                    var client = _addTemp.Dequeue();
                    Clients.Add((long)client.UserState, client);
                    BattlePlayer battlePlayer;
                    //package
                    if (BattlePlayers.TryToGetValue((long)client.UserState, out battlePlayer))
                    {
                        var package = battlePlayer.GetNotifyPackage();
                        package.TimeNow = (Now.Time);
                        client.SendMessage(NetProtoTool.ToNetMessage(MessageClass.Notify, package));
                    }

                    var createNotify = view.GetInitNotify();
                    var messages     = ToMessages(createNotify);
                    //Notify package
                    foreach (var i in messages)
                    {
                        client.SendMessage(i);
                    }
                }
                while (_kickUsers.Count > 0)
                {
                    //kick
                    var u = _kickUsers.Dequeue();
                    BattlePlayers.Remove(u);
                    Clients.Remove(u);
                    per.State.Each <BattleCharacter>((el) =>
                    {
                        if (el.UserID == u)
                        {
                            GObject.Destory(el);
                        }
                        return(false);
                    });
                }
            }
        }
        //处理掉落
        private void DoDrop()
        {
            if (drop == null)
            {
                return;
            }
            var items = drop.DropItem.SplitToInt();
            var pors  = drop.Pro.SplitToInt();

            foreach (var i in this.BattlePlayers)
            {
                var notify = new Notify_Drop();
                notify.UserID = i.Value.User.UserID;
                var gold = GRandomer.RandomMinAndMax(drop.GoldMin, drop.GoldMax);
                notify.Gold = gold;
                i.Value.AddGold(gold);
                if (items.Count > 0)
                {
                    for (var index = 0; index < items.Count; index++)
                    {
                        if (GRandomer.Probability10000(pors[index]))
                        {
                            i.Value.AddDrop(items[index], 1);
                            notify.Items.Add(new PlayerItem {
                                ItemID = items[index], Num = 1
                            });
                        }
                    }
                }
                Client client;
                if (this.Clients.TryToGetValue(i.Value.User.UserID, out client))
                {
                    var message = NetProtoTool.ToNetMessage(MessageClass.Notify, notify);
                    client.SendMessage(message);
                }
            }
        }
Exemple #3
0
        //开始进入战斗
        internal ErrorCode BeginBattle(
            long userID,
            int mapID, int serverID, out GameServerInfo serverInfo)
        {
            serverInfo = null;
            var battleServer = ServerManager.Singleton.GetFreeBattleServerID();

            if (battleServer == null)
            {
                return(ErrorCode.NOFreeBattleServer);
            }
            UserServerInfo user;

            if (_servers.TryToGetValue(userID, out user))
            {
                var task = new Task_L2B_ExitUser {
                    UserID = user.UserID
                };
                var b       = ServerManager.Singleton.GetBattleServerMappingByServerID(user.BattleServerID);
                var bClient = Appliaction.Current.GetServerConnectByClientID(b.ClientID);
                if (bClient != null)
                {
                    NetProtoTool.SendTask(bClient, task);
                    //bClient.SendMessage(m);
                }
                return(ErrorCode.PlayerIsInBattle);
            }

            var su = _servers.Add(
                userID,
                new UserServerInfo
            {
                MapID          = mapID,
                BattleServerID = battleServer.ServerInfo.ServerID,
                GServerID      = serverID,
                UserID         = userID
            });

            if (su)
            {
                serverInfo = battleServer.ServerInfo;
                var gateserver = ServerManager.Singleton.GetGateServerMappingByServerID(serverID);
                var task       = new Task_L2B_StartBattle
                {
                    MapID = mapID,
                    Users = new List <PlayerServerInfo> {
                        new PlayerServerInfo {
                            UserID      = userID,
                            ServerID    = serverID,
                            ServiceHost = gateserver.ServiceHost,
                            ServicePort = gateserver.ServicePort
                        }
                    }
                };
                //task
                //var message = NetProtoTool.ToNetMessage(XNet.Libs.Net.MessageClass.Task, task);
                var serverConnect = Appliaction.Current.GetServerConnectByClientID(battleServer.ClientID);
                if (serverConnect == null)
                {
                    _servers.Remove(userID);
                    return(ErrorCode.BattleServerHasDisconnect);
                }
                NetProtoTool.SendTask(serverConnect, task);
                //serverConnect.SendMessage(message);
                return(Proto.ErrorCode.OK);
            }
            else
            {
                return(Proto.ErrorCode.PlayerIsInBattle);
            }
        }
        public override L2C_Login DoResponse(C2L_Login request, Client client)
        {
            if (!ProtoTool.CompareVersion(request.Version))
            {
                return(new L2C_Login {
                    Code = ErrorCode.VersionError
                });
            }
            using (var db = Appliaction.Current.GetDBContext())
            {
                var pwd   = DBTools.GetPwd(request.Password, db);
                var query = db.TbaCCount
                            .Where(t => t.UserName == request.UserName && t.Password == pwd)
                            .SingleOrDefault();
                if (query == null)
                {
                    return(new L2C_Login {
                        Code = ErrorCode.LoginFailure
                    });
                }
                else
                {
                    var session = DateTime.UtcNow.Ticks.ToString();
                    Appliaction.Current.SetSession(query.ID, session);
                    query.LastLoginDateTime = DateTime.UtcNow;
                    query.LoginCount       += 1;
                    db.SubmitChanges();

                    var mapp = ServerManager.Singleton.GetGateServerMappingByServerID(query.ServerID);
                    if (mapp == null)
                    {
                        return(new L2C_Login {
                            Code = ErrorCode.NOFoundServerID
                        });
                    }
                    UserServerInfo info;
                    if (BattleManager.Singleton.GetBattleServerByUserID(query.ID, out info))
                    {
                        var task = new Task_L2B_ExitUser {
                            UserID = query.ID
                        };
                        var server = ServerManager.Singleton.GetBattleServerMappingByServerID(info.BattleServerID);
                        if (server != null)
                        {
                            var connection = Appliaction.Current.GetServerConnectByClientID(server.ClientID);
                            if (connection != null)
                            {
                                var message = NetProtoTool.ToNetMessage(MessageClass.Task, task);
                                connection.SendMessage(message);
                            }
                        }
                    }
                    return(new L2C_Login
                    {
                        Code = ErrorCode.OK,
                        Server = mapp.ServerInfo,
                        Session = session,
                        UserID = query.ID
                    });
                }
            }
        }
Exemple #5
0
        public override G2B_BattleReward DoResponse(B2G_BattleReward request, Client client)
        {
            //check ?

            Managers.UserData data;
            if (!MonitorPool.S.Get <UserDataManager>().TryToGetUserData(request.UserID, out data))
            {
                return(new G2B_BattleReward {
                    Code = ErrorCode.NoGamePlayerData
                });
            }

            var diff = new Dictionary <int, Proto.PlayerItem>();

            foreach (var i in request.DropItems)
            {
                if (diff.ContainsKey(i.ItemID))
                {
                    diff[i.ItemID].Num += i.Num;
                }
                else
                {
                    diff.Add(i.ItemID, i);
                }
            }

            foreach (var i in request.ConsumeItems)
            {
                if (diff.ContainsKey(i.ItemID))
                {
                    diff[i.ItemID].Num -= i.Num;
                }
                else
                {
                    diff.Add(i.ItemID, i);
                }
            }

            ErrorCode code = ErrorCode.OK;

            foreach (var i in diff)
            {
                if (i.Value.Num == 0)
                {
                    continue;
                }
                if (i.Value.Num > 0)
                {
                    if (!data.AddItem(i.Value))
                    {
                        code = ErrorCode.Error;
                    }
                }
                else
                {
                    if (!data.ConsumeItem(i.Value))
                    {
                        code = ErrorCode.Error;
                    }
                }
            }

            data.AddGold(request.Gold);

            var userClient = Appliaction.Current.GetClientByUserID(request.UserID);

            if (userClient != null)
            {
                var syncHero = new Task_G2C_SyncHero {
                    Hero = data.GetHero()
                };
                var syncPackage = new Task_G2C_SyncPackage
                {
                    Package = data.GetPackage(),
                    Gold    = data.Gold,
                    Coin    = data.Coin
                };
                NetProtoTool.SendTask(userClient, syncHero);
                NetProtoTool.SendTask(userClient, syncPackage);
            }

            return(new G2B_BattleReward {
                Code = code
            });
        }
 private List <Message> ToMessages(ISerializerable[] notify)
 {
     return(notify.Select(t => NetProtoTool.ToNetMessage(MessageClass.Notify, t)).ToList());
 }
        private void Tick()
        {
            var per  = State.Perception as BattlePerception;
            var view = per.View as GameViews.BattlePerceptionView;

            //sync Root

            if (AliveCount == 0)
            {
                CreateMonster(per);
            }



            //处理用户输入
            foreach (var i in Clients)
            {
                if (!i.Value.Enable)
                {
                    Clients.Remove(i.Key);
                    ExitUser(i.Key);//send msg
                    continue;
                }
                ISerializerable action;
                Message         msg;
                if (i.Value.TryGetActionMessage(out msg))
                {
                    action = NetProtoTool.GetProtoMessage(msg);
                    if (NetProtoTool.EnableLog)
                    {
                        Debuger.Log(action.GetType().ToString() + "-->" + JsonTool.Serialize(action));
                    }
                    BattleCharacter userCharacter;
                    if (UserCharacters.TryGetValue(i.Key, out userCharacter))
                    {
                        if (action is Action_AutoFindTarget)
                        {
                            var auto = action as Action_AutoFindTarget;
                            userCharacter.ModifyValue(HeroPropertyType.ViewDistance,
                                                      AddType.Append, !auto.Auto ? 0 : 1000 * 100); //修改玩家AI视野
                            userCharacter.AIRoot.BreakTree();
                        }
                        else if (userCharacter.AIRoot != null)
                        {
                            //保存到AI
                            userCharacter.AIRoot[AITreeRoot.ACTION_MESSAGE] = action;
                            userCharacter.AIRoot.BreakTree();//处理输入 重新启动行为树
                        }
                    }
                }
            }

            GState.Tick(State, Now);
            //处理生命,魔法恢复

            if (lastHpCure + 1 < Now.Time)
            {
                lastHpCure = Now.Time;
                per.State.Each <BattleCharacter>((el) =>
                {
                    var hp = (int)(el[HeroPropertyType.Force].FinalValue * BattleAlgorithm.FORCE_CURE_HP);
                    if (hp > 0)
                    {
                        el.AddHP(hp);
                    }
                    var mp = (int)(el[HeroPropertyType.Knowledge].FinalValue * BattleAlgorithm.KNOWLEDGE_CURE_MP);
                    if (mp > 0)
                    {
                        el.AddMP(mp);
                    }
                    return(false);
                });
            }

            view.Update(Now);
            var viewNotify = view.GetAndClearNotify();

            SendNotify(viewNotify);

            ProcessJoinClient();
            IsCompleted |= Clients.Count == 0;
        }
Exemple #8
0
        public override G2C_GMTool DoResponse(C2G_GMTool request, Client client)
        {
#if USEGM
            if (!Appliaction.Current.EnableGM)
            {
                return new G2C_GMTool()
                       {
                           Code = ErrorCode.Error
                       }
            }
            ;

            var args = request.GMCommand.Split(' ');
            if (args.Length == 0)
            {
                return new G2C_GMTool {
                           Code = ErrorCode.Error
                }
            }
            ;
            var      userid = (long)client.UserState;
            UserData userData;
            if (!MonitorPool.S.Get <UserDataManager>().TryToGetUserData(userid, out userData))
            {
                return(new G2C_GMTool {
                    Code = ErrorCode.NoGamePlayerData
                });
            }
            switch (args[0].ToLower())
            {
            case "level":
            {
                var level = 0;
                if (int.TryParse(args[1], out level))
                {
                    userData.HeroLevelTo(level);
                }
            }
            break;

            case "make":
            {
                int id  = int.Parse(args[1]);
                var num = 1;
                if (args.Length > 2)
                {
                    num = int.Parse(args[2]);
                }

                var playerItem = new PlayerItem {
                    ItemID = id, Num = num
                };
                userData.AddItem(playerItem);
            }
            break;

            case "addgold":
            {
                userData.AddGold(int.Parse(args[1]));
            }
            break;

            case "addcoin":
            {
                userData.AddCoin(int.Parse(args[1]));
            }
            break;

            case "addexp":
            {
                int level = 0;
                userData.AddExp(int.Parse(args[1]), out level);
            }
            break;
            }

            //sync
            var syncHero = new Task_G2C_SyncHero {
                Hero = userData.GetHero()
            };
            var syncPackage = new Task_G2C_SyncPackage
            {
                Package = userData.GetPackage(),
                Gold    = userData.Gold,
                Coin    = userData.Coin
            };
            NetProtoTool.SendTask(client, syncHero);
            NetProtoTool.SendTask(client, syncPackage);

            return(new G2C_GMTool
            {
                Code = ErrorCode.OK
            });
#else
            return(new G2C_GMTool {
                Code = ErrorCode.Error
            });
#endif
        }
    }
}