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); } } }
//开始进入战斗 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 }); } } }
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; }
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 } } }