/// <summary> /// 得到宠物列表 /// </summary> /// <param name="note"></param> public static void PetListArena(UserNote note) { PlayerEx b3 = note.Player.B3; IList c = b3.Value.GetValue<IList>("C"); List<PetDetail> list = new List<PetDetail>(); ArenaBase model; if (ArenaBusiness.ArenaList.TryGetValue(note.Player.SoleID, out model)) { foreach (Variant v in c) { string petid = v.GetStringOrDefault("E"); if (string.IsNullOrEmpty(petid)) continue; Pet p = PetAccess.Instance.FindOneById(petid); if (p != null) { p.IsWar = model.Pets.ContainsKey(p.ID); PlayerBusiness user; if (model.Players.TryGetValue(p.PlayerID, out user)) { PetDetail detail = new PetDetail(p, user.Name); list.Add(detail); } } } } note.Call(ArenaCommand.PetListArenaR, list); }
/// <summary> /// 补充宠物的HP/MP /// </summary> /// <param name="v"></param> /// <returns></returns> private static bool SupplyPet(Variant v, Pet m_pet, ArenaBase model, string name) { bool use = false; //庞物 if (m_pet == null) return use; Variant pet = m_pet.Value; if (pet == null) return use; Variant moFa = pet.GetVariantOrDefault("MoFa"); Variant shengMing = pet.GetVariantOrDefault("ShengMing"); double dhp = v.GetDoubleOrDefault("HP"); double dmp = v.GetDoubleOrDefault("MP"); int hp, mp; if (dhp <= 1) { hp = (int)(dhp * shengMing.GetIntOrDefault("M")); //百分比方式 } else { hp = (int)(dhp); } if (dmp <= 1) { mp = (int)(dmp * moFa.GetIntOrDefault("M")); //百分比方式 } else { mp = (int)(dmp); } if (hp > 0) { int sv = shengMing.GetIntOrDefault("V"); int need = shengMing.GetIntOrDefault("M") - sv; if (need > 0) { m_pet.HP = Math.Min(need, hp) + sv; shengMing["V"] = m_pet.HP; use = true; } } if (mp > 0) { int mv = moFa.GetIntOrDefault("V"); int need = moFa.GetIntOrDefault("M") - mv; if (need > 0) { m_pet.MP = Math.Min(need, mp) + mv; moFa["V"] = m_pet.MP; use = true; } } if (hp > 0 || mp > 0) { List<PetDetail> list = new List<PetDetail>(); PetDetail detail = new PetDetail(m_pet, name); list.Add(detail); model.CallAll(ArenaCommand.ArenaGoodsR, true, list); m_pet.Save(); } return use; }
/// <summary> /// 宠物进入参战 /// </summary> /// <param name="note"></param> public static void PetInArena(UserNote note) { string petid = note.GetString(0); string groupname = note.GetString(1); int x = note.GetInt32(2); int y = note.GetInt32(3); if (string.IsNullOrEmpty(note.Player.SoleID)) { //请选择要参战的竞技场 note.Call(ArenaCommand.PetInArenaR, false, TipManager.GetMessage(ArenaReturn.ArenaGroupName1)); return; } ArenaBase model; if (!ArenaBusiness.ArenaList.TryGetValue(note.Player.SoleID, out model)) { //请选择要参战的竞技场 note.Call(ArenaCommand.PetInArenaR, false, TipManager.GetMessage(ArenaReturn.PetInArena1)); return; } if (model.StartTime < DateTime.UtcNow) { //竞技场已经开始,不能再参战 note.Call(ArenaCommand.PetInArenaR, false, TipManager.GetMessage(ArenaReturn.PetInArena2)); return; } if (!model.GroupName.Contains(groupname)) { //请选择分组 note.Call(ArenaCommand.PetInArenaR, false, TipManager.GetMessage(ArenaReturn.PetInArena3)); return; } if (!string.IsNullOrEmpty(note.Player.GroupName)) { if (note.Player.GroupName != groupname) { //你已经加入【" + note.Player.GroupName + "】组,不能再选择其它组 note.Call(ArenaCommand.PetInArenaR, false, string.Format(TipManager.GetMessage(ArenaReturn.PetInArena4), note.Player.GroupName)); return; } } PlayerEx b3 = note.Player.B3; IList c = b3.Value.GetValue<IList>("C"); Variant tmp = null; foreach (Variant v in c) { if (v.GetStringOrDefault("E") == petid) { tmp = v; break; } } if (tmp == null) { //宠物不存在 note.Call(ArenaCommand.PetInArenaR, false, TipManager.GetMessage(ArenaReturn.PetInArena5)); return; } Pet p = PetAccess.Instance.FindOneById(petid); if (p == null || p.PlayerID != note.PlayerID) { note.Call(ArenaCommand.PetInArenaR, false, TipManager.GetMessage(ArenaReturn.PetInArena5)); return; } if (PetAccess.Instance.IsFatigue(p)) { //宠物过度疲劳,不能参加竞技场 note.Call(ArenaCommand.PetInArenaR, false, TipManager.GetMessage(ArenaReturn.PetInArena6)); return; } if (Math.Abs(note.Player.FightValue - model.FightValue) > model.FightPoor) { //战绩差距太大,不能参加 note.Call(ArenaCommand.PetInArenaR, false, TipManager.GetMessage(ArenaReturn.PetInArena7)); return; } int count = 0;//已经放入的宠物数量 int groupcount = 0;//得到选组宠物总数 foreach (Pet pk in model.Pets.Values) { if (pk.PlayerID == note.PlayerID) { count++; } if (pk.GroupName == groupname) { groupcount++; } } if (model.UserPets <= count) { //每人只能【" + model.UserPets + "】只宠物参战 note.Call(ArenaCommand.PetInArenaR, false, string.Format(TipManager.GetMessage(ArenaReturn.PetInArena8), model.UserPets)); return; } if (model.PetNumber <= groupcount) { //每组只能【" + model.PetNumber + "】只宠物参战 note.Call(ArenaCommand.PetInArenaR, false, string.Format(TipManager.GetMessage(ArenaReturn.PetInArena9), model.PetNumber)); return; } if (!model.Pets.TryAdd(p.ID, p)) { //宠物已经参战 note.Call(ArenaCommand.PetInArenaR, false, TipManager.GetMessage(ArenaReturn.PetInArena10)); return; } note.Player.GroupName = groupname; p.GroupName = groupname; p.X = x; p.Y = y; p.BeginPoint = new Point(x, y); p.EndPoint = new Point(x, y); p.CurPoint = new Point(x, y); p.RangePet = string.Empty; p.PetStatus = 0; p.Range = 100; List<PetDetail> list = new List<PetDetail>(); PetDetail detail = new PetDetail(p, note.Player.Name); list.Add(detail); model.CallAll(ArenaCommand.PetInArenaR, true, list); model.ArenaUserCount(); }
/// <summary> /// 进入竞技场 /// </summary> /// <param name="note"></param> public static void ArenaInto(UserNote note) { string soleid = note.GetString(0); SceneBusiness sb = note.Player.Scene; if (sb.SceneType == SceneType.City || sb.SceneType == SceneType.Home || sb.SceneType == SceneType.Outdoor) { string password = note.GetString(1); ArenaBase model; if (!ArenaBusiness.ArenaList.TryGetValue(soleid, out model)) { //竞技场不存在 note.Call(ArenaCommand.ArenaIntoR, false, TipManager.GetMessage(ArenaReturn.ArenaInto1), soleid); return; } if (note.Player.Team != null) { //组队状态不能参加 note.Call(ArenaCommand.ArenaIntoR, false, TipManager.GetMessage(ArenaReturn.ArenaInto2), soleid); return; } if (!string.IsNullOrEmpty(model.PassWord)) { if (model.PassWord != password) { //进入密码不正确 note.Call(ArenaCommand.ArenaIntoR, false, TipManager.GetMessage(ArenaReturn.ArenaInto3), soleid); return; } } if (!model.Players.TryAdd(note.PlayerID, note.Player)) { //已经进入竞技场,不能重复进入 note.Call(ArenaCommand.ArenaIntoR, false, TipManager.GetMessage(ArenaReturn.ArenaInto4), soleid); return; } if (string.IsNullOrEmpty(soleid)) { //该竞技场不存在 note.Call(ArenaCommand.ArenaIntoR, false, TipManager.GetMessage(ArenaReturn.ArenaInto5), soleid); return; } //通知当前场景所有角色,角色属性发生变化 note.Player.SetActionState(ActionState.Arena); note.Player.SoleID = soleid; note.Player.GroupName = ""; List<PetDetail> list = new List<PetDetail>(); foreach (Pet p in model.Pets.Values) { PlayerBusiness user; if (model.Players.TryGetValue(p.PlayerID, out user)) { PetDetail detail = new PetDetail(p, user.Name); list.Add(detail); } } note.Call(ArenaCommand.ArenaIntoR, true, list, soleid); model.ArenaUserCount(); } else { //当前场景不能进入竞技场 note.Call(ArenaCommand.ArenaIntoR, false, TipManager.GetMessage(ArenaReturn.ArenaInto6), soleid); return; } }
/// <summary> /// 角色断线,移除所有参战宠 /// </summary> /// <param name="playerid"></param> public void UserDisconnected(string playerid) { if (this.Status == 1) { ArenaFight.UseDis(this, playerid); } PlayerBusiness pb; if (m_players.TryRemove(playerid, out pb)) { pb.SoleID = ""; pb.GroupName = ""; pb.SetActionState(ActionState.Standing); List<string> tmp = new List<string>(); foreach (Pet p in m_pets.Values) { if (p.PlayerID == playerid) { tmp.Add(p.ID); } } List<PetDetail> list = new List<PetDetail>(); foreach (string k in tmp) { Pet p; if (m_pets.TryRemove(k, out p)) { //移除的宠物 PetDetail model = new PetDetail(p, pb.Name, 1); list.Add(model); } } if (list.Count > 0) { //通知当前所有该竞技场上的角色 CallAll(ArenaCommand.PetOutArenaR, true, list); } } }
/// <summary> /// 移除指定宠物 /// </summary> /// <param name="playerid">角色</param> /// <param name="petid">宠物</param> /// <returns>true成功,false宠物不存在</returns> public bool RemovePet(string playerid, string petid) { List<PetDetail> list = new List<PetDetail>(); Pet p; if (m_pets.TryRemove(petid, out p)) { PetDetail detail = new PetDetail(p, "", 1); list.Add(detail); } if (list.Count > 0) { CallAll(ArenaCommand.PetOutArenaR, true, list); return true; } return false; }
/// <summary> /// 得到攻击受害值 /// </summary> /// <param name="root">攻击者</param> /// <param name="target">被攻击者</param> /// <returns></returns> public PetFightDetail FightObject(Pet root, Pet target) { m_root = root; m_target = target; FightBase fightBase = new FightBase(); fightBase.ID = target.ID; fightBase.Name = target.Name; fightBase.PlayerID = target.PlayerID; fightBase.CurSkill = m_curskill; //判断是否命中 if (m_injuryType == 0) { if (CheckMingZhong(m_root.Value, m_target.Value)) { if (CheckBaoJi(m_root.Value, m_target.Value)) { //暴击 fightBase.FB = FightType.BaoJi; } else { //普通攻击 fightBase.FB = FightType.PuTong; } fightBase.HPcost = FightValue(fightBase.FB); //最小1点受害 fightBase.HPcost = fightBase.HPcost >= 1 ? fightBase.HPcost : 1; } else { //闪避成功 fightBase.FB = FightType.ShangBi; fightBase.HPcost = 0; } } else { if (CheckBaoJi(m_root.Value, m_target.Value)) { //暴击 fightBase.FB = FightType.BaoJi; } else { //普通攻击 fightBase.FB = FightType.PuTong; } fightBase.HPcost = FightValue(fightBase.FB); //最小1点受害 fightBase.HPcost = fightBase.HPcost >= 1 ? fightBase.HPcost : 1; } Variant sm = m_target.Value.GetValueOrDefault<Variant>("ShengMing"); int m = sm.GetIntOrDefault("V"); if (fightBase.HPcost >= m) { sm["V"] = 0; //计算相关战绩值 GetFightValue(); //宠物被打挂 Variant tmp = new Variant(); tmp.Add("ID", target.ID); tmp.Add("Level", target.Value.GetIntOrDefault("PetsLevel")); root.FightDeath.Add(tmp); PetDetail model = new PetDetail(root, "", 2); m_model.CallAll(ArenaCommand.ArenaPetOverR, model); } else { sm["V"] = m - fightBase.HPcost; } fightBase.ShengMing = sm; fightBase.MoFa = m_target.Value.GetValueOrDefault<Variant>("MoFa"); return new PetFightDetail(fightBase); }