/// <summary> /// 取回宠物 /// </summary> /// <param name="note"></param> public static void PetRetrieve(UserNote note) { string soleid = note.PlayerID + "PetRetrieve"; if (!m_dic.TryAdd(soleid, soleid)) { return; } try { IList boby = note.Body as IList; if (boby == null) return; string id = note.GetString(0); //0表示产生宠物,1表示采集,生产取出宠物,2表示训化完成后取回宠物 int goodsType = note.GetInt32(1); string bType = "B3"; if (boby.Count > 2) { bType = note.GetString(2); } if (bType != "B2" && bType != "B3") return; string npcid = note.GetString(3);//NPC if (!note.Player.EffectActive(npcid, "")) return; //驯化取回 PlayerEx home = note.Player.Home; if (goodsType == 0) { #region 将道具变成宠物的过程 Variant pk = home.Value.GetValueOrDefault<Variant>("PetKeep"); string goodsid = pk.GetStringOrDefault("ID"); Goods g = GoodsAccess.Instance.FindOneById(goodsid); if (g == null) { note.Call(HomeCommand.PetRetrieveR, false, goodsType, TipManager.GetMessage(HomeReturn.ConfigError)); return; } if (goodsid == id) { if (pk.GetStringOrDefault("EndTime") != string.Empty) { DateTime endTime; if (!DateTime.TryParse(pk.GetStringOrDefault("EndTime"), out endTime)) { note.Call(HomeCommand.PetRetrieveR, false, goodsType, TipManager.GetMessage(HomeReturn.HomeKeeping)); return; } if (endTime > DateTime.UtcNow) { note.Call(HomeCommand.PetRetrieveR, false, goodsType, TipManager.GetMessage(HomeReturn.HomeKeeping)); return; } } if (pk.GetIntOrDefault("PetsWild") == -1) { //宠物已经产生,不能重复产生 return; } string petid = g.Value.GetStringOrDefault("PetID"); // 得到宠物基本信息 GameConfig gc = GameConfigAccess.Instance.FindOneById(petid); if (gc == null || gc.Value == null) { note.Call(HomeCommand.PetRetrieveR, false, goodsType, TipManager.GetMessage(HomeReturn.PetError)); return; } Variant model = gc.Value; string petType = model.GetStringOrDefault("PetsType"); int petLevel = model.GetIntOrDefault("PetsLevel"); //宠物已经产生 Variant petInfo = PetAccess.CreateBase(gc, 0, g.Value.GetIntOrDefault("IsBinding")); Pet p = new Pet(); p.ID = ObjectId.GenerateNewId().ToString(); p.Name = gc.Name; p.Value = petInfo; p.Modified = DateTime.UtcNow; p.PlayerID = note.PlayerID; p.Created = DateTime.UtcNow; p.Save(); pk["ID"] = p.ID; pk["PetID"] = petid; pk["StartTime"] = string.Empty; pk["EndTime"] = string.Empty; pk["PetsWild"] = -1; pk["PetName"] = gc.Name; pk["PetsRank"] = gc.Value.GetIntOrDefault("PetsRank"); home.Save(); note.Call(HomeCommand.PetRetrieveR, true, goodsType, id); //表示宠物驯化成功 note.Player.FinishNote(FinishCommand.PetJobFuHua, gc.Value.GetStringOrDefault("PetsType")); //移除道具 GoodsAccess.Instance.Remove(g.ID, note.PlayerID); } return; #endregion } else if (goodsType == 2) { #region 表示取出训化成功的宠物 Variant pk = home.Value.GetValueOrDefault<Variant>("PetKeep"); if (pk.GetStringOrDefault("ID") != id) { //宠物ID不正确 note.Call(HomeCommand.PetRetrieveR, false, goodsType, TipManager.GetMessage(HomeReturn.PetError)); return; } Pet px = PetAccess.Instance.FindOneById(id); if (px == null) { note.Call(HomeCommand.PetRetrieveR, false, goodsType, TipManager.GetMessage(HomeReturn.PetError)); return; } //宠物槽 PlayerEx pgx = bType == "B3" ? note.Player.B3 : note.Player.B2; IList pcx = pgx.Value.GetValue<IList>("C"); Variant vx = null; foreach (Variant k in pcx) { if (k.GetStringOrDefault("E") == string.Empty) { vx = k; break; } } if (vx == null) { note.Call(HomeCommand.PetRetrieveR, false, goodsType, TipManager.GetMessage(HomeReturn.PetBurdenFull)); return; } vx["E"] = px.ID; vx["G"] = px.Value.GetStringOrDefault("PetsID"); vx["S"] = px.Value.GetIntOrDefault("Sort"); vx["H"] = px.Value.GetIntOrDefault("IsBinding"); vx["A"] = 1; vx["D"] = 0; vx["R"] = px.Value.GetIntOrDefault("PetsRank"); vx["I"] = 0; if (bType == "B2") { Variant ct = PetAccess.Instance.CreateAward(note.Player.Level, id, note.PlayerID, note.Player.Pet); vx["T"] = ct; } //宠物背包保存 pgx.Save(); pk["ID"] = string.Empty; pk["PetID"] = string.Empty; pk["StartTime"] = string.Empty; pk["EndTime"] = string.Empty; pk["PetsWild"] = 0; pk["PetName"] = string.Empty; pk["PetsRank"] = 0; home.Save(); //更新宠物背包 //note.Call(ClientCommand.UpdateActorR, new PlayerExDetail(note.Player.B3)); note.Player.UpdateBurden(bType); note.Call(HomeCommand.PetRetrieveR, true, goodsType, id); if (bType == "B3") { //溜宠格子内,宠物将给随 if (vx.GetIntOrDefault("P") > 3) { List<Variant> ps = PlayerExAccess.Instance.SlipPets(note.Player.B3); note.Player.GetSlipPets(ps); } } else { note.Call(PetsCommand.StockingR, true, true, PetAccess.Instance.GetPetModel(vx)); } return; #endregion } #region 取回采集,生产,合成的宠物 Pet pet = PetAccess.Instance.FindOneById(id); if (pet == null) { note.Call(HomeCommand.PetRetrieveR, false, goodsType, TipManager.GetMessage(HomeReturn.PetError)); return; } //宠物槽 PlayerEx pg = bType == "B3" ? note.Player.B3 : note.Player.B2; IList pc = pg.Value.GetValue<IList>("C"); Variant v = null; foreach (Variant k in pc) { if (string.IsNullOrEmpty(k.GetStringOrDefault("E"))) { v = k; break; } } if (v == null) { note.Call(HomeCommand.PetRetrieveR, false, goodsType, TipManager.GetMessage(HomeReturn.PetBurdenFull)); return; } Variant produces = home.Value.GetValueOrDefault<Variant>("Produces"); foreach (string k in produces.Keys) { Variant p = produces[k] as Variant; IList petList = p.GetValue<IList>("PetList"); for (int i = 0; i < petList.Count; i++) { Variant m = petList[i] as Variant; if (m.GetStringOrDefault("ID") == id) { if (!string.IsNullOrEmpty(p.GetStringOrDefault("GoodsID"))) { note.Call(HomeCommand.PetRetrieveR, false, goodsType, TipManager.GetMessage(HomeReturn.Produceing)); return; } v["E"] = pet.ID; v["G"] = pet.Value.GetStringOrDefault("PetsID"); v["S"] = pet.Value.GetIntOrDefault("Sort"); v["D"] = 0; v["R"] = pet.Value.GetIntOrDefault("PetsRank"); v["I"] = 0; v["A"] = 1; v["H"] = pet.Value.GetIntOrDefault("IsBinding"); if (bType == "B2") { v["T"] = PetAccess.Instance.CreateAward(note.Player.Level, id, note.PlayerID, note.Player.Pet); } petList.Remove(m); home.Save(); pet.Save(); pg.Save(); if (bType == "B3") { //溜宠格子内,宠物将给随 if (v.GetIntOrDefault("P") > 3) { List<Variant> ps = PlayerExAccess.Instance.SlipPets(note.Player.B3); note.Player.GetSlipPets(ps); } } else { note.Call(PetsCommand.StockingR, true, true, PetAccess.Instance.GetPetModel(v)); } note.Player.UpdateBurden(bType); note.Call(HomeCommand.PetRetrieveR, true, goodsType, id); return; } } } note.Call(HomeCommand.PetRetrieveR, false, TipManager.GetMessage(HomeReturn.PetError)); #endregion } finally { string str; m_dic.TryRemove(soleid, out str); } }
/// <summary> /// 宠物升级 /// </summary> /// <param name="pet"></param> /// <param name="newExp"></param> /// <param name="max"></param> /// <param name="petLev"></param> /// <returns></returns> private int UpPetLev(Pet pet, int newExp, int max, int petLev) { if (pet == null) return petLev; Variant mv = pet.Value; if (mv == null) return petLev; string petsType = mv.GetStringOrDefault("PetsType"); bool isPet = false; while (true) { petLev += 1; //得到可以领捂的技能 pet.Value["PetsLevel"] = petLev; PetProperty life = PetAccess.GetSkillPro(pet, petLev); Variant ccd = mv.GetVariantOrDefault("ChengChangDu"); life.ChengChangDu = ccd.GetIntOrDefault("V"); int curExp = newExp - max; //表示出战宠升级 if (Pet != null && Pet.ID == pet.ID) { isPet = true; } PetAccess.RefreshPetProperty(pet.Value, life, curExp, true); LevelLogAccess.Instance.Insert(pet.ID, petLev, UserID); if (petLev < maxLevel) { Variant exp = mv.GetVariantOrDefault("Experience"); max = exp.GetIntOrDefault("M"); if (curExp < max) { exp["V"] = curExp; break; } } else { break; } } FinishNote(FinishCommand.PetUpLev, petLev); pet.Init(); if (isPet) { //表示出战宠 PetAccess.PetReset(pet, m_skill, false, m_mounts); Call(PetsCommand.UpdatePetR, true, pet); } else { pet.Save(); } return petLev; }
/// <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="pet"></param> /// <param name="experience"></param> /// <param name="isCall"></param> /// <param name="eType">宠物经验来源</param> /// <returns></returns> public bool AddPetExp(Pet pet, int experience, bool isCall, int eType) { if (pet == null) { return false; } Variant exp = pet.Value.GetVariantOrDefault("Experience"); if (exp.GetIntOrDefault("V") == int.MaxValue) { return false; } int newExp = exp.SetOrInc("V", experience); if (newExp < 0) { newExp = int.MaxValue; exp["V"] = newExp; } int petLev = pet.Value.GetIntOrDefault("PetsLevel"); if (petLev >= maxLevel) { pet.Save(); } else { int max = exp.GetIntOrDefault("M"); if (newExp >= max) { petLev = UpPetLev(pet, newExp, max, petLev); newExp = exp.GetIntOrDefault("V"); } else { pet.SaveLife(); } } if (isCall) { Call(PetsCommand.UpdatePetR, true, pet); } //宠物取得经验 PlayerLog log = new PlayerLog(ServerLogger.zoneid, Actiontype.PetExp); log.level = petLev; log.modifyexp = experience; log.totalexp = newExp; log.reserve_1 = eType; log.remark = pet.ID; log.touid = PID; this.WriteLog(log); return true; }