/// <summary>获取场景内其他玩家数据 并将当前玩家数据推送给其他玩家</summary> private List <ScenePlayerVo> GetOtherPlayerPush(SiegePlayer model, view_scene_user scene) { var otherplays = new List <ScenePlayerVo>(); var otherplayer = Variable.Activity.ScenePlayer.Where(m => m.Value.model_number == (int)ModuleNumber.SIEGE && m.Key != Common.GetInstance().GetKey(model.user_id)).ToList(); if (!otherplayer.Any()) { return(otherplays); } var aso = new ASObject(BuildData(EntityToVo.ToScenePlayerVo(scene))); foreach (var item in otherplayer) { otherplays.Add(EntityToVo.ToScenePlayerVo(item.Value)); var token = new CancellationTokenSource(); Task.Factory.StartNew( m => { var userid = Convert.ToInt64(m); if (!Variable.OnlinePlayer.ContainsKey(userid)) { return; } var session = Variable.OnlinePlayer[userid]; Common.GetInstance().TrainingSiegeEndSend(session, aso, (int)SiegeCommand.PUSH_PLAYER_ENTER); }, item.Value.user_id, token.Token); } return(otherplays); }
/// <summary> 向其他玩家推送在监狱移动</summary> public void PusuMovingActivity(Int64 userid, view_scene_user scene) { if (!Variable.OnlinePlayer.ContainsKey(userid)) { return; } var otherplays = Core.Common.Scene.ActivityOtherPlayers(userid, (int)ModuleNumber.BUILDING); //监狱内其他玩家 foreach (var item in otherplays) { var tokenTest = new CancellationTokenSource(); var temp = new ScenePush() { user_id = userid, scene_key = item, user_scene = scene.CloneEntity(), other_user_id = Variable.Activity.ScenePlayer[item].user_id }; Task.Factory.StartNew(m => { var t = m as ScenePush; if (t == null) { return; } var aso = new ASObject(BuildData((int)ResultType.SUCCESS, t.user_id, t.user_scene.X, t.user_scene.Y)); SendPv(t.other_user_id, aso, (int)BuildingCommand.PUSH_PLAYER_MOVING, (int)ModuleNumber.BUILDING); tokenTest.Cancel(); }, temp, tokenTest.Token); } }
/// <summary> /// 向监狱内玩家推送出狱 /// </summary> public void PusuLeavePrison(Int64 userid) { if (!Variable.OnlinePlayer.ContainsKey(userid)) { return; } var otherplays = GetPrisonOhters(userid); //监狱内其他玩家 var key = string.Format("{0}_{1}", (int)ModuleNumber.PRISON, userid); if (!Variable.SCENCE.ContainsKey(key)) { return; } var scene = new view_scene_user(); Variable.SCENCE.TryRemove(key, out scene); foreach (var item in otherplays) { var dic = new Dictionary <string, object>() { { "userId", userid } }; var aso = new ASObject(dic); SendPv(aso, (int)PrisonCommand.PUSH_PLAYER_EXIT, item.user_id, (int)ModuleNumber.PRISON); } }
/// <summary>数据组装</summary> private Dictionary <String, Object> BuildData(object result, view_scene_user sceneplayer) { var dic = new Dictionary <string, object> { { "result", result }, { "playerVo", sceneplayer != null?EntityToVo.ToScenePlayerVo(sceneplayer) : null } }; return(dic); }
/// <summary>推送玩家进入当前场景</summary> public void CommandStart(view_scene_user sceneplayer, Int64 userid, Int64 otheruserid) { const int result = (int)ResultType.SUCCESS; var aso = new ASObject(Common.GetInstance().BuildData(result, sceneplayer)); #if DEBUG XTrace.WriteLine("玩家{0}向其他玩家推送上线!\t", userid); #endif Common.GetInstance().SendPv(userid, aso, (int)SceneCommand.PLAYER_ENTER_SCENE, otheruserid); }
/// <summary> 获取活动出生坐标 </summary> public void GetActivityPoint(view_scene_user scene, int camp) { if (camp == (int)CampType.East) { scene.X = Variable.Activity.BuildActivity.EastBornPointX; scene.Y = Variable.Activity.BuildActivity.EastBornPointY; } else { scene.X = Variable.Activity.BuildActivity.WestBornPointX; scene.Y = Variable.Activity.BuildActivity.WestBornPointY; } }
/// <summary> view_scene_user 组装 ScenePlayerVo </summary> /// <param name="model">场景视图实体</param> /// <summary> 前端ScenePlayerVo </summary> public static ScenePlayerVo ToScenePlayerVo(view_scene_user model) { return(new ScenePlayerVo { camp = model.player_camp, id = model.user_id, level = model.role_level, name = model.player_name, sex = model.player_sex, vocation = model.player_vocation, x = model.X, y = model.Y, identityId = model.role_identity, }); }
/// <summary>新数据更新到内存中</summary> private void SceneDataSave(long sceneid, view_scene_user userscene, view_scene_user sessionscene, BaseRoleBornPoint _base) { var key = string.Format("{0}_{1}", (int)ModuleNumber.SCENE, userscene.user_id); userscene.scene_id = sceneid; if (Variable.SCENCE.ContainsKey(key)) { Variable.SCENCE.TryUpdate(key, userscene, userscene); } var v = _base.coorPoint.Split(','); userscene.X = int.Parse(v[0]); userscene.Y = int.Parse(v[1]); sessionscene.scene_id = sceneid; sessionscene.X = userscene.X; sessionscene.Y = userscene.Y; }
/// <summary> 推送玩家进入场景并向其他人推送 </summary> public void PushMyEnterScene(Int64 userid, view_scene_user userscene) { if (!Variable.OnlinePlayer.ContainsKey(userid)) { return; } if (userscene == null) { return; } userscene.model_number = (int)ModuleNumber.SCENE; var key = string.Format("{0}_{1}", (int)ModuleNumber.SCENE, userid); if (Variable.SCENCE.ContainsKey(key)) { Variable.SCENCE[key].model_number = (int)ModuleNumber.SCENE; } var otherplays = Core.Common.Scene.GetOtherPlayers(userid, userscene.scene_id, (int)ModuleNumber.SCENE);//同场景内的其他玩家 var aso = new ASObject(BuildData((int)ResultType.SUCCESS, userscene.scene_id, userscene.X, userscene.Y, otherplays)); SendPv(userid, aso, (int)SceneCommand.PUSH_ENTER_SCENET, (int)ModuleNumber.SCENE); foreach (var item in otherplays) { var temp = new ScenePush() { user_id = userid, other_user_id = item.user_id, user_scene = userscene.CloneEntity() }; var tokentest = new CancellationTokenSource(); Task.Factory.StartNew(m => { var t = m as ScenePush; if (t == null) { return; } var aso1 = new ASObject(BuildData((int)ResultType.SUCCESS, t.user_scene)); SendPv(t.other_user_id, aso1, (int)SceneCommand.PLAYER_ENTER_SCENE, (int)ModuleNumber.SCENE);// 向其他玩家推送A玩家退出后的场景 tokentest.Cancel(); }, temp, tokentest.Token); } }
/// <summary> 获取监狱坐标 </summary> public bool GetPrisonPoint(view_scene_user scene) { var baseinfo = Variable.BASE_RULE.FirstOrDefault(q => q.id == "25004"); if (baseinfo == null) { return(false); } var temp = baseinfo.value; if (!temp.Contains(',')) { return(false); } var split = temp.Split(','); scene.X = Convert.ToInt32(split[0]); scene.Y = Convert.ToInt32(split[1]); return(true); }
/// <summary>正常下线</summary> private void NormalOut(view_scene_user userscene) { var otherplays = Scene.GetOtherPlayers(userscene.user_id, userscene.scene_id, (int)ModuleNumber.SCENE); if (!otherplays.Any()) { return; } #region 场景拆分 2015-03-19 var _plays = SceneSplit.GetSceneSplitPlayers(userscene.user_id, otherplays); #endregion foreach (var item in _plays) { var obj = new OnlineObject { OffLine = userscene.user_id, OtherPlayer = item.user_id }; var tokenTest = new CancellationTokenSource(); Task.Factory.StartNew(m => { var temp = m as OnlineObject; if (temp == null) { return; } if (!Variable.OnlinePlayer.ContainsKey(temp.OtherPlayer)) { return; } var otherplayerssession = Variable.OnlinePlayer[temp.OtherPlayer] as TGGSession; if (otherplayerssession == null) { return; } var aso = BuildData(temp.OffLine); SendPushCommand(otherplayerssession, aso, (int)SceneCommand.PLAYER_EXIT_SCENET, (int)ModuleNumber.SCENE); tokenTest.Cancel(); }, obj, tokenTest.Token); } }
/// <summary> /// 向其他玩家推送在监狱移动 /// </summary> public void PusuMovingPrison(view_scene_user myscene) { var userid = myscene.user_id; if (!Variable.OnlinePlayer.ContainsKey(userid)) { return; } var otherplays = GetPrisonOhters(userid); //监狱内其他玩家 if (!otherplays.Any()) { return; } foreach (var item in otherplays) { var aso = new ASObject(BuildData((int)ResultType.SUCCESS, userid, myscene.X, myscene.Y)); SendPv(aso, (int)PrisonCommand.PUSH_PLAYER_MOVING, item.user_id, (int)ModuleNumber.PRISON); } }
/// <summary> 验证玩家坐标是否在附近 </summary> /// <param name="xy">坐标</param> /// <param name="scene">玩家坐标信息</param> public bool IsCoorPoint(string[] xy, view_scene_user scene) { if (scene == null) { return(false); } var xmin = Convert.ToInt32(xy[0]) - 150; var xmax = Convert.ToInt32(xy[0]) + 150; var ymin = Convert.ToInt32(xy[1]) - 150; var ymax = Convert.ToInt32(xy[1]) + 150; if (!(xmin <= scene.X && scene.X <= xmax)) { return(false); } if (!(ymin <= scene.Y && scene.Y <= ymax)) { return(false); } return(true); }
/// <summary> /// 推送玩家进入场景 /// </summary> public void PushMyEnterScene(Int64 userid) { if (!Variable.OnlinePlayer.ContainsKey(userid)) { return; } var key = string.Format("{0}_{1}", (int)ModuleNumber.SCENE, userid); if (!Variable.SCENCE.ContainsKey(key)) { return; } var userscene = Variable.SCENCE[key]; if (userscene == null) { return; } userscene.model_number = (int)ModuleNumber.SCENE; //模块号改为场景模块 key = string.Format("{0}_{1}", (int)ModuleNumber.PRISON, userscene.user_id); var scene = new view_scene_user(); if (Variable.SCENCE.ContainsKey(key)) { Variable.SCENCE.TryRemove(key, out scene); } var otherplays = Core.Common.Scene.GetOtherPlayers(userid, userscene.scene_id, (int)ModuleNumber.SCENE); var aso = new ASObject(BuildData((int)ResultType.SUCCESS, userscene.scene_id, userscene.X, userscene.Y, otherplays)); var session = Variable.OnlinePlayer[userid] as TGGSession; if (session == null) { return; } var pv = session.InitProtocol((int)ModuleNumber.SCENE, (int)SceneCommand.PUSH_ENTER_SCENET, (int)ResponseType.TYPE_SUCCESS, aso); session.SendData(pv); }
/// <summary> 一夜墨俣--退出活动</summary> public ASObject CommandStart(TGGSession session, ASObject data) { #if DEBUG XTrace.WriteLine("一夜墨俣:退出 -{0}——{1}", session.Player.User.player_name, "EXIT"); #endif var userid = session.Player.User.id; var myscene = session.Player.Scene; var key = ModuleNumber.BUILDING + "_" + session.Player.User.id; var acp = Variable.Activity.ScenePlayer.ContainsKey(key); //活动内是否有该玩家 if (acp) { var scene = new view_scene_user(); Variable.Activity.ScenePlayer.TryRemove(key, out scene); } Common.GetInstance().PusuLeaveActivity(userid); //向活动内的其他玩家推送离开 Common.GetInstance().PushMyEnterScene(userid, myscene); //向活动外场景的其他玩家推送进入场景 var dic = new Dictionary <string, object>() { { "result", (int)ResultType.SUCCESS } }; return(new ASObject(dic)); }
/// <summary> 玩家下线操作 </summary> private void PlayerOffline(view_scene_user scene) { try { var userid = scene.user_id; var scenekey = (int)ModuleNumber.SCENE + "_" + userid; view_scene_user scenevalue; Variable.SCENCE.TryRemove(scenekey, out scenevalue); //从内存中移除 #if DEBUG XTrace.WriteLine("玩家{0}下线时的场景:{1} 坐标:{2},{3}", Player.User.player_name, scene.scene_id, scene.X, scene.Y); #endif var prison = tg_prison.GetPrisonByUserId(userid); if (prison != null) { PrisonOut(userid); tg_scene.GetSceneUpdate(scene); //保存到数据库 return; //监狱内下线 } if (Variable.Activity.ScenePlayer.Keys.Contains(string.Format("{0}_{1}", (int)ModuleNumber.BUILDING, userid)) || Variable.Activity.ScenePlayer.Keys.Contains(string.Format("{0}_{1}", (int)ModuleNumber.SIEGE, userid))) { ActivityOut(userid); scene.model_number = (int)ModuleNumber.SCENE; tg_scene.GetSceneUpdate(scene); //保存到数据库 return; } scene.model_number = (int)ModuleNumber.SCENE; //下线后回到出生点 //SceneBackBorn(scene); tg_scene.GetSceneUpdate(scene); //保存到数据库 NormalOut(scene); //正常场景下线 } catch (Exception ex) { XTrace.WriteException(ex); } }
/// <summary> /// 下线后回到出生点 /// </summary> /// <param name="scene"></param> private void SceneBackBorn(view_scene_user scene) { var basescene = Variable.BASE_SCENE.FirstOrDefault(q => q.id == scene.scene_id); if (basescene == null) { return; } var basebornpoint = Variable.BASE_ROLEBORNPOINT.FirstOrDefault(q => q.id == basescene.bornPoint); if (basebornpoint == null) { return; } if (!basebornpoint.coorPoint.Contains(',')) { return; } var v = basebornpoint.coorPoint.Split(','); scene.X = int.Parse(v[0]); scene.Y = int.Parse(v[1]); }
/// <summary> 场景处理</summary> private void CheckScene(Int64 userid, view_scene_user scene, int camp) { if (scene == null) { return; } scene.model_number = (int)ModuleNumber.BUILDING; var oldkey = string.Format("{0}_{1}", (int)ModuleNumber.BUILDING, scene.user_id); if (Variable.SCENCE.ContainsKey(oldkey)) { Variable.SCENCE[oldkey].model_number = (int)ModuleNumber.BUILDING; } Common.GetInstance().PushMyLeaveScene(userid, scene); //活动外场景推送离开 var activityscene = scene.CloneEntity(); activityscene.model_number = (int)ModuleNumber.BUILDING; Common.GetInstance().GetActivityPoint(activityscene, camp); //初始坐标 var key = string.Format("{0}_{1}", (int)ModuleNumber.BUILDING, userid); Variable.Activity.ScenePlayer.AddOrUpdate(key, activityscene, (m, n) => n); //加入到内存中 Common.GetInstance().PushEnterActivity(userid, activityscene); //向活动内玩家推送进入 }
/// <summary> 推送玩家离开场景 </summary> public void PushMyLeaveScene(Int64 userid, view_scene_user userscene) { if (!Variable.OnlinePlayer.ContainsKey(userid)) { return; } if (userscene == null) { return; } userscene.model_number = (int)ModuleNumber.BUILDING; var session = Variable.OnlinePlayer[userid] as TGGSession; if (session == null) { return; } session.Player.Scene.model_number = (int)ModuleNumber.BUILDING; var otherplays = Core.Common.Scene.GetOtherPlayers(userid, userscene.scene_id, (int)ModuleNumber.SCENE); foreach (var item in otherplays) { var tokentest = new CancellationTokenSource(); var temp = new ScenePush() { user_id = userid, other_user_id = item.user_id }; Task.Factory.StartNew(m => { var t = m as ScenePush; StartTask(t); tokentest.Cancel(); }, temp, tokentest.Token); } }