Exemple #1
0
        /// <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);
            }
        }
Exemple #2
0
        /// <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;
        }
Exemple #3
0
        /// <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;
        }
Exemple #4
0
        /// <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;
        }